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:
@@ -707,6 +707,16 @@ impl MachInstEmit for Inst {
|
||||
op, r1, r2, /* scaled = */ true, extendop, rd,
|
||||
));
|
||||
}
|
||||
&MemArg::RegExtended(r1, r2, extendop) => {
|
||||
sink.put4(enc_ldst_reg(
|
||||
op,
|
||||
r1,
|
||||
r2,
|
||||
/* scaled = */ false,
|
||||
Some(extendop),
|
||||
rd,
|
||||
));
|
||||
}
|
||||
&MemArg::Label(ref label) => {
|
||||
let offset = match label {
|
||||
// cast i32 to u32 (two's-complement)
|
||||
@@ -833,6 +843,16 @@ impl MachInstEmit for Inst {
|
||||
op, r1, r2, /* scaled = */ true, extendop, rd,
|
||||
));
|
||||
}
|
||||
&MemArg::RegExtended(r1, r2, extendop) => {
|
||||
sink.put4(enc_ldst_reg(
|
||||
op,
|
||||
r1,
|
||||
r2,
|
||||
/* scaled = */ false,
|
||||
Some(extendop),
|
||||
rd,
|
||||
));
|
||||
}
|
||||
&MemArg::Label(..) => {
|
||||
panic!("Store to a MemLabel not implemented!");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user