diff --git a/cranelift/codegen/src/isa/aarch64/lower/isle/generated_code.manifest b/cranelift/codegen/src/isa/aarch64/lower/isle/generated_code.manifest index b567e200e02b..08ec6024da05 100644 --- a/cranelift/codegen/src/isa/aarch64/lower/isle/generated_code.manifest +++ b/cranelift/codegen/src/isa/aarch64/lower/isle/generated_code.manifest @@ -1,4 +1,4 @@ src/clif.isle 443b34b797fc8ace -src/prelude.isle 74d9514ac948e163 +src/prelude.isle c0751050a11e2686 src/isa/aarch64/inst.isle 19ccefb6a496d392 src/isa/aarch64/lower.isle d88b62dd6b40622 diff --git a/cranelift/codegen/src/isa/aarch64/lower/isle/generated_code.rs b/cranelift/codegen/src/isa/aarch64/lower/isle/generated_code.rs index ef5dbf5e253c..a73e90405bd3 100644 --- a/cranelift/codegen/src/isa/aarch64/lower/isle/generated_code.rs +++ b/cranelift/codegen/src/isa/aarch64/lower/isle/generated_code.rs @@ -55,6 +55,7 @@ pub trait Context { fn ty_32_or_64(&mut self, arg0: Type) -> Option; fn ty_8_or_16(&mut self, arg0: Type) -> Option; fn ty_int_bool_64(&mut self, arg0: Type) -> Option; + fn ty_int_bool_ref_64(&mut self, arg0: Type) -> Option; fn ty_int_bool_128(&mut self, arg0: Type) -> Option; fn ty_scalar_float(&mut self, arg0: Type) -> Option; fn ty_vec128(&mut self, arg0: Type) -> Option; @@ -76,6 +77,7 @@ pub trait Context { fn value_type(&mut self, arg0: Value) -> Type; fn multi_lane(&mut self, arg0: Type) -> Option<(u8, u16)>; fn def_inst(&mut self, arg0: Value) -> Option; + fn offset32_to_u32(&mut self, arg0: Offset32) -> u32; fn emit(&mut self, arg0: &MInst) -> Unit; fn emit_safepoint(&mut self, arg0: &MInst) -> Unit; fn trap_code_division_by_zero(&mut self) -> TrapCode; @@ -130,13 +132,13 @@ pub trait Context { fn rotr_opposite_amount(&mut self, arg0: Type, arg1: ImmShift) -> ImmShift; } -/// Internal type SideEffectNoResult: defined at src/prelude.isle line 397. +/// Internal type SideEffectNoResult: defined at src/prelude.isle line 405. #[derive(Clone, Debug)] pub enum SideEffectNoResult { Inst { inst: MInst }, } -/// Internal type ProducesFlags: defined at src/prelude.isle line 419. +/// Internal type ProducesFlags: defined at src/prelude.isle line 427. #[derive(Clone, Debug)] pub enum ProducesFlags { ProducesFlagsSideEffect { inst: MInst }, @@ -144,7 +146,7 @@ pub enum ProducesFlags { ProducesFlagsReturnsResultWithConsumer { inst: MInst, result: Reg }, } -/// Internal type ConsumesFlags: defined at src/prelude.isle line 430. +/// Internal type ConsumesFlags: defined at src/prelude.isle line 438. #[derive(Clone, Debug)] pub enum ConsumesFlags { ConsumesFlagsReturnsResultWithProducer { @@ -1086,7 +1088,7 @@ pub fn constructor_side_effect( inst: ref pattern1_0, } = pattern0_0 { - // Rule at src/prelude.isle line 402. + // Rule at src/prelude.isle line 410. let expr0_0 = C::emit(ctx, pattern1_0); let expr1_0 = C::output_none(ctx); return Some(expr1_0); @@ -1104,7 +1106,7 @@ pub fn constructor_safepoint( inst: ref pattern1_0, } = pattern0_0 { - // Rule at src/prelude.isle line 408. + // Rule at src/prelude.isle line 416. let expr0_0 = C::emit_safepoint(ctx, pattern1_0); let expr1_0 = C::output_none(ctx); return Some(expr1_0); @@ -1123,7 +1125,7 @@ pub fn constructor_produces_flags_get_reg( result: pattern1_1, } = pattern0_0 { - // Rule at src/prelude.isle line 446. + // Rule at src/prelude.isle line 454. return Some(pattern1_1); } return None; @@ -1140,7 +1142,7 @@ pub fn constructor_produces_flags_ignore( inst: ref pattern1_0, result: pattern1_1, } => { - // Rule at src/prelude.isle line 451. + // Rule at src/prelude.isle line 459. let expr0_0 = ProducesFlags::ProducesFlagsSideEffect { inst: pattern1_0.clone(), }; @@ -1150,7 +1152,7 @@ pub fn constructor_produces_flags_ignore( inst: ref pattern1_0, result: pattern1_1, } => { - // Rule at src/prelude.isle line 453. + // Rule at src/prelude.isle line 461. let expr0_0 = ProducesFlags::ProducesFlagsSideEffect { inst: pattern1_0.clone(), }; @@ -1179,7 +1181,7 @@ pub fn constructor_consumes_flags_concat( result: pattern3_1, } = pattern2_0 { - // Rule at src/prelude.isle line 460. + // Rule at src/prelude.isle line 468. let expr0_0 = C::value_regs(ctx, pattern1_1, pattern3_1); let expr1_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { inst1: pattern1_0.clone(), @@ -1209,7 +1211,7 @@ pub fn constructor_with_flags( inst: ref pattern3_0, result: pattern3_1, } => { - // Rule at src/prelude.isle line 485. + // Rule at src/prelude.isle line 493. let expr0_0 = C::emit(ctx, pattern1_0); let expr1_0 = C::emit(ctx, pattern3_0); let expr2_0 = C::value_reg(ctx, pattern3_1); @@ -1220,7 +1222,7 @@ pub fn constructor_with_flags( inst2: ref pattern3_1, result: pattern3_2, } => { - // Rule at src/prelude.isle line 491. + // Rule at src/prelude.isle line 499. let expr0_0 = C::emit(ctx, pattern1_0); let expr1_0 = C::emit(ctx, pattern3_0); let expr2_0 = C::emit(ctx, pattern3_1); @@ -1233,7 +1235,7 @@ pub fn constructor_with_flags( inst4: ref pattern3_3, result: pattern3_4, } => { - // Rule at src/prelude.isle line 503. + // Rule at src/prelude.isle line 511. let expr0_0 = C::emit(ctx, pattern1_0); let expr1_0 = C::emit(ctx, pattern3_0); let expr2_0 = C::emit(ctx, pattern3_1); @@ -1254,7 +1256,7 @@ pub fn constructor_with_flags( result: pattern3_1, } = pattern2_0 { - // Rule at src/prelude.isle line 479. + // Rule at src/prelude.isle line 487. let expr0_0 = C::emit(ctx, pattern1_0); let expr1_0 = C::emit(ctx, pattern3_0); let expr2_0 = C::value_regs(ctx, pattern1_1, pattern3_1); @@ -1274,7 +1276,7 @@ pub fn constructor_with_flags_reg( ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/prelude.isle line 520. + // Rule at src/prelude.isle line 528. let expr0_0 = constructor_with_flags(ctx, pattern0_0, pattern1_0)?; let expr1_0: usize = 0; let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); diff --git a/cranelift/codegen/src/isa/s390x/lower/isle/generated_code.manifest b/cranelift/codegen/src/isa/s390x/lower/isle/generated_code.manifest index abfc4657f644..b2391d6887b7 100644 --- a/cranelift/codegen/src/isa/s390x/lower/isle/generated_code.manifest +++ b/cranelift/codegen/src/isa/s390x/lower/isle/generated_code.manifest @@ -1,4 +1,4 @@ src/clif.isle 443b34b797fc8ace -src/prelude.isle 74d9514ac948e163 +src/prelude.isle c0751050a11e2686 src/isa/s390x/inst.isle d91a16074ab186a8 src/isa/s390x/lower.isle 1cc5a12adc8c75f9 diff --git a/cranelift/codegen/src/isa/s390x/lower/isle/generated_code.rs b/cranelift/codegen/src/isa/s390x/lower/isle/generated_code.rs index 0bd0a602bd9c..1997c856dfad 100644 --- a/cranelift/codegen/src/isa/s390x/lower/isle/generated_code.rs +++ b/cranelift/codegen/src/isa/s390x/lower/isle/generated_code.rs @@ -55,6 +55,7 @@ pub trait Context { fn ty_32_or_64(&mut self, arg0: Type) -> Option; fn ty_8_or_16(&mut self, arg0: Type) -> Option; fn ty_int_bool_64(&mut self, arg0: Type) -> Option; + fn ty_int_bool_ref_64(&mut self, arg0: Type) -> Option; fn ty_int_bool_128(&mut self, arg0: Type) -> Option; fn ty_scalar_float(&mut self, arg0: Type) -> Option; fn ty_vec128(&mut self, arg0: Type) -> Option; @@ -76,6 +77,7 @@ pub trait Context { fn value_type(&mut self, arg0: Value) -> Type; fn multi_lane(&mut self, arg0: Type) -> Option<(u8, u16)>; fn def_inst(&mut self, arg0: Value) -> Option; + fn offset32_to_u32(&mut self, arg0: Offset32) -> u32; fn emit(&mut self, arg0: &MInst) -> Unit; fn emit_safepoint(&mut self, arg0: &MInst) -> Unit; fn trap_code_division_by_zero(&mut self) -> TrapCode; @@ -153,13 +155,13 @@ pub trait Context { fn same_reg(&mut self, arg0: Reg, arg1: WritableReg) -> Option<()>; } -/// Internal type SideEffectNoResult: defined at src/prelude.isle line 397. +/// Internal type SideEffectNoResult: defined at src/prelude.isle line 405. #[derive(Clone, Debug)] pub enum SideEffectNoResult { Inst { inst: MInst }, } -/// Internal type ProducesFlags: defined at src/prelude.isle line 419. +/// Internal type ProducesFlags: defined at src/prelude.isle line 427. #[derive(Clone, Debug)] pub enum ProducesFlags { ProducesFlagsSideEffect { inst: MInst }, @@ -167,7 +169,7 @@ pub enum ProducesFlags { ProducesFlagsReturnsResultWithConsumer { inst: MInst, result: Reg }, } -/// Internal type ConsumesFlags: defined at src/prelude.isle line 430. +/// Internal type ConsumesFlags: defined at src/prelude.isle line 438. #[derive(Clone, Debug)] pub enum ConsumesFlags { ConsumesFlagsReturnsResultWithProducer { @@ -957,7 +959,7 @@ pub fn constructor_side_effect( inst: ref pattern1_0, } = pattern0_0 { - // Rule at src/prelude.isle line 402. + // Rule at src/prelude.isle line 410. let expr0_0 = C::emit(ctx, pattern1_0); let expr1_0 = C::output_none(ctx); return Some(expr1_0); @@ -975,7 +977,7 @@ pub fn constructor_safepoint( inst: ref pattern1_0, } = pattern0_0 { - // Rule at src/prelude.isle line 408. + // Rule at src/prelude.isle line 416. let expr0_0 = C::emit_safepoint(ctx, pattern1_0); let expr1_0 = C::output_none(ctx); return Some(expr1_0); @@ -994,7 +996,7 @@ pub fn constructor_produces_flags_get_reg( result: pattern1_1, } = pattern0_0 { - // Rule at src/prelude.isle line 446. + // Rule at src/prelude.isle line 454. return Some(pattern1_1); } return None; @@ -1011,7 +1013,7 @@ pub fn constructor_produces_flags_ignore( inst: ref pattern1_0, result: pattern1_1, } => { - // Rule at src/prelude.isle line 451. + // Rule at src/prelude.isle line 459. let expr0_0 = ProducesFlags::ProducesFlagsSideEffect { inst: pattern1_0.clone(), }; @@ -1021,7 +1023,7 @@ pub fn constructor_produces_flags_ignore( inst: ref pattern1_0, result: pattern1_1, } => { - // Rule at src/prelude.isle line 453. + // Rule at src/prelude.isle line 461. let expr0_0 = ProducesFlags::ProducesFlagsSideEffect { inst: pattern1_0.clone(), }; @@ -1050,7 +1052,7 @@ pub fn constructor_consumes_flags_concat( result: pattern3_1, } = pattern2_0 { - // Rule at src/prelude.isle line 460. + // Rule at src/prelude.isle line 468. let expr0_0 = C::value_regs(ctx, pattern1_1, pattern3_1); let expr1_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { inst1: pattern1_0.clone(), @@ -1080,7 +1082,7 @@ pub fn constructor_with_flags( inst: ref pattern3_0, result: pattern3_1, } => { - // Rule at src/prelude.isle line 485. + // Rule at src/prelude.isle line 493. let expr0_0 = C::emit(ctx, pattern1_0); let expr1_0 = C::emit(ctx, pattern3_0); let expr2_0 = C::value_reg(ctx, pattern3_1); @@ -1091,7 +1093,7 @@ pub fn constructor_with_flags( inst2: ref pattern3_1, result: pattern3_2, } => { - // Rule at src/prelude.isle line 491. + // Rule at src/prelude.isle line 499. let expr0_0 = C::emit(ctx, pattern1_0); let expr1_0 = C::emit(ctx, pattern3_0); let expr2_0 = C::emit(ctx, pattern3_1); @@ -1104,7 +1106,7 @@ pub fn constructor_with_flags( inst4: ref pattern3_3, result: pattern3_4, } => { - // Rule at src/prelude.isle line 503. + // Rule at src/prelude.isle line 511. let expr0_0 = C::emit(ctx, pattern1_0); let expr1_0 = C::emit(ctx, pattern3_0); let expr2_0 = C::emit(ctx, pattern3_1); @@ -1125,7 +1127,7 @@ pub fn constructor_with_flags( result: pattern3_1, } = pattern2_0 { - // Rule at src/prelude.isle line 479. + // Rule at src/prelude.isle line 487. let expr0_0 = C::emit(ctx, pattern1_0); let expr1_0 = C::emit(ctx, pattern3_0); let expr2_0 = C::value_regs(ctx, pattern1_1, pattern3_1); @@ -1145,7 +1147,7 @@ pub fn constructor_with_flags_reg( ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/prelude.isle line 520. + // Rule at src/prelude.isle line 528. let expr0_0 = constructor_with_flags(ctx, pattern0_0, pattern1_0)?; let expr1_0: usize = 0; let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); diff --git a/cranelift/codegen/src/isa/x64/inst.isle b/cranelift/codegen/src/isa/x64/inst.isle index b0597f06bba3..9e262f127c5d 100644 --- a/cranelift/codegen/src/isa/x64/inst.isle +++ b/cranelift/codegen/src/isa/x64/inst.isle @@ -748,18 +748,96 @@ (decl put_in_reg_mem (Value) RegMem) (extern constructor put_in_reg_mem put_in_reg_mem) +;; Addressing modes. + (type SyntheticAmode extern (enum)) (decl synthetic_amode_to_reg_mem (SyntheticAmode) RegMem) (extern constructor synthetic_amode_to_reg_mem synthetic_amode_to_reg_mem) +(decl amode_to_synthetic_amode (Amode) SyntheticAmode) +(extern constructor amode_to_synthetic_amode amode_to_synthetic_amode) + (type Amode extern (enum)) +(decl amode_with_flags (Amode MemFlags) Amode) +(extern constructor amode_with_flags amode_with_flags) + +(decl amode_imm_reg (u32 Gpr) Amode) +(extern constructor amode_imm_reg amode_imm_reg) + +(decl amode_imm_reg_flags (u32 Gpr MemFlags) Amode) +(rule (amode_imm_reg_flags offset base flags) + (amode_with_flags (amode_imm_reg offset base) flags)) + (decl amode_imm_reg_reg_shift (u32 Gpr Gpr u8) Amode) (extern constructor amode_imm_reg_reg_shift amode_imm_reg_reg_shift) -(decl amode_to_synthetic_amode (Amode) SyntheticAmode) -(extern constructor amode_to_synthetic_amode amode_to_synthetic_amode) +(decl amode_imm_reg_reg_shift_flags (u32 Gpr Gpr u8 MemFlags) Amode) +(rule (amode_imm_reg_reg_shift_flags offset base index shift flags) + (amode_with_flags (amode_imm_reg_reg_shift offset base index shift) flags)) + +;; A helper to check if a shift amount (the `Value`) is both constant and +;; less-than or equal to 3; this is needed since x64 can only shift addresses +;; using two bits. +(decl const_shift_lt_eq_3 (u8) Value) +(extern extractor const_shift_lt_eq_3 const_shift_lt_eq_3 ) + +;; A helper to both check that the `Imm64` and `Offset32` values sum to less +;; than 32-bits AND return this summed `u32` value. Also, the `Imm64` will be +;; zero-extended from `Type` up to 64 bits. This is useful for `to_amode`. +(decl sum_extend_fits_in_32_bits (Type Imm64 u32) Offset32) +(extern extractor sum_extend_fits_in_32_bits sum_extend_fits_in_32_bits (in in out)) + +;; To generate an address for a memory access, we can pattern-match various CLIF +;; sub-trees to x64's complex addressing modes (`Amode`). In pseudo-code: +;; +;; if address matches iadd(a, b): +;; if either a or b: +;; matches (ishl c with shift amount <= 3): +;; amode(base + offset + (c << amount)) +;; matches (iconst c where c + offset will fit in 32 bits): +;; amode(base + eval(c + offset)) +;; matches (uextend (iconst c) where c + offset will fit in 32 bits): +;; amode(base + eval(c + offset)) +;; else: +;; amode(a + offset + (b << 0)) +;; else: +;; amode(base + offset) +;; +;; The rules for `to_amode` correspond to a subset of the possible addressing +;; modes available by tweaking the SIB byte, the MOD bits, and the size of the +;; displacement (i.e., offset). More information is available in Intel's +;; Software Developer's Manual, volume 2, section 2.1.5, "Addressing-Mode +;; Encoding of ModR/M and SIB Bytes." +(decl to_amode (MemFlags Value Offset32) Amode) + +;; ...matches (ishl c ...) +(rule (to_amode flags (iadd (ishl src (const_shift_lt_eq_3 amt)) base) offset) + (amode_imm_reg_reg_shift_flags offset (put_in_gpr base) (put_in_gpr src) amt flags)) +(rule (to_amode flags (iadd base (ishl src (const_shift_lt_eq_3 amt))) offset) + (amode_imm_reg_reg_shift_flags offset (put_in_gpr base) (put_in_gpr src) amt flags)) +;; ...matches (iconst c ...); note how this matching pattern uses an in-out +;; extractor to check that the offset and constant value (`c`, the in +;; parameter), when summed will fit into x64's 32-bit displacement, returned as +;; `sum` (the out parameter). The syntax for this could be improved (TODO). +(rule (to_amode flags (iadd (iconst c) base) _offset @ (sum_extend_fits_in_32_bits <$I64 `sx`, zeroed -> `zx`). We overwrite the high bits of the 64-bit +;; GPR even if the `to` type is smaller (e.g., 16-bits). +(rule (lower (has_type (is_gpr_type ty) (uload8 flags address offset))) + (x64_movzx (ExtMode.BQ) (to_amode flags address offset))) +(rule (lower (has_type (is_gpr_type ty) (sload8 flags address offset))) + (x64_movsx (ExtMode.BQ) (to_amode flags address offset))) +(rule (lower (has_type (is_gpr_type ty) (uload16 flags address offset))) + (x64_movzx (ExtMode.WQ) (to_amode flags address offset))) +(rule (lower (has_type (is_gpr_type ty) (sload16 flags address offset))) + (x64_movsx (ExtMode.WQ) (to_amode flags address offset))) +(rule (lower (has_type (is_gpr_type ty) (uload32 flags address offset))) + (x64_movzx (ExtMode.LQ) (to_amode flags address offset))) +(rule (lower (has_type (is_gpr_type ty) (sload32 flags address offset))) + (x64_movsx (ExtMode.LQ) (to_amode flags address offset))) + +;; To load to XMM registers, we use the x64-specific instructions for each type. +;; For `$F32` and `$F64` this is important--we only want to load 32 or 64 bits. +;; But for the 128-bit types, this is not strictly necessary for performance but +;; might help with clarity during disassembly. +(rule (lower (has_type $F32 (load flags address offset))) + (x64_movss_load (to_amode flags address offset))) +(rule (lower (has_type $F64 (load flags address offset))) + (x64_movsd_load (to_amode flags address offset))) +(rule (lower (has_type $F32X4 (load flags address offset))) + (x64_movups (to_amode flags address offset))) +(rule (lower (has_type $F64X2 (load flags address offset))) + (x64_movupd (to_amode flags address offset))) +(rule (lower (has_type (ty_vec128 ty) (load flags address offset))) + (x64_movdqu (to_amode flags address offset))) + +;; We also include widening vector loads; these sign- or zero-extend each lane +;; to the next wider width (e.g., 16x4 -> 32x4). +(rule (lower (has_type $I16X8 (sload8x8 flags address offset))) + (x64_pmovsxbw (to_amode flags address offset))) +(rule (lower (has_type $I16X8 (uload8x8 flags address offset))) + (x64_pmovzxbw (to_amode flags address offset))) +(rule (lower (has_type $I32X4 (sload16x4 flags address offset))) + (x64_pmovsxwd (to_amode flags address offset))) +(rule (lower (has_type $I32X4 (uload16x4 flags address offset))) + (x64_pmovzxwd (to_amode flags address offset))) +(rule (lower (has_type $I64X2 (sload32x2 flags address offset))) + (x64_pmovsxdq (to_amode flags address offset))) +(rule (lower (has_type $I64X2 (uload32x2 flags address offset))) + (x64_pmovzxdq (to_amode flags address offset))) + +;; TODO: Multi-register loads (I128) diff --git a/cranelift/codegen/src/isa/x64/lower.rs b/cranelift/codegen/src/isa/x64/lower.rs index 1ff376f0eef9..48ac3173e50c 100644 --- a/cranelift/codegen/src/isa/x64/lower.rs +++ b/cranelift/codegen/src/isa/x64/lower.rs @@ -2192,18 +2192,6 @@ fn lower_insn_to_regs>( _ => unimplemented!(), }; - let ext_mode = ExtMode::new(elem_ty.bits(), 64); - - let sign_extend = match op { - Opcode::Sload8 - | Opcode::Sload16 - | Opcode::Sload32 - | Opcode::Sload8x8 - | Opcode::Sload16x4 - | Opcode::Sload32x2 => true, - _ => false, - }; - let amode = match op { Opcode::Load | Opcode::Uload8 @@ -2229,60 +2217,7 @@ fn lower_insn_to_regs>( ctx.emit(Inst::mov64_m_r(amode.clone(), dsts.regs()[0])); ctx.emit(Inst::mov64_m_r(amode.offset(8), dsts.regs()[1])); } else { - let dst = get_output_reg(ctx, outputs[0]).only_reg().unwrap(); - let is_xmm = elem_ty.is_float() || elem_ty.is_vector(); - match (sign_extend, is_xmm) { - (true, false) => { - // The load is sign-extended only when the output size is lower than 64 bits, - // so ext-mode is defined in this case. - ctx.emit(Inst::movsx_rm_r(ext_mode.unwrap(), RegMem::mem(amode), dst)); - } - (false, false) => { - if elem_ty.bytes() == 8 { - // Use a plain load. - ctx.emit(Inst::mov64_m_r(amode, dst)) - } else { - // Use a zero-extended load. - ctx.emit(Inst::movzx_rm_r(ext_mode.unwrap(), RegMem::mem(amode), dst)) - } - } - (_, true) => { - ctx.emit(match elem_ty { - types::F32 => Inst::xmm_mov(SseOpcode::Movss, RegMem::mem(amode), dst), - types::F64 => Inst::xmm_mov(SseOpcode::Movsd, RegMem::mem(amode), dst), - types::I8X8 => { - if sign_extend == true { - Inst::xmm_mov(SseOpcode::Pmovsxbw, RegMem::mem(amode), dst) - } else { - Inst::xmm_mov(SseOpcode::Pmovzxbw, RegMem::mem(amode), dst) - } - } - types::I16X4 => { - if sign_extend == true { - Inst::xmm_mov(SseOpcode::Pmovsxwd, RegMem::mem(amode), dst) - } else { - Inst::xmm_mov(SseOpcode::Pmovzxwd, RegMem::mem(amode), dst) - } - } - types::I32X2 => { - if sign_extend == true { - Inst::xmm_mov(SseOpcode::Pmovsxdq, RegMem::mem(amode), dst) - } else { - Inst::xmm_mov(SseOpcode::Pmovzxdq, RegMem::mem(amode), dst) - } - } - _ if elem_ty.is_vector() && elem_ty.bits() == 128 => { - Inst::xmm_mov(SseOpcode::Movups, RegMem::mem(amode), dst) - } - // TODO Specialize for different types: MOVUPD, MOVDQU - _ => unreachable!( - "unexpected type for load: {:?} - {:?}", - elem_ty, - elem_ty.bits() - ), - }); - } - } + 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 dc7b29330552..28df19f89696 100644 --- a/cranelift/codegen/src/isa/x64/lower/isle.rs +++ b/cranelift/codegen/src/isa/x64/lower/isle.rs @@ -12,7 +12,7 @@ use crate::{ condcodes::{FloatCC, IntCC}, immediates::*, types::*, - Inst, InstructionData, Opcode, TrapCode, Value, ValueLabel, ValueList, + Inst, InstructionData, MemFlags, Opcode, TrapCode, Value, ValueLabel, ValueList, }, isa::{ settings::Flags, @@ -313,11 +313,30 @@ where Amode::imm_reg_reg_shift(simm32, base, index, shift) } + #[inline] + fn amode_imm_reg(&mut self, simm32: u32, base: Gpr) -> Amode { + Amode::imm_reg(simm32, base.to_reg()) + } + + #[inline] + fn amode_with_flags(&mut self, amode: &Amode, flags: MemFlags) -> Amode { + amode.with_flags(flags) + } + #[inline] fn amode_to_synthetic_amode(&mut self, amode: &Amode) -> SyntheticAmode { amode.clone().into() } + #[inline] + fn const_shift_lt_eq_3(&mut self, shift_amount: Value) -> Option { + let input = self.lower_ctx.get_value_as_source_or_const(shift_amount); + match input.constant { + Some(shift_amount) if shift_amount <= 3 => Some(shift_amount as u8), + _ => None, + } + } + #[inline] fn writable_gpr_to_reg(&mut self, r: WritableGpr) -> WritableReg { r.to_writable_reg() @@ -519,6 +538,28 @@ where fn intcc_to_cc(&mut self, intcc: &IntCC) -> CC { CC::from_intcc(*intcc) } + + #[inline] + fn sum_extend_fits_in_32_bits( + &mut self, + offset: Offset32, + extend_from_ty: Type, + constant_value: Imm64, + ) -> Option { + let offset: i64 = offset.into(); + let constant_value: u64 = constant_value.bits() as u64; + // If necessary, zero extend `constant_value` up to 64 bits. + let shift = 64 - extend_from_ty.bits(); + let zero_extended_constant_value = (constant_value << shift) >> shift; + // Sum up the two operands. + let sum = offset.wrapping_add(zero_extended_constant_value as i64); + // Check that the sum will fit in 32-bits. + if sum == ((sum << 32) >> 32) { + Some(sum as u32) + } else { + None + } + } } // 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 a137c564389a..952c3a81619b 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 443b34b797fc8ace -src/prelude.isle 74d9514ac948e163 -src/isa/x64/inst.isle a002d62dcfce285 -src/isa/x64/lower.isle 8f3e1ed2929fd07e +src/prelude.isle c0751050a11e2686 +src/isa/x64/inst.isle c4729db7808ba0b5 +src/isa/x64/lower.isle 7e839e6b667bfe77 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 534e038a8e00..3dfd510e7dbf 100644 --- a/cranelift/codegen/src/isa/x64/lower/isle/generated_code.rs +++ b/cranelift/codegen/src/isa/x64/lower/isle/generated_code.rs @@ -55,6 +55,7 @@ pub trait Context { fn ty_32_or_64(&mut self, arg0: Type) -> Option; fn ty_8_or_16(&mut self, arg0: Type) -> Option; fn ty_int_bool_64(&mut self, arg0: Type) -> Option; + fn ty_int_bool_ref_64(&mut self, arg0: Type) -> Option; fn ty_int_bool_128(&mut self, arg0: Type) -> Option; fn ty_scalar_float(&mut self, arg0: Type) -> Option; fn ty_vec128(&mut self, arg0: Type) -> Option; @@ -76,6 +77,7 @@ pub trait Context { fn value_type(&mut self, arg0: Value) -> Type; fn multi_lane(&mut self, arg0: Type) -> Option<(u8, u16)>; fn def_inst(&mut self, arg0: Value) -> Option; + fn offset32_to_u32(&mut self, arg0: Offset32) -> u32; fn emit(&mut self, arg0: &MInst) -> Unit; fn emit_safepoint(&mut self, arg0: &MInst) -> Unit; fn trap_code_division_by_zero(&mut self) -> TrapCode; @@ -93,8 +95,17 @@ pub trait Context { fn put_in_reg_mem_imm(&mut self, arg0: Value) -> RegMemImm; fn put_in_reg_mem(&mut self, arg0: Value) -> RegMem; fn synthetic_amode_to_reg_mem(&mut self, arg0: &SyntheticAmode) -> RegMem; - 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 amode_with_flags(&mut self, arg0: &Amode, arg1: MemFlags) -> Amode; + fn amode_imm_reg(&mut self, arg0: u32, arg1: Gpr) -> Amode; + fn amode_imm_reg_reg_shift(&mut self, arg0: u32, arg1: Gpr, arg2: Gpr, arg3: u8) -> Amode; + fn const_shift_lt_eq_3(&mut self, arg0: Value) -> Option; + fn sum_extend_fits_in_32_bits( + &mut self, + arg0: Offset32, + arg1: Type, + arg2: Imm64, + ) -> Option; 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; @@ -151,13 +162,13 @@ pub trait Context { fn popcount_low_mask(&mut self) -> VCodeConstant; } -/// Internal type SideEffectNoResult: defined at src/prelude.isle line 397. +/// Internal type SideEffectNoResult: defined at src/prelude.isle line 405. #[derive(Clone, Debug)] pub enum SideEffectNoResult { Inst { inst: MInst }, } -/// Internal type ProducesFlags: defined at src/prelude.isle line 419. +/// Internal type ProducesFlags: defined at src/prelude.isle line 427. #[derive(Clone, Debug)] pub enum ProducesFlags { ProducesFlagsSideEffect { inst: MInst }, @@ -165,7 +176,7 @@ pub enum ProducesFlags { ProducesFlagsReturnsResultWithConsumer { inst: MInst, result: Reg }, } -/// Internal type ConsumesFlags: defined at src/prelude.isle line 430. +/// Internal type ConsumesFlags: defined at src/prelude.isle line 438. #[derive(Clone, Debug)] pub enum ConsumesFlags { ConsumesFlagsReturnsResultWithProducer { @@ -503,7 +514,7 @@ pub enum MInst { }, } -/// Internal type ExtendKind: defined at src/isa/x64/inst.isle line 1123. +/// Internal type ExtendKind: defined at src/isa/x64/inst.isle line 1201. #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum ExtendKind { Sign, @@ -557,7 +568,7 @@ pub fn constructor_side_effect( inst: ref pattern1_0, } = pattern0_0 { - // Rule at src/prelude.isle line 402. + // Rule at src/prelude.isle line 410. let expr0_0 = C::emit(ctx, pattern1_0); let expr1_0 = C::output_none(ctx); return Some(expr1_0); @@ -575,7 +586,7 @@ pub fn constructor_safepoint( inst: ref pattern1_0, } = pattern0_0 { - // Rule at src/prelude.isle line 408. + // Rule at src/prelude.isle line 416. let expr0_0 = C::emit_safepoint(ctx, pattern1_0); let expr1_0 = C::output_none(ctx); return Some(expr1_0); @@ -594,7 +605,7 @@ pub fn constructor_produces_flags_get_reg( result: pattern1_1, } = pattern0_0 { - // Rule at src/prelude.isle line 446. + // Rule at src/prelude.isle line 454. return Some(pattern1_1); } return None; @@ -611,7 +622,7 @@ pub fn constructor_produces_flags_ignore( inst: ref pattern1_0, result: pattern1_1, } => { - // Rule at src/prelude.isle line 451. + // Rule at src/prelude.isle line 459. let expr0_0 = ProducesFlags::ProducesFlagsSideEffect { inst: pattern1_0.clone(), }; @@ -621,7 +632,7 @@ pub fn constructor_produces_flags_ignore( inst: ref pattern1_0, result: pattern1_1, } => { - // Rule at src/prelude.isle line 453. + // Rule at src/prelude.isle line 461. let expr0_0 = ProducesFlags::ProducesFlagsSideEffect { inst: pattern1_0.clone(), }; @@ -650,7 +661,7 @@ pub fn constructor_consumes_flags_concat( result: pattern3_1, } = pattern2_0 { - // Rule at src/prelude.isle line 460. + // Rule at src/prelude.isle line 468. let expr0_0 = C::value_regs(ctx, pattern1_1, pattern3_1); let expr1_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { inst1: pattern1_0.clone(), @@ -680,7 +691,7 @@ pub fn constructor_with_flags( inst: ref pattern3_0, result: pattern3_1, } => { - // Rule at src/prelude.isle line 485. + // Rule at src/prelude.isle line 493. let expr0_0 = C::emit(ctx, pattern1_0); let expr1_0 = C::emit(ctx, pattern3_0); let expr2_0 = C::value_reg(ctx, pattern3_1); @@ -691,7 +702,7 @@ pub fn constructor_with_flags( inst2: ref pattern3_1, result: pattern3_2, } => { - // Rule at src/prelude.isle line 491. + // Rule at src/prelude.isle line 499. let expr0_0 = C::emit(ctx, pattern1_0); let expr1_0 = C::emit(ctx, pattern3_0); let expr2_0 = C::emit(ctx, pattern3_1); @@ -704,7 +715,7 @@ pub fn constructor_with_flags( inst4: ref pattern3_3, result: pattern3_4, } => { - // Rule at src/prelude.isle line 503. + // Rule at src/prelude.isle line 511. let expr0_0 = C::emit(ctx, pattern1_0); let expr1_0 = C::emit(ctx, pattern3_0); let expr2_0 = C::emit(ctx, pattern3_1); @@ -725,7 +736,7 @@ pub fn constructor_with_flags( result: pattern3_1, } = pattern2_0 { - // Rule at src/prelude.isle line 479. + // Rule at src/prelude.isle line 487. let expr0_0 = C::emit(ctx, pattern1_0); let expr1_0 = C::emit(ctx, pattern3_0); let expr2_0 = C::value_regs(ctx, pattern1_1, pattern3_1); @@ -745,7 +756,7 @@ pub fn constructor_with_flags_reg( ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/prelude.isle line 520. + // Rule at src/prelude.isle line 528. let expr0_0 = constructor_with_flags(ctx, pattern0_0, pattern1_0)?; let expr1_0: usize = 0; let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); @@ -781,10 +792,329 @@ pub fn constructor_operand_size_bits(ctx: &mut C, arg0: &OperandSize return None; } +// Generated as internal constructor for term amode_imm_reg_flags. +pub fn constructor_amode_imm_reg_flags( + ctx: &mut C, + arg0: u32, + arg1: Gpr, + arg2: MemFlags, +) -> Option { + let pattern0_0 = arg0; + let pattern1_0 = arg1; + let pattern2_0 = arg2; + // Rule at src/isa/x64/inst.isle line 770. + let expr0_0 = C::amode_imm_reg(ctx, pattern0_0, pattern1_0); + let expr1_0 = C::amode_with_flags(ctx, &expr0_0, pattern2_0); + return Some(expr1_0); +} + +// Generated as internal constructor for term amode_imm_reg_reg_shift_flags. +pub fn constructor_amode_imm_reg_reg_shift_flags( + ctx: &mut C, + arg0: u32, + arg1: Gpr, + arg2: Gpr, + arg3: u8, + arg4: MemFlags, +) -> Option { + let pattern0_0 = arg0; + let pattern1_0 = arg1; + let pattern2_0 = arg2; + let pattern3_0 = arg3; + let pattern4_0 = arg4; + // Rule at src/isa/x64/inst.isle line 777. + let expr0_0 = C::amode_imm_reg_reg_shift(ctx, pattern0_0, pattern1_0, pattern2_0, pattern3_0); + let expr1_0 = C::amode_with_flags(ctx, &expr0_0, pattern4_0); + return Some(expr1_0); +} + +// Generated as internal constructor for term to_amode. +pub fn constructor_to_amode( + ctx: &mut C, + arg0: MemFlags, + arg1: Value, + arg2: Offset32, +) -> Option { + let pattern0_0 = arg0; + let pattern1_0 = arg1; + if let Some(pattern2_0) = C::def_inst(ctx, pattern1_0) { + let pattern3_0 = C::inst_data(ctx, pattern2_0); + if let &InstructionData::Binary { + opcode: ref pattern4_0, + args: ref pattern4_1, + } = &pattern3_0 + { + if let &Opcode::Iadd = pattern4_0 { + let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); + if let Some(pattern7_0) = C::def_inst(ctx, pattern6_0) { + let pattern8_0 = C::inst_data(ctx, pattern7_0); + match &pattern8_0 { + &InstructionData::UnaryImm { + opcode: ref pattern9_0, + imm: pattern9_1, + } => { + if let &Opcode::Iconst = pattern9_0 { + let pattern11_0 = arg2; + let closure12 = || { + let expr0_0: Type = I64; + return Some(expr0_0); + }; + if let Some(pattern12_0) = closure12() { + let closure13 = || { + return Some(pattern9_1); + }; + if let Some(pattern13_0) = closure13() { + if let Some(pattern14_0) = C::sum_extend_fits_in_32_bits( + ctx, + pattern11_0, + pattern12_0, + pattern13_0, + ) { + // Rule at src/isa/x64/inst.isle line 824. + let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1)?; + let expr1_0 = constructor_amode_imm_reg_flags( + ctx, + pattern14_0, + expr0_0, + pattern0_0, + )?; + return Some(expr1_0); + } + } + } + } + } + &InstructionData::Binary { + opcode: ref pattern9_0, + args: ref pattern9_1, + } => { + if let &Opcode::Ishl = pattern9_0 { + let (pattern11_0, pattern11_1) = + C::unpack_value_array_2(ctx, pattern9_1); + if let Some(pattern12_0) = C::const_shift_lt_eq_3(ctx, pattern11_1) + { + let pattern13_0 = arg2; + // Rule at src/isa/x64/inst.isle line 816. + let expr0_0 = C::offset32_to_u32(ctx, pattern13_0); + let expr1_0 = constructor_put_in_gpr(ctx, pattern6_1)?; + let expr2_0 = constructor_put_in_gpr(ctx, pattern11_0)?; + let expr3_0 = constructor_amode_imm_reg_reg_shift_flags( + ctx, + expr0_0, + expr1_0, + expr2_0, + pattern12_0, + pattern0_0, + )?; + return Some(expr3_0); + } + } + } + _ => {} + } + if let Some(pattern8_0) = C::first_result(ctx, pattern7_0) { + let pattern9_0 = C::value_type(ctx, pattern8_0); + let pattern10_0 = C::inst_data(ctx, pattern7_0); + if let &InstructionData::Unary { + opcode: ref pattern11_0, + arg: pattern11_1, + } = &pattern10_0 + { + if let &Opcode::Uextend = pattern11_0 { + if let Some(pattern13_0) = C::def_inst(ctx, pattern11_1) { + let pattern14_0 = C::inst_data(ctx, pattern13_0); + if let &InstructionData::UnaryImm { + opcode: ref pattern15_0, + imm: pattern15_1, + } = &pattern14_0 + { + if let &Opcode::Iconst = pattern15_0 { + let pattern17_0 = arg2; + let closure18 = || { + return Some(pattern9_0); + }; + if let Some(pattern18_0) = closure18() { + let closure19 = || { + return Some(pattern15_1); + }; + if let Some(pattern19_0) = closure19() { + if let Some(pattern20_0) = + C::sum_extend_fits_in_32_bits( + ctx, + pattern17_0, + pattern18_0, + pattern19_0, + ) + { + // Rule at src/isa/x64/inst.isle line 829. + let expr0_0 = constructor_put_in_gpr( + ctx, pattern6_1, + )?; + let expr1_0 = + constructor_amode_imm_reg_flags( + ctx, + pattern20_0, + expr0_0, + pattern0_0, + )?; + return Some(expr1_0); + } + } + } + } + } + } + } + } + } + } + if let Some(pattern7_0) = C::def_inst(ctx, pattern6_1) { + let pattern8_0 = C::inst_data(ctx, pattern7_0); + match &pattern8_0 { + &InstructionData::UnaryImm { + opcode: ref pattern9_0, + imm: pattern9_1, + } => { + if let &Opcode::Iconst = pattern9_0 { + let pattern11_0 = arg2; + let closure12 = || { + let expr0_0: Type = I64; + return Some(expr0_0); + }; + if let Some(pattern12_0) = closure12() { + let closure13 = || { + return Some(pattern9_1); + }; + if let Some(pattern13_0) = closure13() { + if let Some(pattern14_0) = C::sum_extend_fits_in_32_bits( + ctx, + pattern11_0, + pattern12_0, + pattern13_0, + ) { + // Rule at src/isa/x64/inst.isle line 826. + let expr0_0 = constructor_put_in_gpr(ctx, pattern6_0)?; + let expr1_0 = constructor_amode_imm_reg_flags( + ctx, + pattern14_0, + expr0_0, + pattern0_0, + )?; + return Some(expr1_0); + } + } + } + } + } + &InstructionData::Binary { + opcode: ref pattern9_0, + args: ref pattern9_1, + } => { + if let &Opcode::Ishl = pattern9_0 { + let (pattern11_0, pattern11_1) = + C::unpack_value_array_2(ctx, pattern9_1); + if let Some(pattern12_0) = C::const_shift_lt_eq_3(ctx, pattern11_1) + { + let pattern13_0 = arg2; + // Rule at src/isa/x64/inst.isle line 818. + let expr0_0 = C::offset32_to_u32(ctx, pattern13_0); + let expr1_0 = constructor_put_in_gpr(ctx, pattern6_0)?; + let expr2_0 = constructor_put_in_gpr(ctx, pattern11_0)?; + let expr3_0 = constructor_amode_imm_reg_reg_shift_flags( + ctx, + expr0_0, + expr1_0, + expr2_0, + pattern12_0, + pattern0_0, + )?; + return Some(expr3_0); + } + } + } + _ => {} + } + if let Some(pattern8_0) = C::first_result(ctx, pattern7_0) { + let pattern9_0 = C::value_type(ctx, pattern8_0); + let pattern10_0 = C::inst_data(ctx, pattern7_0); + if let &InstructionData::Unary { + opcode: ref pattern11_0, + arg: pattern11_1, + } = &pattern10_0 + { + if let &Opcode::Uextend = pattern11_0 { + if let Some(pattern13_0) = C::def_inst(ctx, pattern11_1) { + let pattern14_0 = C::inst_data(ctx, pattern13_0); + if let &InstructionData::UnaryImm { + opcode: ref pattern15_0, + imm: pattern15_1, + } = &pattern14_0 + { + if let &Opcode::Iconst = pattern15_0 { + let pattern17_0 = arg2; + let closure18 = || { + return Some(pattern9_0); + }; + if let Some(pattern18_0) = closure18() { + let closure19 = || { + return Some(pattern15_1); + }; + if let Some(pattern19_0) = closure19() { + if let Some(pattern20_0) = + C::sum_extend_fits_in_32_bits( + ctx, + pattern17_0, + pattern18_0, + pattern19_0, + ) + { + // Rule at src/isa/x64/inst.isle line 831. + let expr0_0 = constructor_put_in_gpr( + ctx, pattern6_0, + )?; + let expr1_0 = + constructor_amode_imm_reg_flags( + ctx, + pattern20_0, + expr0_0, + pattern0_0, + )?; + return Some(expr1_0); + } + } + } + } + } + } + } + } + } + } + let pattern7_0 = arg2; + // Rule at src/isa/x64/inst.isle line 834. + let expr0_0 = C::offset32_to_u32(ctx, pattern7_0); + let expr1_0 = constructor_put_in_gpr(ctx, pattern6_0)?; + let expr2_0 = constructor_put_in_gpr(ctx, pattern6_1)?; + let expr3_0: u8 = 0; + let expr4_0 = constructor_amode_imm_reg_reg_shift_flags( + ctx, expr0_0, expr1_0, expr2_0, expr3_0, pattern0_0, + )?; + return Some(expr4_0); + } + } + } + let pattern2_0 = arg2; + // Rule at src/isa/x64/inst.isle line 837. + let expr0_0 = C::offset32_to_u32(ctx, pattern2_0); + let expr1_0 = constructor_put_in_gpr(ctx, pattern1_0)?; + let expr2_0 = constructor_amode_imm_reg_flags(ctx, expr0_0, expr1_0, pattern0_0)?; + return Some(expr2_0); +} + // 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 953. + // Rule at src/isa/x64/inst.isle line 1031. 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); @@ -793,7 +1123,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 960. + // Rule at src/isa/x64/inst.isle line 1038. let expr0_0 = C::put_in_reg(ctx, pattern0_0); let expr1_0 = C::gpr_new(ctx, expr0_0); return Some(expr1_0); @@ -802,7 +1132,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 967. + // Rule at src/isa/x64/inst.isle line 1045. 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); @@ -811,7 +1141,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 974. + // Rule at src/isa/x64/inst.isle line 1052. 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); @@ -820,7 +1150,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 981. + // Rule at src/isa/x64/inst.isle line 1059. let expr0_0 = C::put_in_reg(ctx, pattern0_0); let expr1_0 = C::xmm_new(ctx, expr0_0); return Some(expr1_0); @@ -829,7 +1159,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 988. + // Rule at src/isa/x64/inst.isle line 1066. 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); @@ -838,7 +1168,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 995. + // Rule at src/isa/x64/inst.isle line 1073. 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); @@ -847,7 +1177,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 1000. + // Rule at src/isa/x64/inst.isle line 1078. let expr0_0 = C::gpr_to_reg(ctx, pattern0_0); let expr1_0 = constructor_output_reg(ctx, expr0_0)?; return Some(expr1_0); @@ -857,7 +1187,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 1005. + // Rule at src/isa/x64/inst.isle line 1083. 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); @@ -867,7 +1197,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 1010. + // Rule at src/isa/x64/inst.isle line 1088. let expr0_0 = C::xmm_to_reg(ctx, pattern0_0); let expr1_0 = constructor_output_reg(ctx, expr0_0)?; return Some(expr1_0); @@ -881,7 +1211,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 1017. + // Rule at src/isa/x64/inst.isle line 1095. 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); @@ -890,7 +1220,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 1030. + // Rule at src/isa/x64/inst.isle line 1108. let expr0_0 = constructor_lo_reg(ctx, pattern0_0)?; let expr1_0 = C::gpr_new(ctx, expr0_0); return Some(expr1_0); @@ -902,7 +1232,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 1113. + // Rule at src/isa/x64/inst.isle line 1191. let expr0_0 = C::sink_load(ctx, pattern0_0); let expr1_0 = C::gpr_mem_imm_new(ctx, &expr0_0); return Some(expr1_0); @@ -920,12 +1250,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 1135. + // Rule at src/isa/x64/inst.isle line 1213. 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 1138. + // Rule at src/isa/x64/inst.isle line 1216. 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)?; @@ -949,16 +1279,16 @@ pub fn constructor_extend( let pattern2_0 = arg1; let pattern3_0 = arg2; let pattern4_0 = arg3; - // Rule at src/isa/x64/inst.isle line 1158. - let expr0_0 = constructor_x64_movsx(ctx, pattern2_0, pattern3_0, pattern4_0)?; + // Rule at src/isa/x64/inst.isle line 1236. + let expr0_0 = constructor_x64_movsx(ctx, pattern3_0, pattern4_0)?; return Some(expr0_0); } &ExtendKind::Zero => { let pattern2_0 = arg1; let pattern3_0 = arg2; let pattern4_0 = arg3; - // Rule at src/isa/x64/inst.isle line 1154. - let expr0_0 = constructor_x64_movzx(ctx, pattern2_0, pattern3_0, pattern4_0)?; + // Rule at src/isa/x64/inst.isle line 1232. + let expr0_0 = constructor_x64_movzx(ctx, pattern3_0, pattern4_0)?; return Some(expr0_0); } _ => {} @@ -970,17 +1300,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 1165. + // Rule at src/isa/x64/inst.isle line 1243. let expr0_0 = SseOpcode::Xorps; return Some(expr0_0); } if pattern0_0 == F64X2 { - // Rule at src/isa/x64/inst.isle line 1166. + // Rule at src/isa/x64/inst.isle line 1244. 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 1167. + // Rule at src/isa/x64/inst.isle line 1245. let expr0_0 = SseOpcode::Pxor; return Some(expr0_0); } @@ -997,7 +1327,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 1171. + // Rule at src/isa/x64/inst.isle line 1249. 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); @@ -1007,40 +1337,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 1180. + // Rule at src/isa/x64/inst.isle line 1258. let expr0_0 = SseOpcode::Cmpps; return Some(expr0_0); } if pattern0_0 == F64X2 { - // Rule at src/isa/x64/inst.isle line 1181. + // Rule at src/isa/x64/inst.isle line 1259. 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 1176. + // Rule at src/isa/x64/inst.isle line 1254. 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 1177. + // Rule at src/isa/x64/inst.isle line 1255. 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 1178. + // Rule at src/isa/x64/inst.isle line 1256. 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 1179. + // Rule at src/isa/x64/inst.isle line 1257. let expr0_0 = SseOpcode::Pcmpeqq; return Some(expr0_0); } @@ -1052,7 +1382,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 1195. + // Rule at src/isa/x64/inst.isle line 1273. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0: Type = I32X4; let expr2_0 = constructor_sse_cmp_op(ctx, expr1_0)?; @@ -1077,7 +1407,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 1205. + // Rule at src/isa/x64/inst.isle line 1283. 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 }; @@ -1119,12 +1449,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 1226. + // Rule at src/isa/x64/inst.isle line 1304. 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 1227. + // Rule at src/isa/x64/inst.isle line 1305. let expr0_0 = SseOpcode::Movd; let expr1_0 = C::reg_to_gpr_mem(ctx, pattern1_0); let expr2_0 = OperandSize::Size32; @@ -1135,7 +1465,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 1225. + // Rule at src/isa/x64/inst.isle line 1303. let expr0_0 = C::xmm_mem_imm_new(ctx, pattern0_0); return Some(expr0_0); } @@ -1155,7 +1485,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 1242. + // Rule at src/isa/x64/inst.isle line 1319. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = MInst::Mov64MR { src: pattern2_0.clone(), @@ -1168,7 +1498,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 1247. + // Rule at src/isa/x64/inst.isle line 1324. 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)?; @@ -1178,7 +1508,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 1251. + // Rule at src/isa/x64/inst.isle line 1328. 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)?; @@ -1188,7 +1518,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 1255. + // Rule at src/isa/x64/inst.isle line 1332. 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)?; @@ -1198,7 +1528,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 1259. + // Rule at src/isa/x64/inst.isle line 1336. 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)?; @@ -1208,7 +1538,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 1263. + // Rule at src/isa/x64/inst.isle line 1340. 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)?; @@ -1219,12 +1549,12 @@ 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 1237. + // Rule at src/isa/x64/inst.isle line 1315. let expr0_0 = C::ty_bytes(ctx, pattern1_0); let expr1_0: u16 = 8; let expr2_0 = C::ext_mode(ctx, expr0_0, expr1_0); let expr3_0 = constructor_synthetic_amode_to_gpr_mem(ctx, pattern2_0)?; - let expr4_0 = constructor_x64_movsx(ctx, pattern1_0, &expr2_0, &expr3_0)?; + let expr4_0 = constructor_x64_movsx(ctx, &expr2_0, &expr3_0)?; let expr5_0 = C::gpr_to_reg(ctx, expr4_0); return Some(expr5_0); } @@ -1232,6 +1562,160 @@ pub fn constructor_x64_load( return None; } +// Generated as internal constructor for term x64_mov. +pub fn constructor_x64_mov(ctx: &mut C, arg0: &Amode) -> Option { + let pattern0_0 = arg0; + // Rule at src/isa/x64/inst.isle line 1345. + let expr0_0 = C::temp_writable_gpr(ctx); + let expr1_0 = C::amode_to_synthetic_amode(ctx, pattern0_0); + let expr2_0 = MInst::Mov64MR { + src: expr1_0, + dst: expr0_0, + }; + let expr3_0 = C::emit(ctx, &expr2_0); + let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; + return Some(expr4_0); +} + +// Generated as internal constructor for term x64_movzx. +pub fn constructor_x64_movzx( + ctx: &mut C, + arg0: &ExtMode, + arg1: &GprMem, +) -> Option { + let pattern0_0 = arg0; + let pattern1_0 = arg1; + // Rule at src/isa/x64/inst.isle line 1351. + let expr0_0 = C::temp_writable_gpr(ctx); + let expr1_0 = MInst::MovzxRmR { + ext_mode: pattern0_0.clone(), + src: pattern1_0.clone(), + dst: expr0_0, + }; + let expr2_0 = C::emit(ctx, &expr1_0); + let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0); + return Some(expr3_0); +} + +// Generated as internal constructor for term x64_movsx. +pub fn constructor_x64_movsx( + ctx: &mut C, + arg0: &ExtMode, + arg1: &GprMem, +) -> Option { + let pattern0_0 = arg0; + let pattern1_0 = arg1; + // Rule at src/isa/x64/inst.isle line 1357. + let expr0_0 = C::temp_writable_gpr(ctx); + let expr1_0 = MInst::MovsxRmR { + ext_mode: pattern0_0.clone(), + src: pattern1_0.clone(), + dst: expr0_0, + }; + let expr2_0 = C::emit(ctx, &expr1_0); + let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0); + return Some(expr3_0); +} + +// Generated as internal constructor for term x64_movss_load. +pub fn constructor_x64_movss_load(ctx: &mut C, arg0: &XmmMem) -> Option { + let pattern0_0 = arg0; + // Rule at src/isa/x64/inst.isle line 1363. + let expr0_0 = SseOpcode::Movss; + let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; + return Some(expr1_0); +} + +// Generated as internal constructor for term x64_movsd_load. +pub fn constructor_x64_movsd_load(ctx: &mut C, arg0: &XmmMem) -> Option { + let pattern0_0 = arg0; + // Rule at src/isa/x64/inst.isle line 1367. + let expr0_0 = SseOpcode::Movsd; + let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; + return Some(expr1_0); +} + +// Generated as internal constructor for term x64_movups. +pub fn constructor_x64_movups(ctx: &mut C, arg0: &XmmMem) -> Option { + let pattern0_0 = arg0; + // Rule at src/isa/x64/inst.isle line 1371. + let expr0_0 = SseOpcode::Movups; + let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; + return Some(expr1_0); +} + +// Generated as internal constructor for term x64_movupd. +pub fn constructor_x64_movupd(ctx: &mut C, arg0: &XmmMem) -> Option { + let pattern0_0 = arg0; + // Rule at src/isa/x64/inst.isle line 1375. + let expr0_0 = SseOpcode::Movupd; + let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; + return Some(expr1_0); +} + +// Generated as internal constructor for term x64_movdqu. +pub fn constructor_x64_movdqu(ctx: &mut C, arg0: &XmmMem) -> Option { + let pattern0_0 = arg0; + // Rule at src/isa/x64/inst.isle line 1379. + let expr0_0 = SseOpcode::Movdqu; + let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; + return Some(expr1_0); +} + +// Generated as internal constructor for term x64_pmovsxbw. +pub fn constructor_x64_pmovsxbw(ctx: &mut C, arg0: &XmmMem) -> Option { + let pattern0_0 = arg0; + // Rule at src/isa/x64/inst.isle line 1383. + let expr0_0 = SseOpcode::Pmovsxbw; + let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; + return Some(expr1_0); +} + +// Generated as internal constructor for term x64_pmovzxbw. +pub fn constructor_x64_pmovzxbw(ctx: &mut C, arg0: &XmmMem) -> Option { + let pattern0_0 = arg0; + // Rule at src/isa/x64/inst.isle line 1387. + let expr0_0 = SseOpcode::Pmovzxbw; + let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; + return Some(expr1_0); +} + +// Generated as internal constructor for term x64_pmovsxwd. +pub fn constructor_x64_pmovsxwd(ctx: &mut C, arg0: &XmmMem) -> Option { + let pattern0_0 = arg0; + // Rule at src/isa/x64/inst.isle line 1391. + let expr0_0 = SseOpcode::Pmovsxwd; + let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; + return Some(expr1_0); +} + +// Generated as internal constructor for term x64_pmovzxwd. +pub fn constructor_x64_pmovzxwd(ctx: &mut C, arg0: &XmmMem) -> Option { + let pattern0_0 = arg0; + // Rule at src/isa/x64/inst.isle line 1395. + let expr0_0 = SseOpcode::Pmovzxwd; + let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; + return Some(expr1_0); +} + +// Generated as internal constructor for term x64_pmovsxdq. +pub fn constructor_x64_pmovsxdq(ctx: &mut C, arg0: &XmmMem) -> Option { + let pattern0_0 = arg0; + // Rule at src/isa/x64/inst.isle line 1399. + let expr0_0 = SseOpcode::Pmovsxdq; + let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; + return Some(expr1_0); +} + +// Generated as internal constructor for term x64_pmovzxdq. +pub fn constructor_x64_pmovzxdq(ctx: &mut C, arg0: &XmmMem) -> Option { + let pattern0_0 = arg0; + // Rule at src/isa/x64/inst.isle line 1403. + let expr0_0 = SseOpcode::Pmovzxdq; + let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; + return Some(expr1_0); +} + // Generated as internal constructor for term x64_xmm_load_const. pub fn constructor_x64_xmm_load_const( ctx: &mut C, @@ -1240,7 +1724,7 @@ pub fn constructor_x64_xmm_load_const( ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1269. + // Rule at src/isa/x64/inst.isle line 1408. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = C::writable_xmm_to_reg(ctx, expr0_0); let expr2_0 = MInst::XmmLoadConst { @@ -1265,7 +1749,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 1282. + // Rule at src/isa/x64/inst.isle line 1421. 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 { @@ -1290,7 +1774,7 @@ pub fn constructor_x64_add( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1290. + // Rule at src/isa/x64/inst.isle line 1429. 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); @@ -1306,7 +1790,7 @@ pub fn constructor_x64_add_with_flags_paired( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1298. + // Rule at src/isa/x64/inst.isle line 1437. 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; @@ -1335,7 +1819,7 @@ pub fn constructor_x64_adc_paired( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1310. + // Rule at src/isa/x64/inst.isle line 1449. 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; @@ -1364,7 +1848,7 @@ pub fn constructor_x64_sub( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1322. + // Rule at src/isa/x64/inst.isle line 1461. 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); @@ -1380,7 +1864,7 @@ pub fn constructor_x64_sub_with_flags_paired( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1330. + // Rule at src/isa/x64/inst.isle line 1469. 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; @@ -1409,7 +1893,7 @@ pub fn constructor_x64_sbb_paired( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1342. + // Rule at src/isa/x64/inst.isle line 1481. 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; @@ -1438,7 +1922,7 @@ pub fn constructor_x64_mul( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1354. + // Rule at src/isa/x64/inst.isle line 1493. 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); @@ -1454,7 +1938,7 @@ pub fn constructor_x64_and( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1362. + // Rule at src/isa/x64/inst.isle line 1501. 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); @@ -1470,7 +1954,7 @@ pub fn constructor_x64_and_with_flags_paired( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1369. + // Rule at src/isa/x64/inst.isle line 1508. 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; @@ -1495,7 +1979,7 @@ pub fn constructor_x64_or( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1380. + // Rule at src/isa/x64/inst.isle line 1519. 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); @@ -1511,7 +1995,7 @@ pub fn constructor_x64_xor( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1388. + // Rule at src/isa/x64/inst.isle line 1527. 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); @@ -1523,7 +2007,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 1428. + // Rule at src/isa/x64/inst.isle line 1567. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = OperandSize::Size32; let expr2_0 = MInst::Imm { @@ -1539,7 +2023,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 1457. + // Rule at src/isa/x64/inst.isle line 1596. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0); let expr2_0 = SseOpcode::Xorps; @@ -1554,7 +2038,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 1405. + // Rule at src/isa/x64/inst.isle line 1544. let expr0_0 = SseOpcode::Movd; let expr1_0: Type = I32; let expr2_0 = constructor_imm(ctx, expr1_0, pattern2_0)?; @@ -1567,7 +2051,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 1469. + // Rule at src/isa/x64/inst.isle line 1608. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0); let expr2_0 = SseOpcode::Xorpd; @@ -1582,7 +2066,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 1411. + // Rule at src/isa/x64/inst.isle line 1550. let expr0_0 = SseOpcode::Movq; let expr1_0: Type = I64; let expr2_0 = constructor_imm(ctx, expr1_0, pattern2_0)?; @@ -1595,7 +2079,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 1447. + // Rule at src/isa/x64/inst.isle line 1586. 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)?; @@ -1614,7 +2098,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 1434. + // Rule at src/isa/x64/inst.isle line 1573. 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); @@ -1631,7 +2115,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 1398. + // Rule at src/isa/x64/inst.isle line 1537. 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 { @@ -1650,7 +2134,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 1420. + // Rule at src/isa/x64/inst.isle line 1559. let expr0_0 = C::i64_as_u64(ctx, pattern1_0); let expr1_0 = constructor_imm(ctx, pattern0_0, expr0_0)?; return Some(expr1_0); @@ -1668,7 +2152,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 1482. + // Rule at src/isa/x64/inst.isle line 1621. 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 { @@ -1693,7 +2177,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 1492. + // Rule at src/isa/x64/inst.isle line 1631. let expr0_0 = ShiftKind::RotateLeft; let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1709,7 +2193,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 1497. + // Rule at src/isa/x64/inst.isle line 1636. let expr0_0 = ShiftKind::RotateRight; let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1725,7 +2209,7 @@ pub fn constructor_x64_shl( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1502. + // Rule at src/isa/x64/inst.isle line 1641. let expr0_0 = ShiftKind::ShiftLeft; let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1741,7 +2225,7 @@ pub fn constructor_x64_shr( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1507. + // Rule at src/isa/x64/inst.isle line 1646. let expr0_0 = ShiftKind::ShiftRightLogical; let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1757,7 +2241,7 @@ pub fn constructor_x64_sar( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1512. + // Rule at src/isa/x64/inst.isle line 1651. let expr0_0 = ShiftKind::ShiftRightArithmetic; let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -1775,7 +2259,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 1517. + // Rule at src/isa/x64/inst.isle line 1656. let expr0_0 = MInst::CmpRmiR { size: pattern0_0.clone(), opcode: pattern1_0.clone(), @@ -1796,7 +2280,7 @@ pub fn constructor_x64_cmp( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1526. + // Rule at src/isa/x64/inst.isle line 1665. 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); @@ -1812,7 +2296,7 @@ pub fn constructor_x64_cmp_imm( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1531. + // Rule at src/isa/x64/inst.isle line 1670. let expr0_0 = CmpOpcode::Cmp; let expr1_0 = RegMemImm::Imm { simm32: pattern1_0 }; let expr2_0 = C::gpr_mem_imm_new(ctx, &expr1_0); @@ -1830,7 +2314,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 1536. + // Rule at src/isa/x64/inst.isle line 1675. let expr0_0 = MInst::XmmCmpRmR { op: pattern0_0.clone(), src: pattern1_0.clone(), @@ -1850,7 +2334,7 @@ pub fn constructor_x64_ucomis( 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 1542. + // Rule at src/isa/x64/inst.isle line 1681. 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); @@ -1860,7 +2344,7 @@ pub fn constructor_x64_ucomis( } if pattern1_0 == F64 { let pattern3_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1546. + // Rule at src/isa/x64/inst.isle line 1685. 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); @@ -1881,7 +2365,7 @@ pub fn constructor_x64_test( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1551. + // Rule at src/isa/x64/inst.isle line 1690. 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); @@ -1899,7 +2383,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 1558. + // Rule at src/isa/x64/inst.isle line 1697. 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 { @@ -1929,7 +2413,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 1566. + // Rule at src/isa/x64/inst.isle line 1705. 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 { @@ -1960,7 +2444,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 1577. + // Rule at src/isa/x64/inst.isle line 1716. 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); @@ -2005,7 +2489,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 1601. + // Rule at src/isa/x64/inst.isle line 1740. 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)?; @@ -2017,7 +2501,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 1598. + // Rule at src/isa/x64/inst.isle line 1737. 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)?; @@ -2041,7 +2525,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 1608. + // Rule at src/isa/x64/inst.isle line 1747. 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); @@ -2083,7 +2567,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 1620. + // Rule at src/isa/x64/inst.isle line 1759. 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); @@ -2126,7 +2610,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 1635. + // Rule at src/isa/x64/inst.isle line 1774. 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); @@ -2198,7 +2682,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 1657. + // Rule at src/isa/x64/inst.isle line 1796. 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( @@ -2213,7 +2697,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 1654. + // Rule at src/isa/x64/inst.isle line 1793. let expr0_0 = constructor_put_in_gpr_mem(ctx, pattern5_0)?; let expr1_0 = constructor_put_in_gpr(ctx, pattern6_0)?; let expr2_0 = @@ -2227,7 +2711,7 @@ pub fn constructor_cmove_or_from_values( // Generated as internal constructor for term x64_setcc. pub fn constructor_x64_setcc(ctx: &mut C, arg0: &CC) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 1662. + // Rule at src/isa/x64/inst.isle line 1801. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = MInst::Setcc { cc: pattern0_0.clone(), @@ -2241,50 +2725,6 @@ pub fn constructor_x64_setcc(ctx: &mut C, arg0: &CC) -> Option( - ctx: &mut C, - arg0: Type, - arg1: &ExtMode, - arg2: &GprMem, -) -> Option { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1670. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = MInst::MovzxRmR { - ext_mode: pattern1_0.clone(), - src: pattern2_0.clone(), - dst: expr0_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return Some(expr3_0); -} - -// Generated as internal constructor for term x64_movsx. -pub fn constructor_x64_movsx( - ctx: &mut C, - arg0: Type, - arg1: &ExtMode, - arg2: &GprMem, -) -> Option { - let pattern0_0 = arg0; - let pattern1_0 = arg1; - let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1677. - let expr0_0 = C::temp_writable_gpr(ctx); - let expr1_0 = MInst::MovsxRmR { - ext_mode: pattern1_0.clone(), - src: pattern2_0.clone(), - dst: expr0_0, - }; - let expr2_0 = C::emit(ctx, &expr1_0); - let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0); - return Some(expr3_0); -} - // Generated as internal constructor for term xmm_rm_r. pub fn constructor_xmm_rm_r( ctx: &mut C, @@ -2297,7 +2737,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 1684. + // Rule at src/isa/x64/inst.isle line 1809. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = MInst::XmmRmR { op: pattern1_0.clone(), @@ -2314,7 +2754,7 @@ pub fn constructor_xmm_rm_r( pub fn constructor_x64_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 1691. + // Rule at src/isa/x64/inst.isle line 1816. 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)?; @@ -2325,7 +2765,7 @@ pub fn constructor_x64_paddb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1696. + // Rule at src/isa/x64/inst.isle line 1821. 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)?; @@ -2336,7 +2776,7 @@ pub fn constructor_x64_paddw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1701. + // Rule at src/isa/x64/inst.isle line 1826. 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)?; @@ -2347,7 +2787,7 @@ pub fn constructor_x64_paddd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1706. + // Rule at src/isa/x64/inst.isle line 1831. 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)?; @@ -2358,7 +2798,7 @@ pub fn constructor_x64_paddq(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1711. + // Rule at src/isa/x64/inst.isle line 1836. 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)?; @@ -2369,7 +2809,7 @@ pub fn constructor_x64_paddsb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1716. + // Rule at src/isa/x64/inst.isle line 1841. 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)?; @@ -2380,7 +2820,7 @@ pub fn constructor_x64_paddsw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1721. + // Rule at src/isa/x64/inst.isle line 1846. 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)?; @@ -2391,7 +2831,7 @@ pub fn constructor_x64_paddusb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem pub fn constructor_x64_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 1726. + // Rule at src/isa/x64/inst.isle line 1851. 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)?; @@ -2402,7 +2842,7 @@ pub fn constructor_x64_paddusw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem pub fn constructor_x64_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 1731. + // Rule at src/isa/x64/inst.isle line 1856. 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)?; @@ -2413,7 +2853,7 @@ pub fn constructor_x64_psubb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1736. + // Rule at src/isa/x64/inst.isle line 1861. 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)?; @@ -2424,7 +2864,7 @@ pub fn constructor_x64_psubw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1741. + // Rule at src/isa/x64/inst.isle line 1866. 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)?; @@ -2435,7 +2875,7 @@ pub fn constructor_x64_psubd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1746. + // Rule at src/isa/x64/inst.isle line 1871. 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)?; @@ -2446,7 +2886,7 @@ pub fn constructor_x64_psubq(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1751. + // Rule at src/isa/x64/inst.isle line 1876. 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)?; @@ -2457,7 +2897,7 @@ pub fn constructor_x64_psubsb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1756. + // Rule at src/isa/x64/inst.isle line 1881. 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)?; @@ -2468,7 +2908,7 @@ pub fn constructor_x64_psubsw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1761. + // Rule at src/isa/x64/inst.isle line 1886. 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)?; @@ -2479,7 +2919,7 @@ pub fn constructor_x64_psubusb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem pub fn constructor_x64_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 1766. + // Rule at src/isa/x64/inst.isle line 1891. 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)?; @@ -2490,7 +2930,7 @@ pub fn constructor_x64_psubusw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem pub fn constructor_x64_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 1771. + // Rule at src/isa/x64/inst.isle line 1896. 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)?; @@ -2501,7 +2941,7 @@ pub fn constructor_x64_pavgb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1776. + // Rule at src/isa/x64/inst.isle line 1901. 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)?; @@ -2512,7 +2952,7 @@ pub fn constructor_x64_pavgw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1781. + // Rule at src/isa/x64/inst.isle line 1906. 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)?; @@ -2523,7 +2963,7 @@ pub fn constructor_x64_pand(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) - pub fn constructor_x64_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 1786. + // Rule at src/isa/x64/inst.isle line 1911. 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)?; @@ -2534,7 +2974,7 @@ pub fn constructor_x64_andps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1791. + // Rule at src/isa/x64/inst.isle line 1916. 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)?; @@ -2545,7 +2985,7 @@ pub fn constructor_x64_andpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1796. + // Rule at src/isa/x64/inst.isle line 1921. 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)?; @@ -2556,7 +2996,7 @@ pub fn constructor_x64_por(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> pub fn constructor_x64_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 1801. + // Rule at src/isa/x64/inst.isle line 1926. 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)?; @@ -2567,7 +3007,7 @@ pub fn constructor_x64_orps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) - pub fn constructor_x64_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 1806. + // Rule at src/isa/x64/inst.isle line 1931. 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)?; @@ -2578,7 +3018,7 @@ pub fn constructor_x64_orpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) - pub fn constructor_x64_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 1811. + // Rule at src/isa/x64/inst.isle line 1936. 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)?; @@ -2589,7 +3029,7 @@ pub fn constructor_x64_pxor(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) - pub fn constructor_x64_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 1816. + // Rule at src/isa/x64/inst.isle line 1941. 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)?; @@ -2600,7 +3040,7 @@ pub fn constructor_x64_xorps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1821. + // Rule at src/isa/x64/inst.isle line 1946. 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)?; @@ -2611,7 +3051,7 @@ pub fn constructor_x64_xorpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1826. + // Rule at src/isa/x64/inst.isle line 1951. 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)?; @@ -2622,7 +3062,7 @@ pub fn constructor_x64_pmullw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1831. + // Rule at src/isa/x64/inst.isle line 1956. 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)?; @@ -2633,7 +3073,7 @@ pub fn constructor_x64_pmulld(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1836. + // Rule at src/isa/x64/inst.isle line 1961. 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)?; @@ -2644,7 +3084,7 @@ pub fn constructor_x64_pmulhw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1841. + // Rule at src/isa/x64/inst.isle line 1966. 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)?; @@ -2655,7 +3095,7 @@ pub fn constructor_x64_pmulhuw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem pub fn constructor_x64_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 1846. + // Rule at src/isa/x64/inst.isle line 1971. 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)?; @@ -2666,7 +3106,7 @@ pub fn constructor_x64_pmuldq(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1851. + // Rule at src/isa/x64/inst.isle line 1976. 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)?; @@ -2677,7 +3117,7 @@ pub fn constructor_x64_pmuludq(ctx: &mut C, arg0: Xmm, arg1: &XmmMem pub fn constructor_x64_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 1856. + // Rule at src/isa/x64/inst.isle line 1981. 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)?; @@ -2688,7 +3128,7 @@ pub fn constructor_x64_punpckhwd(ctx: &mut C, arg0: Xmm, arg1: &XmmM pub fn constructor_x64_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 1861. + // Rule at src/isa/x64/inst.isle line 1986. 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)?; @@ -2699,7 +3139,7 @@ pub fn constructor_x64_punpcklwd(ctx: &mut C, arg0: Xmm, arg1: &XmmM pub fn constructor_x64_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 1866. + // Rule at src/isa/x64/inst.isle line 1991. 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)?; @@ -2710,7 +3150,7 @@ pub fn constructor_x64_andnps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1871. + // Rule at src/isa/x64/inst.isle line 1996. 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)?; @@ -2721,7 +3161,7 @@ pub fn constructor_x64_andnpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1876. + // Rule at src/isa/x64/inst.isle line 2001. 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)?; @@ -2732,7 +3172,7 @@ pub fn constructor_x64_pandn(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1881. + // Rule at src/isa/x64/inst.isle line 2006. 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)?; @@ -2743,7 +3183,7 @@ pub fn constructor_x64_addss(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1886. + // Rule at src/isa/x64/inst.isle line 2011. 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)?; @@ -2754,7 +3194,7 @@ pub fn constructor_x64_addsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1891. + // Rule at src/isa/x64/inst.isle line 2016. 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)?; @@ -2765,7 +3205,7 @@ pub fn constructor_x64_addps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1896. + // Rule at src/isa/x64/inst.isle line 2021. 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)?; @@ -2776,7 +3216,7 @@ pub fn constructor_x64_addpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1901. + // Rule at src/isa/x64/inst.isle line 2026. 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)?; @@ -2787,7 +3227,7 @@ pub fn constructor_x64_subss(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1906. + // Rule at src/isa/x64/inst.isle line 2031. 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)?; @@ -2798,7 +3238,7 @@ pub fn constructor_x64_subsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1911. + // Rule at src/isa/x64/inst.isle line 2036. 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)?; @@ -2809,7 +3249,7 @@ pub fn constructor_x64_subps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1916. + // Rule at src/isa/x64/inst.isle line 2041. 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)?; @@ -2820,7 +3260,7 @@ pub fn constructor_x64_subpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1921. + // Rule at src/isa/x64/inst.isle line 2046. 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)?; @@ -2831,7 +3271,7 @@ pub fn constructor_x64_mulss(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1926. + // Rule at src/isa/x64/inst.isle line 2051. 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)?; @@ -2842,7 +3282,7 @@ pub fn constructor_x64_mulsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1931. + // Rule at src/isa/x64/inst.isle line 2056. 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)?; @@ -2853,7 +3293,7 @@ pub fn constructor_x64_mulps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1936. + // Rule at src/isa/x64/inst.isle line 2061. 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)?; @@ -2864,7 +3304,7 @@ pub fn constructor_x64_mulpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1941. + // Rule at src/isa/x64/inst.isle line 2066. 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)?; @@ -2875,7 +3315,7 @@ pub fn constructor_x64_divss(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1946. + // Rule at src/isa/x64/inst.isle line 2071. 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)?; @@ -2886,7 +3326,7 @@ pub fn constructor_x64_divsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1951. + // Rule at src/isa/x64/inst.isle line 2076. 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)?; @@ -2897,7 +3337,7 @@ pub fn constructor_x64_divps(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 1956. + // Rule at src/isa/x64/inst.isle line 2081. 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)?; @@ -2908,17 +3348,17 @@ pub fn constructor_x64_divpd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) 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 1960. + // Rule at src/isa/x64/inst.isle line 2085. let expr0_0 = SseOpcode::Blendvps; return Some(expr0_0); } if pattern0_0 == F64X2 { - // Rule at src/isa/x64/inst.isle line 1961. + // Rule at src/isa/x64/inst.isle line 2086. 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 1962. + // Rule at src/isa/x64/inst.isle line 2087. let expr0_0 = SseOpcode::Pblendvb; return Some(expr0_0); } @@ -2929,17 +3369,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 1965. + // Rule at src/isa/x64/inst.isle line 2090. let expr0_0 = SseOpcode::Movaps; return Some(expr0_0); } if pattern0_0 == F64X2 { - // Rule at src/isa/x64/inst.isle line 1966. + // Rule at src/isa/x64/inst.isle line 2091. 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 1967. + // Rule at src/isa/x64/inst.isle line 2092. let expr0_0 = SseOpcode::Movdqa; return Some(expr0_0); } @@ -2958,7 +3398,7 @@ pub fn constructor_x64_blend( let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 1971. + // Rule at src/isa/x64/inst.isle line 2096. let expr0_0 = C::xmm0(ctx); let expr1_0 = constructor_sse_mov_op(ctx, pattern0_0)?; let expr2_0 = MInst::XmmUnaryRmR { @@ -2982,7 +3422,7 @@ pub fn constructor_x64_blendvpd( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 1985. + // Rule at src/isa/x64/inst.isle line 2110. let expr0_0 = C::xmm0(ctx); let expr1_0 = SseOpcode::Movapd; let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern2_0); @@ -2998,11 +3438,15 @@ pub fn constructor_x64_blendvpd( return Some(expr7_0); } -// Generated as internal constructor for term x64_movsd. -pub fn constructor_x64_movsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option { +// Generated as internal constructor for term x64_movsd_regmove. +pub fn constructor_x64_movsd_regmove( + ctx: &mut C, + arg0: Xmm, + arg1: &XmmMem, +) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 1999. + // Rule at src/isa/x64/inst.isle line 2124. 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)?; @@ -3013,7 +3457,7 @@ pub fn constructor_x64_movsd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 2004. + // Rule at src/isa/x64/inst.isle line 2129. 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)?; @@ -3031,21 +3475,21 @@ pub fn constructor_x64_pmaxs( if pattern0_0 == I8X16 { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2009. + // Rule at src/isa/x64/inst.isle line 2134. let expr0_0 = constructor_x64_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 2010. + // Rule at src/isa/x64/inst.isle line 2135. let expr0_0 = constructor_x64_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 2011. + // Rule at src/isa/x64/inst.isle line 2136. let expr0_0 = constructor_x64_pmaxsd(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } @@ -3056,7 +3500,7 @@ pub fn constructor_x64_pmaxs( pub fn constructor_x64_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 2014. + // Rule at src/isa/x64/inst.isle line 2139. 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)?; @@ -3067,7 +3511,7 @@ pub fn constructor_x64_pmaxsb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 2016. + // Rule at src/isa/x64/inst.isle line 2141. 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)?; @@ -3078,7 +3522,7 @@ pub fn constructor_x64_pmaxsw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 2018. + // Rule at src/isa/x64/inst.isle line 2143. 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)?; @@ -3096,21 +3540,21 @@ pub fn constructor_x64_pmins( if pattern0_0 == I8X16 { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2022. + // Rule at src/isa/x64/inst.isle line 2147. let expr0_0 = constructor_x64_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 2023. + // Rule at src/isa/x64/inst.isle line 2148. let expr0_0 = constructor_x64_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 2024. + // Rule at src/isa/x64/inst.isle line 2149. let expr0_0 = constructor_x64_pminsd(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } @@ -3121,7 +3565,7 @@ pub fn constructor_x64_pmins( pub fn constructor_x64_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 2027. + // Rule at src/isa/x64/inst.isle line 2152. 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)?; @@ -3132,7 +3576,7 @@ pub fn constructor_x64_pminsb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 2029. + // Rule at src/isa/x64/inst.isle line 2154. 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)?; @@ -3143,7 +3587,7 @@ pub fn constructor_x64_pminsw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 2031. + // Rule at src/isa/x64/inst.isle line 2156. 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)?; @@ -3161,21 +3605,21 @@ pub fn constructor_x64_pmaxu( if pattern0_0 == I8X16 { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2035. + // Rule at src/isa/x64/inst.isle line 2160. let expr0_0 = constructor_x64_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 2036. + // Rule at src/isa/x64/inst.isle line 2161. let expr0_0 = constructor_x64_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 2037. + // Rule at src/isa/x64/inst.isle line 2162. let expr0_0 = constructor_x64_pmaxud(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } @@ -3186,7 +3630,7 @@ pub fn constructor_x64_pmaxu( pub fn constructor_x64_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 2040. + // Rule at src/isa/x64/inst.isle line 2165. 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)?; @@ -3197,7 +3641,7 @@ pub fn constructor_x64_pmaxub(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 2042. + // Rule at src/isa/x64/inst.isle line 2167. 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)?; @@ -3208,7 +3652,7 @@ pub fn constructor_x64_pmaxuw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 2044. + // Rule at src/isa/x64/inst.isle line 2169. 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)?; @@ -3226,21 +3670,21 @@ pub fn constructor_x64_pminu( if pattern0_0 == I8X16 { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2048. + // Rule at src/isa/x64/inst.isle line 2173. let expr0_0 = constructor_x64_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 2049. + // Rule at src/isa/x64/inst.isle line 2174. let expr0_0 = constructor_x64_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 2050. + // Rule at src/isa/x64/inst.isle line 2175. let expr0_0 = constructor_x64_pminud(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } @@ -3251,7 +3695,7 @@ pub fn constructor_x64_pminu( pub fn constructor_x64_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 2053. + // Rule at src/isa/x64/inst.isle line 2178. 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)?; @@ -3262,7 +3706,7 @@ pub fn constructor_x64_pminub(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 2055. + // Rule at src/isa/x64/inst.isle line 2180. 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)?; @@ -3273,7 +3717,7 @@ pub fn constructor_x64_pminuw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 2057. + // Rule at src/isa/x64/inst.isle line 2182. 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)?; @@ -3284,7 +3728,7 @@ pub fn constructor_x64_pminud(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) pub fn constructor_x64_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 2061. + // Rule at src/isa/x64/inst.isle line 2186. 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)?; @@ -3295,7 +3739,7 @@ pub fn constructor_x64_punpcklbw(ctx: &mut C, arg0: Xmm, arg1: &XmmM pub fn constructor_x64_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 2066. + // Rule at src/isa/x64/inst.isle line 2191. 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)?; @@ -3306,7 +3750,7 @@ pub fn constructor_x64_punpckhbw(ctx: &mut C, arg0: Xmm, arg1: &XmmM pub fn constructor_x64_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 2071. + // Rule at src/isa/x64/inst.isle line 2196. 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)?; @@ -3327,7 +3771,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 2076. + // Rule at src/isa/x64/inst.isle line 2201. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = C::writable_xmm_to_reg(ctx, expr0_0); let expr2_0 = MInst::XmmRmRImm { @@ -3355,7 +3799,7 @@ pub fn constructor_x64_palignr( let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 2088. + // Rule at src/isa/x64/inst.isle line 2213. 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); @@ -3377,7 +3821,7 @@ pub fn constructor_x64_cmpp( let pattern2_0 = arg1; let pattern3_0 = arg2; let pattern4_0 = arg3; - // Rule at src/isa/x64/inst.isle line 2097. + // Rule at src/isa/x64/inst.isle line 2222. let expr0_0 = constructor_x64_cmpps(ctx, pattern2_0, pattern3_0, pattern4_0)?; return Some(expr0_0); } @@ -3385,7 +3829,7 @@ pub fn constructor_x64_cmpp( let pattern2_0 = arg1; let pattern3_0 = arg2; let pattern4_0 = arg3; - // Rule at src/isa/x64/inst.isle line 2098. + // Rule at src/isa/x64/inst.isle line 2223. let expr0_0 = constructor_x64_cmppd(ctx, pattern2_0, pattern3_0, pattern4_0)?; return Some(expr0_0); } @@ -3402,7 +3846,7 @@ pub fn constructor_x64_cmpps( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2101. + // Rule at src/isa/x64/inst.isle line 2226. 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); @@ -3422,7 +3866,7 @@ pub fn constructor_x64_cmppd( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2112. + // Rule at src/isa/x64/inst.isle line 2237. 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); @@ -3442,7 +3886,7 @@ pub fn constructor_x64_pinsrb( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2121. + // Rule at src/isa/x64/inst.isle line 2246. 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); @@ -3461,7 +3905,7 @@ pub fn constructor_x64_pinsrw( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2130. + // Rule at src/isa/x64/inst.isle line 2255. 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); @@ -3482,7 +3926,7 @@ pub fn constructor_x64_pinsrd( let pattern1_0 = arg1; let pattern2_0 = arg2; let pattern3_0 = arg3; - // Rule at src/isa/x64/inst.isle line 2139. + // Rule at src/isa/x64/inst.isle line 2264. 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); @@ -3495,7 +3939,7 @@ pub fn constructor_x64_pinsrd( pub fn constructor_x64_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 2148. + // Rule at src/isa/x64/inst.isle line 2273. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = SseOpcode::Pmaddwd; let expr2_0 = MInst::XmmRmR { @@ -3519,7 +3963,7 @@ pub fn constructor_x64_insertps( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2158. + // Rule at src/isa/x64/inst.isle line 2283. 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); @@ -3538,7 +3982,7 @@ pub fn constructor_x64_pshufd( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2167. + // Rule at src/isa/x64/inst.isle line 2292. 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)?; @@ -3561,7 +4005,7 @@ pub fn constructor_x64_pshufd( pub fn constructor_x64_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 2179. + // Rule at src/isa/x64/inst.isle line 2304. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = SseOpcode::Pshufb; let expr2_0 = MInst::XmmRmR { @@ -3583,7 +4027,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 2189. + // Rule at src/isa/x64/inst.isle line 2314. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = MInst::XmmUnaryRmR { op: pattern0_0.clone(), @@ -3595,28 +4039,10 @@ pub fn constructor_xmm_unary_rm_r( return Some(expr3_0); } -// Generated as internal constructor for term x64_pmovsxbw. -pub fn constructor_x64_pmovsxbw(ctx: &mut C, arg0: &XmmMem) -> Option { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2196. - let expr0_0 = SseOpcode::Pmovsxbw; - let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; - return Some(expr1_0); -} - -// Generated as internal constructor for term x64_pmovzxbw. -pub fn constructor_x64_pmovzxbw(ctx: &mut C, arg0: &XmmMem) -> Option { - let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2201. - let expr0_0 = SseOpcode::Pmovzxbw; - let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; - return Some(expr1_0); -} - // Generated as internal constructor for term x64_pabsb. pub fn constructor_x64_pabsb(ctx: &mut C, arg0: &XmmMem) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2206. + // Rule at src/isa/x64/inst.isle line 2321. let expr0_0 = SseOpcode::Pabsb; let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); @@ -3625,7 +4051,7 @@ pub fn constructor_x64_pabsb(ctx: &mut C, arg0: &XmmMem) -> Option(ctx: &mut C, arg0: &XmmMem) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2211. + // Rule at src/isa/x64/inst.isle line 2326. let expr0_0 = SseOpcode::Pabsw; let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); @@ -3634,7 +4060,7 @@ pub fn constructor_x64_pabsw(ctx: &mut C, arg0: &XmmMem) -> Option(ctx: &mut C, arg0: &XmmMem) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2216. + // Rule at src/isa/x64/inst.isle line 2331. let expr0_0 = SseOpcode::Pabsd; let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); @@ -3648,7 +4074,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 2221. + // Rule at src/isa/x64/inst.isle line 2336. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = MInst::XmmUnaryRmREvex { op: pattern0_0.clone(), @@ -3663,7 +4089,7 @@ pub fn constructor_xmm_unary_rm_r_evex( // Generated as internal constructor for term x64_vpabsq. pub fn constructor_x64_vpabsq(ctx: &mut C, arg0: &XmmMem) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2228. + // Rule at src/isa/x64/inst.isle line 2343. let expr0_0 = Avx512Opcode::Vpabsq; let expr1_0 = constructor_xmm_unary_rm_r_evex(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); @@ -3672,7 +4098,7 @@ pub fn constructor_x64_vpabsq(ctx: &mut C, arg0: &XmmMem) -> Option< // Generated as internal constructor for term x64_vpopcntb. pub fn constructor_x64_vpopcntb(ctx: &mut C, arg0: &XmmMem) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2233. + // Rule at src/isa/x64/inst.isle line 2348. let expr0_0 = Avx512Opcode::Vpopcntb; let expr1_0 = constructor_xmm_unary_rm_r_evex(ctx, &expr0_0, pattern0_0)?; return Some(expr1_0); @@ -3688,7 +4114,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 2238. + // Rule at src/isa/x64/inst.isle line 2353. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = MInst::XmmRmREvex { op: pattern0_0.clone(), @@ -3705,7 +4131,7 @@ pub fn constructor_xmm_rm_r_evex( pub fn constructor_x64_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 2250. + // Rule at src/isa/x64/inst.isle line 2365. let expr0_0 = Avx512Opcode::Vpmullq; let expr1_0 = constructor_xmm_rm_r_evex(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3723,7 +4149,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 2259. + // Rule at src/isa/x64/inst.isle line 2374. 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); @@ -3752,7 +4178,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 2274. + // Rule at src/isa/x64/inst.isle line 2389. let expr0_0: bool = false; let expr1_0 = constructor_mul_hi(ctx, pattern0_0, expr0_0, pattern1_0, pattern2_0)?; return Some(expr1_0); @@ -3768,7 +4194,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 2279. + // Rule at src/isa/x64/inst.isle line 2394. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = MInst::XmmRmiReg { opcode: pattern0_0.clone(), @@ -3785,7 +4211,7 @@ pub fn constructor_xmm_rmi_xmm( pub fn constructor_x64_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 2289. + // Rule at src/isa/x64/inst.isle line 2404. let expr0_0 = SseOpcode::Psllw; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3795,7 +4221,7 @@ pub fn constructor_x64_psllw(ctx: &mut C, arg0: Xmm, arg1: &XmmMemIm pub fn constructor_x64_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 2294. + // Rule at src/isa/x64/inst.isle line 2409. let expr0_0 = SseOpcode::Pslld; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3805,7 +4231,7 @@ pub fn constructor_x64_pslld(ctx: &mut C, arg0: Xmm, arg1: &XmmMemIm pub fn constructor_x64_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 2299. + // Rule at src/isa/x64/inst.isle line 2414. let expr0_0 = SseOpcode::Psllq; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3815,7 +4241,7 @@ pub fn constructor_x64_psllq(ctx: &mut C, arg0: Xmm, arg1: &XmmMemIm pub fn constructor_x64_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 2304. + // Rule at src/isa/x64/inst.isle line 2419. let expr0_0 = SseOpcode::Psrlw; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3825,7 +4251,7 @@ pub fn constructor_x64_psrlw(ctx: &mut C, arg0: Xmm, arg1: &XmmMemIm pub fn constructor_x64_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 2309. + // Rule at src/isa/x64/inst.isle line 2424. let expr0_0 = SseOpcode::Psrld; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3835,7 +4261,7 @@ pub fn constructor_x64_psrld(ctx: &mut C, arg0: Xmm, arg1: &XmmMemIm pub fn constructor_x64_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 2314. + // Rule at src/isa/x64/inst.isle line 2429. let expr0_0 = SseOpcode::Psrlq; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3845,7 +4271,7 @@ pub fn constructor_x64_psrlq(ctx: &mut C, arg0: Xmm, arg1: &XmmMemIm pub fn constructor_x64_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 2319. + // Rule at src/isa/x64/inst.isle line 2434. let expr0_0 = SseOpcode::Psraw; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3855,7 +4281,7 @@ pub fn constructor_x64_psraw(ctx: &mut C, arg0: Xmm, arg1: &XmmMemIm pub fn constructor_x64_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 2324. + // Rule at src/isa/x64/inst.isle line 2439. let expr0_0 = SseOpcode::Psrad; let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; return Some(expr1_0); @@ -3871,7 +4297,7 @@ pub fn constructor_x64_pextrd( let pattern0_0 = arg0; let pattern1_0 = arg1; let pattern2_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2329. + // Rule at src/isa/x64/inst.isle line 2444. 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)?; @@ -3904,7 +4330,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 2341. + // Rule at src/isa/x64/inst.isle line 2456. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = MInst::GprToXmm { op: pattern0_0.clone(), @@ -3921,7 +4347,7 @@ pub fn constructor_gpr_to_xmm( pub fn constructor_x64_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 2348. + // Rule at src/isa/x64/inst.isle line 2463. 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 { @@ -3938,7 +4364,7 @@ pub fn constructor_x64_not(ctx: &mut C, arg0: Type, arg1: Gpr) -> Op pub fn constructor_x64_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 2356. + // Rule at src/isa/x64/inst.isle line 2471. 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 { @@ -3954,7 +4380,7 @@ pub fn constructor_x64_neg(ctx: &mut C, arg0: Type, arg1: Gpr) -> Op // Generated as internal constructor for term x64_lea. pub fn constructor_x64_lea(ctx: &mut C, arg0: &SyntheticAmode) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2363. + // Rule at src/isa/x64/inst.isle line 2478. let expr0_0 = C::temp_writable_gpr(ctx); let expr1_0 = MInst::LoadEffectiveAddress { addr: pattern0_0.clone(), @@ -3968,7 +4394,7 @@ pub fn constructor_x64_lea(ctx: &mut C, arg0: &SyntheticAmode) -> Op // Generated as internal constructor for term x64_ud2. pub fn constructor_x64_ud2(ctx: &mut C, arg0: &TrapCode) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2370. + // Rule at src/isa/x64/inst.isle line 2485. let expr0_0 = MInst::Ud2 { trap_code: pattern0_0.clone(), }; @@ -3978,7 +4404,7 @@ pub fn constructor_x64_ud2(ctx: &mut C, arg0: &TrapCode) -> Option(ctx: &mut C) -> Option { - // Rule at src/isa/x64/inst.isle line 2375. + // Rule at src/isa/x64/inst.isle line 2490. let expr0_0 = MInst::Hlt; let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; return Some(expr1_0); @@ -3988,7 +4414,7 @@ pub fn constructor_x64_hlt(ctx: &mut C) -> Option(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2380. + // Rule at src/isa/x64/inst.isle line 2495. 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; @@ -4008,7 +4434,7 @@ pub fn constructor_x64_lzcnt(ctx: &mut C, arg0: Type, arg1: Gpr) -> pub fn constructor_x64_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 2388. + // Rule at src/isa/x64/inst.isle line 2503. 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; @@ -4032,7 +4458,7 @@ pub fn constructor_x64_bsr( ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2396. + // Rule at src/isa/x64/inst.isle line 2511. 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; @@ -4061,7 +4487,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 2405. + // Rule at src/isa/x64/inst.isle line 2520. let expr0_0 = constructor_x64_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); @@ -4082,7 +4508,7 @@ pub fn constructor_x64_bsf( ) -> Option { let pattern0_0 = arg0; let pattern1_0 = arg1; - // Rule at src/isa/x64/inst.isle line 2416. + // Rule at src/isa/x64/inst.isle line 2531. 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; @@ -4111,7 +4537,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 2425. + // Rule at src/isa/x64/inst.isle line 2540. let expr0_0 = constructor_x64_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); @@ -4128,7 +4554,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 2436. + // Rule at src/isa/x64/inst.isle line 2551. 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; @@ -4156,7 +4582,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 2444. + // Rule at src/isa/x64/inst.isle line 2559. 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 { @@ -4175,7 +4601,7 @@ pub fn constructor_xmm_min_max_seq( pub fn constructor_x64_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 2452. + // Rule at src/isa/x64/inst.isle line 2567. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = SseOpcode::Minss; let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); @@ -4194,7 +4620,7 @@ pub fn constructor_x64_minss(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> O pub fn constructor_x64_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 2459. + // Rule at src/isa/x64/inst.isle line 2574. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = SseOpcode::Minsd; let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); @@ -4213,7 +4639,7 @@ pub fn constructor_x64_minsd(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> O pub fn constructor_x64_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 2467. + // Rule at src/isa/x64/inst.isle line 2582. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = SseOpcode::Minps; let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); @@ -4232,7 +4658,7 @@ pub fn constructor_x64_minps(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> O pub fn constructor_x64_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 2474. + // Rule at src/isa/x64/inst.isle line 2589. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = SseOpcode::Minpd; let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); @@ -4251,7 +4677,7 @@ pub fn constructor_x64_minpd(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> O pub fn constructor_x64_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 2481. + // Rule at src/isa/x64/inst.isle line 2596. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = SseOpcode::Maxss; let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); @@ -4270,7 +4696,7 @@ pub fn constructor_x64_maxss(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> O pub fn constructor_x64_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 2488. + // Rule at src/isa/x64/inst.isle line 2603. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = SseOpcode::Maxsd; let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); @@ -4289,7 +4715,7 @@ pub fn constructor_x64_maxsd(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> O pub fn constructor_x64_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 2495. + // Rule at src/isa/x64/inst.isle line 2610. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = SseOpcode::Maxps; let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); @@ -4308,7 +4734,7 @@ pub fn constructor_x64_maxps(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> O pub fn constructor_x64_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 2502. + // Rule at src/isa/x64/inst.isle line 2617. let expr0_0 = C::temp_writable_xmm(ctx); let expr1_0 = SseOpcode::Maxpd; let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); @@ -4334,28 +4760,28 @@ pub fn constructor_x64_pcmpeq( if pattern0_0 == I8X16 { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2509. + // Rule at src/isa/x64/inst.isle line 2624. let expr0_0 = constructor_x64_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 2510. + // Rule at src/isa/x64/inst.isle line 2625. let expr0_0 = constructor_x64_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 2511. + // Rule at src/isa/x64/inst.isle line 2626. let expr0_0 = constructor_x64_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 2512. + // Rule at src/isa/x64/inst.isle line 2627. let expr0_0 = constructor_x64_pcmpeqq(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } @@ -4366,7 +4792,7 @@ pub fn constructor_x64_pcmpeq( pub fn constructor_x64_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 2515. + // Rule at src/isa/x64/inst.isle line 2630. 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)?; @@ -4377,7 +4803,7 @@ pub fn constructor_x64_pcmpeqb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem pub fn constructor_x64_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 2517. + // Rule at src/isa/x64/inst.isle line 2632. 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)?; @@ -4388,7 +4814,7 @@ pub fn constructor_x64_pcmpeqw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem pub fn constructor_x64_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 2519. + // Rule at src/isa/x64/inst.isle line 2634. 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)?; @@ -4399,7 +4825,7 @@ pub fn constructor_x64_pcmpeqd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem pub fn constructor_x64_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 2521. + // Rule at src/isa/x64/inst.isle line 2636. 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)?; @@ -4417,28 +4843,28 @@ pub fn constructor_x64_pcmpgt( if pattern0_0 == I8X16 { let pattern2_0 = arg1; let pattern3_0 = arg2; - // Rule at src/isa/x64/inst.isle line 2525. + // Rule at src/isa/x64/inst.isle line 2640. let expr0_0 = constructor_x64_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 2526. + // Rule at src/isa/x64/inst.isle line 2641. let expr0_0 = constructor_x64_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 2527. + // Rule at src/isa/x64/inst.isle line 2642. let expr0_0 = constructor_x64_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 2528. + // Rule at src/isa/x64/inst.isle line 2643. let expr0_0 = constructor_x64_pcmpgtq(ctx, pattern2_0, pattern3_0)?; return Some(expr0_0); } @@ -4449,7 +4875,7 @@ pub fn constructor_x64_pcmpgt( pub fn constructor_x64_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 2531. + // Rule at src/isa/x64/inst.isle line 2646. 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)?; @@ -4460,7 +4886,7 @@ pub fn constructor_x64_pcmpgtb(ctx: &mut C, arg0: Xmm, arg1: &XmmMem pub fn constructor_x64_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 2533. + // Rule at src/isa/x64/inst.isle line 2648. 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)?; @@ -4471,7 +4897,7 @@ pub fn constructor_x64_pcmpgtw(ctx: &mut C, arg0: Xmm, arg1: &XmmMem pub fn constructor_x64_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 2535. + // Rule at src/isa/x64/inst.isle line 2650. 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)?; @@ -4482,7 +4908,7 @@ pub fn constructor_x64_pcmpgtd(ctx: &mut C, arg0: Xmm, arg1: &XmmMem pub fn constructor_x64_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 2537. + // Rule at src/isa/x64/inst.isle line 2652. 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)?; @@ -4492,7 +4918,7 @@ pub fn constructor_x64_pcmpgtq(ctx: &mut C, arg0: Xmm, arg1: &XmmMem // 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 2591. + // Rule at src/isa/x64/inst.isle line 2708. let expr0_0 = C::xmm_new(ctx, pattern0_0); let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); return Some(expr1_0); @@ -4501,7 +4927,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 2594. + // Rule at src/isa/x64/inst.isle line 2711. 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 }; @@ -4515,7 +4941,7 @@ pub fn constructor_writable_gpr_to_r_reg( arg0: WritableGpr, ) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2598. + // Rule at src/isa/x64/inst.isle line 2715. 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); @@ -4527,7 +4953,7 @@ pub fn constructor_writable_gpr_to_gpr_mem( arg0: WritableGpr, ) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2601. + // Rule at src/isa/x64/inst.isle line 2718. 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); @@ -4539,7 +4965,7 @@ pub fn constructor_writable_gpr_to_value_regs( arg0: WritableGpr, ) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2604. + // Rule at src/isa/x64/inst.isle line 2721. 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); @@ -4551,7 +4977,7 @@ pub fn constructor_writable_xmm_to_r_reg( arg0: WritableXmm, ) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2607. + // Rule at src/isa/x64/inst.isle line 2724. 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); @@ -4563,7 +4989,7 @@ pub fn constructor_writable_xmm_to_xmm_mem( arg0: WritableXmm, ) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2610. + // Rule at src/isa/x64/inst.isle line 2727. 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); @@ -4575,7 +5001,7 @@ pub fn constructor_writable_xmm_to_value_regs( arg0: WritableXmm, ) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2613. + // Rule at src/isa/x64/inst.isle line 2730. 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); @@ -4587,19 +5013,37 @@ pub fn constructor_synthetic_amode_to_gpr_mem( arg0: &SyntheticAmode, ) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2617. + // Rule at src/isa/x64/inst.isle line 2737. let expr0_0 = C::synthetic_amode_to_reg_mem(ctx, pattern0_0); let expr1_0 = C::reg_mem_to_gpr_mem(ctx, &expr0_0); return Some(expr1_0); } +// Generated as internal constructor for term amode_to_gpr_mem. +pub fn constructor_amode_to_gpr_mem(ctx: &mut C, arg0: &Amode) -> Option { + let pattern0_0 = arg0; + // Rule at src/isa/x64/inst.isle line 2735. + let expr0_0 = C::amode_to_synthetic_amode(ctx, pattern0_0); + let expr1_0 = constructor_synthetic_amode_to_gpr_mem(ctx, &expr0_0)?; + return Some(expr1_0); +} + +// Generated as internal constructor for term amode_to_xmm_mem. +pub fn constructor_amode_to_xmm_mem(ctx: &mut C, arg0: &Amode) -> Option { + let pattern0_0 = arg0; + // Rule at src/isa/x64/inst.isle line 2740. + let expr0_0 = C::amode_to_synthetic_amode(ctx, pattern0_0); + let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, &expr0_0)?; + return Some(expr1_0); +} + // Generated as internal constructor for term synthetic_amode_to_xmm_mem. pub fn constructor_synthetic_amode_to_xmm_mem( ctx: &mut C, arg0: &SyntheticAmode, ) -> Option { let pattern0_0 = arg0; - // Rule at src/isa/x64/inst.isle line 2620. + // Rule at src/isa/x64/inst.isle line 2743. 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); @@ -4619,7 +5063,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 2262. + // Rule at src/isa/x64/lower.isle line 2261. let expr0_0 = constructor_x64_hlt(ctx)?; let expr1_0 = constructor_side_effect(ctx, &expr0_0)?; return Some(expr1_0); @@ -4782,13 +5226,13 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { match pattern2_0 { &Opcode::Trap => { - // Rule at src/isa/x64/lower.isle line 1435. + // Rule at src/isa/x64/lower.isle line 1434. let expr0_0 = constructor_x64_ud2(ctx, pattern2_1)?; let expr1_0 = constructor_safepoint(ctx, &expr0_0)?; return Some(expr1_0); } &Opcode::ResumableTrap => { - // Rule at src/isa/x64/lower.isle line 1440. + // Rule at src/isa/x64/lower.isle line 1439. let expr0_0 = constructor_x64_ud2(ctx, pattern2_1)?; let expr1_0 = constructor_safepoint(ctx, &expr0_0)?; return Some(expr1_0); @@ -4825,7 +5269,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1572. + // Rule at src/isa/x64/lower.isle line 1571. let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?; let expr1_0 = CC::NP; let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; @@ -4845,7 +5289,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1600. + // Rule at src/isa/x64/lower.isle line 1599. let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?; let expr1_0 = CC::NBE; let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; @@ -4854,7 +5298,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1602. + // Rule at src/isa/x64/lower.isle line 1601. let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?; let expr1_0 = CC::NB; let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; @@ -4863,7 +5307,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1612. + // Rule at src/isa/x64/lower.isle line 1611. let expr0_0 = constructor_x64_ucomis(ctx, pattern4_0, pattern4_1)?; let expr1_0 = CC::NBE; let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; @@ -4872,7 +5316,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1615. + // Rule at src/isa/x64/lower.isle line 1614. let expr0_0 = constructor_x64_ucomis(ctx, pattern4_0, pattern4_1)?; let expr1_0 = CC::NB; let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; @@ -4881,7 +5325,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1581. + // Rule at src/isa/x64/lower.isle line 1580. let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?; let expr1_0 = CC::P; let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; @@ -4901,7 +5345,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1592. + // Rule at src/isa/x64/lower.isle line 1591. let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?; let expr1_0 = CC::NP; let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; @@ -4910,7 +5354,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1596. + // Rule at src/isa/x64/lower.isle line 1595. let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?; let expr1_0 = CC::NZ; let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; @@ -4919,7 +5363,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1594. + // Rule at src/isa/x64/lower.isle line 1593. let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?; let expr1_0 = CC::P; let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; @@ -4928,7 +5372,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1598. + // Rule at src/isa/x64/lower.isle line 1597. let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?; let expr1_0 = CC::Z; let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; @@ -4937,7 +5381,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1618. + // Rule at src/isa/x64/lower.isle line 1617. let expr0_0 = constructor_x64_ucomis(ctx, pattern4_0, pattern4_1)?; let expr1_0 = CC::B; let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; @@ -4946,7 +5390,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1621. + // Rule at src/isa/x64/lower.isle line 1620. let expr0_0 = constructor_x64_ucomis(ctx, pattern4_0, pattern4_1)?; let expr1_0 = CC::BE; let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; @@ -4955,7 +5399,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1604. + // Rule at src/isa/x64/lower.isle line 1603. let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?; let expr1_0 = CC::B; let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; @@ -4964,7 +5408,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1606. + // Rule at src/isa/x64/lower.isle line 1605. let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?; let expr1_0 = CC::BE; let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; @@ -4978,7 +5422,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1629. + // Rule at src/isa/x64/lower.isle line 1628. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; let expr2_0 = FcmpImm::Equal; @@ -4988,7 +5432,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1649. + // Rule at src/isa/x64/lower.isle line 1648. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?; let expr2_0 = FcmpImm::LessThan; @@ -4998,7 +5442,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1651. + // Rule at src/isa/x64/lower.isle line 1650. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?; let expr2_0 = FcmpImm::LessThanOrEqual; @@ -5008,7 +5452,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1633. + // Rule at src/isa/x64/lower.isle line 1632. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; let expr2_0 = FcmpImm::LessThan; @@ -5018,7 +5462,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1635. + // Rule at src/isa/x64/lower.isle line 1634. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; let expr2_0 = FcmpImm::LessThanOrEqual; @@ -5028,7 +5472,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1631. + // Rule at src/isa/x64/lower.isle line 1630. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; let expr2_0 = FcmpImm::NotEqual; @@ -5038,7 +5482,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1637. + // Rule at src/isa/x64/lower.isle line 1636. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; let expr2_0 = FcmpImm::Ordered; @@ -5048,7 +5492,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1639. + // Rule at src/isa/x64/lower.isle line 1638. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; let expr2_0 = FcmpImm::Unordered; @@ -5058,7 +5502,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1641. + // Rule at src/isa/x64/lower.isle line 1640. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; let expr2_0 = FcmpImm::UnorderedOrGreaterThan; @@ -5068,7 +5512,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1643. + // Rule at src/isa/x64/lower.isle line 1642. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; let expr2_0 = FcmpImm::UnorderedOrGreaterThanOrEqual; @@ -5078,7 +5522,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1653. + // Rule at src/isa/x64/lower.isle line 1652. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?; let expr2_0 = FcmpImm::UnorderedOrGreaterThan; @@ -5088,7 +5532,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1655. + // Rule at src/isa/x64/lower.isle line 1654. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?; let expr2_0 = FcmpImm::UnorderedOrGreaterThanOrEqual; @@ -5113,7 +5557,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1523. + // Rule at src/isa/x64/lower.isle line 1522. 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)?; @@ -5157,7 +5601,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1542. + // Rule at src/isa/x64/lower.isle line 1541. 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)?; @@ -5206,7 +5650,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 1507. 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)?; @@ -5219,7 +5663,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1512. + // Rule at src/isa/x64/lower.isle line 1511. 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)?; @@ -5235,7 +5679,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 1457. + // Rule at src/isa/x64/lower.isle line 1456. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; let expr2_0 = @@ -5258,7 +5702,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1461. + // Rule at src/isa/x64/lower.isle line 1460. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; let expr2_0 = @@ -5270,7 +5714,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1468. + // Rule at src/isa/x64/lower.isle line 1467. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; let expr2_0 = @@ -5279,7 +5723,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1493. + // Rule at src/isa/x64/lower.isle line 1492. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; let expr2_0 = @@ -5292,7 +5736,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 1469. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?; let expr2_0 = @@ -5301,7 +5745,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1496. + // Rule at src/isa/x64/lower.isle line 1495. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; let expr2_0 = @@ -5314,7 +5758,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1472. + // Rule at src/isa/x64/lower.isle line 1471. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern4_1)?; let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); @@ -5330,7 +5774,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 1498. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; let expr2_0 = @@ -5343,7 +5787,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 1481. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern4_1)?; let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); @@ -5359,7 +5803,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 1501. let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; let expr2_0 = @@ -5384,7 +5828,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 2105. + // Rule at src/isa/x64/lower.isle line 2104. let expr0_0 = OperandSize::Size64; let expr1_0: u32 = 0; let expr2_0 = constructor_put_in_gpr(ctx, pattern2_1)?; @@ -5399,7 +5843,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 2113. + // Rule at src/isa/x64/lower.isle line 2112. let expr0_0 = OperandSize::Size64; let expr1_0: u32 = 4294967295; let expr2_0 = constructor_put_in_gpr(ctx, pattern2_1)?; @@ -5530,7 +5974,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 2036. + // Rule at src/isa/x64/lower.isle line 2035. 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)?; @@ -5604,7 +6048,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 2152. + // Rule at src/isa/x64/lower.isle line 2151. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -5612,7 +6056,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 2158. + // Rule at src/isa/x64/lower.isle line 2157. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -5620,7 +6064,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 2161. + // Rule at src/isa/x64/lower.isle line 2160. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -5628,7 +6072,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 2155. + // Rule at src/isa/x64/lower.isle line 2154. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -5636,7 +6080,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 2164. + // Rule at src/isa/x64/lower.isle line 2163. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -5644,7 +6088,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 2167. + // Rule at src/isa/x64/lower.isle line 2166. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -5652,7 +6096,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 2170. + // Rule at src/isa/x64/lower.isle line 2169. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -5660,7 +6104,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 2173. + // Rule at src/isa/x64/lower.isle line 2172. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -5668,7 +6112,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 2176. + // Rule at src/isa/x64/lower.isle line 2175. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -5683,7 +6127,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 2179. + // Rule at src/isa/x64/lower.isle line 2178. let expr0_0 = constructor_output_value(ctx, pattern5_1)?; return Some(expr0_0); @@ -5696,7 +6140,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 2039. + // Rule at src/isa/x64/lower.isle line 2038. let expr0_0: Type = I64; let expr1_0 = C::put_in_regs(ctx, pattern5_1); let expr2_0: usize = 1; @@ -5973,7 +6417,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1809. + // Rule at src/isa/x64/lower.isle line 1808. let expr0_0: Type = I64; let expr1_0: Type = I64; let expr2_0 = C::put_in_regs(ctx, pattern5_1); @@ -6011,7 +6455,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1851. + // Rule at src/isa/x64/lower.isle line 1850. let expr0_0: Type = I64; let expr1_0: Type = I64; let expr2_0 = C::put_in_regs(ctx, pattern5_1); @@ -6049,7 +6493,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1903. + // Rule at src/isa/x64/lower.isle line 1902. let expr0_0: Type = I64; let expr1_0 = C::put_in_regs(ctx, pattern5_1); let expr2_0: usize = 0; @@ -6072,7 +6516,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 2254. + // Rule at src/isa/x64/lower.isle line 2253. let expr0_0: Type = I64; let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr2_0: u32 = 1; @@ -6090,7 +6534,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 2126. + // Rule at src/isa/x64/lower.isle line 2125. let expr0_0 = C::put_in_reg(ctx, pattern5_1); let expr1_0: Type = I64; let expr2_0: u64 = 0; @@ -6100,7 +6544,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option {} - } - } - if pattern2_0 == F32 { - let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Fadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2277. - 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_x64_addss(ctx, expr0_0, &expr1_0)?; - let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; - return Some(expr3_0); - } - &Opcode::Fsub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2288. - 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_x64_subss(ctx, expr0_0, &expr1_0)?; - let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; - return Some(expr3_0); - } - &Opcode::Fmul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2299. - 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_x64_mulss(ctx, expr0_0, &expr1_0)?; - let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; - return Some(expr3_0); - } - &Opcode::Fdiv => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2310. - 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_x64_divss(ctx, expr0_0, &expr1_0)?; - let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; - return Some(expr3_0); - } - &Opcode::Fmin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2321. - let expr0_0: Type = F32; - let expr1_0: bool = true; - let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; - let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?; - let expr4_0 = - constructor_xmm_min_max_seq(ctx, expr0_0, expr1_0, expr2_0, expr3_0)?; - let expr5_0 = constructor_output_xmm(ctx, expr4_0)?; - return Some(expr5_0); - } - &Opcode::FminPseudo => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2490. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; - let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; - let expr2_0 = constructor_x64_minss(ctx, expr0_0, expr1_0)?; - let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; - return Some(expr3_0); - } - &Opcode::Fmax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2393. - let expr0_0: Type = F32; - let expr1_0: bool = false; - let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; - let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?; - let expr4_0 = - constructor_xmm_min_max_seq(ctx, expr0_0, expr1_0, expr2_0, expr3_0)?; - let expr5_0 = constructor_output_xmm(ctx, expr4_0)?; - return Some(expr5_0); - } - &Opcode::FmaxPseudo => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2501. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; - let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; - let expr2_0 = constructor_x64_maxss(ctx, expr0_0, expr1_0)?; + _ => {} + } + } + if pattern2_0 == F32 { + let pattern4_0 = C::inst_data(ctx, pattern0_0); + match &pattern4_0 { + &InstructionData::Binary { + opcode: ref pattern5_0, + args: ref pattern5_1, + } => { + match pattern5_0 { + &Opcode::Fadd => { + let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); + // Rule at src/isa/x64/lower.isle line 2276. + 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_x64_addss(ctx, expr0_0, &expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + &Opcode::Fsub => { + let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); + // Rule at src/isa/x64/lower.isle line 2287. + 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_x64_subss(ctx, expr0_0, &expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + &Opcode::Fmul => { + let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); + // Rule at src/isa/x64/lower.isle line 2298. + 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_x64_mulss(ctx, expr0_0, &expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + &Opcode::Fdiv => { + let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); + // Rule at src/isa/x64/lower.isle line 2309. + 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_x64_divss(ctx, expr0_0, &expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + &Opcode::Fmin => { + let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); + // Rule at src/isa/x64/lower.isle line 2320. + let expr0_0: Type = F32; + let expr1_0: bool = true; + let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; + let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?; + let expr4_0 = constructor_xmm_min_max_seq( + ctx, expr0_0, expr1_0, expr2_0, expr3_0, + )?; + let expr5_0 = constructor_output_xmm(ctx, expr4_0)?; + return Some(expr5_0); + } + &Opcode::FminPseudo => { + let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); + // Rule at src/isa/x64/lower.isle line 2489. + let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; + let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; + let expr2_0 = constructor_x64_minss(ctx, expr0_0, expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + &Opcode::Fmax => { + let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); + // Rule at src/isa/x64/lower.isle line 2392. + let expr0_0: Type = F32; + let expr1_0: bool = false; + let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; + let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?; + let expr4_0 = constructor_xmm_min_max_seq( + ctx, expr0_0, expr1_0, expr2_0, expr3_0, + )?; + let expr5_0 = constructor_output_xmm(ctx, expr4_0)?; + return Some(expr5_0); + } + &Opcode::FmaxPseudo => { + let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); + // Rule at src/isa/x64/lower.isle line 2500. + let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; + let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; + let expr2_0 = constructor_x64_maxss(ctx, expr0_0, expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + _ => {} + } + } + &InstructionData::Load { + opcode: ref pattern5_0, + arg: pattern5_1, + flags: pattern5_2, + offset: pattern5_3, + } => { + if let &Opcode::Load = pattern5_0 { + // Rule at src/isa/x64/lower.isle line 2543. + let expr0_0 = + constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; + let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?; + let expr2_0 = constructor_x64_movss_load(ctx, &expr1_0)?; let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; return Some(expr3_0); } - _ => {} } + _ => {} } } if pattern2_0 == F64 { let pattern4_0 = C::inst_data(ctx, pattern0_0); - if let &InstructionData::Binary { - opcode: ref pattern5_0, - args: ref pattern5_1, - } = &pattern4_0 - { - match pattern5_0 { - &Opcode::Fadd => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2279. - 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_x64_addsd(ctx, expr0_0, &expr1_0)?; - let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; - return Some(expr3_0); - } - &Opcode::Fsub => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2290. - 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_x64_subsd(ctx, expr0_0, &expr1_0)?; - let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; - return Some(expr3_0); - } - &Opcode::Fmul => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2301. - 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_x64_mulsd(ctx, expr0_0, &expr1_0)?; - let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; - return Some(expr3_0); - } - &Opcode::Fdiv => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2312. - 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_x64_divsd(ctx, expr0_0, &expr1_0)?; - let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; - return Some(expr3_0); - } - &Opcode::Fmin => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2323. - let expr0_0: Type = F64; - let expr1_0: bool = true; - let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; - let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?; - let expr4_0 = - constructor_xmm_min_max_seq(ctx, expr0_0, expr1_0, expr2_0, expr3_0)?; - let expr5_0 = constructor_output_xmm(ctx, expr4_0)?; - return Some(expr5_0); - } - &Opcode::FminPseudo => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2492. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; - let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; - let expr2_0 = constructor_x64_minsd(ctx, expr0_0, expr1_0)?; - let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; - return Some(expr3_0); - } - &Opcode::Fmax => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2395. - let expr0_0: Type = F64; - let expr1_0: bool = false; - let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; - let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?; - let expr4_0 = - constructor_xmm_min_max_seq(ctx, expr0_0, expr1_0, expr2_0, expr3_0)?; - let expr5_0 = constructor_output_xmm(ctx, expr4_0)?; - return Some(expr5_0); + match &pattern4_0 { + &InstructionData::Binary { + opcode: ref pattern5_0, + args: ref pattern5_1, + } => { + match pattern5_0 { + &Opcode::Fadd => { + let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); + // Rule at src/isa/x64/lower.isle line 2278. + 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_x64_addsd(ctx, expr0_0, &expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + &Opcode::Fsub => { + let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); + // 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_mem(ctx, pattern7_1)?; + let expr2_0 = constructor_x64_subsd(ctx, expr0_0, &expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + &Opcode::Fmul => { + let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); + // Rule at src/isa/x64/lower.isle line 2300. + 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_x64_mulsd(ctx, expr0_0, &expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + &Opcode::Fdiv => { + let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); + // Rule at src/isa/x64/lower.isle line 2311. + 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_x64_divsd(ctx, expr0_0, &expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + &Opcode::Fmin => { + let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); + // Rule at src/isa/x64/lower.isle line 2322. + let expr0_0: Type = F64; + let expr1_0: bool = true; + let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; + let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?; + let expr4_0 = constructor_xmm_min_max_seq( + ctx, expr0_0, expr1_0, expr2_0, expr3_0, + )?; + let expr5_0 = constructor_output_xmm(ctx, expr4_0)?; + return Some(expr5_0); + } + &Opcode::FminPseudo => { + let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); + // Rule at src/isa/x64/lower.isle line 2491. + let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; + let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; + let expr2_0 = constructor_x64_minsd(ctx, expr0_0, expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + &Opcode::Fmax => { + let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); + // Rule at src/isa/x64/lower.isle line 2394. + let expr0_0: Type = F64; + let expr1_0: bool = false; + let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; + let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?; + let expr4_0 = constructor_xmm_min_max_seq( + ctx, expr0_0, expr1_0, expr2_0, expr3_0, + )?; + let expr5_0 = constructor_output_xmm(ctx, expr4_0)?; + return Some(expr5_0); + } + &Opcode::FmaxPseudo => { + let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); + // Rule at src/isa/x64/lower.isle line 2502. + let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; + let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; + let expr2_0 = constructor_x64_maxsd(ctx, expr0_0, expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + _ => {} } - &Opcode::FmaxPseudo => { - let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 2503. - let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; - let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; - let expr2_0 = constructor_x64_maxsd(ctx, expr0_0, expr1_0)?; + } + &InstructionData::Load { + opcode: ref pattern5_0, + arg: pattern5_1, + flags: pattern5_2, + offset: pattern5_3, + } => { + if let &Opcode::Load = pattern5_0 { + // Rule at src/isa/x64/lower.isle line 2545. + let expr0_0 = + constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; + let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?; + let expr2_0 = constructor_x64_movsd_load(ctx, &expr1_0)?; let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; return Some(expr3_0); } - _ => {} } + _ => {} } } if pattern2_0 == I8X16 { @@ -6341,7 +6825,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 1402. + // Rule at src/isa/x64/lower.isle line 1401. 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_x64_pminsb(ctx, expr0_0, &expr1_0)?; @@ -6350,7 +6834,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 1424. + // Rule at src/isa/x64/lower.isle line 1423. 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_x64_pminub(ctx, expr0_0, &expr1_0)?; @@ -6359,7 +6843,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 1391. + // Rule at src/isa/x64/lower.isle line 1390. 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_x64_pmaxsb(ctx, expr0_0, &expr1_0)?; @@ -6368,7 +6852,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 1413. + // Rule at src/isa/x64/lower.isle line 1412. 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_x64_pmaxub(ctx, expr0_0, &expr1_0)?; @@ -6459,7 +6943,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 2010. + // Rule at src/isa/x64/lower.isle line 2009. let expr0_0 = C::popcount_4bit_table(ctx); let expr1_0: Type = I8X16; let expr2_0 = C::popcount_low_mask(ctx); @@ -6504,7 +6988,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 1405. + // Rule at src/isa/x64/lower.isle line 1404. 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_x64_pminsw(ctx, expr0_0, &expr1_0)?; @@ -6513,7 +6997,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 1427. + // Rule at src/isa/x64/lower.isle line 1426. 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_x64_pminuw(ctx, expr0_0, &expr1_0)?; @@ -6522,7 +7006,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 1394. + // Rule at src/isa/x64/lower.isle line 1393. 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_x64_pmaxsw(ctx, expr0_0, &expr1_0)?; @@ -6531,7 +7015,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 1416. + // Rule at src/isa/x64/lower.isle line 1415. 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_x64_pmaxuw(ctx, expr0_0, &expr1_0)?; @@ -6597,6 +7081,34 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option {} } } + &InstructionData::Load { + opcode: ref pattern5_0, + arg: pattern5_1, + flags: pattern5_2, + offset: pattern5_3, + } => { + match pattern5_0 { + &Opcode::Uload8x8 => { + // Rule at src/isa/x64/lower.isle line 2558. + let expr0_0 = + constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; + let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?; + let expr2_0 = constructor_x64_pmovzxbw(ctx, &expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + &Opcode::Sload8x8 => { + // Rule at src/isa/x64/lower.isle line 2556. + let expr0_0 = + constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; + let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?; + let expr2_0 = constructor_x64_pmovsxbw(ctx, &expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + _ => {} + } + } _ => {} } } @@ -6610,7 +7122,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 1408. + // Rule at src/isa/x64/lower.isle line 1407. 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_x64_pminsd(ctx, expr0_0, &expr1_0)?; @@ -6619,7 +7131,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 1430. + // Rule at src/isa/x64/lower.isle line 1429. 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_x64_pminud(ctx, expr0_0, &expr1_0)?; @@ -6628,7 +7140,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 1397. + // Rule at src/isa/x64/lower.isle line 1396. 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_x64_pmaxsd(ctx, expr0_0, &expr1_0)?; @@ -6637,7 +7149,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 1419. + // Rule at src/isa/x64/lower.isle line 1418. 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_x64_pmaxud(ctx, expr0_0, &expr1_0)?; @@ -6676,7 +7188,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 2267. + // Rule at src/isa/x64/lower.isle line 2266. 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_x64_pmaddwd(ctx, expr0_0, &expr1_0)?; @@ -6712,6 +7224,34 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option {} } } + &InstructionData::Load { + opcode: ref pattern5_0, + arg: pattern5_1, + flags: pattern5_2, + offset: pattern5_3, + } => { + match pattern5_0 { + &Opcode::Uload16x4 => { + // Rule at src/isa/x64/lower.isle line 2562. + let expr0_0 = + constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; + let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?; + let expr2_0 = constructor_x64_pmovzxwd(ctx, &expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + &Opcode::Sload16x4 => { + // Rule at src/isa/x64/lower.isle line 2560. + let expr0_0 = + constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; + let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?; + let expr2_0 = constructor_x64_pmovsxwd(ctx, &expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + _ => {} + } + } _ => {} } } @@ -6803,6 +7343,34 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option {} } } + &InstructionData::Load { + opcode: ref pattern5_0, + arg: pattern5_1, + flags: pattern5_2, + offset: pattern5_3, + } => { + match pattern5_0 { + &Opcode::Uload32x2 => { + // Rule at src/isa/x64/lower.isle line 2566. + let expr0_0 = + constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; + let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?; + let expr2_0 = constructor_x64_pmovzxdq(ctx, &expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + &Opcode::Sload32x2 => { + // Rule at src/isa/x64/lower.isle line 2564. + let expr0_0 = + constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; + let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?; + let expr2_0 = constructor_x64_pmovsxdq(ctx, &expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + _ => {} + } + } _ => {} } } @@ -6816,7 +7384,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 2281. + // Rule at src/isa/x64/lower.isle line 2280. 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_x64_addps(ctx, expr0_0, &expr1_0)?; @@ -6825,7 +7393,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 2292. + // Rule at src/isa/x64/lower.isle line 2291. 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_x64_subps(ctx, expr0_0, &expr1_0)?; @@ -6834,7 +7402,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 2303. + // Rule at src/isa/x64/lower.isle line 2302. 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_x64_mulps(ctx, expr0_0, &expr1_0)?; @@ -6843,7 +7411,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 2314. + // Rule at src/isa/x64/lower.isle line 2313. 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_x64_divps(ctx, expr0_0, &expr1_0)?; @@ -6852,7 +7420,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 2338. + // Rule at src/isa/x64/lower.isle line 2337. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr2_0 = constructor_x64_minps(ctx, expr0_0, expr1_0)?; @@ -6877,7 +7445,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 2494. + // Rule at src/isa/x64/lower.isle line 2493. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_x64_minps(ctx, expr0_0, expr1_0)?; @@ -6886,7 +7454,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 2401. + // Rule at src/isa/x64/lower.isle line 2400. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr2_0 = constructor_x64_maxps(ctx, expr0_0, expr1_0)?; @@ -6914,7 +7482,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 2505. + // Rule at src/isa/x64/lower.isle line 2504. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_x64_maxps(ctx, expr0_0, expr1_0)?; @@ -6943,6 +7511,22 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { + if let &Opcode::Load = pattern5_0 { + // Rule at src/isa/x64/lower.isle line 2547. + let expr0_0 = + constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; + let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?; + let expr2_0 = constructor_x64_movups(ctx, &expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + } _ => {} } } @@ -6956,7 +7540,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 2283. + // Rule at src/isa/x64/lower.isle line 2282. 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_x64_addpd(ctx, expr0_0, &expr1_0)?; @@ -6965,7 +7549,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 2294. + // Rule at src/isa/x64/lower.isle line 2293. 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_x64_subpd(ctx, expr0_0, &expr1_0)?; @@ -6974,7 +7558,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 2305. + // Rule at src/isa/x64/lower.isle line 2304. 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_x64_mulpd(ctx, expr0_0, &expr1_0)?; @@ -6983,7 +7567,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 2316. + // Rule at src/isa/x64/lower.isle line 2315. 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_x64_divpd(ctx, expr0_0, &expr1_0)?; @@ -6992,7 +7576,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 2381. + // Rule at src/isa/x64/lower.isle line 2380. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr2_0 = constructor_x64_minpd(ctx, expr0_0, expr1_0)?; @@ -7017,7 +7601,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 2496. + // Rule at src/isa/x64/lower.isle line 2495. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_x64_minpd(ctx, expr0_0, expr1_0)?; @@ -7026,7 +7610,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 2444. + // Rule at src/isa/x64/lower.isle line 2443. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr2_0 = constructor_x64_maxpd(ctx, expr0_0, expr1_0)?; @@ -7054,7 +7638,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 2507. + // Rule at src/isa/x64/lower.isle line 2506. let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; let expr2_0 = constructor_x64_maxpd(ctx, expr0_0, expr1_0)?; @@ -7083,6 +7667,22 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { + if let &Opcode::Load = pattern5_0 { + // Rule at src/isa/x64/lower.isle line 2549. + let expr0_0 = + constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; + let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?; + let expr2_0 = constructor_x64_movupd(ctx, &expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + } _ => {} } } @@ -7133,7 +7733,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1743. + // Rule at src/isa/x64/lower.isle line 1742. let expr0_0 = constructor_x64_ucomis( ctx, pattern11_0, @@ -7151,7 +7751,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1695. + // Rule at src/isa/x64/lower.isle line 1694. let expr0_0 = constructor_x64_ucomis( ctx, pattern11_1, @@ -7167,7 +7767,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1698. + // Rule at src/isa/x64/lower.isle line 1697. let expr0_0 = constructor_x64_ucomis( ctx, pattern11_1, @@ -7183,7 +7783,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1718. + // Rule at src/isa/x64/lower.isle line 1717. let expr0_0 = constructor_x64_ucomis( ctx, pattern11_0, @@ -7199,7 +7799,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1721. + // Rule at src/isa/x64/lower.isle line 1720. let expr0_0 = constructor_x64_ucomis( ctx, pattern11_0, @@ -7215,7 +7815,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1746. + // Rule at src/isa/x64/lower.isle line 1745. let expr0_0 = constructor_x64_ucomis( ctx, pattern11_0, @@ -7233,7 +7833,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1689. + // Rule at src/isa/x64/lower.isle line 1688. let expr0_0 = constructor_x64_ucomis( ctx, pattern11_1, @@ -7249,7 +7849,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1692. + // Rule at src/isa/x64/lower.isle line 1691. let expr0_0 = constructor_x64_ucomis( ctx, pattern11_1, @@ -7265,7 +7865,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1724. + // Rule at src/isa/x64/lower.isle line 1723. let expr0_0 = constructor_x64_ucomis( ctx, pattern11_0, @@ -7281,7 +7881,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1727. + // Rule at src/isa/x64/lower.isle line 1726. let expr0_0 = constructor_x64_ucomis( ctx, pattern11_0, @@ -7297,7 +7897,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1701. + // Rule at src/isa/x64/lower.isle line 1700. let expr0_0 = constructor_x64_ucomis( ctx, pattern11_1, @@ -7313,7 +7913,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1704. + // Rule at src/isa/x64/lower.isle line 1703. let expr0_0 = constructor_x64_ucomis( ctx, pattern11_1, @@ -7342,7 +7942,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { let pattern6_0 = C::value_type(ctx, pattern4_1); if pattern6_0 == pattern2_0 { - // Rule at src/isa/x64/lower.isle line 2240. + // Rule at src/isa/x64/lower.isle line 2239. 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 2221. + // Rule at src/isa/x64/lower.isle line 2220. let expr0_0 = constructor_generic_sextend(ctx, pattern4_1, pattern6_0, pattern2_0)?; return Some(expr0_0); @@ -7420,7 +8020,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 2229. + // Rule at src/isa/x64/lower.isle line 2228. let expr0_0 = constructor_output_value(ctx, pattern4_1)?; return Some(expr0_0); } @@ -7428,14 +8028,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 2122. + // Rule at src/isa/x64/lower.isle line 2121. 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 2215. + // Rule at src/isa/x64/lower.isle line 2214. let expr0_0 = constructor_generic_sextend(ctx, pattern4_1, pattern6_0, pattern2_0)?; return Some(expr0_0); @@ -8631,7 +9231,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option(ctx: &mut C, arg0: Inst) -> Option { let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); - // Rule at src/isa/x64/lower.isle line 1383. + // Rule at src/isa/x64/lower.isle line 1382. let expr0_0 = CC::L; let expr1_0 = constructor_cmp_and_choose( ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1, @@ -8695,7 +9318,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 1377. + // Rule at src/isa/x64/lower.isle line 1376. let expr0_0 = CC::B; let expr1_0 = constructor_cmp_and_choose( ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1, @@ -8705,7 +9328,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 1386. + // Rule at src/isa/x64/lower.isle line 1385. let expr0_0 = CC::NL; let expr1_0 = constructor_cmp_and_choose( ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1, @@ -8715,7 +9338,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 1380. + // Rule at src/isa/x64/lower.isle line 1379. let expr0_0 = CC::NB; let expr1_0 = constructor_cmp_and_choose( ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1, @@ -9079,7 +9702,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 2243. + // Rule at src/isa/x64/lower.isle line 2242. 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)?; @@ -9087,7 +9710,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 2251. + // Rule at src/isa/x64/lower.isle line 2250. let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; let expr1_0: u32 = 1; let expr2_0 = RegMemImm::Imm { simm32: expr1_0 }; @@ -9097,7 +9720,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 2235. + // Rule at src/isa/x64/lower.isle line 2234. 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)?; @@ -9211,21 +9834,21 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { match pattern5_0 { &Opcode::Clz => { - // Rule at src/isa/x64/lower.isle line 1799. + // Rule at src/isa/x64/lower.isle line 1798. 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 1841. + // Rule at src/isa/x64/lower.isle line 1840. 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 1893. + // Rule at src/isa/x64/lower.isle line 1892. 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)?; @@ -9328,7 +9951,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { match pattern5_0 { &Opcode::Clz => { - // Rule at src/isa/x64/lower.isle line 1804. + // Rule at src/isa/x64/lower.isle line 1803. let expr0_0: Type = I32; let expr1_0: Type = I32; let expr2_0 = ExtendKind::Zero; @@ -9339,7 +9962,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1846. + // Rule at src/isa/x64/lower.isle line 1845. let expr0_0: Type = I32; let expr1_0: Type = I32; let expr2_0 = ExtendKind::Zero; @@ -9350,7 +9973,7 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option { - // Rule at src/isa/x64/lower.isle line 1898. + // Rule at src/isa/x64/lower.isle line 1897. let expr0_0: Type = I32; let expr1_0: Type = I32; let expr2_0 = ExtendKind::Zero; @@ -9366,6 +9989,117 @@ pub fn constructor_lower(ctx: &mut C, arg0: Inst) -> Option {} } } + if let Some(pattern3_0) = C::ty_int_bool_ref_64(ctx, pattern2_0) { + let pattern4_0 = C::inst_data(ctx, pattern0_0); + if let &InstructionData::Load { + opcode: ref pattern5_0, + arg: pattern5_1, + flags: pattern5_2, + offset: pattern5_3, + } = &pattern4_0 + { + if let &Opcode::Load = pattern5_0 { + // Rule at src/isa/x64/lower.isle line 2521. + let expr0_0 = constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; + let expr1_0 = constructor_x64_mov(ctx, &expr0_0)?; + let expr2_0 = constructor_output_reg(ctx, expr1_0)?; + return Some(expr2_0); + } + } + } + if let Some(pattern3_0) = C::ty_vec128(ctx, pattern2_0) { + let pattern4_0 = C::inst_data(ctx, pattern0_0); + if let &InstructionData::Load { + opcode: ref pattern5_0, + arg: pattern5_1, + flags: pattern5_2, + offset: pattern5_3, + } = &pattern4_0 + { + if let &Opcode::Load = pattern5_0 { + // Rule at src/isa/x64/lower.isle line 2551. + let expr0_0 = constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; + let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?; + let expr2_0 = constructor_x64_movdqu(ctx, &expr1_0)?; + let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; + return Some(expr3_0); + } + } + } + if let Some(pattern3_0) = C::is_gpr_type(ctx, pattern2_0) { + let pattern4_0 = C::inst_data(ctx, pattern0_0); + if let &InstructionData::Load { + opcode: ref pattern5_0, + arg: pattern5_1, + flags: pattern5_2, + offset: pattern5_3, + } = &pattern4_0 + { + match pattern5_0 { + &Opcode::Uload8 => { + // Rule at src/isa/x64/lower.isle line 2526. + let expr0_0 = ExtMode::BQ; + let expr1_0 = + constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; + let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0)?; + let expr3_0 = constructor_x64_movzx(ctx, &expr0_0, &expr2_0)?; + let expr4_0 = constructor_output_gpr(ctx, expr3_0)?; + return Some(expr4_0); + } + &Opcode::Sload8 => { + // Rule at src/isa/x64/lower.isle line 2528. + let expr0_0 = ExtMode::BQ; + let expr1_0 = + constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; + let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0)?; + let expr3_0 = constructor_x64_movsx(ctx, &expr0_0, &expr2_0)?; + let expr4_0 = constructor_output_gpr(ctx, expr3_0)?; + return Some(expr4_0); + } + &Opcode::Uload16 => { + // Rule at src/isa/x64/lower.isle line 2530. + let expr0_0 = ExtMode::WQ; + let expr1_0 = + constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; + let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0)?; + let expr3_0 = constructor_x64_movzx(ctx, &expr0_0, &expr2_0)?; + let expr4_0 = constructor_output_gpr(ctx, expr3_0)?; + return Some(expr4_0); + } + &Opcode::Sload16 => { + // Rule at src/isa/x64/lower.isle line 2532. + let expr0_0 = ExtMode::WQ; + let expr1_0 = + constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; + let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0)?; + let expr3_0 = constructor_x64_movsx(ctx, &expr0_0, &expr2_0)?; + let expr4_0 = constructor_output_gpr(ctx, expr3_0)?; + return Some(expr4_0); + } + &Opcode::Uload32 => { + // Rule at src/isa/x64/lower.isle line 2534. + let expr0_0 = ExtMode::LQ; + let expr1_0 = + constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; + let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0)?; + let expr3_0 = constructor_x64_movzx(ctx, &expr0_0, &expr2_0)?; + let expr4_0 = constructor_output_gpr(ctx, expr3_0)?; + return Some(expr4_0); + } + &Opcode::Sload32 => { + // Rule at src/isa/x64/lower.isle line 2536. + let expr0_0 = ExtMode::LQ; + let expr1_0 = + constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; + let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0)?; + let expr3_0 = constructor_x64_movsx(ctx, &expr0_0, &expr2_0)?; + let expr4_0 = constructor_output_gpr(ctx, expr3_0)?; + return Some(expr4_0); + } + _ => {} + } + } + } } return None; } @@ -9920,22 +10654,21 @@ pub fn constructor_vec_insert_lane( if pattern5_0 == 0 { // Rule at src/isa/x64/lower.isle line 1351. let expr0_0 = constructor_reg_to_xmm_mem(ctx, pattern4_0)?; - let expr1_0 = constructor_x64_movsd(ctx, pattern2_0, &expr0_0)?; + let expr1_0 = constructor_x64_movsd_regmove(ctx, pattern2_0, &expr0_0)?; return Some(expr1_0); } } let pattern4_0 = arg3; if pattern4_0 == 0 { // Rule at src/isa/x64/lower.isle line 1353. - let expr0_0 = SseOpcode::Movsd; - let expr1_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0); - let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?; - let expr3_0 = C::xmm_to_xmm_mem(ctx, expr2_0); - let expr4_0 = constructor_x64_movsd(ctx, pattern2_0, &expr3_0)?; - return Some(expr4_0); + let expr0_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0); + let expr1_0 = constructor_x64_movsd_load(ctx, &expr0_0)?; + let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); + let expr3_0 = constructor_x64_movsd_regmove(ctx, pattern2_0, &expr2_0)?; + return Some(expr3_0); } if pattern4_0 == 1 { - // Rule at src/isa/x64/lower.isle line 1362. + // Rule at src/isa/x64/lower.isle line 1361. let expr0_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0); let expr1_0 = constructor_x64_movlhps(ctx, pattern2_0, &expr0_0)?; return Some(expr1_0); @@ -9957,7 +10690,7 @@ pub fn constructor_cmp_and_choose( let pattern2_0 = arg1; let pattern3_0 = arg2; let pattern4_0 = arg3; - // Rule at src/isa/x64/lower.isle line 1370. + // Rule at src/isa/x64/lower.isle line 1369. let expr0_0 = constructor_put_in_gpr(ctx, pattern3_0)?; let expr1_0 = constructor_put_in_gpr(ctx, pattern4_0)?; let expr2_0 = C::raw_operand_size_of_type(ctx, pattern1_0); @@ -9982,7 +10715,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 1824. + // Rule at src/isa/x64/lower.isle line 1823. let expr0_0: Type = I64; let expr1_0: i64 = -1; let expr2_0 = constructor_imm_i64(ctx, expr0_0, expr1_0)?; @@ -10009,7 +10742,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 1865. + // Rule at src/isa/x64/lower.isle line 1864. 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)?; @@ -10023,7 +10756,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 1956. + // Rule at src/isa/x64/lower.isle line 1955. let expr0_0: Type = I32; let expr1_0: u8 = 1; let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 }; @@ -10088,7 +10821,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 1913. + // Rule at src/isa/x64/lower.isle line 1912. let expr0_0: Type = I64; let expr1_0: u8 = 1; let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 }; @@ -10162,7 +10895,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 2045. + // Rule at src/isa/x64/lower.isle line 2044. 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); @@ -10225,7 +10958,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 2068. + // Rule at src/isa/x64/lower.isle line 2067. 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; @@ -10253,7 +10986,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 2080. + // Rule at src/isa/x64/lower.isle line 2079. 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; @@ -10282,7 +11015,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 2092. + // Rule at src/isa/x64/lower.isle line 2091. 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)?; @@ -10316,7 +11049,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 2212. + // Rule at src/isa/x64/lower.isle line 2211. let expr0_0: Type = I32; let expr1_0 = ExtendKind::Sign; let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?; @@ -10324,7 +11057,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 2208. + // Rule at src/isa/x64/lower.isle line 2207. let expr0_0: Type = I64; let expr1_0 = ExtendKind::Sign; let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?; @@ -10332,7 +11065,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 2202. + // Rule at src/isa/x64/lower.isle line 2201. let expr0_0: Type = I64; let expr1_0 = ExtendKind::Sign; let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?; @@ -10347,7 +11080,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 2198. + // Rule at src/isa/x64/lower.isle line 2197. 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)?; @@ -10359,7 +11092,7 @@ pub fn constructor_generic_sextend( } let pattern2_0 = arg2; if pattern2_0 == pattern1_0 { - // Rule at src/isa/x64/lower.isle line 2188. + // Rule at src/isa/x64/lower.isle line 2187. let expr0_0 = constructor_output_value(ctx, pattern0_0)?; return Some(expr0_0); } @@ -10369,7 +11102,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 2194. + // Rule at src/isa/x64/lower.isle line 2193. let expr0_0: Type = I64; let expr1_0: u8 = 63; let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 }; diff --git a/cranelift/codegen/src/machinst/isle.rs b/cranelift/codegen/src/machinst/isle.rs index 6b6e7caa05f3..052ed86e49c3 100644 --- a/cranelift/codegen/src/machinst/isle.rs +++ b/cranelift/codegen/src/machinst/isle.rs @@ -245,6 +245,14 @@ macro_rules! isle_prelude_methods { } } + #[inline] + fn ty_int_bool_ref_64(&mut self, ty: Type) -> Option { + match ty { + I64 | B64 | R64 => Some(ty), + _ => None, + } + } + #[inline] fn ty_int_bool_128(&mut self, ty: Type) -> Option { match ty { @@ -441,6 +449,12 @@ macro_rules! isle_prelude_methods { fn lane_type(&mut self, ty: Type) -> Type { ty.lane_type() } + + #[inline] + fn offset32_to_u32(&mut self, offset: Offset32) -> u32 { + let offset: i32 = offset.into(); + offset as u32 + } }; } diff --git a/cranelift/codegen/src/prelude.isle b/cranelift/codegen/src/prelude.isle index e440698e0b49..044e24930f72 100644 --- a/cranelift/codegen/src/prelude.isle +++ b/cranelift/codegen/src/prelude.isle @@ -265,6 +265,10 @@ (decl ty_int_bool_64 (Type) Type) (extern extractor ty_int_bool_64 ty_int_bool_64) +;; An extractor that matches I64 or B64 or R64. +(decl ty_int_bool_ref_64 (Type) Type) +(extern extractor ty_int_bool_ref_64 ty_int_bool_ref_64) + ;; An extractor that matches I128 or B128. (decl ty_int_bool_128 (Type) Type) (extern extractor ty_int_bool_128 ty_int_bool_128) @@ -379,6 +383,10 @@ (extractor (u64_from_iconst x) (def_inst (iconst (u64_from_imm64 x)))) +;; Convert an `Offset32` to a primitive number. +(decl offset32_to_u32 (Offset32) u32) +(extern constructor offset32_to_u32 offset32_to_u32) + ;; Instruction creation helpers ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Emit an instruction. @@ -564,3 +572,4 @@ (convert ValueRegs InstOutput output) (convert Reg InstOutput output_reg) (convert Value InstOutput output_value) +(convert Offset32 u32 offset32_to_u32)