From e8881b2cc0cfaf960ab7e1094aaddeb02a73a702 Mon Sep 17 00:00:00 2001 From: Chris Fallin Date: Wed, 23 Feb 2022 16:14:38 -0800 Subject: [PATCH] ISLE lowering rules: make use of implicit conversions. (#3847) This PR makes use of the new implicit-conversion feature of the ISLE DSL that was introduced in #3807 in order to make the lowering rules significantly simpler and more concise. The basic idea is to eliminate the repetitive and mechanical use of terms that convert from one type to another when there is only one real way to do the conversion -- for example, to go from a `WritableReg` to a `Reg`, the only sensible way is to use `writable_reg_to_reg`. This PR generally takes any term of the form "A_to_B" and makes it an automatic conversion, as well as some others that are similar in spirit. The notable exception to the pure-value-convsion category is the `put_in_reg` family of operations, which actually do have side-effects. However, as noted in the doc additions in #3807, this is fine as long as the side-effects are idempotent. And on balance, making `put_in_reg` automatic is a significant clarity win -- together with other operand converters, it enables rules like: ``` ;; Add two registers. (rule (lower (has_type (fits_in_64 ty) (iadd x y))) (add ty x y)) ``` There may be other converters that we could define to make the rules even simpler; we can make such improvements as we think of them, but this should be a good start! --- cranelift/codegen/src/isa/aarch64/inst.isle | 78 +- cranelift/codegen/src/isa/aarch64/lower.isle | 785 +++++----- .../lower/isle/generated_code.manifest | 6 +- .../isa/aarch64/lower/isle/generated_code.rs | 272 ++-- cranelift/codegen/src/isa/s390x/inst.isle | 166 +- cranelift/codegen/src/isa/s390x/lower.isle | 592 +++---- .../s390x/lower/isle/generated_code.manifest | 6 +- .../isa/s390x/lower/isle/generated_code.rs | 15 +- cranelift/codegen/src/isa/x64/inst.isle | 335 ++-- cranelift/codegen/src/isa/x64/lower.isle | 879 +++++------ .../x64/lower/isle/generated_code.manifest | 6 +- .../src/isa/x64/lower/isle/generated_code.rs | 1373 +++++++++-------- cranelift/codegen/src/prelude.isle | 6 + 13 files changed, 2264 insertions(+), 2255 deletions(-) diff --git a/cranelift/codegen/src/isa/aarch64/inst.isle b/cranelift/codegen/src/isa/aarch64/inst.isle index 8fbee0c5e6..91fe89825a 100644 --- a/cranelift/codegen/src/isa/aarch64/inst.isle +++ b/cranelift/codegen/src/isa/aarch64/inst.isle @@ -1363,77 +1363,77 @@ (rule (movz imm size) (let ((dst WritableReg (temp_writable_reg $I64)) (_ Unit (emit (MInst.MovZ dst imm size)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.MovN` instructions. (decl movn (MoveWideConst OperandSize) Reg) (rule (movn imm size) (let ((dst WritableReg (temp_writable_reg $I64)) (_ Unit (emit (MInst.MovN dst imm size)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.AluRRImmLogic` instructions. (decl alu_rr_imm_logic (ALUOp Type Reg ImmLogic) Reg) (rule (alu_rr_imm_logic op ty src imm) (let ((dst WritableReg (temp_writable_reg $I64)) (_ Unit (emit (MInst.AluRRImmLogic op (operand_size ty) dst src imm)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.AluRRImmShift` instructions. (decl alu_rr_imm_shift (ALUOp Type Reg ImmShift) Reg) (rule (alu_rr_imm_shift op ty src imm) (let ((dst WritableReg (temp_writable_reg $I64)) (_ Unit (emit (MInst.AluRRImmShift op (operand_size ty) dst src imm)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.AluRRR` instructions. (decl alu_rrr (ALUOp Type Reg Reg) Reg) (rule (alu_rrr op ty src1 src2) (let ((dst WritableReg (temp_writable_reg $I64)) (_ Unit (emit (MInst.AluRRR op (operand_size ty) dst src1 src2)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.VecRRR` instructions. (decl vec_rrr (VecALUOp Reg Reg VectorSize) Reg) (rule (vec_rrr op src1 src2 size) (let ((dst WritableReg (temp_writable_reg $I8X16)) (_ Unit (emit (MInst.VecRRR op dst src1 src2 size)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.VecLanes` instructions. (decl vec_lanes (VecLanesOp Reg VectorSize) Reg) (rule (vec_lanes op src size) (let ((dst WritableReg (temp_writable_reg $I8X16)) (_ Unit (emit (MInst.VecLanes op dst src size)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.VecDup` instructions. (decl vec_dup (Reg VectorSize) Reg) (rule (vec_dup src size) (let ((dst WritableReg (temp_writable_reg $I8X16)) (_ Unit (emit (MInst.VecDup dst src size)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.AluRRImm12` instructions. (decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) (rule (alu_rr_imm12 op ty src imm) (let ((dst WritableReg (temp_writable_reg $I64)) (_ Unit (emit (MInst.AluRRImm12 op (operand_size ty) dst src imm)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.AluRRRShift` instructions. (decl alu_rrr_shift (ALUOp Type Reg Reg ShiftOpAndAmt) Reg) (rule (alu_rrr_shift op ty src1 src2 shift) (let ((dst WritableReg (temp_writable_reg $I64)) (_ Unit (emit (MInst.AluRRRShift op (operand_size ty) dst src1 src2 shift)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.AluRRRExtend` instructions. (decl alu_rrr_extend (ALUOp Type Reg Reg ExtendOp) Reg) (rule (alu_rrr_extend op ty src1 src2 extend) (let ((dst WritableReg (temp_writable_reg $I64)) (_ Unit (emit (MInst.AluRRRExtend op (operand_size ty) dst src1 src2 extend)))) - (writable_reg_to_reg dst))) + dst)) ;; Same as `alu_rrr_extend`, but takes an `ExtendedValue` packed "pair" instead ;; of a `Reg` and an `ExtendOp`. @@ -1448,14 +1448,14 @@ (rule (alu_rrrr op src1 src2 src3) (let ((dst WritableReg (temp_writable_reg $I64)) (_ Unit (emit (MInst.AluRRRR op dst src1 src2 src3)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.BitRR` instructions. (decl bit_rr (BitOp Type Reg) Reg) (rule (bit_rr op ty src) (let ((dst WritableReg (temp_writable_reg $I64)) (_ Unit (emit (MInst.BitRR op (operand_size ty) dst src)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `adds` instructions. (decl add_with_flags_paired (Type Reg Reg) ProducesFlags) @@ -1463,7 +1463,7 @@ (let ((dst WritableReg (temp_writable_reg $I64))) (ProducesFlags.ProducesFlagsReturnsResultWithConsumer (MInst.AluRRR (ALUOp.AddS) (operand_size ty) dst src1 src2) - (writable_reg_to_reg dst)))) + dst))) ;; Helper for emitting `adc` instructions. (decl adc_paired (Type Reg Reg) ConsumesFlags) @@ -1471,7 +1471,7 @@ (let ((dst WritableReg (temp_writable_reg $I64))) (ConsumesFlags.ConsumesFlagsReturnsResultWithProducer (MInst.AluRRR (ALUOp.Adc) (operand_size ty) dst src1 src2) - (writable_reg_to_reg dst)))) + dst))) ;; Helper for emitting `subs` instructions. (decl sub_with_flags_paired (Type Reg Reg) ProducesFlags) @@ -1479,7 +1479,7 @@ (let ((dst WritableReg (temp_writable_reg $I64))) (ProducesFlags.ProducesFlagsReturnsResultWithConsumer (MInst.AluRRR (ALUOp.SubS) (operand_size ty) dst src1 src2) - (writable_reg_to_reg dst)))) + dst))) (decl cmp64_imm (Reg Imm12) ProducesFlags) (rule (cmp64_imm src1 src2) @@ -1493,21 +1493,21 @@ (let ((dst WritableReg (temp_writable_reg $I64))) (ConsumesFlags.ConsumesFlagsReturnsResultWithProducer (MInst.AluRRR (ALUOp.Sbc) (operand_size ty) dst src1 src2) - (writable_reg_to_reg dst)))) + dst))) ;; Helper for emitting `MInst.VecMisc` instructions. (decl vec_misc (VecMisc2 Reg VectorSize) Reg) (rule (vec_misc op src size) (let ((dst WritableReg (temp_writable_reg $I8X16)) (_ Unit (emit (MInst.VecMisc op dst src size)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.VecRRRLong` instructions. (decl vec_rrr_long (VecRRRLongOp Reg Reg bool) Reg) (rule (vec_rrr_long op src1 src2 high_half) (let ((dst WritableReg (temp_writable_reg $I8X16)) (_ Unit (emit (MInst.VecRRRLong op dst src1 src2 high_half)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.VecRRRLong` instructions, but for variants ;; where the operation both reads and modifies the destination register. @@ -1518,28 +1518,28 @@ (let ((dst WritableReg (temp_writable_reg $I8X16)) (_1 Unit (emit (MInst.FpuMove128 dst src1))) (_2 Unit (emit (MInst.VecRRRLong op dst src2 src3 high_half)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.VecRRNarrow` instructions. (decl vec_rr_narrow (VecRRNarrowOp Reg bool) Reg) (rule (vec_rr_narrow op src high_half) (let ((dst WritableReg (temp_writable_reg $I8X16)) (_ Unit (emit (MInst.VecRRNarrow op dst src high_half)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.VecRRLong` instructions. (decl vec_rr_long (VecRRLongOp Reg bool) Reg) (rule (vec_rr_long op src high_half) (let ((dst WritableReg (temp_writable_reg $I8X16)) (_ Unit (emit (MInst.VecRRLong op dst src high_half)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.MovToFpu` instructions. (decl mov_to_fpu (Reg ScalarSize) Reg) (rule (mov_to_fpu x size) (let ((dst WritableReg (temp_writable_reg $I8X16)) (_ Unit (emit (MInst.MovToFpu dst x size)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.MovToVec` instructions. (decl mov_to_vec (Reg Reg u8 VectorSize) Reg) @@ -1547,35 +1547,35 @@ (let ((dst WritableReg (temp_writable_reg $I8X16)) (_1 Unit (emit (MInst.FpuMove128 dst src1))) (_2 Unit (emit (MInst.MovToVec dst src2 lane size)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.MovFromVec` instructions. (decl mov_from_vec (Reg u8 VectorSize) Reg) (rule (mov_from_vec rn idx size) (let ((dst WritableReg (temp_writable_reg $I64)) (_ Unit (emit (MInst.MovFromVec dst rn idx size)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.MovFromVecSigned` instructions. (decl mov_from_vec_signed (Reg u8 VectorSize OperandSize) Reg) (rule (mov_from_vec_signed rn idx size scalar_size) (let ((dst WritableReg (temp_writable_reg $I64)) (_ Unit (emit (MInst.MovFromVecSigned dst rn idx size scalar_size)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.Extend` instructions. (decl extend (Reg bool u8 u8) Reg) (rule (extend rn signed from_bits to_bits) (let ((dst WritableReg (temp_writable_reg $I64)) (_ Unit (emit (MInst.Extend dst rn signed from_bits to_bits)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.LoadAcquire` instructions. (decl load_acquire (Type Reg) Reg) (rule (load_acquire ty addr) (let ((dst WritableReg (temp_writable_reg $I64)) (_ Unit (emit (MInst.LoadAcquire ty dst addr)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for generating a `tst` instruction. ;; @@ -1600,7 +1600,7 @@ (let ((dst WritableReg (temp_writable_reg $I64))) (ConsumesFlags.ConsumesFlagsReturnsReg (MInst.CSel dst cond if_true if_false) - (writable_reg_to_reg dst)))) + dst))) ;; Helpers for generating `add` instructions. @@ -1870,36 +1870,36 @@ ;; Place a `Value` into a register, sign extending it to 32-bits (decl put_in_reg_sext32 (Value) Reg) (rule (put_in_reg_sext32 val @ (value_type (fits_in_32 ty))) - (extend (put_in_reg val) $true (ty_bits ty) 32)) + (extend val $true (ty_bits ty) 32)) ;; 32/64-bit passthrough. -(rule (put_in_reg_sext32 val @ (value_type $I32)) (put_in_reg val)) -(rule (put_in_reg_sext32 val @ (value_type $I64)) (put_in_reg val)) +(rule (put_in_reg_sext32 val @ (value_type $I32)) val) +(rule (put_in_reg_sext32 val @ (value_type $I64)) val) ;; Place a `Value` into a register, zero extending it to 32-bits (decl put_in_reg_zext32 (Value) Reg) (rule (put_in_reg_zext32 val @ (value_type (fits_in_32 ty))) - (extend (put_in_reg val) $false (ty_bits ty) 32)) + (extend val $false (ty_bits ty) 32)) ;; 32/64-bit passthrough. -(rule (put_in_reg_zext32 val @ (value_type $I32)) (put_in_reg val)) -(rule (put_in_reg_zext32 val @ (value_type $I64)) (put_in_reg val)) +(rule (put_in_reg_zext32 val @ (value_type $I32)) val) +(rule (put_in_reg_zext32 val @ (value_type $I64)) val) ;; Place a `Value` into a register, sign extending it to 64-bits (decl put_in_reg_sext64 (Value) Reg) (rule (put_in_reg_sext64 val @ (value_type (fits_in_32 ty))) - (extend (put_in_reg val) $true (ty_bits ty) 64)) + (extend val $true (ty_bits ty) 64)) ;; 64-bit passthrough. -(rule (put_in_reg_sext64 val @ (value_type $I64)) (put_in_reg val)) +(rule (put_in_reg_sext64 val @ (value_type $I64)) val) ;; Place a `Value` into a register, zero extending it to 64-bits (decl put_in_reg_zext64 (Value) Reg) (rule (put_in_reg_zext64 val @ (value_type (fits_in_32 ty))) - (extend (put_in_reg val) $false (ty_bits ty) 64)) + (extend val $false (ty_bits ty) 64)) ;; 64-bit passthrough. -(rule (put_in_reg_zext64 val @ (value_type $I64)) (put_in_reg val)) +(rule (put_in_reg_zext64 val @ (value_type $I64)) val) ;; Misc instruction helpers ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/cranelift/codegen/src/isa/aarch64/lower.isle b/cranelift/codegen/src/isa/aarch64/lower.isle index 5049683e2f..7b69dd977f 100644 --- a/cranelift/codegen/src/isa/aarch64/lower.isle +++ b/cranelift/codegen/src/isa/aarch64/lower.isle @@ -7,20 +7,20 @@ ;;;; Rules for `iconst` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (rule (lower (has_type ty (iconst (u64_from_imm64 n)))) - (value_reg (imm ty n))) + (imm ty n)) ;;;; Rules for `bconst` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (rule (lower (has_type ty (bconst $false))) - (value_reg (imm ty 0))) + (imm ty 0)) (rule (lower (has_type ty (bconst $true))) - (value_reg (imm ty 1))) + (imm ty 1)) ;;;; Rules for `null` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (rule (lower (has_type ty (null))) - (value_reg (imm ty 0))) + (imm ty 0)) ;;;; Rules for `iadd` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -28,66 +28,65 @@ ;; Base case, simply adding things in registers. (rule (lower (has_type (fits_in_64 ty) (iadd x y))) - (value_reg (add ty (put_in_reg x) (put_in_reg y)))) + (add ty x y)) ;; Special cases for when one operand is an immediate that fits in 12 bits. (rule (lower (has_type (fits_in_64 ty) (iadd x (imm12_from_value y)))) - (value_reg (add_imm ty (put_in_reg x) y))) + (add_imm ty x y)) (rule (lower (has_type (fits_in_64 ty) (iadd (imm12_from_value x) y))) - (value_reg (add_imm ty (put_in_reg y) x))) + (add_imm ty y x)) ;; Same as the previous special cases, except we can switch the addition to a ;; subtraction if the negated immediate fits in 12 bits. (rule (lower (has_type (fits_in_64 ty) (iadd x (imm12_from_negated_value y)))) - (value_reg (sub_imm ty (put_in_reg x) y))) + (sub_imm ty x y)) (rule (lower (has_type (fits_in_64 ty) (iadd (imm12_from_negated_value x) y))) - (value_reg (sub_imm ty (put_in_reg y) x))) + (sub_imm ty y x)) ;; Special cases for when we're adding an extended register where the extending ;; operation can get folded into the add itself. (rule (lower (has_type (fits_in_64 ty) (iadd x (extended_value_from_value y)))) - (value_reg (add_extend ty (put_in_reg x) y))) + (add_extend ty x y)) (rule (lower (has_type (fits_in_64 ty) (iadd (extended_value_from_value x) y))) - (value_reg (add_extend ty (put_in_reg y) x))) + (add_extend ty y x)) ;; Special cases for when we're adding the shift of a different ;; register by a constant amount and the shift can get folded into the add. (rule (lower (has_type (fits_in_64 ty) - (iadd x (def_inst (ishl y (def_inst (iconst (lshl_from_imm64 ORR_NOT rd, zero, rm (rule (lower (has_type (fits_in_64 ty) (bnot x))) - (value_reg (orr_not ty (zero_reg) (put_in_reg x)))) + (orr_not ty (zero_reg) x)) ;; Special case to use `orr_not_shift` if it's a `bnot` of a const-left-shifted ;; value. (rule (lower (has_type (fits_in_64 ty) - (bnot (def_inst (ishl x (def_inst (iconst (lshl_from_imm64 (ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/aarch64/lower.isle line 1016. + // Rule at src/isa/aarch64/lower.isle line 974. let expr0_0: Type = I32; let expr1_0: Type = I32; let expr2_0 = C::put_in_reg(ctx, pattern5_1); @@ -3434,7 +3434,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/aarch64/lower.isle line 1039. + // Rule at src/isa/aarch64/lower.isle line 995. let expr0_0: Type = I32; let expr1_0: Type = I32; let expr2_0 = constructor_put_in_reg_zext32(ctx, pattern5_1)?; @@ -3446,7 +3446,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/aarch64/lower.isle line 1090. + // Rule at src/isa/aarch64/lower.isle line 1042. let expr0_0: Type = I32; let expr1_0: Type = I32; let expr2_0 = constructor_put_in_reg_zext32(ctx, pattern5_1)?; @@ -3458,7 +3458,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/aarch64/lower.isle line 1071. + // Rule at src/isa/aarch64/lower.isle line 1025. let expr0_0: Type = I32; let expr1_0: Type = I32; let expr2_0: Type = I32; @@ -3473,7 +3473,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/aarch64/lower.isle line 1144. + // Rule at src/isa/aarch64/lower.isle line 1093. let expr0_0 = C::put_in_reg(ctx, pattern5_1); let expr1_0 = ScalarSize::Size32; let expr2_0 = constructor_mov_to_fpu(ctx, expr0_0, &expr1_0)?; @@ -3498,7 +3498,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/aarch64/lower.isle line 1022. + // Rule at src/isa/aarch64/lower.isle line 980. let expr0_0: Type = I32; let expr1_0: Type = I32; let expr2_0 = C::put_in_reg(ctx, pattern5_1); @@ -3510,7 +3510,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/aarch64/lower.isle line 1042. + // Rule at src/isa/aarch64/lower.isle line 998. let expr0_0: Type = I32; let expr1_0: Type = I32; let expr2_0 = constructor_put_in_reg_zext32(ctx, pattern5_1)?; @@ -3522,7 +3522,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/aarch64/lower.isle line 1093. + // Rule at src/isa/aarch64/lower.isle line 1045. let expr0_0: Type = I32; let expr1_0: Type = I32; let expr2_0 = constructor_put_in_reg_zext32(ctx, pattern5_1)?; @@ -3534,7 +3534,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/aarch64/lower.isle line 1074. + // Rule at src/isa/aarch64/lower.isle line 1028. let expr0_0: Type = I32; let expr1_0: Type = I32; let expr2_0: Type = I32; @@ -3549,7 +3549,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/aarch64/lower.isle line 1152. + // Rule at src/isa/aarch64/lower.isle line 1099. let expr0_0 = C::put_in_reg(ctx, pattern5_1); let expr1_0 = ScalarSize::Size32; let expr2_0 = constructor_mov_to_fpu(ctx, expr0_0, &expr1_0)?; @@ -3595,7 +3595,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { if let &Opcode::Popcnt = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 1160. + // Rule at src/isa/aarch64/lower.isle line 1105. let expr0_0 = C::put_in_reg(ctx, pattern5_1); let expr1_0 = ScalarSize::Size32; let expr2_0 = constructor_mov_to_fpu(ctx, expr0_0, &expr1_0)?; @@ -3702,7 +3702,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 374. + // Rule at src/isa/aarch64/lower.isle line 367. let expr0_0: Type = I64; let expr1_0 = C::put_in_reg(ctx, pattern7_0); let expr2_0 = C::put_in_reg(ctx, pattern7_1); @@ -3712,7 +3712,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 360. + // Rule at src/isa/aarch64/lower.isle line 355. let expr0_0: Type = I64; let expr1_0 = C::put_in_reg(ctx, pattern7_0); let expr2_0 = C::put_in_reg(ctx, pattern7_1); @@ -3722,7 +3722,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 609. + // Rule at src/isa/aarch64/lower.isle line 586. let expr0_0 = ALUOp::And; let expr1_0: Type = I64; let expr2_0 = constructor_alu_rs_imm_logic_commutative( @@ -3733,7 +3733,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 622. + // Rule at src/isa/aarch64/lower.isle line 599. let expr0_0 = ALUOp::Orr; let expr1_0: Type = I64; let expr2_0 = constructor_alu_rs_imm_logic_commutative( @@ -3744,7 +3744,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 635. + // Rule at src/isa/aarch64/lower.isle line 612. let expr0_0 = ALUOp::Eor; let expr1_0: Type = I64; let expr2_0 = constructor_alu_rs_imm_logic_commutative( @@ -3755,7 +3755,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 648. + // Rule at src/isa/aarch64/lower.isle line 625. let expr0_0 = ALUOp::AndNot; let expr1_0: Type = I64; let expr2_0 = constructor_alu_rs_imm_logic( @@ -3766,7 +3766,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 661. + // Rule at src/isa/aarch64/lower.isle line 638. let expr0_0 = ALUOp::OrrNot; let expr1_0: Type = I64; let expr2_0 = constructor_alu_rs_imm_logic( @@ -3777,7 +3777,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 671. + // Rule at src/isa/aarch64/lower.isle line 648. let expr0_0 = ALUOp::EorNot; let expr1_0: Type = I64; let expr2_0 = constructor_alu_rs_imm_logic( @@ -3806,7 +3806,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 683. + // Rule at src/isa/aarch64/lower.isle line 660. let expr0_0 = ALUOp::Lsl; let expr1_0: Type = I64; let expr2_0 = C::put_in_reg(ctx, pattern7_0); @@ -3890,7 +3890,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 772. + // Rule at src/isa/aarch64/lower.isle line 744. let expr0_0 = ALUOp::Lsr; let expr1_0: Type = I64; let expr2_0 = constructor_put_in_reg_zext64(ctx, pattern7_0)?; @@ -3901,7 +3901,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 822. + // Rule at src/isa/aarch64/lower.isle line 791. let expr0_0 = ALUOp::Asr; let expr1_0: Type = I64; let expr2_0 = constructor_put_in_reg_sext64(ctx, pattern7_0)?; @@ -3918,7 +3918,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { if let &Opcode::Popcnt = pattern5_0 { - // Rule at src/isa/aarch64/lower.isle line 1168. + // Rule at src/isa/aarch64/lower.isle line 1111. let expr0_0 = C::put_in_reg(ctx, pattern5_1); let expr1_0 = ScalarSize::Size64; let expr2_0 = constructor_mov_to_fpu(ctx, expr0_0, &expr1_0)?; @@ -3967,7 +3967,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 130. + // Rule at src/isa/aarch64/lower.isle line 129. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0: usize = 0; let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); @@ -3988,7 +3988,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 185. + // Rule at src/isa/aarch64/lower.isle line 183. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0: usize = 0; let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); @@ -4010,7 +4010,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 612. + // Rule at src/isa/aarch64/lower.isle line 589. let expr0_0 = ALUOp::And; let expr1_0: Type = I64; let expr2_0 = constructor_i128_alu_bitop( @@ -4020,7 +4020,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 625. + // Rule at src/isa/aarch64/lower.isle line 602. let expr0_0 = ALUOp::Orr; let expr1_0: Type = I64; let expr2_0 = constructor_i128_alu_bitop( @@ -4030,7 +4030,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 638. + // Rule at src/isa/aarch64/lower.isle line 615. let expr0_0 = ALUOp::Eor; let expr1_0: Type = I64; let expr2_0 = constructor_i128_alu_bitop( @@ -4040,7 +4040,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 651. + // Rule at src/isa/aarch64/lower.isle line 628. let expr0_0 = ALUOp::AndNot; let expr1_0: Type = I64; let expr2_0 = constructor_i128_alu_bitop( @@ -4050,7 +4050,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 664. + // Rule at src/isa/aarch64/lower.isle line 641. let expr0_0 = ALUOp::OrrNot; let expr1_0: Type = I64; let expr2_0 = constructor_i128_alu_bitop( @@ -4060,7 +4060,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 674. + // Rule at src/isa/aarch64/lower.isle line 651. let expr0_0 = ALUOp::EorNot; let expr1_0: Type = I64; let expr2_0 = constructor_i128_alu_bitop( @@ -4070,7 +4070,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 912. + // Rule at src/isa/aarch64/lower.isle line 878. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0 = C::put_in_regs(ctx, pattern7_1); let expr2_0: usize = 0; @@ -4099,7 +4099,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 999. + // Rule at src/isa/aarch64/lower.isle line 959. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0 = C::put_in_regs(ctx, pattern7_1); let expr2_0: usize = 0; @@ -4128,7 +4128,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 687. + // Rule at src/isa/aarch64/lower.isle line 664. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0 = C::put_in_regs(ctx, pattern7_1); let expr2_0: usize = 0; @@ -4138,7 +4138,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 776. + // Rule at src/isa/aarch64/lower.isle line 748. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0 = C::put_in_regs(ctx, pattern7_1); let expr2_0: usize = 0; @@ -4148,7 +4148,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 826. + // Rule at src/isa/aarch64/lower.isle line 795. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0 = C::put_in_regs(ctx, pattern7_1); let expr2_0: usize = 0; @@ -4165,7 +4165,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { match pattern5_0 { &Opcode::Bnot => { - // Rule at src/isa/aarch64/lower.isle line 590. + // Rule at src/isa/aarch64/lower.isle line 569. let expr0_0 = C::put_in_regs(ctx, pattern5_1); let expr1_0: usize = 0; let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); @@ -4181,7 +4181,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/aarch64/lower.isle line 1025. + // Rule at src/isa/aarch64/lower.isle line 983. let expr0_0 = C::put_in_regs(ctx, pattern5_1); let expr1_0: Type = I64; let expr2_0: usize = 0; @@ -4195,13 +4195,13 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/aarch64/lower.isle line 1045. + // Rule at src/isa/aarch64/lower.isle line 1001. let expr0_0 = C::put_in_regs(ctx, pattern5_1); let expr1_0 = constructor_lower_clz128(ctx, expr0_0)?; return Some(expr1_0); } &Opcode::Cls => { - // Rule at src/isa/aarch64/lower.isle line 1105. + // Rule at src/isa/aarch64/lower.isle line 1057. let expr0_0 = C::put_in_regs(ctx, pattern5_1); let expr1_0: usize = 0; let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); @@ -4234,7 +4234,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/aarch64/lower.isle line 1077. + // Rule at src/isa/aarch64/lower.isle line 1031. let expr0_0 = C::put_in_regs(ctx, pattern5_1); let expr1_0: Type = I64; let expr2_0: usize = 0; @@ -4249,7 +4249,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/aarch64/lower.isle line 1176. + // Rule at src/isa/aarch64/lower.isle line 1117. let expr0_0 = C::put_in_regs(ctx, pattern5_1); let expr1_0: usize = 0; let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); @@ -4287,7 +4287,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { match pattern4_0 { &Opcode::Bitrev => { - // Rule at src/isa/aarch64/lower.isle line 1033. + // Rule at src/isa/aarch64/lower.isle line 989. let expr0_0 = C::put_in_reg(ctx, pattern4_1); let expr1_0 = constructor_rbit(ctx, pattern2_0, expr0_0)?; let expr2_0 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } &Opcode::Clz => { - // Rule at src/isa/aarch64/lower.isle line 1048. + // Rule at src/isa/aarch64/lower.isle line 1004. let expr0_0 = C::put_in_reg(ctx, pattern4_1); let expr1_0 = constructor_a64_clz(ctx, pattern2_0, expr0_0)?; let expr2_0 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } &Opcode::Cls => { - // Rule at src/isa/aarch64/lower.isle line 1122. + // Rule at src/isa/aarch64/lower.isle line 1071. let expr0_0 = C::put_in_reg(ctx, pattern4_1); let expr1_0 = constructor_a64_cls(ctx, pattern2_0, expr0_0)?; let expr2_0 = C::value_reg(ctx, expr1_0); return Some(expr2_0); } &Opcode::Ctz => { - // Rule at src/isa/aarch64/lower.isle line 1085. + // Rule at src/isa/aarch64/lower.isle line 1037. let expr0_0 = C::put_in_reg(ctx, pattern4_1); let expr1_0 = constructor_rbit(ctx, pattern2_0, expr0_0)?; let expr2_0 = constructor_a64_clz(ctx, pattern2_0, expr1_0)?; @@ -4970,7 +4970,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 126. + // Rule at src/isa/aarch64/lower.isle line 125. let expr0_0 = C::put_in_reg(ctx, pattern7_0); let expr1_0 = C::put_in_reg(ctx, pattern7_1); let expr2_0 = constructor_vector_size(ctx, pattern2_0)?; @@ -5007,7 +5007,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 377. + // Rule at src/isa/aarch64/lower.isle line 370. let expr0_0 = constructor_put_in_reg_zext64(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_reg_zext64(ctx, pattern7_1)?; let expr2_0 = C::zero_reg(ctx); @@ -5100,7 +5100,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 363. + // Rule at src/isa/aarch64/lower.isle line 358. let expr0_0 = constructor_put_in_reg_sext64(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_reg_sext64(ctx, pattern7_1)?; let expr2_0 = C::zero_reg(ctx); @@ -5114,7 +5114,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 606. + // Rule at src/isa/aarch64/lower.isle line 583. let expr0_0 = ALUOp::And; let expr1_0 = constructor_alu_rs_imm_logic_commutative( ctx, &expr0_0, pattern3_0, pattern7_0, pattern7_1, @@ -5124,7 +5124,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 619. + // Rule at src/isa/aarch64/lower.isle line 596. let expr0_0 = ALUOp::Orr; let expr1_0 = constructor_alu_rs_imm_logic_commutative( ctx, &expr0_0, pattern3_0, pattern7_0, pattern7_1, @@ -5134,7 +5134,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 632. + // Rule at src/isa/aarch64/lower.isle line 609. let expr0_0 = ALUOp::Eor; let expr1_0 = constructor_alu_rs_imm_logic_commutative( ctx, &expr0_0, pattern3_0, pattern7_0, pattern7_1, @@ -5144,7 +5144,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 645. + // Rule at src/isa/aarch64/lower.isle line 622. let expr0_0 = ALUOp::AndNot; let expr1_0 = constructor_alu_rs_imm_logic( ctx, &expr0_0, pattern3_0, pattern7_0, pattern7_1, @@ -5154,7 +5154,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 658. + // Rule at src/isa/aarch64/lower.isle line 635. let expr0_0 = ALUOp::OrrNot; let expr1_0 = constructor_alu_rs_imm_logic( ctx, &expr0_0, pattern3_0, pattern7_0, pattern7_1, @@ -5164,7 +5164,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 668. + // Rule at src/isa/aarch64/lower.isle line 645. let expr0_0 = ALUOp::EorNot; let expr1_0: Type = I32; let expr2_0 = constructor_alu_rs_imm_logic( @@ -5175,7 +5175,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 679. + // Rule at src/isa/aarch64/lower.isle line 656. let expr0_0 = ALUOp::Lsl; let expr1_0 = C::put_in_reg(ctx, pattern7_0); let expr2_0 = @@ -5185,7 +5185,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 768. + // Rule at src/isa/aarch64/lower.isle line 740. let expr0_0 = ALUOp::Lsr; let expr1_0 = constructor_put_in_reg_zext32(ctx, pattern7_0)?; let expr2_0 = @@ -5195,7 +5195,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 818. + // Rule at src/isa/aarch64/lower.isle line 787. let expr0_0 = ALUOp::Asr; let expr1_0 = constructor_put_in_reg_sext32(ctx, pattern7_0)?; let expr2_0 = @@ -5482,7 +5482,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 181. + // Rule at src/isa/aarch64/lower.isle line 179. let expr0_0 = C::put_in_reg(ctx, pattern7_0); let expr1_0 = C::put_in_reg(ctx, pattern7_1); let expr2_0 = C::zero_reg(ctx); @@ -5591,7 +5591,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 393. + // Rule at src/isa/aarch64/lower.isle line 384. let expr0_0: Type = I64; let expr1_0 = constructor_put_in_reg_zext64(ctx, pattern7_0)?; let expr2_0 = constructor_put_nonzero_in_reg_zext64(ctx, pattern7_1)?; @@ -5612,7 +5612,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 469. + // Rule at src/isa/aarch64/lower.isle line 458. let expr0_0 = constructor_put_in_reg_zext64(ctx, pattern7_0)?; let expr1_0 = constructor_put_nonzero_in_reg_zext64(ctx, pattern7_1)?; let expr2_0: Type = I64; @@ -5651,7 +5651,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 478. + // Rule at src/isa/aarch64/lower.isle line 465. let expr0_0 = constructor_put_in_reg_sext64(ctx, pattern7_0)?; let expr1_0 = constructor_put_nonzero_in_reg_sext64(ctx, pattern7_1)?; let expr2_0: Type = I64; @@ -5669,7 +5669,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { match pattern5_0 { &Opcode::Ineg => { - // Rule at src/isa/aarch64/lower.isle line 171. + // Rule at src/isa/aarch64/lower.isle line 169. let expr0_0 = C::zero_reg(ctx); let expr1_0 = C::put_in_reg(ctx, pattern5_1); let expr2_0 = constructor_sub(ctx, pattern3_0, expr0_0, expr1_0)?; @@ -5706,7 +5706,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 150. + // Rule at src/isa/aarch64/lower.isle line 148. let expr0_0 = C::put_in_reg(ctx, pattern7_0); let expr1_0 = C::put_in_reg(ctx, pattern7_1); let expr2_0 = constructor_vector_size(ctx, pattern3_0)?; @@ -5845,7 +5845,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 155. + // Rule at src/isa/aarch64/lower.isle line 153. let expr0_0 = C::put_in_reg(ctx, pattern7_0); let expr1_0 = C::put_in_reg(ctx, pattern7_1); let expr2_0 = constructor_vector_size(ctx, pattern3_0)?; @@ -5855,7 +5855,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 160. + // Rule at src/isa/aarch64/lower.isle line 158. let expr0_0 = C::put_in_reg(ctx, pattern7_0); let expr1_0 = C::put_in_reg(ctx, pattern7_1); let expr2_0 = constructor_vector_size(ctx, pattern3_0)?; @@ -5865,7 +5865,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 165. + // Rule at src/isa/aarch64/lower.isle line 163. let expr0_0 = C::put_in_reg(ctx, pattern7_0); let expr1_0 = C::put_in_reg(ctx, pattern7_1); let expr2_0 = constructor_vector_size(ctx, pattern3_0)?; @@ -5875,7 +5875,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 614. + // Rule at src/isa/aarch64/lower.isle line 591. let expr0_0 = C::put_in_reg(ctx, pattern7_0); let expr1_0 = C::put_in_reg(ctx, pattern7_1); let expr2_0 = constructor_vector_size(ctx, pattern3_0)?; @@ -5885,7 +5885,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 627. + // Rule at src/isa/aarch64/lower.isle line 604. let expr0_0 = C::put_in_reg(ctx, pattern7_0); let expr1_0 = C::put_in_reg(ctx, pattern7_1); let expr2_0 = constructor_vector_size(ctx, pattern3_0)?; @@ -5895,7 +5895,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 640. + // Rule at src/isa/aarch64/lower.isle line 617. let expr0_0 = C::put_in_reg(ctx, pattern7_0); let expr1_0 = C::put_in_reg(ctx, pattern7_1); let expr2_0 = constructor_vector_size(ctx, pattern3_0)?; @@ -5905,7 +5905,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 653. + // Rule at src/isa/aarch64/lower.isle line 630. let expr0_0 = C::put_in_reg(ctx, pattern7_0); let expr1_0 = C::put_in_reg(ctx, pattern7_1); let expr2_0 = constructor_vector_size(ctx, pattern3_0)?; @@ -5915,7 +5915,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 718. + // Rule at src/isa/aarch64/lower.isle line 694. let expr0_0 = constructor_vector_size(ctx, pattern3_0)?; let expr1_0 = C::put_in_reg(ctx, pattern7_1); let expr2_0 = constructor_vec_dup(ctx, expr1_0, &expr0_0)?; @@ -5926,7 +5926,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 780. + // Rule at src/isa/aarch64/lower.isle line 752. let expr0_0 = constructor_vector_size(ctx, pattern3_0)?; let expr1_0: Type = I32; let expr2_0 = C::zero_reg(ctx); @@ -5940,7 +5940,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/aarch64/lower.isle line 832. + // Rule at src/isa/aarch64/lower.isle line 801. let expr0_0 = constructor_vector_size(ctx, pattern3_0)?; let expr1_0: Type = I32; let expr2_0 = C::zero_reg(ctx); @@ -5961,7 +5961,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { match pattern5_0 { &Opcode::Ineg => { - // Rule at src/isa/aarch64/lower.isle line 175. + // Rule at src/isa/aarch64/lower.isle line 173. let expr0_0 = C::put_in_reg(ctx, pattern5_1); let expr1_0 = constructor_vector_size(ctx, pattern3_0)?; let expr2_0 = constructor_neg(ctx, expr0_0, &expr1_0)?; @@ -5969,7 +5969,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/aarch64/lower.isle line 601. + // Rule at src/isa/aarch64/lower.isle line 578. let expr0_0 = C::put_in_reg(ctx, pattern5_1); let expr1_0 = constructor_vector_size(ctx, pattern3_0)?; let expr2_0 = constructor_not(ctx, expr0_0, &expr1_0)?; @@ -5990,7 +5990,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Valu { if let &Opcode::Iconst = pattern4_0 { if let Some(pattern6_0) = C::nonzero_u64_from_imm64(ctx, pattern4_1) { - // Rule at src/isa/aarch64/lower.isle line 403. + // Rule at src/isa/aarch64/lower.isle line 394. let expr0_0 = constructor_imm(ctx, pattern1_0, pattern6_0)?; return Some(expr0_0); } } } } - // Rule at src/isa/aarch64/lower.isle line 398. + // Rule at src/isa/aarch64/lower.isle line 389. let expr0_0 = constructor_put_in_reg_zext64(ctx, pattern0_0)?; let expr1_0 = constructor_trap_if_zero_divisor(ctx, expr0_0)?; return Some(expr1_0); @@ -6044,14 +6044,14 @@ pub fn constructor_put_nonzero_in_reg_sext64(ctx: &mut C, arg0: Valu { if let &Opcode::Iconst = pattern4_0 { if let Some(pattern6_0) = C::nonzero_u64_from_imm64(ctx, pattern4_1) { - // Rule at src/isa/aarch64/lower.isle line 451. + // Rule at src/isa/aarch64/lower.isle line 440. let expr0_0 = constructor_imm(ctx, pattern1_0, pattern6_0)?; return Some(expr0_0); } } } } - // Rule at src/isa/aarch64/lower.isle line 446. + // Rule at src/isa/aarch64/lower.isle line 435. let expr0_0 = constructor_put_in_reg_sext64(ctx, pattern0_0)?; let expr1_0 = constructor_trap_if_zero_divisor(ctx, expr0_0)?; return Some(expr1_0); @@ -6065,7 +6065,7 @@ pub fn constructor_lower_shl128( ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/aarch64/lower.isle line 700. + // Rule at src/isa/aarch64/lower.isle line 677. let expr0_0: usize = 0; let expr1_0 = C::value_regs_get(ctx, pattern0_0, expr0_0); let expr2_0: usize = 1; @@ -6125,7 +6125,7 @@ pub fn constructor_do_shift( }; if let Some(pattern8_0) = closure8() { if let Some(pattern9_0) = C::imm_shift_from_imm64(ctx, pattern6_1, pattern8_0) { - // Rule at src/isa/aarch64/lower.isle line 762. + // Rule at src/isa/aarch64/lower.isle line 734. let expr0_0 = constructor_alu_rr_imm_shift( ctx, pattern0_0, pattern1_0, pattern2_0, pattern9_0, )?; @@ -6140,7 +6140,7 @@ pub fn constructor_do_shift( if pattern1_0 == I32 { let pattern3_0 = arg2; let pattern4_0 = arg3; - // Rule at src/isa/aarch64/lower.isle line 753. + // Rule at src/isa/aarch64/lower.isle line 725. let expr0_0: Type = I32; let expr1_0 = C::put_in_regs(ctx, pattern4_0); let expr2_0: usize = 0; @@ -6151,7 +6151,7 @@ pub fn constructor_do_shift( if pattern1_0 == I64 { let pattern3_0 = arg2; let pattern4_0 = arg3; - // Rule at src/isa/aarch64/lower.isle line 754. + // Rule at src/isa/aarch64/lower.isle line 726. let expr0_0: Type = I64; let expr1_0 = C::put_in_regs(ctx, pattern4_0); let expr2_0: usize = 0; @@ -6162,7 +6162,7 @@ pub fn constructor_do_shift( if let Some(pattern2_0) = C::fits_in_16(ctx, pattern1_0) { let pattern3_0 = arg2; let pattern4_0 = arg3; - // Rule at src/isa/aarch64/lower.isle line 742. + // Rule at src/isa/aarch64/lower.isle line 716. let expr0_0 = C::put_in_regs(ctx, pattern4_0); let expr1_0: usize = 0; let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); @@ -6184,7 +6184,7 @@ pub fn constructor_lower_ushr128( ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/aarch64/lower.isle line 797. + // Rule at src/isa/aarch64/lower.isle line 767. let expr0_0: usize = 0; let expr1_0 = C::value_regs_get(ctx, pattern0_0, expr0_0); let expr2_0: usize = 1; @@ -6227,7 +6227,7 @@ pub fn constructor_lower_sshr128( ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/aarch64/lower.isle line 850. + // Rule at src/isa/aarch64/lower.isle line 817. let expr0_0: usize = 0; let expr1_0 = C::value_regs_get(ctx, pattern0_0, expr0_0); let expr2_0: usize = 1; @@ -6275,7 +6275,7 @@ pub fn constructor_small_rotr( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/aarch64/lower.isle line 963. + // Rule at src/isa/aarch64/lower.isle line 927. let expr0_0: Type = I32; let expr1_0 = C::rotr_mask(ctx, pattern0_0); let expr2_0 = constructor_and_imm(ctx, expr0_0, pattern2_0, expr1_0)?; @@ -6305,7 +6305,7 @@ pub fn constructor_small_rotr_imm( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/aarch64/lower.isle line 986. + // Rule at src/isa/aarch64/lower.isle line 948. let expr0_0: Type = I32; let expr1_0 = constructor_lsr_imm(ctx, expr0_0, pattern1_0, pattern2_0)?; let expr2_0: Type = I32; @@ -6319,7 +6319,7 @@ pub fn constructor_small_rotr_imm( // Generated as internal constructor for term lower_clz128. pub fn constructor_lower_clz128(ctx: &mut C, arg0: ValueRegs) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/aarch64/lower.isle line 1057. + // Rule at src/isa/aarch64/lower.isle line 1013. let expr0_0: Type = I64; let expr1_0: usize = 1; let expr2_0 = C::value_regs_get(ctx, pattern0_0, expr1_0); diff --git a/cranelift/codegen/src/isa/s390x/inst.isle b/cranelift/codegen/src/isa/s390x/inst.isle index d072de0d9c..09a41a4fe7 100644 --- a/cranelift/codegen/src/isa/s390x/inst.isle +++ b/cranelift/codegen/src/isa/s390x/inst.isle @@ -1128,10 +1128,10 @@ (decl lower_address (MemFlags Value Offset32) MemArg) (rule (lower_address flags addr (i64_from_offset offset)) - (memarg_reg_plus_off (put_in_reg addr) offset flags)) + (memarg_reg_plus_off addr offset flags)) (rule (lower_address flags (def_inst (iadd x y)) (i64_from_offset 0)) - (memarg_reg_plus_reg (put_in_reg x) (put_in_reg y) flags)) + (memarg_reg_plus_reg x y flags)) (rule (lower_address flags (def_inst (symbol_value (symbol_value_data name (reloc_distance_near) offset))) @@ -1163,7 +1163,7 @@ (rule (stack_addr_impl ty stack_slot offset) (let ((dst WritableReg (temp_writable_reg ty)) (_ Unit (emit (abi_stackslot_addr dst stack_slot offset)))) - (writable_reg_to_reg dst))) + dst)) ;; Helpers for extracting extensions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1293,12 +1293,12 @@ ;; Construct a register pair from a writable register pair. (decl writable_regpair_to_regpair (WritableRegPair) RegPair) (rule (writable_regpair_to_regpair (WritableRegPair.WritableRegPair hi lo)) - (RegPair.RegPair (writable_reg_to_reg hi) (writable_reg_to_reg lo))) + (RegPair.RegPair hi lo)) ;; Uninitalized register pair that can be used for piecewise initialization. (decl uninitialized_regpair () RegPair) (rule (uninitialized_regpair) - (writable_regpair_to_regpair (temp_writable_regpair))) + (temp_writable_regpair)) ;; Retrieve the high word of the register pair. (decl regpair_hi (RegPair) Reg) @@ -1316,70 +1316,70 @@ (rule (alu_rrr ty op src1 src2) (let ((dst WritableReg (temp_writable_reg ty)) (_ Unit (emit (MInst.AluRRR op dst src1 src2)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.AluRRSImm16` instructions. (decl alu_rrsimm16 (Type ALUOp Reg i16) Reg) (rule (alu_rrsimm16 ty op src imm) (let ((dst WritableReg (temp_writable_reg ty)) (_ Unit (emit (MInst.AluRRSImm16 op dst src imm)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.AluRR` instructions. (decl alu_rr (Type ALUOp Reg Reg) Reg) (rule (alu_rr ty op src1 src2) (let ((dst WritableReg (copy_writable_reg ty src1)) (_ Unit (emit (MInst.AluRR op dst src2)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.AluRX` instructions. (decl alu_rx (Type ALUOp Reg MemArg) Reg) (rule (alu_rx ty op src mem) (let ((dst WritableReg (copy_writable_reg ty src)) (_ Unit (emit (MInst.AluRX op dst mem)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.AluRSImm16` instructions. (decl alu_rsimm16 (Type ALUOp Reg i16) Reg) (rule (alu_rsimm16 ty op src imm) (let ((dst WritableReg (copy_writable_reg ty src)) (_ Unit (emit (MInst.AluRSImm16 op dst imm)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.AluRSImm32` instructions. (decl alu_rsimm32 (Type ALUOp Reg i32) Reg) (rule (alu_rsimm32 ty op src imm) (let ((dst WritableReg (copy_writable_reg ty src)) (_ Unit (emit (MInst.AluRSImm32 op dst imm)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.AluRUImm32` instructions. (decl alu_ruimm32 (Type ALUOp Reg u32) Reg) (rule (alu_ruimm32 ty op src imm) (let ((dst WritableReg (copy_writable_reg ty src)) (_ Unit (emit (MInst.AluRUImm32 op dst imm)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.AluRUImm16Shifted` instructions. (decl alu_ruimm16shifted (Type ALUOp Reg UImm16Shifted) Reg) (rule (alu_ruimm16shifted ty op src imm) (let ((dst WritableReg (copy_writable_reg ty src)) (_ Unit (emit (MInst.AluRUImm16Shifted op dst imm)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.AluRUImm32Shifted` instructions. (decl alu_ruimm32shifted (Type ALUOp Reg UImm32Shifted) Reg) (rule (alu_ruimm32shifted ty op src imm) (let ((dst WritableReg (copy_writable_reg ty src)) (_ Unit (emit (MInst.AluRUImm32Shifted op dst imm)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.SMulWide` instructions. (decl smul_wide (Reg Reg) RegPair) (rule (smul_wide src1 src2) (let ((dst WritableRegPair (temp_writable_regpair)) (_ Unit (emit (MInst.SMulWide src1 src2)))) - (writable_regpair_to_regpair dst))) + dst)) ;; Helper for emitting `MInst.UMulWide` instructions. (decl umul_wide (Reg Reg) RegPair) @@ -1387,42 +1387,42 @@ (let ((dst WritableRegPair (temp_writable_regpair)) (_1 Unit (emit (MInst.Mov64 (writable_regpair_lo dst) src2))) (_2 Unit (emit (MInst.UMulWide src1)))) - (writable_regpair_to_regpair dst))) + dst)) ;; Helper for emitting `MInst.SDivMod32` instructions. (decl sdivmod32 (RegPair Reg) RegPair) (rule (sdivmod32 src1 src2) (let ((dst WritableRegPair (copy_writable_regpair src1)) (_ Unit (emit (MInst.SDivMod32 src2)))) - (writable_regpair_to_regpair dst))) + dst)) ;; Helper for emitting `MInst.SDivMod64` instructions. (decl sdivmod64 (RegPair Reg) RegPair) (rule (sdivmod64 src1 src2) (let ((dst WritableRegPair (copy_writable_regpair src1)) (_ Unit (emit (MInst.SDivMod64 src2)))) - (writable_regpair_to_regpair dst))) + dst)) ;; Helper for emitting `MInst.UDivMod32` instructions. (decl udivmod32 (RegPair Reg) RegPair) (rule (udivmod32 src1 src2) (let ((dst WritableRegPair (copy_writable_regpair src1)) (_ Unit (emit (MInst.UDivMod32 src2)))) - (writable_regpair_to_regpair dst))) + dst)) ;; Helper for emitting `MInst.UDivMod64` instructions. (decl udivmod64 (RegPair Reg) RegPair) (rule (udivmod64 src1 src2) (let ((dst WritableRegPair (copy_writable_regpair src1)) (_ Unit (emit (MInst.UDivMod64 src2)))) - (writable_regpair_to_regpair dst))) + dst)) ;; Helper for emitting `MInst.ShiftRR` instructions. (decl shift_rr (Type ShiftOp Reg u8 Reg) Reg) (rule (shift_rr ty op src shift_imm shift_reg) (let ((dst WritableReg (temp_writable_reg ty)) (_ Unit (emit (MInst.ShiftRR op dst src shift_imm shift_reg)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.RxSBGTest` instructions. (decl rxsbg_test (RxSBGOp Reg Reg u8 u8 i8) ProducesFlags) @@ -1435,7 +1435,7 @@ (rule (unary_rr ty op src) (let ((dst WritableReg (temp_writable_reg ty)) (_ Unit (emit (MInst.UnaryRR op dst src)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.CmpRR` instructions. (decl cmp_rr (CmpOp Reg Reg) ProducesFlags) @@ -1467,21 +1467,21 @@ (rule (atomic_rmw_impl ty op src mem) (let ((dst WritableReg (temp_writable_reg ty)) (_ Unit (emit (MInst.AtomicRmw op dst src mem)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.AtomicCas32` instructions. (decl atomic_cas32 (Reg Reg MemArg) Reg) (rule (atomic_cas32 src1 src2 mem) (let ((dst WritableReg (copy_writable_reg $I32 src1)) (_ Unit (emit (MInst.AtomicCas32 dst src2 mem)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.AtomicCas64` instructions. (decl atomic_cas64 (Reg Reg MemArg) Reg) (rule (atomic_cas64 src1 src2 mem) (let ((dst WritableReg (copy_writable_reg $I64 src1)) (_ Unit (emit (MInst.AtomicCas64 dst src2 mem)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.Fence` instructions. (decl fence_impl () SideEffectNoResult) @@ -1493,35 +1493,35 @@ (rule (load32 addr) (let ((dst WritableReg (temp_writable_reg $I32)) (_ Unit (emit (MInst.Load32 dst addr)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.Load64` instructions. (decl load64 (MemArg) Reg) (rule (load64 addr) (let ((dst WritableReg (temp_writable_reg $I64)) (_ Unit (emit (MInst.Load64 dst addr)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.LoadRev16` instructions. (decl loadrev16 (MemArg) Reg) (rule (loadrev16 addr) (let ((dst WritableReg (temp_writable_reg $I32)) (_ Unit (emit (MInst.LoadRev16 dst addr)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.LoadRev32` instructions. (decl loadrev32 (MemArg) Reg) (rule (loadrev32 addr) (let ((dst WritableReg (temp_writable_reg $I32)) (_ Unit (emit (MInst.LoadRev32 dst addr)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.LoadRev64` instructions. (decl loadrev64 (MemArg) Reg) (rule (loadrev64 addr) (let ((dst WritableReg (temp_writable_reg $I64)) (_ Unit (emit (MInst.LoadRev64 dst addr)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.Store8` instructions. (decl store8 (Reg MemArg) SideEffectNoResult) @@ -1583,28 +1583,28 @@ (rule (fpu_rr ty op src) (let ((dst WritableReg (temp_writable_reg ty)) (_ Unit (emit (MInst.FpuRR op dst src)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.FpuRRR` instructions. (decl fpu_rrr (Type FPUOp2 Reg Reg) Reg) (rule (fpu_rrr ty op src1 src2) (let ((dst WritableReg (copy_writable_reg ty src1)) (_ Unit (emit (MInst.FpuRRR op dst src2)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.FpuRRRR` instructions. (decl fpu_rrrr (Type FPUOp3 Reg Reg Reg) Reg) (rule (fpu_rrrr ty op src1 src2 src3) (let ((dst WritableReg (copy_writable_reg ty src1)) (_ Unit (emit (MInst.FpuRRRR op dst src2 src3)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.FpuCopysign` instructions. (decl fpu_copysign (Type Reg Reg) Reg) (rule (fpu_copysign ty src1 src2) (let ((dst WritableReg (temp_writable_reg ty)) (_ Unit (emit (MInst.FpuCopysign dst src1 src2)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.FpuCmp32` instructions. (decl fpu_cmp32 (Reg Reg) ProducesFlags) @@ -1621,70 +1621,70 @@ (rule (fpu_to_int ty op src) (let ((dst WritableReg (temp_writable_reg ty))) (ProducesFlags.ProducesFlagsReturnsReg (MInst.FpuToInt op dst src) - (writable_reg_to_reg dst)))) + dst))) ;; Helper for emitting `MInst.IntToFpu` instructions. (decl int_to_fpu (Type IntToFpuOp Reg) Reg) (rule (int_to_fpu ty op src) (let ((dst WritableReg (temp_writable_reg ty)) (_ Unit (emit (MInst.IntToFpu op dst src)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.FpuRound` instructions. (decl fpu_round (Type FpuRoundMode Reg) Reg) (rule (fpu_round ty mode src) (let ((dst WritableReg (temp_writable_reg ty)) (_ Unit (emit (MInst.FpuRound mode dst src)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.FpuVecRRR` instructions. (decl fpuvec_rrr (Type FPUOp2 Reg Reg) Reg) (rule (fpuvec_rrr ty op src1 src2) (let ((dst WritableReg (temp_writable_reg ty)) (_ Unit (emit (MInst.FpuVecRRR op dst src1 src2)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.MovToFpr` instructions. (decl mov_to_fpr (Reg) Reg) (rule (mov_to_fpr src) (let ((dst WritableReg (temp_writable_reg $F64)) (_ Unit (emit (MInst.MovToFpr dst src)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.MovFromFpr` instructions. (decl mov_from_fpr (Reg) Reg) (rule (mov_from_fpr src) (let ((dst WritableReg (temp_writable_reg $I64)) (_ Unit (emit (MInst.MovFromFpr dst src)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.FpuLoad32` instructions. (decl fpu_load32 (MemArg) Reg) (rule (fpu_load32 addr) (let ((dst WritableReg (temp_writable_reg $F32)) (_ Unit (emit (MInst.FpuLoad32 dst addr)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.FpuLoad64` instructions. (decl fpu_load64 (MemArg) Reg) (rule (fpu_load64 addr) (let ((dst WritableReg (temp_writable_reg $F64)) (_ Unit (emit (MInst.FpuLoad64 dst addr)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.FpuLoadRev32` instructions. (decl fpu_loadrev32 (MemArg) Reg) (rule (fpu_loadrev32 addr) (let ((dst WritableReg (temp_writable_reg $F32)) (_ Unit (emit (MInst.FpuLoadRev32 dst addr)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.FpuLoadRev64` instructions. (decl fpu_loadrev64 (MemArg) Reg) (rule (fpu_loadrev64 addr) (let ((dst WritableReg (temp_writable_reg $F64)) (_ Unit (emit (MInst.FpuLoadRev64 dst addr)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.FpuStore32` instructions. (decl fpu_store32 (Reg MemArg) SideEffectNoResult) @@ -1712,14 +1712,14 @@ (let ((dst WritableReg (temp_writable_reg $I64)) (boxed_name BoxExternalName (box_external_name name)) (_ Unit (emit (MInst.LoadExtNameFar dst boxed_name offset)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.LoadAddr` instructions. (decl load_addr (MemArg) Reg) (rule (load_addr mem) (let ((dst WritableReg (temp_writable_reg $I64)) (_ Unit (emit (MInst.LoadAddr dst mem)))) - (writable_reg_to_reg dst))) + dst)) ;; Helper for emitting `MInst.Jump` instructions. (decl jump_impl (MachLabel) SideEffectNoResult) @@ -1784,45 +1784,45 @@ (decl push_alu_reg (VecMInstBuilder ALUOp WritableReg Reg Reg) Reg) (rule (push_alu_reg ib op (real_reg dst) src1 src2) (let ((_ Unit (inst_builder_push ib (MInst.AluRRR op dst src1 src2)))) - (writable_reg_to_reg dst))) + dst)) ;; Push a `MInst.AluRUImm32Shifted` instruction to a sequence. (decl push_alu_uimm32shifted (VecMInstBuilder ALUOp WritableReg Reg UImm32Shifted) Reg) (rule (push_alu_uimm32shifted ib op (real_reg dst) (same_reg (ctx: &mut C, arg0: Inst) -> Option { // Rule at src/isa/s390x/lower.isle line 53. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0 = C::value_reg(ctx, expr0_0); - return Some(expr1_0); + let expr0_0 = C::put_in_regs(ctx, pattern2_1); + return Some(expr0_0); } &Opcode::Breduce => { // Rule at src/isa/s390x/lower.isle line 752. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0 = C::value_reg(ctx, expr0_0); - return Some(expr1_0); + let expr0_0 = C::put_in_regs(ctx, pattern2_1); + return Some(expr0_0); } &Opcode::Ireduce => { // Rule at src/isa/s390x/lower.isle line 596. - let expr0_0 = C::put_in_reg(ctx, pattern2_1); - let expr1_0 = C::value_reg(ctx, expr0_0); - return Some(expr1_0); + let expr0_0 = C::put_in_regs(ctx, pattern2_1); + return Some(expr0_0); } _ => {} } diff --git a/cranelift/codegen/src/isa/x64/inst.isle b/cranelift/codegen/src/isa/x64/inst.isle index 013d37e7d6..51f9e454dc 100644 --- a/cranelift/codegen/src/isa/x64/inst.isle +++ b/cranelift/codegen/src/isa/x64/inst.isle @@ -162,27 +162,27 @@ ;; GPR conditional move with the `OR` of two conditions; overwrites ;; the destination register. (CmoveOr (size OperandSize) - (cc1 CC) - (cc2 CC) - (consequent GprMem) - (alternative Gpr) - (dst WritableGpr)) + (cc1 CC) + (cc2 CC) + (consequent GprMem) + (alternative Gpr) + (dst WritableGpr)) ;; XMM conditional move; overwrites the destination register. (XmmCmove (size OperandSize) - (cc CC) - (consequent XmmMem) - (alternative Xmm) - (dst WritableXmm)) + (cc CC) + (consequent XmmMem) + (alternative Xmm) + (dst WritableXmm)) ;; XMM conditional move with the `OR` of two conditions; overwrites ;; the destination register. (XmmCmoveOr (size OperandSize) - (cc1 CC) - (cc2 CC) - (consequent XmmMem) - (alternative Xmm) - (dst WritableXmm)) + (cc1 CC) + (cc2 CC) + (consequent XmmMem) + (alternative Xmm) + (dst WritableXmm)) ;; ========================================= ;; Stack manipulation. @@ -960,6 +960,13 @@ (decl reg_to_gpr_mem (Reg) GprMem) (extern constructor reg_to_gpr_mem reg_to_gpr_mem) +;; Construct a `GprMemImm` from a `Reg`. +;; +;; Asserts that the `Reg` is a GPR. +(decl reg_to_gpr_mem_imm (Reg) GprMemImm) +(rule (reg_to_gpr_mem_imm r) + (gpr_to_gpr_mem_imm (gpr_new r))) + ;; Put a value into a GPR. ;; ;; Asserts that the value goes into a GPR. @@ -1188,44 +1195,41 @@ ;; that everything is equal to itself. (decl vector_all_ones (Type) Xmm) (rule (vector_all_ones ty) - (let ((wr WritableXmm (temp_writable_xmm)) - (r Xmm (writable_xmm_to_xmm wr)) + (let ((r WritableXmm (temp_writable_xmm)) (_ Unit (emit (MInst.XmmRmR (sse_cmp_op $I32X4) r - (xmm_to_xmm_mem r) - wr)))) + r + r)))) r)) ;; Helper for creating an SSE register holding an `i64x2` from two `i64` values. (decl make_i64x2_from_lanes (GprMem GprMem) Xmm) (rule (make_i64x2_from_lanes lo hi) - (let ((dst_xmm_w WritableXmm (temp_writable_xmm)) - (dst_reg_w WritableReg (writable_xmm_to_reg dst_xmm_w)) - (dst_xmm_r Xmm (writable_xmm_to_xmm dst_xmm_w)) - (dst_reg_r Reg (xmm_to_reg dst_xmm_r)) - (_0 Unit (emit (MInst.XmmUninitializedValue dst_xmm_w))) + (let ((dst_xmm WritableXmm (temp_writable_xmm)) + (dst_reg WritableReg dst_xmm) + (_0 Unit (emit (MInst.XmmUninitializedValue dst_xmm))) (_1 Unit (emit (MInst.XmmRmRImm (SseOpcode.Pinsrd) - dst_reg_r - (gpr_mem_to_reg_mem lo) - dst_reg_w + dst_reg + lo + dst_reg 0 (OperandSize.Size64)))) (_2 Unit (emit (MInst.XmmRmRImm (SseOpcode.Pinsrd) - dst_reg_r - (gpr_mem_to_reg_mem hi) - dst_reg_w + dst_reg + hi + dst_reg 1 (OperandSize.Size64))))) - dst_xmm_r)) + dst_xmm)) ;; Move a `RegMemImm.Reg` operand to an XMM register, if necessary. (decl mov_rmi_to_xmm (RegMemImm) XmmMemImm) (rule (mov_rmi_to_xmm rmi @ (RegMemImm.Mem _)) (xmm_mem_imm_new rmi)) (rule (mov_rmi_to_xmm rmi @ (RegMemImm.Imm _)) (xmm_mem_imm_new rmi)) (rule (mov_rmi_to_xmm (RegMemImm.Reg r)) - (xmm_to_xmm_mem_imm (gpr_to_xmm (SseOpcode.Movd) - (reg_to_gpr_mem r) - (OperandSize.Size32)))) + (gpr_to_xmm (SseOpcode.Movd) + r + (OperandSize.Size32))) ;;;; Helpers for Emitting Loads ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1233,34 +1237,34 @@ (decl x64_load (Type SyntheticAmode ExtKind) Reg) (rule (x64_load (fits_in_32 ty) addr (ExtKind.SignExtend)) - (gpr_to_reg (movsx ty - (ext_mode (ty_bytes ty) 8) - (reg_mem_to_gpr_mem (synthetic_amode_to_reg_mem addr))))) + (movsx ty + (ext_mode (ty_bytes ty) 8) + addr)) (rule (x64_load $I64 addr _ext_kind) (let ((dst WritableGpr (temp_writable_gpr)) (_ Unit (emit (MInst.Mov64MR addr dst)))) - (gpr_to_reg (writable_gpr_to_gpr dst)))) + dst)) (rule (x64_load $F32 addr _ext_kind) - (xmm_to_reg (xmm_unary_rm_r (SseOpcode.Movss) - (reg_mem_to_xmm_mem (synthetic_amode_to_reg_mem addr))))) + (xmm_unary_rm_r (SseOpcode.Movss) + addr)) (rule (x64_load $F64 addr _ext_kind) - (xmm_to_reg (xmm_unary_rm_r (SseOpcode.Movsd) - (reg_mem_to_xmm_mem (synthetic_amode_to_reg_mem addr))))) + (xmm_unary_rm_r (SseOpcode.Movsd) + addr)) (rule (x64_load $F32X4 addr _ext_kind) - (xmm_to_reg (xmm_unary_rm_r (SseOpcode.Movups) - (reg_mem_to_xmm_mem (synthetic_amode_to_reg_mem addr))))) + (xmm_unary_rm_r (SseOpcode.Movups) + addr)) (rule (x64_load $F64X2 addr _ext_kind) - (xmm_to_reg (xmm_unary_rm_r (SseOpcode.Movupd) - (reg_mem_to_xmm_mem (synthetic_amode_to_reg_mem addr))))) + (xmm_unary_rm_r (SseOpcode.Movupd) + addr)) (rule (x64_load (multi_lane _bits _lanes) addr _ext_kind) - (xmm_to_reg (xmm_unary_rm_r (SseOpcode.Movdqu) - (reg_mem_to_xmm_mem (synthetic_amode_to_reg_mem addr))))) + (xmm_unary_rm_r (SseOpcode.Movdqu) + addr)) ;;;; Instruction Constructors ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; @@ -1274,7 +1278,7 @@ (let ((dst WritableGpr (temp_writable_gpr)) (size OperandSize (operand_size_of_type_32_64 ty)) (_ Unit (emit (MInst.AluRmiR size opcode src1 src2 dst)))) - (writable_gpr_to_gpr dst))) + dst)) ;; Helper for emitting `add` instructions. (decl add (Type Gpr GprMemImm) Gpr) @@ -1294,7 +1298,7 @@ src1 src2 dst) - (gpr_to_reg (writable_gpr_to_gpr dst))))) + dst))) ;; Helper for creating `adc` instructions. (decl adc_paired (Type Gpr GprMemImm) ConsumesFlags) @@ -1306,7 +1310,7 @@ src1 src2 dst) - (gpr_to_reg (writable_gpr_to_gpr dst))))) + dst))) ;; Helper for emitting `sub` instructions. (decl sub (Type Gpr GprMemImm) Gpr) @@ -1326,7 +1330,7 @@ src1 src2 dst) - (gpr_to_reg (writable_gpr_to_gpr dst))))) + dst))) ;; Helper for creating `sbb` instructions. (decl sbb_paired (Type Gpr GprMemImm) ConsumesFlags) @@ -1338,7 +1342,7 @@ src1 src2 dst) - (gpr_to_reg (writable_gpr_to_gpr dst))))) + dst))) ;; Helper for creating `mul` instructions. (decl mul (Type Gpr GprMemImm) Gpr) @@ -1380,19 +1384,19 @@ (let ((dst WritableGpr (temp_writable_gpr)) (size OperandSize (operand_size_of_type_32_64 ty)) (_ Unit (emit (MInst.Imm size simm64 dst)))) - (gpr_to_reg (writable_gpr_to_gpr dst)))) + dst)) ;; `f32` immediates. (rule (imm $F32 bits) - (xmm_to_reg (gpr_to_xmm (SseOpcode.Movd) - (reg_mem_to_gpr_mem (RegMem.Reg (imm $I32 bits))) - (OperandSize.Size32)))) + (gpr_to_xmm (SseOpcode.Movd) + (imm $I32 bits) + (OperandSize.Size32))) ;; `f64` immediates. (rule (imm $F64 bits) - (xmm_to_reg (gpr_to_xmm (SseOpcode.Movq) - (reg_mem_to_gpr_mem (RegMem.Reg (imm $I64 bits))) - (OperandSize.Size64)))) + (gpr_to_xmm (SseOpcode.Movq) + (imm $I64 bits) + (OperandSize.Size64))) (decl nonzero_u64_fits_in_u32 (u64) u64) (extern extractor nonzero_u64_fits_in_u32 nonzero_u64_fits_in_u32) @@ -1402,17 +1406,17 @@ (rule (imm $I64 (nonzero_u64_fits_in_u32 x)) (let ((dst WritableGpr (temp_writable_gpr)) (_ Unit (emit (MInst.Imm (OperandSize.Size32) x dst)))) - (gpr_to_reg (writable_gpr_to_gpr dst)))) + dst)) ;; Special case for integer zero immediates: turn them into an `xor r, r`. (rule (imm (fits_in_64 ty) 0) (let ((wgpr WritableGpr (temp_writable_gpr)) - (g Gpr (writable_gpr_to_gpr wgpr)) + (g Gpr wgpr) (size OperandSize (operand_size_of_type_32_64 ty)) (_ Unit (emit (MInst.AluRmiR size (AluRmiROpcode.Xor) g - (gpr_to_gpr_mem_imm g) + g wgpr)))) (gpr_to_reg g))) @@ -1420,20 +1424,20 @@ ;; specific to the vector type. (rule (imm ty @ (multi_lane _bits _lanes) 0) (let ((wr WritableXmm (temp_writable_xmm)) - (r Xmm (writable_xmm_to_xmm wr)) + (r Xmm wr) (_ Unit (emit (MInst.XmmRmR (sse_xor_op ty) r - (xmm_to_xmm_mem r) + r wr)))) (xmm_to_reg r))) ;; Special case for `f32` zero immediates to use `xorps`. (rule (imm $F32 0) (let ((wr WritableXmm (temp_writable_xmm)) - (r Xmm (writable_xmm_to_xmm wr)) + (r Xmm wr) (_ Unit (emit (MInst.XmmRmR (SseOpcode.Xorps) r - (xmm_to_xmm_mem r) + r wr)))) (xmm_to_reg r))) @@ -1442,10 +1446,10 @@ ;; Special case for `f64` zero immediates to use `xorpd`. (rule (imm $F64 0) (let ((wr WritableXmm (temp_writable_xmm)) - (r Xmm (writable_xmm_to_xmm wr)) + (r Xmm wr) (_ Unit (emit (MInst.XmmRmR (SseOpcode.Xorpd) r - (xmm_to_xmm_mem r) + r wr)))) (xmm_to_reg r))) @@ -1459,7 +1463,7 @@ ;; rely on their shift-amount-masking semantics. (size OperandSize (raw_operand_size_of_type ty)) (_ Unit (emit (MInst.ShiftR size kind src1 src2 dst)))) - (writable_gpr_to_gpr dst))) + dst)) ;; Helper for creating `rotl` instructions. (decl x64_rotl (Type Gpr Imm8Gpr) Gpr) @@ -1528,7 +1532,7 @@ (size OperandSize (operand_size_of_type_32_64 ty))) (ConsumesFlags.ConsumesFlagsReturnsReg (MInst.Cmove size cc consequent alternative dst) - (gpr_to_reg (writable_gpr_to_gpr dst))))) + dst))) (decl cmove_xmm (Type CC XmmMem Xmm) ConsumesFlags) (rule (cmove_xmm ty cc consequent alternative) @@ -1536,38 +1540,38 @@ (size OperandSize (operand_size_of_type_32_64 ty))) (ConsumesFlags.ConsumesFlagsReturnsReg (MInst.XmmCmove size cc consequent alternative dst) - (xmm_to_reg (writable_xmm_to_xmm dst))))) + dst))) ;; Helper for creating `cmove` instructions directly from values. This allows us ;; to special-case the `I128` types and default to the `cmove` helper otherwise. ;; It also eliminates some `put_in_reg*` boilerplate in the lowering ISLE code. (decl cmove_from_values (Type CC Value Value) ConsumesFlags) (rule (cmove_from_values $I128 cc consequent alternative) - (let ((cons ValueRegs (put_in_regs consequent)) - (alt ValueRegs (put_in_regs alternative)) + (let ((cons ValueRegs consequent) + (alt ValueRegs alternative) (dst1 WritableGpr (temp_writable_gpr)) (dst2 WritableGpr (temp_writable_gpr)) (size OperandSize (OperandSize.Size64)) (lower_cmove MInst (MInst.Cmove size cc - (gpr_to_gpr_mem (value_regs_get_gpr cons 0)) - (value_regs_get_gpr alt 0) dst1)) + (value_regs_get_gpr cons 0) + (value_regs_get_gpr alt 0) + dst1)) (upper_cmove MInst (MInst.Cmove size cc - (gpr_to_gpr_mem (value_regs_get_gpr cons 1)) - (value_regs_get_gpr alt 1) dst2))) + (value_regs_get_gpr cons 1) + (value_regs_get_gpr alt 1) + dst2))) (ConsumesFlags.ConsumesFlagsTwiceReturnsValueRegs lower_cmove upper_cmove - (value_regs - (gpr_to_reg (writable_gpr_to_gpr dst1)) - (gpr_to_reg (writable_gpr_to_gpr dst2)))))) + (value_regs dst1 dst2)))) (rule (cmove_from_values (is_gpr_type (is_single_register_type ty)) cc consequent alternative) - (cmove ty cc (put_in_gpr_mem consequent) (put_in_gpr alternative))) + (cmove ty cc consequent alternative)) (rule (cmove_from_values (is_xmm_type (is_single_register_type ty)) cc consequent alternative) - (cmove_xmm ty cc (put_in_xmm_mem consequent) (put_in_xmm alternative))) + (cmove_xmm ty cc consequent alternative)) ;; Helper for creating `cmove` instructions with the logical OR of multiple ;; flags. Note that these instructions will always result in more than one @@ -1578,7 +1582,7 @@ (size OperandSize (operand_size_of_type_32_64 ty))) (ConsumesFlags.ConsumesFlagsReturnsReg (MInst.CmoveOr size cc1 cc2 consequent alternative dst) - (gpr_to_reg (writable_gpr_to_gpr dst))))) + dst))) (decl cmove_or_xmm (Type CC CC XmmMem Xmm) ConsumesFlags) (rule (cmove_or_xmm ty cc1 cc2 consequent alternative) @@ -1586,52 +1590,51 @@ (size OperandSize (operand_size_of_type_32_64 ty))) (ConsumesFlags.ConsumesFlagsReturnsReg (MInst.XmmCmoveOr size cc1 cc2 consequent alternative dst) - (xmm_to_reg (writable_xmm_to_xmm dst))))) + dst))) ;; Helper for creating `cmove_or` instructions directly from values. This allows ;; us to special-case the `I128` types and default to the `cmove_or` helper ;; otherwise. (decl cmove_or_from_values (Type CC CC Value Value) ConsumesFlags) (rule (cmove_or_from_values $I128 cc1 cc2 consequent alternative) - (let ((cons ValueRegs (put_in_regs consequent)) - (alt ValueRegs (put_in_regs alternative)) + (let ((cons ValueRegs consequent) + (alt ValueRegs alternative) (dst1 WritableGpr (temp_writable_gpr)) (dst2 WritableGpr (temp_writable_gpr)) (size OperandSize (OperandSize.Size64)) - (lower_cmove MInst (MInst.CmoveOr size cc1 cc2 (gpr_to_gpr_mem (value_regs_get_gpr cons 0)) (value_regs_get_gpr alt 0) dst1)) - (upper_cmove MInst (MInst.CmoveOr size cc1 cc2 (gpr_to_gpr_mem (value_regs_get_gpr cons 1)) (value_regs_get_gpr alt 1) dst2))) + (lower_cmove MInst (MInst.CmoveOr size cc1 cc2 (value_regs_get_gpr cons 0) (value_regs_get_gpr alt 0) dst1)) + (upper_cmove MInst (MInst.CmoveOr size cc1 cc2 (value_regs_get_gpr cons 1) (value_regs_get_gpr alt 1) dst2))) (ConsumesFlags.ConsumesFlagsTwiceReturnsValueRegs lower_cmove upper_cmove - (value_regs (gpr_to_reg (writable_gpr_to_gpr dst1)) - (gpr_to_reg (writable_gpr_to_gpr dst2)))))) + (value_regs dst1 dst2)))) (rule (cmove_or_from_values (is_gpr_type (is_single_register_type ty)) cc1 cc2 consequent alternative) - (cmove_or ty cc1 cc2 (put_in_gpr_mem consequent) (put_in_gpr alternative))) + (cmove_or ty cc1 cc2 consequent alternative)) (rule (cmove_or_from_values (is_xmm_type (is_single_register_type ty)) cc1 cc2 consequent alternative) - (cmove_or_xmm ty cc1 cc2 (put_in_xmm_mem consequent) (put_in_xmm alternative))) + (cmove_or_xmm ty cc1 cc2 consequent alternative)) ;; Helper for creating `MInst.MovzxRmR` instructions. (decl movzx (Type ExtMode GprMem) Gpr) (rule (movzx ty mode src) (let ((dst WritableGpr (temp_writable_gpr)) (_ Unit (emit (MInst.MovzxRmR mode src dst)))) - (writable_gpr_to_gpr dst))) + dst)) ;; Helper for creating `MInst.MovsxRmR` instructions. (decl movsx (Type ExtMode GprMem) Gpr) (rule (movsx ty mode src) (let ((dst WritableGpr (temp_writable_gpr)) (_ Unit (emit (MInst.MovsxRmR mode src dst)))) - (writable_gpr_to_gpr dst))) + dst)) ;; Helper for creating `MInst.XmmRmR` instructions. (decl xmm_rm_r (Type SseOpcode Xmm XmmMem) Xmm) (rule (xmm_rm_r ty op src1 src2) (let ((dst WritableXmm (temp_writable_xmm)) (_ Unit (emit (MInst.XmmRmR op src1 src2 dst)))) - (writable_xmm_to_xmm dst))) + dst)) ;; Helper for creating `paddb` instructions. (decl paddb (Xmm XmmMem) Xmm) @@ -1857,7 +1860,7 @@ ;; `Inst` itself.) (let ((mask2 WritableXmm (xmm0)) (_ Unit (emit (MInst.XmmUnaryRmR (SseOpcode.Movapd) - (xmm_to_xmm_mem mask) + mask mask2)))) (xmm_rm_r $F64X2 (SseOpcode.Blendvpd) src1 src2))) @@ -1953,17 +1956,17 @@ (_ Unit (emit (MInst.XmmRmRImm op src1 src2 - (writable_xmm_to_reg dst) + dst imm size)))) - (writable_xmm_to_xmm dst))) + dst)) ;; Helper for creating `palignr` instructions. (decl palignr (Xmm XmmMem u8 OperandSize) Xmm) (rule (palignr src1 src2 imm size) (xmm_rm_r_imm (SseOpcode.Palignr) - (xmm_to_reg src1) - (xmm_mem_to_reg_mem src2) + src1 + src2 imm size)) @@ -1971,8 +1974,8 @@ (decl cmpps (Xmm XmmMem FcmpImm) Xmm) (rule (cmpps src1 src2 imm) (xmm_rm_r_imm (SseOpcode.Cmpps) - (xmm_to_reg src1) - (xmm_mem_to_reg_mem src2) + src1 + src2 (encode_fcmp_imm imm) (OperandSize.Size32))) @@ -1980,8 +1983,8 @@ (decl pinsrb (Xmm GprMem u8) Xmm) (rule (pinsrb src1 src2 lane) (xmm_rm_r_imm (SseOpcode.Pinsrb) - (xmm_to_reg src1) - (gpr_mem_to_reg_mem src2) + src1 + src2 lane (OperandSize.Size32))) @@ -1989,8 +1992,8 @@ (decl pinsrw (Xmm GprMem u8) Xmm) (rule (pinsrw src1 src2 lane) (xmm_rm_r_imm (SseOpcode.Pinsrw) - (xmm_to_reg src1) - (gpr_mem_to_reg_mem src2) + src1 + src2 lane (OperandSize.Size32))) @@ -1998,8 +2001,8 @@ (decl pinsrd (Xmm GprMem u8 OperandSize) Xmm) (rule (pinsrd src1 src2 lane size) (xmm_rm_r_imm (SseOpcode.Pinsrd) - (xmm_to_reg src1) - (gpr_mem_to_reg_mem src2) + src1 + src2 lane size)) @@ -2007,20 +2010,19 @@ (decl insertps (Xmm XmmMem u8) Xmm) (rule (insertps src1 src2 lane) (xmm_rm_r_imm (SseOpcode.Insertps) - (xmm_to_reg src1) - (xmm_mem_to_reg_mem src2) + src1 + src2 lane (OperandSize.Size32))) ;; Helper for creating `pshufd` instructions. (decl pshufd (XmmMem u8 OperandSize) Xmm) (rule (pshufd src imm size) - (let ((w_dst WritableXmm (temp_writable_xmm)) - (dst Xmm (writable_xmm_to_xmm w_dst)) + (let ((dst WritableXmm (temp_writable_xmm)) (_ Unit (emit (MInst.XmmRmRImm (SseOpcode.Pshufd) - (xmm_to_reg dst) - (xmm_mem_to_reg_mem src) - (writable_xmm_to_reg w_dst) + dst + src + dst imm size)))) dst)) @@ -2030,7 +2032,7 @@ (rule (xmm_unary_rm_r op src) (let ((dst WritableXmm (temp_writable_xmm)) (_ Unit (emit (MInst.XmmUnaryRmR op src dst)))) - (writable_xmm_to_xmm dst))) + dst)) ;; Helper for creating `pmovsxbw` instructions. (decl pmovsxbw (XmmMem) Xmm) @@ -2062,7 +2064,7 @@ (rule (xmm_unary_rm_r_evex op src) (let ((dst WritableXmm (temp_writable_xmm)) (_ Unit (emit (MInst.XmmUnaryRmREvex op src dst)))) - (writable_xmm_to_xmm dst))) + dst)) ;; Helper for creating `vpabsq` instructions. (decl vpabsq (XmmMem) Xmm) @@ -2077,7 +2079,7 @@ src1 src2 dst)))) - (writable_xmm_to_xmm dst))) + dst)) ;; Helper for creating `vpmullq` instructions. ;; @@ -2102,8 +2104,7 @@ src2 dst_lo dst_hi)))) - (value_gprs (writable_gpr_to_gpr dst_lo) - (writable_gpr_to_gpr dst_hi)))) + (value_gprs dst_lo dst_hi))) ;; Helper for creating `mul` instructions that return both the lower and ;; (unsigned) higher halves of the result. @@ -2119,7 +2120,7 @@ src1 src2 dst)))) - (writable_xmm_to_xmm dst))) + dst)) ;; Helper for creating `psllw` instructions. (decl psllw (Xmm XmmMemImm) Xmm) @@ -2164,15 +2165,14 @@ ;; Helper for creating `pextrd` instructions. (decl pextrd (Type Xmm u8) Gpr) (rule (pextrd ty src lane) - (let ((w_dst WritableGpr (temp_writable_gpr)) - (r_dst Gpr (writable_gpr_to_gpr w_dst)) + (let ((dst WritableGpr (temp_writable_gpr)) (_ Unit (emit (MInst.XmmRmRImm (SseOpcode.Pextrd) - (gpr_to_reg r_dst) - (RegMem.Reg (xmm_to_reg src)) - (writable_gpr_to_reg w_dst) + dst + src + dst lane (operand_size_of_type_32_64 (lane_type ty)))))) - r_dst)) + dst)) ;; Helper for creating `cmppd` instructions. ;; @@ -2182,8 +2182,8 @@ (decl cmppd (Xmm XmmMem FcmpImm) Xmm) (rule (cmppd src1 src2 imm) (xmm_rm_r_imm (SseOpcode.Cmppd) - (xmm_to_reg src1) - (xmm_mem_to_reg_mem src2) + src1 + src2 (encode_fcmp_imm imm) (OperandSize.Size32))) @@ -2192,7 +2192,7 @@ (rule (gpr_to_xmm op src size) (let ((dst WritableXmm (temp_writable_xmm)) (_ Unit (emit (MInst.GprToXmm op src dst size)))) - (writable_xmm_to_xmm dst))) + dst)) ;; Helper for creating `not` instructions. (decl not (Type Gpr) Gpr) @@ -2200,7 +2200,7 @@ (let ((dst WritableGpr (temp_writable_gpr)) (size OperandSize (operand_size_of_type_32_64 ty)) (_ Unit (emit (MInst.Not size src dst)))) - (writable_gpr_to_gpr dst))) + dst)) ;; Helper for creating `neg` instructions. (decl neg (Type Gpr) Gpr) @@ -2208,15 +2208,84 @@ (let ((dst WritableGpr (temp_writable_gpr)) (size OperandSize (operand_size_of_type_32_64 ty)) (_ Unit (emit (MInst.Neg size src dst)))) - (writable_gpr_to_gpr dst))) + dst)) (decl lea (SyntheticAmode) Gpr) (rule (lea addr) (let ((dst WritableGpr (temp_writable_gpr)) (_ Unit (emit (MInst.LoadEffectiveAddress addr dst)))) - (writable_gpr_to_gpr dst))) + dst)) ;; Helper for creating `ud2` instructions. (decl ud2 (TrapCode) SideEffectNoResult) (rule (ud2 code) (SideEffectNoResult.Inst (MInst.Ud2 code))) + +;;;; Automatic conversions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(convert Gpr ValueRegs value_gpr) +(convert Value Gpr put_in_gpr) +(convert Value GprMem put_in_gpr_mem) +(convert Value GprMemImm put_in_gpr_mem_imm) +(convert Value RegMem put_in_reg_mem) +(convert Value RegMemImm put_in_reg_mem_imm) +(convert Gpr GprMemImm gpr_to_gpr_mem_imm) +(convert Gpr GprMem gpr_to_gpr_mem) +(convert Gpr Reg gpr_to_reg) +(convert GprMem RegMem gpr_mem_to_reg_mem) +(convert Reg Gpr gpr_new) +(convert WritableGpr Gpr writable_gpr_to_gpr) +(convert RegMemImm GprMemImm gpr_mem_imm_new) +(convert RegMem GprMem reg_mem_to_gpr_mem) +(convert Reg GprMem reg_to_gpr_mem) +(convert Reg GprMemImm reg_to_gpr_mem_imm) +(convert WritableGpr WritableReg writable_gpr_to_reg) +(convert WritableGpr Reg writable_gpr_to_r_reg) + +(convert Xmm ValueRegs value_xmm) +(convert Value Xmm put_in_xmm) +(convert Value XmmMem put_in_xmm_mem) +(convert Value XmmMemImm put_in_xmm_mem_imm) +(convert Xmm Reg xmm_to_reg) +(convert Xmm RegMem xmm_to_reg_mem) +(convert Reg Xmm xmm_new) +(convert Reg XmmMem reg_to_xmm_mem) +(convert RegMem XmmMem reg_mem_to_xmm_mem) +(convert RegMemImm XmmMemImm mov_rmi_to_xmm) +(convert Xmm XmmMem xmm_to_xmm_mem) +(convert Xmm XmmMemImm xmm_to_xmm_mem_imm) +(convert XmmMem RegMem xmm_mem_to_reg_mem) +(convert WritableXmm Xmm writable_xmm_to_xmm) +(convert WritableXmm WritableReg writable_xmm_to_reg) +(convert WritableXmm Reg writable_xmm_to_r_reg) +(convert WritableXmm XmmMem writable_xmm_to_xmm_mem) + +(convert Gpr Imm8Gpr gpr_to_imm8_gpr) + +(convert Amode SyntheticAmode amode_to_synthetic_amode) +(convert SyntheticAmode GprMem synthetic_amode_to_gpr_mem) +(convert SyntheticAmode XmmMem synthetic_amode_to_xmm_mem) + +(decl reg_to_xmm_mem (Reg) XmmMem) +(rule (reg_to_xmm_mem r) + (xmm_to_xmm_mem (xmm_new r))) +(decl xmm_to_reg_mem (Reg) XmmMem) +(rule (xmm_to_reg_mem r) + (RegMem.Reg (xmm_to_reg r))) + +(decl writable_gpr_to_r_reg (WritableGpr) Reg) +(rule (writable_gpr_to_r_reg w_gpr) + (writable_reg_to_reg (writable_gpr_to_reg w_gpr))) +(decl writable_xmm_to_r_reg (WritableXmm) Reg) +(rule (writable_xmm_to_r_reg w_xmm) + (writable_reg_to_reg (writable_xmm_to_reg w_xmm))) +(decl writable_xmm_to_xmm_mem (WritableXmm) XmmMem) +(rule (writable_xmm_to_xmm_mem w_xmm) + (xmm_to_xmm_mem (writable_xmm_to_xmm w_xmm))) + +(decl synthetic_amode_to_gpr_mem (SyntheticAmode) GprMem) +(rule (synthetic_amode_to_gpr_mem amode) + (synthetic_amode_to_reg_mem amode)) +(decl synthetic_amode_to_xmm_mem (SyntheticAmode) XmmMem) +(rule (synthetic_amode_to_xmm_mem amode) + (synthetic_amode_to_reg_mem amode)) diff --git a/cranelift/codegen/src/isa/x64/lower.isle b/cranelift/codegen/src/isa/x64/lower.isle index 9c3a4a1aa8..c9384ba741 100644 --- a/cranelift/codegen/src/isa/x64/lower.isle +++ b/cranelift/codegen/src/isa/x64/lower.isle @@ -9,7 +9,7 @@ ;; `i64` and smaller. (rule (lower (has_type (fits_in_64 ty) (iconst (u64_from_imm64 x)))) - (value_reg (imm ty x))) + (imm ty x)) ;; `i128` (rule (lower (has_type $I128 @@ -23,11 +23,11 @@ (rule (lower (has_type (fits_in_64 ty) (bconst $false))) - (value_reg (imm ty 0))) + (imm ty 0)) (rule (lower (has_type (fits_in_64 ty) (bconst $true))) - (value_reg (imm ty 1))) + (imm ty 1)) ;; `b128` @@ -44,17 +44,17 @@ ;;;; Rules for `f32const` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (rule (lower (f32const (u64_from_ieee32 x))) - (value_reg (imm $F32 x))) + (imm $F32 x)) ;;;; Rules for `f64const` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (rule (lower (f64const (u64_from_ieee64 x))) - (value_reg (imm $F64 x))) + (imm $F64 x)) ;;;; Rules for `null` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (rule (lower (has_type ty (null))) - (value_reg (imm ty 0))) + (imm ty 0)) ;;;; Rules for `iadd` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -63,93 +63,83 @@ ;; Add two registers. (rule (lower (has_type (fits_in_64 ty) (iadd x y))) - (value_gpr (add ty - (put_in_gpr x) - (gpr_to_gpr_mem_imm (put_in_gpr y))))) + (add ty x y)) ;; Add a register and an immediate. (rule (lower (has_type (fits_in_64 ty) (iadd x (simm32_from_value y)))) - (value_gpr (add ty (put_in_gpr x) y))) + (add ty x y)) (rule (lower (has_type (fits_in_64 ty) (iadd (simm32_from_value x) y))) - (value_gpr (add ty (put_in_gpr y) x))) + (add ty y x)) ;; Add a register and memory. (rule (lower (has_type (fits_in_64 ty) (iadd x (sinkable_load y)))) - (value_gpr (add ty - (put_in_gpr x) - (sink_load_to_gpr_mem_imm y)))) + (add ty + x + (sink_load_to_gpr_mem_imm y))) (rule (lower (has_type (fits_in_64 ty) (iadd (sinkable_load x) y))) - (value_gpr (add ty - (put_in_gpr y) - (sink_load_to_gpr_mem_imm x)))) + (add ty + y + (sink_load_to_gpr_mem_imm x))) ;; SSE. (rule (lower (has_type (multi_lane 8 16) (iadd x y))) - (value_xmm (paddb (put_in_xmm x) - (put_in_xmm_mem y)))) + (paddb x y)) (rule (lower (has_type (multi_lane 16 8) (iadd x y))) - (value_xmm (paddw (put_in_xmm x) - (put_in_xmm_mem y)))) + (paddw x y)) (rule (lower (has_type (multi_lane 32 4) (iadd x y))) - (value_xmm (paddd (put_in_xmm x) - (put_in_xmm_mem y)))) + (paddd x y)) (rule (lower (has_type (multi_lane 64 2) (iadd x y))) - (value_xmm (paddq (put_in_xmm x) - (put_in_xmm_mem y)))) + (paddq x y)) ;; `i128` (rule (lower (has_type $I128 (iadd x y))) ;; Get the high/low registers for `x`. - (let ((x_regs ValueRegs (put_in_regs x)) + (let ((x_regs ValueRegs x) (x_lo Gpr (value_regs_get_gpr x_regs 0)) (x_hi Gpr (value_regs_get_gpr x_regs 1))) ;; Get the high/low registers for `y`. - (let ((y_regs ValueRegs (put_in_regs y)) + (let ((y_regs ValueRegs y) (y_lo Gpr (value_regs_get_gpr y_regs 0)) (y_hi Gpr (value_regs_get_gpr y_regs 1))) ;; Do an add followed by an add-with-carry. - (with_flags (add_with_flags_paired $I64 x_lo (gpr_to_gpr_mem_imm y_lo)) - (adc_paired $I64 x_hi (gpr_to_gpr_mem_imm y_hi)))))) + (with_flags (add_with_flags_paired $I64 x_lo y_lo) + (adc_paired $I64 x_hi y_hi))))) ;;;; Rules for `sadd_sat` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (rule (lower (has_type (multi_lane 8 16) (sadd_sat x y))) - (value_xmm (paddsb (put_in_xmm x) - (put_in_xmm_mem y)))) + (paddsb x y)) (rule (lower (has_type (multi_lane 16 8) (sadd_sat x y))) - (value_xmm (paddsw (put_in_xmm x) - (put_in_xmm_mem y)))) + (paddsw x y)) ;;;; Rules for `uadd_sat` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (rule (lower (has_type (multi_lane 8 16) (uadd_sat x y))) - (value_xmm (paddusb (put_in_xmm x) - (put_in_xmm_mem y)))) + (paddusb x y)) (rule (lower (has_type (multi_lane 16 8) (uadd_sat x y))) - (value_xmm (paddusw (put_in_xmm x) - (put_in_xmm_mem y)))) + (paddusw x y)) ;;;; Rules for `iadd_ifcout` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -163,46 +153,43 @@ ;; actually uses the register assigned to the SSA `iflags`-typed ;; `Value`. +(decl unused_iflags () Gpr) +(rule (unused_iflags) + (temp_writable_gpr)) + ;; Add two registers. (rule (lower (has_type (fits_in_64 ty) (iadd_ifcout x y))) - (let ((unused_iflags Gpr (writable_gpr_to_gpr (temp_writable_gpr)))) - (value_gprs (add ty - (put_in_gpr x) - (put_in_gpr_mem_imm y)) - unused_iflags))) + (value_gprs (add ty x y) + (unused_iflags))) ;; Add a register and an immediate. (rule (lower (has_type (fits_in_64 ty) (iadd_ifcout x (simm32_from_value y)))) - (let ((unused_iflags Gpr (writable_gpr_to_gpr (temp_writable_gpr)))) - (value_gprs (add ty (put_in_gpr x) y) - unused_iflags))) + (value_gprs (add ty x y) + (unused_iflags))) (rule (lower (has_type (fits_in_64 ty) (iadd_ifcout (simm32_from_value x) y))) - (let ((unused_iflags Gpr (writable_gpr_to_gpr (temp_writable_gpr)))) - (value_gprs (add ty (put_in_gpr y) x) - unused_iflags))) + (value_gprs (add ty y x) + (unused_iflags))) ;; Add a register and memory. (rule (lower (has_type (fits_in_64 ty) (iadd_ifcout x (sinkable_load y)))) - (let ((unused_iflags Gpr (writable_gpr_to_gpr (temp_writable_gpr)))) - (value_gprs (add ty - (put_in_gpr x) - (sink_load_to_gpr_mem_imm y)) - unused_iflags))) + (value_gprs (add ty + x + (sink_load_to_gpr_mem_imm y)) + (unused_iflags))) (rule (lower (has_type (fits_in_64 ty) (iadd_ifcout (sinkable_load x) y))) - (let ((unused_iflags Gpr (writable_gpr_to_gpr (temp_writable_gpr)))) - (value_gprs (add ty - (put_in_gpr y) - (sink_load_to_gpr_mem_imm x)) - unused_iflags))) + (value_gprs (add ty + y + (sink_load_to_gpr_mem_imm x)) + (unused_iflags))) ;; (No `iadd_ifcout` for `i128`.) @@ -212,30 +199,30 @@ ;; When the immediate fits in a `RegMemImm.Imm`, use that. (rule (lower (has_type (fits_in_64 ty) (iadd_imm y (simm32_from_imm64 x)))) - (value_gpr (add ty (put_in_gpr y) x))) + (add ty y x)) ;; Otherwise, put the immediate into a register. (rule (lower (has_type (fits_in_64 ty) (iadd_imm y (u64_from_imm64 x)))) - (value_gpr (add ty (put_in_gpr y) (gpr_to_gpr_mem_imm (gpr_new (imm ty x)))))) + (add ty y (imm ty x))) ;; `i128` ;; When the immediate fits in a `RegMemImm.Imm`, use that. (rule (lower (has_type $I128 (iadd_imm y (simm32_from_imm64 x)))) - (let ((y_regs ValueRegs (put_in_regs y)) + (let ((y_regs ValueRegs y) (y_lo Gpr (value_regs_get_gpr y_regs 0)) (y_hi Gpr (value_regs_get_gpr y_regs 1))) (with_flags (add_with_flags_paired $I64 y_lo x) - (adc_paired $I64 y_hi (gpr_mem_imm_new (RegMemImm.Imm 0)))))) + (adc_paired $I64 y_hi (RegMemImm.Imm 0))))) ;; Otherwise, put the immediate into a register. (rule (lower (has_type $I128 (iadd_imm y (u64_from_imm64 x)))) - (let ((y_regs ValueRegs (put_in_regs y)) + (let ((y_regs ValueRegs y) (y_lo Gpr (value_regs_get_gpr y_regs 0)) (y_hi Gpr (value_regs_get_gpr y_regs 1)) - (x_lo Gpr (gpr_new (imm $I64 x)))) - (with_flags (add_with_flags_paired $I64 y_lo (gpr_to_gpr_mem_imm x_lo)) - (adc_paired $I64 y_hi (gpr_mem_imm_new (RegMemImm.Imm 0)))))) + (x_lo Gpr (imm $I64 x))) + (with_flags (add_with_flags_paired $I64 y_lo x_lo) + (adc_paired $I64 y_hi (RegMemImm.Imm 0))))) ;;;; Rules for `isub` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -244,81 +231,70 @@ ;; Sub two registers. (rule (lower (has_type (fits_in_64 ty) (isub x y))) - (value_gpr (sub ty - (put_in_gpr x) - (put_in_gpr_mem_imm y)))) + (sub ty x y)) ;; Sub a register and an immediate. (rule (lower (has_type (fits_in_64 ty) (isub x (simm32_from_value y)))) - (value_gpr (sub ty (put_in_gpr x) y))) + (sub ty x y)) ;; Sub a register and memory. (rule (lower (has_type (fits_in_64 ty) (isub x (sinkable_load y)))) - (value_gpr (sub ty - (put_in_gpr x) - (sink_load_to_gpr_mem_imm y)))) + (sub ty x + (sink_load_to_gpr_mem_imm y))) ;; SSE. (rule (lower (has_type (multi_lane 8 16) (isub x y))) - (value_xmm (psubb (put_in_xmm x) - (put_in_xmm_mem y)))) + (psubb x y)) (rule (lower (has_type (multi_lane 16 8) (isub x y))) - (value_xmm (psubw (put_in_xmm x) - (put_in_xmm_mem y)))) + (psubw x y)) (rule (lower (has_type (multi_lane 32 4) (isub x y))) - (value_xmm (psubd (put_in_xmm x) - (put_in_xmm_mem y)))) + (psubd x y)) (rule (lower (has_type (multi_lane 64 2) (isub x y))) - (value_xmm (psubq (put_in_xmm x) - (put_in_xmm_mem y)))) + (psubq x y)) ;; `i128` (rule (lower (has_type $I128 (isub x y))) ;; Get the high/low registers for `x`. - (let ((x_regs ValueRegs (put_in_regs x)) + (let ((x_regs ValueRegs x) (x_lo Gpr (value_regs_get_gpr x_regs 0)) (x_hi Gpr (value_regs_get_gpr x_regs 1))) ;; Get the high/low registers for `y`. - (let ((y_regs ValueRegs (put_in_regs y)) + (let ((y_regs ValueRegs y) (y_lo Gpr (value_regs_get_gpr y_regs 0)) (y_hi Gpr (value_regs_get_gpr y_regs 1))) ;; Do a sub followed by an sub-with-borrow. - (with_flags (sub_with_flags_paired $I64 x_lo (gpr_to_gpr_mem_imm y_lo)) - (sbb_paired $I64 x_hi (gpr_to_gpr_mem_imm y_hi)))))) + (with_flags (sub_with_flags_paired $I64 x_lo y_lo) + (sbb_paired $I64 x_hi y_hi))))) ;;;; Rules for `ssub_sat` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (rule (lower (has_type (multi_lane 8 16) (ssub_sat x y))) - (value_xmm (psubsb (put_in_xmm x) - (put_in_xmm_mem y)))) + (psubsb x y)) (rule (lower (has_type (multi_lane 16 8) (ssub_sat x y))) - (value_xmm (psubsw (put_in_xmm x) - (put_in_xmm_mem y)))) + (psubsw x y)) ;;;; Rules for `usub_sat` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (rule (lower (has_type (multi_lane 8 16) (usub_sat x y))) - (value_xmm (psubusb (put_in_xmm x) - (put_in_xmm_mem y)))) + (psubusb x y)) (rule (lower (has_type (multi_lane 16 8) (usub_sat x y))) - (value_xmm (psubusw (put_in_xmm x) - (put_in_xmm_mem y)))) + (psubusw x y)) ;;;; Rules for `band` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -326,37 +302,30 @@ ;; And two registers. (rule (lower (has_type (fits_in_64 ty) (band x y))) - (value_gpr (x64_and ty - (put_in_gpr x) - (put_in_gpr_mem_imm y)))) + (x64_and ty x y)) ;; And with a memory operand. (rule (lower (has_type (fits_in_64 ty) (band x (sinkable_load y)))) - (value_gpr (x64_and ty - (put_in_gpr x) - (sink_load_to_gpr_mem_imm y)))) + (x64_and ty x + (sink_load_to_gpr_mem_imm y))) (rule (lower (has_type (fits_in_64 ty) (band (sinkable_load x) y))) - (value_gpr (x64_and ty - (put_in_gpr y) - (sink_load_to_gpr_mem_imm x)))) + (x64_and ty + y + (sink_load_to_gpr_mem_imm x))) ;; And with an immediate. (rule (lower (has_type (fits_in_64 ty) (band x (simm32_from_value y)))) - (value_gpr (x64_and ty - (put_in_gpr x) - y))) + (x64_and ty x y)) (rule (lower (has_type (fits_in_64 ty) (band (simm32_from_value x) y))) - (value_gpr (x64_and ty - (put_in_gpr y) - x))) + (x64_and ty y x)) ;; SSE. @@ -367,31 +336,29 @@ (rule (lower (has_type ty @ (multi_lane _bits _lanes) (band x y))) - (value_xmm (sse_and ty - (put_in_xmm x) - (put_in_xmm_mem y)))) + (sse_and ty x y)) ;; `{i,b}128`. (rule (lower (has_type $I128 (band x y))) - (let ((x_regs ValueRegs (put_in_regs x)) + (let ((x_regs ValueRegs x) (x_lo Gpr (value_regs_get_gpr x_regs 0)) (x_hi Gpr (value_regs_get_gpr x_regs 1)) - (y_regs ValueRegs (put_in_regs y)) + (y_regs ValueRegs y) (y_lo Gpr (value_regs_get_gpr y_regs 0)) (y_hi Gpr (value_regs_get_gpr y_regs 1))) - (value_gprs (x64_and $I64 x_lo (gpr_to_gpr_mem_imm y_lo)) - (x64_and $I64 x_hi (gpr_to_gpr_mem_imm y_hi))))) + (value_gprs (x64_and $I64 x_lo y_lo) + (x64_and $I64 x_hi y_hi)))) (rule (lower (has_type $B128 (band x y))) ;; Booleans are always `0` or `1`, so we only need to do the `and` on the ;; low half. The high half is always zero but, rather than generate a new ;; zero, we just reuse `x`'s high half which is already zero. - (let ((x_regs ValueRegs (put_in_regs x)) + (let ((x_regs ValueRegs x) (x_lo Gpr (value_regs_get_gpr x_regs 0)) (x_hi Gpr (value_regs_get_gpr x_regs 1)) (y_lo Gpr (lo_gpr y))) - (value_gprs (x64_and $I64 x_lo (gpr_to_gpr_mem_imm y_lo)) + (value_gprs (x64_and $I64 x_lo y_lo) x_hi))) ;;;; Rules for `bor` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -400,37 +367,29 @@ ;; Or two registers. (rule (lower (has_type (fits_in_64 ty) (bor x y))) - (value_gpr (or ty - (put_in_gpr x) - (put_in_gpr_mem_imm y)))) + (or ty x y)) ;; Or with a memory operand. (rule (lower (has_type (fits_in_64 ty) (bor x (sinkable_load y)))) - (value_gpr (or ty - (put_in_gpr x) - (sink_load_to_gpr_mem_imm y)))) + (or ty x + (sink_load_to_gpr_mem_imm y))) (rule (lower (has_type (fits_in_64 ty) (bor (sinkable_load x) y))) - (value_gpr (or ty - (put_in_gpr y) - (sink_load_to_gpr_mem_imm x)))) + (or ty y + (sink_load_to_gpr_mem_imm x))) ;; Or with an immediate. (rule (lower (has_type (fits_in_64 ty) (bor x (simm32_from_value y)))) - (value_gpr (or ty - (put_in_gpr x) - y))) + (or ty x y)) (rule (lower (has_type (fits_in_64 ty) (bor (simm32_from_value x) y))) - (value_gpr (or ty - (put_in_gpr y) - x))) + (or ty y x)) ;; SSE. @@ -441,9 +400,7 @@ (rule (lower (has_type ty @ (multi_lane _bits _lanes) (bor x y))) - (value_xmm (sse_or ty - (put_in_xmm x) - (put_in_xmm_mem y)))) + (sse_or ty x y)) ;; `{i,b}128`. @@ -453,21 +410,21 @@ (x_hi Gpr (value_regs_get_gpr x 1)) (y_lo Gpr (value_regs_get_gpr y 0)) (y_hi Gpr (value_regs_get_gpr y 1))) - (value_gprs (or $I64 x_lo (gpr_to_gpr_mem_imm y_lo)) - (or $I64 x_hi (gpr_to_gpr_mem_imm y_hi))))) + (value_gprs (or $I64 x_lo y_lo) + (or $I64 x_hi y_hi)))) (rule (lower (has_type $I128 (bor x y))) - (or_i128 (put_in_regs x) (put_in_regs y))) + (or_i128 x y)) (rule (lower (has_type $B128 (bor x y))) ;; Booleans are always `0` or `1`, so we only need to do the `or` on the ;; low half. The high half is always zero but, rather than generate a new ;; zero, we just reuse `x`'s high half which is already zero. - (let ((x_regs ValueRegs (put_in_regs x)) + (let ((x_regs ValueRegs x) (x_lo Gpr (value_regs_get_gpr x_regs 0)) (x_hi Gpr (value_regs_get_gpr x_regs 1)) (y_lo Gpr (lo_gpr y))) - (value_gprs (or $I64 x_lo (gpr_to_gpr_mem_imm y_lo)) + (value_gprs (or $I64 x_lo y_lo) x_hi))) ;;;; Rules for `bxor` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -476,64 +433,56 @@ ;; Xor two registers. (rule (lower (has_type (fits_in_64 ty) (bxor x y))) - (value_gpr (xor ty - (put_in_gpr x) - (put_in_gpr_mem_imm y)))) + (xor ty x y)) ;; Xor with a memory operand. (rule (lower (has_type (fits_in_64 ty) (bxor x (sinkable_load y)))) - (value_gpr (xor ty - (put_in_gpr x) - (sink_load_to_gpr_mem_imm y)))) + (xor ty x + (sink_load_to_gpr_mem_imm y))) (rule (lower (has_type (fits_in_64 ty) (bxor (sinkable_load x) y))) - (value_gpr (xor ty - (put_in_gpr y) - (sink_load_to_gpr_mem_imm x)))) + (xor ty y + (sink_load_to_gpr_mem_imm x))) ;; Xor with an immediate. (rule (lower (has_type (fits_in_64 ty) (bxor x (simm32_from_value y)))) - (value_gpr (xor ty - (put_in_gpr x) - y))) + (xor ty x y)) (rule (lower (has_type (fits_in_64 ty) (bxor (simm32_from_value x) y))) - (value_gpr (xor ty - (put_in_gpr y) - x))) + (xor ty y x)) ;; SSE. (rule (lower (has_type ty @ (multi_lane _bits _lanes) (bxor x y))) - (value_xmm (sse_xor ty (put_in_xmm x) (put_in_xmm_mem y)))) + (sse_xor ty x y)) ;; `{i,b}128`. (rule (lower (has_type $I128 (bxor x y))) - (let ((x_regs ValueRegs (put_in_regs x)) + (let ((x_regs ValueRegs x) (x_lo Gpr (value_regs_get_gpr x_regs 0)) (x_hi Gpr (value_regs_get_gpr x_regs 1)) - (y_regs ValueRegs (put_in_regs y)) + (y_regs ValueRegs y) (y_lo Gpr (value_regs_get_gpr y_regs 0)) (y_hi Gpr (value_regs_get_gpr y_regs 1))) - (value_gprs (xor $I64 x_lo (gpr_to_gpr_mem_imm y_lo)) - (xor $I64 x_hi (gpr_to_gpr_mem_imm y_hi))))) + (value_gprs (xor $I64 x_lo y_lo) + (xor $I64 x_hi y_hi)))) (rule (lower (has_type $B128 (bxor x y))) ;; Booleans are always `0` or `1`, so we only need to do the `xor` on the ;; low half. The high half is always zero but, rather than generate a new ;; zero, we just reuse `x`'s high half which is already zero. - (let ((x_regs ValueRegs (put_in_regs x)) + (let ((x_regs ValueRegs x) (x_lo Gpr (value_regs_get_gpr x_regs 0)) (x_hi Gpr (value_regs_get_gpr x_regs 1)) (y_lo Gpr (lo_gpr y))) - (value_gprs (xor $I64 x_lo (gpr_to_gpr_mem_imm y_lo)) + (value_gprs (xor $I64 x_lo y_lo) x_hi))) ;;;; Rules for `ishl` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -541,7 +490,7 @@ ;; `i64` and smaller. (rule (lower (has_type (fits_in_64 ty) (ishl src amt))) - (value_gpr (shl ty (put_in_gpr src) (put_masked_in_imm8_gpr amt ty)))) + (shl ty src (put_masked_in_imm8_gpr amt ty))) ;; `i128`. @@ -551,39 +500,39 @@ (let ((src_lo Gpr (value_regs_get_gpr src 0)) (src_hi Gpr (value_regs_get_gpr src 1)) ;; Do two 64-bit shifts. - (lo_shifted Gpr (shl $I64 src_lo (gpr_to_imm8_gpr amt))) - (hi_shifted Gpr (shl $I64 src_hi (gpr_to_imm8_gpr amt))) + (lo_shifted Gpr (shl $I64 src_lo amt)) + (hi_shifted Gpr (shl $I64 src_hi amt)) ;; `src_lo >> (64 - amt)` are the bits to carry over from the lo ;; into the hi. (carry Gpr (shr $I64 src_lo - (gpr_to_imm8_gpr (sub $I64 - (gpr_new (imm $I64 64)) - (gpr_to_gpr_mem_imm amt))))) - (zero Gpr (gpr_new (imm $I64 0))) + (sub $I64 + (imm $I64 64) + amt))) + (zero Gpr (imm $I64 0)) ;; Nullify the carry if we are shifting in by a multiple of 128. - (carry_ Gpr (gpr_new (with_flags_reg (test (OperandSize.Size64) - (gpr_mem_imm_new (RegMemImm.Imm 127)) - amt) - (cmove $I64 - (CC.Z) - (gpr_to_gpr_mem zero) - carry)))) + (carry_ Gpr (with_flags_reg (test (OperandSize.Size64) + (RegMemImm.Imm 127) + amt) + (cmove $I64 + (CC.Z) + zero + carry))) ;; Add the carry into the high half. - (hi_shifted_ Gpr (or $I64 carry_ (gpr_to_gpr_mem_imm hi_shifted)))) + (hi_shifted_ Gpr (or $I64 carry_ hi_shifted))) ;; Combine the two shifted halves. However, if we are shifting by >= 64 ;; (modulo 128), then the low bits are zero and the high bits are our ;; low bits. - (with_flags (test (OperandSize.Size64) (gpr_mem_imm_new (RegMemImm.Imm 64)) amt) + (with_flags (test (OperandSize.Size64) (RegMemImm.Imm 64) amt) (consumes_flags_concat - (cmove $I64 (CC.Z) (gpr_to_gpr_mem lo_shifted) zero) - (cmove $I64 (CC.Z) (gpr_to_gpr_mem hi_shifted_) lo_shifted))))) + (cmove $I64 (CC.Z) lo_shifted zero) + (cmove $I64 (CC.Z) hi_shifted_ lo_shifted))))) (rule (lower (has_type $I128 (ishl src amt))) ;; NB: Only the low bits of `amt` matter since we logically mask the shift ;; amount to the value's bit width. (let ((amt_ Gpr (lo_gpr amt))) - (shl_i128 (put_in_regs src) amt_))) + (shl_i128 src amt_))) ;; SSE. @@ -592,16 +541,14 @@ ;; instructions. The basic idea, whether the amount to shift by is an immediate ;; or not, is to use a 16x8 shift and then mask off the incorrect bits to 0s. (rule (lower (has_type $I8X16 (ishl src amt))) - (let ((src_ Xmm (put_in_xmm src)) - (amt_gpr RegMemImm (put_in_reg_mem_imm amt)) - (amt_xmm XmmMemImm (mov_rmi_to_xmm amt_gpr)) + (let ( ;; Shift `src` using 16x8. Unfortunately, a 16x8 shift will only be ;; correct for half of the lanes; the others must be fixed up with ;; the mask below. - (unmasked Xmm (psllw src_ amt_xmm)) - (mask_addr SyntheticAmode (ishl_i8x16_mask amt_gpr)) + (unmasked Xmm (psllw src (mov_rmi_to_xmm amt))) + (mask_addr SyntheticAmode (ishl_i8x16_mask amt)) (mask Reg (x64_load $I8X16 mask_addr (ExtKind.None)))) - (value_xmm (sse_and $I8X16 unmasked (reg_mem_to_xmm_mem (RegMem.Reg mask)))))) + (sse_and $I8X16 unmasked (RegMem.Reg mask)))) ;; Get the address of the mask to use when fixing up the lanes that weren't ;; correctly generated by the 16x8 shift. @@ -623,29 +570,26 @@ (rule (ishl_i8x16_mask (RegMemImm.Reg amt)) (let ((mask_table SyntheticAmode (ishl_i8x16_mask_table)) (base_mask_addr Gpr (lea mask_table)) - (mask_offset Gpr (shl $I64 - (gpr_new amt) + (mask_offset Gpr (shl $I64 amt (imm8_to_imm8_gpr 4)))) - (amode_to_synthetic_amode (amode_imm_reg_reg_shift 0 - base_mask_addr - mask_offset - 0)))) + (amode_imm_reg_reg_shift 0 + base_mask_addr + mask_offset + 0))) + (rule (ishl_i8x16_mask (RegMemImm.Mem amt)) (ishl_i8x16_mask (RegMemImm.Reg (x64_load $I64 amt (ExtKind.None))))) ;; 16x8, 32x4, and 64x2 shifts can each use a single instruction. (rule (lower (has_type $I16X8 (ishl src amt))) - (value_xmm (psllw (put_in_xmm src) - (mov_rmi_to_xmm (put_in_reg_mem_imm amt))))) + (psllw src (mov_rmi_to_xmm amt))) (rule (lower (has_type $I32X4 (ishl src amt))) - (value_xmm (pslld (put_in_xmm src) - (mov_rmi_to_xmm (put_in_reg_mem_imm amt))))) + (pslld src (mov_rmi_to_xmm amt))) (rule (lower (has_type $I64X2 (ishl src amt))) - (value_xmm (psllq (put_in_xmm src) - (mov_rmi_to_xmm (put_in_reg_mem_imm amt))))) + (psllq src (mov_rmi_to_xmm amt))) ;;;; Rules for `ushr` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -653,7 +597,7 @@ (rule (lower (has_type (fits_in_64 ty) (ushr src amt))) (let ((src_ Gpr (extend_to_gpr src ty (ExtendKind.Zero)))) - (value_gpr (shr ty src_ (put_masked_in_imm8_gpr amt ty))))) + (shr ty src_ (put_masked_in_imm8_gpr amt ty)))) ;; `i128`. @@ -663,51 +607,49 @@ (let ((src_lo Gpr (value_regs_get_gpr src 0)) (src_hi Gpr (value_regs_get_gpr src 1)) ;; Do a shift on each half. - (lo_shifted Gpr (shr $I64 src_lo (gpr_to_imm8_gpr amt))) - (hi_shifted Gpr (shr $I64 src_hi (gpr_to_imm8_gpr amt))) + (lo_shifted Gpr (shr $I64 src_lo amt)) + (hi_shifted Gpr (shr $I64 src_hi amt)) ;; `src_hi << (64 - amt)` are the bits to carry over from the hi ;; into the lo. (carry Gpr (shl $I64 src_hi - (gpr_to_imm8_gpr (sub $I64 - (gpr_new (imm $I64 64)) - (gpr_to_gpr_mem_imm amt))))) + (sub $I64 + (imm $I64 64) + amt))) ;; Nullify the carry if we are shifting by a multiple of 128. - (carry_ Gpr (gpr_new (with_flags_reg (test (OperandSize.Size64) (gpr_mem_imm_new (RegMemImm.Imm 127)) amt) - (cmove $I64 (CC.Z) (gpr_to_gpr_mem (gpr_new (imm $I64 0))) carry)))) + (carry_ Gpr (with_flags_reg (test (OperandSize.Size64) (RegMemImm.Imm 127) amt) + (cmove $I64 (CC.Z) (imm $I64 0) carry))) ;; Add the carry bits into the lo. - (lo_shifted_ Gpr (or $I64 carry_ (gpr_to_gpr_mem_imm lo_shifted)))) + (lo_shifted_ Gpr (or $I64 carry_ lo_shifted))) ;; Combine the two shifted halves. However, if we are shifting by >= 64 ;; (modulo 128), then the hi bits are zero and the lo bits are what ;; would otherwise be our hi bits. - (with_flags (test (OperandSize.Size64) (gpr_mem_imm_new (RegMemImm.Imm 64)) amt) + (with_flags (test (OperandSize.Size64) (RegMemImm.Imm 64) amt) (consumes_flags_concat - (cmove $I64 (CC.Z) (gpr_to_gpr_mem lo_shifted_) hi_shifted) - (cmove $I64 (CC.Z) (gpr_to_gpr_mem hi_shifted) (gpr_new (imm $I64 0))))))) + (cmove $I64 (CC.Z) lo_shifted_ hi_shifted) + (cmove $I64 (CC.Z) hi_shifted (imm $I64 0)))))) (rule (lower (has_type $I128 (ushr src amt))) ;; NB: Only the low bits of `amt` matter since we logically mask the shift ;; amount to the value's bit width. (let ((amt_ Gpr (lo_gpr amt))) - (shr_i128 (put_in_regs src) amt_))) + (shr_i128 src amt_))) ;; SSE. ;; There are no 8x16 shifts in x64. Do the same 16x8-shift-and-mask thing we do ;; with 8x16 `ishl`. (rule (lower (has_type $I8X16 (ushr src amt))) - (let ((src_ Xmm (put_in_xmm src)) - (amt_gpr RegMemImm (put_in_reg_mem_imm amt)) - (amt_xmm XmmMemImm (mov_rmi_to_xmm amt_gpr)) + (let ( ;; Shift `src` using 16x8. Unfortunately, a 16x8 shift will only be ;; correct for half of the lanes; the others must be fixed up with ;; the mask below. - (unmasked Xmm (psrlw src_ amt_xmm)) - (mask_addr SyntheticAmode (ushr_i8x16_mask amt_gpr)) + (unmasked Xmm (psrlw src (mov_rmi_to_xmm amt))) + (mask_addr SyntheticAmode (ushr_i8x16_mask amt)) (mask Reg (x64_load $I8X16 mask_addr (ExtKind.None)))) - (value_xmm (sse_and $I8X16 - unmasked - (reg_mem_to_xmm_mem (RegMem.Reg mask)))))) + (sse_and $I8X16 + unmasked + (RegMem.Reg mask)))) ;; Get the address of the mask to use when fixing up the lanes that weren't ;; correctly generated by the 16x8 shift. @@ -730,28 +672,26 @@ (let ((mask_table SyntheticAmode (ushr_i8x16_mask_table)) (base_mask_addr Gpr (lea mask_table)) (mask_offset Gpr (shl $I64 - (gpr_new amt) + amt (imm8_to_imm8_gpr 4)))) - (amode_to_synthetic_amode (amode_imm_reg_reg_shift 0 - base_mask_addr - mask_offset - 0)))) + (amode_imm_reg_reg_shift 0 + base_mask_addr + mask_offset + 0))) + (rule (ushr_i8x16_mask (RegMemImm.Mem amt)) (ushr_i8x16_mask (RegMemImm.Reg (x64_load $I64 amt (ExtKind.None))))) ;; 16x8, 32x4, and 64x2 shifts can each use a single instruction. (rule (lower (has_type $I16X8 (ushr src amt))) - (value_xmm (psrlw (put_in_xmm src) - (mov_rmi_to_xmm (put_in_reg_mem_imm amt))))) + (psrlw src (mov_rmi_to_xmm amt))) (rule (lower (has_type $I32X4 (ushr src amt))) - (value_xmm (psrld (put_in_xmm src) - (mov_rmi_to_xmm (put_in_reg_mem_imm amt))))) + (psrld src (mov_rmi_to_xmm amt))) (rule (lower (has_type $I64X2 (ushr src amt))) - (value_xmm (psrlq (put_in_xmm src) - (mov_rmi_to_xmm (put_in_reg_mem_imm amt))))) + (psrlq src (mov_rmi_to_xmm amt))) ;;;; Rules for `sshr` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -759,7 +699,7 @@ (rule (lower (has_type (fits_in_64 ty) (sshr src amt))) (let ((src_ Gpr (extend_to_gpr src ty (ExtendKind.Sign)))) - (value_gpr (sar ty src_ (put_masked_in_imm8_gpr amt ty))))) + (sar ty src_ (put_masked_in_imm8_gpr amt ty)))) ;; `i128`. @@ -770,35 +710,35 @@ (src_hi Gpr (value_regs_get_gpr src 1)) ;; Do a shift of each half. NB: the low half uses an unsigned shift ;; because its MSB is not a sign bit. - (lo_shifted Gpr (shr $I64 src_lo (gpr_to_imm8_gpr amt))) - (hi_shifted Gpr (sar $I64 src_hi (gpr_to_imm8_gpr amt))) + (lo_shifted Gpr (shr $I64 src_lo amt)) + (hi_shifted Gpr (sar $I64 src_hi amt)) ;; `src_hi << (64 - amt)` are the bits to carry over from the low ;; half to the high half. (carry Gpr (shl $I64 src_hi - (gpr_to_imm8_gpr (sub $I64 - (gpr_new (imm $I64 64)) - (gpr_to_gpr_mem_imm amt))))) + (sub $I64 + (imm $I64 64) + amt))) ;; Nullify the carry if we are shifting by a multiple of 128. - (carry_ Gpr (gpr_new (with_flags_reg (test (OperandSize.Size64) (gpr_mem_imm_new (RegMemImm.Imm 127)) amt) - (cmove $I64 (CC.Z) (gpr_to_gpr_mem (gpr_new (imm $I64 0))) carry)))) + (carry_ Gpr (with_flags_reg (test (OperandSize.Size64) (RegMemImm.Imm 127) amt) + (cmove $I64 (CC.Z) (imm $I64 0) carry))) ;; Add the carry into the low half. - (lo_shifted_ Gpr (or $I64 lo_shifted (gpr_to_gpr_mem_imm carry_))) + (lo_shifted_ Gpr (or $I64 lo_shifted carry_)) ;; Get all sign bits. (sign_bits Gpr (sar $I64 src_hi (imm8_to_imm8_gpr 63)))) ;; Combine the two shifted halves. However, if we are shifting by >= 64 ;; (modulo 128), then the hi bits are all sign bits and the lo bits are ;; what would otherwise be our hi bits. - (with_flags (test (OperandSize.Size64) (gpr_mem_imm_new (RegMemImm.Imm 64)) amt) + (with_flags (test (OperandSize.Size64) (RegMemImm.Imm 64) amt) (consumes_flags_concat - (cmove $I64 (CC.Z) (gpr_to_gpr_mem lo_shifted_) hi_shifted) - (cmove $I64 (CC.Z) (gpr_to_gpr_mem hi_shifted) sign_bits))))) + (cmove $I64 (CC.Z) lo_shifted_ hi_shifted) + (cmove $I64 (CC.Z) hi_shifted sign_bits))))) (rule (lower (has_type $I128 (sshr src amt))) ;; NB: Only the low bits of `amt` matter since we logically mask the shift ;; amount to the value's bit width. (let ((amt_ Gpr (lo_gpr amt))) - (sar_i128 (put_in_regs src) amt_))) + (sar_i128 src amt_))) ;; SSE. @@ -820,35 +760,33 @@ ;; In order for `packsswb` later to only use the high byte of each ;; 16x8 lane, we shift right an extra 8 bits, relying on `psraw` to ;; fill in the upper bits appropriately. - (lo Xmm (punpcklbw src_ (xmm_to_xmm_mem src_))) - (hi Xmm (punpckhbw src_ (xmm_to_xmm_mem src_))) - (amt_ XmmMemImm (sshr_i8x16_bigger_shift amt_ty (put_in_reg_mem_imm amt))) + (lo Xmm (punpcklbw src_ src_)) + (hi Xmm (punpckhbw src_ src_)) + (amt_ XmmMemImm (sshr_i8x16_bigger_shift amt_ty amt)) (shifted_lo Xmm (psraw lo amt_)) (shifted_hi Xmm (psraw hi amt_))) - (value_xmm (packsswb shifted_lo (xmm_to_xmm_mem shifted_hi))))) + (packsswb shifted_lo shifted_hi))) (decl sshr_i8x16_bigger_shift (Type RegMemImm) XmmMemImm) (rule (sshr_i8x16_bigger_shift _ty (RegMemImm.Imm i)) (xmm_mem_imm_new (RegMemImm.Imm (u32_add i 8)))) (rule (sshr_i8x16_bigger_shift ty (RegMemImm.Reg r)) - (mov_rmi_to_xmm (RegMemImm.Reg (gpr_to_reg (add ty - (gpr_new r) - (gpr_mem_imm_new (RegMemImm.Imm 8))))))) + (mov_rmi_to_xmm (RegMemImm.Reg (add ty + r + (RegMemImm.Imm 8))))) (rule (sshr_i8x16_bigger_shift ty rmi @ (RegMemImm.Mem _m)) - (mov_rmi_to_xmm (RegMemImm.Reg (gpr_to_reg (add ty - (gpr_new (imm ty 8)) - (gpr_mem_imm_new rmi)))))) + (mov_rmi_to_xmm (RegMemImm.Reg (add ty + (imm ty 8) + rmi)))) ;; `sshr.{i16x8,i32x4}` can be a simple `psra{w,d}`, we just have to make sure ;; that if the shift amount is in a register, it is in an XMM register. (rule (lower (has_type $I16X8 (sshr src amt))) - (value_xmm (psraw (put_in_xmm src) - (mov_rmi_to_xmm (put_in_reg_mem_imm amt))))) + (psraw src (mov_rmi_to_xmm amt))) (rule (lower (has_type $I32X4 (sshr src amt))) - (value_xmm (psrad (put_in_xmm src) - (mov_rmi_to_xmm (put_in_reg_mem_imm amt))))) + (psrad src (mov_rmi_to_xmm amt))) ;; The `sshr.i64x2` CLIF instruction has no single x86 instruction in the older ;; feature sets. Newer ones like AVX512VL + AVX512F include `vpsraq`, a 128-bit @@ -865,8 +803,8 @@ (amt_ Imm8Gpr (put_masked_in_imm8_gpr amt $I64)) (shifted_lo Gpr (sar $I64 lo amt_)) (shifted_hi Gpr (sar $I64 hi amt_))) - (value_xmm (make_i64x2_from_lanes (gpr_to_gpr_mem shifted_lo) - (gpr_to_gpr_mem shifted_hi))))) + (make_i64x2_from_lanes shifted_lo + shifted_hi))) ;;;; Rules for `rotl` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -875,13 +813,12 @@ (rule (lower (has_type (ty_8_or_16 ty) (rotl src amt))) (let ((amt_ Gpr (extend_to_gpr amt $I32 (ExtendKind.Zero)))) - (value_gpr (x64_rotl ty (put_in_gpr src) (gpr_to_imm8_gpr amt_))))) + (x64_rotl ty src (gpr_to_imm8_gpr amt_)))) (rule (lower (has_type (ty_8_or_16 ty) (rotl src (u64_from_iconst amt)))) - (value_gpr (x64_rotl ty - (put_in_gpr src) - (const_to_type_masked_imm8 amt ty)))) + (x64_rotl ty src + (const_to_type_masked_imm8 amt ty))) ;; `i64` and `i32`: we can rely on x86's rotate-amount masking since ;; we operate on the whole register. @@ -890,25 +827,24 @@ ;; NB: Only the low bits of `amt` matter since we logically mask the ;; shift amount to the value's bit width. (let ((amt_ Gpr (lo_gpr amt))) - (value_gpr (x64_rotl ty (put_in_gpr src) (gpr_to_imm8_gpr amt_))))) + (x64_rotl ty src amt_))) (rule (lower (has_type (ty_32_or_64 ty) (rotl src (u64_from_iconst amt)))) - (value_gpr (x64_rotl ty - (put_in_gpr src) - (const_to_type_masked_imm8 amt ty)))) + (x64_rotl ty src + (const_to_type_masked_imm8 amt ty))) ;; `i128`. (rule (lower (has_type $I128 (rotl src amt))) - (let ((src_ ValueRegs (put_in_regs src)) + (let ((src_ ValueRegs src) ;; NB: Only the low bits of `amt` matter since we logically mask the ;; rotation amount to the value's bit width. (amt_ Gpr (lo_gpr amt))) (or_i128 (shl_i128 src_ amt_) (shr_i128 src_ (sub $I64 - (gpr_new (imm $I64 128)) - (gpr_to_gpr_mem_imm amt_)))))) + (imm $I64 128) + amt_))))) ;;;; Rules for `rotr` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -917,13 +853,12 @@ (rule (lower (has_type (ty_8_or_16 ty) (rotr src amt))) (let ((amt_ Gpr (extend_to_gpr amt $I32 (ExtendKind.Zero)))) - (value_gpr (x64_rotr ty (put_in_gpr src) (gpr_to_imm8_gpr amt_))))) + (x64_rotr ty src amt_))) (rule (lower (has_type (ty_8_or_16 ty) (rotr src (u64_from_iconst amt)))) - (value_gpr (x64_rotr ty - (put_in_gpr src) - (const_to_type_masked_imm8 amt ty)))) + (x64_rotr ty src + (const_to_type_masked_imm8 amt ty))) ;; `i64` and `i32`: we can rely on x86's rotate-amount masking since ;; we operate on the whole register. @@ -932,60 +867,55 @@ ;; NB: Only the low bits of `amt` matter since we logically mask the ;; shift amount to the value's bit width. (let ((amt_ Gpr (lo_gpr amt))) - (value_gpr (x64_rotr ty (put_in_gpr src) (gpr_to_imm8_gpr amt_))))) + (x64_rotr ty src amt_))) (rule (lower (has_type (ty_32_or_64 ty) (rotr src (u64_from_iconst amt)))) - (value_gpr (x64_rotr ty - (put_in_gpr src) - (const_to_type_masked_imm8 amt ty)))) + (x64_rotr ty src + (const_to_type_masked_imm8 amt ty))) ;; `i128`. (rule (lower (has_type $I128 (rotr src amt))) - (let ((src_ ValueRegs (put_in_regs src)) + (let ((src_ ValueRegs src) ;; NB: Only the low bits of `amt` matter since we logically mask the ;; rotation amount to the value's bit width. (amt_ Gpr (lo_gpr amt))) (or_i128 (shr_i128 src_ amt_) (shl_i128 src_ (sub $I64 - (gpr_new (imm $I64 128)) - (gpr_to_gpr_mem_imm amt_)))))) + (imm $I64 128) + amt_))))) ;;;; Rules for `ineg` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; `i64` and smaller. (rule (lower (has_type (fits_in_64 ty) (ineg x))) - (value_gpr (neg ty (put_in_gpr x)))) + (neg ty x)) ;; SSE. (rule (lower (has_type $I8X16 (ineg x))) - (value_xmm (psubb (xmm_new (imm $I8X16 0)) - (put_in_xmm_mem x)))) + (psubb (imm $I8X16 0) x)) (rule (lower (has_type $I16X8 (ineg x))) - (value_xmm (psubw (xmm_new (imm $I16X8 0)) - (put_in_xmm_mem x)))) + (psubw (imm $I16X8 0) x)) (rule (lower (has_type $I32X4 (ineg x))) - (value_xmm (psubd (xmm_new (imm $I32X4 0)) - (put_in_xmm_mem x)))) + (psubd (imm $I32X4 0) x)) (rule (lower (has_type $I64X2 (ineg x))) - (value_xmm (psubq (xmm_new (imm $I64X2 0)) - (put_in_xmm_mem x)))) + (psubq (imm $I64X2 0) x)) ;;;; Rules for `avg_round` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (rule (lower (has_type (multi_lane 8 16) (avg_round x y))) - (value_xmm (pavgb (put_in_xmm x) (put_in_xmm_mem y)))) + (pavgb x y)) (rule (lower (has_type (multi_lane 16 8) (avg_round x y))) - (value_xmm (pavgw (put_in_xmm x) (put_in_xmm_mem y)))) + (pavgw x y)) ;;;; Rules for `imul` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -993,33 +923,30 @@ ;; Multiply two registers. (rule (lower (has_type (fits_in_64 ty) (imul x y))) - (value_gpr (mul ty - (put_in_gpr x) - (put_in_gpr_mem_imm y)))) + (mul ty x y)) ;; Multiply a register and an immediate. (rule (lower (has_type (fits_in_64 ty) (imul x (simm32_from_value y)))) - (value_gpr (mul ty (put_in_gpr x) y))) + (mul ty x y)) (rule (lower (has_type (fits_in_64 ty) (imul (simm32_from_value x) y))) - (value_gpr (mul ty (put_in_gpr y) x))) + (mul ty y x)) ;; Multiply a register and a memory load. (rule (lower (has_type (fits_in_64 ty) (imul x (sinkable_load y)))) - (value_gpr (mul ty - (put_in_gpr x) - (sink_load_to_gpr_mem_imm y)))) + (mul ty + x + (sink_load_to_gpr_mem_imm y))) (rule (lower (has_type (fits_in_64 ty) (imul (sinkable_load x) y))) - (value_gpr (mul ty - (put_in_gpr y) - (sink_load_to_gpr_mem_imm x)))) + (mul ty y + (sink_load_to_gpr_mem_imm x))) ;; `i128`. @@ -1038,25 +965,25 @@ ;; return (dst_lo, dst_hi) (rule (lower (has_type $I128 (imul x y))) ;; Put `x` into registers and unpack its hi/lo halves. - (let ((x_regs ValueRegs (put_in_regs x)) + (let ((x_regs ValueRegs x) (x_lo Gpr (value_regs_get_gpr x_regs 0)) (x_hi Gpr (value_regs_get_gpr x_regs 1)) ;; Put `y` into registers and unpack its hi/lo halves. - (y_regs ValueRegs (put_in_regs y)) + (y_regs ValueRegs y) (y_lo Gpr (value_regs_get_gpr y_regs 0)) (y_hi Gpr (value_regs_get_gpr y_regs 1)) ;; lo_hi = mul x_lo, y_hi - (lo_hi Gpr (mul $I64 x_lo (gpr_to_gpr_mem_imm y_hi))) + (lo_hi Gpr (mul $I64 x_lo y_hi)) ;; hi_lo = mul x_hi, y_lo - (hi_lo Gpr (mul $I64 x_hi (gpr_to_gpr_mem_imm y_lo))) + (hi_lo Gpr (mul $I64 x_hi y_lo)) ;; hilo_hilo = add lo_hi, hi_lo - (hilo_hilo Gpr (add $I64 lo_hi (gpr_to_gpr_mem_imm hi_lo))) + (hilo_hilo Gpr (add $I64 lo_hi hi_lo)) ;; dst_lo:hi_lolo = mulhi_u x_lo, y_lo - (mul_regs ValueRegs (mulhi_u $I64 x_lo (gpr_to_gpr_mem y_lo))) + (mul_regs ValueRegs (mulhi_u $I64 x_lo y_lo)) (dst_lo Gpr (value_regs_get_gpr mul_regs 0)) (hi_lolo Gpr (value_regs_get_gpr mul_regs 1)) ;; dst_hi = add hilo_hilo, hi_lolo - (dst_hi Gpr (add $I64 hilo_hilo (gpr_to_gpr_mem_imm hi_lolo)))) + (dst_hi Gpr (add $I64 hilo_hilo hi_lolo))) (value_gprs dst_lo dst_hi))) ;; SSE. @@ -1064,10 +991,10 @@ ;; (No i8x16 multiply.) (rule (lower (has_type (multi_lane 16 8) (imul x y))) - (value_xmm (pmullw (put_in_xmm x) (put_in_xmm_mem y)))) + (pmullw x y)) (rule (lower (has_type (multi_lane 32 4) (imul x y))) - (value_xmm (pmulld (put_in_xmm x) (put_in_xmm_mem y)))) + (pmulld x y)) ;; With AVX-512 we can implement `i64x2` multiplication with a single ;; instruction. @@ -1075,7 +1002,7 @@ (avx512dq_enabled) (multi_lane 64 2)) (imul x y))) - (value_xmm (vpmullq (put_in_xmm_mem x) (put_in_xmm y)))) + (vpmullq x y)) ;; Otherwise, for i64x2 multiplication we describe a lane A as being composed of ;; a 32-bit upper half "Ah" and a 32-bit lower half "Al". The 32-bit long hand @@ -1099,176 +1026,176 @@ ;; 32-bits when doing calculations, i.e., `Ah == A >> 32`. (rule (lower (has_type (multi_lane 64 2) (imul a b))) - (let ((a0 Xmm (put_in_xmm a)) - (b0 Xmm (put_in_xmm b)) + (let ((a0 Xmm a) + (b0 Xmm b) ;; a_hi = A >> 32 - (a_hi Xmm (psrlq a0 (xmm_mem_imm_new (RegMemImm.Imm 32)))) + (a_hi Xmm (psrlq a0 (RegMemImm.Imm 32))) ;; ah_bl = Ah * Bl - (ah_bl Xmm (pmuludq a_hi (xmm_to_xmm_mem b0))) + (ah_bl Xmm (pmuludq a_hi b0)) ;; b_hi = B >> 32 - (b_hi Xmm (psrlq b0 (xmm_mem_imm_new (RegMemImm.Imm 32)))) + (b_hi Xmm (psrlq b0 (RegMemImm.Imm 32))) ;; al_bh = Al * Bh - (al_bh Xmm (pmuludq a0 (xmm_to_xmm_mem b_hi))) + (al_bh Xmm (pmuludq a0 b_hi)) ;; aa_bb = ah_bl + al_bh - (aa_bb Xmm (paddq ah_bl (xmm_to_xmm_mem al_bh))) + (aa_bb Xmm (paddq ah_bl al_bh)) ;; aa_bb_shifted = aa_bb << 32 - (aa_bb_shifted Xmm (psllq aa_bb (xmm_mem_imm_new (RegMemImm.Imm 32)))) + (aa_bb_shifted Xmm (psllq aa_bb (RegMemImm.Imm 32))) ;; al_bl = Al * Bl - (al_bl Xmm (pmuludq a0 (xmm_to_xmm_mem b0)))) + (al_bl Xmm (pmuludq a0 b0))) ;; al_bl + aa_bb_shifted - (value_xmm (paddq al_bl (xmm_to_xmm_mem aa_bb_shifted))))) + (paddq al_bl aa_bb_shifted))) ;; Special case for `i16x8.extmul_high_i8x16_s`. (rule (lower (has_type (multi_lane 16 8) - (imul (def_inst (swiden_high (and (value_type (multi_lane 8 16)) - x))) - (def_inst (swiden_high (and (value_type (multi_lane 8 16)) - y)))))) - (let ((x1 Xmm (put_in_xmm x)) - (x2 Xmm (palignr x1 (xmm_to_xmm_mem x1) 8 (OperandSize.Size32))) - (x3 Xmm (pmovsxbw (xmm_to_xmm_mem x2))) - (y1 Xmm (put_in_xmm y)) - (y2 Xmm (palignr y1 (xmm_to_xmm_mem y1) 8 (OperandSize.Size32))) - (y3 Xmm (pmovsxbw (xmm_to_xmm_mem y2)))) - (value_xmm (pmullw x3 (xmm_to_xmm_mem y3))))) + (imul (swiden_high (and (value_type (multi_lane 8 16)) + x)) + (swiden_high (and (value_type (multi_lane 8 16)) + y))))) + (let ((x1 Xmm x) + (x2 Xmm (palignr x1 x1 8 (OperandSize.Size32))) + (x3 Xmm (pmovsxbw x2)) + (y1 Xmm y) + (y2 Xmm (palignr y1 y1 8 (OperandSize.Size32))) + (y3 Xmm (pmovsxbw y2))) + (pmullw x3 y3))) ;; Special case for `i32x4.extmul_high_i16x8_s`. (rule (lower (has_type (multi_lane 32 4) - (imul (def_inst (swiden_high (and (value_type (multi_lane 16 8)) - x))) - (def_inst (swiden_high (and (value_type (multi_lane 16 8)) - y)))))) - (let ((x2 Xmm (put_in_xmm x)) - (y2 Xmm (put_in_xmm y)) - (lo Xmm (pmullw x2 (xmm_to_xmm_mem y2))) - (hi Xmm (pmulhw x2 (xmm_to_xmm_mem y2)))) - (value_xmm (punpckhwd lo (xmm_to_xmm_mem hi))))) + (imul (swiden_high (and (value_type (multi_lane 16 8)) + x)) + (swiden_high (and (value_type (multi_lane 16 8)) + y))))) + (let ((x2 Xmm x) + (y2 Xmm y) + (lo Xmm (pmullw x2 y2)) + (hi Xmm (pmulhw x2 y2))) + (punpckhwd lo hi))) ;; Special case for `i64x2.extmul_high_i32x4_s`. (rule (lower (has_type (multi_lane 64 2) - (imul (def_inst (swiden_high (and (value_type (multi_lane 32 4)) - x))) - (def_inst (swiden_high (and (value_type (multi_lane 32 4)) - y)))))) - (let ((x2 Xmm (pshufd (put_in_xmm_mem x) + (imul (swiden_high (and (value_type (multi_lane 32 4)) + x)) + (swiden_high (and (value_type (multi_lane 32 4)) + y))))) + (let ((x2 Xmm (pshufd x 0xFA (OperandSize.Size32))) - (y2 Xmm (pshufd (put_in_xmm_mem y) + (y2 Xmm (pshufd y 0xFA (OperandSize.Size32)))) - (value_xmm (pmuldq x2 (xmm_to_xmm_mem y2))))) + (pmuldq x2 y2))) ;; Special case for `i16x8.extmul_low_i8x16_s`. (rule (lower (has_type (multi_lane 16 8) - (imul (def_inst (swiden_low (and (value_type (multi_lane 8 16)) - x))) - (def_inst (swiden_low (and (value_type (multi_lane 8 16)) - y)))))) - (let ((x2 Xmm (pmovsxbw (put_in_xmm_mem x))) - (y2 Xmm (pmovsxbw (put_in_xmm_mem y)))) - (value_xmm (pmullw x2 (xmm_to_xmm_mem y2))))) + (imul (swiden_low (and (value_type (multi_lane 8 16)) + x)) + (swiden_low (and (value_type (multi_lane 8 16)) + y))))) + (let ((x2 Xmm (pmovsxbw x)) + (y2 Xmm (pmovsxbw y))) + (pmullw x2 y2))) ;; Special case for `i32x4.extmul_low_i16x8_s`. (rule (lower (has_type (multi_lane 32 4) - (imul (def_inst (swiden_low (and (value_type (multi_lane 16 8)) - x))) - (def_inst (swiden_low (and (value_type (multi_lane 16 8)) - y)))))) - (let ((x2 Xmm (put_in_xmm x)) - (y2 Xmm (put_in_xmm y)) - (lo Xmm (pmullw x2 (xmm_to_xmm_mem y2))) - (hi Xmm (pmulhw x2 (xmm_to_xmm_mem y2)))) - (value_xmm (punpcklwd lo (xmm_to_xmm_mem hi))))) + (imul (swiden_low (and (value_type (multi_lane 16 8)) + x)) + (swiden_low (and (value_type (multi_lane 16 8)) + y))))) + (let ((x2 Xmm x) + (y2 Xmm y) + (lo Xmm (pmullw x2 y2)) + (hi Xmm (pmulhw x2 y2))) + (punpcklwd lo hi))) ;; Special case for `i64x2.extmul_low_i32x4_s`. (rule (lower (has_type (multi_lane 64 2) - (imul (def_inst (swiden_low (and (value_type (multi_lane 32 4)) - x))) - (def_inst (swiden_low (and (value_type (multi_lane 32 4)) - y)))))) - (let ((x2 Xmm (pshufd (put_in_xmm_mem x) + (imul (swiden_low (and (value_type (multi_lane 32 4)) + x)) + (swiden_low (and (value_type (multi_lane 32 4)) + y))))) + (let ((x2 Xmm (pshufd x 0x50 (OperandSize.Size32))) - (y2 Xmm (pshufd (put_in_xmm_mem y) + (y2 Xmm (pshufd y 0x50 (OperandSize.Size32)))) - (value_xmm (pmuldq x2 (xmm_to_xmm_mem y2))))) + (pmuldq x2 y2))) ;; Special case for `i16x8.extmul_high_i8x16_u`. (rule (lower (has_type (multi_lane 16 8) - (imul (def_inst (uwiden_high (and (value_type (multi_lane 8 16)) - x))) - (def_inst (uwiden_high (and (value_type (multi_lane 8 16)) - y)))))) - (let ((x1 Xmm (put_in_xmm x)) - (x2 Xmm (palignr x1 (xmm_to_xmm_mem x1) 8 (OperandSize.Size32))) - (x3 Xmm (pmovzxbw (xmm_to_xmm_mem x2))) - (y1 Xmm (put_in_xmm y)) - (y2 Xmm (palignr y1 (xmm_to_xmm_mem y1) 8 (OperandSize.Size32))) - (y3 Xmm (pmovzxbw (xmm_to_xmm_mem y2)))) - (value_xmm (pmullw x3 (xmm_to_xmm_mem y3))))) + (imul (uwiden_high (and (value_type (multi_lane 8 16)) + x)) + (uwiden_high (and (value_type (multi_lane 8 16)) + y))))) + (let ((x1 Xmm x) + (x2 Xmm (palignr x1 x1 8 (OperandSize.Size32))) + (x3 Xmm (pmovzxbw x2)) + (y1 Xmm y) + (y2 Xmm (palignr y1 y1 8 (OperandSize.Size32))) + (y3 Xmm (pmovzxbw y2))) + (pmullw x3 y3))) ;; Special case for `i32x4.extmul_high_i16x8_u`. (rule (lower (has_type (multi_lane 32 4) - (imul (def_inst (uwiden_high (and (value_type (multi_lane 16 8)) - x))) - (def_inst (uwiden_high (and (value_type (multi_lane 16 8)) - y)))))) - (let ((x2 Xmm (put_in_xmm x)) - (y2 Xmm (put_in_xmm y)) - (lo Xmm (pmullw x2 (xmm_to_xmm_mem y2))) - (hi Xmm (pmulhuw x2 (xmm_to_xmm_mem y2)))) - (value_xmm (punpckhwd lo (xmm_to_xmm_mem hi))))) + (imul (uwiden_high (and (value_type (multi_lane 16 8)) + x)) + (uwiden_high (and (value_type (multi_lane 16 8)) + y))))) + (let ((x2 Xmm x) + (y2 Xmm y) + (lo Xmm (pmullw x2 y2)) + (hi Xmm (pmulhuw x2 y2))) + (punpckhwd lo hi))) ;; Special case for `i64x2.extmul_high_i32x4_u`. (rule (lower (has_type (multi_lane 64 2) - (imul (def_inst (uwiden_high (and (value_type (multi_lane 32 4)) - x))) - (def_inst (uwiden_high (and (value_type (multi_lane 32 4)) - y)))))) - (let ((x2 Xmm (pshufd (put_in_xmm_mem x) + (imul (uwiden_high (and (value_type (multi_lane 32 4)) + x)) + (uwiden_high (and (value_type (multi_lane 32 4)) + y))))) + (let ((x2 Xmm (pshufd x 0xFA (OperandSize.Size32))) - (y2 Xmm (pshufd (put_in_xmm_mem y) + (y2 Xmm (pshufd y 0xFA (OperandSize.Size32)))) - (value_xmm (pmuludq x2 (xmm_to_xmm_mem y2))))) + (pmuludq x2 y2))) ;; Special case for `i16x8.extmul_low_i8x16_u`. (rule (lower (has_type (multi_lane 16 8) - (imul (def_inst (uwiden_low (and (value_type (multi_lane 8 16)) - x))) - (def_inst (uwiden_low (and (value_type (multi_lane 8 16)) - y)))))) - (let ((x2 Xmm (pmovzxbw (put_in_xmm_mem x))) - (y2 Xmm (pmovzxbw (put_in_xmm_mem y)))) - (value_xmm (pmullw x2 (xmm_to_xmm_mem y2))))) + (imul (uwiden_low (and (value_type (multi_lane 8 16)) + x)) + (uwiden_low (and (value_type (multi_lane 8 16)) + y))))) + (let ((x2 Xmm (pmovzxbw x)) + (y2 Xmm (pmovzxbw y))) + (pmullw x2 y2))) ;; Special case for `i32x4.extmul_low_i16x8_u`. (rule (lower (has_type (multi_lane 32 4) - (imul (def_inst (uwiden_low (and (value_type (multi_lane 16 8)) - x))) - (def_inst (uwiden_low (and (value_type (multi_lane 16 8)) - y)))))) - (let ((x2 Xmm (put_in_xmm x)) - (y2 Xmm (put_in_xmm y)) - (lo Xmm (pmullw x2 (xmm_to_xmm_mem y2))) - (hi Xmm (pmulhuw x2 (xmm_to_xmm_mem y2)))) - (value_xmm (punpcklwd lo (xmm_to_xmm_mem hi))))) + (imul (uwiden_low (and (value_type (multi_lane 16 8)) + x)) + (uwiden_low (and (value_type (multi_lane 16 8)) + y))))) + (let ((x2 Xmm x) + (y2 Xmm y) + (lo Xmm (pmullw x2 y2)) + (hi Xmm (pmulhuw x2 y2))) + (punpcklwd lo hi))) ;; Special case for `i64x2.extmul_low_i32x4_u`. (rule (lower (has_type (multi_lane 64 2) - (imul (def_inst (uwiden_low (and (value_type (multi_lane 32 4)) - x))) - (def_inst (uwiden_low (and (value_type (multi_lane 32 4)) - y)))))) - (let ((x2 Xmm (pshufd (put_in_xmm_mem x) + (imul (uwiden_low (and (value_type (multi_lane 32 4)) + x)) + (uwiden_low (and (value_type (multi_lane 32 4)) + y))))) + (let ((x2 Xmm (pshufd x 0x50 (OperandSize.Size32))) - (y2 Xmm (pshufd (put_in_xmm_mem y) + (y2 Xmm (pshufd y 0x50 (OperandSize.Size32)))) - (value_xmm (pmuludq x2 (xmm_to_xmm_mem y2))))) + (pmuludq x2 y2))) ;;;; Rules for `band_not` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1285,63 +1212,61 @@ ;; ;; pandn(x, y) = and(not(x), y) (rule (lower (has_type ty (band_not x y))) - (value_xmm (sse_and_not ty - (put_in_xmm y) - (put_in_xmm_mem x)))) + (sse_and_not ty y x)) ;;;; Rules for `iabs` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (rule (lower (has_type $I8X16 (iabs x))) - (value_xmm (pabsb (put_in_xmm_mem x)))) + (pabsb x)) (rule (lower (has_type $I16X8 (iabs x))) - (value_xmm (pabsw (put_in_xmm_mem x)))) + (pabsw x)) (rule (lower (has_type $I32X4 (iabs x))) - (value_xmm (pabsd (put_in_xmm_mem x)))) + (pabsd x)) ;; When AVX512 is available, we can use a single `vpabsq` instruction. (rule (lower (has_type (and (avx512vl_enabled) (avx512f_enabled) $I64X2) (iabs x))) - (value_xmm (vpabsq (put_in_xmm_mem x)))) + (vpabsq x)) -;; Otherwise, we use a separate xmmister, `neg`, to contain the results of `0 - +;; Otherwise, we use a separate register, `neg`, to contain the results of `0 - ;; x` and then blend in those results with `blendvpd` if the MSB of `neg` was ;; set to 1 (i.e. if `neg` was negative or, conversely, if `x` was originally ;; positive). (rule (lower (has_type $I64X2 (iabs x))) - (let ((rx Xmm (put_in_xmm x)) - (neg Xmm (psubq (xmm_new (imm $I64X2 0)) (xmm_to_xmm_mem rx)))) - (value_xmm (blendvpd neg (xmm_to_xmm_mem rx) neg)))) + (let ((rx Xmm x) + (neg Xmm (psubq (imm $I64X2 0) rx))) + (blendvpd neg rx neg))) ;;;; Rules for `fabs` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Special case for `f32x4.abs`. (rule (lower (has_type $F32X4 (fabs x))) - (value_xmm (andps (put_in_xmm x) - (xmm_to_xmm_mem (psrld (vector_all_ones $F32X4) - (xmm_mem_imm_new (RegMemImm.Imm 1))))))) + (andps x + (psrld (vector_all_ones $F32X4) + (RegMemImm.Imm 1)))) ;; Special case for `f64x2.abs`. (rule (lower (has_type $F64X2 (fabs x))) - (value_xmm (andpd (put_in_xmm x) - (xmm_to_xmm_mem (psrlq (vector_all_ones $F64X2) - (xmm_mem_imm_new (RegMemImm.Imm 1))))))) + (andpd x + (psrlq (vector_all_ones $F64X2) + (RegMemImm.Imm 1)))) ;;;; Rules for `bnot` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; `i64` and smaller. (rule (lower (has_type (fits_in_64 ty) (bnot x))) - (value_gpr (not ty (put_in_gpr x)))) + (not ty x)) ;; `i128`. (decl i128_not (Value) ValueRegs) (rule (i128_not x) - (let ((x_regs ValueRegs (put_in_regs x)) + (let ((x_regs ValueRegs x) (x_lo Gpr (value_regs_get_gpr x_regs 0)) (x_hi Gpr (value_regs_get_gpr x_regs 1))) (value_gprs (not $I64 x_lo) @@ -1356,7 +1281,7 @@ ;; Special case for vector-types where bit-negation is an xor against an ;; all-one value (rule (lower (has_type ty @ (multi_lane _bits _lanes) (bnot x))) - (value_xmm (sse_xor ty (put_in_xmm x) (xmm_to_xmm_mem (vector_all_ones ty))))) + (sse_xor ty x (vector_all_ones ty))) ;;;; Rules for `bitselect` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1367,24 +1292,24 @@ ;; a = and if_true, condition ;; b = and_not condition, if_false ;; or b, a - (let ((cond_xmm Xmm (put_in_xmm condition)) - (a Xmm (sse_and ty (put_in_xmm if_true) (xmm_to_xmm_mem cond_xmm))) - (b Xmm (sse_and_not ty cond_xmm (put_in_xmm_mem if_false)))) - (value_xmm (sse_or ty b (xmm_to_xmm_mem a))))) + (let ((cond_xmm Xmm condition) + (a Xmm (sse_and ty if_true cond_xmm)) + (b Xmm (sse_and_not ty cond_xmm if_false))) + (sse_or ty b a))) ;;;; Rules for `vselect` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (rule (lower (has_type ty @ (multi_lane _bits _lanes) (vselect condition if_true if_false))) - (value_xmm (sse_blend ty - (put_in_xmm_mem condition) - (put_in_xmm_mem if_true) - (put_in_xmm if_false)))) + (sse_blend ty + condition + if_true + if_false)) ;;;; Rules for `insertlane` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (rule (lower (insertlane vec @ (value_type ty) val (u8_from_uimm8 idx))) - (value_xmm (vec_insert_lane ty (put_in_xmm vec) (put_in_reg_mem val) idx))) + (vec_insert_lane ty vec val idx)) ;; Helper function used below for `insertlane` but also here for other ;; lowerings. @@ -1395,23 +1320,23 @@ ;; i8x16.replace_lane (rule (vec_insert_lane $I8X16 vec val idx) - (pinsrb vec (reg_mem_to_gpr_mem val) idx)) + (pinsrb vec val idx)) ;; i16x8.replace_lane (rule (vec_insert_lane $I16X8 vec val idx) - (pinsrw vec (reg_mem_to_gpr_mem val) idx)) + (pinsrw vec val idx)) ;; i32x4.replace_lane (rule (vec_insert_lane $I32X4 vec val idx) - (pinsrd vec (reg_mem_to_gpr_mem val) idx (OperandSize.Size32))) + (pinsrd vec val idx (OperandSize.Size32))) ;; i64x2.replace_lane (rule (vec_insert_lane $I64X2 vec val idx) - (pinsrd vec (reg_mem_to_gpr_mem val) idx (OperandSize.Size64))) + (pinsrd vec val idx (OperandSize.Size64))) ;; f32x4.replace_lane (rule (vec_insert_lane $F32X4 vec val idx) - (insertps vec (reg_mem_to_xmm_mem val) (sse_insertps_lane_imm idx))) + (insertps vec val (sse_insertps_lane_imm idx))) ;; External rust code used to calculate the immediate value to `insertps`. (decl sse_insertps_lane_imm (u8) u8) @@ -1433,10 +1358,10 @@ ;; internally as `xmm_rm_r` will merge the temp register into our `vec` ;; register. (rule (vec_insert_lane $F64X2 vec (RegMem.Reg val) 0) - (movsd vec (reg_mem_to_xmm_mem (RegMem.Reg val)))) + (movsd vec val)) (rule (vec_insert_lane $F64X2 vec mem 0) - (movsd vec (xmm_to_xmm_mem (xmm_unary_rm_r (SseOpcode.Movsd) - (reg_mem_to_xmm_mem mem))))) + (movsd vec (xmm_unary_rm_r (SseOpcode.Movsd) + mem))) ;; f64x2.replace_lane 1 ;; @@ -1452,11 +1377,11 @@ (decl cmp_and_choose (Type CC Value Value) ValueRegs) (rule (cmp_and_choose (fits_in_64 ty) cc x y) - (let ((x_reg Gpr (put_in_gpr x)) - (y_reg Gpr (put_in_gpr y)) + (let ((x_reg Gpr x) + (y_reg Gpr y) (size OperandSize (raw_operand_size_of_type ty))) - (value_reg (with_flags_reg (cmp size (gpr_to_gpr_mem_imm x_reg) y_reg) - (cmove ty cc (gpr_to_gpr_mem y_reg) x_reg))))) + (with_flags_reg (cmp size x_reg y_reg) + (cmove ty cc y_reg x_reg)))) (rule (lower (has_type (fits_in_64 ty) (umin x y))) (cmp_and_choose ty (CC.B) x y)) @@ -1473,46 +1398,46 @@ ;; SSE `imax`. (rule (lower (has_type $I8X16 (imax x y))) - (value_xmm (pmaxsb (put_in_xmm x) (put_in_xmm_mem y)))) + (pmaxsb x y)) (rule (lower (has_type $I16X8 (imax x y))) - (value_xmm (pmaxsw (put_in_xmm x) (put_in_xmm_mem y)))) + (pmaxsw x y)) (rule (lower (has_type $I32X4 (imax x y))) - (value_xmm (pmaxsd (put_in_xmm x) (put_in_xmm_mem y)))) + (pmaxsd x y)) ;; SSE `imin`. (rule (lower (has_type $I8X16 (imin x y))) - (value_xmm (pminsb (put_in_xmm x) (put_in_xmm_mem y)))) + (pminsb x y)) (rule (lower (has_type $I16X8 (imin x y))) - (value_xmm (pminsw (put_in_xmm x) (put_in_xmm_mem y)))) + (pminsw x y)) (rule (lower (has_type $I32X4 (imin x y))) - (value_xmm (pminsd (put_in_xmm x) (put_in_xmm_mem y)))) + (pminsd x y)) ;; SSE `umax`. (rule (lower (has_type $I8X16 (umax x y))) - (value_xmm (pmaxub (put_in_xmm x) (put_in_xmm_mem y)))) + (pmaxub x y)) (rule (lower (has_type $I16X8 (umax x y))) - (value_xmm (pmaxuw (put_in_xmm x) (put_in_xmm_mem y)))) + (pmaxuw x y)) (rule (lower (has_type $I32X4 (umax x y))) - (value_xmm (pmaxud (put_in_xmm x) (put_in_xmm_mem y)))) + (pmaxud x y)) ;; SSE `umin`. (rule (lower (has_type $I8X16 (umin x y))) - (value_xmm (pminub (put_in_xmm x) (put_in_xmm_mem y)))) + (pminub x y)) (rule (lower (has_type $I16X8 (umin x y))) - (value_xmm (pminuw (put_in_xmm x) (put_in_xmm_mem y)))) + (pminuw x y)) (rule (lower (has_type $I32X4 (umin x y))) - (value_xmm (pminud (put_in_xmm x) (put_in_xmm_mem y)))) + (pminud x y)) ;;;; Rules for `trap` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/cranelift/codegen/src/isa/x64/lower/isle/generated_code.manifest b/cranelift/codegen/src/isa/x64/lower/isle/generated_code.manifest index 09e64330c8..914dd1a3f8 100644 --- a/cranelift/codegen/src/isa/x64/lower/isle/generated_code.manifest +++ b/cranelift/codegen/src/isa/x64/lower/isle/generated_code.manifest @@ -1,4 +1,4 @@ src/clif.isle 9ea75a6f790b5c03 -src/prelude.isle 980b300b3ec3e338 -src/isa/x64/inst.isle ac88a0ae153ed210 -src/isa/x64/lower.isle 1ebdd4469355e2cf +src/prelude.isle 8bf92e18323e7041 +src/isa/x64/inst.isle 1948445a25530d71 +src/isa/x64/lower.isle d1ee574941be387 diff --git a/cranelift/codegen/src/isa/x64/lower/isle/generated_code.rs b/cranelift/codegen/src/isa/x64/lower/isle/generated_code.rs index 000e99dfa0..6f189d117e 100644 --- a/cranelift/codegen/src/isa/x64/lower/isle/generated_code.rs +++ b/cranelift/codegen/src/isa/x64/lower/isle/generated_code.rs @@ -487,7 +487,7 @@ pub enum MInst { }, } -/// Internal type ExtendKind: defined at src/isa/x64/inst.isle line 1118. +/// Internal type ExtendKind: defined at src/isa/x64/inst.isle line 1125. #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum ExtendKind { Sign, @@ -683,10 +683,19 @@ pub fn constructor_operand_size_bits(ctx: &mut C, arg0: &OperandSize return None; } +// Generated as internal constructor for term reg_to_gpr_mem_imm. +pub fn constructor_reg_to_gpr_mem_imm(ctx: &mut C, arg0: Reg) -> Option { + let pattern0_0 = arg0; + // Rule at src/isa/x64/inst.isle line 967. + let expr0_0 = C::gpr_new(ctx, pattern0_0); + let expr1_0 = C::gpr_to_gpr_mem_imm(ctx, expr0_0); + return Some(expr1_0); +} + // Generated as internal constructor for term put_in_gpr. pub fn constructor_put_in_gpr(ctx: &mut C, arg0: Value) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 967. + // Rule at src/isa/x64/inst.isle line 974. let expr0_0 = C::put_in_reg(ctx, pattern0_0); let expr1_0 = C::gpr_new(ctx, expr0_0); return Some(expr1_0); @@ -695,7 +704,7 @@ pub fn constructor_put_in_gpr(ctx: &mut C, arg0: Value) -> Option(ctx: &mut C, arg0: Value) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 974. + // Rule at src/isa/x64/inst.isle line 981. let expr0_0 = C::put_in_reg_mem(ctx, pattern0_0); let expr1_0 = C::reg_mem_to_gpr_mem(ctx, &expr0_0); return Some(expr1_0); @@ -704,7 +713,7 @@ pub fn constructor_put_in_gpr_mem(ctx: &mut C, arg0: Value) -> Optio // Generated as internal constructor for term put_in_gpr_mem_imm. pub fn constructor_put_in_gpr_mem_imm(ctx: &mut C, arg0: Value) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 981. + // Rule at src/isa/x64/inst.isle line 988. let expr0_0 = C::put_in_reg_mem_imm(ctx, pattern0_0); let expr1_0 = C::gpr_mem_imm_new(ctx, &expr0_0); return Some(expr1_0); @@ -713,7 +722,7 @@ pub fn constructor_put_in_gpr_mem_imm(ctx: &mut C, arg0: Value) -> O // Generated as internal constructor for term put_in_xmm. pub fn constructor_put_in_xmm(ctx: &mut C, arg0: Value) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 988. + // Rule at src/isa/x64/inst.isle line 995. let expr0_0 = C::put_in_reg(ctx, pattern0_0); let expr1_0 = C::xmm_new(ctx, expr0_0); return Some(expr1_0); @@ -722,7 +731,7 @@ pub fn constructor_put_in_xmm(ctx: &mut C, arg0: Value) -> Option(ctx: &mut C, arg0: Value) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 995. + // Rule at src/isa/x64/inst.isle line 1002. let expr0_0 = C::put_in_reg_mem(ctx, pattern0_0); let expr1_0 = C::reg_mem_to_xmm_mem(ctx, &expr0_0); return Some(expr1_0); @@ -731,7 +740,7 @@ pub fn constructor_put_in_xmm_mem(ctx: &mut C, arg0: Value) -> Optio // Generated as internal constructor for term put_in_xmm_mem_imm. pub fn constructor_put_in_xmm_mem_imm(ctx: &mut C, arg0: Value) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1002. + // Rule at src/isa/x64/inst.isle line 1009. let expr0_0 = C::put_in_reg_mem_imm(ctx, pattern0_0); let expr1_0 = C::xmm_mem_imm_new(ctx, &expr0_0); return Some(expr1_0); @@ -740,7 +749,7 @@ pub fn constructor_put_in_xmm_mem_imm(ctx: &mut C, arg0: Value) -> O // Generated as internal constructor for term value_gpr. pub fn constructor_value_gpr(ctx: &mut C, arg0: Gpr) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1007. + // Rule at src/isa/x64/inst.isle line 1014. let expr0_0 = C::gpr_to_reg(ctx, pattern0_0); let expr1_0 = C::value_reg(ctx, expr0_0); return Some(expr1_0); @@ -750,7 +759,7 @@ pub fn constructor_value_gpr(ctx: &mut C, arg0: Gpr) -> Option(ctx: &mut C, arg0: Gpr, arg1: Gpr) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1012. + // Rule at src/isa/x64/inst.isle line 1019. let expr0_0 = C::gpr_to_reg(ctx, pattern0_0); let expr1_0 = C::gpr_to_reg(ctx, pattern1_0); let expr2_0 = C::value_regs(ctx, expr0_0, expr1_0); @@ -760,7 +769,7 @@ pub fn constructor_value_gprs(ctx: &mut C, arg0: Gpr, arg1: Gpr) -> // Generated as internal constructor for term value_xmm. pub fn constructor_value_xmm(ctx: &mut C, arg0: Xmm) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1017. + // Rule at src/isa/x64/inst.isle line 1024. let expr0_0 = C::xmm_to_reg(ctx, pattern0_0); let expr1_0 = C::value_reg(ctx, expr0_0); return Some(expr1_0); @@ -774,7 +783,7 @@ pub fn constructor_value_regs_get_gpr( ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1024. + // Rule at src/isa/x64/inst.isle line 1031. let expr0_0 = C::value_regs_get(ctx, pattern0_0, pattern1_0); let expr1_0 = C::gpr_new(ctx, expr0_0); return Some(expr1_0); @@ -783,7 +792,7 @@ pub fn constructor_value_regs_get_gpr( // Generated as internal constructor for term lo_gpr. pub fn constructor_lo_gpr(ctx: &mut C, arg0: Value) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1037. + // Rule at src/isa/x64/inst.isle line 1044. let expr0_0 = constructor_lo_reg(ctx, pattern0_0)?; let expr1_0 = C::gpr_new(ctx, expr0_0); return Some(expr1_0); @@ -795,7 +804,7 @@ pub fn constructor_sink_load_to_gpr_mem_imm( arg0: &SinkableLoad, ) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1108. + // Rule at src/isa/x64/inst.isle line 1115. let expr0_0 = C::sink_load(ctx, pattern0_0); let expr1_0 = C::gpr_mem_imm_new(ctx, &expr0_0); return Some(expr1_0); @@ -813,12 +822,12 @@ pub fn constructor_extend_to_gpr( let pattern2_0 = arg1; if pattern2_0 == pattern1_0 { let pattern4_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1130. + // Rule at src/isa/x64/inst.isle line 1137. let expr0_0 = constructor_put_in_gpr(ctx, pattern0_0)?; return Some(expr0_0); } let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1133. + // Rule at src/isa/x64/inst.isle line 1140. let expr0_0 = C::ty_bits_u16(ctx, pattern1_0); let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern2_0); let expr2_0 = constructor_operand_size_bits(ctx, &expr1_0)?; @@ -842,7 +851,7 @@ pub fn constructor_extend( let pattern2_0 = arg1; let pattern3_0 = arg2; let pattern4_0 = arg3; - // Rule at src/isa/x64/inst.isle line 1153. + // Rule at src/isa/x64/inst.isle line 1160. let expr0_0 = constructor_movsx(ctx, pattern2_0, pattern3_0, pattern4_0)?; return Some(expr0_0); } @@ -850,7 +859,7 @@ pub fn constructor_extend( let pattern2_0 = arg1; let pattern3_0 = arg2; let pattern4_0 = arg3; - // Rule at src/isa/x64/inst.isle line 1149. + // Rule at src/isa/x64/inst.isle line 1156. let expr0_0 = constructor_movzx(ctx, pattern2_0, pattern3_0, pattern4_0)?; return Some(expr0_0); } @@ -863,17 +872,17 @@ pub fn constructor_extend( pub fn constructor_sse_xor_op(ctx: &mut C, arg0: Type) -> Option { let pattern0_0 = arg0; if pattern0_0 == F32X4 { - // Rule at src/isa/x64/inst.isle line 1160. + // Rule at src/isa/x64/inst.isle line 1167. let expr0_0 = SseOpcode::Xorps; return Some(expr0_0); } if pattern0_0 == F64X2 { - // Rule at src/isa/x64/inst.isle line 1161. + // Rule at src/isa/x64/inst.isle line 1168. let expr0_0 = SseOpcode::Xorpd; return Some(expr0_0); } if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - // Rule at src/isa/x64/inst.isle line 1162. + // Rule at src/isa/x64/inst.isle line 1169. let expr0_0 = SseOpcode::Pxor; return Some(expr0_0); } @@ -890,7 +899,7 @@ pub fn constructor_sse_xor( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1166. + // Rule at src/isa/x64/inst.isle line 1173. let expr0_0 = constructor_sse_xor_op(ctx, pattern0_0)?; let expr1_0 = constructor_xmm_rm_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -900,40 +909,40 @@ pub fn constructor_sse_xor( pub fn constructor_sse_cmp_op(ctx: &mut C, arg0: Type) -> Option { let pattern0_0 = arg0; if pattern0_0 == F32X4 { - // Rule at src/isa/x64/inst.isle line 1175. + // Rule at src/isa/x64/inst.isle line 1182. let expr0_0 = SseOpcode::Cmpps; return Some(expr0_0); } if pattern0_0 == F64X2 { - // Rule at src/isa/x64/inst.isle line 1176. + // Rule at src/isa/x64/inst.isle line 1183. let expr0_0 = SseOpcode::Cmppd; return Some(expr0_0); } if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { if pattern1_0 == 8 { if pattern1_1 == 16 { - // Rule at src/isa/x64/inst.isle line 1171. + // Rule at src/isa/x64/inst.isle line 1178. let expr0_0 = SseOpcode::Pcmpeqb; return Some(expr0_0); } } if pattern1_0 == 16 { if pattern1_1 == 8 { - // Rule at src/isa/x64/inst.isle line 1172. + // Rule at src/isa/x64/inst.isle line 1179. let expr0_0 = SseOpcode::Pcmpeqw; return Some(expr0_0); } } if pattern1_0 == 32 { if pattern1_1 == 4 { - // Rule at src/isa/x64/inst.isle line 1173. + // Rule at src/isa/x64/inst.isle line 1180. let expr0_0 = SseOpcode::Pcmpeqd; return Some(expr0_0); } } if pattern1_0 == 64 { if pattern1_1 == 2 { - // Rule at src/isa/x64/inst.isle line 1174. + // Rule at src/isa/x64/inst.isle line 1181. let expr0_0 = SseOpcode::Pcmpeqq; return Some(expr0_0); } @@ -945,20 +954,21 @@ pub fn constructor_sse_cmp_op(ctx: &mut C, arg0: Type) -> Option(ctx: &mut C, arg0: Type) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1190. + // Rule at src/isa/x64/inst.isle line 1197. let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - let expr2_0: Type = I32X4; - let expr3_0 = constructor_sse_cmp_op(ctx, expr2_0)?; - let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0); + let expr1_0: Type = I32X4; + let expr2_0 = constructor_sse_cmp_op(ctx, expr1_0)?; + let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); + let expr4_0 = constructor_writable_xmm_to_xmm_mem(ctx, expr0_0)?; let expr5_0 = MInst::XmmRmR { - op: expr3_0, - src1: expr1_0, + op: expr2_0, + src1: expr3_0, src2: expr4_0, dst: expr0_0, }; let expr6_0 = C::emit(ctx, &expr5_0); - return Some(expr1_0); + let expr7_0 = C::writable_xmm_to_xmm(ctx, expr0_0); + return Some(expr7_0); } // Generated as internal constructor for term make_i64x2_from_lanes. @@ -969,40 +979,41 @@ pub fn constructor_make_i64x2_from_lanes( ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1201. + // Rule at src/isa/x64/inst.isle line 1207. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = C::writable_xmm_to_reg(ctx, expr0_0); - let expr2_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - let expr3_0 = C::xmm_to_reg(ctx, expr2_0); - let expr4_0 = MInst::XmmUninitializedValue { dst: expr0_0 }; - let expr5_0 = C::emit(ctx, &expr4_0); - let expr6_0 = SseOpcode::Pinsrd; - let expr7_0 = C::gpr_mem_to_reg_mem(ctx, pattern0_0); - let expr8_0: u8 = 0; - let expr9_0 = OperandSize::Size64; - let expr10_0 = MInst::XmmRmRImm { - op: expr6_0, - src1: expr3_0, - src2: expr7_0, + let expr2_0 = MInst::XmmUninitializedValue { dst: expr0_0 }; + let expr3_0 = C::emit(ctx, &expr2_0); + let expr4_0 = SseOpcode::Pinsrd; + let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0); + let expr6_0 = C::gpr_mem_to_reg_mem(ctx, pattern0_0); + let expr7_0: u8 = 0; + let expr8_0 = OperandSize::Size64; + let expr9_0 = MInst::XmmRmRImm { + op: expr4_0, + src1: expr5_0, + src2: expr6_0, dst: expr1_0, - imm: expr8_0, - size: expr9_0, + imm: expr7_0, + size: expr8_0, }; - let expr11_0 = C::emit(ctx, &expr10_0); - let expr12_0 = SseOpcode::Pinsrd; + let expr10_0 = C::emit(ctx, &expr9_0); + let expr11_0 = SseOpcode::Pinsrd; + let expr12_0 = C::writable_reg_to_reg(ctx, expr1_0); let expr13_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0); let expr14_0: u8 = 1; let expr15_0 = OperandSize::Size64; let expr16_0 = MInst::XmmRmRImm { - op: expr12_0, - src1: expr3_0, + op: expr11_0, + src1: expr12_0, src2: expr13_0, dst: expr1_0, imm: expr14_0, size: expr15_0, }; let expr17_0 = C::emit(ctx, &expr16_0); - return Some(expr2_0); + let expr18_0 = C::writable_xmm_to_xmm(ctx, expr0_0); + return Some(expr18_0); } // Generated as internal constructor for term mov_rmi_to_xmm. @@ -1010,12 +1021,12 @@ pub fn constructor_mov_rmi_to_xmm(ctx: &mut C, arg0: &RegMemImm) -> let pattern0_0 = arg0; match pattern0_0 { &RegMemImm::Imm { simm32: pattern1_0 } => { - // Rule at src/isa/x64/inst.isle line 1224. + // Rule at src/isa/x64/inst.isle line 1228. let expr0_0 = C::xmm_mem_imm_new(ctx, pattern0_0); return Some(expr0_0); } &RegMemImm::Reg { reg: pattern1_0 } => { - // Rule at src/isa/x64/inst.isle line 1225. + // Rule at src/isa/x64/inst.isle line 1229. let expr0_0 = SseOpcode::Movd; let expr1_0 = C::reg_to_gpr_mem(ctx, pattern1_0); let expr2_0 = OperandSize::Size32; @@ -1026,7 +1037,7 @@ pub fn constructor_mov_rmi_to_xmm(ctx: &mut C, arg0: &RegMemImm) -> &RegMemImm::Mem { addr: ref pattern1_0, } => { - // Rule at src/isa/x64/inst.isle line 1223. + // Rule at src/isa/x64/inst.isle line 1227. let expr0_0 = C::xmm_mem_imm_new(ctx, pattern0_0); return Some(expr0_0); } @@ -1046,85 +1057,78 @@ pub fn constructor_x64_load( if pattern0_0 == I64 { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1240. + // Rule at src/isa/x64/inst.isle line 1244. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = MInst::Mov64MR { src: pattern2_0.clone(), dst: expr0_0, }; let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - let expr4_0 = C::gpr_to_reg(ctx, expr3_0); - return Some(expr4_0); + let expr3_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; + return Some(expr3_0); } if pattern0_0 == F32 { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1245. + // Rule at src/isa/x64/inst.isle line 1249. let expr0_0 = SseOpcode::Movss; - let expr1_0 = C::synthetic_amode_to_reg_mem(ctx, pattern2_0); - let expr2_0 = C::reg_mem_to_xmm_mem(ctx, &expr1_0); - let expr3_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr2_0)?; - let expr4_0 = C::xmm_to_reg(ctx, expr3_0); - return Some(expr4_0); + let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0)?; + let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?; + let expr3_0 = C::xmm_to_reg(ctx, expr2_0); + return Some(expr3_0); } if pattern0_0 == F64 { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1249. + // Rule at src/isa/x64/inst.isle line 1253. let expr0_0 = SseOpcode::Movsd; - let expr1_0 = C::synthetic_amode_to_reg_mem(ctx, pattern2_0); - let expr2_0 = C::reg_mem_to_xmm_mem(ctx, &expr1_0); - let expr3_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr2_0)?; - let expr4_0 = C::xmm_to_reg(ctx, expr3_0); - return Some(expr4_0); + let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0)?; + let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?; + let expr3_0 = C::xmm_to_reg(ctx, expr2_0); + return Some(expr3_0); } if pattern0_0 == F32X4 { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1253. + // Rule at src/isa/x64/inst.isle line 1257. let expr0_0 = SseOpcode::Movups; - let expr1_0 = C::synthetic_amode_to_reg_mem(ctx, pattern2_0); - let expr2_0 = C::reg_mem_to_xmm_mem(ctx, &expr1_0); - let expr3_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr2_0)?; - let expr4_0 = C::xmm_to_reg(ctx, expr3_0); - return Some(expr4_0); + let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0)?; + let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?; + let expr3_0 = C::xmm_to_reg(ctx, expr2_0); + return Some(expr3_0); } if pattern0_0 == F64X2 { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1257. + // Rule at src/isa/x64/inst.isle line 1261. let expr0_0 = SseOpcode::Movupd; - let expr1_0 = C::synthetic_amode_to_reg_mem(ctx, pattern2_0); - let expr2_0 = C::reg_mem_to_xmm_mem(ctx, &expr1_0); - let expr3_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr2_0)?; - let expr4_0 = C::xmm_to_reg(ctx, expr3_0); - return Some(expr4_0); + let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0)?; + let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?; + let expr3_0 = C::xmm_to_reg(ctx, expr2_0); + return Some(expr3_0); } if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1261. + // Rule at src/isa/x64/inst.isle line 1265. let expr0_0 = SseOpcode::Movdqu; - let expr1_0 = C::synthetic_amode_to_reg_mem(ctx, pattern2_0); - let expr2_0 = C::reg_mem_to_xmm_mem(ctx, &expr1_0); - let expr3_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr2_0)?; - let expr4_0 = C::xmm_to_reg(ctx, expr3_0); - return Some(expr4_0); + let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0)?; + let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?; + let expr3_0 = C::xmm_to_reg(ctx, expr2_0); + return Some(expr3_0); } if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) { let pattern2_0 = arg1; let pattern3_0 = arg2; if let &ExtKind::SignExtend = pattern3_0 { - // Rule at src/isa/x64/inst.isle line 1235. + // Rule at src/isa/x64/inst.isle line 1239. let expr0_0 = C::ty_bytes(ctx, pattern1_0); let expr1_0: u16 = 8; let expr2_0 = C::ext_mode(ctx, expr0_0, expr1_0); - let expr3_0 = C::synthetic_amode_to_reg_mem(ctx, pattern2_0); - let expr4_0 = C::reg_mem_to_gpr_mem(ctx, &expr3_0); - let expr5_0 = constructor_movsx(ctx, pattern1_0, &expr2_0, &expr4_0)?; - let expr6_0 = C::gpr_to_reg(ctx, expr5_0); - return Some(expr6_0); + let expr3_0 = constructor_synthetic_amode_to_gpr_mem(ctx, pattern2_0)?; + let expr4_0 = constructor_movsx(ctx, pattern1_0, &expr2_0, &expr3_0)?; + let expr5_0 = C::gpr_to_reg(ctx, expr4_0); + return Some(expr5_0); } } return None; @@ -1142,7 +1146,7 @@ pub fn constructor_alu_rmi_r( let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 1273. + // Rule at src/isa/x64/inst.isle line 1277. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); let expr2_0 = MInst::AluRmiR { @@ -1167,7 +1171,7 @@ pub fn constructor_add( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1281. + // Rule at src/isa/x64/inst.isle line 1285. let expr0_0 = AluRmiROpcode::Add; let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1183,7 +1187,7 @@ pub fn constructor_add_with_flags_paired( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1289. + // Rule at src/isa/x64/inst.isle line 1293. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); let expr2_0 = AluRmiROpcode::Add; @@ -1194,13 +1198,12 @@ pub fn constructor_add_with_flags_paired( src2: pattern2_0.clone(), dst: expr0_0, }; - let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - let expr5_0 = C::gpr_to_reg(ctx, expr4_0); - let expr6_0 = ProducesFlags::ProducesFlagsReturnsResultWithConsumer { + let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; + let expr5_0 = ProducesFlags::ProducesFlagsReturnsResultWithConsumer { inst: expr3_0, - result: expr5_0, + result: expr4_0, }; - return Some(expr6_0); + return Some(expr5_0); } // Generated as internal constructor for term adc_paired. @@ -1213,7 +1216,7 @@ pub fn constructor_adc_paired( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1301. + // Rule at src/isa/x64/inst.isle line 1305. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); let expr2_0 = AluRmiROpcode::Adc; @@ -1224,13 +1227,12 @@ pub fn constructor_adc_paired( src2: pattern2_0.clone(), dst: expr0_0, }; - let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - let expr5_0 = C::gpr_to_reg(ctx, expr4_0); - let expr6_0 = ConsumesFlags::ConsumesFlagsReturnsResultWithProducer { + let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; + let expr5_0 = ConsumesFlags::ConsumesFlagsReturnsResultWithProducer { inst: expr3_0, - result: expr5_0, + result: expr4_0, }; - return Some(expr6_0); + return Some(expr5_0); } // Generated as internal constructor for term sub. @@ -1243,7 +1245,7 @@ pub fn constructor_sub( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1313. + // Rule at src/isa/x64/inst.isle line 1317. let expr0_0 = AluRmiROpcode::Sub; let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1259,7 +1261,7 @@ pub fn constructor_sub_with_flags_paired( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1321. + // Rule at src/isa/x64/inst.isle line 1325. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); let expr2_0 = AluRmiROpcode::Sub; @@ -1270,13 +1272,12 @@ pub fn constructor_sub_with_flags_paired( src2: pattern2_0.clone(), dst: expr0_0, }; - let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - let expr5_0 = C::gpr_to_reg(ctx, expr4_0); - let expr6_0 = ProducesFlags::ProducesFlagsReturnsResultWithConsumer { + let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; + let expr5_0 = ProducesFlags::ProducesFlagsReturnsResultWithConsumer { inst: expr3_0, - result: expr5_0, + result: expr4_0, }; - return Some(expr6_0); + return Some(expr5_0); } // Generated as internal constructor for term sbb_paired. @@ -1289,7 +1290,7 @@ pub fn constructor_sbb_paired( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1333. + // Rule at src/isa/x64/inst.isle line 1337. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); let expr2_0 = AluRmiROpcode::Sbb; @@ -1300,13 +1301,12 @@ pub fn constructor_sbb_paired( src2: pattern2_0.clone(), dst: expr0_0, }; - let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - let expr5_0 = C::gpr_to_reg(ctx, expr4_0); - let expr6_0 = ConsumesFlags::ConsumesFlagsReturnsResultWithProducer { + let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; + let expr5_0 = ConsumesFlags::ConsumesFlagsReturnsResultWithProducer { inst: expr3_0, - result: expr5_0, + result: expr4_0, }; - return Some(expr6_0); + return Some(expr5_0); } // Generated as internal constructor for term mul. @@ -1319,7 +1319,7 @@ pub fn constructor_mul( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1345. + // Rule at src/isa/x64/inst.isle line 1349. let expr0_0 = AluRmiROpcode::Mul; let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1335,7 +1335,7 @@ pub fn constructor_x64_and( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1353. + // Rule at src/isa/x64/inst.isle line 1357. let expr0_0 = AluRmiROpcode::And; let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1351,7 +1351,7 @@ pub fn constructor_or( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1361. + // Rule at src/isa/x64/inst.isle line 1365. let expr0_0 = AluRmiROpcode::Or; let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1367,7 +1367,7 @@ pub fn constructor_xor( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1369. + // Rule at src/isa/x64/inst.isle line 1373. let expr0_0 = AluRmiROpcode::Xor; let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1379,7 +1379,7 @@ pub fn constructor_imm(ctx: &mut C, arg0: Type, arg1: u64) -> Option if pattern0_0 == I64 { let pattern2_0 = arg1; if let Some(pattern3_0) = C::nonzero_u64_fits_in_u32(ctx, pattern2_0) { - // Rule at src/isa/x64/inst.isle line 1402. + // Rule at src/isa/x64/inst.isle line 1406. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = OperandSize::Size32; let expr2_0 = MInst::Imm { @@ -1388,15 +1388,14 @@ pub fn constructor_imm(ctx: &mut C, arg0: Type, arg1: u64) -> Option dst: expr0_0, }; let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - let expr5_0 = C::gpr_to_reg(ctx, expr4_0); - return Some(expr5_0); + let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; + return Some(expr4_0); } } if pattern0_0 == F32 { let pattern2_0 = arg1; if pattern2_0 == 0 { - // Rule at src/isa/x64/inst.isle line 1431. + // Rule at src/isa/x64/inst.isle line 1435. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0); let expr2_0 = SseOpcode::Xorps; @@ -1411,21 +1410,20 @@ pub fn constructor_imm(ctx: &mut C, arg0: Type, arg1: u64) -> Option let expr6_0 = C::xmm_to_reg(ctx, expr1_0); return Some(expr6_0); } - // Rule at src/isa/x64/inst.isle line 1386. + // Rule at src/isa/x64/inst.isle line 1390. let expr0_0 = SseOpcode::Movd; let expr1_0: Type = I32; let expr2_0 = constructor_imm(ctx, expr1_0, pattern2_0)?; - let expr3_0 = RegMem::Reg { reg: expr2_0 }; - let expr4_0 = C::reg_mem_to_gpr_mem(ctx, &expr3_0); - let expr5_0 = OperandSize::Size32; - let expr6_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr4_0, &expr5_0)?; - let expr7_0 = C::xmm_to_reg(ctx, expr6_0); - return Some(expr7_0); + let expr3_0 = C::reg_to_gpr_mem(ctx, expr2_0); + let expr4_0 = OperandSize::Size32; + let expr5_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr3_0, &expr4_0)?; + let expr6_0 = C::xmm_to_reg(ctx, expr5_0); + return Some(expr6_0); } if pattern0_0 == F64 { let pattern2_0 = arg1; if pattern2_0 == 0 { - // Rule at src/isa/x64/inst.isle line 1443. + // Rule at src/isa/x64/inst.isle line 1447. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0); let expr2_0 = SseOpcode::Xorpd; @@ -1440,21 +1438,20 @@ pub fn constructor_imm(ctx: &mut C, arg0: Type, arg1: u64) -> Option let expr6_0 = C::xmm_to_reg(ctx, expr1_0); return Some(expr6_0); } - // Rule at src/isa/x64/inst.isle line 1392. + // Rule at src/isa/x64/inst.isle line 1396. let expr0_0 = SseOpcode::Movq; let expr1_0: Type = I64; let expr2_0 = constructor_imm(ctx, expr1_0, pattern2_0)?; - let expr3_0 = RegMem::Reg { reg: expr2_0 }; - let expr4_0 = C::reg_mem_to_gpr_mem(ctx, &expr3_0); - let expr5_0 = OperandSize::Size64; - let expr6_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr4_0, &expr5_0)?; - let expr7_0 = C::xmm_to_reg(ctx, expr6_0); - return Some(expr7_0); + let expr3_0 = C::reg_to_gpr_mem(ctx, expr2_0); + let expr4_0 = OperandSize::Size64; + let expr5_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr3_0, &expr4_0)?; + let expr6_0 = C::xmm_to_reg(ctx, expr5_0); + return Some(expr6_0); } if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { let pattern2_0 = arg1; if pattern2_0 == 0 { - // Rule at src/isa/x64/inst.isle line 1421. + // Rule at src/isa/x64/inst.isle line 1425. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0); let expr2_0 = constructor_sse_xor_op(ctx, pattern0_0)?; @@ -1473,7 +1470,7 @@ pub fn constructor_imm(ctx: &mut C, arg0: Type, arg1: u64) -> Option if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { let pattern2_0 = arg1; if pattern2_0 == 0 { - // Rule at src/isa/x64/inst.isle line 1408. + // Rule at src/isa/x64/inst.isle line 1412. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0); let expr2_0 = C::operand_size_of_type_32_64(ctx, pattern1_0); @@ -1490,7 +1487,7 @@ pub fn constructor_imm(ctx: &mut C, arg0: Type, arg1: u64) -> Option let expr7_0 = C::gpr_to_reg(ctx, expr1_0); return Some(expr7_0); } - // Rule at src/isa/x64/inst.isle line 1379. + // Rule at src/isa/x64/inst.isle line 1383. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern1_0); let expr2_0 = MInst::Imm { @@ -1499,9 +1496,8 @@ pub fn constructor_imm(ctx: &mut C, arg0: Type, arg1: u64) -> Option dst: expr0_0, }; let expr3_0 = C::emit(ctx, &expr2_0); - let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - let expr5_0 = C::gpr_to_reg(ctx, expr4_0); - return Some(expr5_0); + let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; + return Some(expr4_0); } return None; } @@ -1518,7 +1514,7 @@ pub fn constructor_shift_r( let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 1456. + // Rule at src/isa/x64/inst.isle line 1460. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = C::raw_operand_size_of_type(ctx, pattern0_0); let expr2_0 = MInst::ShiftR { @@ -1543,7 +1539,7 @@ pub fn constructor_x64_rotl( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1466. + // Rule at src/isa/x64/inst.isle line 1470. let expr0_0 = ShiftKind::RotateLeft; let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1559,7 +1555,7 @@ pub fn constructor_x64_rotr( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1471. + // Rule at src/isa/x64/inst.isle line 1475. let expr0_0 = ShiftKind::RotateRight; let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1575,7 +1571,7 @@ pub fn constructor_shl( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1476. + // Rule at src/isa/x64/inst.isle line 1480. let expr0_0 = ShiftKind::ShiftLeft; let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1591,7 +1587,7 @@ pub fn constructor_shr( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1481. + // Rule at src/isa/x64/inst.isle line 1485. let expr0_0 = ShiftKind::ShiftRightLogical; let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1607,7 +1603,7 @@ pub fn constructor_sar( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1486. + // Rule at src/isa/x64/inst.isle line 1490. let expr0_0 = ShiftKind::ShiftRightArithmetic; let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1625,7 +1621,7 @@ pub fn constructor_cmp_rmi_r( let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 1491. + // Rule at src/isa/x64/inst.isle line 1495. let expr0_0 = MInst::CmpRmiR { size: pattern0_0.clone(), opcode: pattern1_0.clone(), @@ -1646,7 +1642,7 @@ pub fn constructor_cmp( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1500. + // Rule at src/isa/x64/inst.isle line 1504. let expr0_0 = CmpOpcode::Cmp; let expr1_0 = constructor_cmp_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1662,7 +1658,7 @@ pub fn constructor_xmm_cmp_rm_r( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1505. + // Rule at src/isa/x64/inst.isle line 1509. let expr0_0 = MInst::XmmCmpRmR { op: pattern0_0.clone(), src: pattern1_0.clone(), @@ -1682,7 +1678,7 @@ pub fn constructor_fpcmp( let pattern1_0 = C::value_type(ctx, pattern0_0); if pattern1_0 == F32 { let pattern3_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1512. + // Rule at src/isa/x64/inst.isle line 1516. let expr0_0 = SseOpcode::Ucomiss; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern0_0)?; let expr2_0 = constructor_put_in_xmm(ctx, pattern3_0)?; @@ -1691,7 +1687,7 @@ pub fn constructor_fpcmp( } if pattern1_0 == F64 { let pattern3_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1514. + // Rule at src/isa/x64/inst.isle line 1518. let expr0_0 = SseOpcode::Ucomisd; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern0_0)?; let expr2_0 = constructor_put_in_xmm(ctx, pattern3_0)?; @@ -1711,7 +1707,7 @@ pub fn constructor_test( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1519. + // Rule at src/isa/x64/inst.isle line 1523. let expr0_0 = CmpOpcode::Test; let expr1_0 = constructor_cmp_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1729,7 +1725,7 @@ pub fn constructor_cmove( let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 1526. + // Rule at src/isa/x64/inst.isle line 1530. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); let expr2_0 = MInst::Cmove { @@ -1739,13 +1735,12 @@ pub fn constructor_cmove( alternative: pattern3_0, dst: expr0_0, }; - let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - let expr4_0 = C::gpr_to_reg(ctx, expr3_0); - let expr5_0 = ConsumesFlags::ConsumesFlagsReturnsReg { + let expr3_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; + let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsReg { inst: expr2_0, - result: expr4_0, + result: expr3_0, }; - return Some(expr5_0); + return Some(expr4_0); } // Generated as internal constructor for term cmove_xmm. @@ -1760,7 +1755,7 @@ pub fn constructor_cmove_xmm( let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 1534. + // Rule at src/isa/x64/inst.isle line 1538. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); let expr2_0 = MInst::XmmCmove { @@ -1770,13 +1765,12 @@ pub fn constructor_cmove_xmm( alternative: pattern3_0, dst: expr0_0, }; - let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - let expr4_0 = C::xmm_to_reg(ctx, expr3_0); - let expr5_0 = ConsumesFlags::ConsumesFlagsReturnsReg { + let expr3_0 = constructor_writable_xmm_to_r_reg(ctx, expr0_0)?; + let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsReg { inst: expr2_0, - result: expr4_0, + result: expr3_0, }; - return Some(expr5_0); + return Some(expr4_0); } // Generated as internal constructor for term cmove_from_values. @@ -1792,7 +1786,7 @@ pub fn constructor_cmove_from_values( let pattern2_0 = arg1; let pattern3_0 = arg2; let pattern4_0 = arg3; - // Rule at src/isa/x64/inst.isle line 1545. + // Rule at src/isa/x64/inst.isle line 1549. let expr0_0 = C::put_in_regs(ctx, pattern3_0); let expr1_0 = C::put_in_regs(ctx, pattern4_0); let expr2_0 = C::temp_writable_gpr(ctx); @@ -1822,24 +1816,22 @@ pub fn constructor_cmove_from_values( alternative: expr15_0, dst: expr3_0, }; - let expr17_0 = C::writable_gpr_to_gpr(ctx, expr2_0); - let expr18_0 = C::gpr_to_reg(ctx, expr17_0); - let expr19_0 = C::writable_gpr_to_gpr(ctx, expr3_0); - let expr20_0 = C::gpr_to_reg(ctx, expr19_0); - let expr21_0 = C::value_regs(ctx, expr18_0, expr20_0); - let expr22_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { + let expr17_0 = constructor_writable_gpr_to_r_reg(ctx, expr2_0)?; + let expr18_0 = constructor_writable_gpr_to_r_reg(ctx, expr3_0)?; + let expr19_0 = C::value_regs(ctx, expr17_0, expr18_0); + let expr20_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { inst1: expr10_0, inst2: expr16_0, - result: expr21_0, + result: expr19_0, }; - return Some(expr22_0); + return Some(expr20_0); } if let Some(pattern1_0) = C::is_xmm_type(ctx, pattern0_0) { if let Some(pattern2_0) = C::is_single_register_type(ctx, pattern1_0) { let pattern3_0 = arg1; let pattern4_0 = arg2; let pattern5_0 = arg3; - // Rule at src/isa/x64/inst.isle line 1569. + // Rule at src/isa/x64/inst.isle line 1573. let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern5_0)?; let expr2_0 = constructor_cmove_xmm(ctx, pattern2_0, pattern3_0, &expr0_0, expr1_0)?; @@ -1851,7 +1843,7 @@ pub fn constructor_cmove_from_values( let pattern3_0 = arg1; let pattern4_0 = arg2; let pattern5_0 = arg3; - // Rule at src/isa/x64/inst.isle line 1566. + // Rule at src/isa/x64/inst.isle line 1570. let expr0_0 = constructor_put_in_gpr_mem(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_gpr(ctx, pattern5_0)?; let expr2_0 = constructor_cmove(ctx, pattern2_0, pattern3_0, &expr0_0, expr1_0)?; @@ -1875,7 +1867,7 @@ pub fn constructor_cmove_or( let pattern2_0 = arg2; let pattern3_0 = arg3; let pattern4_0 = arg4; - // Rule at src/isa/x64/inst.isle line 1576. + // Rule at src/isa/x64/inst.isle line 1580. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); let expr2_0 = MInst::CmoveOr { @@ -1886,13 +1878,12 @@ pub fn constructor_cmove_or( alternative: pattern4_0, dst: expr0_0, }; - let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - let expr4_0 = C::gpr_to_reg(ctx, expr3_0); - let expr5_0 = ConsumesFlags::ConsumesFlagsReturnsReg { + let expr3_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; + let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsReg { inst: expr2_0, - result: expr4_0, + result: expr3_0, }; - return Some(expr5_0); + return Some(expr4_0); } // Generated as internal constructor for term cmove_or_xmm. @@ -1909,7 +1900,7 @@ pub fn constructor_cmove_or_xmm( let pattern2_0 = arg2; let pattern3_0 = arg3; let pattern4_0 = arg4; - // Rule at src/isa/x64/inst.isle line 1584. + // Rule at src/isa/x64/inst.isle line 1588. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); let expr2_0 = MInst::XmmCmoveOr { @@ -1920,13 +1911,12 @@ pub fn constructor_cmove_or_xmm( alternative: pattern4_0, dst: expr0_0, }; - let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - let expr4_0 = C::xmm_to_reg(ctx, expr3_0); - let expr5_0 = ConsumesFlags::ConsumesFlagsReturnsReg { + let expr3_0 = constructor_writable_xmm_to_r_reg(ctx, expr0_0)?; + let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsReg { inst: expr2_0, - result: expr4_0, + result: expr3_0, }; - return Some(expr5_0); + return Some(expr4_0); } // Generated as internal constructor for term cmove_or_from_values. @@ -1944,7 +1934,7 @@ pub fn constructor_cmove_or_from_values( let pattern3_0 = arg2; let pattern4_0 = arg3; let pattern5_0 = arg4; - // Rule at src/isa/x64/inst.isle line 1595. + // Rule at src/isa/x64/inst.isle line 1599. let expr0_0 = C::put_in_regs(ctx, pattern4_0); let expr1_0 = C::put_in_regs(ctx, pattern5_0); let expr2_0 = C::temp_writable_gpr(ctx); @@ -1976,17 +1966,15 @@ pub fn constructor_cmove_or_from_values( alternative: expr15_0, dst: expr3_0, }; - let expr17_0 = C::writable_gpr_to_gpr(ctx, expr2_0); - let expr18_0 = C::gpr_to_reg(ctx, expr17_0); - let expr19_0 = C::writable_gpr_to_gpr(ctx, expr3_0); - let expr20_0 = C::gpr_to_reg(ctx, expr19_0); - let expr21_0 = C::value_regs(ctx, expr18_0, expr20_0); - let expr22_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { + let expr17_0 = constructor_writable_gpr_to_r_reg(ctx, expr2_0)?; + let expr18_0 = constructor_writable_gpr_to_r_reg(ctx, expr3_0)?; + let expr19_0 = C::value_regs(ctx, expr17_0, expr18_0); + let expr20_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { inst1: expr10_0, inst2: expr16_0, - result: expr21_0, + result: expr19_0, }; - return Some(expr22_0); + return Some(expr20_0); } if let Some(pattern1_0) = C::is_xmm_type(ctx, pattern0_0) { if let Some(pattern2_0) = C::is_single_register_type(ctx, pattern1_0) { @@ -1994,7 +1982,7 @@ pub fn constructor_cmove_or_from_values( let pattern4_0 = arg2; let pattern5_0 = arg3; let pattern6_0 = arg4; - // Rule at src/isa/x64/inst.isle line 1612. + // Rule at src/isa/x64/inst.isle line 1615. let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern6_0)?; let expr2_0 = constructor_cmove_or_xmm( @@ -2009,7 +1997,7 @@ pub fn constructor_cmove_or_from_values( let pattern4_0 = arg2; let pattern5_0 = arg3; let pattern6_0 = arg4; - // Rule at src/isa/x64/inst.isle line 1609. + // Rule at src/isa/x64/inst.isle line 1612. let expr0_0 = constructor_put_in_gpr_mem(ctx, pattern5_0)?; let expr1_0 = constructor_put_in_gpr(ctx, pattern6_0)?; let expr2_0 = @@ -2030,7 +2018,7 @@ pub fn constructor_movzx( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1617. + // Rule at src/isa/x64/inst.isle line 1620. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = MInst::MovzxRmR { ext_mode: pattern1_0.clone(), @@ -2052,7 +2040,7 @@ pub fn constructor_movsx( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1624. + // Rule at src/isa/x64/inst.isle line 1627. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = MInst::MovsxRmR { ext_mode: pattern1_0.clone(), @@ -2076,7 +2064,7 @@ pub fn constructor_xmm_rm_r( let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 1631. + // Rule at src/isa/x64/inst.isle line 1634. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = MInst::XmmRmR { op: pattern1_0.clone(), @@ -2093,7 +2081,7 @@ pub fn constructor_xmm_rm_r( pub fn constructor_paddb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1638. + // Rule at src/isa/x64/inst.isle line 1641. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Paddb; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2104,7 +2092,7 @@ pub fn constructor_paddb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_paddw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1643. + // Rule at src/isa/x64/inst.isle line 1646. let expr0_0: Type = I16X8; let expr1_0 = SseOpcode::Paddw; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2115,7 +2103,7 @@ pub fn constructor_paddw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_paddd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1648. + // Rule at src/isa/x64/inst.isle line 1651. let expr0_0: Type = I32X4; let expr1_0 = SseOpcode::Paddd; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2126,7 +2114,7 @@ pub fn constructor_paddd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_paddq(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1653. + // Rule at src/isa/x64/inst.isle line 1656. let expr0_0: Type = I64X2; let expr1_0 = SseOpcode::Paddq; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2137,7 +2125,7 @@ pub fn constructor_paddq(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_paddsb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1658. + // Rule at src/isa/x64/inst.isle line 1661. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Paddsb; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2148,7 +2136,7 @@ pub fn constructor_paddsb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_paddsw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1663. + // Rule at src/isa/x64/inst.isle line 1666. let expr0_0: Type = I16X8; let expr1_0 = SseOpcode::Paddsw; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2159,7 +2147,7 @@ pub fn constructor_paddsw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_paddusb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1668. + // Rule at src/isa/x64/inst.isle line 1671. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Paddusb; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2170,7 +2158,7 @@ pub fn constructor_paddusb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_paddusw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1673. + // Rule at src/isa/x64/inst.isle line 1676. let expr0_0: Type = I16X8; let expr1_0 = SseOpcode::Paddusw; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2181,7 +2169,7 @@ pub fn constructor_paddusw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_psubb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1678. + // Rule at src/isa/x64/inst.isle line 1681. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Psubb; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2192,7 +2180,7 @@ pub fn constructor_psubb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_psubw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1683. + // Rule at src/isa/x64/inst.isle line 1686. let expr0_0: Type = I16X8; let expr1_0 = SseOpcode::Psubw; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2203,7 +2191,7 @@ pub fn constructor_psubw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_psubd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1688. + // Rule at src/isa/x64/inst.isle line 1691. let expr0_0: Type = I32X4; let expr1_0 = SseOpcode::Psubd; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2214,7 +2202,7 @@ pub fn constructor_psubd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_psubq(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1693. + // Rule at src/isa/x64/inst.isle line 1696. let expr0_0: Type = I64X2; let expr1_0 = SseOpcode::Psubq; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2225,7 +2213,7 @@ pub fn constructor_psubq(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_psubsb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1698. + // Rule at src/isa/x64/inst.isle line 1701. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Psubsb; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2236,7 +2224,7 @@ pub fn constructor_psubsb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_psubsw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1703. + // Rule at src/isa/x64/inst.isle line 1706. let expr0_0: Type = I16X8; let expr1_0 = SseOpcode::Psubsw; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2247,7 +2235,7 @@ pub fn constructor_psubsw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_psubusb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1708. + // Rule at src/isa/x64/inst.isle line 1711. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Psubusb; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2258,7 +2246,7 @@ pub fn constructor_psubusb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_psubusw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1713. + // Rule at src/isa/x64/inst.isle line 1716. let expr0_0: Type = I16X8; let expr1_0 = SseOpcode::Psubusw; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2269,7 +2257,7 @@ pub fn constructor_psubusw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_pavgb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1718. + // Rule at src/isa/x64/inst.isle line 1721. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Pavgb; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2280,7 +2268,7 @@ pub fn constructor_pavgb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_pavgw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1723. + // Rule at src/isa/x64/inst.isle line 1726. let expr0_0: Type = I16X8; let expr1_0 = SseOpcode::Pavgw; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2291,7 +2279,7 @@ pub fn constructor_pavgw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_pand(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1728. + // Rule at src/isa/x64/inst.isle line 1731. let expr0_0: Type = F32X4; let expr1_0 = SseOpcode::Pand; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2302,7 +2290,7 @@ pub fn constructor_pand(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Op pub fn constructor_andps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1733. + // Rule at src/isa/x64/inst.isle line 1736. let expr0_0: Type = F32X4; let expr1_0 = SseOpcode::Andps; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2313,7 +2301,7 @@ pub fn constructor_andps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_andpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1738. + // Rule at src/isa/x64/inst.isle line 1741. let expr0_0: Type = F64X2; let expr1_0 = SseOpcode::Andpd; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2324,7 +2312,7 @@ pub fn constructor_andpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_por(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1743. + // Rule at src/isa/x64/inst.isle line 1746. let expr0_0: Type = F32X4; let expr1_0 = SseOpcode::Por; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2335,7 +2323,7 @@ pub fn constructor_por(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Opt pub fn constructor_orps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1748. + // Rule at src/isa/x64/inst.isle line 1751. let expr0_0: Type = F32X4; let expr1_0 = SseOpcode::Orps; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2346,7 +2334,7 @@ pub fn constructor_orps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Op pub fn constructor_orpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1753. + // Rule at src/isa/x64/inst.isle line 1756. let expr0_0: Type = F64X2; let expr1_0 = SseOpcode::Orpd; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2357,7 +2345,7 @@ pub fn constructor_orpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Op pub fn constructor_pxor(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1758. + // Rule at src/isa/x64/inst.isle line 1761. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Pxor; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2368,7 +2356,7 @@ pub fn constructor_pxor(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Op pub fn constructor_xorps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1763. + // Rule at src/isa/x64/inst.isle line 1766. let expr0_0: Type = F32X4; let expr1_0 = SseOpcode::Xorps; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2379,7 +2367,7 @@ pub fn constructor_xorps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_xorpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1768. + // Rule at src/isa/x64/inst.isle line 1771. let expr0_0: Type = F64X2; let expr1_0 = SseOpcode::Xorpd; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2390,7 +2378,7 @@ pub fn constructor_xorpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_pmullw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1773. + // Rule at src/isa/x64/inst.isle line 1776. let expr0_0: Type = I16X8; let expr1_0 = SseOpcode::Pmullw; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2401,7 +2389,7 @@ pub fn constructor_pmullw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_pmulld(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1778. + // Rule at src/isa/x64/inst.isle line 1781. let expr0_0: Type = I16X8; let expr1_0 = SseOpcode::Pmulld; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2412,7 +2400,7 @@ pub fn constructor_pmulld(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_pmulhw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1783. + // Rule at src/isa/x64/inst.isle line 1786. let expr0_0: Type = I16X8; let expr1_0 = SseOpcode::Pmulhw; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2423,7 +2411,7 @@ pub fn constructor_pmulhw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_pmulhuw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1788. + // Rule at src/isa/x64/inst.isle line 1791. let expr0_0: Type = I16X8; let expr1_0 = SseOpcode::Pmulhuw; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2434,7 +2422,7 @@ pub fn constructor_pmulhuw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_pmuldq(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1793. + // Rule at src/isa/x64/inst.isle line 1796. let expr0_0: Type = I16X8; let expr1_0 = SseOpcode::Pmuldq; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2445,7 +2433,7 @@ pub fn constructor_pmuldq(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_pmuludq(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1798. + // Rule at src/isa/x64/inst.isle line 1801. let expr0_0: Type = I64X2; let expr1_0 = SseOpcode::Pmuludq; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2456,7 +2444,7 @@ pub fn constructor_pmuludq(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_punpckhwd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1803. + // Rule at src/isa/x64/inst.isle line 1806. let expr0_0: Type = I16X8; let expr1_0 = SseOpcode::Punpckhwd; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2467,7 +2455,7 @@ pub fn constructor_punpckhwd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_punpcklwd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1808. + // Rule at src/isa/x64/inst.isle line 1811. let expr0_0: Type = I16X8; let expr1_0 = SseOpcode::Punpcklwd; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2478,7 +2466,7 @@ pub fn constructor_punpcklwd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_andnps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1813. + // Rule at src/isa/x64/inst.isle line 1816. let expr0_0: Type = F32X4; let expr1_0 = SseOpcode::Andnps; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2489,7 +2477,7 @@ pub fn constructor_andnps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_andnpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1818. + // Rule at src/isa/x64/inst.isle line 1821. let expr0_0: Type = F64X2; let expr1_0 = SseOpcode::Andnpd; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2500,7 +2488,7 @@ pub fn constructor_andnpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_pandn(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1823. + // Rule at src/isa/x64/inst.isle line 1826. let expr0_0: Type = F64X2; let expr1_0 = SseOpcode::Pandn; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2511,17 +2499,17 @@ pub fn constructor_pandn(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_sse_blend_op(ctx: &mut C, arg0: Type) -> Option { let pattern0_0 = arg0; if pattern0_0 == F32X4 { - // Rule at src/isa/x64/inst.isle line 1827. + // Rule at src/isa/x64/inst.isle line 1830. let expr0_0 = SseOpcode::Blendvps; return Some(expr0_0); } if pattern0_0 == F64X2 { - // Rule at src/isa/x64/inst.isle line 1828. + // Rule at src/isa/x64/inst.isle line 1831. let expr0_0 = SseOpcode::Blendvpd; return Some(expr0_0); } if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - // Rule at src/isa/x64/inst.isle line 1829. + // Rule at src/isa/x64/inst.isle line 1832. let expr0_0 = SseOpcode::Pblendvb; return Some(expr0_0); } @@ -2532,17 +2520,17 @@ pub fn constructor_sse_blend_op(ctx: &mut C, arg0: Type) -> Option(ctx: &mut C, arg0: Type) -> Option { let pattern0_0 = arg0; if pattern0_0 == F32X4 { - // Rule at src/isa/x64/inst.isle line 1832. + // Rule at src/isa/x64/inst.isle line 1835. let expr0_0 = SseOpcode::Movaps; return Some(expr0_0); } if pattern0_0 == F64X2 { - // Rule at src/isa/x64/inst.isle line 1833. + // Rule at src/isa/x64/inst.isle line 1836. let expr0_0 = SseOpcode::Movapd; return Some(expr0_0); } if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { - // Rule at src/isa/x64/inst.isle line 1834. + // Rule at src/isa/x64/inst.isle line 1837. let expr0_0 = SseOpcode::Movdqa; return Some(expr0_0); } @@ -2561,7 +2549,7 @@ pub fn constructor_sse_blend( let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 1838. + // Rule at src/isa/x64/inst.isle line 1841. let expr0_0 = C::xmm0(ctx); let expr1_0 = constructor_sse_mov_op(ctx, pattern0_0)?; let expr2_0 = MInst::XmmUnaryRmR { @@ -2585,7 +2573,7 @@ pub fn constructor_blendvpd( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1852. + // Rule at src/isa/x64/inst.isle line 1855. let expr0_0 = C::xmm0(ctx); let expr1_0 = SseOpcode::Movapd; let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern2_0); @@ -2605,7 +2593,7 @@ pub fn constructor_blendvpd( pub fn constructor_movsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1866. + // Rule at src/isa/x64/inst.isle line 1869. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Movsd; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2616,7 +2604,7 @@ pub fn constructor_movsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_movlhps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1871. + // Rule at src/isa/x64/inst.isle line 1874. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Movlhps; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2627,7 +2615,7 @@ pub fn constructor_movlhps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_pmaxsb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1876. + // Rule at src/isa/x64/inst.isle line 1879. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Pmaxsb; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2638,7 +2626,7 @@ pub fn constructor_pmaxsb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_pmaxsw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1881. + // Rule at src/isa/x64/inst.isle line 1884. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Pmaxsw; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2649,7 +2637,7 @@ pub fn constructor_pmaxsw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_pmaxsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1886. + // Rule at src/isa/x64/inst.isle line 1889. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Pmaxsd; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2660,7 +2648,7 @@ pub fn constructor_pmaxsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_pminsb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1891. + // Rule at src/isa/x64/inst.isle line 1894. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Pminsb; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2671,7 +2659,7 @@ pub fn constructor_pminsb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_pminsw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1896. + // Rule at src/isa/x64/inst.isle line 1899. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Pminsw; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2682,7 +2670,7 @@ pub fn constructor_pminsw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_pminsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1901. + // Rule at src/isa/x64/inst.isle line 1904. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Pminsd; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2693,7 +2681,7 @@ pub fn constructor_pminsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_pmaxub(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1906. + // Rule at src/isa/x64/inst.isle line 1909. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Pmaxub; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2704,7 +2692,7 @@ pub fn constructor_pmaxub(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_pmaxuw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1911. + // Rule at src/isa/x64/inst.isle line 1914. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Pmaxuw; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2715,7 +2703,7 @@ pub fn constructor_pmaxuw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_pmaxud(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1916. + // Rule at src/isa/x64/inst.isle line 1919. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Pmaxud; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2726,7 +2714,7 @@ pub fn constructor_pmaxud(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_pminub(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1921. + // Rule at src/isa/x64/inst.isle line 1924. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Pminub; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2737,7 +2725,7 @@ pub fn constructor_pminub(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_pminuw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1926. + // Rule at src/isa/x64/inst.isle line 1929. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Pminuw; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2748,7 +2736,7 @@ pub fn constructor_pminuw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_pminud(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1931. + // Rule at src/isa/x64/inst.isle line 1934. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Pminud; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2759,7 +2747,7 @@ pub fn constructor_pminud(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_punpcklbw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1936. + // Rule at src/isa/x64/inst.isle line 1939. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Punpcklbw; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2770,7 +2758,7 @@ pub fn constructor_punpcklbw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_punpckhbw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1941. + // Rule at src/isa/x64/inst.isle line 1944. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Punpckhbw; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2781,7 +2769,7 @@ pub fn constructor_punpckhbw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_packsswb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1946. + // Rule at src/isa/x64/inst.isle line 1949. let expr0_0: Type = I8X16; let expr1_0 = SseOpcode::Packsswb; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2802,7 +2790,7 @@ pub fn constructor_xmm_rm_r_imm( let pattern2_0 = arg2; let pattern3_0 = arg3; let pattern4_0 = arg4; - // Rule at src/isa/x64/inst.isle line 1951. + // Rule at src/isa/x64/inst.isle line 1954. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = C::writable_xmm_to_reg(ctx, expr0_0); let expr2_0 = MInst::XmmRmRImm { @@ -2830,7 +2818,7 @@ pub fn constructor_palignr( let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 1963. + // Rule at src/isa/x64/inst.isle line 1966. let expr0_0 = SseOpcode::Palignr; let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0); @@ -2849,7 +2837,7 @@ pub fn constructor_cmpps( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1972. + // Rule at src/isa/x64/inst.isle line 1975. let expr0_0 = SseOpcode::Cmpps; let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0); @@ -2869,7 +2857,7 @@ pub fn constructor_pinsrb( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1981. + // Rule at src/isa/x64/inst.isle line 1984. let expr0_0 = SseOpcode::Pinsrb; let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); let expr2_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0); @@ -2888,7 +2876,7 @@ pub fn constructor_pinsrw( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1990. + // Rule at src/isa/x64/inst.isle line 1993. let expr0_0 = SseOpcode::Pinsrw; let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); let expr2_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0); @@ -2909,7 +2897,7 @@ pub fn constructor_pinsrd( let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 1999. + // Rule at src/isa/x64/inst.isle line 2002. let expr0_0 = SseOpcode::Pinsrd; let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); let expr2_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0); @@ -2928,7 +2916,7 @@ pub fn constructor_insertps( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2008. + // Rule at src/isa/x64/inst.isle line 2011. let expr0_0 = SseOpcode::Insertps; let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0); @@ -2947,23 +2935,23 @@ pub fn constructor_pshufd( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2017. + // Rule at src/isa/x64/inst.isle line 2020. let expr0_0 = C::temp_writable_xmm(ctx); - let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0); - let expr2_0 = SseOpcode::Pshufd; - let expr3_0 = C::xmm_to_reg(ctx, expr1_0); - let expr4_0 = C::xmm_mem_to_reg_mem(ctx, pattern0_0); - let expr5_0 = C::writable_xmm_to_reg(ctx, expr0_0); - let expr6_0 = MInst::XmmRmRImm { - op: expr2_0, - src1: expr3_0, - src2: expr4_0, - dst: expr5_0, + let expr1_0 = SseOpcode::Pshufd; + let expr2_0 = constructor_writable_xmm_to_r_reg(ctx, expr0_0)?; + let expr3_0 = C::xmm_mem_to_reg_mem(ctx, pattern0_0); + let expr4_0 = C::writable_xmm_to_reg(ctx, expr0_0); + let expr5_0 = MInst::XmmRmRImm { + op: expr1_0, + src1: expr2_0, + src2: expr3_0, + dst: expr4_0, imm: pattern1_0, size: pattern2_0.clone(), }; - let expr7_0 = C::emit(ctx, &expr6_0); - return Some(expr1_0); + let expr6_0 = C::emit(ctx, &expr5_0); + let expr7_0 = C::writable_xmm_to_xmm(ctx, expr0_0); + return Some(expr7_0); } // Generated as internal constructor for term xmm_unary_rm_r. @@ -2974,7 +2962,7 @@ pub fn constructor_xmm_unary_rm_r( ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2030. + // Rule at src/isa/x64/inst.isle line 2032. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = MInst::XmmUnaryRmR { op: pattern0_0.clone(), @@ -2989,7 +2977,7 @@ pub fn constructor_xmm_unary_rm_r( // Generated as internal constructor for term pmovsxbw. pub fn constructor_pmovsxbw(ctx: &mut C, arg0: &XmmMem) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2037. + // Rule at src/isa/x64/inst.isle line 2039. let expr0_0 = SseOpcode::Pmovsxbw; let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); @@ -2998,7 +2986,7 @@ pub fn constructor_pmovsxbw(ctx: &mut C, arg0: &XmmMem) -> Option(ctx: &mut C, arg0: &XmmMem) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2042. + // Rule at src/isa/x64/inst.isle line 2044. let expr0_0 = SseOpcode::Pmovzxbw; let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); @@ -3007,7 +2995,7 @@ pub fn constructor_pmovzxbw(ctx: &mut C, arg0: &XmmMem) -> Option(ctx: &mut C, arg0: &XmmMem) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2047. + // Rule at src/isa/x64/inst.isle line 2049. let expr0_0 = SseOpcode::Pabsb; let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); @@ -3016,7 +3004,7 @@ pub fn constructor_pabsb(ctx: &mut C, arg0: &XmmMem) -> Option // Generated as internal constructor for term pabsw. pub fn constructor_pabsw(ctx: &mut C, arg0: &XmmMem) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2052. + // Rule at src/isa/x64/inst.isle line 2054. let expr0_0 = SseOpcode::Pabsw; let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); @@ -3025,7 +3013,7 @@ pub fn constructor_pabsw(ctx: &mut C, arg0: &XmmMem) -> Option // Generated as internal constructor for term pabsd. pub fn constructor_pabsd(ctx: &mut C, arg0: &XmmMem) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2057. + // Rule at src/isa/x64/inst.isle line 2059. let expr0_0 = SseOpcode::Pabsd; let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); @@ -3039,7 +3027,7 @@ pub fn constructor_xmm_unary_rm_r_evex( ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2062. + // Rule at src/isa/x64/inst.isle line 2064. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = MInst::XmmUnaryRmREvex { op: pattern0_0.clone(), @@ -3054,7 +3042,7 @@ pub fn constructor_xmm_unary_rm_r_evex( // Generated as internal constructor for term vpabsq. pub fn constructor_vpabsq(ctx: &mut C, arg0: &XmmMem) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2069. + // Rule at src/isa/x64/inst.isle line 2071. let expr0_0 = Avx512Opcode::Vpabsq; let expr1_0 = constructor_xmm_unary_rm_r_evex(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); @@ -3070,7 +3058,7 @@ pub fn constructor_xmm_rm_r_evex( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2074. + // Rule at src/isa/x64/inst.isle line 2076. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = MInst::XmmRmREvex { op: pattern0_0.clone(), @@ -3087,7 +3075,7 @@ pub fn constructor_xmm_rm_r_evex( pub fn constructor_vpmullq(ctx: &mut C, arg0: &XmmMem, arg1: Xmm) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2086. + // Rule at src/isa/x64/inst.isle line 2088. let expr0_0 = Avx512Opcode::Vpmullq; let expr1_0 = constructor_xmm_rm_r_evex(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3105,7 +3093,7 @@ pub fn constructor_mul_hi( let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 2095. + // Rule at src/isa/x64/inst.isle line 2097. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = C::temp_writable_gpr(ctx); let expr2_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); @@ -3134,7 +3122,7 @@ pub fn constructor_mulhi_u( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2111. + // Rule at src/isa/x64/inst.isle line 2112. let expr0_0: bool = false; let expr1_0 = constructor_mul_hi(ctx, pattern0_0, expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -3150,7 +3138,7 @@ pub fn constructor_xmm_rmi_xmm( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2116. + // Rule at src/isa/x64/inst.isle line 2117. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = MInst::XmmRmiReg { opcode: pattern0_0.clone(), @@ -3167,7 +3155,7 @@ pub fn constructor_xmm_rmi_xmm( pub fn constructor_psllw(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2126. + // Rule at src/isa/x64/inst.isle line 2127. let expr0_0 = SseOpcode::Psllw; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3177,7 +3165,7 @@ pub fn constructor_psllw(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) - pub fn constructor_pslld(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2131. + // Rule at src/isa/x64/inst.isle line 2132. let expr0_0 = SseOpcode::Pslld; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3187,7 +3175,7 @@ pub fn constructor_pslld(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) - pub fn constructor_psllq(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2136. + // Rule at src/isa/x64/inst.isle line 2137. let expr0_0 = SseOpcode::Psllq; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3197,7 +3185,7 @@ pub fn constructor_psllq(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) - pub fn constructor_psrlw(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2141. + // Rule at src/isa/x64/inst.isle line 2142. let expr0_0 = SseOpcode::Psrlw; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3207,7 +3195,7 @@ pub fn constructor_psrlw(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) - pub fn constructor_psrld(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2146. + // Rule at src/isa/x64/inst.isle line 2147. let expr0_0 = SseOpcode::Psrld; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3217,7 +3205,7 @@ pub fn constructor_psrld(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) - pub fn constructor_psrlq(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2151. + // Rule at src/isa/x64/inst.isle line 2152. let expr0_0 = SseOpcode::Psrlq; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3227,7 +3215,7 @@ pub fn constructor_psrlq(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) - pub fn constructor_psraw(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2156. + // Rule at src/isa/x64/inst.isle line 2157. let expr0_0 = SseOpcode::Psraw; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3237,7 +3225,7 @@ pub fn constructor_psraw(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) - pub fn constructor_psrad(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2161. + // Rule at src/isa/x64/inst.isle line 2162. let expr0_0 = SseOpcode::Psrad; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3248,26 +3236,27 @@ pub fn constructor_pextrd(ctx: &mut C, arg0: Type, arg1: Xmm, arg2: let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2166. + // Rule at src/isa/x64/inst.isle line 2167. let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - let expr2_0 = SseOpcode::Pextrd; - let expr3_0 = C::gpr_to_reg(ctx, expr1_0); - let expr4_0 = C::xmm_to_reg(ctx, pattern1_0); - let expr5_0 = RegMem::Reg { reg: expr4_0 }; + let expr1_0 = SseOpcode::Pextrd; + let expr2_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; + let expr3_0 = C::xmm_to_reg(ctx, pattern1_0); + let expr4_0 = constructor_xmm_to_reg_mem(ctx, expr3_0)?; + let expr5_0 = C::xmm_mem_to_reg_mem(ctx, &expr4_0); let expr6_0 = C::writable_gpr_to_reg(ctx, expr0_0); let expr7_0 = C::lane_type(ctx, pattern0_0); let expr8_0 = C::operand_size_of_type_32_64(ctx, expr7_0); let expr9_0 = MInst::XmmRmRImm { - op: expr2_0, - src1: expr3_0, + op: expr1_0, + src1: expr2_0, src2: expr5_0, dst: expr6_0, imm: pattern2_0, size: expr8_0, }; let expr10_0 = C::emit(ctx, &expr9_0); - return Some(expr1_0); + let expr11_0 = C::writable_gpr_to_gpr(ctx, expr0_0); + return Some(expr11_0); } // Generated as internal constructor for term cmppd. @@ -3372,6 +3361,86 @@ pub fn constructor_ud2(ctx: &mut C, arg0: &TrapCode) -> Option(ctx: &mut C, arg0: Reg) -> Option { + let pattern0_0 = arg0; + // Rule at src/isa/x64/inst.isle line 2270. + let expr0_0 = C::xmm_new(ctx, pattern0_0); + let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); + return Some(expr1_0); +} + +// Generated as internal constructor for term xmm_to_reg_mem. +pub fn constructor_xmm_to_reg_mem(ctx: &mut C, arg0: Reg) -> Option { + let pattern0_0 = arg0; + // Rule at src/isa/x64/inst.isle line 2273. + let expr0_0 = C::xmm_new(ctx, pattern0_0); + let expr1_0 = C::xmm_to_reg(ctx, expr0_0); + let expr2_0 = RegMem::Reg { reg: expr1_0 }; + let expr3_0 = C::reg_mem_to_xmm_mem(ctx, &expr2_0); + return Some(expr3_0); +} + +// Generated as internal constructor for term writable_gpr_to_r_reg. +pub fn constructor_writable_gpr_to_r_reg( + ctx: &mut C, + arg0: WritableGpr, +) -> Option { + let pattern0_0 = arg0; + // Rule at src/isa/x64/inst.isle line 2277. + let expr0_0 = C::writable_gpr_to_reg(ctx, pattern0_0); + let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0); + return Some(expr1_0); +} + +// Generated as internal constructor for term writable_xmm_to_r_reg. +pub fn constructor_writable_xmm_to_r_reg( + ctx: &mut C, + arg0: WritableXmm, +) -> Option { + let pattern0_0 = arg0; + // Rule at src/isa/x64/inst.isle line 2280. + let expr0_0 = C::writable_xmm_to_reg(ctx, pattern0_0); + let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0); + return Some(expr1_0); +} + +// Generated as internal constructor for term writable_xmm_to_xmm_mem. +pub fn constructor_writable_xmm_to_xmm_mem( + ctx: &mut C, + arg0: WritableXmm, +) -> Option { + let pattern0_0 = arg0; + // Rule at src/isa/x64/inst.isle line 2283. + let expr0_0 = C::writable_xmm_to_xmm(ctx, pattern0_0); + let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); + return Some(expr1_0); +} + +// Generated as internal constructor for term synthetic_amode_to_gpr_mem. +pub fn constructor_synthetic_amode_to_gpr_mem( + ctx: &mut C, + arg0: &SyntheticAmode, +) -> Option { + let pattern0_0 = arg0; + // Rule at src/isa/x64/inst.isle line 2287. + let expr0_0 = C::synthetic_amode_to_reg_mem(ctx, pattern0_0); + let expr1_0 = C::reg_mem_to_gpr_mem(ctx, &expr0_0); + return Some(expr1_0); +} + +// Generated as internal constructor for term synthetic_amode_to_xmm_mem. +pub fn constructor_synthetic_amode_to_xmm_mem( + ctx: &mut C, + arg0: &SyntheticAmode, +) -> Option { + let pattern0_0 = arg0; + // Rule at src/isa/x64/inst.isle line 2290. + let expr0_0 = C::synthetic_amode_to_reg_mem(ctx, pattern0_0); + let expr1_0 = C::reg_mem_to_xmm_mem(ctx, &expr0_0); + return Some(expr1_0); +} + // Generated as internal constructor for term lower. pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let pattern0_0 = arg0; @@ -3409,13 +3478,13 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { match pattern2_0 { &Opcode::Trap => { - // Rule at src/isa/x64/lower.isle line 1519. + // Rule at src/isa/x64/lower.isle line 1444. let expr0_0 = constructor_ud2(ctx, pattern2_1)?; let expr1_0 = constructor_safepoint(ctx, &expr0_0)?; return Some(expr1_0); } &Opcode::ResumableTrap => { - // Rule at src/isa/x64/lower.isle line 1524. + // Rule at src/isa/x64/lower.isle line 1449. let expr0_0 = constructor_ud2(ctx, pattern2_1)?; let expr1_0 = constructor_safepoint(ctx, &expr0_0)?; return Some(expr1_0); @@ -3432,7 +3501,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 386. + // Rule at src/isa/x64/lower.isle line 353. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0: usize = 0; let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; @@ -3499,7 +3568,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 462. + // Rule at src/isa/x64/lower.isle line 419. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0: usize = 0; let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; @@ -3514,7 +3583,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 528. + // Rule at src/isa/x64/lower.isle line 477. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0: usize = 0; let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; @@ -3535,7 +3604,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { if let &Opcode::Bnot = pattern5_0 { - // Rule at src/isa/x64/lower.isle line 1353. + // Rule at src/isa/x64/lower.isle line 1278. let expr0_0 = constructor_i128_not(ctx, pattern5_1)?; return Some(expr0_0); } @@ -3569,7 +3638,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 117. + // Rule at src/isa/x64/lower.isle line 111. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0: usize = 0; let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; @@ -3594,7 +3663,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 286. + // Rule at src/isa/x64/lower.isle line 266. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0: usize = 0; let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; @@ -3619,7 +3688,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1039. + // Rule at src/isa/x64/lower.isle line 966. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0: usize = 0; let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; @@ -3654,7 +3723,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 376. + // Rule at src/isa/x64/lower.isle line 343. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0: usize = 0; let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; @@ -3676,7 +3745,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 459. + // Rule at src/isa/x64/lower.isle line 416. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0 = C::put_in_regs(ctx, pattern7_1); let expr2_0 = constructor_or_i128(ctx, expr0_0, expr1_0)?; @@ -3684,7 +3753,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 518. + // Rule at src/isa/x64/lower.isle line 467. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0: usize = 0; let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; @@ -3706,7 +3775,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 903. + // Rule at src/isa/x64/lower.isle line 839. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0 = constructor_lo_gpr(ctx, pattern7_1)?; let expr2_0 = constructor_shl_i128(ctx, expr0_0, expr1_0)?; @@ -3723,7 +3792,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 945. + // Rule at src/isa/x64/lower.isle line 879. let expr0_0 = C::put_in_regs(ctx, pattern7_0); let expr1_0 = constructor_lo_gpr(ctx, pattern7_1)?; let expr2_0 = constructor_shr_i128(ctx, expr0_0, expr1_0)?; @@ -3740,7 +3809,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 582. + // Rule at src/isa/x64/lower.isle line 531. let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?; let expr1_0 = C::put_in_regs(ctx, pattern7_0); let expr2_0 = constructor_shl_i128(ctx, expr1_0, expr0_0)?; @@ -3748,7 +3817,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 688. + // Rule at src/isa/x64/lower.isle line 632. let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?; let expr1_0 = C::put_in_regs(ctx, pattern7_0); let expr2_0 = constructor_shr_i128(ctx, expr1_0, expr0_0)?; @@ -3756,7 +3825,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 797. + // Rule at src/isa/x64/lower.isle line 737. let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?; let expr1_0 = C::put_in_regs(ctx, pattern7_0); let expr2_0 = constructor_sar_i128(ctx, expr1_0, expr0_0)?; @@ -3770,7 +3839,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { if let &Opcode::Bnot = pattern5_0 { - // Rule at src/isa/x64/lower.isle line 1350. + // Rule at src/isa/x64/lower.isle line 1275. let expr0_0 = constructor_i128_not(ctx, pattern5_1)?; return Some(expr0_0); } @@ -3782,7 +3851,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { if let &Opcode::IaddImm = pattern5_0 { let pattern7_0 = C::u64_from_imm64(ctx, pattern5_2); - // Rule at src/isa/x64/lower.isle line 232. + // Rule at src/isa/x64/lower.isle line 219. let expr0_0 = C::put_in_regs(ctx, pattern5_1); let expr1_0: usize = 0; let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; @@ -3817,7 +3886,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1486. + // Rule at src/isa/x64/lower.isle line 1411. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_pminsb(ctx, expr0_0, &expr1_0)?; @@ -3826,7 +3895,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1508. + // Rule at src/isa/x64/lower.isle line 1433. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_pminub(ctx, expr0_0, &expr1_0)?; @@ -3835,7 +3904,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1475. + // Rule at src/isa/x64/lower.isle line 1400. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_pmaxsb(ctx, expr0_0, &expr1_0)?; @@ -3844,7 +3913,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1497. + // Rule at src/isa/x64/lower.isle line 1422. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_pmaxub(ctx, expr0_0, &expr1_0)?; @@ -3853,44 +3922,46 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 594. + // Rule at src/isa/x64/lower.isle line 543. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; let expr3_0 = constructor_psllw(ctx, expr0_0, &expr2_0)?; - let expr4_0 = constructor_ishl_i8x16_mask(ctx, &expr1_0)?; - let expr5_0: Type = I8X16; - let expr6_0 = ExtKind::None; - let expr7_0 = constructor_x64_load(ctx, expr5_0, &expr4_0, &expr6_0)?; - let expr8_0: Type = I8X16; - let expr9_0 = RegMem::Reg { reg: expr7_0 }; - let expr10_0 = C::reg_mem_to_xmm_mem(ctx, &expr9_0); - let expr11_0 = constructor_sse_and(ctx, expr8_0, expr3_0, &expr10_0)?; - let expr12_0 = constructor_value_xmm(ctx, expr11_0)?; - return Some(expr12_0); + let expr4_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); + let expr5_0 = constructor_ishl_i8x16_mask(ctx, &expr4_0)?; + let expr6_0: Type = I8X16; + let expr7_0 = ExtKind::None; + let expr8_0 = constructor_x64_load(ctx, expr6_0, &expr5_0, &expr7_0)?; + let expr9_0: Type = I8X16; + let expr10_0 = RegMem::Reg { reg: expr8_0 }; + let expr11_0 = C::reg_mem_to_xmm_mem(ctx, &expr10_0); + let expr12_0 = constructor_sse_and(ctx, expr9_0, expr3_0, &expr11_0)?; + let expr13_0 = constructor_value_xmm(ctx, expr12_0)?; + return Some(expr13_0); } &Opcode::Ushr => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 698. + // Rule at src/isa/x64/lower.isle line 642. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; let expr3_0 = constructor_psrlw(ctx, expr0_0, &expr2_0)?; - let expr4_0 = constructor_ushr_i8x16_mask(ctx, &expr1_0)?; - let expr5_0: Type = I8X16; - let expr6_0 = ExtKind::None; - let expr7_0 = constructor_x64_load(ctx, expr5_0, &expr4_0, &expr6_0)?; - let expr8_0: Type = I8X16; - let expr9_0 = RegMem::Reg { reg: expr7_0 }; - let expr10_0 = C::reg_mem_to_xmm_mem(ctx, &expr9_0); - let expr11_0 = constructor_sse_and(ctx, expr8_0, expr3_0, &expr10_0)?; - let expr12_0 = constructor_value_xmm(ctx, expr11_0)?; - return Some(expr12_0); + let expr4_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); + let expr5_0 = constructor_ushr_i8x16_mask(ctx, &expr4_0)?; + let expr6_0: Type = I8X16; + let expr7_0 = ExtKind::None; + let expr8_0 = constructor_x64_load(ctx, expr6_0, &expr5_0, &expr7_0)?; + let expr9_0: Type = I8X16; + let expr10_0 = RegMem::Reg { reg: expr8_0 }; + let expr11_0 = C::reg_mem_to_xmm_mem(ctx, &expr10_0); + let expr12_0 = constructor_sse_and(ctx, expr9_0, expr3_0, &expr11_0)?; + let expr13_0 = constructor_value_xmm(ctx, expr12_0)?; + return Some(expr13_0); } &Opcode::Sshr => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); let pattern8_0 = C::value_type(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 818. + // Rule at src/isa/x64/lower.isle line 758. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); let expr2_0 = constructor_punpcklbw(ctx, expr0_0, &expr1_0)?; @@ -3915,7 +3986,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { match pattern5_0 { &Opcode::Ineg => { - // Rule at src/isa/x64/lower.isle line 964. + // Rule at src/isa/x64/lower.isle line 898. let expr0_0: Type = I8X16; let expr1_0: u64 = 0; let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?; @@ -3926,7 +3997,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1294. + // Rule at src/isa/x64/lower.isle line 1219. let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?; let expr1_0 = constructor_pabsb(ctx, &expr0_0)?; let expr2_0 = constructor_value_xmm(ctx, expr1_0)?; @@ -3948,7 +4019,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1489. + // Rule at src/isa/x64/lower.isle line 1414. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_pminsw(ctx, expr0_0, &expr1_0)?; @@ -3957,7 +4028,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1511. + // Rule at src/isa/x64/lower.isle line 1436. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_pminuw(ctx, expr0_0, &expr1_0)?; @@ -3966,7 +4037,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1478. + // Rule at src/isa/x64/lower.isle line 1403. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_pmaxsw(ctx, expr0_0, &expr1_0)?; @@ -3975,7 +4046,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1500. + // Rule at src/isa/x64/lower.isle line 1425. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_pmaxuw(ctx, expr0_0, &expr1_0)?; @@ -3984,7 +4055,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 638. + // Rule at src/isa/x64/lower.isle line 585. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; @@ -3994,7 +4065,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 744. + // Rule at src/isa/x64/lower.isle line 687. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; @@ -4004,7 +4075,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 845. + // Rule at src/isa/x64/lower.isle line 785. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; @@ -4021,7 +4092,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { match pattern5_0 { &Opcode::Ineg => { - // Rule at src/isa/x64/lower.isle line 968. + // Rule at src/isa/x64/lower.isle line 901. let expr0_0: Type = I16X8; let expr1_0: u64 = 0; let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?; @@ -4032,7 +4103,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1297. + // Rule at src/isa/x64/lower.isle line 1222. let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?; let expr1_0 = constructor_pabsw(ctx, &expr0_0)?; let expr2_0 = constructor_value_xmm(ctx, expr1_0)?; @@ -4054,7 +4125,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1492. + // Rule at src/isa/x64/lower.isle line 1417. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_pminsd(ctx, expr0_0, &expr1_0)?; @@ -4063,7 +4134,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1514. + // Rule at src/isa/x64/lower.isle line 1439. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_pminud(ctx, expr0_0, &expr1_0)?; @@ -4072,7 +4143,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1481. + // Rule at src/isa/x64/lower.isle line 1406. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_pmaxsd(ctx, expr0_0, &expr1_0)?; @@ -4081,7 +4152,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1503. + // Rule at src/isa/x64/lower.isle line 1428. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_pmaxud(ctx, expr0_0, &expr1_0)?; @@ -4090,7 +4161,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 642. + // Rule at src/isa/x64/lower.isle line 588. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; @@ -4100,7 +4171,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 748. + // Rule at src/isa/x64/lower.isle line 690. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; @@ -4110,7 +4181,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 849. + // Rule at src/isa/x64/lower.isle line 788. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; @@ -4127,7 +4198,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { match pattern5_0 { &Opcode::Ineg => { - // Rule at src/isa/x64/lower.isle line 972. + // Rule at src/isa/x64/lower.isle line 904. let expr0_0: Type = I32X4; let expr1_0: u64 = 0; let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?; @@ -4138,7 +4209,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1300. + // Rule at src/isa/x64/lower.isle line 1225. let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?; let expr1_0 = constructor_pabsd(ctx, &expr0_0)?; let expr2_0 = constructor_value_xmm(ctx, expr1_0)?; @@ -4160,7 +4231,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 646. + // Rule at src/isa/x64/lower.isle line 591. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; @@ -4170,7 +4241,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 752. + // Rule at src/isa/x64/lower.isle line 693. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; @@ -4180,7 +4251,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 861. + // Rule at src/isa/x64/lower.isle line 799. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0: Type = I64; let expr2_0: u8 = 0; @@ -4210,7 +4281,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { match pattern5_0 { &Opcode::Ineg => { - // Rule at src/isa/x64/lower.isle line 976. + // Rule at src/isa/x64/lower.isle line 907. let expr0_0: Type = I64X2; let expr1_0: u64 = 0; let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?; @@ -4221,7 +4292,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1314. + // Rule at src/isa/x64/lower.isle line 1239. let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?; let expr1_0: Type = I64X2; let expr2_0: u64 = 0; @@ -4248,13 +4319,13 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { if let &Opcode::BandNot = pattern4_0 { let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); - // Rule at src/isa/x64/lower.isle line 1287. + // Rule at src/isa/x64/lower.isle line 1214. let expr0_0 = constructor_put_in_xmm(ctx, pattern6_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern6_0)?; let expr2_0 = constructor_sse_and_not(ctx, pattern2_0, expr0_0, &expr1_0)?; @@ -4333,7 +4404,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1608. + // Rule at src/isa/x64/lower.isle line 1533. let expr0_0 = constructor_fpcmp(ctx, pattern11_0, pattern11_1)?; let expr1_0 = CC::NZ; @@ -4347,7 +4418,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1560. + // Rule at src/isa/x64/lower.isle line 1485. let expr0_0 = constructor_fpcmp(ctx, pattern11_1, pattern11_0)?; let expr1_0 = CC::NBE; @@ -4359,7 +4430,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1563. + // Rule at src/isa/x64/lower.isle line 1488. let expr0_0 = constructor_fpcmp(ctx, pattern11_1, pattern11_0)?; let expr1_0 = CC::NB; @@ -4371,7 +4442,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1583. + // Rule at src/isa/x64/lower.isle line 1508. let expr0_0 = constructor_fpcmp(ctx, pattern11_0, pattern11_1)?; let expr1_0 = CC::NBE; @@ -4383,7 +4454,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1586. + // Rule at src/isa/x64/lower.isle line 1511. let expr0_0 = constructor_fpcmp(ctx, pattern11_0, pattern11_1)?; let expr1_0 = CC::NB; @@ -4395,7 +4466,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1611. + // Rule at src/isa/x64/lower.isle line 1536. let expr0_0 = constructor_fpcmp(ctx, pattern11_0, pattern11_1)?; let expr1_0 = CC::NZ; @@ -4409,7 +4480,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1554. + // Rule at src/isa/x64/lower.isle line 1479. let expr0_0 = constructor_fpcmp(ctx, pattern11_1, pattern11_0)?; let expr1_0 = CC::NP; @@ -4421,7 +4492,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1557. + // Rule at src/isa/x64/lower.isle line 1482. let expr0_0 = constructor_fpcmp(ctx, pattern11_1, pattern11_0)?; let expr1_0 = CC::P; @@ -4433,7 +4504,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1589. + // Rule at src/isa/x64/lower.isle line 1514. let expr0_0 = constructor_fpcmp(ctx, pattern11_0, pattern11_1)?; let expr1_0 = CC::B; @@ -4445,7 +4516,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1592. + // Rule at src/isa/x64/lower.isle line 1517. let expr0_0 = constructor_fpcmp(ctx, pattern11_0, pattern11_1)?; let expr1_0 = CC::BE; @@ -4457,7 +4528,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1566. + // Rule at src/isa/x64/lower.isle line 1491. let expr0_0 = constructor_fpcmp(ctx, pattern11_1, pattern11_0)?; let expr1_0 = CC::B; @@ -4469,7 +4540,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1569. + // Rule at src/isa/x64/lower.isle line 1494. let expr0_0 = constructor_fpcmp(ctx, pattern11_1, pattern11_0)?; let expr1_0 = CC::BE; @@ -4503,7 +4574,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { let (pattern9_0, pattern9_1) = C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 982. + // Rule at src/isa/x64/lower.isle line 912. let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; let expr2_0 = constructor_pavgb(ctx, expr0_0, &expr1_0)?; @@ -4557,7 +4628,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern9_0, pattern9_1) = C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 144. + // Rule at src/isa/x64/lower.isle line 136. let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; let expr2_0 = constructor_paddusb(ctx, expr0_0, &expr1_0)?; @@ -4567,7 +4638,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern9_0, pattern9_1) = C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 132. + // Rule at src/isa/x64/lower.isle line 126. let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; let expr2_0 = constructor_paddsb(ctx, expr0_0, &expr1_0)?; @@ -4577,7 +4648,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern9_0, pattern9_1) = C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 313. + // Rule at src/isa/x64/lower.isle line 291. let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; let expr2_0 = constructor_psubusb(ctx, expr0_0, &expr1_0)?; @@ -4587,7 +4658,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern9_0, pattern9_1) = C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 301. + // Rule at src/isa/x64/lower.isle line 281. let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; let expr2_0 = constructor_psubsb(ctx, expr0_0, &expr1_0)?; @@ -4597,7 +4668,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern9_0, pattern9_1) = C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 96. + // Rule at src/isa/x64/lower.isle line 94. let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; let expr2_0 = constructor_paddb(ctx, expr0_0, &expr1_0)?; @@ -4607,7 +4678,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern9_0, pattern9_1) = C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 265. + // Rule at src/isa/x64/lower.isle line 249. let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; let expr2_0 = constructor_psubb(ctx, expr0_0, &expr1_0)?; @@ -4631,7 +4702,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern9_0, pattern9_1) = C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 986. + // Rule at src/isa/x64/lower.isle line 916. let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; let expr2_0 = constructor_pavgw(ctx, expr0_0, &expr1_0)?; @@ -4641,7 +4712,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern9_0, pattern9_1) = C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 149. + // Rule at src/isa/x64/lower.isle line 140. let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; let expr2_0 = constructor_paddusw(ctx, expr0_0, &expr1_0)?; @@ -4651,7 +4722,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern9_0, pattern9_1) = C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 137. + // Rule at src/isa/x64/lower.isle line 130. let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; let expr2_0 = constructor_paddsw(ctx, expr0_0, &expr1_0)?; @@ -4661,7 +4732,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern9_0, pattern9_1) = C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 318. + // Rule at src/isa/x64/lower.isle line 295. let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; let expr2_0 = constructor_psubusw(ctx, expr0_0, &expr1_0)?; @@ -4671,7 +4742,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern9_0, pattern9_1) = C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 306. + // Rule at src/isa/x64/lower.isle line 285. let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; let expr2_0 = constructor_psubsw(ctx, expr0_0, &expr1_0)?; @@ -4681,7 +4752,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern9_0, pattern9_1) = C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 101. + // Rule at src/isa/x64/lower.isle line 98. let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; let expr2_0 = constructor_paddw(ctx, expr0_0, &expr1_0)?; @@ -4691,7 +4762,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern9_0, pattern9_1) = C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 270. + // Rule at src/isa/x64/lower.isle line 253. let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; let expr2_0 = constructor_psubw(ctx, expr0_0, &expr1_0)?; @@ -4744,7 +4815,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { let (pattern9_0, pattern9_1) = C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 106. + // Rule at src/isa/x64/lower.isle line 102. let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; let expr2_0 = constructor_paddd(ctx, expr0_0, &expr1_0)?; @@ -4991,7 +5062,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern9_0, pattern9_1) = C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 275. + // Rule at src/isa/x64/lower.isle line 257. let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; let expr2_0 = constructor_psubd(ctx, expr0_0, &expr1_0)?; @@ -5044,7 +5115,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { let (pattern9_0, pattern9_1) = C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 111. + // Rule at src/isa/x64/lower.isle line 106. let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; let expr2_0 = constructor_paddq(ctx, expr0_0, &expr1_0)?; @@ -5279,7 +5350,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern9_0, pattern9_1) = C::unpack_value_array_2(ctx, pattern7_1); - // Rule at src/isa/x64/lower.isle line 280. + // Rule at src/isa/x64/lower.isle line 261. let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; let expr2_0 = constructor_psubq(ctx, expr0_0, &expr1_0)?; @@ -5332,7 +5403,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 368. + // Rule at src/isa/x64/lower.isle line 337. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_sse_and(ctx, pattern2_0, expr0_0, &expr1_0)?; @@ -5592,7 +5663,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 442. + // Rule at src/isa/x64/lower.isle line 401. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_sse_or(ctx, pattern2_0, expr0_0, &expr1_0)?; @@ -5601,7 +5672,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 513. + // Rule at src/isa/x64/lower.isle line 462. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_sse_xor(ctx, pattern2_0, expr0_0, &expr1_0)?; @@ -5619,7 +5690,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1, pattern7_2) = C::unpack_value_array_3(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1363. + // Rule at src/isa/x64/lower.isle line 1288. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr2_0 = C::xmm_to_xmm_mem(ctx, expr0_0); @@ -5635,7 +5706,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1, pattern7_2) = C::unpack_value_array_3(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1377. + // Rule at src/isa/x64/lower.isle line 1302. let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; let expr2_0 = constructor_put_in_xmm(ctx, pattern7_2)?; @@ -5653,7 +5724,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { if let &Opcode::Bnot = pattern5_0 { - // Rule at src/isa/x64/lower.isle line 1358. + // Rule at src/isa/x64/lower.isle line 1283. let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?; let expr1_0 = constructor_vector_all_ones(ctx, pattern2_0)?; let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); @@ -5708,7 +5779,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1467. + // Rule at src/isa/x64/lower.isle line 1392. let expr0_0 = CC::L; let expr1_0 = constructor_cmp_and_choose( ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1, @@ -5717,7 +5788,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1461. + // Rule at src/isa/x64/lower.isle line 1386. let expr0_0 = CC::B; let expr1_0 = constructor_cmp_and_choose( ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1, @@ -5726,7 +5797,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1470. + // Rule at src/isa/x64/lower.isle line 1395. let expr0_0 = CC::NL; let expr1_0 = constructor_cmp_and_choose( ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1, @@ -5735,7 +5806,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1464. + // Rule at src/isa/x64/lower.isle line 1389. let expr0_0 = CC::NB; let expr1_0 = constructor_cmp_and_choose( ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1, @@ -5745,7 +5816,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) { - // Rule at src/isa/x64/lower.isle line 76. + // Rule at src/isa/x64/lower.isle line 74. let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; let expr1_0 = constructor_add(ctx, pattern3_0, expr0_0, &pattern8_0)?; @@ -5753,7 +5824,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) { - // Rule at src/isa/x64/lower.isle line 252. + // Rule at src/isa/x64/lower.isle line 237. let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; let expr1_0 = constructor_sub(ctx, pattern3_0, expr0_0, &pattern8_0)?; @@ -5797,7 +5867,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) { - // Rule at src/isa/x64/lower.isle line 1006. + // Rule at src/isa/x64/lower.isle line 934. let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; let expr1_0 = constructor_mul(ctx, pattern3_0, expr0_0, &pattern8_0)?; @@ -5823,7 +5893,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) { - // Rule at src/isa/x64/lower.isle line 183. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - let expr2_0 = constructor_put_in_gpr(ctx, pattern7_1)?; - let expr3_0 = - constructor_add(ctx, pattern3_0, expr2_0, &pattern8_0)?; - let expr4_0 = constructor_value_gprs(ctx, expr3_0, expr1_0)?; - return Some(expr4_0); + // Rule at src/isa/x64/lower.isle line 173. + let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; + let expr1_0 = + constructor_add(ctx, pattern3_0, expr0_0, &pattern8_0)?; + let expr2_0 = constructor_unused_iflags(ctx)?; + let expr3_0 = constructor_value_gprs(ctx, expr1_0, expr2_0)?; + return Some(expr3_0); } if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) { - // Rule at src/isa/x64/lower.isle line 199. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - let expr2_0 = constructor_put_in_gpr(ctx, pattern7_1)?; - let expr3_0 = + // Rule at src/isa/x64/lower.isle line 187. + let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; + let expr1_0 = constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; - let expr4_0 = constructor_add(ctx, pattern3_0, expr2_0, &expr3_0)?; - let expr5_0 = constructor_value_gprs(ctx, expr4_0, expr1_0)?; - return Some(expr5_0); - } - if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) { - // Rule at src/isa/x64/lower.isle line 177. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - let expr2_0 = constructor_put_in_gpr(ctx, pattern7_0)?; - let expr3_0 = - constructor_add(ctx, pattern3_0, expr2_0, &pattern8_0)?; - let expr4_0 = constructor_value_gprs(ctx, expr3_0, expr1_0)?; + let expr2_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr1_0)?; + let expr3_0 = constructor_unused_iflags(ctx)?; + let expr4_0 = constructor_value_gprs(ctx, expr2_0, expr3_0)?; return Some(expr4_0); } - if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) { - // Rule at src/isa/x64/lower.isle line 191. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - let expr2_0 = constructor_put_in_gpr(ctx, pattern7_0)?; - let expr3_0 = - constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; - let expr4_0 = constructor_add(ctx, pattern3_0, expr2_0, &expr3_0)?; - let expr5_0 = constructor_value_gprs(ctx, expr4_0, expr1_0)?; - return Some(expr5_0); + if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) { + // Rule at src/isa/x64/lower.isle line 168. + let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; + let expr1_0 = + constructor_add(ctx, pattern3_0, expr0_0, &pattern8_0)?; + let expr2_0 = constructor_unused_iflags(ctx)?; + let expr3_0 = constructor_value_gprs(ctx, expr1_0, expr2_0)?; + return Some(expr3_0); } - // Rule at src/isa/x64/lower.isle line 167. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - let expr2_0 = constructor_put_in_gpr(ctx, pattern7_0)?; - let expr3_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?; - let expr4_0 = constructor_add(ctx, pattern3_0, expr2_0, &expr3_0)?; - let expr5_0 = constructor_value_gprs(ctx, expr4_0, expr1_0)?; - return Some(expr5_0); + if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) { + // Rule at src/isa/x64/lower.isle line 180. + let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; + let expr1_0 = + constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; + let expr2_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr1_0)?; + let expr3_0 = constructor_unused_iflags(ctx)?; + let expr4_0 = constructor_value_gprs(ctx, expr2_0, expr3_0)?; + return Some(expr4_0); + } + // Rule at src/isa/x64/lower.isle line 161. + let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; + let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?; + let expr2_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr1_0)?; + let expr3_0 = constructor_unused_iflags(ctx)?; + let expr4_0 = constructor_value_gprs(ctx, expr2_0, expr3_0)?; + return Some(expr4_0); } &Opcode::Band => { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) { - // Rule at src/isa/x64/lower.isle line 355. + // Rule at src/isa/x64/lower.isle line 326. let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; let expr1_0 = constructor_x64_and(ctx, pattern3_0, expr0_0, &pattern8_0)?; @@ -5919,7 +5984,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) { - // Rule at src/isa/x64/lower.isle line 429. + // Rule at src/isa/x64/lower.isle line 390. let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; let expr1_0 = constructor_or(ctx, pattern3_0, expr0_0, &pattern8_0)?; @@ -5964,7 +6029,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) { - // Rule at src/isa/x64/lower.isle line 505. + // Rule at src/isa/x64/lower.isle line 456. let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; let expr1_0 = constructor_xor(ctx, pattern3_0, expr0_0, &pattern8_0)?; @@ -6007,7 +6072,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 543. + // Rule at src/isa/x64/lower.isle line 492. let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; let expr1_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0); let expr2_0 = constructor_shl(ctx, pattern3_0, expr0_0, &expr1_0)?; @@ -6050,7 +6115,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 654. + // Rule at src/isa/x64/lower.isle line 598. let expr0_0 = ExtendKind::Zero; let expr1_0 = constructor_extend_to_gpr(ctx, pattern7_0, pattern3_0, &expr0_0)?; @@ -6061,7 +6126,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 760. + // Rule at src/isa/x64/lower.isle line 700. let expr0_0 = ExtendKind::Sign; let expr1_0 = constructor_extend_to_gpr(ctx, pattern7_0, pattern3_0, &expr0_0)?; @@ -6079,14 +6144,14 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { match pattern5_0 { &Opcode::Ineg => { - // Rule at src/isa/x64/lower.isle line 959. + // Rule at src/isa/x64/lower.isle line 893. let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr1_0 = constructor_neg(ctx, pattern3_0, expr0_0)?; let expr2_0 = constructor_value_gpr(ctx, expr1_0)?; return Some(expr2_0); } &Opcode::Bnot => { - // Rule at src/isa/x64/lower.isle line 1337. + // Rule at src/isa/x64/lower.isle line 1262. let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr1_0 = constructor_not(ctx, pattern3_0, expr0_0)?; let expr2_0 = constructor_value_gpr(ctx, expr1_0)?; @@ -6102,14 +6167,13 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { if let &Opcode::IaddImm = pattern5_0 { let pattern7_0 = C::u64_from_imm64(ctx, pattern5_2); - // Rule at src/isa/x64/lower.isle line 218. + // Rule at src/isa/x64/lower.isle line 205. let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr1_0 = constructor_imm(ctx, pattern3_0, pattern7_0)?; - let expr2_0 = C::gpr_new(ctx, expr1_0); - let expr3_0 = C::gpr_to_gpr_mem_imm(ctx, expr2_0); - let expr4_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr3_0)?; - let expr5_0 = constructor_value_gpr(ctx, expr4_0)?; - return Some(expr5_0); + let expr2_0 = constructor_reg_to_gpr_mem_imm(ctx, expr1_0)?; + let expr3_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr2_0)?; + let expr4_0 = constructor_value_gpr(ctx, expr3_0)?; + return Some(expr4_0); } } _ => {} @@ -6134,7 +6198,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C) -> Option { + // Rule at src/isa/x64/lower.isle line 157. + let expr0_0 = C::temp_writable_gpr(ctx); + let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0); + return Some(expr1_0); +} + // Generated as internal constructor for term sse_and. pub fn constructor_sse_and( ctx: &mut C, @@ -6280,21 +6352,21 @@ pub fn constructor_sse_and( if pattern0_0 == F32X4 { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 364. + // Rule at src/isa/x64/lower.isle line 333. let expr0_0 = constructor_andps(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } if pattern0_0 == F64X2 { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 365. + // Rule at src/isa/x64/lower.isle line 334. let expr0_0 = constructor_andpd(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 366. + // Rule at src/isa/x64/lower.isle line 335. let expr0_0 = constructor_pand(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } @@ -6312,21 +6384,21 @@ pub fn constructor_sse_or( if pattern0_0 == F32X4 { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 438. + // Rule at src/isa/x64/lower.isle line 397. let expr0_0 = constructor_orps(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } if pattern0_0 == F64X2 { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 439. + // Rule at src/isa/x64/lower.isle line 398. let expr0_0 = constructor_orpd(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 440. + // Rule at src/isa/x64/lower.isle line 399. let expr0_0 = constructor_por(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } @@ -6341,7 +6413,7 @@ pub fn constructor_or_i128( ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/lower.isle line 451. + // Rule at src/isa/x64/lower.isle line 408. let expr0_0: usize = 0; let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?; let expr2_0: usize = 1; @@ -6368,7 +6440,7 @@ pub fn constructor_shl_i128( ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/lower.isle line 549. + // Rule at src/isa/x64/lower.isle line 498. let expr0_0: usize = 0; let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?; let expr2_0: usize = 1; @@ -6433,12 +6505,12 @@ pub fn constructor_ishl_i8x16_mask( let pattern0_0 = arg0; match pattern0_0 { &RegMemImm::Imm { simm32: pattern1_0 } => { - // Rule at src/isa/x64/lower.isle line 614. + // Rule at src/isa/x64/lower.isle line 561. let expr0_0 = C::ishl_i8x16_mask_for_const(ctx, pattern1_0); return Some(expr0_0); } &RegMemImm::Reg { reg: pattern1_0 } => { - // Rule at src/isa/x64/lower.isle line 623. + // Rule at src/isa/x64/lower.isle line 570. let expr0_0 = C::ishl_i8x16_mask_table(ctx); let expr1_0 = constructor_lea(ctx, &expr0_0)?; let expr2_0: Type = I64; @@ -6455,7 +6527,7 @@ pub fn constructor_ishl_i8x16_mask( &RegMemImm::Mem { addr: ref pattern1_0, } => { - // Rule at src/isa/x64/lower.isle line 633. + // Rule at src/isa/x64/lower.isle line 580. let expr0_0: Type = I64; let expr1_0 = ExtKind::None; let expr2_0 = constructor_x64_load(ctx, expr0_0, pattern1_0, &expr1_0)?; @@ -6476,7 +6548,7 @@ pub fn constructor_shr_i128( ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/lower.isle line 661. + // Rule at src/isa/x64/lower.isle line 605. let expr0_0: usize = 0; let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?; let expr2_0: usize = 1; @@ -6507,34 +6579,33 @@ pub fn constructor_shr_i128( let expr27_0: Type = I64; let expr28_0: u64 = 0; let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0)?; - let expr30_0 = C::gpr_new(ctx, expr29_0); - let expr31_0 = C::gpr_to_gpr_mem(ctx, expr30_0); - let expr32_0 = constructor_cmove(ctx, expr25_0, &expr26_0, &expr31_0, expr19_0)?; - let expr33_0 = constructor_with_flags_reg(ctx, &expr24_0, &expr32_0)?; - let expr34_0 = C::gpr_new(ctx, expr33_0); - let expr35_0: Type = I64; - let expr36_0 = C::gpr_to_gpr_mem_imm(ctx, expr6_0); - let expr37_0 = constructor_or(ctx, expr35_0, expr34_0, &expr36_0)?; - let expr38_0 = OperandSize::Size64; - let expr39_0: u32 = 64; - let expr40_0 = RegMemImm::Imm { simm32: expr39_0 }; - let expr41_0 = C::gpr_mem_imm_new(ctx, &expr40_0); - let expr42_0 = constructor_test(ctx, &expr38_0, &expr41_0, pattern1_0)?; - let expr43_0: Type = I64; - let expr44_0 = CC::Z; - let expr45_0 = C::gpr_to_gpr_mem(ctx, expr37_0); - let expr46_0 = constructor_cmove(ctx, expr43_0, &expr44_0, &expr45_0, expr9_0)?; - let expr47_0: Type = I64; - let expr48_0 = CC::Z; - let expr49_0 = C::gpr_to_gpr_mem(ctx, expr9_0); - let expr50_0: Type = I64; - let expr51_0: u64 = 0; - let expr52_0 = constructor_imm(ctx, expr50_0, expr51_0)?; - let expr53_0 = C::gpr_new(ctx, expr52_0); - let expr54_0 = constructor_cmove(ctx, expr47_0, &expr48_0, &expr49_0, expr53_0)?; - let expr55_0 = constructor_consumes_flags_concat(ctx, &expr46_0, &expr54_0)?; - let expr56_0 = constructor_with_flags(ctx, &expr42_0, &expr55_0)?; - return Some(expr56_0); + let expr30_0 = C::reg_to_gpr_mem(ctx, expr29_0); + let expr31_0 = constructor_cmove(ctx, expr25_0, &expr26_0, &expr30_0, expr19_0)?; + let expr32_0 = constructor_with_flags_reg(ctx, &expr24_0, &expr31_0)?; + let expr33_0 = C::gpr_new(ctx, expr32_0); + let expr34_0: Type = I64; + let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr6_0); + let expr36_0 = constructor_or(ctx, expr34_0, expr33_0, &expr35_0)?; + let expr37_0 = OperandSize::Size64; + let expr38_0: u32 = 64; + let expr39_0 = RegMemImm::Imm { simm32: expr38_0 }; + let expr40_0 = C::gpr_mem_imm_new(ctx, &expr39_0); + let expr41_0 = constructor_test(ctx, &expr37_0, &expr40_0, pattern1_0)?; + let expr42_0: Type = I64; + let expr43_0 = CC::Z; + let expr44_0 = C::gpr_to_gpr_mem(ctx, expr36_0); + let expr45_0 = constructor_cmove(ctx, expr42_0, &expr43_0, &expr44_0, expr9_0)?; + let expr46_0: Type = I64; + let expr47_0 = CC::Z; + let expr48_0 = C::gpr_to_gpr_mem(ctx, expr9_0); + let expr49_0: Type = I64; + let expr50_0: u64 = 0; + let expr51_0 = constructor_imm(ctx, expr49_0, expr50_0)?; + let expr52_0 = C::gpr_new(ctx, expr51_0); + let expr53_0 = constructor_cmove(ctx, expr46_0, &expr47_0, &expr48_0, expr52_0)?; + let expr54_0 = constructor_consumes_flags_concat(ctx, &expr45_0, &expr53_0)?; + let expr55_0 = constructor_with_flags(ctx, &expr41_0, &expr54_0)?; + return Some(expr55_0); } // Generated as internal constructor for term ushr_i8x16_mask. @@ -6545,12 +6616,12 @@ pub fn constructor_ushr_i8x16_mask( let pattern0_0 = arg0; match pattern0_0 { &RegMemImm::Imm { simm32: pattern1_0 } => { - // Rule at src/isa/x64/lower.isle line 720. + // Rule at src/isa/x64/lower.isle line 662. let expr0_0 = C::ushr_i8x16_mask_for_const(ctx, pattern1_0); return Some(expr0_0); } &RegMemImm::Reg { reg: pattern1_0 } => { - // Rule at src/isa/x64/lower.isle line 729. + // Rule at src/isa/x64/lower.isle line 671. let expr0_0 = C::ushr_i8x16_mask_table(ctx); let expr1_0 = constructor_lea(ctx, &expr0_0)?; let expr2_0: Type = I64; @@ -6567,7 +6638,7 @@ pub fn constructor_ushr_i8x16_mask( &RegMemImm::Mem { addr: ref pattern1_0, } => { - // Rule at src/isa/x64/lower.isle line 739. + // Rule at src/isa/x64/lower.isle line 682. let expr0_0: Type = I64; let expr1_0 = ExtKind::None; let expr2_0 = constructor_x64_load(ctx, expr0_0, pattern1_0, &expr1_0)?; @@ -6588,7 +6659,7 @@ pub fn constructor_sar_i128( ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/lower.isle line 767. + // Rule at src/isa/x64/lower.isle line 707. let expr0_0: usize = 0; let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?; let expr2_0: usize = 1; @@ -6619,34 +6690,33 @@ pub fn constructor_sar_i128( let expr27_0: Type = I64; let expr28_0: u64 = 0; let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0)?; - let expr30_0 = C::gpr_new(ctx, expr29_0); - let expr31_0 = C::gpr_to_gpr_mem(ctx, expr30_0); - let expr32_0 = constructor_cmove(ctx, expr25_0, &expr26_0, &expr31_0, expr19_0)?; - let expr33_0 = constructor_with_flags_reg(ctx, &expr24_0, &expr32_0)?; - let expr34_0 = C::gpr_new(ctx, expr33_0); - let expr35_0: Type = I64; - let expr36_0 = C::gpr_to_gpr_mem_imm(ctx, expr34_0); - let expr37_0 = constructor_or(ctx, expr35_0, expr6_0, &expr36_0)?; - let expr38_0: Type = I64; - let expr39_0: u8 = 63; - let expr40_0 = C::imm8_to_imm8_gpr(ctx, expr39_0); - let expr41_0 = constructor_sar(ctx, expr38_0, expr3_0, &expr40_0)?; - let expr42_0 = OperandSize::Size64; - let expr43_0: u32 = 64; - let expr44_0 = RegMemImm::Imm { simm32: expr43_0 }; - let expr45_0 = C::gpr_mem_imm_new(ctx, &expr44_0); - let expr46_0 = constructor_test(ctx, &expr42_0, &expr45_0, pattern1_0)?; - let expr47_0: Type = I64; - let expr48_0 = CC::Z; - let expr49_0 = C::gpr_to_gpr_mem(ctx, expr37_0); - let expr50_0 = constructor_cmove(ctx, expr47_0, &expr48_0, &expr49_0, expr9_0)?; - let expr51_0: Type = I64; - let expr52_0 = CC::Z; - let expr53_0 = C::gpr_to_gpr_mem(ctx, expr9_0); - let expr54_0 = constructor_cmove(ctx, expr51_0, &expr52_0, &expr53_0, expr41_0)?; - let expr55_0 = constructor_consumes_flags_concat(ctx, &expr50_0, &expr54_0)?; - let expr56_0 = constructor_with_flags(ctx, &expr46_0, &expr55_0)?; - return Some(expr56_0); + let expr30_0 = C::reg_to_gpr_mem(ctx, expr29_0); + let expr31_0 = constructor_cmove(ctx, expr25_0, &expr26_0, &expr30_0, expr19_0)?; + let expr32_0 = constructor_with_flags_reg(ctx, &expr24_0, &expr31_0)?; + let expr33_0 = C::gpr_new(ctx, expr32_0); + let expr34_0: Type = I64; + let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr33_0); + let expr36_0 = constructor_or(ctx, expr34_0, expr6_0, &expr35_0)?; + let expr37_0: Type = I64; + let expr38_0: u8 = 63; + let expr39_0 = C::imm8_to_imm8_gpr(ctx, expr38_0); + let expr40_0 = constructor_sar(ctx, expr37_0, expr3_0, &expr39_0)?; + let expr41_0 = OperandSize::Size64; + let expr42_0: u32 = 64; + let expr43_0 = RegMemImm::Imm { simm32: expr42_0 }; + let expr44_0 = C::gpr_mem_imm_new(ctx, &expr43_0); + let expr45_0 = constructor_test(ctx, &expr41_0, &expr44_0, pattern1_0)?; + let expr46_0: Type = I64; + let expr47_0 = CC::Z; + let expr48_0 = C::gpr_to_gpr_mem(ctx, expr36_0); + let expr49_0 = constructor_cmove(ctx, expr46_0, &expr47_0, &expr48_0, expr9_0)?; + let expr50_0: Type = I64; + let expr51_0 = CC::Z; + let expr52_0 = C::gpr_to_gpr_mem(ctx, expr9_0); + let expr53_0 = constructor_cmove(ctx, expr50_0, &expr51_0, &expr52_0, expr40_0)?; + let expr54_0 = constructor_consumes_flags_concat(ctx, &expr49_0, &expr53_0)?; + let expr55_0 = constructor_with_flags(ctx, &expr45_0, &expr54_0)?; + return Some(expr55_0); } // Generated as internal constructor for term sshr_i8x16_bigger_shift. @@ -6659,7 +6729,7 @@ pub fn constructor_sshr_i8x16_bigger_shift( let pattern1_0 = arg1; match pattern1_0 { &RegMemImm::Imm { simm32: pattern2_0 } => { - // Rule at src/isa/x64/lower.isle line 831. + // Rule at src/isa/x64/lower.isle line 771. let expr0_0: u32 = 8; let expr1_0 = C::u32_add(ctx, pattern2_0, expr0_0); let expr2_0 = RegMemImm::Imm { simm32: expr1_0 }; @@ -6667,7 +6737,7 @@ pub fn constructor_sshr_i8x16_bigger_shift( return Some(expr3_0); } &RegMemImm::Reg { reg: pattern2_0 } => { - // Rule at src/isa/x64/lower.isle line 833. + // Rule at src/isa/x64/lower.isle line 773. let expr0_0 = C::gpr_new(ctx, pattern2_0); let expr1_0: u32 = 8; let expr2_0 = RegMemImm::Imm { simm32: expr1_0 }; @@ -6681,7 +6751,7 @@ pub fn constructor_sshr_i8x16_bigger_shift( &RegMemImm::Mem { addr: ref pattern2_0, } => { - // Rule at src/isa/x64/lower.isle line 837. + // Rule at src/isa/x64/lower.isle line 777. let expr0_0: u64 = 8; let expr1_0 = constructor_imm(ctx, pattern0_0, expr0_0)?; let expr2_0 = C::gpr_new(ctx, expr1_0); @@ -6708,21 +6778,21 @@ pub fn constructor_sse_and_not( if pattern0_0 == F32X4 { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 1276. + // Rule at src/isa/x64/lower.isle line 1203. let expr0_0 = constructor_andnps(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } if pattern0_0 == F64X2 { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 1277. + // Rule at src/isa/x64/lower.isle line 1204. let expr0_0 = constructor_andnpd(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/lower.isle line 1278. + // Rule at src/isa/x64/lower.isle line 1205. let expr0_0 = constructor_pandn(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } @@ -6732,7 +6802,7 @@ pub fn constructor_sse_and_not( // Generated as internal constructor for term i128_not. pub fn constructor_i128_not(ctx: &mut C, arg0: Value) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/lower.isle line 1343. + // Rule at src/isa/x64/lower.isle line 1268. let expr0_0 = C::put_in_regs(ctx, pattern0_0); let expr1_0: usize = 0; let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; @@ -6759,7 +6829,7 @@ pub fn constructor_vec_insert_lane( let pattern2_0 = arg1; let pattern3_0 = arg2; let pattern4_0 = arg3; - // Rule at src/isa/x64/lower.isle line 1397. + // Rule at src/isa/x64/lower.isle line 1322. let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0); let expr1_0 = constructor_pinsrb(ctx, pattern2_0, &expr0_0, pattern4_0)?; return Some(expr1_0); @@ -6768,7 +6838,7 @@ pub fn constructor_vec_insert_lane( let pattern2_0 = arg1; let pattern3_0 = arg2; let pattern4_0 = arg3; - // Rule at src/isa/x64/lower.isle line 1401. + // Rule at src/isa/x64/lower.isle line 1326. let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0); let expr1_0 = constructor_pinsrw(ctx, pattern2_0, &expr0_0, pattern4_0)?; return Some(expr1_0); @@ -6777,7 +6847,7 @@ pub fn constructor_vec_insert_lane( let pattern2_0 = arg1; let pattern3_0 = arg2; let pattern4_0 = arg3; - // Rule at src/isa/x64/lower.isle line 1405. + // Rule at src/isa/x64/lower.isle line 1330. let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0); let expr1_0 = OperandSize::Size32; let expr2_0 = constructor_pinsrd(ctx, pattern2_0, &expr0_0, pattern4_0, &expr1_0)?; @@ -6787,7 +6857,7 @@ pub fn constructor_vec_insert_lane( let pattern2_0 = arg1; let pattern3_0 = arg2; let pattern4_0 = arg3; - // Rule at src/isa/x64/lower.isle line 1409. + // Rule at src/isa/x64/lower.isle line 1334. let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0); let expr1_0 = OperandSize::Size64; let expr2_0 = constructor_pinsrd(ctx, pattern2_0, &expr0_0, pattern4_0, &expr1_0)?; @@ -6797,7 +6867,7 @@ pub fn constructor_vec_insert_lane( let pattern2_0 = arg1; let pattern3_0 = arg2; let pattern4_0 = arg3; - // Rule at src/isa/x64/lower.isle line 1413. + // Rule at src/isa/x64/lower.isle line 1338. let expr0_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0); let expr1_0 = C::sse_insertps_lane_imm(ctx, pattern4_0); let expr2_0 = constructor_insertps(ctx, pattern2_0, &expr0_0, expr1_0)?; @@ -6809,16 +6879,15 @@ pub fn constructor_vec_insert_lane( if let &RegMem::Reg { reg: pattern4_0 } = pattern3_0 { let pattern5_0 = arg3; if pattern5_0 == 0 { - // Rule at src/isa/x64/lower.isle line 1435. - let expr0_0 = RegMem::Reg { reg: pattern4_0 }; - let expr1_0 = C::reg_mem_to_xmm_mem(ctx, &expr0_0); - let expr2_0 = constructor_movsd(ctx, pattern2_0, &expr1_0)?; - return Some(expr2_0); + // Rule at src/isa/x64/lower.isle line 1360. + let expr0_0 = constructor_reg_to_xmm_mem(ctx, pattern4_0)?; + let expr1_0 = constructor_movsd(ctx, pattern2_0, &expr0_0)?; + return Some(expr1_0); } } let pattern4_0 = arg3; if pattern4_0 == 0 { - // Rule at src/isa/x64/lower.isle line 1437. + // Rule at src/isa/x64/lower.isle line 1362. let expr0_0 = SseOpcode::Movsd; let expr1_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0); let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?; @@ -6827,7 +6896,7 @@ pub fn constructor_vec_insert_lane( return Some(expr4_0); } if pattern4_0 == 1 { - // Rule at src/isa/x64/lower.isle line 1446. + // Rule at src/isa/x64/lower.isle line 1371. let expr0_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0); let expr1_0 = constructor_movlhps(ctx, pattern2_0, &expr0_0)?; return Some(expr1_0); @@ -6849,7 +6918,7 @@ pub fn constructor_cmp_and_choose( let pattern2_0 = arg1; let pattern3_0 = arg2; let pattern4_0 = arg3; - // Rule at src/isa/x64/lower.isle line 1454. + // Rule at src/isa/x64/lower.isle line 1379. let expr0_0 = constructor_put_in_gpr(ctx, pattern3_0)?; let expr1_0 = constructor_put_in_gpr(ctx, pattern4_0)?; let expr2_0 = C::raw_operand_size_of_type(ctx, pattern1_0); diff --git a/cranelift/codegen/src/prelude.isle b/cranelift/codegen/src/prelude.isle index 174738aaa0..c58a7113ce 100644 --- a/cranelift/codegen/src/prelude.isle +++ b/cranelift/codegen/src/prelude.isle @@ -431,4 +431,10 @@ (decl reloc_distance_near () RelocDistance) (extern extractor reloc_distance_near reloc_distance_near) +;;;; Automatic conversions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(convert Inst Value def_inst) +(convert Reg ValueRegs value_reg) +(convert Value Reg put_in_reg) +(convert Value ValueRegs put_in_regs) +(convert WritableReg Reg writable_reg_to_reg)