AArch64: make use of reg-reg-extend amode.
When a load/store instruction needs an address of the form `v0 + uextend(v1)` or `v0 + sextend(v1)` (or the commuted forms thereof), we currently generate a separate zero/sign-extend operation and then use a plain `[rA, rB]` addressing mode. This patch extends `lower_address()` to look at both addends of an address if it has two addends and a zero offset, recognize extension operations, and incorporate them directly into a `[rA, rB, UXTW]` or `[rA, rB, SXTW]` form. This should improve our performence on WebAssembly workloads, at least, because we often see a 64-bit linear memory base indexed by a 32-bit (Wasm) pointer value.
This commit is contained in:
@@ -1049,7 +1049,8 @@ fn memarg_regs(memarg: &MemArg, collector: &mut RegUsageCollector) {
|
||||
}
|
||||
&MemArg::RegReg(r1, r2, ..)
|
||||
| &MemArg::RegScaled(r1, r2, ..)
|
||||
| &MemArg::RegScaledExtended(r1, r2, ..) => {
|
||||
| &MemArg::RegScaledExtended(r1, r2, ..)
|
||||
| &MemArg::RegExtended(r1, r2, ..) => {
|
||||
collector.add_use(r1);
|
||||
collector.add_use(r2);
|
||||
}
|
||||
@@ -1384,15 +1385,10 @@ fn aarch64_map_regs<RUM: RegUsageMapper>(inst: &mut Inst, mapper: &RUM) {
|
||||
match mem {
|
||||
&mut MemArg::Unscaled(ref mut reg, ..) => map_use(m, reg),
|
||||
&mut MemArg::UnsignedOffset(ref mut reg, ..) => map_use(m, reg),
|
||||
&mut MemArg::RegReg(ref mut r1, ref mut r2) => {
|
||||
map_use(m, r1);
|
||||
map_use(m, r2);
|
||||
}
|
||||
&mut MemArg::RegScaled(ref mut r1, ref mut r2, ..) => {
|
||||
map_use(m, r1);
|
||||
map_use(m, r2);
|
||||
}
|
||||
&mut MemArg::RegScaledExtended(ref mut r1, ref mut r2, ..) => {
|
||||
&mut MemArg::RegReg(ref mut r1, ref mut r2)
|
||||
| &mut MemArg::RegScaled(ref mut r1, ref mut r2, ..)
|
||||
| &mut MemArg::RegScaledExtended(ref mut r1, ref mut r2, ..)
|
||||
| &mut MemArg::RegExtended(ref mut r1, ref mut r2, ..) => {
|
||||
map_use(m, r1);
|
||||
map_use(m, r2);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user