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:
@@ -104,6 +104,11 @@
|
||||
(src Gpr)
|
||||
(dst WritableGpr))
|
||||
|
||||
;; Like `MovRR` but with a physical register source (for implementing
|
||||
;; CLIF instructions like `get_stack_pointer`).
|
||||
(MovPReg (src PReg)
|
||||
(dst WritableGpr))
|
||||
|
||||
;; Zero-extended loads, except for 64 bits: movz (bl bq wl wq lq) addr
|
||||
;; reg.
|
||||
;;
|
||||
@@ -3328,3 +3333,24 @@
|
||||
(decl synthetic_amode_to_xmm_mem (SyntheticAmode) XmmMem)
|
||||
(rule (synthetic_amode_to_xmm_mem amode)
|
||||
(synthetic_amode_to_reg_mem amode))
|
||||
|
||||
;; Helper for creating `MovPReg` instructions.
|
||||
(decl mov_preg (PReg) Reg)
|
||||
(rule (mov_preg preg)
|
||||
(let ((dst WritableGpr (temp_writable_gpr))
|
||||
(_ Unit (emit (MInst.MovPReg preg dst))))
|
||||
dst))
|
||||
|
||||
(decl preg_rbp () PReg)
|
||||
(extern constructor preg_rbp preg_rbp)
|
||||
|
||||
(decl preg_rsp () PReg)
|
||||
(extern constructor preg_rsp preg_rsp)
|
||||
|
||||
(decl x64_rbp () Reg)
|
||||
(rule (x64_rbp)
|
||||
(mov_preg (preg_rbp)))
|
||||
|
||||
(decl x64_rsp () Reg)
|
||||
(rule (x64_rsp)
|
||||
(mov_preg (preg_rsp)))
|
||||
|
||||
Reference in New Issue
Block a user