AArch64: port load and store operations to ISLE. (#4785)
This retains `lower_amode` in the handwritten code (@akirilov-arm reports that there is an upcoming patch to port this), but tweaks it slightly to take a `Value` rather than an `Inst`.
This commit is contained in:
@@ -1502,10 +1502,13 @@
|
||||
(extern constructor cond_br_cond cond_br_cond)
|
||||
|
||||
;; Lower the address of a load or a store.
|
||||
(decl amode (Type Inst u32) AMode)
|
||||
(decl amode (Type Value u32) AMode)
|
||||
;; TODO: Port lower_address() to ISLE.
|
||||
(extern constructor amode amode)
|
||||
|
||||
(decl pair_amode (Value u32) PairAMode)
|
||||
(extern constructor pair_amode pair_amode)
|
||||
|
||||
;; Matches an `AMode` that is just a register.
|
||||
(decl pure amode_is_reg (AMode) Reg)
|
||||
;; TODO: Implement in ISLE.
|
||||
@@ -2337,6 +2340,92 @@
|
||||
(rule (udf trap_code)
|
||||
(SideEffectNoResult.Inst (MInst.Udf trap_code)))
|
||||
|
||||
;; Helpers for generating various load instructions, with varying
|
||||
;; widths and sign/zero-extending properties.
|
||||
(decl aarch64_uload8 (AMode MemFlags) Reg)
|
||||
(rule (aarch64_uload8 amode flags)
|
||||
(let ((dst WritableReg (temp_writable_reg $I64))
|
||||
(_ Unit (emit (MInst.ULoad8 dst amode flags))))
|
||||
dst))
|
||||
(decl aarch64_sload8 (AMode MemFlags) Reg)
|
||||
(rule (aarch64_sload8 amode flags)
|
||||
(let ((dst WritableReg (temp_writable_reg $I64))
|
||||
(_ Unit (emit (MInst.SLoad8 dst amode flags))))
|
||||
dst))
|
||||
(decl aarch64_uload16 (AMode MemFlags) Reg)
|
||||
(rule (aarch64_uload16 amode flags)
|
||||
(let ((dst WritableReg (temp_writable_reg $I64))
|
||||
(_ Unit (emit (MInst.ULoad16 dst amode flags))))
|
||||
dst))
|
||||
(decl aarch64_sload16 (AMode MemFlags) Reg)
|
||||
(rule (aarch64_sload16 amode flags)
|
||||
(let ((dst WritableReg (temp_writable_reg $I64))
|
||||
(_ Unit (emit (MInst.SLoad16 dst amode flags))))
|
||||
dst))
|
||||
(decl aarch64_uload32 (AMode MemFlags) Reg)
|
||||
(rule (aarch64_uload32 amode flags)
|
||||
(let ((dst WritableReg (temp_writable_reg $I64))
|
||||
(_ Unit (emit (MInst.ULoad32 dst amode flags))))
|
||||
dst))
|
||||
(decl aarch64_sload32 (AMode MemFlags) Reg)
|
||||
(rule (aarch64_sload32 amode flags)
|
||||
(let ((dst WritableReg (temp_writable_reg $I64))
|
||||
(_ Unit (emit (MInst.SLoad32 dst amode flags))))
|
||||
dst))
|
||||
(decl aarch64_uload64 (AMode MemFlags) Reg)
|
||||
(rule (aarch64_uload64 amode flags)
|
||||
(let ((dst WritableReg (temp_writable_reg $I64))
|
||||
(_ Unit (emit (MInst.ULoad64 dst amode flags))))
|
||||
dst))
|
||||
(decl aarch64_fpuload32 (AMode MemFlags) Reg)
|
||||
(rule (aarch64_fpuload32 amode flags)
|
||||
(let ((dst WritableReg (temp_writable_reg $F64))
|
||||
(_ Unit (emit (MInst.FpuLoad32 dst amode flags))))
|
||||
dst))
|
||||
(decl aarch64_fpuload64 (AMode MemFlags) Reg)
|
||||
(rule (aarch64_fpuload64 amode flags)
|
||||
(let ((dst WritableReg (temp_writable_reg $F64))
|
||||
(_ Unit (emit (MInst.FpuLoad64 dst amode flags))))
|
||||
dst))
|
||||
(decl aarch64_fpuload128 (AMode MemFlags) Reg)
|
||||
(rule (aarch64_fpuload128 amode flags)
|
||||
(let ((dst WritableReg (temp_writable_reg $F64X2))
|
||||
(_ Unit (emit (MInst.FpuLoad128 dst amode flags))))
|
||||
dst))
|
||||
(decl aarch64_loadp64 (PairAMode MemFlags) ValueRegs)
|
||||
(rule (aarch64_loadp64 amode flags)
|
||||
(let ((dst1 WritableReg (temp_writable_reg $I64))
|
||||
(dst2 WritableReg (temp_writable_reg $I64))
|
||||
(_ Unit (emit (MInst.LoadP64 dst1 dst2 amode flags))))
|
||||
(value_regs dst1 dst2)))
|
||||
|
||||
;; Helpers for generating various store instructions with varying
|
||||
;; widths.
|
||||
(decl aarch64_store8 (AMode MemFlags Reg) SideEffectNoResult)
|
||||
(rule (aarch64_store8 amode flags val)
|
||||
(SideEffectNoResult.Inst (MInst.Store8 val amode flags)))
|
||||
(decl aarch64_store16 (AMode MemFlags Reg) SideEffectNoResult)
|
||||
(rule (aarch64_store16 amode flags val)
|
||||
(SideEffectNoResult.Inst (MInst.Store16 val amode flags)))
|
||||
(decl aarch64_store32 (AMode MemFlags Reg) SideEffectNoResult)
|
||||
(rule (aarch64_store32 amode flags val)
|
||||
(SideEffectNoResult.Inst (MInst.Store32 val amode flags)))
|
||||
(decl aarch64_store64 (AMode MemFlags Reg) SideEffectNoResult)
|
||||
(rule (aarch64_store64 amode flags val)
|
||||
(SideEffectNoResult.Inst (MInst.Store64 val amode flags)))
|
||||
(decl aarch64_fpustore32 (AMode MemFlags Reg) SideEffectNoResult)
|
||||
(rule (aarch64_fpustore32 amode flags val)
|
||||
(SideEffectNoResult.Inst (MInst.FpuStore32 val amode flags)))
|
||||
(decl aarch64_fpustore64 (AMode MemFlags Reg) SideEffectNoResult)
|
||||
(rule (aarch64_fpustore64 amode flags val)
|
||||
(SideEffectNoResult.Inst (MInst.FpuStore64 val amode flags)))
|
||||
(decl aarch64_fpustore128 (AMode MemFlags Reg) SideEffectNoResult)
|
||||
(rule (aarch64_fpustore128 amode flags val)
|
||||
(SideEffectNoResult.Inst (MInst.FpuStore128 val amode flags)))
|
||||
(decl aarch64_storep64 (PairAMode MemFlags Reg Reg) SideEffectNoResult)
|
||||
(rule (aarch64_storep64 amode flags val1 val2)
|
||||
(SideEffectNoResult.Inst (MInst.StoreP64 val1 val2 amode flags)))
|
||||
|
||||
;; Immediate value helpers ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
;; Type of extension performed by an immediate helper
|
||||
|
||||
Reference in New Issue
Block a user