diff --git a/cranelift/codegen/src/isa/x64/inst.isle b/cranelift/codegen/src/isa/x64/inst.isle index 6a9b48dd73..cc7bd8bc7f 100644 --- a/cranelift/codegen/src/isa/x64/inst.isle +++ b/cranelift/codegen/src/isa/x64/inst.isle @@ -784,6 +784,7 @@ (decl put_masked_in_imm8_gpr (Value Type) Imm8Gpr) (extern constructor put_masked_in_imm8_gpr put_masked_in_imm8_gpr) +;; Condition codes (type CC extern (enum O NO @@ -801,6 +802,8 @@ NLE P NP)) +(decl intcc_to_cc (IntCC) CC) +(extern constructor intcc_to_cc intcc_to_cc) (type Avx512Opcode extern (enum Vcvtudq2ps @@ -1362,6 +1365,16 @@ src1 src2)) +(decl x64_and_with_flags_paired (Type Gpr GprMemImm) ProducesFlags) +(rule (x64_and_with_flags_paired ty src1 src2) + (let ((dst WritableGpr (temp_writable_gpr))) + (ProducesFlags.ProducesFlagsSideEffect + (MInst.AluRmiR (operand_size_of_type_32_64 ty) + (AluRmiROpcode.And) + src1 + src2 + dst)))) + ;; Helper for emitting `or` instructions. (decl or (Type Gpr GprMemImm) Gpr) (rule (or ty src1 src2) @@ -1992,65 +2005,57 @@ (rule (movlhps src1 src2) (xmm_rm_r $I8X16 (SseOpcode.Movlhps) src1 src2)) -;; Helper for creating `pmaxsb` instructions. +;; Helpers for creating `pmaxs*` instructions. +(decl pmaxs (Type Xmm XmmMem) Xmm) +(rule (pmaxs $I8X16 x y) (pmaxsb x y)) +(rule (pmaxs $I16X8 x y) (pmaxsw x y)) +(rule (pmaxs $I32X4 x y) (pmaxsd x y)) +;; No $I64X2 version (PMAXSQ) in SSE4.1. (decl pmaxsb (Xmm XmmMem) Xmm) -(rule (pmaxsb src1 src2) - (xmm_rm_r $I8X16 (SseOpcode.Pmaxsb) src1 src2)) - -;; Helper for creating `pmaxsw` instructions. +(rule (pmaxsb src1 src2) (xmm_rm_r $I8X16 (SseOpcode.Pmaxsb) src1 src2)) (decl pmaxsw (Xmm XmmMem) Xmm) -(rule (pmaxsw src1 src2) - (xmm_rm_r $I8X16 (SseOpcode.Pmaxsw) src1 src2)) - -;; Helper for creating `pmaxsd` instructions. +(rule (pmaxsw src1 src2) (xmm_rm_r $I8X16 (SseOpcode.Pmaxsw) src1 src2)) (decl pmaxsd (Xmm XmmMem) Xmm) -(rule (pmaxsd src1 src2) - (xmm_rm_r $I8X16 (SseOpcode.Pmaxsd) src1 src2)) +(rule (pmaxsd src1 src2) (xmm_rm_r $I8X16 (SseOpcode.Pmaxsd) src1 src2)) -;; Helper for creating `pminsb` instructions. +;; Helpers for creating `pmins*` instructions. +(decl pmins (Type Xmm XmmMem) Xmm) +(rule (pmins $I8X16 x y) (pminsb x y)) +(rule (pmins $I16X8 x y) (pminsw x y)) +(rule (pmins $I32X4 x y) (pminsd x y)) +;; No $I64X2 version (PMINSQ) in SSE4.1. (decl pminsb (Xmm XmmMem) Xmm) -(rule (pminsb src1 src2) - (xmm_rm_r $I8X16 (SseOpcode.Pminsb) src1 src2)) - -;; Helper for creating `pminsw` instructions. +(rule (pminsb src1 src2) (xmm_rm_r $I8X16 (SseOpcode.Pminsb) src1 src2)) (decl pminsw (Xmm XmmMem) Xmm) -(rule (pminsw src1 src2) - (xmm_rm_r $I8X16 (SseOpcode.Pminsw) src1 src2)) - -;; Helper for creating `pminsd` instructions. +(rule (pminsw src1 src2) (xmm_rm_r $I16X8 (SseOpcode.Pminsw) src1 src2)) (decl pminsd (Xmm XmmMem) Xmm) -(rule (pminsd src1 src2) - (xmm_rm_r $I8X16 (SseOpcode.Pminsd) src1 src2)) +(rule (pminsd src1 src2) (xmm_rm_r $I32X4 (SseOpcode.Pminsd) src1 src2)) -;; Helper for creating `pmaxub` instructions. +;; Helpers for creating `pmaxu*` instructions. +(decl pmaxu (Type Xmm XmmMem) Xmm) +(rule (pmaxu $I8X16 x y) (pmaxub x y)) +(rule (pmaxu $I16X8 x y) (pmaxuw x y)) +(rule (pmaxu $I32X4 x y) (pmaxud x y)) +;; No $I64X2 version (PMAXUQ) in SSE4.1. (decl pmaxub (Xmm XmmMem) Xmm) -(rule (pmaxub src1 src2) - (xmm_rm_r $I8X16 (SseOpcode.Pmaxub) src1 src2)) - -;; Helper for creating `pmaxuw` instructions. +(rule (pmaxub src1 src2) (xmm_rm_r $I8X16 (SseOpcode.Pmaxub) src1 src2)) (decl pmaxuw (Xmm XmmMem) Xmm) -(rule (pmaxuw src1 src2) - (xmm_rm_r $I8X16 (SseOpcode.Pmaxuw) src1 src2)) - -;; Helper for creating `pmaxud` instructions. +(rule (pmaxuw src1 src2) (xmm_rm_r $I8X16 (SseOpcode.Pmaxuw) src1 src2)) (decl pmaxud (Xmm XmmMem) Xmm) -(rule (pmaxud src1 src2) - (xmm_rm_r $I8X16 (SseOpcode.Pmaxud) src1 src2)) +(rule (pmaxud src1 src2) (xmm_rm_r $I8X16 (SseOpcode.Pmaxud) src1 src2)) -;; Helper for creating `pminub` instructions. +;; Helper for creating `pminu*` instructions. +(decl pminu (Type Xmm XmmMem) Xmm) +(rule (pminu $I8X16 x y) (pminub x y)) +(rule (pminu $I16X8 x y) (pminuw x y)) +(rule (pminu $I32X4 x y) (pminud x y)) +;; No $I64X2 version (PMINUQ) in SSE4.1. (decl pminub (Xmm XmmMem) Xmm) -(rule (pminub src1 src2) - (xmm_rm_r $I8X16 (SseOpcode.Pminub) src1 src2)) - -;; Helper for creating `pminuw` instructions. +(rule (pminub src1 src2) (xmm_rm_r $I8X16 (SseOpcode.Pminub) src1 src2)) (decl pminuw (Xmm XmmMem) Xmm) -(rule (pminuw src1 src2) - (xmm_rm_r $I8X16 (SseOpcode.Pminuw) src1 src2)) - -;; Helper for creating `pminud` instructions. +(rule (pminuw src1 src2) (xmm_rm_r $I8X16 (SseOpcode.Pminuw) src1 src2)) (decl pminud (Xmm XmmMem) Xmm) -(rule (pminud src1 src2) - (xmm_rm_r $I8X16 (SseOpcode.Pminud) src1 src2)) +(rule (pminud src1 src2) (xmm_rm_r $I8X16 (SseOpcode.Pminud) src1 src2)) ;; Helper for creating `punpcklbw` instructions. (decl punpcklbw (Xmm XmmMem) Xmm) @@ -2498,6 +2503,38 @@ (_ Unit (emit (MInst.XmmRmR (SseOpcode.Maxpd) x y dst)))) dst)) +;; Helpers for creating `pcmpeq*` instructions. +(decl pcmpeq (Type Xmm XmmMem) Xmm) +(rule (pcmpeq $I8X16 x y) (pcmpeqb x y)) +(rule (pcmpeq $I16X8 x y) (pcmpeqw x y)) +(rule (pcmpeq $I32X4 x y) (pcmpeqd x y)) +(rule (pcmpeq $I64X2 x y) (pcmpeqq x y)) + +(decl pcmpeqb (Xmm XmmMem) Xmm) +(rule (pcmpeqb x y) (xmm_rm_r $I8X16 (SseOpcode.Pcmpeqb) x y)) +(decl pcmpeqw (Xmm XmmMem) Xmm) +(rule (pcmpeqw x y) (xmm_rm_r $I16X8 (SseOpcode.Pcmpeqw) x y)) +(decl pcmpeqd (Xmm XmmMem) Xmm) +(rule (pcmpeqd x y) (xmm_rm_r $I32X4 (SseOpcode.Pcmpeqd) x y)) +(decl pcmpeqq (Xmm XmmMem) Xmm) +(rule (pcmpeqq x y) (xmm_rm_r $I64X2 (SseOpcode.Pcmpeqq) x y)) + +;; Helpers for creating `pcmpgt*` instructions. +(decl pcmpgt (Type Xmm XmmMem) Xmm) +(rule (pcmpgt $I8X16 x y) (pcmpgtb x y)) +(rule (pcmpgt $I16X8 x y) (pcmpgtw x y)) +(rule (pcmpgt $I32X4 x y) (pcmpgtd x y)) +(rule (pcmpgt $I64X2 x y) (pcmpgtq x y)) + +(decl pcmpgtb (Xmm XmmMem) Xmm) +(rule (pcmpgtb x y) (xmm_rm_r $I8X16 (SseOpcode.Pcmpgtb) x y)) +(decl pcmpgtw (Xmm XmmMem) Xmm) +(rule (pcmpgtw x y) (xmm_rm_r $I16X8 (SseOpcode.Pcmpgtw) x y)) +(decl pcmpgtd (Xmm XmmMem) Xmm) +(rule (pcmpgtd x y) (xmm_rm_r $I32X4 (SseOpcode.Pcmpgtd) x y)) +(decl pcmpgtq (Xmm XmmMem) Xmm) +(rule (pcmpgtq x y) (xmm_rm_r $I64X2 (SseOpcode.Pcmpgtq) x y)) + ;;;; Automatic conversions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (convert Gpr InstOutput output_gpr) @@ -2547,6 +2584,8 @@ (convert SyntheticAmode GprMem synthetic_amode_to_gpr_mem) (convert SyntheticAmode XmmMem synthetic_amode_to_xmm_mem) +(convert IntCC CC intcc_to_cc) + (decl reg_to_xmm_mem (Reg) XmmMem) (rule (reg_to_xmm_mem r) (xmm_to_xmm_mem (xmm_new r))) diff --git a/cranelift/codegen/src/isa/x64/lower.isle b/cranelift/codegen/src/isa/x64/lower.isle index cb7636939d..883f86bf5d 100644 --- a/cranelift/codegen/src/isa/x64/lower.isle +++ b/cranelift/codegen/src/isa/x64/lower.isle @@ -1440,6 +1440,107 @@ (rule (lower (resumable_trap code)) (safepoint (ud2 code))) +;;;; Rules for `icmp` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; For GPR-held values we only need to emit `CMP + SETCC`. We rely here on +;; Cranelift's verification that `a` and `b` are of the same type. +;; Unfortunately for clarity, the registers are flipped here (TODO). +(rule (lower (icmp cc a @ (value_type (fits_in_64 ty)) b)) + (let ((size OperandSize (raw_operand_size_of_type ty))) + (with_flags (cmp size b a) (setcc cc)))) + +;; For XMM-held values, we lower to `PCMP*` instructions, sometimes more than +;; one. To note: what is different here about the output values is that each +;; lane will be filled with all 1s or all 0s according to the comparison, +;; whereas for GPR-held values, the result will be simply 0 or 1 (upper bits +;; unset). +(rule (lower (icmp (IntCC.Equal) a @ (value_type (vec128 ty)) b)) + (pcmpeq ty a b)) +;; To lower a not-equals comparison, we perform an equality comparison +;; (PCMPEQ*) and then invert the bits (PXOR with all 1s). +(rule (lower (icmp (IntCC.NotEqual) a @ (value_type (vec128 ty)) b)) + (let ((checked Xmm (pcmpeq ty a b)) + (all_ones Xmm (vector_all_ones ty))) + (pxor checked all_ones))) +;; Signed comparisons have a single-instruction lowering, unlike their unsigned +;; counterparts. These latter instructions use the unsigned min/max +;; (PMINU*/PMAXU*) and negate the result (PXOR with all 1s). +(rule (lower (icmp (IntCC.SignedGreaterThan) a @ (value_type (vec128 ty)) b)) + (pcmpgt ty a b)) +(rule (lower (icmp (IntCC.SignedLessThan) a @ (value_type (vec128 ty)) b)) + (pcmpgt ty b a)) +(rule (lower (icmp (IntCC.UnsignedGreaterThan) a @ (value_type (vec128 ty)) b)) + (let ((max Xmm (pmaxu ty a b)) + (eq Xmm (pcmpeq ty max b)) + (all_ones Xmm (vector_all_ones ty))) + (pxor eq all_ones))) +(rule (lower (icmp (IntCC.UnsignedLessThan) a @ (value_type (vec128 ty)) b)) + (let ((min Xmm (pminu ty a b)) + (eq Xmm (pcmpeq ty min b)) + (all_ones Xmm (vector_all_ones ty))) + (pxor eq all_ones))) +;; To lower signed and unsigned *-or-equals comparisons, we find the minimum +;; number (PMIN[U|S]*) and compare that to one of the terms (PCMPEQ*). Note that +;; there is no 64x2 version of this lowering (see below). +(rule (lower (icmp (IntCC.SignedGreaterThanOrEqual) a @ (value_type (vec128 ty)) b)) + (let ((max Xmm (pmaxs ty a b))) + (pcmpeq ty a max))) +(rule (lower (icmp (IntCC.SignedLessThanOrEqual) a @ (value_type (vec128 ty)) b)) + (let ((min Xmm (pmins ty a b))) + (pcmpeq ty a min))) +(rule (lower (icmp (IntCC.UnsignedGreaterThanOrEqual) a @ (value_type (vec128 ty)) b)) + (let ((max Xmm (pmaxu ty a b))) + (pcmpeq ty a max))) +(rule (lower (icmp (IntCC.UnsignedLessThanOrEqual) a @ (value_type (vec128 ty)) b)) + (let ((min Xmm (pminu ty a b))) + (pcmpeq ty a min))) +;; The PMIN[S|U]Q instruction is only available in AVX512VL/F so we must instead +;; compare with flipped operands (PCMPGT*) and negate the result (PXOR with all +;; 1s), emitting one more instruction than the smaller-lane versions. +(rule (lower (icmp (IntCC.SignedGreaterThanOrEqual) a @ (value_type $I64X2) b)) + (let ((checked Xmm (pcmpgt $I64X2 b a)) + (all_ones Xmm (vector_all_ones $I64X2))) + (pxor checked all_ones))) +(rule (lower (icmp (IntCC.SignedLessThanOrEqual) a @ (value_type $I64X2) b)) + (let ((checked Xmm (pcmpgt $I64X2 a b)) + (all_ones Xmm (vector_all_ones $I64X2))) + (pxor checked all_ones))) +;; TODO: not used by WebAssembly translation +;; (rule (lower (icmp (IntCC.UnsignedGreaterThanOrEqual) a @ (value_type $I64X2) b)) +;; TODO: not used by WebAssembly translation +;; (rule (lower (icmp (IntCC.UnsignedLessThanOrEqual) a @ (value_type $I64X2) b)) + +;; For I128 values (held in two GPRs), the instruction sequences depend on what +;; kind of condition is tested. +(rule (lower (icmp (IntCC.Equal) a @ (value_type $I128) b)) + (let ((a_lo Gpr (value_regs_get_gpr a 0)) + (a_hi Gpr (value_regs_get_gpr a 1)) + (b_lo Gpr (value_regs_get_gpr b 0)) + (b_hi Gpr (value_regs_get_gpr b 1)) + (cmp_lo Reg (with_flags_reg (cmp (OperandSize.Size64) b_lo a_lo) (setcc (CC.Z)))) + (cmp_hi Reg (with_flags_reg (cmp (OperandSize.Size64) b_hi a_hi) (setcc (CC.Z)))) + ;; At this point, `cmp_lo` and `cmp_hi` contain either 0 or 1 in the + ;; lowest 8 bits--`SETcc` guarantees this. The upper bits may be + ;; unchanged so we must compare against 1; this instruction combines + ;; `cmp_lo` and `cmp_hi` for that final comparison. + (cmp Reg (x64_and $I64 cmp_lo cmp_hi))) + ;; We can use the flag-setting behavior of `AND` to set the final + ;; bits. If the result of `AND` is zero, then the `ZF` will be set; + ;; if either of the halves `AND`s to 0, they were not equal, + ;; therefore we `SETcc` with `NZ`. + (with_flags (x64_and_with_flags_paired $I64 cmp (RegMemImm.Imm 1)) (setcc (CC.NZ))))) + +(rule (lower (icmp (IntCC.NotEqual) a @ (value_type $I128) b)) + (let ((a_lo Gpr (value_regs_get_gpr a 0)) + (a_hi Gpr (value_regs_get_gpr a 1)) + (b_lo Gpr (value_regs_get_gpr b 0)) + (b_hi Gpr (value_regs_get_gpr b 1)) + (cmp_lo Reg (with_flags_reg (cmp (OperandSize.Size64) b_lo a_lo) (setcc (CC.NZ)))) + (cmp_hi Reg (with_flags_reg (cmp (OperandSize.Size64) b_hi a_hi) (setcc (CC.NZ)))) + ;; See comments for `IntCC.Equal`. + (cmp Reg (or $I64 cmp_lo cmp_hi))) + (with_flags (x64_and_with_flags_paired $I64 cmp (RegMemImm.Imm 1)) (setcc (CC.NZ))))) + ;;;; Rules for `select` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; CLIF `select` instructions receive a testable argument (i.e. boolean or @@ -1715,8 +1816,8 @@ (mul Gpr (mul $I32 masked4 (RegMemImm.Imm 0x01010101))) (final Gpr (shr $I32 mul (Imm8Reg.Imm8 24)))) final)) - - + + (rule 1 (lower (has_type (and $I8X16 (avx512vl_enabled) @@ -1725,7 +1826,7 @@ (vpopcntb src)) - + ;; For SSE 4.2 we use Mula's algorithm (https://arxiv.org/pdf/1611.07612.pdf): ;; ;; __m128i count_bytes ( __m128i v) { @@ -1807,7 +1908,7 @@ (shl ty lo4 (Imm8Reg.Imm8 4)) hi4))) swap4)) - + (decl do_bitrev16 (Type Gpr) Gpr) (rule (do_bitrev16 ty src) (let ((src_ Gpr (do_bitrev8 ty src)) @@ -1819,7 +1920,7 @@ (shl ty lo8 (Imm8Reg.Imm8 8)) hi8))) swap8)) - + (decl do_bitrev32 (Type Gpr) Gpr) (rule (do_bitrev32 ty src) (let ((src_ Gpr (do_bitrev16 ty src)) diff --git a/cranelift/codegen/src/isa/x64/lower.rs b/cranelift/codegen/src/isa/x64/lower.rs index 39adcf85c4..3b9341420c 100644 --- a/cranelift/codegen/src/isa/x64/lower.rs +++ b/cranelift/codegen/src/isa/x64/lower.rs @@ -920,145 +920,12 @@ fn lower_insn_to_regs>( let condcode = ctx.data(insn).cond_code().unwrap(); let dst = get_output_reg(ctx, outputs[0]).only_reg().unwrap(); let ty = ctx.input_ty(insn, 0); - if !ty.is_vector() { + if ty == types::I128 && condcode != IntCC::Equal && condcode != IntCC::NotEqual { let condcode = emit_cmp(ctx, insn, condcode); let cc = CC::from_intcc(condcode); ctx.emit(Inst::setcc(cc, dst)); } else { - assert_eq!(ty.bits(), 128); - let eq = |ty| match ty { - types::I8X16 => SseOpcode::Pcmpeqb, - types::I16X8 => SseOpcode::Pcmpeqw, - types::I32X4 => SseOpcode::Pcmpeqd, - types::I64X2 => SseOpcode::Pcmpeqq, - _ => panic!( - "Unable to find an instruction for {} for type: {}", - condcode, ty - ), - }; - let gt = |ty| match ty { - types::I8X16 => SseOpcode::Pcmpgtb, - types::I16X8 => SseOpcode::Pcmpgtw, - types::I32X4 => SseOpcode::Pcmpgtd, - types::I64X2 => SseOpcode::Pcmpgtq, - _ => panic!( - "Unable to find an instruction for {} for type: {}", - condcode, ty - ), - }; - let maxu = |ty| match ty { - types::I8X16 => SseOpcode::Pmaxub, - types::I16X8 => SseOpcode::Pmaxuw, - types::I32X4 => SseOpcode::Pmaxud, - _ => panic!( - "Unable to find an instruction for {} for type: {}", - condcode, ty - ), - }; - let mins = |ty| match ty { - types::I8X16 => SseOpcode::Pminsb, - types::I16X8 => SseOpcode::Pminsw, - types::I32X4 => SseOpcode::Pminsd, - _ => panic!( - "Unable to find an instruction for {} for type: {}", - condcode, ty - ), - }; - let minu = |ty| match ty { - types::I8X16 => SseOpcode::Pminub, - types::I16X8 => SseOpcode::Pminuw, - types::I32X4 => SseOpcode::Pminud, - _ => panic!( - "Unable to find an instruction for {} for type: {}", - condcode, ty - ), - }; - - // Here we decide which operand to use as the read/write `dst` (ModRM reg field) and - // which to use as the read `input` (ModRM r/m field). In the normal case we use - // Cranelift's first operand, the `lhs`, as `dst` but we flip the operands for the - // less-than cases so that we can reuse the greater-than implementation. - // - // In a surprising twist, the operands for i64x2 `gte`/`sle` must also be flipped - // from the normal order because of the special-case lowering for these instructions - // (i.e. we use PCMPGTQ with flipped operands and negate the result). - let input = match condcode { - IntCC::SignedLessThanOrEqual if ty == types::I64X2 => { - let lhs = put_input_in_reg(ctx, inputs[0]); - let rhs = input_to_reg_mem(ctx, inputs[1]); - ctx.emit(Inst::gen_move(dst, lhs, ty)); - rhs - } - IntCC::SignedGreaterThanOrEqual if ty == types::I64X2 => { - let lhs = input_to_reg_mem(ctx, inputs[0]); - let rhs = put_input_in_reg(ctx, inputs[1]); - ctx.emit(Inst::gen_move(dst, rhs, ty)); - lhs - } - IntCC::SignedLessThan - | IntCC::SignedLessThanOrEqual - | IntCC::UnsignedLessThan - | IntCC::UnsignedLessThanOrEqual => { - let lhs = input_to_reg_mem(ctx, inputs[0]); - let rhs = put_input_in_reg(ctx, inputs[1]); - ctx.emit(Inst::gen_move(dst, rhs, ty)); - lhs - } - _ => { - let lhs = put_input_in_reg(ctx, inputs[0]); - let rhs = input_to_reg_mem(ctx, inputs[1]); - ctx.emit(Inst::gen_move(dst, lhs, ty)); - rhs - } - }; - - match condcode { - IntCC::Equal => ctx.emit(Inst::xmm_rm_r(eq(ty), input, dst)), - IntCC::NotEqual => { - ctx.emit(Inst::xmm_rm_r(eq(ty), input, dst)); - // Emit all 1s into the `tmp` register. - let tmp = ctx.alloc_tmp(ty).only_reg().unwrap(); - ctx.emit(Inst::xmm_rm_r(eq(ty), RegMem::from(tmp), tmp)); - // Invert the result of the `PCMPEQ*`. - ctx.emit(Inst::xmm_rm_r(SseOpcode::Pxor, RegMem::from(tmp), dst)); - } - IntCC::SignedGreaterThan | IntCC::SignedLessThan => { - ctx.emit(Inst::xmm_rm_r(gt(ty), input, dst)) - } - IntCC::SignedGreaterThanOrEqual | IntCC::SignedLessThanOrEqual - if ty != types::I64X2 => - { - ctx.emit(Inst::xmm_rm_r(mins(ty), input.clone(), dst)); - ctx.emit(Inst::xmm_rm_r(eq(ty), input, dst)) - } - IntCC::SignedGreaterThanOrEqual | IntCC::SignedLessThanOrEqual - if ty == types::I64X2 => - { - // The PMINS* instruction is only available in AVX512VL/F so we must instead - // compare with flipped operands and negate the result (emitting one more - // instruction). - ctx.emit(Inst::xmm_rm_r(gt(ty), input, dst)); - // Emit all 1s into the `tmp` register. - let tmp = ctx.alloc_tmp(ty).only_reg().unwrap(); - ctx.emit(Inst::xmm_rm_r(eq(ty), RegMem::from(tmp), tmp)); - // Invert the result of the `PCMPGT*`. - ctx.emit(Inst::xmm_rm_r(SseOpcode::Pxor, RegMem::from(tmp), dst)); - } - IntCC::UnsignedGreaterThan | IntCC::UnsignedLessThan => { - ctx.emit(Inst::xmm_rm_r(maxu(ty), input.clone(), dst)); - ctx.emit(Inst::xmm_rm_r(eq(ty), input, dst)); - // Emit all 1s into the `tmp` register. - let tmp = ctx.alloc_tmp(ty).only_reg().unwrap(); - ctx.emit(Inst::xmm_rm_r(eq(ty), RegMem::from(tmp), tmp)); - // Invert the result of the `PCMPEQ*`. - ctx.emit(Inst::xmm_rm_r(SseOpcode::Pxor, RegMem::from(tmp), dst)); - } - IntCC::UnsignedGreaterThanOrEqual | IntCC::UnsignedLessThanOrEqual => { - ctx.emit(Inst::xmm_rm_r(minu(ty), input.clone(), dst)); - ctx.emit(Inst::xmm_rm_r(eq(ty), input, dst)) - } - _ => unimplemented!("Unimplemented comparison code for icmp: {}", condcode), - } + implemented_in_isle(ctx); } } diff --git a/cranelift/codegen/src/isa/x64/lower/isle.rs b/cranelift/codegen/src/isa/x64/lower/isle.rs index c20bf3b1e1..dc7b293305 100644 --- a/cranelift/codegen/src/isa/x64/lower/isle.rs +++ b/cranelift/codegen/src/isa/x64/lower/isle.rs @@ -9,8 +9,10 @@ use regalloc::Writable; use super::{is_int_or_ref_ty, is_mergeable_load, lower_to_amode, Reg}; use crate::{ ir::{ - condcodes::FloatCC, immediates::*, types::*, Inst, InstructionData, Opcode, TrapCode, - Value, ValueLabel, ValueList, + condcodes::{FloatCC, IntCC}, + immediates::*, + types::*, + Inst, InstructionData, Opcode, TrapCode, Value, ValueLabel, ValueList, }, isa::{ settings::Flags, @@ -512,6 +514,11 @@ where None } } + + #[inline] + fn intcc_to_cc(&mut self, intcc: &IntCC) -> CC { + CC::from_intcc(*intcc) + } } // Since x64 doesn't have 8x16 shifts and we must use a 16x8 shift instead, we 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 cfdb85c048..74e26f7623 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 b2bc986bcbbbb77 -src/isa/x64/inst.isle cdd292107fb36cf -src/isa/x64/lower.isle c049f7d36db0e0fb +src/isa/x64/inst.isle 5644ccb29bff0b51 +src/isa/x64/lower.isle 51d6ce13a3e47bc4 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 af72b16afe..facb5b8f43 100644 --- a/cranelift/codegen/src/isa/x64/lower/isle/generated_code.rs +++ b/cranelift/codegen/src/isa/x64/lower/isle/generated_code.rs @@ -95,6 +95,7 @@ pub trait Context { fn amode_imm_reg_reg_shift(&mut self, arg0: u32, arg1: Gpr, arg2: Gpr, arg3: u8) -> Amode; fn amode_to_synthetic_amode(&mut self, arg0: &Amode) -> SyntheticAmode; fn put_masked_in_imm8_gpr(&mut self, arg0: Value, arg1: Type) -> Imm8Gpr; + fn intcc_to_cc(&mut self, arg0: &IntCC) -> CC; fn encode_fcmp_imm(&mut self, arg0: &FcmpImm) -> u8; fn imm8_reg_to_imm8_gpr(&mut self, arg0: &Imm8Reg) -> Imm8Gpr; fn writable_gpr_to_reg(&mut self, arg0: WritableGpr) -> WritableReg; @@ -501,7 +502,7 @@ pub enum MInst { }, } -/// Internal type ExtendKind: defined at src/isa/x64/inst.isle line 1120. +/// Internal type ExtendKind: defined at src/isa/x64/inst.isle line 1123. #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum ExtendKind { Sign, @@ -782,7 +783,7 @@ pub fn constructor_operand_size_bits(ctx: &mut C, arg0: &OperandSize // 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 950. + // Rule at src/isa/x64/inst.isle line 953. 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); @@ -791,7 +792,7 @@ pub fn constructor_reg_to_gpr_mem_imm(ctx: &mut C, arg0: Reg) -> Opt // 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 957. + // Rule at src/isa/x64/inst.isle line 960. let expr0_0 = C::put_in_reg(ctx, pattern0_0); let expr1_0 = C::gpr_new(ctx, expr0_0); return Some(expr1_0); @@ -800,7 +801,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 964. + // Rule at src/isa/x64/inst.isle line 967. 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); @@ -809,7 +810,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 971. + // Rule at src/isa/x64/inst.isle line 974. 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); @@ -818,7 +819,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 978. + // Rule at src/isa/x64/inst.isle line 981. let expr0_0 = C::put_in_reg(ctx, pattern0_0); let expr1_0 = C::xmm_new(ctx, expr0_0); return Some(expr1_0); @@ -827,7 +828,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 985. + // Rule at src/isa/x64/inst.isle line 988. 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); @@ -836,7 +837,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 992. + // Rule at src/isa/x64/inst.isle line 995. 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); @@ -845,7 +846,7 @@ pub fn constructor_put_in_xmm_mem_imm(ctx: &mut C, arg0: Value) -> O // Generated as internal constructor for term output_gpr. pub fn constructor_output_gpr(ctx: &mut C, arg0: Gpr) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 997. + // Rule at src/isa/x64/inst.isle line 1000. let expr0_0 = C::gpr_to_reg(ctx, pattern0_0); let expr1_0 = constructor_output_reg(ctx, expr0_0)?; return Some(expr1_0); @@ -855,7 +856,7 @@ pub fn constructor_output_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 1002. + // Rule at src/isa/x64/inst.isle line 1005. 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); @@ -865,7 +866,7 @@ pub fn constructor_value_gprs(ctx: &mut C, arg0: Gpr, arg1: Gpr) -> // Generated as internal constructor for term output_xmm. pub fn constructor_output_xmm(ctx: &mut C, arg0: Xmm) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1007. + // Rule at src/isa/x64/inst.isle line 1010. let expr0_0 = C::xmm_to_reg(ctx, pattern0_0); let expr1_0 = constructor_output_reg(ctx, expr0_0)?; return Some(expr1_0); @@ -879,7 +880,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 1014. + // Rule at src/isa/x64/inst.isle line 1017. 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); @@ -888,7 +889,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 1027. + // Rule at src/isa/x64/inst.isle line 1030. let expr0_0 = constructor_lo_reg(ctx, pattern0_0)?; let expr1_0 = C::gpr_new(ctx, expr0_0); return Some(expr1_0); @@ -900,7 +901,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 1110. + // Rule at src/isa/x64/inst.isle line 1113. let expr0_0 = C::sink_load(ctx, pattern0_0); let expr1_0 = C::gpr_mem_imm_new(ctx, &expr0_0); return Some(expr1_0); @@ -918,12 +919,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 1132. + // Rule at src/isa/x64/inst.isle line 1135. 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 1135. + // Rule at src/isa/x64/inst.isle line 1138. 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)?; @@ -947,7 +948,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 1155. + // Rule at src/isa/x64/inst.isle line 1158. let expr0_0 = constructor_movsx(ctx, pattern2_0, pattern3_0, pattern4_0)?; return Some(expr0_0); } @@ -955,7 +956,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 1151. + // Rule at src/isa/x64/inst.isle line 1154. let expr0_0 = constructor_movzx(ctx, pattern2_0, pattern3_0, pattern4_0)?; return Some(expr0_0); } @@ -968,17 +969,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 1162. + // Rule at src/isa/x64/inst.isle line 1165. let expr0_0 = SseOpcode::Xorps; return Some(expr0_0); } if pattern0_0 == F64X2 { - // Rule at src/isa/x64/inst.isle line 1163. + // Rule at src/isa/x64/inst.isle line 1166. 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 1164. + // Rule at src/isa/x64/inst.isle line 1167. let expr0_0 = SseOpcode::Pxor; return Some(expr0_0); } @@ -995,7 +996,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 1168. + // Rule at src/isa/x64/inst.isle line 1171. 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); @@ -1005,40 +1006,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 1177. + // Rule at src/isa/x64/inst.isle line 1180. let expr0_0 = SseOpcode::Cmpps; return Some(expr0_0); } if pattern0_0 == F64X2 { - // Rule at src/isa/x64/inst.isle line 1178. + // Rule at src/isa/x64/inst.isle line 1181. 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 1173. + // Rule at src/isa/x64/inst.isle line 1176. 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 1174. + // Rule at src/isa/x64/inst.isle line 1177. 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 1175. + // Rule at src/isa/x64/inst.isle line 1178. 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 1176. + // Rule at src/isa/x64/inst.isle line 1179. let expr0_0 = SseOpcode::Pcmpeqq; return Some(expr0_0); } @@ -1050,7 +1051,7 @@ 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 1192. + // Rule at src/isa/x64/inst.isle line 1195. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0: Type = I32X4; let expr2_0 = constructor_sse_cmp_op(ctx, expr1_0)?; @@ -1075,7 +1076,7 @@ pub fn constructor_make_i64x2_from_lanes( ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1202. + // Rule at src/isa/x64/inst.isle line 1205. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = C::writable_xmm_to_reg(ctx, expr0_0); let expr2_0 = MInst::XmmUninitializedValue { dst: expr0_0 }; @@ -1117,12 +1118,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 1223. + // Rule at src/isa/x64/inst.isle line 1226. 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 1224. + // Rule at src/isa/x64/inst.isle line 1227. let expr0_0 = SseOpcode::Movd; let expr1_0 = C::reg_to_gpr_mem(ctx, pattern1_0); let expr2_0 = OperandSize::Size32; @@ -1133,7 +1134,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 1222. + // Rule at src/isa/x64/inst.isle line 1225. let expr0_0 = C::xmm_mem_imm_new(ctx, pattern0_0); return Some(expr0_0); } @@ -1153,7 +1154,7 @@ 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 1239. + // Rule at src/isa/x64/inst.isle line 1242. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = MInst::Mov64MR { src: pattern2_0.clone(), @@ -1166,7 +1167,7 @@ pub fn constructor_x64_load( if pattern0_0 == F32 { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1244. + // Rule at src/isa/x64/inst.isle line 1247. let expr0_0 = SseOpcode::Movss; 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)?; @@ -1176,7 +1177,7 @@ pub fn constructor_x64_load( if pattern0_0 == F64 { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1248. + // Rule at src/isa/x64/inst.isle line 1251. let expr0_0 = SseOpcode::Movsd; 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)?; @@ -1186,7 +1187,7 @@ pub fn constructor_x64_load( if pattern0_0 == F32X4 { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1252. + // Rule at src/isa/x64/inst.isle line 1255. let expr0_0 = SseOpcode::Movups; 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)?; @@ -1196,7 +1197,7 @@ pub fn constructor_x64_load( if pattern0_0 == F64X2 { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1256. + // Rule at src/isa/x64/inst.isle line 1259. let expr0_0 = SseOpcode::Movupd; 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)?; @@ -1206,7 +1207,7 @@ pub fn constructor_x64_load( 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 1260. + // Rule at src/isa/x64/inst.isle line 1263. let expr0_0 = SseOpcode::Movdqu; 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)?; @@ -1217,7 +1218,7 @@ pub fn constructor_x64_load( let pattern2_0 = arg1; let pattern3_0 = arg2; if let &ExtKind::SignExtend = pattern3_0 { - // Rule at src/isa/x64/inst.isle line 1234. + // Rule at src/isa/x64/inst.isle line 1237. 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); @@ -1238,7 +1239,7 @@ pub fn constructor_xmm_load_const( ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1266. + // Rule at src/isa/x64/inst.isle line 1269. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = C::writable_xmm_to_reg(ctx, expr0_0); let expr2_0 = MInst::XmmLoadConst { @@ -1263,7 +1264,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 1279. + // Rule at src/isa/x64/inst.isle line 1282. 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 { @@ -1288,7 +1289,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 1287. + // Rule at src/isa/x64/inst.isle line 1290. 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); @@ -1304,7 +1305,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 1295. + // Rule at src/isa/x64/inst.isle line 1298. 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; @@ -1333,7 +1334,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 1307. + // Rule at src/isa/x64/inst.isle line 1310. 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; @@ -1362,7 +1363,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 1319. + // Rule at src/isa/x64/inst.isle line 1322. 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); @@ -1378,7 +1379,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 1327. + // Rule at src/isa/x64/inst.isle line 1330. 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; @@ -1407,7 +1408,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 1339. + // Rule at src/isa/x64/inst.isle line 1342. 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; @@ -1436,7 +1437,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 1351. + // Rule at src/isa/x64/inst.isle line 1354. 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); @@ -1452,12 +1453,37 @@ 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 1359. + // Rule at src/isa/x64/inst.isle line 1362. 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); } +// Generated as internal constructor for term x64_and_with_flags_paired. +pub fn constructor_x64_and_with_flags_paired( + ctx: &mut C, + arg0: Type, + arg1: Gpr, + arg2: &GprMemImm, +) -> Option { + let pattern0_0 = arg0; + let pattern1_0 = arg1; + let pattern2_0 = arg2; + // Rule at src/isa/x64/inst.isle line 1369. + 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::And; + let expr3_0 = MInst::AluRmiR { + size: expr1_0, + op: expr2_0, + src1: pattern1_0, + src2: pattern2_0.clone(), + dst: expr0_0, + }; + let expr4_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr3_0 }; + return Some(expr4_0); +} + // Generated as internal constructor for term or. pub fn constructor_or( ctx: &mut C, @@ -1468,7 +1494,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 1367. + // Rule at src/isa/x64/inst.isle line 1380. 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); @@ -1484,7 +1510,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 1375. + // Rule at src/isa/x64/inst.isle line 1388. 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); @@ -1496,7 +1522,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 1415. + // Rule at src/isa/x64/inst.isle line 1428. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = OperandSize::Size32; let expr2_0 = MInst::Imm { @@ -1512,7 +1538,7 @@ pub fn constructor_imm(ctx: &mut C, arg0: Type, arg1: u64) -> Option if pattern0_0 == F32 { let pattern2_0 = arg1; if pattern2_0 == 0 { - // Rule at src/isa/x64/inst.isle line 1444. + // Rule at src/isa/x64/inst.isle line 1457. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0); let expr2_0 = SseOpcode::Xorps; @@ -1527,7 +1553,7 @@ 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 1405. let expr0_0 = SseOpcode::Movd; let expr1_0: Type = I32; let expr2_0 = constructor_imm(ctx, expr1_0, pattern2_0)?; @@ -1540,7 +1566,7 @@ pub fn constructor_imm(ctx: &mut C, arg0: Type, arg1: u64) -> Option if pattern0_0 == F64 { let pattern2_0 = arg1; if pattern2_0 == 0 { - // Rule at src/isa/x64/inst.isle line 1456. + // Rule at src/isa/x64/inst.isle line 1469. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0); let expr2_0 = SseOpcode::Xorpd; @@ -1555,7 +1581,7 @@ 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 1398. + // Rule at src/isa/x64/inst.isle line 1411. let expr0_0 = SseOpcode::Movq; let expr1_0: Type = I64; let expr2_0 = constructor_imm(ctx, expr1_0, pattern2_0)?; @@ -1568,7 +1594,7 @@ pub fn constructor_imm(ctx: &mut C, arg0: Type, arg1: u64) -> Option 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 1434. + // 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 = constructor_sse_xor_op(ctx, pattern0_0)?; @@ -1587,7 +1613,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 1421. + // Rule at src/isa/x64/inst.isle line 1434. 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); @@ -1604,7 +1630,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 1385. + // Rule at src/isa/x64/inst.isle line 1398. 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 { @@ -1623,7 +1649,7 @@ pub fn constructor_imm(ctx: &mut C, arg0: Type, arg1: u64) -> Option pub fn constructor_imm_i64(ctx: &mut C, arg0: Type, arg1: i64) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1407. + // Rule at src/isa/x64/inst.isle line 1420. let expr0_0 = C::i64_as_u64(ctx, pattern1_0); let expr1_0 = constructor_imm(ctx, pattern0_0, expr0_0)?; return Some(expr1_0); @@ -1641,7 +1667,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 1469. + // Rule at src/isa/x64/inst.isle line 1482. 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 { @@ -1666,7 +1692,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 1479. + // Rule at src/isa/x64/inst.isle line 1492. let expr0_0 = ShiftKind::RotateLeft; let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1682,7 +1708,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 1484. + // Rule at src/isa/x64/inst.isle line 1497. let expr0_0 = ShiftKind::RotateRight; let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1698,7 +1724,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 1489. + // Rule at src/isa/x64/inst.isle line 1502. let expr0_0 = ShiftKind::ShiftLeft; let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1714,7 +1740,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 1494. + // Rule at src/isa/x64/inst.isle line 1507. let expr0_0 = ShiftKind::ShiftRightLogical; let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1730,7 +1756,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 1499. + // Rule at src/isa/x64/inst.isle line 1512. let expr0_0 = ShiftKind::ShiftRightArithmetic; let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1748,7 +1774,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 1504. + // Rule at src/isa/x64/inst.isle line 1517. let expr0_0 = MInst::CmpRmiR { size: pattern0_0.clone(), opcode: pattern1_0.clone(), @@ -1769,7 +1795,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 1513. + // Rule at src/isa/x64/inst.isle line 1526. 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); @@ -1785,7 +1811,7 @@ pub fn constructor_cmp_imm( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1518. + // Rule at src/isa/x64/inst.isle line 1531. let expr0_0 = CmpOpcode::Cmp; let expr1_0 = RegMemImm::Imm { simm32: pattern1_0 }; let expr2_0 = C::gpr_mem_imm_new(ctx, &expr1_0); @@ -1803,7 +1829,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 1523. + // Rule at src/isa/x64/inst.isle line 1536. let expr0_0 = MInst::XmmCmpRmR { op: pattern0_0.clone(), src: pattern1_0.clone(), @@ -1823,7 +1849,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 1530. + // Rule at src/isa/x64/inst.isle line 1543. let expr0_0 = SseOpcode::Ucomiss; let expr1_0 = constructor_put_in_xmm(ctx, pattern0_0)?; let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); @@ -1833,7 +1859,7 @@ pub fn constructor_fpcmp( } if pattern1_0 == F64 { let pattern3_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1534. + // Rule at src/isa/x64/inst.isle line 1547. let expr0_0 = SseOpcode::Ucomisd; let expr1_0 = constructor_put_in_xmm(ctx, pattern0_0)?; let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); @@ -1854,7 +1880,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 1539. + // Rule at src/isa/x64/inst.isle line 1552. 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); @@ -1872,7 +1898,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 1546. + // Rule at src/isa/x64/inst.isle line 1559. 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 { @@ -1902,7 +1928,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 1554. + // Rule at src/isa/x64/inst.isle line 1567. 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 { @@ -1933,7 +1959,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 1565. + // Rule at src/isa/x64/inst.isle line 1578. 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); @@ -1978,7 +2004,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 1589. + // Rule at src/isa/x64/inst.isle line 1602. 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)?; @@ -1990,7 +2016,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 1586. + // Rule at src/isa/x64/inst.isle line 1599. 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)?; @@ -2014,7 +2040,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 1596. + // Rule at src/isa/x64/inst.isle line 1609. 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); @@ -2056,7 +2082,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 1608. + // Rule at src/isa/x64/inst.isle line 1621. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = C::temp_writable_xmm(ctx); let expr2_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); @@ -2099,7 +2125,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 1623. + // Rule at src/isa/x64/inst.isle line 1636. 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); @@ -2171,7 +2197,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 1645. + // Rule at src/isa/x64/inst.isle line 1658. 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( @@ -2186,7 +2212,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 1642. + // Rule at src/isa/x64/inst.isle line 1655. let expr0_0 = constructor_put_in_gpr_mem(ctx, pattern5_0)?; let expr1_0 = constructor_put_in_gpr(ctx, pattern6_0)?; let expr2_0 = @@ -2200,7 +2226,7 @@ pub fn constructor_cmove_or_from_values( // Generated as internal constructor for term setcc. pub fn constructor_setcc(ctx: &mut C, arg0: &CC) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1650. + // Rule at src/isa/x64/inst.isle line 1663. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = MInst::Setcc { cc: pattern0_0.clone(), @@ -2224,7 +2250,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 1658. + // Rule at src/isa/x64/inst.isle line 1671. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = MInst::MovzxRmR { ext_mode: pattern1_0.clone(), @@ -2246,7 +2272,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 1665. + // Rule at src/isa/x64/inst.isle line 1678. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = MInst::MovsxRmR { ext_mode: pattern1_0.clone(), @@ -2270,7 +2296,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 1672. + // Rule at src/isa/x64/inst.isle line 1685. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = MInst::XmmRmR { op: pattern1_0.clone(), @@ -2287,7 +2313,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 1679. + // Rule at src/isa/x64/inst.isle line 1692. 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)?; @@ -2298,7 +2324,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 1684. + // Rule at src/isa/x64/inst.isle line 1697. 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)?; @@ -2309,7 +2335,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 1689. + // Rule at src/isa/x64/inst.isle line 1702. 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)?; @@ -2320,7 +2346,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 1694. + // Rule at src/isa/x64/inst.isle line 1707. 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)?; @@ -2331,7 +2357,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 1699. + // Rule at src/isa/x64/inst.isle line 1712. 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)?; @@ -2342,7 +2368,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 1704. + // Rule at src/isa/x64/inst.isle line 1717. 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)?; @@ -2353,7 +2379,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 1709. + // Rule at src/isa/x64/inst.isle line 1722. 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)?; @@ -2364,7 +2390,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 1714. + // Rule at src/isa/x64/inst.isle line 1727. 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)?; @@ -2375,7 +2401,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 1719. + // Rule at src/isa/x64/inst.isle line 1732. 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)?; @@ -2386,7 +2412,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 1724. + // Rule at src/isa/x64/inst.isle line 1737. 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)?; @@ -2397,7 +2423,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 1729. + // Rule at src/isa/x64/inst.isle line 1742. 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)?; @@ -2408,7 +2434,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 1734. + // Rule at src/isa/x64/inst.isle line 1747. 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)?; @@ -2419,7 +2445,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 1739. + // Rule at src/isa/x64/inst.isle line 1752. 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)?; @@ -2430,7 +2456,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 1744. + // Rule at src/isa/x64/inst.isle line 1757. 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)?; @@ -2441,7 +2467,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 1749. + // Rule at src/isa/x64/inst.isle line 1762. 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)?; @@ -2452,7 +2478,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 1754. + // Rule at src/isa/x64/inst.isle line 1767. 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)?; @@ -2463,7 +2489,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 1759. + // Rule at src/isa/x64/inst.isle line 1772. 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)?; @@ -2474,7 +2500,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 1764. + // Rule at src/isa/x64/inst.isle line 1777. 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)?; @@ -2485,7 +2511,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 1769. + // Rule at src/isa/x64/inst.isle line 1782. 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)?; @@ -2496,7 +2522,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 1774. + // Rule at src/isa/x64/inst.isle line 1787. 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)?; @@ -2507,7 +2533,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 1779. + // Rule at src/isa/x64/inst.isle line 1792. 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)?; @@ -2518,7 +2544,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 1784. + // Rule at src/isa/x64/inst.isle line 1797. 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)?; @@ -2529,7 +2555,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 1789. + // Rule at src/isa/x64/inst.isle line 1802. 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)?; @@ -2540,7 +2566,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 1794. + // Rule at src/isa/x64/inst.isle line 1807. 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)?; @@ -2551,7 +2577,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 1799. + // Rule at src/isa/x64/inst.isle line 1812. 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)?; @@ -2562,7 +2588,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 1804. + // Rule at src/isa/x64/inst.isle line 1817. 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)?; @@ -2573,7 +2599,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 1809. + // Rule at src/isa/x64/inst.isle line 1822. 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)?; @@ -2584,7 +2610,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 1814. + // Rule at src/isa/x64/inst.isle line 1827. 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)?; @@ -2595,7 +2621,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 1819. + // Rule at src/isa/x64/inst.isle line 1832. 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)?; @@ -2606,7 +2632,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 1824. + // Rule at src/isa/x64/inst.isle line 1837. 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)?; @@ -2617,7 +2643,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 1829. + // Rule at src/isa/x64/inst.isle line 1842. 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)?; @@ -2628,7 +2654,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 1834. + // Rule at src/isa/x64/inst.isle line 1847. 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)?; @@ -2639,7 +2665,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 1839. + // Rule at src/isa/x64/inst.isle line 1852. 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)?; @@ -2650,7 +2676,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 1844. + // Rule at src/isa/x64/inst.isle line 1857. 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)?; @@ -2661,7 +2687,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 1849. + // Rule at src/isa/x64/inst.isle line 1862. 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)?; @@ -2672,7 +2698,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 1854. + // Rule at src/isa/x64/inst.isle line 1867. 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)?; @@ -2683,7 +2709,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 1859. + // Rule at src/isa/x64/inst.isle line 1872. 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)?; @@ -2694,7 +2720,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 1864. + // Rule at src/isa/x64/inst.isle line 1877. 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)?; @@ -2705,7 +2731,7 @@ pub fn constructor_pandn(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_addss(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1869. + // Rule at src/isa/x64/inst.isle line 1882. let expr0_0: Type = F32; let expr1_0 = SseOpcode::Addss; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2716,7 +2742,7 @@ pub fn constructor_addss(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_addsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1874. + // Rule at src/isa/x64/inst.isle line 1887. let expr0_0: Type = F64; let expr1_0 = SseOpcode::Addsd; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2727,7 +2753,7 @@ pub fn constructor_addsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_addps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1879. + // Rule at src/isa/x64/inst.isle line 1892. let expr0_0: Type = F32; let expr1_0 = SseOpcode::Addps; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2738,7 +2764,7 @@ pub fn constructor_addps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_addpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1884. + // Rule at src/isa/x64/inst.isle line 1897. let expr0_0: Type = F32; let expr1_0 = SseOpcode::Addpd; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2749,7 +2775,7 @@ pub fn constructor_addpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_subss(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1889. + // Rule at src/isa/x64/inst.isle line 1902. let expr0_0: Type = F32; let expr1_0 = SseOpcode::Subss; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2760,7 +2786,7 @@ pub fn constructor_subss(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_subsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1894. + // Rule at src/isa/x64/inst.isle line 1907. let expr0_0: Type = F64; let expr1_0 = SseOpcode::Subsd; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2771,7 +2797,7 @@ pub fn constructor_subsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_subps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1899. + // Rule at src/isa/x64/inst.isle line 1912. let expr0_0: Type = F32; let expr1_0 = SseOpcode::Subps; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2782,7 +2808,7 @@ pub fn constructor_subps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_subpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1904. + // Rule at src/isa/x64/inst.isle line 1917. let expr0_0: Type = F32; let expr1_0 = SseOpcode::Subpd; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2793,7 +2819,7 @@ pub fn constructor_subpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_mulss(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1909. + // Rule at src/isa/x64/inst.isle line 1922. let expr0_0: Type = F32; let expr1_0 = SseOpcode::Mulss; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2804,7 +2830,7 @@ pub fn constructor_mulss(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_mulsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1914. + // Rule at src/isa/x64/inst.isle line 1927. let expr0_0: Type = F64; let expr1_0 = SseOpcode::Mulsd; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2815,7 +2841,7 @@ pub fn constructor_mulsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_mulps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1919. + // Rule at src/isa/x64/inst.isle line 1932. let expr0_0: Type = F32; let expr1_0 = SseOpcode::Mulps; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2826,7 +2852,7 @@ pub fn constructor_mulps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_mulpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1924. + // Rule at src/isa/x64/inst.isle line 1937. let expr0_0: Type = F32; let expr1_0 = SseOpcode::Mulpd; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2837,7 +2863,7 @@ pub fn constructor_mulpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_divss(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1929. + // Rule at src/isa/x64/inst.isle line 1942. let expr0_0: Type = F32; let expr1_0 = SseOpcode::Divss; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2848,7 +2874,7 @@ pub fn constructor_divss(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_divsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1934. + // Rule at src/isa/x64/inst.isle line 1947. let expr0_0: Type = F64; let expr1_0 = SseOpcode::Divsd; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2859,7 +2885,7 @@ pub fn constructor_divsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_divps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1939. + // Rule at src/isa/x64/inst.isle line 1952. let expr0_0: Type = F32; let expr1_0 = SseOpcode::Divps; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2870,7 +2896,7 @@ pub fn constructor_divps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> O pub fn constructor_divpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1944. + // Rule at src/isa/x64/inst.isle line 1957. let expr0_0: Type = F32; let expr1_0 = SseOpcode::Divpd; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; @@ -2881,17 +2907,17 @@ pub fn constructor_divpd(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 1948. + // Rule at src/isa/x64/inst.isle line 1961. let expr0_0 = SseOpcode::Blendvps; return Some(expr0_0); } if pattern0_0 == F64X2 { - // Rule at src/isa/x64/inst.isle line 1949. + // Rule at src/isa/x64/inst.isle line 1962. 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 1950. + // Rule at src/isa/x64/inst.isle line 1963. let expr0_0 = SseOpcode::Pblendvb; return Some(expr0_0); } @@ -2902,17 +2928,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 1953. + // Rule at src/isa/x64/inst.isle line 1966. let expr0_0 = SseOpcode::Movaps; return Some(expr0_0); } if pattern0_0 == F64X2 { - // Rule at src/isa/x64/inst.isle line 1954. + // Rule at src/isa/x64/inst.isle line 1967. 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 1955. + // Rule at src/isa/x64/inst.isle line 1968. let expr0_0 = SseOpcode::Movdqa; return Some(expr0_0); } @@ -2931,7 +2957,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 1959. + // Rule at src/isa/x64/inst.isle line 1972. let expr0_0 = C::xmm0(ctx); let expr1_0 = constructor_sse_mov_op(ctx, pattern0_0)?; let expr2_0 = MInst::XmmUnaryRmR { @@ -2955,7 +2981,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 1973. + // Rule at src/isa/x64/inst.isle line 1986. let expr0_0 = C::xmm0(ctx); let expr1_0 = SseOpcode::Movapd; let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern2_0); @@ -2975,7 +3001,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 1987. + // Rule at src/isa/x64/inst.isle line 2000. 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)?; @@ -2986,18 +3012,50 @@ 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 1992. + // Rule at src/isa/x64/inst.isle line 2005. 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)?; return Some(expr2_0); } +// Generated as internal constructor for term pmaxs. +pub fn constructor_pmaxs( + ctx: &mut C, + arg0: Type, + arg1: Xmm, + arg2: &XmmMem, +) -> Option { + let pattern0_0 = arg0; + if pattern0_0 == I8X16 { + let pattern2_0 = arg1; + let pattern3_0 = arg2; + // Rule at src/isa/x64/inst.isle line 2010. + let expr0_0 = constructor_pmaxsb(ctx, pattern2_0, pattern3_0)?; + return Some(expr0_0); + } + if pattern0_0 == I16X8 { + let pattern2_0 = arg1; + let pattern3_0 = arg2; + // Rule at src/isa/x64/inst.isle line 2011. + let expr0_0 = constructor_pmaxsw(ctx, pattern2_0, pattern3_0)?; + return Some(expr0_0); + } + if pattern0_0 == I32X4 { + let pattern2_0 = arg1; + let pattern3_0 = arg2; + // Rule at src/isa/x64/inst.isle line 2012. + let expr0_0 = constructor_pmaxsd(ctx, pattern2_0, pattern3_0)?; + return Some(expr0_0); + } + return None; +} + // Generated as internal constructor for term pmaxsb. 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 1997. + // Rule at src/isa/x64/inst.isle line 2015. 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)?; @@ -3008,7 +3066,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 2002. + // Rule at src/isa/x64/inst.isle line 2017. 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)?; @@ -3019,18 +3077,50 @@ 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 2007. + // Rule at src/isa/x64/inst.isle line 2019. 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)?; return Some(expr2_0); } +// Generated as internal constructor for term pmins. +pub fn constructor_pmins( + ctx: &mut C, + arg0: Type, + arg1: Xmm, + arg2: &XmmMem, +) -> Option { + let pattern0_0 = arg0; + if pattern0_0 == I8X16 { + let pattern2_0 = arg1; + let pattern3_0 = arg2; + // Rule at src/isa/x64/inst.isle line 2023. + let expr0_0 = constructor_pminsb(ctx, pattern2_0, pattern3_0)?; + return Some(expr0_0); + } + if pattern0_0 == I16X8 { + let pattern2_0 = arg1; + let pattern3_0 = arg2; + // Rule at src/isa/x64/inst.isle line 2024. + let expr0_0 = constructor_pminsw(ctx, pattern2_0, pattern3_0)?; + return Some(expr0_0); + } + if pattern0_0 == I32X4 { + let pattern2_0 = arg1; + let pattern3_0 = arg2; + // Rule at src/isa/x64/inst.isle line 2025. + let expr0_0 = constructor_pminsd(ctx, pattern2_0, pattern3_0)?; + return Some(expr0_0); + } + return None; +} + // Generated as internal constructor for term pminsb. 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 2012. + // Rule at src/isa/x64/inst.isle line 2028. 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)?; @@ -3041,8 +3131,8 @@ 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 2017. - let expr0_0: Type = I8X16; + // Rule at src/isa/x64/inst.isle line 2030. + let expr0_0: Type = I16X8; let expr1_0 = SseOpcode::Pminsw; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; return Some(expr2_0); @@ -3052,18 +3142,50 @@ 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 2022. - let expr0_0: Type = I8X16; + // Rule at src/isa/x64/inst.isle line 2032. + let expr0_0: Type = I32X4; let expr1_0 = SseOpcode::Pminsd; let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; return Some(expr2_0); } +// Generated as internal constructor for term pmaxu. +pub fn constructor_pmaxu( + ctx: &mut C, + arg0: Type, + arg1: Xmm, + arg2: &XmmMem, +) -> Option { + let pattern0_0 = arg0; + if pattern0_0 == I8X16 { + let pattern2_0 = arg1; + let pattern3_0 = arg2; + // Rule at src/isa/x64/inst.isle line 2036. + let expr0_0 = constructor_pmaxub(ctx, pattern2_0, pattern3_0)?; + return Some(expr0_0); + } + if pattern0_0 == I16X8 { + let pattern2_0 = arg1; + let pattern3_0 = arg2; + // Rule at src/isa/x64/inst.isle line 2037. + let expr0_0 = constructor_pmaxuw(ctx, pattern2_0, pattern3_0)?; + return Some(expr0_0); + } + if pattern0_0 == I32X4 { + let pattern2_0 = arg1; + let pattern3_0 = arg2; + // Rule at src/isa/x64/inst.isle line 2038. + let expr0_0 = constructor_pmaxud(ctx, pattern2_0, pattern3_0)?; + return Some(expr0_0); + } + return None; +} + // Generated as internal constructor for term pmaxub. 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 2027. + // Rule at src/isa/x64/inst.isle line 2041. 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)?; @@ -3074,7 +3196,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 2032. + // Rule at src/isa/x64/inst.isle line 2043. 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)?; @@ -3085,18 +3207,50 @@ 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 2037. + // Rule at src/isa/x64/inst.isle line 2045. 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)?; return Some(expr2_0); } +// Generated as internal constructor for term pminu. +pub fn constructor_pminu( + ctx: &mut C, + arg0: Type, + arg1: Xmm, + arg2: &XmmMem, +) -> Option { + let pattern0_0 = arg0; + if pattern0_0 == I8X16 { + let pattern2_0 = arg1; + let pattern3_0 = arg2; + // Rule at src/isa/x64/inst.isle line 2049. + let expr0_0 = constructor_pminub(ctx, pattern2_0, pattern3_0)?; + return Some(expr0_0); + } + if pattern0_0 == I16X8 { + let pattern2_0 = arg1; + let pattern3_0 = arg2; + // Rule at src/isa/x64/inst.isle line 2050. + let expr0_0 = constructor_pminuw(ctx, pattern2_0, pattern3_0)?; + return Some(expr0_0); + } + if pattern0_0 == I32X4 { + let pattern2_0 = arg1; + let pattern3_0 = arg2; + // Rule at src/isa/x64/inst.isle line 2051. + let expr0_0 = constructor_pminud(ctx, pattern2_0, pattern3_0)?; + return Some(expr0_0); + } + return None; +} + // Generated as internal constructor for term pminub. 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 2042. + // Rule at src/isa/x64/inst.isle line 2054. 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)?; @@ -3107,7 +3261,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 2047. + // Rule at src/isa/x64/inst.isle line 2056. 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)?; @@ -3118,7 +3272,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 2052. + // Rule at src/isa/x64/inst.isle line 2058. 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)?; @@ -3129,7 +3283,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 2057. + // Rule at src/isa/x64/inst.isle line 2062. 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)?; @@ -3140,7 +3294,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 2062. + // Rule at src/isa/x64/inst.isle line 2067. 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)?; @@ -3151,7 +3305,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 2067. + // Rule at src/isa/x64/inst.isle line 2072. 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)?; @@ -3172,7 +3326,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 2072. + // Rule at src/isa/x64/inst.isle line 2077. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = C::writable_xmm_to_reg(ctx, expr0_0); let expr2_0 = MInst::XmmRmRImm { @@ -3200,7 +3354,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 2084. + // Rule at src/isa/x64/inst.isle line 2089. 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); @@ -3219,7 +3373,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 2093. + // Rule at src/isa/x64/inst.isle line 2098. 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); @@ -3239,7 +3393,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 2102. + // Rule at src/isa/x64/inst.isle line 2107. 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); @@ -3258,7 +3412,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 2111. + // Rule at src/isa/x64/inst.isle line 2116. 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); @@ -3279,7 +3433,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 2120. + // Rule at src/isa/x64/inst.isle line 2125. 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); @@ -3292,7 +3446,7 @@ pub fn constructor_pinsrd( pub fn constructor_pmaddwd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2129. + // Rule at src/isa/x64/inst.isle line 2134. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = SseOpcode::Pmaddwd; let expr2_0 = MInst::XmmRmR { @@ -3316,7 +3470,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 2139. + // Rule at src/isa/x64/inst.isle line 2144. 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); @@ -3335,7 +3489,7 @@ pub fn constructor_pshufd( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2148. + // Rule at src/isa/x64/inst.isle line 2153. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = SseOpcode::Pshufd; let expr2_0 = constructor_writable_xmm_to_r_reg(ctx, expr0_0)?; @@ -3358,7 +3512,7 @@ pub fn constructor_pshufd( pub fn constructor_pshufb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2160. + // Rule at src/isa/x64/inst.isle line 2165. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = SseOpcode::Pshufb; let expr2_0 = MInst::XmmRmR { @@ -3380,7 +3534,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 2170. + // Rule at src/isa/x64/inst.isle line 2175. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = MInst::XmmUnaryRmR { op: pattern0_0.clone(), @@ -3395,7 +3549,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 2177. + // Rule at src/isa/x64/inst.isle line 2182. let expr0_0 = SseOpcode::Pmovsxbw; let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); @@ -3404,7 +3558,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 2182. + // Rule at src/isa/x64/inst.isle line 2187. let expr0_0 = SseOpcode::Pmovzxbw; let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); @@ -3413,7 +3567,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 2187. + // Rule at src/isa/x64/inst.isle line 2192. let expr0_0 = SseOpcode::Pabsb; let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); @@ -3422,7 +3576,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 2192. + // Rule at src/isa/x64/inst.isle line 2197. let expr0_0 = SseOpcode::Pabsw; let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); @@ -3431,7 +3585,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 2197. + // Rule at src/isa/x64/inst.isle line 2202. let expr0_0 = SseOpcode::Pabsd; let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); @@ -3445,7 +3599,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 2202. + // Rule at src/isa/x64/inst.isle line 2207. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = MInst::XmmUnaryRmREvex { op: pattern0_0.clone(), @@ -3460,7 +3614,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 2209. + // Rule at src/isa/x64/inst.isle line 2214. let expr0_0 = Avx512Opcode::Vpabsq; let expr1_0 = constructor_xmm_unary_rm_r_evex(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); @@ -3469,7 +3623,7 @@ pub fn constructor_vpabsq(ctx: &mut C, arg0: &XmmMem) -> Option // Generated as internal constructor for term vpopcntb. pub fn constructor_vpopcntb(ctx: &mut C, arg0: &XmmMem) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2214. + // Rule at src/isa/x64/inst.isle line 2219. let expr0_0 = Avx512Opcode::Vpopcntb; let expr1_0 = constructor_xmm_unary_rm_r_evex(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); @@ -3485,7 +3639,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 2219. + // Rule at src/isa/x64/inst.isle line 2224. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = MInst::XmmRmREvex { op: pattern0_0.clone(), @@ -3502,7 +3656,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 2231. + // Rule at src/isa/x64/inst.isle line 2236. let expr0_0 = Avx512Opcode::Vpmullq; let expr1_0 = constructor_xmm_rm_r_evex(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3520,7 +3674,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 2240. + // Rule at src/isa/x64/inst.isle line 2245. 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); @@ -3549,7 +3703,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 2255. + // Rule at src/isa/x64/inst.isle line 2260. let expr0_0: bool = false; let expr1_0 = constructor_mul_hi(ctx, pattern0_0, expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -3565,7 +3719,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 2260. + // Rule at src/isa/x64/inst.isle line 2265. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = MInst::XmmRmiReg { opcode: pattern0_0.clone(), @@ -3582,7 +3736,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 2270. + // Rule at src/isa/x64/inst.isle line 2275. let expr0_0 = SseOpcode::Psllw; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3592,7 +3746,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 2275. + // Rule at src/isa/x64/inst.isle line 2280. let expr0_0 = SseOpcode::Pslld; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3602,7 +3756,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 2280. + // Rule at src/isa/x64/inst.isle line 2285. let expr0_0 = SseOpcode::Psllq; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3612,7 +3766,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 2285. + // Rule at src/isa/x64/inst.isle line 2290. let expr0_0 = SseOpcode::Psrlw; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3622,7 +3776,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 2290. + // Rule at src/isa/x64/inst.isle line 2295. let expr0_0 = SseOpcode::Psrld; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3632,7 +3786,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 2295. + // Rule at src/isa/x64/inst.isle line 2300. let expr0_0 = SseOpcode::Psrlq; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3642,7 +3796,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 2300. + // Rule at src/isa/x64/inst.isle line 2305. let expr0_0 = SseOpcode::Psraw; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3652,7 +3806,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 2305. + // Rule at src/isa/x64/inst.isle line 2310. let expr0_0 = SseOpcode::Psrad; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3663,7 +3817,7 @@ 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 2310. + // Rule at src/isa/x64/inst.isle line 2315. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = SseOpcode::Pextrd; let expr2_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; @@ -3696,7 +3850,7 @@ pub fn constructor_cmppd( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2326. + // Rule at src/isa/x64/inst.isle line 2331. let expr0_0 = SseOpcode::Cmppd; let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0); @@ -3716,7 +3870,7 @@ pub fn constructor_gpr_to_xmm( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2335. + // Rule at src/isa/x64/inst.isle line 2340. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = MInst::GprToXmm { op: pattern0_0.clone(), @@ -3733,7 +3887,7 @@ pub fn constructor_gpr_to_xmm( pub fn constructor_not(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2342. + // Rule at src/isa/x64/inst.isle line 2347. 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::Not { @@ -3750,7 +3904,7 @@ pub fn constructor_not(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option pub fn constructor_neg(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2350. + // Rule at src/isa/x64/inst.isle line 2355. 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::Neg { @@ -3766,7 +3920,7 @@ pub fn constructor_neg(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option // Generated as internal constructor for term lea. pub fn constructor_lea(ctx: &mut C, arg0: &SyntheticAmode) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2357. + // Rule at src/isa/x64/inst.isle line 2362. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = MInst::LoadEffectiveAddress { addr: pattern0_0.clone(), @@ -3780,7 +3934,7 @@ pub fn constructor_lea(ctx: &mut C, arg0: &SyntheticAmode) -> Option // Generated as internal constructor for term ud2. pub fn constructor_ud2(ctx: &mut C, arg0: &TrapCode) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2364. + // Rule at src/isa/x64/inst.isle line 2369. let expr0_0 = MInst::Ud2 { trap_code: pattern0_0.clone(), }; @@ -3790,7 +3944,7 @@ pub fn constructor_ud2(ctx: &mut C, arg0: &TrapCode) -> Option(ctx: &mut C) -> Option { - // Rule at src/isa/x64/inst.isle line 2369. + // Rule at src/isa/x64/inst.isle line 2374. let expr0_0 = MInst::Hlt; let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; return Some(expr1_0); @@ -3800,7 +3954,7 @@ pub fn constructor_hlt(ctx: &mut C) -> Option { pub fn constructor_lzcnt(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2374. + // Rule at src/isa/x64/inst.isle line 2379. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); let expr2_0 = UnaryRmROpcode::Lzcnt; @@ -3820,7 +3974,7 @@ pub fn constructor_lzcnt(ctx: &mut C, arg0: Type, arg1: Gpr) -> Opti pub fn constructor_tzcnt(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2382. + // Rule at src/isa/x64/inst.isle line 2387. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); let expr2_0 = UnaryRmROpcode::Tzcnt; @@ -3840,7 +3994,7 @@ pub fn constructor_tzcnt(ctx: &mut C, arg0: Type, arg1: Gpr) -> Opti pub fn constructor_bsr(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2390. + // Rule at src/isa/x64/inst.isle line 2395. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); let expr2_0 = UnaryRmROpcode::Bsr; @@ -3869,7 +4023,7 @@ pub fn constructor_bsr_or_else( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2399. + // Rule at src/isa/x64/inst.isle line 2404. let expr0_0 = constructor_bsr(ctx, pattern0_0, pattern1_0)?; let expr1_0 = constructor_produces_flags_get_reg(ctx, &expr0_0)?; let expr2_0 = C::gpr_new(ctx, expr1_0); @@ -3886,7 +4040,7 @@ pub fn constructor_bsr_or_else( pub fn constructor_bsf(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2410. + // Rule at src/isa/x64/inst.isle line 2415. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); let expr2_0 = UnaryRmROpcode::Bsf; @@ -3915,7 +4069,7 @@ pub fn constructor_bsf_or_else( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2419. + // Rule at src/isa/x64/inst.isle line 2424. let expr0_0 = constructor_bsf(ctx, pattern0_0, pattern1_0)?; let expr1_0 = constructor_produces_flags_get_reg(ctx, &expr0_0)?; let expr2_0 = C::gpr_new(ctx, expr1_0); @@ -3932,7 +4086,7 @@ pub fn constructor_bsf_or_else( pub fn constructor_x64_popcnt(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2430. + // Rule at src/isa/x64/inst.isle line 2435. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); let expr2_0 = UnaryRmROpcode::Popcnt; @@ -3960,7 +4114,7 @@ pub fn constructor_xmm_min_max_seq( let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 2438. + // Rule at src/isa/x64/inst.isle line 2443. 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::XmmMinMaxSeq { @@ -3979,7 +4133,7 @@ pub fn constructor_xmm_min_max_seq( pub fn constructor_minss(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2446. + // Rule at src/isa/x64/inst.isle line 2451. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = SseOpcode::Minss; let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); @@ -3998,7 +4152,7 @@ pub fn constructor_minss(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Optio pub fn constructor_minsd(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2453. + // Rule at src/isa/x64/inst.isle line 2458. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = SseOpcode::Minsd; let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); @@ -4017,7 +4171,7 @@ pub fn constructor_minsd(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Optio pub fn constructor_minps(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2461. + // Rule at src/isa/x64/inst.isle line 2466. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = SseOpcode::Minps; let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); @@ -4036,7 +4190,7 @@ pub fn constructor_minps(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Optio pub fn constructor_minpd(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2468. + // Rule at src/isa/x64/inst.isle line 2473. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = SseOpcode::Minpd; let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); @@ -4055,7 +4209,7 @@ pub fn constructor_minpd(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Optio pub fn constructor_maxss(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2475. + // Rule at src/isa/x64/inst.isle line 2480. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = SseOpcode::Maxss; let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); @@ -4074,7 +4228,7 @@ pub fn constructor_maxss(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Optio pub fn constructor_maxsd(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2482. + // Rule at src/isa/x64/inst.isle line 2487. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = SseOpcode::Maxsd; let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); @@ -4093,7 +4247,7 @@ pub fn constructor_maxsd(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Optio pub fn constructor_maxps(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2489. + // Rule at src/isa/x64/inst.isle line 2494. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = SseOpcode::Maxps; let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); @@ -4112,7 +4266,7 @@ pub fn constructor_maxps(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Optio pub fn constructor_maxpd(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2496. + // Rule at src/isa/x64/inst.isle line 2501. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = SseOpcode::Maxpd; let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); @@ -4127,10 +4281,176 @@ pub fn constructor_maxpd(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Optio return Some(expr5_0); } +// Generated as internal constructor for term pcmpeq. +pub fn constructor_pcmpeq( + ctx: &mut C, + arg0: Type, + arg1: Xmm, + arg2: &XmmMem, +) -> Option { + let pattern0_0 = arg0; + if pattern0_0 == I8X16 { + let pattern2_0 = arg1; + let pattern3_0 = arg2; + // Rule at src/isa/x64/inst.isle line 2508. + let expr0_0 = constructor_pcmpeqb(ctx, pattern2_0, pattern3_0)?; + return Some(expr0_0); + } + if pattern0_0 == I16X8 { + let pattern2_0 = arg1; + let pattern3_0 = arg2; + // Rule at src/isa/x64/inst.isle line 2509. + let expr0_0 = constructor_pcmpeqw(ctx, pattern2_0, pattern3_0)?; + return Some(expr0_0); + } + if pattern0_0 == I32X4 { + let pattern2_0 = arg1; + let pattern3_0 = arg2; + // Rule at src/isa/x64/inst.isle line 2510. + let expr0_0 = constructor_pcmpeqd(ctx, pattern2_0, pattern3_0)?; + return Some(expr0_0); + } + if pattern0_0 == I64X2 { + let pattern2_0 = arg1; + let pattern3_0 = arg2; + // Rule at src/isa/x64/inst.isle line 2511. + let expr0_0 = constructor_pcmpeqq(ctx, pattern2_0, pattern3_0)?; + return Some(expr0_0); + } + return None; +} + +// Generated as internal constructor for term pcmpeqb. +pub fn constructor_pcmpeqb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { + let pattern0_0 = arg0; + let pattern1_0 = arg1; + // Rule at src/isa/x64/inst.isle line 2514. + let expr0_0: Type = I8X16; + let expr1_0 = SseOpcode::Pcmpeqb; + let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; + return Some(expr2_0); +} + +// Generated as internal constructor for term pcmpeqw. +pub fn constructor_pcmpeqw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { + let pattern0_0 = arg0; + let pattern1_0 = arg1; + // Rule at src/isa/x64/inst.isle line 2516. + let expr0_0: Type = I16X8; + let expr1_0 = SseOpcode::Pcmpeqw; + let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; + return Some(expr2_0); +} + +// Generated as internal constructor for term pcmpeqd. +pub fn constructor_pcmpeqd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { + let pattern0_0 = arg0; + let pattern1_0 = arg1; + // Rule at src/isa/x64/inst.isle line 2518. + let expr0_0: Type = I32X4; + let expr1_0 = SseOpcode::Pcmpeqd; + let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; + return Some(expr2_0); +} + +// Generated as internal constructor for term pcmpeqq. +pub fn constructor_pcmpeqq(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { + let pattern0_0 = arg0; + let pattern1_0 = arg1; + // Rule at src/isa/x64/inst.isle line 2520. + let expr0_0: Type = I64X2; + let expr1_0 = SseOpcode::Pcmpeqq; + let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; + return Some(expr2_0); +} + +// Generated as internal constructor for term pcmpgt. +pub fn constructor_pcmpgt( + ctx: &mut C, + arg0: Type, + arg1: Xmm, + arg2: &XmmMem, +) -> Option { + let pattern0_0 = arg0; + if pattern0_0 == I8X16 { + let pattern2_0 = arg1; + let pattern3_0 = arg2; + // Rule at src/isa/x64/inst.isle line 2524. + let expr0_0 = constructor_pcmpgtb(ctx, pattern2_0, pattern3_0)?; + return Some(expr0_0); + } + if pattern0_0 == I16X8 { + let pattern2_0 = arg1; + let pattern3_0 = arg2; + // Rule at src/isa/x64/inst.isle line 2525. + let expr0_0 = constructor_pcmpgtw(ctx, pattern2_0, pattern3_0)?; + return Some(expr0_0); + } + if pattern0_0 == I32X4 { + let pattern2_0 = arg1; + let pattern3_0 = arg2; + // Rule at src/isa/x64/inst.isle line 2526. + let expr0_0 = constructor_pcmpgtd(ctx, pattern2_0, pattern3_0)?; + return Some(expr0_0); + } + if pattern0_0 == I64X2 { + let pattern2_0 = arg1; + let pattern3_0 = arg2; + // Rule at src/isa/x64/inst.isle line 2527. + let expr0_0 = constructor_pcmpgtq(ctx, pattern2_0, pattern3_0)?; + return Some(expr0_0); + } + return None; +} + +// Generated as internal constructor for term pcmpgtb. +pub fn constructor_pcmpgtb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { + let pattern0_0 = arg0; + let pattern1_0 = arg1; + // Rule at src/isa/x64/inst.isle line 2530. + let expr0_0: Type = I8X16; + let expr1_0 = SseOpcode::Pcmpgtb; + let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; + return Some(expr2_0); +} + +// Generated as internal constructor for term pcmpgtw. +pub fn constructor_pcmpgtw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { + let pattern0_0 = arg0; + let pattern1_0 = arg1; + // Rule at src/isa/x64/inst.isle line 2532. + let expr0_0: Type = I16X8; + let expr1_0 = SseOpcode::Pcmpgtw; + let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; + return Some(expr2_0); +} + +// Generated as internal constructor for term pcmpgtd. +pub fn constructor_pcmpgtd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { + let pattern0_0 = arg0; + let pattern1_0 = arg1; + // Rule at src/isa/x64/inst.isle line 2534. + let expr0_0: Type = I32X4; + let expr1_0 = SseOpcode::Pcmpgtd; + let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; + return Some(expr2_0); +} + +// Generated as internal constructor for term pcmpgtq. +pub fn constructor_pcmpgtq(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { + let pattern0_0 = arg0; + let pattern1_0 = arg1; + // Rule at src/isa/x64/inst.isle line 2536. + let expr0_0: Type = I64X2; + let expr1_0 = SseOpcode::Pcmpgtq; + let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; + return Some(expr2_0); +} + // Generated as internal constructor for term reg_to_xmm_mem. pub fn constructor_reg_to_xmm_mem(ctx: &mut C, arg0: Reg) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2551. + // Rule at src/isa/x64/inst.isle line 2590. let expr0_0 = C::xmm_new(ctx, pattern0_0); let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); return Some(expr1_0); @@ -4139,7 +4459,7 @@ pub fn constructor_reg_to_xmm_mem(ctx: &mut C, arg0: Reg) -> Option< // 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 2554. + // Rule at src/isa/x64/inst.isle line 2593. 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 }; @@ -4153,7 +4473,7 @@ pub fn constructor_writable_gpr_to_r_reg( arg0: WritableGpr, ) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2558. + // Rule at src/isa/x64/inst.isle line 2597. 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); @@ -4165,7 +4485,7 @@ pub fn constructor_writable_gpr_to_gpr_mem( arg0: WritableGpr, ) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2561. + // Rule at src/isa/x64/inst.isle line 2600. let expr0_0 = C::writable_gpr_to_gpr(ctx, pattern0_0); let expr1_0 = C::gpr_to_gpr_mem(ctx, expr0_0); return Some(expr1_0); @@ -4177,7 +4497,7 @@ pub fn constructor_writable_gpr_to_value_regs( arg0: WritableGpr, ) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2564. + // Rule at src/isa/x64/inst.isle line 2603. let expr0_0 = constructor_writable_gpr_to_r_reg(ctx, pattern0_0)?; let expr1_0 = C::value_reg(ctx, expr0_0); return Some(expr1_0); @@ -4189,7 +4509,7 @@ pub fn constructor_writable_xmm_to_r_reg( arg0: WritableXmm, ) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2567. + // Rule at src/isa/x64/inst.isle line 2606. 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); @@ -4201,7 +4521,7 @@ pub fn constructor_writable_xmm_to_xmm_mem( arg0: WritableXmm, ) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2570. + // Rule at src/isa/x64/inst.isle line 2609. 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); @@ -4213,7 +4533,7 @@ pub fn constructor_writable_xmm_to_value_regs( arg0: WritableXmm, ) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2573. + // Rule at src/isa/x64/inst.isle line 2612. let expr0_0 = constructor_writable_xmm_to_r_reg(ctx, pattern0_0)?; let expr1_0 = C::value_reg(ctx, expr0_0); return Some(expr1_0); @@ -4225,7 +4545,7 @@ pub fn constructor_synthetic_amode_to_gpr_mem( arg0: &SyntheticAmode, ) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2577. + // Rule at src/isa/x64/inst.isle line 2616. 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); @@ -4237,7 +4557,7 @@ pub fn constructor_synthetic_amode_to_xmm_mem( arg0: &SyntheticAmode, ) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2580. + // Rule at src/isa/x64/inst.isle line 2619. 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); @@ -4257,7 +4577,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 { if let &Opcode::Debugtrap = pattern2_0 { - // Rule at src/isa/x64/lower.isle line 2006. + // Rule at src/isa/x64/lower.isle line 2107. let expr0_0 = constructor_hlt(ctx)?; let expr1_0 = constructor_side_effect(ctx, &expr0_0)?; return Some(expr1_0); @@ -4452,6 +4772,264 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { + if let &Opcode::Icmp = pattern2_0 { + let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); + let pattern5_0 = C::value_type(ctx, pattern4_0); + if pattern5_0 == I128 { + match pattern2_2 { + &IntCC::Equal => { + // Rule at src/isa/x64/lower.isle line 1515. + let expr0_0 = C::put_in_regs(ctx, pattern4_0); + let expr1_0: usize = 0; + let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; + let expr3_0 = C::put_in_regs(ctx, pattern4_0); + let expr4_0: usize = 1; + let expr5_0 = constructor_value_regs_get_gpr(ctx, expr3_0, expr4_0)?; + let expr6_0 = C::put_in_regs(ctx, pattern4_1); + let expr7_0: usize = 0; + let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0)?; + let expr9_0 = C::put_in_regs(ctx, pattern4_1); + let expr10_0: usize = 1; + let expr11_0 = constructor_value_regs_get_gpr(ctx, expr9_0, expr10_0)?; + let expr12_0 = OperandSize::Size64; + let expr13_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0); + let expr14_0 = constructor_cmp(ctx, &expr12_0, &expr13_0, expr2_0)?; + let expr15_0 = CC::Z; + let expr16_0 = constructor_setcc(ctx, &expr15_0)?; + let expr17_0 = constructor_with_flags_reg(ctx, &expr14_0, &expr16_0)?; + let expr18_0 = OperandSize::Size64; + let expr19_0 = C::gpr_to_gpr_mem_imm(ctx, expr11_0); + let expr20_0 = constructor_cmp(ctx, &expr18_0, &expr19_0, expr5_0)?; + let expr21_0 = CC::Z; + let expr22_0 = constructor_setcc(ctx, &expr21_0)?; + let expr23_0 = constructor_with_flags_reg(ctx, &expr20_0, &expr22_0)?; + let expr24_0: Type = I64; + let expr25_0 = C::gpr_new(ctx, expr17_0); + let expr26_0 = constructor_reg_to_gpr_mem_imm(ctx, expr23_0)?; + let expr27_0 = constructor_x64_and(ctx, expr24_0, expr25_0, &expr26_0)?; + let expr28_0 = C::gpr_to_reg(ctx, expr27_0); + let expr29_0: Type = I64; + let expr30_0 = C::gpr_new(ctx, expr28_0); + let expr31_0: u32 = 1; + let expr32_0 = RegMemImm::Imm { simm32: expr31_0 }; + let expr33_0 = C::gpr_mem_imm_new(ctx, &expr32_0); + let expr34_0 = constructor_x64_and_with_flags_paired( + ctx, expr29_0, expr30_0, &expr33_0, + )?; + let expr35_0 = CC::NZ; + let expr36_0 = constructor_setcc(ctx, &expr35_0)?; + let expr37_0 = constructor_with_flags(ctx, &expr34_0, &expr36_0)?; + let expr38_0 = C::output(ctx, expr37_0); + return Some(expr38_0); + } + &IntCC::NotEqual => { + // Rule at src/isa/x64/lower.isle line 1533. + let expr0_0 = C::put_in_regs(ctx, pattern4_0); + let expr1_0: usize = 0; + let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; + let expr3_0 = C::put_in_regs(ctx, pattern4_0); + let expr4_0: usize = 1; + let expr5_0 = constructor_value_regs_get_gpr(ctx, expr3_0, expr4_0)?; + let expr6_0 = C::put_in_regs(ctx, pattern4_1); + let expr7_0: usize = 0; + let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0)?; + let expr9_0 = C::put_in_regs(ctx, pattern4_1); + let expr10_0: usize = 1; + let expr11_0 = constructor_value_regs_get_gpr(ctx, expr9_0, expr10_0)?; + let expr12_0 = OperandSize::Size64; + let expr13_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0); + let expr14_0 = constructor_cmp(ctx, &expr12_0, &expr13_0, expr2_0)?; + let expr15_0 = CC::NZ; + let expr16_0 = constructor_setcc(ctx, &expr15_0)?; + let expr17_0 = constructor_with_flags_reg(ctx, &expr14_0, &expr16_0)?; + let expr18_0 = OperandSize::Size64; + let expr19_0 = C::gpr_to_gpr_mem_imm(ctx, expr11_0); + let expr20_0 = constructor_cmp(ctx, &expr18_0, &expr19_0, expr5_0)?; + let expr21_0 = CC::NZ; + let expr22_0 = constructor_setcc(ctx, &expr21_0)?; + let expr23_0 = constructor_with_flags_reg(ctx, &expr20_0, &expr22_0)?; + let expr24_0: Type = I64; + let expr25_0 = C::gpr_new(ctx, expr17_0); + let expr26_0 = constructor_reg_to_gpr_mem_imm(ctx, expr23_0)?; + let expr27_0 = constructor_or(ctx, expr24_0, expr25_0, &expr26_0)?; + let expr28_0 = C::gpr_to_reg(ctx, expr27_0); + let expr29_0: Type = I64; + let expr30_0 = C::gpr_new(ctx, expr28_0); + let expr31_0: u32 = 1; + let expr32_0 = RegMemImm::Imm { simm32: expr31_0 }; + let expr33_0 = C::gpr_mem_imm_new(ctx, &expr32_0); + let expr34_0 = constructor_x64_and_with_flags_paired( + ctx, expr29_0, expr30_0, &expr33_0, + )?; + let expr35_0 = CC::NZ; + let expr36_0 = constructor_setcc(ctx, &expr35_0)?; + let expr37_0 = constructor_with_flags(ctx, &expr34_0, &expr36_0)?; + let expr38_0 = C::output(ctx, expr37_0); + return Some(expr38_0); + } + _ => {} + } + } + if pattern5_0 == I64X2 { + match pattern2_2 { + &IntCC::SignedGreaterThanOrEqual => { + // Rule at src/isa/x64/lower.isle line 1500. + let expr0_0: Type = I64X2; + let expr1_0 = constructor_put_in_xmm(ctx, pattern4_1)?; + let expr2_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?; + let expr3_0 = constructor_pcmpgt(ctx, expr0_0, expr1_0, &expr2_0)?; + let expr4_0: Type = I64X2; + let expr5_0 = constructor_vector_all_ones(ctx, expr4_0)?; + let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); + let expr7_0 = constructor_pxor(ctx, expr3_0, &expr6_0)?; + let expr8_0 = constructor_output_xmm(ctx, expr7_0)?; + return Some(expr8_0); + } + &IntCC::SignedLessThanOrEqual => { + // Rule at src/isa/x64/lower.isle line 1504. + let expr0_0: Type = I64X2; + let expr1_0 = constructor_put_in_xmm(ctx, pattern4_0)?; + let expr2_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; + let expr3_0 = constructor_pcmpgt(ctx, expr0_0, expr1_0, &expr2_0)?; + let expr4_0: Type = I64X2; + let expr5_0 = constructor_vector_all_ones(ctx, expr4_0)?; + let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); + let expr7_0 = constructor_pxor(ctx, expr3_0, &expr6_0)?; + let expr8_0 = constructor_output_xmm(ctx, expr7_0)?; + return Some(expr8_0); + } + _ => {} + } + } + if let Some(pattern6_0) = C::fits_in_64(ctx, pattern5_0) { + // Rule at src/isa/x64/lower.isle line 1448. + let expr0_0 = C::raw_operand_size_of_type(ctx, pattern6_0); + let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern4_1)?; + let expr2_0 = constructor_put_in_gpr(ctx, pattern4_0)?; + let expr3_0 = constructor_cmp(ctx, &expr0_0, &expr1_0, expr2_0)?; + let expr4_0 = C::intcc_to_cc(ctx, pattern2_2); + let expr5_0 = constructor_setcc(ctx, &expr4_0)?; + let expr6_0 = constructor_with_flags(ctx, &expr3_0, &expr5_0)?; + let expr7_0 = C::output(ctx, expr6_0); + return Some(expr7_0); + } + if let Some(pattern6_0) = C::vec128(ctx, pattern5_0) { + match pattern2_2 { + &IntCC::Equal => { + // Rule at src/isa/x64/lower.isle line 1457. + let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; + let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; + let expr2_0 = constructor_pcmpeq(ctx, pattern6_0, expr0_0, &expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + &IntCC::NotEqual => { + // Rule at src/isa/x64/lower.isle line 1461. + let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; + let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; + let expr2_0 = constructor_pcmpeq(ctx, pattern6_0, expr0_0, &expr1_0)?; + let expr3_0 = constructor_vector_all_ones(ctx, pattern6_0)?; + let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0); + let expr5_0 = constructor_pxor(ctx, expr2_0, &expr4_0)?; + let expr6_0 = constructor_output_xmm(ctx, expr5_0)?; + return Some(expr6_0); + } + &IntCC::SignedGreaterThan => { + // Rule at src/isa/x64/lower.isle line 1468. + let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; + let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; + let expr2_0 = constructor_pcmpgt(ctx, pattern6_0, expr0_0, &expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + &IntCC::SignedGreaterThanOrEqual => { + // Rule at src/isa/x64/lower.isle line 1485. + let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; + let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; + let expr2_0 = constructor_pmaxs(ctx, pattern6_0, expr0_0, &expr1_0)?; + let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?; + let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0); + let expr5_0 = constructor_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0)?; + let expr6_0 = constructor_output_xmm(ctx, expr5_0)?; + return Some(expr6_0); + } + &IntCC::SignedLessThan => { + // Rule at src/isa/x64/lower.isle line 1470. + let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1)?; + let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?; + let expr2_0 = constructor_pcmpgt(ctx, pattern6_0, expr0_0, &expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + &IntCC::SignedLessThanOrEqual => { + // Rule at src/isa/x64/lower.isle line 1488. + let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; + let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; + let expr2_0 = constructor_pmins(ctx, pattern6_0, expr0_0, &expr1_0)?; + let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?; + let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0); + let expr5_0 = constructor_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0)?; + let expr6_0 = constructor_output_xmm(ctx, expr5_0)?; + return Some(expr6_0); + } + &IntCC::UnsignedGreaterThan => { + // Rule at src/isa/x64/lower.isle line 1472. + let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; + let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; + let expr2_0 = constructor_pmaxu(ctx, pattern6_0, expr0_0, &expr1_0)?; + let expr3_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; + let expr4_0 = constructor_pcmpeq(ctx, pattern6_0, expr2_0, &expr3_0)?; + let expr5_0 = constructor_vector_all_ones(ctx, pattern6_0)?; + let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); + let expr7_0 = constructor_pxor(ctx, expr4_0, &expr6_0)?; + let expr8_0 = constructor_output_xmm(ctx, expr7_0)?; + return Some(expr8_0); + } + &IntCC::UnsignedGreaterThanOrEqual => { + // Rule at src/isa/x64/lower.isle line 1491. + let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; + let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; + let expr2_0 = constructor_pmaxu(ctx, pattern6_0, expr0_0, &expr1_0)?; + let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?; + let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0); + let expr5_0 = constructor_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0)?; + let expr6_0 = constructor_output_xmm(ctx, expr5_0)?; + return Some(expr6_0); + } + &IntCC::UnsignedLessThan => { + // Rule at src/isa/x64/lower.isle line 1477. + let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; + let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; + let expr2_0 = constructor_pminu(ctx, pattern6_0, expr0_0, &expr1_0)?; + let expr3_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; + let expr4_0 = constructor_pcmpeq(ctx, pattern6_0, expr2_0, &expr3_0)?; + let expr5_0 = constructor_vector_all_ones(ctx, pattern6_0)?; + let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); + let expr7_0 = constructor_pxor(ctx, expr4_0, &expr6_0)?; + let expr8_0 = constructor_output_xmm(ctx, expr7_0)?; + return Some(expr8_0); + } + &IntCC::UnsignedLessThanOrEqual => { + // Rule at src/isa/x64/lower.isle line 1494. + let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; + let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; + let expr2_0 = constructor_pminu(ctx, pattern6_0, expr0_0, &expr1_0)?; + let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?; + let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0); + let expr5_0 = constructor_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0)?; + let expr6_0 = constructor_output_xmm(ctx, expr5_0)?; + return Some(expr6_0); + } + _ => {} + } + } + } + } &InstructionData::Unary { opcode: ref pattern2_0, arg: pattern2_1, @@ -4460,7 +5038,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let pattern4_0 = C::value_type(ctx, pattern2_1); if pattern4_0 == R64 { - // Rule at src/isa/x64/lower.isle line 1849. + // Rule at src/isa/x64/lower.isle line 1950. let expr0_0 = OperandSize::Size64; let expr1_0: u32 = 0; let expr2_0 = constructor_put_in_gpr(ctx, pattern2_1)?; @@ -4475,7 +5053,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let pattern4_0 = C::value_type(ctx, pattern2_1); if pattern4_0 == R64 { - // Rule at src/isa/x64/lower.isle line 1857. + // Rule at src/isa/x64/lower.isle line 1958. let expr0_0 = OperandSize::Size64; let expr1_0: u32 = 4294967295; let expr2_0 = constructor_put_in_gpr(ctx, pattern2_1)?; @@ -4606,7 +5184,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 { - // Rule at src/isa/x64/lower.isle line 1780. + // Rule at src/isa/x64/lower.isle line 1881. let expr0_0: Type = I64; let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr2_0 = constructor_do_bitrev64(ctx, expr0_0, expr1_0)?; @@ -4680,7 +5258,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern14_0, pattern14_1) = C::unpack_value_array_2(ctx, pattern12_1); - // Rule at src/isa/x64/lower.isle line 1896. + // Rule at src/isa/x64/lower.isle line 1997. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -4688,7 +5266,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern14_0, pattern14_1) = C::unpack_value_array_2(ctx, pattern12_1); - // Rule at src/isa/x64/lower.isle line 1902. + // Rule at src/isa/x64/lower.isle line 2003. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -4696,7 +5274,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern14_0, pattern14_1) = C::unpack_value_array_2(ctx, pattern12_1); - // Rule at src/isa/x64/lower.isle line 1905. + // Rule at src/isa/x64/lower.isle line 2006. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -4704,7 +5282,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern14_0, pattern14_1) = C::unpack_value_array_2(ctx, pattern12_1); - // Rule at src/isa/x64/lower.isle line 1899. + // Rule at src/isa/x64/lower.isle line 2000. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -4712,7 +5290,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern14_0, pattern14_1) = C::unpack_value_array_2(ctx, pattern12_1); - // Rule at src/isa/x64/lower.isle line 1908. + // Rule at src/isa/x64/lower.isle line 2009. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -4720,7 +5298,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern14_0, pattern14_1) = C::unpack_value_array_2(ctx, pattern12_1); - // Rule at src/isa/x64/lower.isle line 1911. + // Rule at src/isa/x64/lower.isle line 2012. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -4728,7 +5306,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern14_0, pattern14_1) = C::unpack_value_array_2(ctx, pattern12_1); - // Rule at src/isa/x64/lower.isle line 1914. + // Rule at src/isa/x64/lower.isle line 2015. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -4736,7 +5314,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern14_0, pattern14_1) = C::unpack_value_array_2(ctx, pattern12_1); - // Rule at src/isa/x64/lower.isle line 1917. + // Rule at src/isa/x64/lower.isle line 2018. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -4744,7 +5322,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let (pattern14_0, pattern14_1) = C::unpack_value_array_2(ctx, pattern12_1); - // Rule at src/isa/x64/lower.isle line 1920. + // Rule at src/isa/x64/lower.isle line 2021. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -4759,7 +5337,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { if let &Opcode::Uload32 = pattern12_0 { - // Rule at src/isa/x64/lower.isle line 1923. + // Rule at src/isa/x64/lower.isle line 2024. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -4772,7 +5350,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1783. + // Rule at src/isa/x64/lower.isle line 1884. let expr0_0: Type = I64; let expr1_0 = C::put_in_regs(ctx, pattern5_1); let expr2_0: usize = 1; @@ -5049,7 +5627,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1553. + // Rule at src/isa/x64/lower.isle line 1654. let expr0_0: Type = I64; let expr1_0: Type = I64; let expr2_0 = C::put_in_regs(ctx, pattern5_1); @@ -5086,7 +5664,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1595. + // Rule at src/isa/x64/lower.isle line 1696. let expr0_0: Type = I64; let expr1_0: Type = I64; let expr2_0 = C::put_in_regs(ctx, pattern5_1); @@ -5123,7 +5701,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1647. + // Rule at src/isa/x64/lower.isle line 1748. let expr0_0: Type = I64; let expr1_0 = C::put_in_regs(ctx, pattern5_1); let expr2_0: usize = 0; @@ -5146,7 +5724,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1998. + // Rule at src/isa/x64/lower.isle line 2099. let expr0_0: Type = I64; let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr2_0: u32 = 1; @@ -5164,7 +5742,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let pattern7_0 = C::value_type(ctx, pattern5_1); if pattern7_0 == I64 { - // Rule at src/isa/x64/lower.isle line 1870. + // Rule at src/isa/x64/lower.isle line 1971. let expr0_0 = C::put_in_reg(ctx, pattern5_1); let expr1_0: Type = I64; let expr2_0: u64 = 0; @@ -5174,7 +5752,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 2021. + // Rule at src/isa/x64/lower.isle line 2122. 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_addss(ctx, expr0_0, &expr1_0)?; @@ -5243,7 +5821,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 2032. + // Rule at src/isa/x64/lower.isle line 2133. 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_subss(ctx, expr0_0, &expr1_0)?; @@ -5252,7 +5830,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 2043. + // Rule at src/isa/x64/lower.isle line 2144. 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_mulss(ctx, expr0_0, &expr1_0)?; @@ -5261,7 +5839,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 2054. + // Rule at src/isa/x64/lower.isle line 2155. 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_divss(ctx, expr0_0, &expr1_0)?; @@ -5270,7 +5848,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 2065. + // Rule at src/isa/x64/lower.isle line 2166. let expr0_0: Type = F32; let expr1_0: bool = true; let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; @@ -5282,7 +5860,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 2234. + // Rule at src/isa/x64/lower.isle line 2335. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_minss(ctx, expr0_0, expr1_0)?; @@ -5291,7 +5869,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 2137. + // Rule at src/isa/x64/lower.isle line 2238. let expr0_0: Type = F32; let expr1_0: bool = false; let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; @@ -5303,7 +5881,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 2245. + // Rule at src/isa/x64/lower.isle line 2346. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_maxss(ctx, expr0_0, expr1_0)?; @@ -5324,7 +5902,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 2023. + // Rule at src/isa/x64/lower.isle line 2124. 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_addsd(ctx, expr0_0, &expr1_0)?; @@ -5333,7 +5911,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 2034. + // Rule at src/isa/x64/lower.isle line 2135. 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_subsd(ctx, expr0_0, &expr1_0)?; @@ -5342,7 +5920,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 2045. + // Rule at src/isa/x64/lower.isle line 2146. 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_mulsd(ctx, expr0_0, &expr1_0)?; @@ -5351,7 +5929,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 2056. + // Rule at src/isa/x64/lower.isle line 2157. 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_divsd(ctx, expr0_0, &expr1_0)?; @@ -5360,7 +5938,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 2067. + // Rule at src/isa/x64/lower.isle line 2168. let expr0_0: Type = F64; let expr1_0: bool = true; let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; @@ -5372,7 +5950,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 2236. + // Rule at src/isa/x64/lower.isle line 2337. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_minsd(ctx, expr0_0, expr1_0)?; @@ -5381,7 +5959,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 2139. + // Rule at src/isa/x64/lower.isle line 2240. let expr0_0: Type = F64; let expr1_0: bool = false; let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; @@ -5393,7 +5971,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 2247. + // Rule at src/isa/x64/lower.isle line 2348. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_maxsd(ctx, expr0_0, expr1_0)?; @@ -5532,7 +6110,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1754. + // Rule at src/isa/x64/lower.isle line 1855. let expr0_0 = C::popcount_4bit_table(ctx); let expr1_0: Type = I8X16; let expr2_0 = C::popcount_low_mask(ctx); @@ -5749,7 +6327,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 2011. + // Rule at src/isa/x64/lower.isle line 2112. 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_pmaddwd(ctx, expr0_0, &expr1_0)?; @@ -5888,7 +6466,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 2025. + // Rule at src/isa/x64/lower.isle line 2126. 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_addps(ctx, expr0_0, &expr1_0)?; @@ -5897,7 +6475,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 2036. + // Rule at src/isa/x64/lower.isle line 2137. 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_subps(ctx, expr0_0, &expr1_0)?; @@ -5906,7 +6484,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 2047. + // Rule at src/isa/x64/lower.isle line 2148. 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_mulps(ctx, expr0_0, &expr1_0)?; @@ -5915,7 +6493,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 2058. + // Rule at src/isa/x64/lower.isle line 2159. 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_divps(ctx, expr0_0, &expr1_0)?; @@ -5924,7 +6502,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 2082. + // Rule at src/isa/x64/lower.isle line 2183. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr2_0 = constructor_minps(ctx, expr0_0, expr1_0)?; @@ -5949,7 +6527,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 2238. + // Rule at src/isa/x64/lower.isle line 2339. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_minps(ctx, expr0_0, expr1_0)?; @@ -5958,7 +6536,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 2145. + // Rule at src/isa/x64/lower.isle line 2246. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr2_0 = constructor_maxps(ctx, expr0_0, expr1_0)?; @@ -5985,7 +6563,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 2249. + // Rule at src/isa/x64/lower.isle line 2350. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_maxps(ctx, expr0_0, expr1_0)?; @@ -6027,7 +6605,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 2027. + // Rule at src/isa/x64/lower.isle line 2128. 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_addpd(ctx, expr0_0, &expr1_0)?; @@ -6036,7 +6614,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 2038. + // Rule at src/isa/x64/lower.isle line 2139. 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_subpd(ctx, expr0_0, &expr1_0)?; @@ -6045,7 +6623,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 2049. + // Rule at src/isa/x64/lower.isle line 2150. 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_mulpd(ctx, expr0_0, &expr1_0)?; @@ -6054,7 +6632,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 2060. + // Rule at src/isa/x64/lower.isle line 2161. 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_divpd(ctx, expr0_0, &expr1_0)?; @@ -6063,7 +6641,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 2125. + // Rule at src/isa/x64/lower.isle line 2226. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr2_0 = constructor_minpd(ctx, expr0_0, expr1_0)?; @@ -6088,7 +6666,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 2240. + // Rule at src/isa/x64/lower.isle line 2341. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_minpd(ctx, expr0_0, expr1_0)?; @@ -6097,7 +6675,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 2188. + // Rule at src/isa/x64/lower.isle line 2289. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr2_0 = constructor_maxpd(ctx, expr0_0, expr1_0)?; @@ -6124,7 +6702,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 2251. + // Rule at src/isa/x64/lower.isle line 2352. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_maxpd(ctx, expr0_0, expr1_0)?; @@ -6203,7 +6781,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1524. + // Rule at src/isa/x64/lower.isle line 1625. let expr0_0 = constructor_fpcmp(ctx, pattern11_0, pattern11_1)?; let expr1_0 = CC::NZ; @@ -6218,7 +6796,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1476. + // Rule at src/isa/x64/lower.isle line 1577. let expr0_0 = constructor_fpcmp(ctx, pattern11_1, pattern11_0)?; let expr1_0 = CC::NBE; @@ -6231,7 +6809,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1479. + // Rule at src/isa/x64/lower.isle line 1580. let expr0_0 = constructor_fpcmp(ctx, pattern11_1, pattern11_0)?; let expr1_0 = CC::NB; @@ -6244,7 +6822,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1499. + // Rule at src/isa/x64/lower.isle line 1600. let expr0_0 = constructor_fpcmp(ctx, pattern11_0, pattern11_1)?; let expr1_0 = CC::NBE; @@ -6257,7 +6835,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1502. + // Rule at src/isa/x64/lower.isle line 1603. let expr0_0 = constructor_fpcmp(ctx, pattern11_0, pattern11_1)?; let expr1_0 = CC::NB; @@ -6270,7 +6848,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1527. + // Rule at src/isa/x64/lower.isle line 1628. let expr0_0 = constructor_fpcmp(ctx, pattern11_0, pattern11_1)?; let expr1_0 = CC::NZ; @@ -6285,7 +6863,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1470. + // Rule at src/isa/x64/lower.isle line 1571. let expr0_0 = constructor_fpcmp(ctx, pattern11_1, pattern11_0)?; let expr1_0 = CC::NP; @@ -6298,7 +6876,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1473. + // Rule at src/isa/x64/lower.isle line 1574. let expr0_0 = constructor_fpcmp(ctx, pattern11_1, pattern11_0)?; let expr1_0 = CC::P; @@ -6311,7 +6889,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1505. + // Rule at src/isa/x64/lower.isle line 1606. let expr0_0 = constructor_fpcmp(ctx, pattern11_0, pattern11_1)?; let expr1_0 = CC::B; @@ -6324,7 +6902,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1508. + // Rule at src/isa/x64/lower.isle line 1609. let expr0_0 = constructor_fpcmp(ctx, pattern11_0, pattern11_1)?; let expr1_0 = CC::BE; @@ -6337,7 +6915,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1482. + // Rule at src/isa/x64/lower.isle line 1583. let expr0_0 = constructor_fpcmp(ctx, pattern11_1, pattern11_0)?; let expr1_0 = CC::B; @@ -6350,7 +6928,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1485. + // Rule at src/isa/x64/lower.isle line 1586. let expr0_0 = constructor_fpcmp(ctx, pattern11_1, pattern11_0)?; let expr1_0 = CC::BE; @@ -6377,14 +6955,14 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let pattern6_0 = C::value_type(ctx, pattern4_1); if pattern6_0 == pattern2_0 { - // Rule at src/isa/x64/lower.isle line 1984. + // Rule at src/isa/x64/lower.isle line 2085. let expr0_0 = constructor_output_value(ctx, pattern4_1)?; return Some(expr0_0); } } &Opcode::Bextend => { let pattern6_0 = C::value_type(ctx, pattern4_1); - // Rule at src/isa/x64/lower.isle line 1965. + // Rule at src/isa/x64/lower.isle line 2066. let expr0_0 = constructor_generic_sextend(ctx, pattern4_1, pattern6_0, pattern2_0)?; return Some(expr0_0); @@ -6392,7 +6970,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let pattern6_0 = C::value_type(ctx, pattern4_1); if pattern6_0 == pattern2_0 { - // Rule at src/isa/x64/lower.isle line 1973. + // Rule at src/isa/x64/lower.isle line 2074. let expr0_0 = constructor_output_value(ctx, pattern4_1)?; return Some(expr0_0); } @@ -6400,14 +6978,14 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { let pattern6_0 = C::value_type(ctx, pattern4_1); if pattern6_0 == pattern2_0 { - // Rule at src/isa/x64/lower.isle line 1866. + // Rule at src/isa/x64/lower.isle line 1967. let expr0_0 = constructor_output_value(ctx, pattern4_1)?; return Some(expr0_0); } } &Opcode::Sextend => { let pattern6_0 = C::value_type(ctx, pattern4_1); - // Rule at src/isa/x64/lower.isle line 1959. + // Rule at src/isa/x64/lower.isle line 2060. let expr0_0 = constructor_generic_sextend(ctx, pattern4_1, pattern6_0, pattern2_0)?; return Some(expr0_0); @@ -7603,7 +8181,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1987. + // Rule at src/isa/x64/lower.isle line 2088. 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)?; @@ -8048,7 +8626,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1995. + // Rule at src/isa/x64/lower.isle line 2096. let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr1_0: u32 = 1; let expr2_0 = RegMemImm::Imm { simm32: expr1_0 }; @@ -8058,7 +8636,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1979. + // Rule at src/isa/x64/lower.isle line 2080. 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)?; @@ -8172,21 +8750,21 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { match pattern5_0 { &Opcode::Clz => { - // Rule at src/isa/x64/lower.isle line 1543. + // Rule at src/isa/x64/lower.isle line 1644. let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr1_0 = constructor_do_clz(ctx, pattern3_0, pattern3_0, expr0_0)?; let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; return Some(expr2_0); } &Opcode::Ctz => { - // Rule at src/isa/x64/lower.isle line 1585. + // Rule at src/isa/x64/lower.isle line 1686. let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr1_0 = constructor_do_ctz(ctx, pattern3_0, pattern3_0, expr0_0)?; let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; return Some(expr2_0); } &Opcode::Popcnt => { - // Rule at src/isa/x64/lower.isle line 1637. + // Rule at src/isa/x64/lower.isle line 1738. let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr1_0 = constructor_do_popcnt(ctx, pattern3_0, expr0_0)?; let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; @@ -8289,7 +8867,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { match pattern5_0 { &Opcode::Clz => { - // Rule at src/isa/x64/lower.isle line 1548. + // Rule at src/isa/x64/lower.isle line 1649. let expr0_0: Type = I32; let expr1_0: Type = I32; let expr2_0 = ExtendKind::Zero; @@ -8300,7 +8878,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1590. + // Rule at src/isa/x64/lower.isle line 1691. let expr0_0: Type = I32; let expr1_0: Type = I32; let expr2_0 = ExtendKind::Zero; @@ -8311,7 +8889,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1642. + // Rule at src/isa/x64/lower.isle line 1743. let expr0_0: Type = I32; let expr1_0: Type = I32; let expr2_0 = ExtendKind::Zero; @@ -8943,7 +9521,7 @@ pub fn constructor_do_clz( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/lower.isle line 1568. + // Rule at src/isa/x64/lower.isle line 1669. let expr0_0: Type = I64; let expr1_0: i64 = -1; let expr2_0 = constructor_imm_i64(ctx, expr0_0, expr1_0)?; @@ -8970,7 +9548,7 @@ pub fn constructor_do_ctz( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/lower.isle line 1609. + // Rule at src/isa/x64/lower.isle line 1710. let expr0_0: Type = I64; let expr1_0 = C::ty_bits_u64(ctx, pattern1_0); let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?; @@ -8984,7 +9562,7 @@ pub fn constructor_do_popcnt(ctx: &mut C, arg0: Type, arg1: Gpr) -> let pattern0_0 = arg0; if pattern0_0 == I32 { let pattern2_0 = arg1; - // Rule at src/isa/x64/lower.isle line 1700. + // Rule at src/isa/x64/lower.isle line 1801. let expr0_0: Type = I32; let expr1_0: u8 = 1; let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 }; @@ -9049,7 +9627,7 @@ pub fn constructor_do_popcnt(ctx: &mut C, arg0: Type, arg1: Gpr) -> } if pattern0_0 == I64 { let pattern2_0 = arg1; - // Rule at src/isa/x64/lower.isle line 1657. + // Rule at src/isa/x64/lower.isle line 1758. let expr0_0: Type = I64; let expr1_0: u8 = 1; let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 }; @@ -9123,7 +9701,7 @@ pub fn constructor_do_popcnt(ctx: &mut C, arg0: Type, arg1: Gpr) -> pub fn constructor_do_bitrev8(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/lower.isle line 1789. + // Rule at src/isa/x64/lower.isle line 1890. let expr0_0 = C::ty_mask(ctx, pattern0_0); let expr1_0: u64 = 6148914691236517205; let expr2_0 = C::u64_and(ctx, expr0_0, expr1_0); @@ -9186,7 +9764,7 @@ pub fn constructor_do_bitrev8(ctx: &mut C, arg0: Type, arg1: Gpr) -> pub fn constructor_do_bitrev16(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/lower.isle line 1812. + // Rule at src/isa/x64/lower.isle line 1913. let expr0_0 = constructor_do_bitrev8(ctx, pattern0_0, pattern1_0)?; let expr1_0 = C::ty_mask(ctx, pattern0_0); let expr2_0: u64 = 71777214294589695; @@ -9214,7 +9792,7 @@ pub fn constructor_do_bitrev16(ctx: &mut C, arg0: Type, arg1: Gpr) - pub fn constructor_do_bitrev32(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/lower.isle line 1824. + // Rule at src/isa/x64/lower.isle line 1925. let expr0_0 = constructor_do_bitrev16(ctx, pattern0_0, pattern1_0)?; let expr1_0 = C::ty_mask(ctx, pattern0_0); let expr2_0: u64 = 281470681808895; @@ -9243,7 +9821,7 @@ pub fn constructor_do_bitrev64(ctx: &mut C, arg0: Type, arg1: Gpr) - let pattern0_0 = arg0; if pattern0_0 == I64 { let pattern2_0 = arg1; - // Rule at src/isa/x64/lower.isle line 1836. + // Rule at src/isa/x64/lower.isle line 1937. let expr0_0 = constructor_do_bitrev32(ctx, pattern0_0, pattern2_0)?; let expr1_0: u64 = 4294967295; let expr2_0 = constructor_imm(ctx, pattern0_0, expr1_0)?; @@ -9277,7 +9855,7 @@ pub fn constructor_generic_sextend( if let Some(pattern2_0) = C::fits_in_32(ctx, pattern1_0) { let pattern3_0 = arg2; if let Some(pattern4_0) = C::fits_in_32(ctx, pattern3_0) { - // Rule at src/isa/x64/lower.isle line 1956. + // Rule at src/isa/x64/lower.isle line 2057. let expr0_0: Type = I32; let expr1_0 = ExtendKind::Sign; let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?; @@ -9285,7 +9863,7 @@ pub fn constructor_generic_sextend( return Some(expr3_0); } if let Some(pattern4_0) = C::ty_int_bool_64(ctx, pattern3_0) { - // Rule at src/isa/x64/lower.isle line 1952. + // Rule at src/isa/x64/lower.isle line 2053. let expr0_0: Type = I64; let expr1_0 = ExtendKind::Sign; let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?; @@ -9293,7 +9871,7 @@ pub fn constructor_generic_sextend( return Some(expr3_0); } if let Some(pattern4_0) = C::ty_int_bool_128(ctx, pattern3_0) { - // Rule at src/isa/x64/lower.isle line 1946. + // Rule at src/isa/x64/lower.isle line 2047. let expr0_0: Type = I64; let expr1_0 = ExtendKind::Sign; let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?; @@ -9308,7 +9886,7 @@ pub fn constructor_generic_sextend( if let Some(pattern2_0) = C::ty_int_bool_64(ctx, pattern1_0) { let pattern3_0 = arg2; if let Some(pattern4_0) = C::ty_int_bool_128(ctx, pattern3_0) { - // Rule at src/isa/x64/lower.isle line 1942. + // Rule at src/isa/x64/lower.isle line 2043. let expr0_0 = C::put_in_reg(ctx, pattern0_0); let expr1_0 = constructor_put_in_gpr(ctx, pattern0_0)?; let expr2_0 = constructor_spread_sign_bit(ctx, expr1_0)?; @@ -9320,7 +9898,7 @@ pub fn constructor_generic_sextend( } let pattern2_0 = arg2; if pattern2_0 == pattern1_0 { - // Rule at src/isa/x64/lower.isle line 1932. + // Rule at src/isa/x64/lower.isle line 2033. let expr0_0 = constructor_output_value(ctx, pattern0_0)?; return Some(expr0_0); } @@ -9330,7 +9908,7 @@ pub fn constructor_generic_sextend( // Generated as internal constructor for term spread_sign_bit. pub fn constructor_spread_sign_bit(ctx: &mut C, arg0: Gpr) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/lower.isle line 1938. + // Rule at src/isa/x64/lower.isle line 2039. let expr0_0: Type = I64; let expr1_0: u8 = 63; let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 }; diff --git a/cranelift/filetests/filetests/isa/x64/i128.clif b/cranelift/filetests/filetests/isa/x64/i128.clif index 201e20147d..9f4caa5892 100644 --- a/cranelift/filetests/filetests/isa/x64/i128.clif +++ b/cranelift/filetests/filetests/isa/x64/i128.clif @@ -241,20 +241,20 @@ block0(v0: i128, v1: i128): ; Inst 5: movq %r14, 32(%rsp) ; Inst 6: movq %rbx, 40(%rsp) ; Inst 7: movq %r15, 48(%rsp) -; Inst 8: cmpq %rcx, %rsi +; Inst 8: cmpq %rdx, %rdi ; Inst 9: setz %al -; Inst 10: cmpq %rdx, %rdi +; Inst 10: cmpq %rcx, %rsi ; Inst 11: setz %r8b -; Inst 12: andq %rax, %r8 -; Inst 13: andq $1, %r8 +; Inst 12: andq %r8, %rax +; Inst 13: andq $1, %rax ; Inst 14: setnz %al ; Inst 15: movq %rax, rsp(0 + virtual offset) -; Inst 16: cmpq %rcx, %rsi +; Inst 16: cmpq %rdx, %rdi ; Inst 17: setnz %al -; Inst 18: cmpq %rdx, %rdi +; Inst 18: cmpq %rcx, %rsi ; Inst 19: setnz %r8b -; Inst 20: orq %rax, %r8 -; Inst 21: andq $1, %r8 +; Inst 20: orq %r8, %rax +; Inst 21: andq $1, %rax ; Inst 22: setnz %r8b ; Inst 23: cmpq %rcx, %rsi ; Inst 24: setl %r9b diff --git a/cranelift/filetests/filetests/isa/x64/simd-comparison-legalize.clif b/cranelift/filetests/filetests/isa/x64/simd-comparison-legalize.clif index e99edbba4e..58cd0db90e 100644 --- a/cranelift/filetests/filetests/isa/x64/simd-comparison-legalize.clif +++ b/cranelift/filetests/filetests/isa/x64/simd-comparison-legalize.clif @@ -55,14 +55,16 @@ block0(v0: i16x8, v1: i16x8): ; Entry block: 0 ; Block 0: ; (original IR block: block0) -; (instruction range: 0 .. 7) +; (instruction range: 0 .. 9) ; Inst 0: pushq %rbp ; Inst 1: movq %rsp, %rbp -; Inst 2: pminsw %xmm1, %xmm0 -; Inst 3: pcmpeqw %xmm1, %xmm0 -; Inst 4: movq %rbp, %rsp -; Inst 5: popq %rbp -; Inst 6: ret +; Inst 2: movdqa %xmm1, %xmm2 +; Inst 3: movdqa %xmm0, %xmm1 +; Inst 4: pmaxsw %xmm2, %xmm1 +; Inst 5: pcmpeqw %xmm1, %xmm0 +; Inst 6: movq %rbp, %rsp +; Inst 7: popq %rbp +; Inst 8: ret ; }} function %icmp_uge_i8x16(i8x16, i8x16) -> b8x16 { @@ -75,13 +77,15 @@ block0(v0: i8x16, v1: i8x16): ; Entry block: 0 ; Block 0: ; (original IR block: block0) -; (instruction range: 0 .. 7) +; (instruction range: 0 .. 9) ; Inst 0: pushq %rbp ; Inst 1: movq %rsp, %rbp -; Inst 2: pminub %xmm1, %xmm0 -; Inst 3: pcmpeqb %xmm1, %xmm0 -; Inst 4: movq %rbp, %rsp -; Inst 5: popq %rbp -; Inst 6: ret +; Inst 2: movdqa %xmm1, %xmm2 +; Inst 3: movdqa %xmm0, %xmm1 +; Inst 4: pmaxub %xmm2, %xmm1 +; Inst 5: pcmpeqb %xmm1, %xmm0 +; Inst 6: movq %rbp, %rsp +; Inst 7: popq %rbp +; Inst 8: ret ; }}