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)