Cranelift: Add instructions for getting the current stack/frame/return pointers (#4573)
* Cranelift: Add instructions for getting the current stack/frame pointers and return address This is the initial part of https://github.com/bytecodealliance/wasmtime/issues/4535 * x64: Remove `Amode::RbpOffset` and use `Amode::ImmReg` instead We just special case getting operands from `Amode`s now. * Fix s390x `get_return_address`; require `preserve_frame_pointers=true` * Assert that `Amode::ImmRegRegShift` doesn't use rbp/rsp * Handle non-allocatable registers in Amode::with_allocs * Use "stack" instead of "r15" on s390x * r14 is an allocatable register on s390x, so it shouldn't be used with `MovPReg`
This commit is contained in:
@@ -91,6 +91,7 @@ impl Inst {
|
||||
| Inst::Mov64MR { .. }
|
||||
| Inst::MovRM { .. }
|
||||
| Inst::MovRR { .. }
|
||||
| Inst::MovPReg { .. }
|
||||
| Inst::MovsxRmR { .. }
|
||||
| Inst::MovzxRmR { .. }
|
||||
| Inst::MulHi { .. }
|
||||
@@ -1423,6 +1424,13 @@ impl PrettyPrint for Inst {
|
||||
)
|
||||
}
|
||||
|
||||
Inst::MovPReg { src, dst } => {
|
||||
let src: Reg = (*src).into();
|
||||
let src = regs::show_ireg_sized(src, 8);
|
||||
let dst = pretty_print_reg(dst.to_reg().to_reg(), 8, allocs);
|
||||
format!("{} {}, {}", ljustify("movq".to_string()), src, dst)
|
||||
}
|
||||
|
||||
Inst::MovzxRmR {
|
||||
ext_mode, src, dst, ..
|
||||
} => {
|
||||
@@ -1984,6 +1992,11 @@ fn x64_get_operands<F: Fn(VReg) -> VReg>(inst: &Inst, collector: &mut OperandCol
|
||||
collector.reg_use(src.to_reg());
|
||||
collector.reg_def(dst.to_writable_reg());
|
||||
}
|
||||
Inst::MovPReg { dst, src } => {
|
||||
debug_assert!([regs::rsp(), regs::rbp()].contains(&(*src).into()));
|
||||
debug_assert!(dst.to_reg().to_reg().is_virtual());
|
||||
collector.reg_def(dst.to_writable_reg());
|
||||
}
|
||||
Inst::XmmToGpr { src, dst, .. } => {
|
||||
collector.reg_use(src.to_reg());
|
||||
collector.reg_def(dst.to_writable_reg());
|
||||
|
||||
Reference in New Issue
Block a user