cranelift: Port ishl SIMD lowerings to ISLE (#3686)
This commit is contained in:
@@ -54,6 +54,8 @@
|
||||
(MovsxRmR (ext_mode ExtMode)
|
||||
(src RegMem)
|
||||
(dst WritableReg))
|
||||
(Mov64MR (src SyntheticAmode)
|
||||
(dst WritableReg))
|
||||
(Cmove (size OperandSize)
|
||||
(cc CC)
|
||||
(consequent RegMem)
|
||||
@@ -70,6 +72,8 @@
|
||||
(Not (size OperandSize)
|
||||
(src Reg)
|
||||
(dst WritableReg))
|
||||
(LoadEffectiveAddress (addr SyntheticAmode)
|
||||
(dst WritableReg))
|
||||
))
|
||||
|
||||
(type OperandSize extern
|
||||
@@ -318,6 +322,17 @@
|
||||
|
||||
(type SyntheticAmode extern (enum))
|
||||
|
||||
(decl synthetic_amode_to_reg_mem (SyntheticAmode) RegMem)
|
||||
(extern constructor synthetic_amode_to_reg_mem synthetic_amode_to_reg_mem)
|
||||
|
||||
(type Amode extern (enum))
|
||||
|
||||
(decl amode_imm_reg_reg_shift (u32 Reg Reg u8) Amode)
|
||||
(extern constructor amode_imm_reg_reg_shift amode_imm_reg_reg_shift)
|
||||
|
||||
(decl amode_to_synthetic_amode (Amode) SyntheticAmode)
|
||||
(extern constructor amode_to_synthetic_amode amode_to_synthetic_amode)
|
||||
|
||||
(type ShiftKind extern
|
||||
(enum ShiftLeft
|
||||
ShiftRightLogical
|
||||
@@ -438,6 +453,11 @@
|
||||
|
||||
;;;; Helpers for Sign/Zero Extending ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(type ExtKind extern
|
||||
(enum None
|
||||
SignExtend
|
||||
ZeroExtend))
|
||||
|
||||
(type ExtendKind (enum Sign Zero))
|
||||
|
||||
(type ExtMode extern (enum BL BQ WL WQ LQ))
|
||||
@@ -549,6 +569,40 @@
|
||||
(RegMem.Reg r)
|
||||
(OperandSize.Size32))))
|
||||
|
||||
;;;; Helpers for Emitting Loads ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
;; Load a value into a register.
|
||||
(decl x64_load (Type SyntheticAmode ExtKind) Reg)
|
||||
|
||||
(rule (x64_load (fits_in_32 ty) addr (ExtKind.SignExtend))
|
||||
(movsx ty
|
||||
(ext_mode (ty_bytes ty) 8)
|
||||
(synthetic_amode_to_reg_mem addr)))
|
||||
|
||||
(rule (x64_load $I64 addr _ext_kind)
|
||||
(let ((dst WritableReg (temp_writable_reg $I64))
|
||||
(_ Unit (emit (MInst.Mov64MR addr dst))))
|
||||
(writable_reg_to_reg dst)))
|
||||
|
||||
(rule (x64_load $F32 addr _ext_kind)
|
||||
(xmm_unary_rm_r (SseOpcode.Movss)
|
||||
(synthetic_amode_to_reg_mem addr)))
|
||||
|
||||
(rule (x64_load $F64 addr _ext_kind)
|
||||
(xmm_unary_rm_r (SseOpcode.Movsd)
|
||||
(synthetic_amode_to_reg_mem addr)))
|
||||
|
||||
(rule (x64_load $F32X4 addr _ext_kind)
|
||||
(xmm_unary_rm_r (SseOpcode.Movups)
|
||||
(synthetic_amode_to_reg_mem addr)))
|
||||
|
||||
(rule (x64_load $F64X2 addr _ext_kind)
|
||||
(xmm_unary_rm_r (SseOpcode.Movupd)
|
||||
(synthetic_amode_to_reg_mem addr)))
|
||||
|
||||
(rule (x64_load (multi_lane _bits _lanes) addr _ext_kind)
|
||||
(xmm_unary_rm_r (SseOpcode.Movdqu)
|
||||
(synthetic_amode_to_reg_mem addr)))
|
||||
|
||||
;;;; Instruction Constructors ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;
|
||||
@@ -1236,6 +1290,16 @@
|
||||
dst))))
|
||||
(writable_reg_to_reg dst)))
|
||||
|
||||
;; Helper for creating `psllw` instructions.
|
||||
(decl psllw (Reg RegMemImm) Reg)
|
||||
(rule (psllw src1 src2)
|
||||
(xmm_rmi_reg (SseOpcode.Psllw) src1 src2))
|
||||
|
||||
;; Helper for creating `pslld` instructions.
|
||||
(decl pslld (Reg RegMemImm) Reg)
|
||||
(rule (pslld src1 src2)
|
||||
(xmm_rmi_reg (SseOpcode.Pslld) src1 src2))
|
||||
|
||||
;; Helper for creating `psllq` instructions.
|
||||
(decl psllq (Reg RegMemImm) Reg)
|
||||
(rule (psllq src1 src2)
|
||||
@@ -1353,3 +1417,9 @@
|
||||
(size OperandSize (operand_size_of_type_32_64 ty))
|
||||
(_ Unit (emit (MInst.Not size src dst))))
|
||||
(writable_reg_to_reg dst)))
|
||||
|
||||
(decl lea (SyntheticAmode) Reg)
|
||||
(rule (lea addr)
|
||||
(let ((dst WritableReg (temp_writable_reg $I64))
|
||||
(_ Unit (emit (MInst.LoadEffectiveAddress addr dst))))
|
||||
(writable_reg_to_reg dst)))
|
||||
|
||||
Reference in New Issue
Block a user