x64 and aarch64: carry MemFlags on loads/stores; don't emit trap info unless an op can trap.
This end result was previously enacted by carrying a `SourceLoc` on every load/store, which was somewhat cumbersome, and only indirectly encoded metadata about a memory reference (can it trap) by its presence or absence. We have a type for this -- `MemFlags` -- that tells us everything we might want to know about a load or store, and we should plumb it through to code emission instead. This PR attaches a `MemFlags` to an `Amode` on x64, and puts it on load and store `Inst` variants on aarch64. These two choices seem to factor things out in the nicest way: there are relatively few load/store insts on aarch64 but many addressing modes, while the opposite is true on x64.
This commit is contained in:
@@ -29,6 +29,7 @@ impl UnwindInfoGenerator<Inst> for AArch64UnwindInfo {
|
||||
rt,
|
||||
rt2,
|
||||
mem: PairAMode::PreIndexed(rn, imm7),
|
||||
..
|
||||
} if *rt == regs::fp_reg()
|
||||
&& *rt2 == regs::link_reg()
|
||||
&& *rn == regs::writable_stack_reg()
|
||||
@@ -60,6 +61,7 @@ impl UnwindInfoGenerator<Inst> for AArch64UnwindInfo {
|
||||
rt,
|
||||
rt2,
|
||||
mem: PairAMode::PreIndexed(rn, imm7),
|
||||
..
|
||||
} if rn.to_reg() == regs::stack_reg() && imm7.value % (pair_size as i16) == 0 => {
|
||||
// stp r1, r2, [sp, #(i * #16)]
|
||||
let stack_offset = imm7.value as u32;
|
||||
|
||||
Reference in New Issue
Block a user