AArch64: Migrate calls and returns to ISLE. (#4788)
This commit is contained in:
@@ -963,6 +963,37 @@
|
||||
(decl real_reg_to_writable_reg (RealReg) WritableReg)
|
||||
(extern constructor real_reg_to_writable_reg real_reg_to_writable_reg)
|
||||
|
||||
;; Generate a move between two registers.
|
||||
(decl gen_move (Type WritableReg Reg) MInst)
|
||||
(extern constructor gen_move gen_move)
|
||||
|
||||
;; Copy a return value to a set of registers.
|
||||
(decl copy_to_regs (WritableValueRegs Value) Unit)
|
||||
(rule (copy_to_regs dsts val @ (value_type ty))
|
||||
(let ((srcs ValueRegs (put_in_regs val)))
|
||||
(copy_to_regs_range ty (value_regs_range srcs) dsts srcs)))
|
||||
|
||||
;; Helper for `copy_to_regs` that uses a range to index into the reg/value
|
||||
;; vectors. Fails for the empty range.
|
||||
(decl copy_to_regs_range (Type Range WritableValueRegs ValueRegs) Unit)
|
||||
|
||||
(rule (copy_to_regs_range ty (range_singleton idx) dsts srcs)
|
||||
(let ((dst WritableReg (writable_regs_get dsts idx))
|
||||
(src Reg (value_regs_get srcs idx)))
|
||||
(emit (gen_move ty dst src))))
|
||||
|
||||
(rule (copy_to_regs_range ty (range_unwrap head tail) dsts srcs)
|
||||
(let ((dst WritableReg (writable_regs_get dsts head))
|
||||
(src Reg (value_regs_get srcs head))
|
||||
(_ Unit (emit (gen_move ty dst src))))
|
||||
(copy_to_regs_range ty tail dsts srcs)))
|
||||
|
||||
(decl lower_return (Range ValueSlice) InstOutput)
|
||||
(rule (lower_return (range_empty) _) (output_none))
|
||||
(rule (lower_return (range_unwrap head tail) args)
|
||||
(let ((_ Unit (copy_to_regs (retval head) (value_slice_get args head))))
|
||||
(lower_return tail args)))
|
||||
|
||||
;;;; Automatic conversions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(convert Inst Value def_inst)
|
||||
|
||||
Reference in New Issue
Block a user