1 // GENERATED BY ISLE. DO NOT EDIT!
2 //
3 // Generated automatically from the instruction-selection DSL code in:
4 // - src/clif.isle
5 // - src/prelude.isle
6 // - src/isa/x64/inst.isle
7 // - src/isa/x64/lower.isle
8 
9 #![allow(dead_code, unreachable_code, unreachable_patterns)]
10 #![allow(unused_imports, unused_variables, non_snake_case)]
11 #![allow(irrefutable_let_patterns)]
12 
13 use super::*; // Pulls in all external types.
14 
15 /// Context during lowering: an implementation of this trait
16 /// must be provided with all external constructors and extractors.
17 /// A mutable borrow is passed along through all lowering logic.
18 pub trait Context {
19     fn unpack_value_array_2(&mut self, arg0: &ValueArray2) -> (Value, Value);
20     fn pack_value_array_2(&mut self, arg0: Value, arg1: Value) -> ValueArray2;
21     fn unpack_value_array_3(&mut self, arg0: &ValueArray3) -> (Value, Value, Value);
22     fn pack_value_array_3(&mut self, arg0: Value, arg1: Value, arg2: Value) -> ValueArray3;
23     fn u32_add(&mut self, arg0: u32, arg1: u32) -> u32;
24     fn u8_and(&mut self, arg0: u8, arg1: u8) -> u8;
25     fn value_reg(&mut self, arg0: Reg) -> ValueRegs;
26     fn value_regs(&mut self, arg0: Reg, arg1: Reg) -> ValueRegs;
27     fn value_regs_invalid(&mut self) -> ValueRegs;
28     fn output_none(&mut self) -> InstOutput;
29     fn output(&mut self, arg0: ValueRegs) -> InstOutput;
30     fn output_pair(&mut self, arg0: ValueRegs, arg1: ValueRegs) -> InstOutput;
31     fn output_builder_new(&mut self) -> InstOutputBuilder;
32     fn output_builder_push(&mut self, arg0: &InstOutputBuilder, arg1: ValueRegs) -> Unit;
33     fn output_builder_finish(&mut self, arg0: &InstOutputBuilder) -> InstOutput;
34     fn temp_writable_reg(&mut self, arg0: Type) -> WritableReg;
35     fn invalid_reg(&mut self) -> Reg;
36     fn put_in_reg(&mut self, arg0: Value) -> Reg;
37     fn put_in_regs(&mut self, arg0: Value) -> ValueRegs;
38     fn value_regs_get(&mut self, arg0: ValueRegs, arg1: usize) -> Reg;
39     fn u8_as_u64(&mut self, arg0: u8) -> u64;
40     fn u16_as_u64(&mut self, arg0: u16) -> u64;
41     fn u32_as_u64(&mut self, arg0: u32) -> u64;
42     fn i64_as_u64(&mut self, arg0: i64) -> u64;
43     fn u64_add(&mut self, arg0: u64, arg1: u64) -> u64;
44     fn u64_sub(&mut self, arg0: u64, arg1: u64) -> u64;
45     fn u64_and(&mut self, arg0: u64, arg1: u64) -> u64;
46     fn ty_bits(&mut self, arg0: Type) -> u8;
47     fn ty_bits_u16(&mut self, arg0: Type) -> u16;
48     fn ty_bits_u64(&mut self, arg0: Type) -> u64;
49     fn ty_mask(&mut self, arg0: Type) -> u64;
50     fn ty_bytes(&mut self, arg0: Type) -> u16;
51     fn lane_type(&mut self, arg0: Type) -> Type;
52     fn fits_in_16(&mut self, arg0: Type) -> Option<Type>;
53     fn fits_in_32(&mut self, arg0: Type) -> Option<Type>;
54     fn fits_in_64(&mut self, arg0: Type) -> Option<Type>;
55     fn ty_32_or_64(&mut self, arg0: Type) -> Option<Type>;
56     fn ty_8_or_16(&mut self, arg0: Type) -> Option<Type>;
57     fn ty_int_bool_64(&mut self, arg0: Type) -> Option<Type>;
58     fn ty_int_bool_128(&mut self, arg0: Type) -> Option<Type>;
59     fn vec128(&mut self, arg0: Type) -> Option<Type>;
60     fn not_i64x2(&mut self, arg0: Type) -> Option<()>;
61     fn value_list_slice(&mut self, arg0: ValueList) -> ValueSlice;
62     fn value_slice_empty(&mut self, arg0: ValueSlice) -> Option<()>;
63     fn value_slice_unwrap(&mut self, arg0: ValueSlice) -> Option<(Value, ValueSlice)>;
64     fn value_slice_len(&mut self, arg0: ValueSlice) -> usize;
65     fn value_slice_get(&mut self, arg0: ValueSlice, arg1: usize) -> Value;
66     fn writable_reg_to_reg(&mut self, arg0: WritableReg) -> Reg;
67     fn u8_from_uimm8(&mut self, arg0: Uimm8) -> u8;
68     fn u64_from_imm64(&mut self, arg0: Imm64) -> u64;
69     fn nonzero_u64_from_imm64(&mut self, arg0: Imm64) -> Option<u64>;
70     fn u64_from_ieee32(&mut self, arg0: Ieee32) -> u64;
71     fn u64_from_ieee64(&mut self, arg0: Ieee64) -> u64;
72     fn inst_results(&mut self, arg0: Inst) -> ValueSlice;
73     fn first_result(&mut self, arg0: Inst) -> Option<Value>;
74     fn inst_data(&mut self, arg0: Inst) -> InstructionData;
75     fn value_type(&mut self, arg0: Value) -> Type;
76     fn multi_lane(&mut self, arg0: Type) -> Option<(u8, u16)>;
77     fn def_inst(&mut self, arg0: Value) -> Option<Inst>;
78     fn emit(&mut self, arg0: &MInst) -> Unit;
79     fn emit_safepoint(&mut self, arg0: &MInst) -> Unit;
80     fn trap_code_division_by_zero(&mut self) -> TrapCode;
81     fn trap_code_integer_overflow(&mut self) -> TrapCode;
82     fn trap_code_bad_conversion_to_integer(&mut self) -> TrapCode;
83     fn avoid_div_traps(&mut self, arg0: Type) -> Option<()>;
84     fn func_ref_data(&mut self, arg0: FuncRef) -> (SigRef, ExternalName, RelocDistance);
85     fn symbol_value_data(
86         &mut self,
87         arg0: GlobalValue,
88     ) -> Option<(ExternalName, RelocDistance, i64)>;
89     fn reloc_distance_near(&mut self, arg0: RelocDistance) -> Option<()>;
90     fn operand_size_of_type_32_64(&mut self, arg0: Type) -> OperandSize;
91     fn raw_operand_size_of_type(&mut self, arg0: Type) -> OperandSize;
92     fn put_in_reg_mem_imm(&mut self, arg0: Value) -> RegMemImm;
93     fn put_in_reg_mem(&mut self, arg0: Value) -> RegMem;
94     fn synthetic_amode_to_reg_mem(&mut self, arg0: &SyntheticAmode) -> RegMem;
95     fn amode_imm_reg_reg_shift(&mut self, arg0: u32, arg1: Gpr, arg2: Gpr, arg3: u8) -> Amode;
96     fn amode_to_synthetic_amode(&mut self, arg0: &Amode) -> SyntheticAmode;
97     fn put_masked_in_imm8_gpr(&mut self, arg0: Value, arg1: Type) -> Imm8Gpr;
98     fn encode_fcmp_imm(&mut self, arg0: &FcmpImm) -> u8;
99     fn imm8_reg_to_imm8_gpr(&mut self, arg0: &Imm8Reg) -> Imm8Gpr;
100     fn writable_gpr_to_reg(&mut self, arg0: WritableGpr) -> WritableReg;
101     fn writable_xmm_to_reg(&mut self, arg0: WritableXmm) -> WritableReg;
102     fn writable_reg_to_xmm(&mut self, arg0: WritableReg) -> WritableXmm;
103     fn writable_xmm_to_xmm(&mut self, arg0: WritableXmm) -> Xmm;
104     fn writable_gpr_to_gpr(&mut self, arg0: WritableGpr) -> Gpr;
105     fn gpr_to_reg(&mut self, arg0: Gpr) -> Reg;
106     fn gpr_to_gpr_mem(&mut self, arg0: Gpr) -> GprMem;
107     fn gpr_to_gpr_mem_imm(&mut self, arg0: Gpr) -> GprMemImm;
108     fn xmm_to_reg(&mut self, arg0: Xmm) -> Reg;
109     fn xmm_to_xmm_mem_imm(&mut self, arg0: Xmm) -> XmmMemImm;
110     fn temp_writable_gpr(&mut self) -> WritableGpr;
111     fn temp_writable_xmm(&mut self) -> WritableXmm;
112     fn reg_mem_to_xmm_mem(&mut self, arg0: &RegMem) -> XmmMem;
113     fn gpr_mem_imm_new(&mut self, arg0: &RegMemImm) -> GprMemImm;
114     fn xmm_mem_imm_new(&mut self, arg0: &RegMemImm) -> XmmMemImm;
115     fn xmm_to_xmm_mem(&mut self, arg0: Xmm) -> XmmMem;
116     fn xmm_mem_to_reg_mem(&mut self, arg0: &XmmMem) -> RegMem;
117     fn gpr_mem_to_reg_mem(&mut self, arg0: &GprMem) -> RegMem;
118     fn xmm_new(&mut self, arg0: Reg) -> Xmm;
119     fn gpr_new(&mut self, arg0: Reg) -> Gpr;
120     fn reg_mem_to_gpr_mem(&mut self, arg0: &RegMem) -> GprMem;
121     fn reg_to_gpr_mem(&mut self, arg0: Reg) -> GprMem;
122     fn gpr_to_imm8_gpr(&mut self, arg0: Gpr) -> Imm8Gpr;
123     fn imm8_to_imm8_gpr(&mut self, arg0: u8) -> Imm8Gpr;
124     fn xmm0(&mut self) -> WritableXmm;
125     fn is_xmm_type(&mut self, arg0: Type) -> Option<Type>;
126     fn is_gpr_type(&mut self, arg0: Type) -> Option<Type>;
127     fn is_single_register_type(&mut self, arg0: Type) -> Option<Type>;
128     fn avx512vl_enabled(&mut self, arg0: Type) -> Option<()>;
129     fn avx512dq_enabled(&mut self, arg0: Type) -> Option<()>;
130     fn avx512f_enabled(&mut self, arg0: Type) -> Option<()>;
131     fn avx512bitalg_enabled(&mut self, arg0: Type) -> Option<()>;
132     fn use_lzcnt(&mut self, arg0: Type) -> Option<()>;
133     fn use_bmi1(&mut self, arg0: Type) -> Option<()>;
134     fn use_popcnt(&mut self, arg0: Type) -> Option<()>;
135     fn imm8_from_value(&mut self, arg0: Value) -> Option<Imm8Reg>;
136     fn const_to_type_masked_imm8(&mut self, arg0: u64, arg1: Type) -> Imm8Gpr;
137     fn simm32_from_value(&mut self, arg0: Value) -> Option<GprMemImm>;
138     fn simm32_from_imm64(&mut self, arg0: Imm64) -> Option<GprMemImm>;
139     fn sinkable_load(&mut self, arg0: Value) -> Option<SinkableLoad>;
140     fn sink_load(&mut self, arg0: &SinkableLoad) -> RegMemImm;
141     fn ext_mode(&mut self, arg0: u16, arg1: u16) -> ExtMode;
142     fn nonzero_u64_fits_in_u32(&mut self, arg0: u64) -> Option<u64>;
143     fn ishl_i8x16_mask_for_const(&mut self, arg0: u32) -> SyntheticAmode;
144     fn ishl_i8x16_mask_table(&mut self) -> SyntheticAmode;
145     fn ushr_i8x16_mask_for_const(&mut self, arg0: u32) -> SyntheticAmode;
146     fn ushr_i8x16_mask_table(&mut self) -> SyntheticAmode;
147     fn sse_insertps_lane_imm(&mut self, arg0: u8) -> u8;
148     fn popcount_4bit_table(&mut self) -> VCodeConstant;
149     fn popcount_low_mask(&mut self) -> VCodeConstant;
150 }
151 
152 /// Internal type SideEffectNoResult: defined at src/prelude.isle line 393.
153 #[derive(Clone, Debug)]
154 pub enum SideEffectNoResult {
155     Inst { inst: MInst },
156 }
157 
158 /// Internal type ProducesFlags: defined at src/prelude.isle line 415.
159 #[derive(Clone, Debug)]
160 pub enum ProducesFlags {
161     ProducesFlagsSideEffect { inst: MInst },
162     ProducesFlagsReturnsReg { inst: MInst, result: Reg },
163     ProducesFlagsReturnsResultWithConsumer { inst: MInst, result: Reg },
164 }
165 
166 /// Internal type ConsumesFlags: defined at src/prelude.isle line 426.
167 #[derive(Clone, Debug)]
168 pub enum ConsumesFlags {
169     ConsumesFlagsReturnsResultWithProducer {
170         inst: MInst,
171         result: Reg,
172     },
173     ConsumesFlagsReturnsReg {
174         inst: MInst,
175         result: Reg,
176     },
177     ConsumesFlagsTwiceReturnsValueRegs {
178         inst1: MInst,
179         inst2: MInst,
180         result: ValueRegs,
181     },
182     ConsumesFlagsFourTimesReturnsValueRegs {
183         inst1: MInst,
184         inst2: MInst,
185         inst3: MInst,
186         inst4: MInst,
187         result: ValueRegs,
188     },
189 }
190 
191 /// Internal type MInst: defined at src/isa/x64/inst.isle line 8.
192 #[derive(Clone)]
193 pub enum MInst {
194     Nop {
195         len: u8,
196     },
197     AluRmiR {
198         size: OperandSize,
199         op: AluRmiROpcode,
200         src1: Gpr,
201         src2: GprMemImm,
202         dst: WritableGpr,
203     },
204     UnaryRmR {
205         size: OperandSize,
206         op: UnaryRmROpcode,
207         src: GprMem,
208         dst: WritableGpr,
209     },
210     Not {
211         size: OperandSize,
212         src: Gpr,
213         dst: WritableGpr,
214     },
215     Neg {
216         size: OperandSize,
217         src: Gpr,
218         dst: WritableGpr,
219     },
220     Div {
221         size: OperandSize,
222         signed: bool,
223         divisor: GprMem,
224         dividend: Gpr,
225         dst_quotient: WritableGpr,
226         dst_remainder: WritableGpr,
227     },
228     MulHi {
229         size: OperandSize,
230         signed: bool,
231         src1: Gpr,
232         src2: GprMem,
233         dst_lo: WritableGpr,
234         dst_hi: WritableGpr,
235     },
236     CheckedDivOrRemSeq {
237         kind: DivOrRemKind,
238         size: OperandSize,
239         dividend: Gpr,
240         divisor: WritableGpr,
241         dst_quotient: WritableGpr,
242         dst_remainder: WritableGpr,
243         tmp: OptionWritableGpr,
244     },
245     SignExtendData {
246         size: OperandSize,
247         src: Gpr,
248         dst: WritableGpr,
249     },
250     Imm {
251         dst_size: OperandSize,
252         simm64: u64,
253         dst: WritableGpr,
254     },
255     MovRR {
256         size: OperandSize,
257         src: Gpr,
258         dst: WritableGpr,
259     },
260     MovzxRmR {
261         ext_mode: ExtMode,
262         src: GprMem,
263         dst: WritableGpr,
264     },
265     Mov64MR {
266         src: SyntheticAmode,
267         dst: WritableGpr,
268     },
269     LoadEffectiveAddress {
270         addr: SyntheticAmode,
271         dst: WritableGpr,
272     },
273     MovsxRmR {
274         ext_mode: ExtMode,
275         src: GprMem,
276         dst: WritableGpr,
277     },
278     MovRM {
279         size: OperandSize,
280         src: Gpr,
281         dst: SyntheticAmode,
282     },
283     ShiftR {
284         size: OperandSize,
285         kind: ShiftKind,
286         src: Gpr,
287         num_bits: Imm8Gpr,
288         dst: WritableGpr,
289     },
290     XmmRmiReg {
291         opcode: SseOpcode,
292         src1: Xmm,
293         src2: XmmMemImm,
294         dst: WritableXmm,
295     },
296     CmpRmiR {
297         size: OperandSize,
298         opcode: CmpOpcode,
299         src: GprMemImm,
300         dst: Gpr,
301     },
302     Setcc {
303         cc: CC,
304         dst: WritableGpr,
305     },
306     Cmove {
307         size: OperandSize,
308         cc: CC,
309         consequent: GprMem,
310         alternative: Gpr,
311         dst: WritableGpr,
312     },
313     XmmCmove {
314         size: OperandSize,
315         cc: CC,
316         consequent: XmmMem,
317         alternative: Xmm,
318         dst: WritableXmm,
319     },
320     Push64 {
321         src: GprMemImm,
322     },
323     Pop64 {
324         dst: WritableGpr,
325     },
326     XmmRmR {
327         op: SseOpcode,
328         src1: Xmm,
329         src2: XmmMem,
330         dst: WritableXmm,
331     },
332     XmmRmREvex {
333         op: Avx512Opcode,
334         src1: XmmMem,
335         src2: Xmm,
336         dst: WritableXmm,
337     },
338     XmmUnaryRmR {
339         op: SseOpcode,
340         src: XmmMem,
341         dst: WritableXmm,
342     },
343     XmmUnaryRmREvex {
344         op: Avx512Opcode,
345         src: XmmMem,
346         dst: WritableXmm,
347     },
348     XmmMovRM {
349         op: SseOpcode,
350         src: Reg,
351         dst: SyntheticAmode,
352     },
353     XmmLoadConst {
354         src: VCodeConstant,
355         dst: WritableReg,
356         ty: Type,
357     },
358     XmmToGpr {
359         op: SseOpcode,
360         src: Xmm,
361         dst: WritableGpr,
362         dst_size: OperandSize,
363     },
364     GprToXmm {
365         op: SseOpcode,
366         src: GprMem,
367         dst: WritableXmm,
368         src_size: OperandSize,
369     },
370     CvtUint64ToFloatSeq {
371         dst_size: OperandSize,
372         src: WritableGpr,
373         dst: WritableXmm,
374         tmp_gpr1: WritableGpr,
375         tmp_gpr2: WritableGpr,
376     },
377     CvtFloatToSintSeq {
378         dst_size: OperandSize,
379         src_size: OperandSize,
380         is_saturating: bool,
381         src: WritableXmm,
382         dst: WritableGpr,
383         tmp_gpr: WritableGpr,
384         tmp_xmm: WritableXmm,
385     },
386     CvtFloatToUintSeq {
387         dst_size: OperandSize,
388         src_size: OperandSize,
389         is_saturating: bool,
390         src: WritableXmm,
391         dst: WritableGpr,
392         tmp_gpr: WritableGpr,
393         tmp_xmm: WritableXmm,
394     },
395     XmmMinMaxSeq {
396         size: OperandSize,
397         is_min: bool,
398         lhs: Xmm,
399         rhs: Xmm,
400         dst: WritableXmm,
401     },
402     XmmCmpRmR {
403         op: SseOpcode,
404         src: XmmMem,
405         dst: Xmm,
406     },
407     XmmRmRImm {
408         op: SseOpcode,
409         src1: Reg,
410         src2: RegMem,
411         dst: WritableReg,
412         imm: u8,
413         size: OperandSize,
414     },
415     CallKnown {
416         dest: ExternalName,
417         uses: VecReg,
418         defs: VecWritableReg,
419         opcode: Opcode,
420     },
421     CallUnknown {
422         dest: RegMem,
423         uses: VecReg,
424         defs: VecWritableReg,
425         opcode: Opcode,
426     },
427     Ret,
428     EpiloguePlaceholder,
429     JmpKnown {
430         dst: MachLabel,
431     },
432     JmpIf {
433         cc: CC,
434         taken: MachLabel,
435     },
436     JmpCond {
437         cc: CC,
438         taken: MachLabel,
439         not_taken: MachLabel,
440     },
441     JmpTableSeq {
442         idx: Reg,
443         tmp1: WritableReg,
444         tmp2: WritableReg,
445         default_target: MachLabel,
446         targets: VecMachLabel,
447         targets_for_term: VecMachLabel,
448     },
449     JmpUnknown {
450         target: RegMem,
451     },
452     TrapIf {
453         cc: CC,
454         trap_code: TrapCode,
455     },
456     Hlt,
457     Ud2 {
458         trap_code: TrapCode,
459     },
460     LoadExtName {
461         dst: WritableReg,
462         name: BoxExternalName,
463         offset: i64,
464     },
465     LockCmpxchg {
466         ty: Type,
467         replacement: Reg,
468         expected: Reg,
469         mem: SyntheticAmode,
470         dst_old: WritableReg,
471     },
472     AtomicRmwSeq {
473         ty: Type,
474         op: AtomicRmwOp,
475         address: Reg,
476         operand: Reg,
477         temp: WritableReg,
478         dst_old: WritableReg,
479     },
480     Fence {
481         kind: FenceKind,
482     },
483     VirtualSPOffsetAdj {
484         offset: i64,
485     },
486     XmmUninitializedValue {
487         dst: WritableXmm,
488     },
489     ElfTlsGetAddr {
490         symbol: ExternalName,
491     },
492     MachOTlsGetAddr {
493         symbol: ExternalName,
494     },
495     ValueLabelMarker {
496         reg: Reg,
497         label: ValueLabel,
498     },
499     Unwind {
500         inst: UnwindInst,
501     },
502 }
503 
504 /// Internal type ExtendKind: defined at src/isa/x64/inst.isle line 1120.
505 #[derive(Copy, Clone, PartialEq, Eq, Debug)]
506 pub enum ExtendKind {
507     Sign,
508     Zero,
509 }
510 
511 // Generated as internal constructor for term output_reg.
512 pub fn constructor_output_reg<C: Context>(ctx: &mut C, arg0: Reg) -> Option<InstOutput> {
513     let pattern0_0 = arg0;
514     // Rule at src/prelude.isle line 86.
515     let expr0_0 = C::value_reg(ctx, pattern0_0);
516     let expr1_0 = C::output(ctx, expr0_0);
517     return Some(expr1_0);
518 }
519 
520 // Generated as internal constructor for term output_value.
521 pub fn constructor_output_value<C: Context>(ctx: &mut C, arg0: Value) -> Option<InstOutput> {
522     let pattern0_0 = arg0;
523     // Rule at src/prelude.isle line 90.
524     let expr0_0 = C::put_in_regs(ctx, pattern0_0);
525     let expr1_0 = C::output(ctx, expr0_0);
526     return Some(expr1_0);
527 }
528 
529 // Generated as internal constructor for term temp_reg.
530 pub fn constructor_temp_reg<C: Context>(ctx: &mut C, arg0: Type) -> Option<Reg> {
531     let pattern0_0 = arg0;
532     // Rule at src/prelude.isle line 110.
533     let expr0_0 = C::temp_writable_reg(ctx, pattern0_0);
534     let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0);
535     return Some(expr1_0);
536 }
537 
538 // Generated as internal constructor for term lo_reg.
539 pub fn constructor_lo_reg<C: Context>(ctx: &mut C, arg0: Value) -> Option<Reg> {
540     let pattern0_0 = arg0;
541     // Rule at src/prelude.isle line 145.
542     let expr0_0 = C::put_in_regs(ctx, pattern0_0);
543     let expr1_0: usize = 0;
544     let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0);
545     return Some(expr2_0);
546 }
547 
548 // Generated as internal constructor for term side_effect.
549 pub fn constructor_side_effect<C: Context>(
550     ctx: &mut C,
551     arg0: &SideEffectNoResult,
552 ) -> Option<InstOutput> {
553     let pattern0_0 = arg0;
554     if let &SideEffectNoResult::Inst {
555         inst: ref pattern1_0,
556     } = pattern0_0
557     {
558         // Rule at src/prelude.isle line 398.
559         let expr0_0 = C::emit(ctx, pattern1_0);
560         let expr1_0 = C::output_none(ctx);
561         return Some(expr1_0);
562     }
563     return None;
564 }
565 
566 // Generated as internal constructor for term safepoint.
567 pub fn constructor_safepoint<C: Context>(
568     ctx: &mut C,
569     arg0: &SideEffectNoResult,
570 ) -> Option<InstOutput> {
571     let pattern0_0 = arg0;
572     if let &SideEffectNoResult::Inst {
573         inst: ref pattern1_0,
574     } = pattern0_0
575     {
576         // Rule at src/prelude.isle line 404.
577         let expr0_0 = C::emit_safepoint(ctx, pattern1_0);
578         let expr1_0 = C::output_none(ctx);
579         return Some(expr1_0);
580     }
581     return None;
582 }
583 
584 // Generated as internal constructor for term produces_flags_get_reg.
585 pub fn constructor_produces_flags_get_reg<C: Context>(
586     ctx: &mut C,
587     arg0: &ProducesFlags,
588 ) -> Option<Reg> {
589     let pattern0_0 = arg0;
590     if let &ProducesFlags::ProducesFlagsReturnsReg {
591         inst: ref pattern1_0,
592         result: pattern1_1,
593     } = pattern0_0
594     {
595         // Rule at src/prelude.isle line 442.
596         return Some(pattern1_1);
597     }
598     return None;
599 }
600 
601 // Generated as internal constructor for term produces_flags_ignore.
602 pub fn constructor_produces_flags_ignore<C: Context>(
603     ctx: &mut C,
604     arg0: &ProducesFlags,
605 ) -> Option<ProducesFlags> {
606     let pattern0_0 = arg0;
607     match pattern0_0 {
608         &ProducesFlags::ProducesFlagsReturnsReg {
609             inst: ref pattern1_0,
610             result: pattern1_1,
611         } => {
612             // Rule at src/prelude.isle line 447.
613             let expr0_0 = ProducesFlags::ProducesFlagsSideEffect {
614                 inst: pattern1_0.clone(),
615             };
616             return Some(expr0_0);
617         }
618         &ProducesFlags::ProducesFlagsReturnsResultWithConsumer {
619             inst: ref pattern1_0,
620             result: pattern1_1,
621         } => {
622             // Rule at src/prelude.isle line 449.
623             let expr0_0 = ProducesFlags::ProducesFlagsSideEffect {
624                 inst: pattern1_0.clone(),
625             };
626             return Some(expr0_0);
627         }
628         _ => {}
629     }
630     return None;
631 }
632 
633 // Generated as internal constructor for term consumes_flags_concat.
634 pub fn constructor_consumes_flags_concat<C: Context>(
635     ctx: &mut C,
636     arg0: &ConsumesFlags,
637     arg1: &ConsumesFlags,
638 ) -> Option<ConsumesFlags> {
639     let pattern0_0 = arg0;
640     if let &ConsumesFlags::ConsumesFlagsReturnsReg {
641         inst: ref pattern1_0,
642         result: pattern1_1,
643     } = pattern0_0
644     {
645         let pattern2_0 = arg1;
646         if let &ConsumesFlags::ConsumesFlagsReturnsReg {
647             inst: ref pattern3_0,
648             result: pattern3_1,
649         } = pattern2_0
650         {
651             // Rule at src/prelude.isle line 456.
652             let expr0_0 = C::value_regs(ctx, pattern1_1, pattern3_1);
653             let expr1_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs {
654                 inst1: pattern1_0.clone(),
655                 inst2: pattern3_0.clone(),
656                 result: expr0_0,
657             };
658             return Some(expr1_0);
659         }
660     }
661     return None;
662 }
663 
664 // Generated as internal constructor for term with_flags.
665 pub fn constructor_with_flags<C: Context>(
666     ctx: &mut C,
667     arg0: &ProducesFlags,
668     arg1: &ConsumesFlags,
669 ) -> Option<ValueRegs> {
670     let pattern0_0 = arg0;
671     match pattern0_0 {
672         &ProducesFlags::ProducesFlagsSideEffect {
673             inst: ref pattern1_0,
674         } => {
675             let pattern2_0 = arg1;
676             match pattern2_0 {
677                 &ConsumesFlags::ConsumesFlagsReturnsReg {
678                     inst: ref pattern3_0,
679                     result: pattern3_1,
680                 } => {
681                     // Rule at src/prelude.isle line 481.
682                     let expr0_0 = C::emit(ctx, pattern1_0);
683                     let expr1_0 = C::emit(ctx, pattern3_0);
684                     let expr2_0 = C::value_reg(ctx, pattern3_1);
685                     return Some(expr2_0);
686                 }
687                 &ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs {
688                     inst1: ref pattern3_0,
689                     inst2: ref pattern3_1,
690                     result: pattern3_2,
691                 } => {
692                     // Rule at src/prelude.isle line 487.
693                     let expr0_0 = C::emit(ctx, pattern1_0);
694                     let expr1_0 = C::emit(ctx, pattern3_0);
695                     let expr2_0 = C::emit(ctx, pattern3_1);
696                     return Some(pattern3_2);
697                 }
698                 &ConsumesFlags::ConsumesFlagsFourTimesReturnsValueRegs {
699                     inst1: ref pattern3_0,
700                     inst2: ref pattern3_1,
701                     inst3: ref pattern3_2,
702                     inst4: ref pattern3_3,
703                     result: pattern3_4,
704                 } => {
705                     // Rule at src/prelude.isle line 499.
706                     let expr0_0 = C::emit(ctx, pattern1_0);
707                     let expr1_0 = C::emit(ctx, pattern3_0);
708                     let expr2_0 = C::emit(ctx, pattern3_1);
709                     let expr3_0 = C::emit(ctx, pattern3_2);
710                     let expr4_0 = C::emit(ctx, pattern3_3);
711                     return Some(pattern3_4);
712                 }
713                 _ => {}
714             }
715         }
716         &ProducesFlags::ProducesFlagsReturnsResultWithConsumer {
717             inst: ref pattern1_0,
718             result: pattern1_1,
719         } => {
720             let pattern2_0 = arg1;
721             if let &ConsumesFlags::ConsumesFlagsReturnsResultWithProducer {
722                 inst: ref pattern3_0,
723                 result: pattern3_1,
724             } = pattern2_0
725             {
726                 // Rule at src/prelude.isle line 475.
727                 let expr0_0 = C::emit(ctx, pattern1_0);
728                 let expr1_0 = C::emit(ctx, pattern3_0);
729                 let expr2_0 = C::value_regs(ctx, pattern1_1, pattern3_1);
730                 return Some(expr2_0);
731             }
732         }
733         _ => {}
734     }
735     return None;
736 }
737 
738 // Generated as internal constructor for term with_flags_reg.
739 pub fn constructor_with_flags_reg<C: Context>(
740     ctx: &mut C,
741     arg0: &ProducesFlags,
742     arg1: &ConsumesFlags,
743 ) -> Option<Reg> {
744     let pattern0_0 = arg0;
745     let pattern1_0 = arg1;
746     // Rule at src/prelude.isle line 516.
747     let expr0_0 = constructor_with_flags(ctx, pattern0_0, pattern1_0)?;
748     let expr1_0: usize = 0;
749     let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0);
750     return Some(expr2_0);
751 }
752 
753 // Generated as internal constructor for term operand_size_bits.
754 pub fn constructor_operand_size_bits<C: Context>(ctx: &mut C, arg0: &OperandSize) -> Option<u16> {
755     let pattern0_0 = arg0;
756     match pattern0_0 {
757         &OperandSize::Size8 => {
758             // Rule at src/isa/x64/inst.isle line 510.
759             let expr0_0: u16 = 8;
760             return Some(expr0_0);
761         }
762         &OperandSize::Size16 => {
763             // Rule at src/isa/x64/inst.isle line 511.
764             let expr0_0: u16 = 16;
765             return Some(expr0_0);
766         }
767         &OperandSize::Size32 => {
768             // Rule at src/isa/x64/inst.isle line 512.
769             let expr0_0: u16 = 32;
770             return Some(expr0_0);
771         }
772         &OperandSize::Size64 => {
773             // Rule at src/isa/x64/inst.isle line 513.
774             let expr0_0: u16 = 64;
775             return Some(expr0_0);
776         }
777         _ => {}
778     }
779     return None;
780 }
781 
782 // Generated as internal constructor for term reg_to_gpr_mem_imm.
783 pub fn constructor_reg_to_gpr_mem_imm<C: Context>(ctx: &mut C, arg0: Reg) -> Option<GprMemImm> {
784     let pattern0_0 = arg0;
785     // Rule at src/isa/x64/inst.isle line 950.
786     let expr0_0 = C::gpr_new(ctx, pattern0_0);
787     let expr1_0 = C::gpr_to_gpr_mem_imm(ctx, expr0_0);
788     return Some(expr1_0);
789 }
790 
791 // Generated as internal constructor for term put_in_gpr.
792 pub fn constructor_put_in_gpr<C: Context>(ctx: &mut C, arg0: Value) -> Option<Gpr> {
793     let pattern0_0 = arg0;
794     // Rule at src/isa/x64/inst.isle line 957.
795     let expr0_0 = C::put_in_reg(ctx, pattern0_0);
796     let expr1_0 = C::gpr_new(ctx, expr0_0);
797     return Some(expr1_0);
798 }
799 
800 // Generated as internal constructor for term put_in_gpr_mem.
801 pub fn constructor_put_in_gpr_mem<C: Context>(ctx: &mut C, arg0: Value) -> Option<GprMem> {
802     let pattern0_0 = arg0;
803     // Rule at src/isa/x64/inst.isle line 964.
804     let expr0_0 = C::put_in_reg_mem(ctx, pattern0_0);
805     let expr1_0 = C::reg_mem_to_gpr_mem(ctx, &expr0_0);
806     return Some(expr1_0);
807 }
808 
809 // Generated as internal constructor for term put_in_gpr_mem_imm.
810 pub fn constructor_put_in_gpr_mem_imm<C: Context>(ctx: &mut C, arg0: Value) -> Option<GprMemImm> {
811     let pattern0_0 = arg0;
812     // Rule at src/isa/x64/inst.isle line 971.
813     let expr0_0 = C::put_in_reg_mem_imm(ctx, pattern0_0);
814     let expr1_0 = C::gpr_mem_imm_new(ctx, &expr0_0);
815     return Some(expr1_0);
816 }
817 
818 // Generated as internal constructor for term put_in_xmm.
819 pub fn constructor_put_in_xmm<C: Context>(ctx: &mut C, arg0: Value) -> Option<Xmm> {
820     let pattern0_0 = arg0;
821     // Rule at src/isa/x64/inst.isle line 978.
822     let expr0_0 = C::put_in_reg(ctx, pattern0_0);
823     let expr1_0 = C::xmm_new(ctx, expr0_0);
824     return Some(expr1_0);
825 }
826 
827 // Generated as internal constructor for term put_in_xmm_mem.
828 pub fn constructor_put_in_xmm_mem<C: Context>(ctx: &mut C, arg0: Value) -> Option<XmmMem> {
829     let pattern0_0 = arg0;
830     // Rule at src/isa/x64/inst.isle line 985.
831     let expr0_0 = C::put_in_reg_mem(ctx, pattern0_0);
832     let expr1_0 = C::reg_mem_to_xmm_mem(ctx, &expr0_0);
833     return Some(expr1_0);
834 }
835 
836 // Generated as internal constructor for term put_in_xmm_mem_imm.
837 pub fn constructor_put_in_xmm_mem_imm<C: Context>(ctx: &mut C, arg0: Value) -> Option<XmmMemImm> {
838     let pattern0_0 = arg0;
839     // Rule at src/isa/x64/inst.isle line 992.
840     let expr0_0 = C::put_in_reg_mem_imm(ctx, pattern0_0);
841     let expr1_0 = C::xmm_mem_imm_new(ctx, &expr0_0);
842     return Some(expr1_0);
843 }
844 
845 // Generated as internal constructor for term output_gpr.
846 pub fn constructor_output_gpr<C: Context>(ctx: &mut C, arg0: Gpr) -> Option<InstOutput> {
847     let pattern0_0 = arg0;
848     // Rule at src/isa/x64/inst.isle line 997.
849     let expr0_0 = C::gpr_to_reg(ctx, pattern0_0);
850     let expr1_0 = constructor_output_reg(ctx, expr0_0)?;
851     return Some(expr1_0);
852 }
853 
854 // Generated as internal constructor for term value_gprs.
855 pub fn constructor_value_gprs<C: Context>(ctx: &mut C, arg0: Gpr, arg1: Gpr) -> Option<ValueRegs> {
856     let pattern0_0 = arg0;
857     let pattern1_0 = arg1;
858     // Rule at src/isa/x64/inst.isle line 1002.
859     let expr0_0 = C::gpr_to_reg(ctx, pattern0_0);
860     let expr1_0 = C::gpr_to_reg(ctx, pattern1_0);
861     let expr2_0 = C::value_regs(ctx, expr0_0, expr1_0);
862     return Some(expr2_0);
863 }
864 
865 // Generated as internal constructor for term output_xmm.
866 pub fn constructor_output_xmm<C: Context>(ctx: &mut C, arg0: Xmm) -> Option<InstOutput> {
867     let pattern0_0 = arg0;
868     // Rule at src/isa/x64/inst.isle line 1007.
869     let expr0_0 = C::xmm_to_reg(ctx, pattern0_0);
870     let expr1_0 = constructor_output_reg(ctx, expr0_0)?;
871     return Some(expr1_0);
872 }
873 
874 // Generated as internal constructor for term value_regs_get_gpr.
875 pub fn constructor_value_regs_get_gpr<C: Context>(
876     ctx: &mut C,
877     arg0: ValueRegs,
878     arg1: usize,
879 ) -> Option<Gpr> {
880     let pattern0_0 = arg0;
881     let pattern1_0 = arg1;
882     // Rule at src/isa/x64/inst.isle line 1014.
883     let expr0_0 = C::value_regs_get(ctx, pattern0_0, pattern1_0);
884     let expr1_0 = C::gpr_new(ctx, expr0_0);
885     return Some(expr1_0);
886 }
887 
888 // Generated as internal constructor for term lo_gpr.
889 pub fn constructor_lo_gpr<C: Context>(ctx: &mut C, arg0: Value) -> Option<Gpr> {
890     let pattern0_0 = arg0;
891     // Rule at src/isa/x64/inst.isle line 1027.
892     let expr0_0 = constructor_lo_reg(ctx, pattern0_0)?;
893     let expr1_0 = C::gpr_new(ctx, expr0_0);
894     return Some(expr1_0);
895 }
896 
897 // Generated as internal constructor for term sink_load_to_gpr_mem_imm.
898 pub fn constructor_sink_load_to_gpr_mem_imm<C: Context>(
899     ctx: &mut C,
900     arg0: &SinkableLoad,
901 ) -> Option<GprMemImm> {
902     let pattern0_0 = arg0;
903     // Rule at src/isa/x64/inst.isle line 1110.
904     let expr0_0 = C::sink_load(ctx, pattern0_0);
905     let expr1_0 = C::gpr_mem_imm_new(ctx, &expr0_0);
906     return Some(expr1_0);
907 }
908 
909 // Generated as internal constructor for term extend_to_gpr.
910 pub fn constructor_extend_to_gpr<C: Context>(
911     ctx: &mut C,
912     arg0: Value,
913     arg1: Type,
914     arg2: &ExtendKind,
915 ) -> Option<Gpr> {
916     let pattern0_0 = arg0;
917     let pattern1_0 = C::value_type(ctx, pattern0_0);
918     let pattern2_0 = arg1;
919     if pattern2_0 == pattern1_0 {
920         let pattern4_0 = arg2;
921         // Rule at src/isa/x64/inst.isle line 1132.
922         let expr0_0 = constructor_put_in_gpr(ctx, pattern0_0)?;
923         return Some(expr0_0);
924     }
925     let pattern3_0 = arg2;
926     // Rule at src/isa/x64/inst.isle line 1135.
927     let expr0_0 = C::ty_bits_u16(ctx, pattern1_0);
928     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern2_0);
929     let expr2_0 = constructor_operand_size_bits(ctx, &expr1_0)?;
930     let expr3_0 = C::ext_mode(ctx, expr0_0, expr2_0);
931     let expr4_0 = constructor_put_in_gpr_mem(ctx, pattern0_0)?;
932     let expr5_0 = constructor_extend(ctx, pattern3_0, pattern2_0, &expr3_0, &expr4_0)?;
933     return Some(expr5_0);
934 }
935 
936 // Generated as internal constructor for term extend.
937 pub fn constructor_extend<C: Context>(
938     ctx: &mut C,
939     arg0: &ExtendKind,
940     arg1: Type,
941     arg2: &ExtMode,
942     arg3: &GprMem,
943 ) -> Option<Gpr> {
944     let pattern0_0 = arg0;
945     match pattern0_0 {
946         &ExtendKind::Sign => {
947             let pattern2_0 = arg1;
948             let pattern3_0 = arg2;
949             let pattern4_0 = arg3;
950             // Rule at src/isa/x64/inst.isle line 1155.
951             let expr0_0 = constructor_movsx(ctx, pattern2_0, pattern3_0, pattern4_0)?;
952             return Some(expr0_0);
953         }
954         &ExtendKind::Zero => {
955             let pattern2_0 = arg1;
956             let pattern3_0 = arg2;
957             let pattern4_0 = arg3;
958             // Rule at src/isa/x64/inst.isle line 1151.
959             let expr0_0 = constructor_movzx(ctx, pattern2_0, pattern3_0, pattern4_0)?;
960             return Some(expr0_0);
961         }
962         _ => {}
963     }
964     return None;
965 }
966 
967 // Generated as internal constructor for term sse_xor_op.
968 pub fn constructor_sse_xor_op<C: Context>(ctx: &mut C, arg0: Type) -> Option<SseOpcode> {
969     let pattern0_0 = arg0;
970     if pattern0_0 == F32X4 {
971         // Rule at src/isa/x64/inst.isle line 1162.
972         let expr0_0 = SseOpcode::Xorps;
973         return Some(expr0_0);
974     }
975     if pattern0_0 == F64X2 {
976         // Rule at src/isa/x64/inst.isle line 1163.
977         let expr0_0 = SseOpcode::Xorpd;
978         return Some(expr0_0);
979     }
980     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
981         // Rule at src/isa/x64/inst.isle line 1164.
982         let expr0_0 = SseOpcode::Pxor;
983         return Some(expr0_0);
984     }
985     return None;
986 }
987 
988 // Generated as internal constructor for term sse_xor.
989 pub fn constructor_sse_xor<C: Context>(
990     ctx: &mut C,
991     arg0: Type,
992     arg1: Xmm,
993     arg2: &XmmMem,
994 ) -> Option<Xmm> {
995     let pattern0_0 = arg0;
996     let pattern1_0 = arg1;
997     let pattern2_0 = arg2;
998     // Rule at src/isa/x64/inst.isle line 1168.
999     let expr0_0 = constructor_sse_xor_op(ctx, pattern0_0)?;
1000     let expr1_0 = constructor_xmm_rm_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1001     return Some(expr1_0);
1002 }
1003 
1004 // Generated as internal constructor for term sse_cmp_op.
1005 pub fn constructor_sse_cmp_op<C: Context>(ctx: &mut C, arg0: Type) -> Option<SseOpcode> {
1006     let pattern0_0 = arg0;
1007     if pattern0_0 == F32X4 {
1008         // Rule at src/isa/x64/inst.isle line 1177.
1009         let expr0_0 = SseOpcode::Cmpps;
1010         return Some(expr0_0);
1011     }
1012     if pattern0_0 == F64X2 {
1013         // Rule at src/isa/x64/inst.isle line 1178.
1014         let expr0_0 = SseOpcode::Cmppd;
1015         return Some(expr0_0);
1016     }
1017     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
1018         if pattern1_0 == 8 {
1019             if pattern1_1 == 16 {
1020                 // Rule at src/isa/x64/inst.isle line 1173.
1021                 let expr0_0 = SseOpcode::Pcmpeqb;
1022                 return Some(expr0_0);
1023             }
1024         }
1025         if pattern1_0 == 16 {
1026             if pattern1_1 == 8 {
1027                 // Rule at src/isa/x64/inst.isle line 1174.
1028                 let expr0_0 = SseOpcode::Pcmpeqw;
1029                 return Some(expr0_0);
1030             }
1031         }
1032         if pattern1_0 == 32 {
1033             if pattern1_1 == 4 {
1034                 // Rule at src/isa/x64/inst.isle line 1175.
1035                 let expr0_0 = SseOpcode::Pcmpeqd;
1036                 return Some(expr0_0);
1037             }
1038         }
1039         if pattern1_0 == 64 {
1040             if pattern1_1 == 2 {
1041                 // Rule at src/isa/x64/inst.isle line 1176.
1042                 let expr0_0 = SseOpcode::Pcmpeqq;
1043                 return Some(expr0_0);
1044             }
1045         }
1046     }
1047     return None;
1048 }
1049 
1050 // Generated as internal constructor for term vector_all_ones.
1051 pub fn constructor_vector_all_ones<C: Context>(ctx: &mut C, arg0: Type) -> Option<Xmm> {
1052     let pattern0_0 = arg0;
1053     // Rule at src/isa/x64/inst.isle line 1192.
1054     let expr0_0 = C::temp_writable_xmm(ctx);
1055     let expr1_0: Type = I32X4;
1056     let expr2_0 = constructor_sse_cmp_op(ctx, expr1_0)?;
1057     let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
1058     let expr4_0 = constructor_writable_xmm_to_xmm_mem(ctx, expr0_0)?;
1059     let expr5_0 = MInst::XmmRmR {
1060         op: expr2_0,
1061         src1: expr3_0,
1062         src2: expr4_0,
1063         dst: expr0_0,
1064     };
1065     let expr6_0 = C::emit(ctx, &expr5_0);
1066     let expr7_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
1067     return Some(expr7_0);
1068 }
1069 
1070 // Generated as internal constructor for term make_i64x2_from_lanes.
1071 pub fn constructor_make_i64x2_from_lanes<C: Context>(
1072     ctx: &mut C,
1073     arg0: &GprMem,
1074     arg1: &GprMem,
1075 ) -> Option<Xmm> {
1076     let pattern0_0 = arg0;
1077     let pattern1_0 = arg1;
1078     // Rule at src/isa/x64/inst.isle line 1202.
1079     let expr0_0 = C::temp_writable_xmm(ctx);
1080     let expr1_0 = C::writable_xmm_to_reg(ctx, expr0_0);
1081     let expr2_0 = MInst::XmmUninitializedValue { dst: expr0_0 };
1082     let expr3_0 = C::emit(ctx, &expr2_0);
1083     let expr4_0 = SseOpcode::Pinsrd;
1084     let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0);
1085     let expr6_0 = C::gpr_mem_to_reg_mem(ctx, pattern0_0);
1086     let expr7_0: u8 = 0;
1087     let expr8_0 = OperandSize::Size64;
1088     let expr9_0 = MInst::XmmRmRImm {
1089         op: expr4_0,
1090         src1: expr5_0,
1091         src2: expr6_0,
1092         dst: expr1_0,
1093         imm: expr7_0,
1094         size: expr8_0,
1095     };
1096     let expr10_0 = C::emit(ctx, &expr9_0);
1097     let expr11_0 = SseOpcode::Pinsrd;
1098     let expr12_0 = C::writable_reg_to_reg(ctx, expr1_0);
1099     let expr13_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0);
1100     let expr14_0: u8 = 1;
1101     let expr15_0 = OperandSize::Size64;
1102     let expr16_0 = MInst::XmmRmRImm {
1103         op: expr11_0,
1104         src1: expr12_0,
1105         src2: expr13_0,
1106         dst: expr1_0,
1107         imm: expr14_0,
1108         size: expr15_0,
1109     };
1110     let expr17_0 = C::emit(ctx, &expr16_0);
1111     let expr18_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
1112     return Some(expr18_0);
1113 }
1114 
1115 // Generated as internal constructor for term mov_rmi_to_xmm.
1116 pub fn constructor_mov_rmi_to_xmm<C: Context>(ctx: &mut C, arg0: &RegMemImm) -> Option<XmmMemImm> {
1117     let pattern0_0 = arg0;
1118     match pattern0_0 {
1119         &RegMemImm::Imm { simm32: pattern1_0 } => {
1120             // Rule at src/isa/x64/inst.isle line 1223.
1121             let expr0_0 = C::xmm_mem_imm_new(ctx, pattern0_0);
1122             return Some(expr0_0);
1123         }
1124         &RegMemImm::Reg { reg: pattern1_0 } => {
1125             // Rule at src/isa/x64/inst.isle line 1224.
1126             let expr0_0 = SseOpcode::Movd;
1127             let expr1_0 = C::reg_to_gpr_mem(ctx, pattern1_0);
1128             let expr2_0 = OperandSize::Size32;
1129             let expr3_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr1_0, &expr2_0)?;
1130             let expr4_0 = C::xmm_to_xmm_mem_imm(ctx, expr3_0);
1131             return Some(expr4_0);
1132         }
1133         &RegMemImm::Mem {
1134             addr: ref pattern1_0,
1135         } => {
1136             // Rule at src/isa/x64/inst.isle line 1222.
1137             let expr0_0 = C::xmm_mem_imm_new(ctx, pattern0_0);
1138             return Some(expr0_0);
1139         }
1140         _ => {}
1141     }
1142     return None;
1143 }
1144 
1145 // Generated as internal constructor for term x64_load.
1146 pub fn constructor_x64_load<C: Context>(
1147     ctx: &mut C,
1148     arg0: Type,
1149     arg1: &SyntheticAmode,
1150     arg2: &ExtKind,
1151 ) -> Option<Reg> {
1152     let pattern0_0 = arg0;
1153     if pattern0_0 == I64 {
1154         let pattern2_0 = arg1;
1155         let pattern3_0 = arg2;
1156         // Rule at src/isa/x64/inst.isle line 1239.
1157         let expr0_0 = C::temp_writable_gpr(ctx);
1158         let expr1_0 = MInst::Mov64MR {
1159             src: pattern2_0.clone(),
1160             dst: expr0_0,
1161         };
1162         let expr2_0 = C::emit(ctx, &expr1_0);
1163         let expr3_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
1164         return Some(expr3_0);
1165     }
1166     if pattern0_0 == F32 {
1167         let pattern2_0 = arg1;
1168         let pattern3_0 = arg2;
1169         // Rule at src/isa/x64/inst.isle line 1244.
1170         let expr0_0 = SseOpcode::Movss;
1171         let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0)?;
1172         let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?;
1173         let expr3_0 = C::xmm_to_reg(ctx, expr2_0);
1174         return Some(expr3_0);
1175     }
1176     if pattern0_0 == F64 {
1177         let pattern2_0 = arg1;
1178         let pattern3_0 = arg2;
1179         // Rule at src/isa/x64/inst.isle line 1248.
1180         let expr0_0 = SseOpcode::Movsd;
1181         let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0)?;
1182         let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?;
1183         let expr3_0 = C::xmm_to_reg(ctx, expr2_0);
1184         return Some(expr3_0);
1185     }
1186     if pattern0_0 == F32X4 {
1187         let pattern2_0 = arg1;
1188         let pattern3_0 = arg2;
1189         // Rule at src/isa/x64/inst.isle line 1252.
1190         let expr0_0 = SseOpcode::Movups;
1191         let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0)?;
1192         let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?;
1193         let expr3_0 = C::xmm_to_reg(ctx, expr2_0);
1194         return Some(expr3_0);
1195     }
1196     if pattern0_0 == F64X2 {
1197         let pattern2_0 = arg1;
1198         let pattern3_0 = arg2;
1199         // Rule at src/isa/x64/inst.isle line 1256.
1200         let expr0_0 = SseOpcode::Movupd;
1201         let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0)?;
1202         let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?;
1203         let expr3_0 = C::xmm_to_reg(ctx, expr2_0);
1204         return Some(expr3_0);
1205     }
1206     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
1207         let pattern2_0 = arg1;
1208         let pattern3_0 = arg2;
1209         // Rule at src/isa/x64/inst.isle line 1260.
1210         let expr0_0 = SseOpcode::Movdqu;
1211         let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0)?;
1212         let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?;
1213         let expr3_0 = C::xmm_to_reg(ctx, expr2_0);
1214         return Some(expr3_0);
1215     }
1216     if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) {
1217         let pattern2_0 = arg1;
1218         let pattern3_0 = arg2;
1219         if let &ExtKind::SignExtend = pattern3_0 {
1220             // Rule at src/isa/x64/inst.isle line 1234.
1221             let expr0_0 = C::ty_bytes(ctx, pattern1_0);
1222             let expr1_0: u16 = 8;
1223             let expr2_0 = C::ext_mode(ctx, expr0_0, expr1_0);
1224             let expr3_0 = constructor_synthetic_amode_to_gpr_mem(ctx, pattern2_0)?;
1225             let expr4_0 = constructor_movsx(ctx, pattern1_0, &expr2_0, &expr3_0)?;
1226             let expr5_0 = C::gpr_to_reg(ctx, expr4_0);
1227             return Some(expr5_0);
1228         }
1229     }
1230     return None;
1231 }
1232 
1233 // Generated as internal constructor for term xmm_load_const.
1234 pub fn constructor_xmm_load_const<C: Context>(
1235     ctx: &mut C,
1236     arg0: Type,
1237     arg1: VCodeConstant,
1238 ) -> Option<Xmm> {
1239     let pattern0_0 = arg0;
1240     let pattern1_0 = arg1;
1241     // Rule at src/isa/x64/inst.isle line 1266.
1242     let expr0_0 = C::temp_writable_xmm(ctx);
1243     let expr1_0 = C::writable_xmm_to_reg(ctx, expr0_0);
1244     let expr2_0 = MInst::XmmLoadConst {
1245         src: pattern1_0,
1246         dst: expr1_0,
1247         ty: pattern0_0,
1248     };
1249     let expr3_0 = C::emit(ctx, &expr2_0);
1250     let expr4_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
1251     return Some(expr4_0);
1252 }
1253 
1254 // Generated as internal constructor for term alu_rmi_r.
1255 pub fn constructor_alu_rmi_r<C: Context>(
1256     ctx: &mut C,
1257     arg0: Type,
1258     arg1: &AluRmiROpcode,
1259     arg2: Gpr,
1260     arg3: &GprMemImm,
1261 ) -> Option<Gpr> {
1262     let pattern0_0 = arg0;
1263     let pattern1_0 = arg1;
1264     let pattern2_0 = arg2;
1265     let pattern3_0 = arg3;
1266     // Rule at src/isa/x64/inst.isle line 1279.
1267     let expr0_0 = C::temp_writable_gpr(ctx);
1268     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
1269     let expr2_0 = MInst::AluRmiR {
1270         size: expr1_0,
1271         op: pattern1_0.clone(),
1272         src1: pattern2_0,
1273         src2: pattern3_0.clone(),
1274         dst: expr0_0,
1275     };
1276     let expr3_0 = C::emit(ctx, &expr2_0);
1277     let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
1278     return Some(expr4_0);
1279 }
1280 
1281 // Generated as internal constructor for term add.
1282 pub fn constructor_add<C: Context>(
1283     ctx: &mut C,
1284     arg0: Type,
1285     arg1: Gpr,
1286     arg2: &GprMemImm,
1287 ) -> Option<Gpr> {
1288     let pattern0_0 = arg0;
1289     let pattern1_0 = arg1;
1290     let pattern2_0 = arg2;
1291     // Rule at src/isa/x64/inst.isle line 1287.
1292     let expr0_0 = AluRmiROpcode::Add;
1293     let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1294     return Some(expr1_0);
1295 }
1296 
1297 // Generated as internal constructor for term add_with_flags_paired.
1298 pub fn constructor_add_with_flags_paired<C: Context>(
1299     ctx: &mut C,
1300     arg0: Type,
1301     arg1: Gpr,
1302     arg2: &GprMemImm,
1303 ) -> Option<ProducesFlags> {
1304     let pattern0_0 = arg0;
1305     let pattern1_0 = arg1;
1306     let pattern2_0 = arg2;
1307     // Rule at src/isa/x64/inst.isle line 1295.
1308     let expr0_0 = C::temp_writable_gpr(ctx);
1309     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
1310     let expr2_0 = AluRmiROpcode::Add;
1311     let expr3_0 = MInst::AluRmiR {
1312         size: expr1_0,
1313         op: expr2_0,
1314         src1: pattern1_0,
1315         src2: pattern2_0.clone(),
1316         dst: expr0_0,
1317     };
1318     let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
1319     let expr5_0 = ProducesFlags::ProducesFlagsReturnsResultWithConsumer {
1320         inst: expr3_0,
1321         result: expr4_0,
1322     };
1323     return Some(expr5_0);
1324 }
1325 
1326 // Generated as internal constructor for term adc_paired.
1327 pub fn constructor_adc_paired<C: Context>(
1328     ctx: &mut C,
1329     arg0: Type,
1330     arg1: Gpr,
1331     arg2: &GprMemImm,
1332 ) -> Option<ConsumesFlags> {
1333     let pattern0_0 = arg0;
1334     let pattern1_0 = arg1;
1335     let pattern2_0 = arg2;
1336     // Rule at src/isa/x64/inst.isle line 1307.
1337     let expr0_0 = C::temp_writable_gpr(ctx);
1338     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
1339     let expr2_0 = AluRmiROpcode::Adc;
1340     let expr3_0 = MInst::AluRmiR {
1341         size: expr1_0,
1342         op: expr2_0,
1343         src1: pattern1_0,
1344         src2: pattern2_0.clone(),
1345         dst: expr0_0,
1346     };
1347     let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
1348     let expr5_0 = ConsumesFlags::ConsumesFlagsReturnsResultWithProducer {
1349         inst: expr3_0,
1350         result: expr4_0,
1351     };
1352     return Some(expr5_0);
1353 }
1354 
1355 // Generated as internal constructor for term sub.
1356 pub fn constructor_sub<C: Context>(
1357     ctx: &mut C,
1358     arg0: Type,
1359     arg1: Gpr,
1360     arg2: &GprMemImm,
1361 ) -> Option<Gpr> {
1362     let pattern0_0 = arg0;
1363     let pattern1_0 = arg1;
1364     let pattern2_0 = arg2;
1365     // Rule at src/isa/x64/inst.isle line 1319.
1366     let expr0_0 = AluRmiROpcode::Sub;
1367     let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1368     return Some(expr1_0);
1369 }
1370 
1371 // Generated as internal constructor for term sub_with_flags_paired.
1372 pub fn constructor_sub_with_flags_paired<C: Context>(
1373     ctx: &mut C,
1374     arg0: Type,
1375     arg1: Gpr,
1376     arg2: &GprMemImm,
1377 ) -> Option<ProducesFlags> {
1378     let pattern0_0 = arg0;
1379     let pattern1_0 = arg1;
1380     let pattern2_0 = arg2;
1381     // Rule at src/isa/x64/inst.isle line 1327.
1382     let expr0_0 = C::temp_writable_gpr(ctx);
1383     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
1384     let expr2_0 = AluRmiROpcode::Sub;
1385     let expr3_0 = MInst::AluRmiR {
1386         size: expr1_0,
1387         op: expr2_0,
1388         src1: pattern1_0,
1389         src2: pattern2_0.clone(),
1390         dst: expr0_0,
1391     };
1392     let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
1393     let expr5_0 = ProducesFlags::ProducesFlagsReturnsResultWithConsumer {
1394         inst: expr3_0,
1395         result: expr4_0,
1396     };
1397     return Some(expr5_0);
1398 }
1399 
1400 // Generated as internal constructor for term sbb_paired.
1401 pub fn constructor_sbb_paired<C: Context>(
1402     ctx: &mut C,
1403     arg0: Type,
1404     arg1: Gpr,
1405     arg2: &GprMemImm,
1406 ) -> Option<ConsumesFlags> {
1407     let pattern0_0 = arg0;
1408     let pattern1_0 = arg1;
1409     let pattern2_0 = arg2;
1410     // Rule at src/isa/x64/inst.isle line 1339.
1411     let expr0_0 = C::temp_writable_gpr(ctx);
1412     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
1413     let expr2_0 = AluRmiROpcode::Sbb;
1414     let expr3_0 = MInst::AluRmiR {
1415         size: expr1_0,
1416         op: expr2_0,
1417         src1: pattern1_0,
1418         src2: pattern2_0.clone(),
1419         dst: expr0_0,
1420     };
1421     let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
1422     let expr5_0 = ConsumesFlags::ConsumesFlagsReturnsResultWithProducer {
1423         inst: expr3_0,
1424         result: expr4_0,
1425     };
1426     return Some(expr5_0);
1427 }
1428 
1429 // Generated as internal constructor for term mul.
1430 pub fn constructor_mul<C: Context>(
1431     ctx: &mut C,
1432     arg0: Type,
1433     arg1: Gpr,
1434     arg2: &GprMemImm,
1435 ) -> Option<Gpr> {
1436     let pattern0_0 = arg0;
1437     let pattern1_0 = arg1;
1438     let pattern2_0 = arg2;
1439     // Rule at src/isa/x64/inst.isle line 1351.
1440     let expr0_0 = AluRmiROpcode::Mul;
1441     let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1442     return Some(expr1_0);
1443 }
1444 
1445 // Generated as internal constructor for term x64_and.
1446 pub fn constructor_x64_and<C: Context>(
1447     ctx: &mut C,
1448     arg0: Type,
1449     arg1: Gpr,
1450     arg2: &GprMemImm,
1451 ) -> Option<Gpr> {
1452     let pattern0_0 = arg0;
1453     let pattern1_0 = arg1;
1454     let pattern2_0 = arg2;
1455     // Rule at src/isa/x64/inst.isle line 1359.
1456     let expr0_0 = AluRmiROpcode::And;
1457     let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1458     return Some(expr1_0);
1459 }
1460 
1461 // Generated as internal constructor for term or.
1462 pub fn constructor_or<C: Context>(
1463     ctx: &mut C,
1464     arg0: Type,
1465     arg1: Gpr,
1466     arg2: &GprMemImm,
1467 ) -> Option<Gpr> {
1468     let pattern0_0 = arg0;
1469     let pattern1_0 = arg1;
1470     let pattern2_0 = arg2;
1471     // Rule at src/isa/x64/inst.isle line 1367.
1472     let expr0_0 = AluRmiROpcode::Or;
1473     let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1474     return Some(expr1_0);
1475 }
1476 
1477 // Generated as internal constructor for term xor.
1478 pub fn constructor_xor<C: Context>(
1479     ctx: &mut C,
1480     arg0: Type,
1481     arg1: Gpr,
1482     arg2: &GprMemImm,
1483 ) -> Option<Gpr> {
1484     let pattern0_0 = arg0;
1485     let pattern1_0 = arg1;
1486     let pattern2_0 = arg2;
1487     // Rule at src/isa/x64/inst.isle line 1375.
1488     let expr0_0 = AluRmiROpcode::Xor;
1489     let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1490     return Some(expr1_0);
1491 }
1492 
1493 // Generated as internal constructor for term imm.
1494 pub fn constructor_imm<C: Context>(ctx: &mut C, arg0: Type, arg1: u64) -> Option<Reg> {
1495     let pattern0_0 = arg0;
1496     if pattern0_0 == I64 {
1497         let pattern2_0 = arg1;
1498         if let Some(pattern3_0) = C::nonzero_u64_fits_in_u32(ctx, pattern2_0) {
1499             // Rule at src/isa/x64/inst.isle line 1415.
1500             let expr0_0 = C::temp_writable_gpr(ctx);
1501             let expr1_0 = OperandSize::Size32;
1502             let expr2_0 = MInst::Imm {
1503                 dst_size: expr1_0,
1504                 simm64: pattern3_0,
1505                 dst: expr0_0,
1506             };
1507             let expr3_0 = C::emit(ctx, &expr2_0);
1508             let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
1509             return Some(expr4_0);
1510         }
1511     }
1512     if pattern0_0 == F32 {
1513         let pattern2_0 = arg1;
1514         if pattern2_0 == 0 {
1515             // Rule at src/isa/x64/inst.isle line 1444.
1516             let expr0_0 = C::temp_writable_xmm(ctx);
1517             let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
1518             let expr2_0 = SseOpcode::Xorps;
1519             let expr3_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
1520             let expr4_0 = MInst::XmmRmR {
1521                 op: expr2_0,
1522                 src1: expr1_0,
1523                 src2: expr3_0,
1524                 dst: expr0_0,
1525             };
1526             let expr5_0 = C::emit(ctx, &expr4_0);
1527             let expr6_0 = C::xmm_to_reg(ctx, expr1_0);
1528             return Some(expr6_0);
1529         }
1530         // Rule at src/isa/x64/inst.isle line 1392.
1531         let expr0_0 = SseOpcode::Movd;
1532         let expr1_0: Type = I32;
1533         let expr2_0 = constructor_imm(ctx, expr1_0, pattern2_0)?;
1534         let expr3_0 = C::reg_to_gpr_mem(ctx, expr2_0);
1535         let expr4_0 = OperandSize::Size32;
1536         let expr5_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr3_0, &expr4_0)?;
1537         let expr6_0 = C::xmm_to_reg(ctx, expr5_0);
1538         return Some(expr6_0);
1539     }
1540     if pattern0_0 == F64 {
1541         let pattern2_0 = arg1;
1542         if pattern2_0 == 0 {
1543             // Rule at src/isa/x64/inst.isle line 1456.
1544             let expr0_0 = C::temp_writable_xmm(ctx);
1545             let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
1546             let expr2_0 = SseOpcode::Xorpd;
1547             let expr3_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
1548             let expr4_0 = MInst::XmmRmR {
1549                 op: expr2_0,
1550                 src1: expr1_0,
1551                 src2: expr3_0,
1552                 dst: expr0_0,
1553             };
1554             let expr5_0 = C::emit(ctx, &expr4_0);
1555             let expr6_0 = C::xmm_to_reg(ctx, expr1_0);
1556             return Some(expr6_0);
1557         }
1558         // Rule at src/isa/x64/inst.isle line 1398.
1559         let expr0_0 = SseOpcode::Movq;
1560         let expr1_0: Type = I64;
1561         let expr2_0 = constructor_imm(ctx, expr1_0, pattern2_0)?;
1562         let expr3_0 = C::reg_to_gpr_mem(ctx, expr2_0);
1563         let expr4_0 = OperandSize::Size64;
1564         let expr5_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr3_0, &expr4_0)?;
1565         let expr6_0 = C::xmm_to_reg(ctx, expr5_0);
1566         return Some(expr6_0);
1567     }
1568     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
1569         let pattern2_0 = arg1;
1570         if pattern2_0 == 0 {
1571             // Rule at src/isa/x64/inst.isle line 1434.
1572             let expr0_0 = C::temp_writable_xmm(ctx);
1573             let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
1574             let expr2_0 = constructor_sse_xor_op(ctx, pattern0_0)?;
1575             let expr3_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
1576             let expr4_0 = MInst::XmmRmR {
1577                 op: expr2_0,
1578                 src1: expr1_0,
1579                 src2: expr3_0,
1580                 dst: expr0_0,
1581             };
1582             let expr5_0 = C::emit(ctx, &expr4_0);
1583             let expr6_0 = C::xmm_to_reg(ctx, expr1_0);
1584             return Some(expr6_0);
1585         }
1586     }
1587     if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) {
1588         let pattern2_0 = arg1;
1589         if pattern2_0 == 0 {
1590             // Rule at src/isa/x64/inst.isle line 1421.
1591             let expr0_0 = C::temp_writable_gpr(ctx);
1592             let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
1593             let expr2_0 = C::operand_size_of_type_32_64(ctx, pattern1_0);
1594             let expr3_0 = AluRmiROpcode::Xor;
1595             let expr4_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0);
1596             let expr5_0 = MInst::AluRmiR {
1597                 size: expr2_0,
1598                 op: expr3_0,
1599                 src1: expr1_0,
1600                 src2: expr4_0,
1601                 dst: expr0_0,
1602             };
1603             let expr6_0 = C::emit(ctx, &expr5_0);
1604             let expr7_0 = C::gpr_to_reg(ctx, expr1_0);
1605             return Some(expr7_0);
1606         }
1607         // Rule at src/isa/x64/inst.isle line 1385.
1608         let expr0_0 = C::temp_writable_gpr(ctx);
1609         let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern1_0);
1610         let expr2_0 = MInst::Imm {
1611             dst_size: expr1_0,
1612             simm64: pattern2_0,
1613             dst: expr0_0,
1614         };
1615         let expr3_0 = C::emit(ctx, &expr2_0);
1616         let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
1617         return Some(expr4_0);
1618     }
1619     return None;
1620 }
1621 
1622 // Generated as internal constructor for term imm_i64.
1623 pub fn constructor_imm_i64<C: Context>(ctx: &mut C, arg0: Type, arg1: i64) -> Option<Reg> {
1624     let pattern0_0 = arg0;
1625     let pattern1_0 = arg1;
1626     // Rule at src/isa/x64/inst.isle line 1407.
1627     let expr0_0 = C::i64_as_u64(ctx, pattern1_0);
1628     let expr1_0 = constructor_imm(ctx, pattern0_0, expr0_0)?;
1629     return Some(expr1_0);
1630 }
1631 
1632 // Generated as internal constructor for term shift_r.
1633 pub fn constructor_shift_r<C: Context>(
1634     ctx: &mut C,
1635     arg0: Type,
1636     arg1: &ShiftKind,
1637     arg2: Gpr,
1638     arg3: &Imm8Gpr,
1639 ) -> Option<Gpr> {
1640     let pattern0_0 = arg0;
1641     let pattern1_0 = arg1;
1642     let pattern2_0 = arg2;
1643     let pattern3_0 = arg3;
1644     // Rule at src/isa/x64/inst.isle line 1469.
1645     let expr0_0 = C::temp_writable_gpr(ctx);
1646     let expr1_0 = C::raw_operand_size_of_type(ctx, pattern0_0);
1647     let expr2_0 = MInst::ShiftR {
1648         size: expr1_0,
1649         kind: pattern1_0.clone(),
1650         src: pattern2_0,
1651         num_bits: pattern3_0.clone(),
1652         dst: expr0_0,
1653     };
1654     let expr3_0 = C::emit(ctx, &expr2_0);
1655     let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
1656     return Some(expr4_0);
1657 }
1658 
1659 // Generated as internal constructor for term x64_rotl.
1660 pub fn constructor_x64_rotl<C: Context>(
1661     ctx: &mut C,
1662     arg0: Type,
1663     arg1: Gpr,
1664     arg2: &Imm8Gpr,
1665 ) -> Option<Gpr> {
1666     let pattern0_0 = arg0;
1667     let pattern1_0 = arg1;
1668     let pattern2_0 = arg2;
1669     // Rule at src/isa/x64/inst.isle line 1479.
1670     let expr0_0 = ShiftKind::RotateLeft;
1671     let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1672     return Some(expr1_0);
1673 }
1674 
1675 // Generated as internal constructor for term x64_rotr.
1676 pub fn constructor_x64_rotr<C: Context>(
1677     ctx: &mut C,
1678     arg0: Type,
1679     arg1: Gpr,
1680     arg2: &Imm8Gpr,
1681 ) -> Option<Gpr> {
1682     let pattern0_0 = arg0;
1683     let pattern1_0 = arg1;
1684     let pattern2_0 = arg2;
1685     // Rule at src/isa/x64/inst.isle line 1484.
1686     let expr0_0 = ShiftKind::RotateRight;
1687     let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1688     return Some(expr1_0);
1689 }
1690 
1691 // Generated as internal constructor for term shl.
1692 pub fn constructor_shl<C: Context>(
1693     ctx: &mut C,
1694     arg0: Type,
1695     arg1: Gpr,
1696     arg2: &Imm8Gpr,
1697 ) -> Option<Gpr> {
1698     let pattern0_0 = arg0;
1699     let pattern1_0 = arg1;
1700     let pattern2_0 = arg2;
1701     // Rule at src/isa/x64/inst.isle line 1489.
1702     let expr0_0 = ShiftKind::ShiftLeft;
1703     let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1704     return Some(expr1_0);
1705 }
1706 
1707 // Generated as internal constructor for term shr.
1708 pub fn constructor_shr<C: Context>(
1709     ctx: &mut C,
1710     arg0: Type,
1711     arg1: Gpr,
1712     arg2: &Imm8Gpr,
1713 ) -> Option<Gpr> {
1714     let pattern0_0 = arg0;
1715     let pattern1_0 = arg1;
1716     let pattern2_0 = arg2;
1717     // Rule at src/isa/x64/inst.isle line 1494.
1718     let expr0_0 = ShiftKind::ShiftRightLogical;
1719     let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1720     return Some(expr1_0);
1721 }
1722 
1723 // Generated as internal constructor for term sar.
1724 pub fn constructor_sar<C: Context>(
1725     ctx: &mut C,
1726     arg0: Type,
1727     arg1: Gpr,
1728     arg2: &Imm8Gpr,
1729 ) -> Option<Gpr> {
1730     let pattern0_0 = arg0;
1731     let pattern1_0 = arg1;
1732     let pattern2_0 = arg2;
1733     // Rule at src/isa/x64/inst.isle line 1499.
1734     let expr0_0 = ShiftKind::ShiftRightArithmetic;
1735     let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1736     return Some(expr1_0);
1737 }
1738 
1739 // Generated as internal constructor for term cmp_rmi_r.
1740 pub fn constructor_cmp_rmi_r<C: Context>(
1741     ctx: &mut C,
1742     arg0: &OperandSize,
1743     arg1: &CmpOpcode,
1744     arg2: &GprMemImm,
1745     arg3: Gpr,
1746 ) -> Option<ProducesFlags> {
1747     let pattern0_0 = arg0;
1748     let pattern1_0 = arg1;
1749     let pattern2_0 = arg2;
1750     let pattern3_0 = arg3;
1751     // Rule at src/isa/x64/inst.isle line 1504.
1752     let expr0_0 = MInst::CmpRmiR {
1753         size: pattern0_0.clone(),
1754         opcode: pattern1_0.clone(),
1755         src: pattern2_0.clone(),
1756         dst: pattern3_0,
1757     };
1758     let expr1_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr0_0 };
1759     return Some(expr1_0);
1760 }
1761 
1762 // Generated as internal constructor for term cmp.
1763 pub fn constructor_cmp<C: Context>(
1764     ctx: &mut C,
1765     arg0: &OperandSize,
1766     arg1: &GprMemImm,
1767     arg2: Gpr,
1768 ) -> Option<ProducesFlags> {
1769     let pattern0_0 = arg0;
1770     let pattern1_0 = arg1;
1771     let pattern2_0 = arg2;
1772     // Rule at src/isa/x64/inst.isle line 1513.
1773     let expr0_0 = CmpOpcode::Cmp;
1774     let expr1_0 = constructor_cmp_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1775     return Some(expr1_0);
1776 }
1777 
1778 // Generated as internal constructor for term cmp_imm.
1779 pub fn constructor_cmp_imm<C: Context>(
1780     ctx: &mut C,
1781     arg0: &OperandSize,
1782     arg1: u32,
1783     arg2: Gpr,
1784 ) -> Option<ProducesFlags> {
1785     let pattern0_0 = arg0;
1786     let pattern1_0 = arg1;
1787     let pattern2_0 = arg2;
1788     // Rule at src/isa/x64/inst.isle line 1518.
1789     let expr0_0 = CmpOpcode::Cmp;
1790     let expr1_0 = RegMemImm::Imm { simm32: pattern1_0 };
1791     let expr2_0 = C::gpr_mem_imm_new(ctx, &expr1_0);
1792     let expr3_0 = constructor_cmp_rmi_r(ctx, pattern0_0, &expr0_0, &expr2_0, pattern2_0)?;
1793     return Some(expr3_0);
1794 }
1795 
1796 // Generated as internal constructor for term xmm_cmp_rm_r.
1797 pub fn constructor_xmm_cmp_rm_r<C: Context>(
1798     ctx: &mut C,
1799     arg0: &SseOpcode,
1800     arg1: &XmmMem,
1801     arg2: Xmm,
1802 ) -> Option<ProducesFlags> {
1803     let pattern0_0 = arg0;
1804     let pattern1_0 = arg1;
1805     let pattern2_0 = arg2;
1806     // Rule at src/isa/x64/inst.isle line 1523.
1807     let expr0_0 = MInst::XmmCmpRmR {
1808         op: pattern0_0.clone(),
1809         src: pattern1_0.clone(),
1810         dst: pattern2_0,
1811     };
1812     let expr1_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr0_0 };
1813     return Some(expr1_0);
1814 }
1815 
1816 // Generated as internal constructor for term fpcmp.
1817 pub fn constructor_fpcmp<C: Context>(
1818     ctx: &mut C,
1819     arg0: Value,
1820     arg1: Value,
1821 ) -> Option<ProducesFlags> {
1822     let pattern0_0 = arg0;
1823     let pattern1_0 = C::value_type(ctx, pattern0_0);
1824     if pattern1_0 == F32 {
1825         let pattern3_0 = arg1;
1826         // Rule at src/isa/x64/inst.isle line 1530.
1827         let expr0_0 = SseOpcode::Ucomiss;
1828         let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern0_0)?;
1829         let expr2_0 = constructor_put_in_xmm(ctx, pattern3_0)?;
1830         let expr3_0 = constructor_xmm_cmp_rm_r(ctx, &expr0_0, &expr1_0, expr2_0)?;
1831         return Some(expr3_0);
1832     }
1833     if pattern1_0 == F64 {
1834         let pattern3_0 = arg1;
1835         // Rule at src/isa/x64/inst.isle line 1532.
1836         let expr0_0 = SseOpcode::Ucomisd;
1837         let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern0_0)?;
1838         let expr2_0 = constructor_put_in_xmm(ctx, pattern3_0)?;
1839         let expr3_0 = constructor_xmm_cmp_rm_r(ctx, &expr0_0, &expr1_0, expr2_0)?;
1840         return Some(expr3_0);
1841     }
1842     return None;
1843 }
1844 
1845 // Generated as internal constructor for term test.
1846 pub fn constructor_test<C: Context>(
1847     ctx: &mut C,
1848     arg0: &OperandSize,
1849     arg1: &GprMemImm,
1850     arg2: Gpr,
1851 ) -> Option<ProducesFlags> {
1852     let pattern0_0 = arg0;
1853     let pattern1_0 = arg1;
1854     let pattern2_0 = arg2;
1855     // Rule at src/isa/x64/inst.isle line 1537.
1856     let expr0_0 = CmpOpcode::Test;
1857     let expr1_0 = constructor_cmp_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1858     return Some(expr1_0);
1859 }
1860 
1861 // Generated as internal constructor for term cmove.
1862 pub fn constructor_cmove<C: Context>(
1863     ctx: &mut C,
1864     arg0: Type,
1865     arg1: &CC,
1866     arg2: &GprMem,
1867     arg3: Gpr,
1868 ) -> Option<ConsumesFlags> {
1869     let pattern0_0 = arg0;
1870     let pattern1_0 = arg1;
1871     let pattern2_0 = arg2;
1872     let pattern3_0 = arg3;
1873     // Rule at src/isa/x64/inst.isle line 1544.
1874     let expr0_0 = C::temp_writable_gpr(ctx);
1875     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
1876     let expr2_0 = MInst::Cmove {
1877         size: expr1_0,
1878         cc: pattern1_0.clone(),
1879         consequent: pattern2_0.clone(),
1880         alternative: pattern3_0,
1881         dst: expr0_0,
1882     };
1883     let expr3_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
1884     let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsReg {
1885         inst: expr2_0,
1886         result: expr3_0,
1887     };
1888     return Some(expr4_0);
1889 }
1890 
1891 // Generated as internal constructor for term cmove_xmm.
1892 pub fn constructor_cmove_xmm<C: Context>(
1893     ctx: &mut C,
1894     arg0: Type,
1895     arg1: &CC,
1896     arg2: &XmmMem,
1897     arg3: Xmm,
1898 ) -> Option<ConsumesFlags> {
1899     let pattern0_0 = arg0;
1900     let pattern1_0 = arg1;
1901     let pattern2_0 = arg2;
1902     let pattern3_0 = arg3;
1903     // Rule at src/isa/x64/inst.isle line 1552.
1904     let expr0_0 = C::temp_writable_xmm(ctx);
1905     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
1906     let expr2_0 = MInst::XmmCmove {
1907         size: expr1_0,
1908         cc: pattern1_0.clone(),
1909         consequent: pattern2_0.clone(),
1910         alternative: pattern3_0,
1911         dst: expr0_0,
1912     };
1913     let expr3_0 = constructor_writable_xmm_to_r_reg(ctx, expr0_0)?;
1914     let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsReg {
1915         inst: expr2_0,
1916         result: expr3_0,
1917     };
1918     return Some(expr4_0);
1919 }
1920 
1921 // Generated as internal constructor for term cmove_from_values.
1922 pub fn constructor_cmove_from_values<C: Context>(
1923     ctx: &mut C,
1924     arg0: Type,
1925     arg1: &CC,
1926     arg2: Value,
1927     arg3: Value,
1928 ) -> Option<ConsumesFlags> {
1929     let pattern0_0 = arg0;
1930     if pattern0_0 == I128 {
1931         let pattern2_0 = arg1;
1932         let pattern3_0 = arg2;
1933         let pattern4_0 = arg3;
1934         // Rule at src/isa/x64/inst.isle line 1563.
1935         let expr0_0 = C::put_in_regs(ctx, pattern3_0);
1936         let expr1_0 = C::put_in_regs(ctx, pattern4_0);
1937         let expr2_0 = C::temp_writable_gpr(ctx);
1938         let expr3_0 = C::temp_writable_gpr(ctx);
1939         let expr4_0 = OperandSize::Size64;
1940         let expr5_0: usize = 0;
1941         let expr6_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr5_0)?;
1942         let expr7_0 = C::gpr_to_gpr_mem(ctx, expr6_0);
1943         let expr8_0: usize = 0;
1944         let expr9_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr8_0)?;
1945         let expr10_0 = MInst::Cmove {
1946             size: expr4_0,
1947             cc: pattern2_0.clone(),
1948             consequent: expr7_0,
1949             alternative: expr9_0,
1950             dst: expr2_0,
1951         };
1952         let expr11_0: usize = 1;
1953         let expr12_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr11_0)?;
1954         let expr13_0 = C::gpr_to_gpr_mem(ctx, expr12_0);
1955         let expr14_0: usize = 1;
1956         let expr15_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr14_0)?;
1957         let expr16_0 = MInst::Cmove {
1958             size: expr4_0,
1959             cc: pattern2_0.clone(),
1960             consequent: expr13_0,
1961             alternative: expr15_0,
1962             dst: expr3_0,
1963         };
1964         let expr17_0 = constructor_writable_gpr_to_r_reg(ctx, expr2_0)?;
1965         let expr18_0 = constructor_writable_gpr_to_r_reg(ctx, expr3_0)?;
1966         let expr19_0 = C::value_regs(ctx, expr17_0, expr18_0);
1967         let expr20_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs {
1968             inst1: expr10_0,
1969             inst2: expr16_0,
1970             result: expr19_0,
1971         };
1972         return Some(expr20_0);
1973     }
1974     if let Some(pattern1_0) = C::is_xmm_type(ctx, pattern0_0) {
1975         if let Some(pattern2_0) = C::is_single_register_type(ctx, pattern1_0) {
1976             let pattern3_0 = arg1;
1977             let pattern4_0 = arg2;
1978             let pattern5_0 = arg3;
1979             // Rule at src/isa/x64/inst.isle line 1587.
1980             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?;
1981             let expr1_0 = constructor_put_in_xmm(ctx, pattern5_0)?;
1982             let expr2_0 = constructor_cmove_xmm(ctx, pattern2_0, pattern3_0, &expr0_0, expr1_0)?;
1983             return Some(expr2_0);
1984         }
1985     }
1986     if let Some(pattern1_0) = C::is_gpr_type(ctx, pattern0_0) {
1987         if let Some(pattern2_0) = C::is_single_register_type(ctx, pattern1_0) {
1988             let pattern3_0 = arg1;
1989             let pattern4_0 = arg2;
1990             let pattern5_0 = arg3;
1991             // Rule at src/isa/x64/inst.isle line 1584.
1992             let expr0_0 = constructor_put_in_gpr_mem(ctx, pattern4_0)?;
1993             let expr1_0 = constructor_put_in_gpr(ctx, pattern5_0)?;
1994             let expr2_0 = constructor_cmove(ctx, pattern2_0, pattern3_0, &expr0_0, expr1_0)?;
1995             return Some(expr2_0);
1996         }
1997     }
1998     return None;
1999 }
2000 
2001 // Generated as internal constructor for term cmove_or.
2002 pub fn constructor_cmove_or<C: Context>(
2003     ctx: &mut C,
2004     arg0: Type,
2005     arg1: &CC,
2006     arg2: &CC,
2007     arg3: &GprMem,
2008     arg4: Gpr,
2009 ) -> Option<ConsumesFlags> {
2010     let pattern0_0 = arg0;
2011     let pattern1_0 = arg1;
2012     let pattern2_0 = arg2;
2013     let pattern3_0 = arg3;
2014     let pattern4_0 = arg4;
2015     // Rule at src/isa/x64/inst.isle line 1594.
2016     let expr0_0 = C::temp_writable_gpr(ctx);
2017     let expr1_0 = C::temp_writable_gpr(ctx);
2018     let expr2_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
2019     let expr3_0 = MInst::Cmove {
2020         size: expr2_0,
2021         cc: pattern1_0.clone(),
2022         consequent: pattern3_0.clone(),
2023         alternative: pattern4_0,
2024         dst: expr1_0,
2025     };
2026     let expr4_0 = C::writable_gpr_to_gpr(ctx, expr1_0);
2027     let expr5_0 = MInst::Cmove {
2028         size: expr2_0,
2029         cc: pattern2_0.clone(),
2030         consequent: pattern3_0.clone(),
2031         alternative: expr4_0,
2032         dst: expr0_0,
2033     };
2034     let expr6_0 = constructor_writable_gpr_to_value_regs(ctx, expr0_0)?;
2035     let expr7_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs {
2036         inst1: expr3_0,
2037         inst2: expr5_0,
2038         result: expr6_0,
2039     };
2040     return Some(expr7_0);
2041 }
2042 
2043 // Generated as internal constructor for term cmove_or_xmm.
2044 pub fn constructor_cmove_or_xmm<C: Context>(
2045     ctx: &mut C,
2046     arg0: Type,
2047     arg1: &CC,
2048     arg2: &CC,
2049     arg3: &XmmMem,
2050     arg4: Xmm,
2051 ) -> Option<ConsumesFlags> {
2052     let pattern0_0 = arg0;
2053     let pattern1_0 = arg1;
2054     let pattern2_0 = arg2;
2055     let pattern3_0 = arg3;
2056     let pattern4_0 = arg4;
2057     // Rule at src/isa/x64/inst.isle line 1606.
2058     let expr0_0 = C::temp_writable_xmm(ctx);
2059     let expr1_0 = C::temp_writable_xmm(ctx);
2060     let expr2_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
2061     let expr3_0 = MInst::XmmCmove {
2062         size: expr2_0,
2063         cc: pattern1_0.clone(),
2064         consequent: pattern3_0.clone(),
2065         alternative: pattern4_0,
2066         dst: expr1_0,
2067     };
2068     let expr4_0 = C::writable_xmm_to_xmm(ctx, expr1_0);
2069     let expr5_0 = MInst::XmmCmove {
2070         size: expr2_0,
2071         cc: pattern2_0.clone(),
2072         consequent: pattern3_0.clone(),
2073         alternative: expr4_0,
2074         dst: expr0_0,
2075     };
2076     let expr6_0 = constructor_writable_xmm_to_value_regs(ctx, expr0_0)?;
2077     let expr7_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs {
2078         inst1: expr3_0,
2079         inst2: expr5_0,
2080         result: expr6_0,
2081     };
2082     return Some(expr7_0);
2083 }
2084 
2085 // Generated as internal constructor for term cmove_or_from_values.
2086 pub fn constructor_cmove_or_from_values<C: Context>(
2087     ctx: &mut C,
2088     arg0: Type,
2089     arg1: &CC,
2090     arg2: &CC,
2091     arg3: Value,
2092     arg4: Value,
2093 ) -> Option<ConsumesFlags> {
2094     let pattern0_0 = arg0;
2095     if pattern0_0 == I128 {
2096         let pattern2_0 = arg1;
2097         let pattern3_0 = arg2;
2098         let pattern4_0 = arg3;
2099         let pattern5_0 = arg4;
2100         // Rule at src/isa/x64/inst.isle line 1621.
2101         let expr0_0 = C::put_in_regs(ctx, pattern4_0);
2102         let expr1_0 = C::put_in_regs(ctx, pattern5_0);
2103         let expr2_0 = C::temp_writable_gpr(ctx);
2104         let expr3_0 = C::temp_writable_gpr(ctx);
2105         let expr4_0 = C::temp_writable_gpr(ctx);
2106         let expr5_0 = C::temp_writable_gpr(ctx);
2107         let expr6_0 = OperandSize::Size64;
2108         let expr7_0: usize = 0;
2109         let expr8_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr7_0)?;
2110         let expr9_0 = C::gpr_to_gpr_mem(ctx, expr8_0);
2111         let expr10_0: usize = 0;
2112         let expr11_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr10_0)?;
2113         let expr12_0 = MInst::Cmove {
2114             size: expr6_0,
2115             cc: pattern2_0.clone(),
2116             consequent: expr9_0,
2117             alternative: expr11_0,
2118             dst: expr4_0,
2119         };
2120         let expr13_0: usize = 0;
2121         let expr14_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr13_0)?;
2122         let expr15_0 = C::gpr_to_gpr_mem(ctx, expr14_0);
2123         let expr16_0 = C::writable_gpr_to_gpr(ctx, expr4_0);
2124         let expr17_0 = MInst::Cmove {
2125             size: expr6_0,
2126             cc: pattern2_0.clone(),
2127             consequent: expr15_0,
2128             alternative: expr16_0,
2129             dst: expr2_0,
2130         };
2131         let expr18_0: usize = 1;
2132         let expr19_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr18_0)?;
2133         let expr20_0 = C::gpr_to_gpr_mem(ctx, expr19_0);
2134         let expr21_0: usize = 1;
2135         let expr22_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr21_0)?;
2136         let expr23_0 = MInst::Cmove {
2137             size: expr6_0,
2138             cc: pattern2_0.clone(),
2139             consequent: expr20_0,
2140             alternative: expr22_0,
2141             dst: expr5_0,
2142         };
2143         let expr24_0: usize = 1;
2144         let expr25_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr24_0)?;
2145         let expr26_0 = C::gpr_to_gpr_mem(ctx, expr25_0);
2146         let expr27_0 = C::writable_gpr_to_gpr(ctx, expr5_0);
2147         let expr28_0 = MInst::Cmove {
2148             size: expr6_0,
2149             cc: pattern2_0.clone(),
2150             consequent: expr26_0,
2151             alternative: expr27_0,
2152             dst: expr3_0,
2153         };
2154         let expr29_0 = constructor_writable_gpr_to_r_reg(ctx, expr2_0)?;
2155         let expr30_0 = constructor_writable_gpr_to_r_reg(ctx, expr3_0)?;
2156         let expr31_0 = C::value_regs(ctx, expr29_0, expr30_0);
2157         let expr32_0 = ConsumesFlags::ConsumesFlagsFourTimesReturnsValueRegs {
2158             inst1: expr12_0,
2159             inst2: expr17_0,
2160             inst3: expr23_0,
2161             inst4: expr28_0,
2162             result: expr31_0,
2163         };
2164         return Some(expr32_0);
2165     }
2166     if let Some(pattern1_0) = C::is_xmm_type(ctx, pattern0_0) {
2167         if let Some(pattern2_0) = C::is_single_register_type(ctx, pattern1_0) {
2168             let pattern3_0 = arg1;
2169             let pattern4_0 = arg2;
2170             let pattern5_0 = arg3;
2171             let pattern6_0 = arg4;
2172             // Rule at src/isa/x64/inst.isle line 1643.
2173             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_0)?;
2174             let expr1_0 = constructor_put_in_xmm(ctx, pattern6_0)?;
2175             let expr2_0 = constructor_cmove_or_xmm(
2176                 ctx, pattern2_0, pattern3_0, pattern4_0, &expr0_0, expr1_0,
2177             )?;
2178             return Some(expr2_0);
2179         }
2180     }
2181     if let Some(pattern1_0) = C::is_gpr_type(ctx, pattern0_0) {
2182         if let Some(pattern2_0) = C::is_single_register_type(ctx, pattern1_0) {
2183             let pattern3_0 = arg1;
2184             let pattern4_0 = arg2;
2185             let pattern5_0 = arg3;
2186             let pattern6_0 = arg4;
2187             // Rule at src/isa/x64/inst.isle line 1640.
2188             let expr0_0 = constructor_put_in_gpr_mem(ctx, pattern5_0)?;
2189             let expr1_0 = constructor_put_in_gpr(ctx, pattern6_0)?;
2190             let expr2_0 =
2191                 constructor_cmove_or(ctx, pattern2_0, pattern3_0, pattern4_0, &expr0_0, expr1_0)?;
2192             return Some(expr2_0);
2193         }
2194     }
2195     return None;
2196 }
2197 
2198 // Generated as internal constructor for term setcc.
2199 pub fn constructor_setcc<C: Context>(ctx: &mut C, arg0: &CC) -> Option<ConsumesFlags> {
2200     let pattern0_0 = arg0;
2201     // Rule at src/isa/x64/inst.isle line 1648.
2202     let expr0_0 = C::temp_writable_gpr(ctx);
2203     let expr1_0 = MInst::Setcc {
2204         cc: pattern0_0.clone(),
2205         dst: expr0_0,
2206     };
2207     let expr2_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
2208     let expr3_0 = ConsumesFlags::ConsumesFlagsReturnsReg {
2209         inst: expr1_0,
2210         result: expr2_0,
2211     };
2212     return Some(expr3_0);
2213 }
2214 
2215 // Generated as internal constructor for term movzx.
2216 pub fn constructor_movzx<C: Context>(
2217     ctx: &mut C,
2218     arg0: Type,
2219     arg1: &ExtMode,
2220     arg2: &GprMem,
2221 ) -> Option<Gpr> {
2222     let pattern0_0 = arg0;
2223     let pattern1_0 = arg1;
2224     let pattern2_0 = arg2;
2225     // Rule at src/isa/x64/inst.isle line 1656.
2226     let expr0_0 = C::temp_writable_gpr(ctx);
2227     let expr1_0 = MInst::MovzxRmR {
2228         ext_mode: pattern1_0.clone(),
2229         src: pattern2_0.clone(),
2230         dst: expr0_0,
2231     };
2232     let expr2_0 = C::emit(ctx, &expr1_0);
2233     let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
2234     return Some(expr3_0);
2235 }
2236 
2237 // Generated as internal constructor for term movsx.
2238 pub fn constructor_movsx<C: Context>(
2239     ctx: &mut C,
2240     arg0: Type,
2241     arg1: &ExtMode,
2242     arg2: &GprMem,
2243 ) -> Option<Gpr> {
2244     let pattern0_0 = arg0;
2245     let pattern1_0 = arg1;
2246     let pattern2_0 = arg2;
2247     // Rule at src/isa/x64/inst.isle line 1663.
2248     let expr0_0 = C::temp_writable_gpr(ctx);
2249     let expr1_0 = MInst::MovsxRmR {
2250         ext_mode: pattern1_0.clone(),
2251         src: pattern2_0.clone(),
2252         dst: expr0_0,
2253     };
2254     let expr2_0 = C::emit(ctx, &expr1_0);
2255     let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
2256     return Some(expr3_0);
2257 }
2258 
2259 // Generated as internal constructor for term xmm_rm_r.
2260 pub fn constructor_xmm_rm_r<C: Context>(
2261     ctx: &mut C,
2262     arg0: Type,
2263     arg1: &SseOpcode,
2264     arg2: Xmm,
2265     arg3: &XmmMem,
2266 ) -> Option<Xmm> {
2267     let pattern0_0 = arg0;
2268     let pattern1_0 = arg1;
2269     let pattern2_0 = arg2;
2270     let pattern3_0 = arg3;
2271     // Rule at src/isa/x64/inst.isle line 1670.
2272     let expr0_0 = C::temp_writable_xmm(ctx);
2273     let expr1_0 = MInst::XmmRmR {
2274         op: pattern1_0.clone(),
2275         src1: pattern2_0,
2276         src2: pattern3_0.clone(),
2277         dst: expr0_0,
2278     };
2279     let expr2_0 = C::emit(ctx, &expr1_0);
2280     let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
2281     return Some(expr3_0);
2282 }
2283 
2284 // Generated as internal constructor for term paddb.
2285 pub fn constructor_paddb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2286     let pattern0_0 = arg0;
2287     let pattern1_0 = arg1;
2288     // Rule at src/isa/x64/inst.isle line 1677.
2289     let expr0_0: Type = I8X16;
2290     let expr1_0 = SseOpcode::Paddb;
2291     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2292     return Some(expr2_0);
2293 }
2294 
2295 // Generated as internal constructor for term paddw.
2296 pub fn constructor_paddw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2297     let pattern0_0 = arg0;
2298     let pattern1_0 = arg1;
2299     // Rule at src/isa/x64/inst.isle line 1682.
2300     let expr0_0: Type = I16X8;
2301     let expr1_0 = SseOpcode::Paddw;
2302     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2303     return Some(expr2_0);
2304 }
2305 
2306 // Generated as internal constructor for term paddd.
2307 pub fn constructor_paddd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2308     let pattern0_0 = arg0;
2309     let pattern1_0 = arg1;
2310     // Rule at src/isa/x64/inst.isle line 1687.
2311     let expr0_0: Type = I32X4;
2312     let expr1_0 = SseOpcode::Paddd;
2313     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2314     return Some(expr2_0);
2315 }
2316 
2317 // Generated as internal constructor for term paddq.
2318 pub fn constructor_paddq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2319     let pattern0_0 = arg0;
2320     let pattern1_0 = arg1;
2321     // Rule at src/isa/x64/inst.isle line 1692.
2322     let expr0_0: Type = I64X2;
2323     let expr1_0 = SseOpcode::Paddq;
2324     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2325     return Some(expr2_0);
2326 }
2327 
2328 // Generated as internal constructor for term paddsb.
2329 pub fn constructor_paddsb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2330     let pattern0_0 = arg0;
2331     let pattern1_0 = arg1;
2332     // Rule at src/isa/x64/inst.isle line 1697.
2333     let expr0_0: Type = I8X16;
2334     let expr1_0 = SseOpcode::Paddsb;
2335     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2336     return Some(expr2_0);
2337 }
2338 
2339 // Generated as internal constructor for term paddsw.
2340 pub fn constructor_paddsw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2341     let pattern0_0 = arg0;
2342     let pattern1_0 = arg1;
2343     // Rule at src/isa/x64/inst.isle line 1702.
2344     let expr0_0: Type = I16X8;
2345     let expr1_0 = SseOpcode::Paddsw;
2346     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2347     return Some(expr2_0);
2348 }
2349 
2350 // Generated as internal constructor for term paddusb.
2351 pub fn constructor_paddusb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2352     let pattern0_0 = arg0;
2353     let pattern1_0 = arg1;
2354     // Rule at src/isa/x64/inst.isle line 1707.
2355     let expr0_0: Type = I8X16;
2356     let expr1_0 = SseOpcode::Paddusb;
2357     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2358     return Some(expr2_0);
2359 }
2360 
2361 // Generated as internal constructor for term paddusw.
2362 pub fn constructor_paddusw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2363     let pattern0_0 = arg0;
2364     let pattern1_0 = arg1;
2365     // Rule at src/isa/x64/inst.isle line 1712.
2366     let expr0_0: Type = I16X8;
2367     let expr1_0 = SseOpcode::Paddusw;
2368     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2369     return Some(expr2_0);
2370 }
2371 
2372 // Generated as internal constructor for term psubb.
2373 pub fn constructor_psubb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2374     let pattern0_0 = arg0;
2375     let pattern1_0 = arg1;
2376     // Rule at src/isa/x64/inst.isle line 1717.
2377     let expr0_0: Type = I8X16;
2378     let expr1_0 = SseOpcode::Psubb;
2379     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2380     return Some(expr2_0);
2381 }
2382 
2383 // Generated as internal constructor for term psubw.
2384 pub fn constructor_psubw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2385     let pattern0_0 = arg0;
2386     let pattern1_0 = arg1;
2387     // Rule at src/isa/x64/inst.isle line 1722.
2388     let expr0_0: Type = I16X8;
2389     let expr1_0 = SseOpcode::Psubw;
2390     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2391     return Some(expr2_0);
2392 }
2393 
2394 // Generated as internal constructor for term psubd.
2395 pub fn constructor_psubd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2396     let pattern0_0 = arg0;
2397     let pattern1_0 = arg1;
2398     // Rule at src/isa/x64/inst.isle line 1727.
2399     let expr0_0: Type = I32X4;
2400     let expr1_0 = SseOpcode::Psubd;
2401     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2402     return Some(expr2_0);
2403 }
2404 
2405 // Generated as internal constructor for term psubq.
2406 pub fn constructor_psubq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2407     let pattern0_0 = arg0;
2408     let pattern1_0 = arg1;
2409     // Rule at src/isa/x64/inst.isle line 1732.
2410     let expr0_0: Type = I64X2;
2411     let expr1_0 = SseOpcode::Psubq;
2412     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2413     return Some(expr2_0);
2414 }
2415 
2416 // Generated as internal constructor for term psubsb.
2417 pub fn constructor_psubsb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2418     let pattern0_0 = arg0;
2419     let pattern1_0 = arg1;
2420     // Rule at src/isa/x64/inst.isle line 1737.
2421     let expr0_0: Type = I8X16;
2422     let expr1_0 = SseOpcode::Psubsb;
2423     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2424     return Some(expr2_0);
2425 }
2426 
2427 // Generated as internal constructor for term psubsw.
2428 pub fn constructor_psubsw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2429     let pattern0_0 = arg0;
2430     let pattern1_0 = arg1;
2431     // Rule at src/isa/x64/inst.isle line 1742.
2432     let expr0_0: Type = I16X8;
2433     let expr1_0 = SseOpcode::Psubsw;
2434     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2435     return Some(expr2_0);
2436 }
2437 
2438 // Generated as internal constructor for term psubusb.
2439 pub fn constructor_psubusb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2440     let pattern0_0 = arg0;
2441     let pattern1_0 = arg1;
2442     // Rule at src/isa/x64/inst.isle line 1747.
2443     let expr0_0: Type = I8X16;
2444     let expr1_0 = SseOpcode::Psubusb;
2445     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2446     return Some(expr2_0);
2447 }
2448 
2449 // Generated as internal constructor for term psubusw.
2450 pub fn constructor_psubusw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2451     let pattern0_0 = arg0;
2452     let pattern1_0 = arg1;
2453     // Rule at src/isa/x64/inst.isle line 1752.
2454     let expr0_0: Type = I16X8;
2455     let expr1_0 = SseOpcode::Psubusw;
2456     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2457     return Some(expr2_0);
2458 }
2459 
2460 // Generated as internal constructor for term pavgb.
2461 pub fn constructor_pavgb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2462     let pattern0_0 = arg0;
2463     let pattern1_0 = arg1;
2464     // Rule at src/isa/x64/inst.isle line 1757.
2465     let expr0_0: Type = I8X16;
2466     let expr1_0 = SseOpcode::Pavgb;
2467     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2468     return Some(expr2_0);
2469 }
2470 
2471 // Generated as internal constructor for term pavgw.
2472 pub fn constructor_pavgw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2473     let pattern0_0 = arg0;
2474     let pattern1_0 = arg1;
2475     // Rule at src/isa/x64/inst.isle line 1762.
2476     let expr0_0: Type = I16X8;
2477     let expr1_0 = SseOpcode::Pavgw;
2478     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2479     return Some(expr2_0);
2480 }
2481 
2482 // Generated as internal constructor for term pand.
2483 pub fn constructor_pand<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2484     let pattern0_0 = arg0;
2485     let pattern1_0 = arg1;
2486     // Rule at src/isa/x64/inst.isle line 1767.
2487     let expr0_0: Type = F32X4;
2488     let expr1_0 = SseOpcode::Pand;
2489     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2490     return Some(expr2_0);
2491 }
2492 
2493 // Generated as internal constructor for term andps.
2494 pub fn constructor_andps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2495     let pattern0_0 = arg0;
2496     let pattern1_0 = arg1;
2497     // Rule at src/isa/x64/inst.isle line 1772.
2498     let expr0_0: Type = F32X4;
2499     let expr1_0 = SseOpcode::Andps;
2500     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2501     return Some(expr2_0);
2502 }
2503 
2504 // Generated as internal constructor for term andpd.
2505 pub fn constructor_andpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2506     let pattern0_0 = arg0;
2507     let pattern1_0 = arg1;
2508     // Rule at src/isa/x64/inst.isle line 1777.
2509     let expr0_0: Type = F64X2;
2510     let expr1_0 = SseOpcode::Andpd;
2511     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2512     return Some(expr2_0);
2513 }
2514 
2515 // Generated as internal constructor for term por.
2516 pub fn constructor_por<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2517     let pattern0_0 = arg0;
2518     let pattern1_0 = arg1;
2519     // Rule at src/isa/x64/inst.isle line 1782.
2520     let expr0_0: Type = F32X4;
2521     let expr1_0 = SseOpcode::Por;
2522     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2523     return Some(expr2_0);
2524 }
2525 
2526 // Generated as internal constructor for term orps.
2527 pub fn constructor_orps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2528     let pattern0_0 = arg0;
2529     let pattern1_0 = arg1;
2530     // Rule at src/isa/x64/inst.isle line 1787.
2531     let expr0_0: Type = F32X4;
2532     let expr1_0 = SseOpcode::Orps;
2533     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2534     return Some(expr2_0);
2535 }
2536 
2537 // Generated as internal constructor for term orpd.
2538 pub fn constructor_orpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2539     let pattern0_0 = arg0;
2540     let pattern1_0 = arg1;
2541     // Rule at src/isa/x64/inst.isle line 1792.
2542     let expr0_0: Type = F64X2;
2543     let expr1_0 = SseOpcode::Orpd;
2544     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2545     return Some(expr2_0);
2546 }
2547 
2548 // Generated as internal constructor for term pxor.
2549 pub fn constructor_pxor<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2550     let pattern0_0 = arg0;
2551     let pattern1_0 = arg1;
2552     // Rule at src/isa/x64/inst.isle line 1797.
2553     let expr0_0: Type = I8X16;
2554     let expr1_0 = SseOpcode::Pxor;
2555     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2556     return Some(expr2_0);
2557 }
2558 
2559 // Generated as internal constructor for term xorps.
2560 pub fn constructor_xorps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2561     let pattern0_0 = arg0;
2562     let pattern1_0 = arg1;
2563     // Rule at src/isa/x64/inst.isle line 1802.
2564     let expr0_0: Type = F32X4;
2565     let expr1_0 = SseOpcode::Xorps;
2566     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2567     return Some(expr2_0);
2568 }
2569 
2570 // Generated as internal constructor for term xorpd.
2571 pub fn constructor_xorpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2572     let pattern0_0 = arg0;
2573     let pattern1_0 = arg1;
2574     // Rule at src/isa/x64/inst.isle line 1807.
2575     let expr0_0: Type = F64X2;
2576     let expr1_0 = SseOpcode::Xorpd;
2577     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2578     return Some(expr2_0);
2579 }
2580 
2581 // Generated as internal constructor for term pmullw.
2582 pub fn constructor_pmullw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2583     let pattern0_0 = arg0;
2584     let pattern1_0 = arg1;
2585     // Rule at src/isa/x64/inst.isle line 1812.
2586     let expr0_0: Type = I16X8;
2587     let expr1_0 = SseOpcode::Pmullw;
2588     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2589     return Some(expr2_0);
2590 }
2591 
2592 // Generated as internal constructor for term pmulld.
2593 pub fn constructor_pmulld<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2594     let pattern0_0 = arg0;
2595     let pattern1_0 = arg1;
2596     // Rule at src/isa/x64/inst.isle line 1817.
2597     let expr0_0: Type = I16X8;
2598     let expr1_0 = SseOpcode::Pmulld;
2599     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2600     return Some(expr2_0);
2601 }
2602 
2603 // Generated as internal constructor for term pmulhw.
2604 pub fn constructor_pmulhw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2605     let pattern0_0 = arg0;
2606     let pattern1_0 = arg1;
2607     // Rule at src/isa/x64/inst.isle line 1822.
2608     let expr0_0: Type = I16X8;
2609     let expr1_0 = SseOpcode::Pmulhw;
2610     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2611     return Some(expr2_0);
2612 }
2613 
2614 // Generated as internal constructor for term pmulhuw.
2615 pub fn constructor_pmulhuw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2616     let pattern0_0 = arg0;
2617     let pattern1_0 = arg1;
2618     // Rule at src/isa/x64/inst.isle line 1827.
2619     let expr0_0: Type = I16X8;
2620     let expr1_0 = SseOpcode::Pmulhuw;
2621     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2622     return Some(expr2_0);
2623 }
2624 
2625 // Generated as internal constructor for term pmuldq.
2626 pub fn constructor_pmuldq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2627     let pattern0_0 = arg0;
2628     let pattern1_0 = arg1;
2629     // Rule at src/isa/x64/inst.isle line 1832.
2630     let expr0_0: Type = I16X8;
2631     let expr1_0 = SseOpcode::Pmuldq;
2632     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2633     return Some(expr2_0);
2634 }
2635 
2636 // Generated as internal constructor for term pmuludq.
2637 pub fn constructor_pmuludq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2638     let pattern0_0 = arg0;
2639     let pattern1_0 = arg1;
2640     // Rule at src/isa/x64/inst.isle line 1837.
2641     let expr0_0: Type = I64X2;
2642     let expr1_0 = SseOpcode::Pmuludq;
2643     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2644     return Some(expr2_0);
2645 }
2646 
2647 // Generated as internal constructor for term punpckhwd.
2648 pub fn constructor_punpckhwd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2649     let pattern0_0 = arg0;
2650     let pattern1_0 = arg1;
2651     // Rule at src/isa/x64/inst.isle line 1842.
2652     let expr0_0: Type = I16X8;
2653     let expr1_0 = SseOpcode::Punpckhwd;
2654     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2655     return Some(expr2_0);
2656 }
2657 
2658 // Generated as internal constructor for term punpcklwd.
2659 pub fn constructor_punpcklwd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2660     let pattern0_0 = arg0;
2661     let pattern1_0 = arg1;
2662     // Rule at src/isa/x64/inst.isle line 1847.
2663     let expr0_0: Type = I16X8;
2664     let expr1_0 = SseOpcode::Punpcklwd;
2665     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2666     return Some(expr2_0);
2667 }
2668 
2669 // Generated as internal constructor for term andnps.
2670 pub fn constructor_andnps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2671     let pattern0_0 = arg0;
2672     let pattern1_0 = arg1;
2673     // Rule at src/isa/x64/inst.isle line 1852.
2674     let expr0_0: Type = F32X4;
2675     let expr1_0 = SseOpcode::Andnps;
2676     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2677     return Some(expr2_0);
2678 }
2679 
2680 // Generated as internal constructor for term andnpd.
2681 pub fn constructor_andnpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2682     let pattern0_0 = arg0;
2683     let pattern1_0 = arg1;
2684     // Rule at src/isa/x64/inst.isle line 1857.
2685     let expr0_0: Type = F64X2;
2686     let expr1_0 = SseOpcode::Andnpd;
2687     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2688     return Some(expr2_0);
2689 }
2690 
2691 // Generated as internal constructor for term pandn.
2692 pub fn constructor_pandn<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2693     let pattern0_0 = arg0;
2694     let pattern1_0 = arg1;
2695     // Rule at src/isa/x64/inst.isle line 1862.
2696     let expr0_0: Type = F64X2;
2697     let expr1_0 = SseOpcode::Pandn;
2698     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2699     return Some(expr2_0);
2700 }
2701 
2702 // Generated as internal constructor for term addss.
2703 pub fn constructor_addss<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2704     let pattern0_0 = arg0;
2705     let pattern1_0 = arg1;
2706     // Rule at src/isa/x64/inst.isle line 1867.
2707     let expr0_0: Type = F32;
2708     let expr1_0 = SseOpcode::Addss;
2709     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2710     return Some(expr2_0);
2711 }
2712 
2713 // Generated as internal constructor for term addsd.
2714 pub fn constructor_addsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2715     let pattern0_0 = arg0;
2716     let pattern1_0 = arg1;
2717     // Rule at src/isa/x64/inst.isle line 1872.
2718     let expr0_0: Type = F64;
2719     let expr1_0 = SseOpcode::Addsd;
2720     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2721     return Some(expr2_0);
2722 }
2723 
2724 // Generated as internal constructor for term addps.
2725 pub fn constructor_addps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2726     let pattern0_0 = arg0;
2727     let pattern1_0 = arg1;
2728     // Rule at src/isa/x64/inst.isle line 1877.
2729     let expr0_0: Type = F32;
2730     let expr1_0 = SseOpcode::Addps;
2731     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2732     return Some(expr2_0);
2733 }
2734 
2735 // Generated as internal constructor for term addpd.
2736 pub fn constructor_addpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2737     let pattern0_0 = arg0;
2738     let pattern1_0 = arg1;
2739     // Rule at src/isa/x64/inst.isle line 1882.
2740     let expr0_0: Type = F32;
2741     let expr1_0 = SseOpcode::Addpd;
2742     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2743     return Some(expr2_0);
2744 }
2745 
2746 // Generated as internal constructor for term subss.
2747 pub fn constructor_subss<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2748     let pattern0_0 = arg0;
2749     let pattern1_0 = arg1;
2750     // Rule at src/isa/x64/inst.isle line 1887.
2751     let expr0_0: Type = F32;
2752     let expr1_0 = SseOpcode::Subss;
2753     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2754     return Some(expr2_0);
2755 }
2756 
2757 // Generated as internal constructor for term subsd.
2758 pub fn constructor_subsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2759     let pattern0_0 = arg0;
2760     let pattern1_0 = arg1;
2761     // Rule at src/isa/x64/inst.isle line 1892.
2762     let expr0_0: Type = F64;
2763     let expr1_0 = SseOpcode::Subsd;
2764     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2765     return Some(expr2_0);
2766 }
2767 
2768 // Generated as internal constructor for term subps.
2769 pub fn constructor_subps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2770     let pattern0_0 = arg0;
2771     let pattern1_0 = arg1;
2772     // Rule at src/isa/x64/inst.isle line 1897.
2773     let expr0_0: Type = F32;
2774     let expr1_0 = SseOpcode::Subps;
2775     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2776     return Some(expr2_0);
2777 }
2778 
2779 // Generated as internal constructor for term subpd.
2780 pub fn constructor_subpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2781     let pattern0_0 = arg0;
2782     let pattern1_0 = arg1;
2783     // Rule at src/isa/x64/inst.isle line 1902.
2784     let expr0_0: Type = F32;
2785     let expr1_0 = SseOpcode::Subpd;
2786     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2787     return Some(expr2_0);
2788 }
2789 
2790 // Generated as internal constructor for term mulss.
2791 pub fn constructor_mulss<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2792     let pattern0_0 = arg0;
2793     let pattern1_0 = arg1;
2794     // Rule at src/isa/x64/inst.isle line 1907.
2795     let expr0_0: Type = F32;
2796     let expr1_0 = SseOpcode::Mulss;
2797     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2798     return Some(expr2_0);
2799 }
2800 
2801 // Generated as internal constructor for term mulsd.
2802 pub fn constructor_mulsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2803     let pattern0_0 = arg0;
2804     let pattern1_0 = arg1;
2805     // Rule at src/isa/x64/inst.isle line 1912.
2806     let expr0_0: Type = F64;
2807     let expr1_0 = SseOpcode::Mulsd;
2808     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2809     return Some(expr2_0);
2810 }
2811 
2812 // Generated as internal constructor for term mulps.
2813 pub fn constructor_mulps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2814     let pattern0_0 = arg0;
2815     let pattern1_0 = arg1;
2816     // Rule at src/isa/x64/inst.isle line 1917.
2817     let expr0_0: Type = F32;
2818     let expr1_0 = SseOpcode::Mulps;
2819     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2820     return Some(expr2_0);
2821 }
2822 
2823 // Generated as internal constructor for term mulpd.
2824 pub fn constructor_mulpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2825     let pattern0_0 = arg0;
2826     let pattern1_0 = arg1;
2827     // Rule at src/isa/x64/inst.isle line 1922.
2828     let expr0_0: Type = F32;
2829     let expr1_0 = SseOpcode::Mulpd;
2830     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2831     return Some(expr2_0);
2832 }
2833 
2834 // Generated as internal constructor for term divss.
2835 pub fn constructor_divss<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2836     let pattern0_0 = arg0;
2837     let pattern1_0 = arg1;
2838     // Rule at src/isa/x64/inst.isle line 1927.
2839     let expr0_0: Type = F32;
2840     let expr1_0 = SseOpcode::Divss;
2841     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2842     return Some(expr2_0);
2843 }
2844 
2845 // Generated as internal constructor for term divsd.
2846 pub fn constructor_divsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2847     let pattern0_0 = arg0;
2848     let pattern1_0 = arg1;
2849     // Rule at src/isa/x64/inst.isle line 1932.
2850     let expr0_0: Type = F64;
2851     let expr1_0 = SseOpcode::Divsd;
2852     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2853     return Some(expr2_0);
2854 }
2855 
2856 // Generated as internal constructor for term divps.
2857 pub fn constructor_divps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2858     let pattern0_0 = arg0;
2859     let pattern1_0 = arg1;
2860     // Rule at src/isa/x64/inst.isle line 1937.
2861     let expr0_0: Type = F32;
2862     let expr1_0 = SseOpcode::Divps;
2863     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2864     return Some(expr2_0);
2865 }
2866 
2867 // Generated as internal constructor for term divpd.
2868 pub fn constructor_divpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2869     let pattern0_0 = arg0;
2870     let pattern1_0 = arg1;
2871     // Rule at src/isa/x64/inst.isle line 1942.
2872     let expr0_0: Type = F32;
2873     let expr1_0 = SseOpcode::Divpd;
2874     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2875     return Some(expr2_0);
2876 }
2877 
2878 // Generated as internal constructor for term sse_blend_op.
2879 pub fn constructor_sse_blend_op<C: Context>(ctx: &mut C, arg0: Type) -> Option<SseOpcode> {
2880     let pattern0_0 = arg0;
2881     if pattern0_0 == F32X4 {
2882         // Rule at src/isa/x64/inst.isle line 1946.
2883         let expr0_0 = SseOpcode::Blendvps;
2884         return Some(expr0_0);
2885     }
2886     if pattern0_0 == F64X2 {
2887         // Rule at src/isa/x64/inst.isle line 1947.
2888         let expr0_0 = SseOpcode::Blendvpd;
2889         return Some(expr0_0);
2890     }
2891     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
2892         // Rule at src/isa/x64/inst.isle line 1948.
2893         let expr0_0 = SseOpcode::Pblendvb;
2894         return Some(expr0_0);
2895     }
2896     return None;
2897 }
2898 
2899 // Generated as internal constructor for term sse_mov_op.
2900 pub fn constructor_sse_mov_op<C: Context>(ctx: &mut C, arg0: Type) -> Option<SseOpcode> {
2901     let pattern0_0 = arg0;
2902     if pattern0_0 == F32X4 {
2903         // Rule at src/isa/x64/inst.isle line 1951.
2904         let expr0_0 = SseOpcode::Movaps;
2905         return Some(expr0_0);
2906     }
2907     if pattern0_0 == F64X2 {
2908         // Rule at src/isa/x64/inst.isle line 1952.
2909         let expr0_0 = SseOpcode::Movapd;
2910         return Some(expr0_0);
2911     }
2912     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
2913         // Rule at src/isa/x64/inst.isle line 1953.
2914         let expr0_0 = SseOpcode::Movdqa;
2915         return Some(expr0_0);
2916     }
2917     return None;
2918 }
2919 
2920 // Generated as internal constructor for term sse_blend.
2921 pub fn constructor_sse_blend<C: Context>(
2922     ctx: &mut C,
2923     arg0: Type,
2924     arg1: &XmmMem,
2925     arg2: &XmmMem,
2926     arg3: Xmm,
2927 ) -> Option<Xmm> {
2928     let pattern0_0 = arg0;
2929     let pattern1_0 = arg1;
2930     let pattern2_0 = arg2;
2931     let pattern3_0 = arg3;
2932     // Rule at src/isa/x64/inst.isle line 1957.
2933     let expr0_0 = C::xmm0(ctx);
2934     let expr1_0 = constructor_sse_mov_op(ctx, pattern0_0)?;
2935     let expr2_0 = MInst::XmmUnaryRmR {
2936         op: expr1_0,
2937         src: pattern1_0.clone(),
2938         dst: expr0_0,
2939     };
2940     let expr3_0 = C::emit(ctx, &expr2_0);
2941     let expr4_0 = constructor_sse_blend_op(ctx, pattern0_0)?;
2942     let expr5_0 = constructor_xmm_rm_r(ctx, pattern0_0, &expr4_0, pattern3_0, pattern2_0)?;
2943     return Some(expr5_0);
2944 }
2945 
2946 // Generated as internal constructor for term blendvpd.
2947 pub fn constructor_blendvpd<C: Context>(
2948     ctx: &mut C,
2949     arg0: Xmm,
2950     arg1: &XmmMem,
2951     arg2: Xmm,
2952 ) -> Option<Xmm> {
2953     let pattern0_0 = arg0;
2954     let pattern1_0 = arg1;
2955     let pattern2_0 = arg2;
2956     // Rule at src/isa/x64/inst.isle line 1971.
2957     let expr0_0 = C::xmm0(ctx);
2958     let expr1_0 = SseOpcode::Movapd;
2959     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern2_0);
2960     let expr3_0 = MInst::XmmUnaryRmR {
2961         op: expr1_0,
2962         src: expr2_0,
2963         dst: expr0_0,
2964     };
2965     let expr4_0 = C::emit(ctx, &expr3_0);
2966     let expr5_0: Type = F64X2;
2967     let expr6_0 = SseOpcode::Blendvpd;
2968     let expr7_0 = constructor_xmm_rm_r(ctx, expr5_0, &expr6_0, pattern0_0, pattern1_0)?;
2969     return Some(expr7_0);
2970 }
2971 
2972 // Generated as internal constructor for term movsd.
2973 pub fn constructor_movsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2974     let pattern0_0 = arg0;
2975     let pattern1_0 = arg1;
2976     // Rule at src/isa/x64/inst.isle line 1985.
2977     let expr0_0: Type = I8X16;
2978     let expr1_0 = SseOpcode::Movsd;
2979     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2980     return Some(expr2_0);
2981 }
2982 
2983 // Generated as internal constructor for term movlhps.
2984 pub fn constructor_movlhps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2985     let pattern0_0 = arg0;
2986     let pattern1_0 = arg1;
2987     // Rule at src/isa/x64/inst.isle line 1990.
2988     let expr0_0: Type = I8X16;
2989     let expr1_0 = SseOpcode::Movlhps;
2990     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2991     return Some(expr2_0);
2992 }
2993 
2994 // Generated as internal constructor for term pmaxsb.
2995 pub fn constructor_pmaxsb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2996     let pattern0_0 = arg0;
2997     let pattern1_0 = arg1;
2998     // Rule at src/isa/x64/inst.isle line 1995.
2999     let expr0_0: Type = I8X16;
3000     let expr1_0 = SseOpcode::Pmaxsb;
3001     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3002     return Some(expr2_0);
3003 }
3004 
3005 // Generated as internal constructor for term pmaxsw.
3006 pub fn constructor_pmaxsw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3007     let pattern0_0 = arg0;
3008     let pattern1_0 = arg1;
3009     // Rule at src/isa/x64/inst.isle line 2000.
3010     let expr0_0: Type = I8X16;
3011     let expr1_0 = SseOpcode::Pmaxsw;
3012     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3013     return Some(expr2_0);
3014 }
3015 
3016 // Generated as internal constructor for term pmaxsd.
3017 pub fn constructor_pmaxsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3018     let pattern0_0 = arg0;
3019     let pattern1_0 = arg1;
3020     // Rule at src/isa/x64/inst.isle line 2005.
3021     let expr0_0: Type = I8X16;
3022     let expr1_0 = SseOpcode::Pmaxsd;
3023     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3024     return Some(expr2_0);
3025 }
3026 
3027 // Generated as internal constructor for term pminsb.
3028 pub fn constructor_pminsb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3029     let pattern0_0 = arg0;
3030     let pattern1_0 = arg1;
3031     // Rule at src/isa/x64/inst.isle line 2010.
3032     let expr0_0: Type = I8X16;
3033     let expr1_0 = SseOpcode::Pminsb;
3034     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3035     return Some(expr2_0);
3036 }
3037 
3038 // Generated as internal constructor for term pminsw.
3039 pub fn constructor_pminsw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3040     let pattern0_0 = arg0;
3041     let pattern1_0 = arg1;
3042     // Rule at src/isa/x64/inst.isle line 2015.
3043     let expr0_0: Type = I8X16;
3044     let expr1_0 = SseOpcode::Pminsw;
3045     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3046     return Some(expr2_0);
3047 }
3048 
3049 // Generated as internal constructor for term pminsd.
3050 pub fn constructor_pminsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3051     let pattern0_0 = arg0;
3052     let pattern1_0 = arg1;
3053     // Rule at src/isa/x64/inst.isle line 2020.
3054     let expr0_0: Type = I8X16;
3055     let expr1_0 = SseOpcode::Pminsd;
3056     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3057     return Some(expr2_0);
3058 }
3059 
3060 // Generated as internal constructor for term pmaxub.
3061 pub fn constructor_pmaxub<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3062     let pattern0_0 = arg0;
3063     let pattern1_0 = arg1;
3064     // Rule at src/isa/x64/inst.isle line 2025.
3065     let expr0_0: Type = I8X16;
3066     let expr1_0 = SseOpcode::Pmaxub;
3067     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3068     return Some(expr2_0);
3069 }
3070 
3071 // Generated as internal constructor for term pmaxuw.
3072 pub fn constructor_pmaxuw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3073     let pattern0_0 = arg0;
3074     let pattern1_0 = arg1;
3075     // Rule at src/isa/x64/inst.isle line 2030.
3076     let expr0_0: Type = I8X16;
3077     let expr1_0 = SseOpcode::Pmaxuw;
3078     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3079     return Some(expr2_0);
3080 }
3081 
3082 // Generated as internal constructor for term pmaxud.
3083 pub fn constructor_pmaxud<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3084     let pattern0_0 = arg0;
3085     let pattern1_0 = arg1;
3086     // Rule at src/isa/x64/inst.isle line 2035.
3087     let expr0_0: Type = I8X16;
3088     let expr1_0 = SseOpcode::Pmaxud;
3089     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3090     return Some(expr2_0);
3091 }
3092 
3093 // Generated as internal constructor for term pminub.
3094 pub fn constructor_pminub<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3095     let pattern0_0 = arg0;
3096     let pattern1_0 = arg1;
3097     // Rule at src/isa/x64/inst.isle line 2040.
3098     let expr0_0: Type = I8X16;
3099     let expr1_0 = SseOpcode::Pminub;
3100     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3101     return Some(expr2_0);
3102 }
3103 
3104 // Generated as internal constructor for term pminuw.
3105 pub fn constructor_pminuw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3106     let pattern0_0 = arg0;
3107     let pattern1_0 = arg1;
3108     // Rule at src/isa/x64/inst.isle line 2045.
3109     let expr0_0: Type = I8X16;
3110     let expr1_0 = SseOpcode::Pminuw;
3111     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3112     return Some(expr2_0);
3113 }
3114 
3115 // Generated as internal constructor for term pminud.
3116 pub fn constructor_pminud<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3117     let pattern0_0 = arg0;
3118     let pattern1_0 = arg1;
3119     // Rule at src/isa/x64/inst.isle line 2050.
3120     let expr0_0: Type = I8X16;
3121     let expr1_0 = SseOpcode::Pminud;
3122     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3123     return Some(expr2_0);
3124 }
3125 
3126 // Generated as internal constructor for term punpcklbw.
3127 pub fn constructor_punpcklbw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3128     let pattern0_0 = arg0;
3129     let pattern1_0 = arg1;
3130     // Rule at src/isa/x64/inst.isle line 2055.
3131     let expr0_0: Type = I8X16;
3132     let expr1_0 = SseOpcode::Punpcklbw;
3133     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3134     return Some(expr2_0);
3135 }
3136 
3137 // Generated as internal constructor for term punpckhbw.
3138 pub fn constructor_punpckhbw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3139     let pattern0_0 = arg0;
3140     let pattern1_0 = arg1;
3141     // Rule at src/isa/x64/inst.isle line 2060.
3142     let expr0_0: Type = I8X16;
3143     let expr1_0 = SseOpcode::Punpckhbw;
3144     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3145     return Some(expr2_0);
3146 }
3147 
3148 // Generated as internal constructor for term packsswb.
3149 pub fn constructor_packsswb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3150     let pattern0_0 = arg0;
3151     let pattern1_0 = arg1;
3152     // Rule at src/isa/x64/inst.isle line 2065.
3153     let expr0_0: Type = I8X16;
3154     let expr1_0 = SseOpcode::Packsswb;
3155     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3156     return Some(expr2_0);
3157 }
3158 
3159 // Generated as internal constructor for term xmm_rm_r_imm.
3160 pub fn constructor_xmm_rm_r_imm<C: Context>(
3161     ctx: &mut C,
3162     arg0: &SseOpcode,
3163     arg1: Reg,
3164     arg2: &RegMem,
3165     arg3: u8,
3166     arg4: &OperandSize,
3167 ) -> Option<Xmm> {
3168     let pattern0_0 = arg0;
3169     let pattern1_0 = arg1;
3170     let pattern2_0 = arg2;
3171     let pattern3_0 = arg3;
3172     let pattern4_0 = arg4;
3173     // Rule at src/isa/x64/inst.isle line 2070.
3174     let expr0_0 = C::temp_writable_xmm(ctx);
3175     let expr1_0 = C::writable_xmm_to_reg(ctx, expr0_0);
3176     let expr2_0 = MInst::XmmRmRImm {
3177         op: pattern0_0.clone(),
3178         src1: pattern1_0,
3179         src2: pattern2_0.clone(),
3180         dst: expr1_0,
3181         imm: pattern3_0,
3182         size: pattern4_0.clone(),
3183     };
3184     let expr3_0 = C::emit(ctx, &expr2_0);
3185     let expr4_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
3186     return Some(expr4_0);
3187 }
3188 
3189 // Generated as internal constructor for term palignr.
3190 pub fn constructor_palignr<C: Context>(
3191     ctx: &mut C,
3192     arg0: Xmm,
3193     arg1: &XmmMem,
3194     arg2: u8,
3195     arg3: &OperandSize,
3196 ) -> Option<Xmm> {
3197     let pattern0_0 = arg0;
3198     let pattern1_0 = arg1;
3199     let pattern2_0 = arg2;
3200     let pattern3_0 = arg3;
3201     // Rule at src/isa/x64/inst.isle line 2082.
3202     let expr0_0 = SseOpcode::Palignr;
3203     let expr1_0 = C::xmm_to_reg(ctx, pattern0_0);
3204     let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0);
3205     let expr3_0 =
3206         constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, pattern3_0)?;
3207     return Some(expr3_0);
3208 }
3209 
3210 // Generated as internal constructor for term cmpps.
3211 pub fn constructor_cmpps<C: Context>(
3212     ctx: &mut C,
3213     arg0: Xmm,
3214     arg1: &XmmMem,
3215     arg2: &FcmpImm,
3216 ) -> Option<Xmm> {
3217     let pattern0_0 = arg0;
3218     let pattern1_0 = arg1;
3219     let pattern2_0 = arg2;
3220     // Rule at src/isa/x64/inst.isle line 2091.
3221     let expr0_0 = SseOpcode::Cmpps;
3222     let expr1_0 = C::xmm_to_reg(ctx, pattern0_0);
3223     let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0);
3224     let expr3_0 = C::encode_fcmp_imm(ctx, pattern2_0);
3225     let expr4_0 = OperandSize::Size32;
3226     let expr5_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, expr3_0, &expr4_0)?;
3227     return Some(expr5_0);
3228 }
3229 
3230 // Generated as internal constructor for term pinsrb.
3231 pub fn constructor_pinsrb<C: Context>(
3232     ctx: &mut C,
3233     arg0: Xmm,
3234     arg1: &GprMem,
3235     arg2: u8,
3236 ) -> Option<Xmm> {
3237     let pattern0_0 = arg0;
3238     let pattern1_0 = arg1;
3239     let pattern2_0 = arg2;
3240     // Rule at src/isa/x64/inst.isle line 2100.
3241     let expr0_0 = SseOpcode::Pinsrb;
3242     let expr1_0 = C::xmm_to_reg(ctx, pattern0_0);
3243     let expr2_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0);
3244     let expr3_0 = OperandSize::Size32;
3245     let expr4_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, &expr3_0)?;
3246     return Some(expr4_0);
3247 }
3248 
3249 // Generated as internal constructor for term pinsrw.
3250 pub fn constructor_pinsrw<C: Context>(
3251     ctx: &mut C,
3252     arg0: Xmm,
3253     arg1: &GprMem,
3254     arg2: u8,
3255 ) -> Option<Xmm> {
3256     let pattern0_0 = arg0;
3257     let pattern1_0 = arg1;
3258     let pattern2_0 = arg2;
3259     // Rule at src/isa/x64/inst.isle line 2109.
3260     let expr0_0 = SseOpcode::Pinsrw;
3261     let expr1_0 = C::xmm_to_reg(ctx, pattern0_0);
3262     let expr2_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0);
3263     let expr3_0 = OperandSize::Size32;
3264     let expr4_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, &expr3_0)?;
3265     return Some(expr4_0);
3266 }
3267 
3268 // Generated as internal constructor for term pinsrd.
3269 pub fn constructor_pinsrd<C: Context>(
3270     ctx: &mut C,
3271     arg0: Xmm,
3272     arg1: &GprMem,
3273     arg2: u8,
3274     arg3: &OperandSize,
3275 ) -> Option<Xmm> {
3276     let pattern0_0 = arg0;
3277     let pattern1_0 = arg1;
3278     let pattern2_0 = arg2;
3279     let pattern3_0 = arg3;
3280     // Rule at src/isa/x64/inst.isle line 2118.
3281     let expr0_0 = SseOpcode::Pinsrd;
3282     let expr1_0 = C::xmm_to_reg(ctx, pattern0_0);
3283     let expr2_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0);
3284     let expr3_0 =
3285         constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, pattern3_0)?;
3286     return Some(expr3_0);
3287 }
3288 
3289 // Generated as internal constructor for term pmaddwd.
3290 pub fn constructor_pmaddwd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3291     let pattern0_0 = arg0;
3292     let pattern1_0 = arg1;
3293     // Rule at src/isa/x64/inst.isle line 2127.
3294     let expr0_0 = C::temp_writable_xmm(ctx);
3295     let expr1_0 = SseOpcode::Pmaddwd;
3296     let expr2_0 = MInst::XmmRmR {
3297         op: expr1_0,
3298         src1: pattern0_0,
3299         src2: pattern1_0.clone(),
3300         dst: expr0_0,
3301     };
3302     let expr3_0 = C::emit(ctx, &expr2_0);
3303     let expr4_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
3304     return Some(expr4_0);
3305 }
3306 
3307 // Generated as internal constructor for term insertps.
3308 pub fn constructor_insertps<C: Context>(
3309     ctx: &mut C,
3310     arg0: Xmm,
3311     arg1: &XmmMem,
3312     arg2: u8,
3313 ) -> Option<Xmm> {
3314     let pattern0_0 = arg0;
3315     let pattern1_0 = arg1;
3316     let pattern2_0 = arg2;
3317     // Rule at src/isa/x64/inst.isle line 2137.
3318     let expr0_0 = SseOpcode::Insertps;
3319     let expr1_0 = C::xmm_to_reg(ctx, pattern0_0);
3320     let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0);
3321     let expr3_0 = OperandSize::Size32;
3322     let expr4_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, &expr3_0)?;
3323     return Some(expr4_0);
3324 }
3325 
3326 // Generated as internal constructor for term pshufd.
3327 pub fn constructor_pshufd<C: Context>(
3328     ctx: &mut C,
3329     arg0: &XmmMem,
3330     arg1: u8,
3331     arg2: &OperandSize,
3332 ) -> Option<Xmm> {
3333     let pattern0_0 = arg0;
3334     let pattern1_0 = arg1;
3335     let pattern2_0 = arg2;
3336     // Rule at src/isa/x64/inst.isle line 2146.
3337     let expr0_0 = C::temp_writable_xmm(ctx);
3338     let expr1_0 = SseOpcode::Pshufd;
3339     let expr2_0 = constructor_writable_xmm_to_r_reg(ctx, expr0_0)?;
3340     let expr3_0 = C::xmm_mem_to_reg_mem(ctx, pattern0_0);
3341     let expr4_0 = C::writable_xmm_to_reg(ctx, expr0_0);
3342     let expr5_0 = MInst::XmmRmRImm {
3343         op: expr1_0,
3344         src1: expr2_0,
3345         src2: expr3_0,
3346         dst: expr4_0,
3347         imm: pattern1_0,
3348         size: pattern2_0.clone(),
3349     };
3350     let expr6_0 = C::emit(ctx, &expr5_0);
3351     let expr7_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
3352     return Some(expr7_0);
3353 }
3354 
3355 // Generated as internal constructor for term pshufb.
3356 pub fn constructor_pshufb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3357     let pattern0_0 = arg0;
3358     let pattern1_0 = arg1;
3359     // Rule at src/isa/x64/inst.isle line 2158.
3360     let expr0_0 = C::temp_writable_xmm(ctx);
3361     let expr1_0 = SseOpcode::Pshufb;
3362     let expr2_0 = MInst::XmmRmR {
3363         op: expr1_0,
3364         src1: pattern0_0,
3365         src2: pattern1_0.clone(),
3366         dst: expr0_0,
3367     };
3368     let expr3_0 = C::emit(ctx, &expr2_0);
3369     let expr4_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
3370     return Some(expr4_0);
3371 }
3372 
3373 // Generated as internal constructor for term xmm_unary_rm_r.
3374 pub fn constructor_xmm_unary_rm_r<C: Context>(
3375     ctx: &mut C,
3376     arg0: &SseOpcode,
3377     arg1: &XmmMem,
3378 ) -> Option<Xmm> {
3379     let pattern0_0 = arg0;
3380     let pattern1_0 = arg1;
3381     // Rule at src/isa/x64/inst.isle line 2168.
3382     let expr0_0 = C::temp_writable_xmm(ctx);
3383     let expr1_0 = MInst::XmmUnaryRmR {
3384         op: pattern0_0.clone(),
3385         src: pattern1_0.clone(),
3386         dst: expr0_0,
3387     };
3388     let expr2_0 = C::emit(ctx, &expr1_0);
3389     let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
3390     return Some(expr3_0);
3391 }
3392 
3393 // Generated as internal constructor for term pmovsxbw.
3394 pub fn constructor_pmovsxbw<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
3395     let pattern0_0 = arg0;
3396     // Rule at src/isa/x64/inst.isle line 2175.
3397     let expr0_0 = SseOpcode::Pmovsxbw;
3398     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
3399     return Some(expr1_0);
3400 }
3401 
3402 // Generated as internal constructor for term pmovzxbw.
3403 pub fn constructor_pmovzxbw<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
3404     let pattern0_0 = arg0;
3405     // Rule at src/isa/x64/inst.isle line 2180.
3406     let expr0_0 = SseOpcode::Pmovzxbw;
3407     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
3408     return Some(expr1_0);
3409 }
3410 
3411 // Generated as internal constructor for term pabsb.
3412 pub fn constructor_pabsb<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
3413     let pattern0_0 = arg0;
3414     // Rule at src/isa/x64/inst.isle line 2185.
3415     let expr0_0 = SseOpcode::Pabsb;
3416     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
3417     return Some(expr1_0);
3418 }
3419 
3420 // Generated as internal constructor for term pabsw.
3421 pub fn constructor_pabsw<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
3422     let pattern0_0 = arg0;
3423     // Rule at src/isa/x64/inst.isle line 2190.
3424     let expr0_0 = SseOpcode::Pabsw;
3425     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
3426     return Some(expr1_0);
3427 }
3428 
3429 // Generated as internal constructor for term pabsd.
3430 pub fn constructor_pabsd<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
3431     let pattern0_0 = arg0;
3432     // Rule at src/isa/x64/inst.isle line 2195.
3433     let expr0_0 = SseOpcode::Pabsd;
3434     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
3435     return Some(expr1_0);
3436 }
3437 
3438 // Generated as internal constructor for term xmm_unary_rm_r_evex.
3439 pub fn constructor_xmm_unary_rm_r_evex<C: Context>(
3440     ctx: &mut C,
3441     arg0: &Avx512Opcode,
3442     arg1: &XmmMem,
3443 ) -> Option<Xmm> {
3444     let pattern0_0 = arg0;
3445     let pattern1_0 = arg1;
3446     // Rule at src/isa/x64/inst.isle line 2200.
3447     let expr0_0 = C::temp_writable_xmm(ctx);
3448     let expr1_0 = MInst::XmmUnaryRmREvex {
3449         op: pattern0_0.clone(),
3450         src: pattern1_0.clone(),
3451         dst: expr0_0,
3452     };
3453     let expr2_0 = C::emit(ctx, &expr1_0);
3454     let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
3455     return Some(expr3_0);
3456 }
3457 
3458 // Generated as internal constructor for term vpabsq.
3459 pub fn constructor_vpabsq<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
3460     let pattern0_0 = arg0;
3461     // Rule at src/isa/x64/inst.isle line 2207.
3462     let expr0_0 = Avx512Opcode::Vpabsq;
3463     let expr1_0 = constructor_xmm_unary_rm_r_evex(ctx, &expr0_0, pattern0_0)?;
3464     return Some(expr1_0);
3465 }
3466 
3467 // Generated as internal constructor for term vpopcntb.
3468 pub fn constructor_vpopcntb<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
3469     let pattern0_0 = arg0;
3470     // Rule at src/isa/x64/inst.isle line 2212.
3471     let expr0_0 = Avx512Opcode::Vpopcntb;
3472     let expr1_0 = constructor_xmm_unary_rm_r_evex(ctx, &expr0_0, pattern0_0)?;
3473     return Some(expr1_0);
3474 }
3475 
3476 // Generated as internal constructor for term xmm_rm_r_evex.
3477 pub fn constructor_xmm_rm_r_evex<C: Context>(
3478     ctx: &mut C,
3479     arg0: &Avx512Opcode,
3480     arg1: &XmmMem,
3481     arg2: Xmm,
3482 ) -> Option<Xmm> {
3483     let pattern0_0 = arg0;
3484     let pattern1_0 = arg1;
3485     let pattern2_0 = arg2;
3486     // Rule at src/isa/x64/inst.isle line 2217.
3487     let expr0_0 = C::temp_writable_xmm(ctx);
3488     let expr1_0 = MInst::XmmRmREvex {
3489         op: pattern0_0.clone(),
3490         src1: pattern1_0.clone(),
3491         src2: pattern2_0,
3492         dst: expr0_0,
3493     };
3494     let expr2_0 = C::emit(ctx, &expr1_0);
3495     let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
3496     return Some(expr3_0);
3497 }
3498 
3499 // Generated as internal constructor for term vpmullq.
3500 pub fn constructor_vpmullq<C: Context>(ctx: &mut C, arg0: &XmmMem, arg1: Xmm) -> Option<Xmm> {
3501     let pattern0_0 = arg0;
3502     let pattern1_0 = arg1;
3503     // Rule at src/isa/x64/inst.isle line 2229.
3504     let expr0_0 = Avx512Opcode::Vpmullq;
3505     let expr1_0 = constructor_xmm_rm_r_evex(ctx, &expr0_0, pattern0_0, pattern1_0)?;
3506     return Some(expr1_0);
3507 }
3508 
3509 // Generated as internal constructor for term mul_hi.
3510 pub fn constructor_mul_hi<C: Context>(
3511     ctx: &mut C,
3512     arg0: Type,
3513     arg1: bool,
3514     arg2: Gpr,
3515     arg3: &GprMem,
3516 ) -> Option<ValueRegs> {
3517     let pattern0_0 = arg0;
3518     let pattern1_0 = arg1;
3519     let pattern2_0 = arg2;
3520     let pattern3_0 = arg3;
3521     // Rule at src/isa/x64/inst.isle line 2238.
3522     let expr0_0 = C::temp_writable_gpr(ctx);
3523     let expr1_0 = C::temp_writable_gpr(ctx);
3524     let expr2_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
3525     let expr3_0 = MInst::MulHi {
3526         size: expr2_0,
3527         signed: pattern1_0,
3528         src1: pattern2_0,
3529         src2: pattern3_0.clone(),
3530         dst_lo: expr0_0,
3531         dst_hi: expr1_0,
3532     };
3533     let expr4_0 = C::emit(ctx, &expr3_0);
3534     let expr5_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
3535     let expr6_0 = C::writable_gpr_to_gpr(ctx, expr1_0);
3536     let expr7_0 = constructor_value_gprs(ctx, expr5_0, expr6_0)?;
3537     return Some(expr7_0);
3538 }
3539 
3540 // Generated as internal constructor for term mulhi_u.
3541 pub fn constructor_mulhi_u<C: Context>(
3542     ctx: &mut C,
3543     arg0: Type,
3544     arg1: Gpr,
3545     arg2: &GprMem,
3546 ) -> Option<ValueRegs> {
3547     let pattern0_0 = arg0;
3548     let pattern1_0 = arg1;
3549     let pattern2_0 = arg2;
3550     // Rule at src/isa/x64/inst.isle line 2253.
3551     let expr0_0: bool = false;
3552     let expr1_0 = constructor_mul_hi(ctx, pattern0_0, expr0_0, pattern1_0, pattern2_0)?;
3553     return Some(expr1_0);
3554 }
3555 
3556 // Generated as internal constructor for term xmm_rmi_xmm.
3557 pub fn constructor_xmm_rmi_xmm<C: Context>(
3558     ctx: &mut C,
3559     arg0: &SseOpcode,
3560     arg1: Xmm,
3561     arg2: &XmmMemImm,
3562 ) -> Option<Xmm> {
3563     let pattern0_0 = arg0;
3564     let pattern1_0 = arg1;
3565     let pattern2_0 = arg2;
3566     // Rule at src/isa/x64/inst.isle line 2258.
3567     let expr0_0 = C::temp_writable_xmm(ctx);
3568     let expr1_0 = MInst::XmmRmiReg {
3569         opcode: pattern0_0.clone(),
3570         src1: pattern1_0,
3571         src2: pattern2_0.clone(),
3572         dst: expr0_0,
3573     };
3574     let expr2_0 = C::emit(ctx, &expr1_0);
3575     let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
3576     return Some(expr3_0);
3577 }
3578 
3579 // Generated as internal constructor for term psllw.
3580 pub fn constructor_psllw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
3581     let pattern0_0 = arg0;
3582     let pattern1_0 = arg1;
3583     // Rule at src/isa/x64/inst.isle line 2268.
3584     let expr0_0 = SseOpcode::Psllw;
3585     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
3586     return Some(expr1_0);
3587 }
3588 
3589 // Generated as internal constructor for term pslld.
3590 pub fn constructor_pslld<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
3591     let pattern0_0 = arg0;
3592     let pattern1_0 = arg1;
3593     // Rule at src/isa/x64/inst.isle line 2273.
3594     let expr0_0 = SseOpcode::Pslld;
3595     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
3596     return Some(expr1_0);
3597 }
3598 
3599 // Generated as internal constructor for term psllq.
3600 pub fn constructor_psllq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
3601     let pattern0_0 = arg0;
3602     let pattern1_0 = arg1;
3603     // Rule at src/isa/x64/inst.isle line 2278.
3604     let expr0_0 = SseOpcode::Psllq;
3605     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
3606     return Some(expr1_0);
3607 }
3608 
3609 // Generated as internal constructor for term psrlw.
3610 pub fn constructor_psrlw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
3611     let pattern0_0 = arg0;
3612     let pattern1_0 = arg1;
3613     // Rule at src/isa/x64/inst.isle line 2283.
3614     let expr0_0 = SseOpcode::Psrlw;
3615     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
3616     return Some(expr1_0);
3617 }
3618 
3619 // Generated as internal constructor for term psrld.
3620 pub fn constructor_psrld<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
3621     let pattern0_0 = arg0;
3622     let pattern1_0 = arg1;
3623     // Rule at src/isa/x64/inst.isle line 2288.
3624     let expr0_0 = SseOpcode::Psrld;
3625     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
3626     return Some(expr1_0);
3627 }
3628 
3629 // Generated as internal constructor for term psrlq.
3630 pub fn constructor_psrlq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
3631     let pattern0_0 = arg0;
3632     let pattern1_0 = arg1;
3633     // Rule at src/isa/x64/inst.isle line 2293.
3634     let expr0_0 = SseOpcode::Psrlq;
3635     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
3636     return Some(expr1_0);
3637 }
3638 
3639 // Generated as internal constructor for term psraw.
3640 pub fn constructor_psraw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
3641     let pattern0_0 = arg0;
3642     let pattern1_0 = arg1;
3643     // Rule at src/isa/x64/inst.isle line 2298.
3644     let expr0_0 = SseOpcode::Psraw;
3645     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
3646     return Some(expr1_0);
3647 }
3648 
3649 // Generated as internal constructor for term psrad.
3650 pub fn constructor_psrad<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
3651     let pattern0_0 = arg0;
3652     let pattern1_0 = arg1;
3653     // Rule at src/isa/x64/inst.isle line 2303.
3654     let expr0_0 = SseOpcode::Psrad;
3655     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
3656     return Some(expr1_0);
3657 }
3658 
3659 // Generated as internal constructor for term pextrd.
3660 pub fn constructor_pextrd<C: Context>(ctx: &mut C, arg0: Type, arg1: Xmm, arg2: u8) -> Option<Gpr> {
3661     let pattern0_0 = arg0;
3662     let pattern1_0 = arg1;
3663     let pattern2_0 = arg2;
3664     // Rule at src/isa/x64/inst.isle line 2308.
3665     let expr0_0 = C::temp_writable_gpr(ctx);
3666     let expr1_0 = SseOpcode::Pextrd;
3667     let expr2_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
3668     let expr3_0 = C::xmm_to_reg(ctx, pattern1_0);
3669     let expr4_0 = constructor_xmm_to_reg_mem(ctx, expr3_0)?;
3670     let expr5_0 = C::xmm_mem_to_reg_mem(ctx, &expr4_0);
3671     let expr6_0 = C::writable_gpr_to_reg(ctx, expr0_0);
3672     let expr7_0 = C::lane_type(ctx, pattern0_0);
3673     let expr8_0 = C::operand_size_of_type_32_64(ctx, expr7_0);
3674     let expr9_0 = MInst::XmmRmRImm {
3675         op: expr1_0,
3676         src1: expr2_0,
3677         src2: expr5_0,
3678         dst: expr6_0,
3679         imm: pattern2_0,
3680         size: expr8_0,
3681     };
3682     let expr10_0 = C::emit(ctx, &expr9_0);
3683     let expr11_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
3684     return Some(expr11_0);
3685 }
3686 
3687 // Generated as internal constructor for term cmppd.
3688 pub fn constructor_cmppd<C: Context>(
3689     ctx: &mut C,
3690     arg0: Xmm,
3691     arg1: &XmmMem,
3692     arg2: &FcmpImm,
3693 ) -> Option<Xmm> {
3694     let pattern0_0 = arg0;
3695     let pattern1_0 = arg1;
3696     let pattern2_0 = arg2;
3697     // Rule at src/isa/x64/inst.isle line 2324.
3698     let expr0_0 = SseOpcode::Cmppd;
3699     let expr1_0 = C::xmm_to_reg(ctx, pattern0_0);
3700     let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0);
3701     let expr3_0 = C::encode_fcmp_imm(ctx, pattern2_0);
3702     let expr4_0 = OperandSize::Size32;
3703     let expr5_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, expr3_0, &expr4_0)?;
3704     return Some(expr5_0);
3705 }
3706 
3707 // Generated as internal constructor for term gpr_to_xmm.
3708 pub fn constructor_gpr_to_xmm<C: Context>(
3709     ctx: &mut C,
3710     arg0: &SseOpcode,
3711     arg1: &GprMem,
3712     arg2: &OperandSize,
3713 ) -> Option<Xmm> {
3714     let pattern0_0 = arg0;
3715     let pattern1_0 = arg1;
3716     let pattern2_0 = arg2;
3717     // Rule at src/isa/x64/inst.isle line 2333.
3718     let expr0_0 = C::temp_writable_xmm(ctx);
3719     let expr1_0 = MInst::GprToXmm {
3720         op: pattern0_0.clone(),
3721         src: pattern1_0.clone(),
3722         dst: expr0_0,
3723         src_size: pattern2_0.clone(),
3724     };
3725     let expr2_0 = C::emit(ctx, &expr1_0);
3726     let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
3727     return Some(expr3_0);
3728 }
3729 
3730 // Generated as internal constructor for term not.
3731 pub fn constructor_not<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
3732     let pattern0_0 = arg0;
3733     let pattern1_0 = arg1;
3734     // Rule at src/isa/x64/inst.isle line 2340.
3735     let expr0_0 = C::temp_writable_gpr(ctx);
3736     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
3737     let expr2_0 = MInst::Not {
3738         size: expr1_0,
3739         src: pattern1_0,
3740         dst: expr0_0,
3741     };
3742     let expr3_0 = C::emit(ctx, &expr2_0);
3743     let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
3744     return Some(expr4_0);
3745 }
3746 
3747 // Generated as internal constructor for term neg.
3748 pub fn constructor_neg<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
3749     let pattern0_0 = arg0;
3750     let pattern1_0 = arg1;
3751     // Rule at src/isa/x64/inst.isle line 2348.
3752     let expr0_0 = C::temp_writable_gpr(ctx);
3753     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
3754     let expr2_0 = MInst::Neg {
3755         size: expr1_0,
3756         src: pattern1_0,
3757         dst: expr0_0,
3758     };
3759     let expr3_0 = C::emit(ctx, &expr2_0);
3760     let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
3761     return Some(expr4_0);
3762 }
3763 
3764 // Generated as internal constructor for term lea.
3765 pub fn constructor_lea<C: Context>(ctx: &mut C, arg0: &SyntheticAmode) -> Option<Gpr> {
3766     let pattern0_0 = arg0;
3767     // Rule at src/isa/x64/inst.isle line 2355.
3768     let expr0_0 = C::temp_writable_gpr(ctx);
3769     let expr1_0 = MInst::LoadEffectiveAddress {
3770         addr: pattern0_0.clone(),
3771         dst: expr0_0,
3772     };
3773     let expr2_0 = C::emit(ctx, &expr1_0);
3774     let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
3775     return Some(expr3_0);
3776 }
3777 
3778 // Generated as internal constructor for term ud2.
3779 pub fn constructor_ud2<C: Context>(ctx: &mut C, arg0: &TrapCode) -> Option<SideEffectNoResult> {
3780     let pattern0_0 = arg0;
3781     // Rule at src/isa/x64/inst.isle line 2362.
3782     let expr0_0 = MInst::Ud2 {
3783         trap_code: pattern0_0.clone(),
3784     };
3785     let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 };
3786     return Some(expr1_0);
3787 }
3788 
3789 // Generated as internal constructor for term hlt.
3790 pub fn constructor_hlt<C: Context>(ctx: &mut C) -> Option<SideEffectNoResult> {
3791     // Rule at src/isa/x64/inst.isle line 2367.
3792     let expr0_0 = MInst::Hlt;
3793     let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 };
3794     return Some(expr1_0);
3795 }
3796 
3797 // Generated as internal constructor for term lzcnt.
3798 pub fn constructor_lzcnt<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
3799     let pattern0_0 = arg0;
3800     let pattern1_0 = arg1;
3801     // Rule at src/isa/x64/inst.isle line 2372.
3802     let expr0_0 = C::temp_writable_gpr(ctx);
3803     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
3804     let expr2_0 = UnaryRmROpcode::Lzcnt;
3805     let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0);
3806     let expr4_0 = MInst::UnaryRmR {
3807         size: expr1_0,
3808         op: expr2_0,
3809         src: expr3_0,
3810         dst: expr0_0,
3811     };
3812     let expr5_0 = C::emit(ctx, &expr4_0);
3813     let expr6_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
3814     return Some(expr6_0);
3815 }
3816 
3817 // Generated as internal constructor for term tzcnt.
3818 pub fn constructor_tzcnt<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
3819     let pattern0_0 = arg0;
3820     let pattern1_0 = arg1;
3821     // Rule at src/isa/x64/inst.isle line 2380.
3822     let expr0_0 = C::temp_writable_gpr(ctx);
3823     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
3824     let expr2_0 = UnaryRmROpcode::Tzcnt;
3825     let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0);
3826     let expr4_0 = MInst::UnaryRmR {
3827         size: expr1_0,
3828         op: expr2_0,
3829         src: expr3_0,
3830         dst: expr0_0,
3831     };
3832     let expr5_0 = C::emit(ctx, &expr4_0);
3833     let expr6_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
3834     return Some(expr6_0);
3835 }
3836 
3837 // Generated as internal constructor for term bsr.
3838 pub fn constructor_bsr<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<ProducesFlags> {
3839     let pattern0_0 = arg0;
3840     let pattern1_0 = arg1;
3841     // Rule at src/isa/x64/inst.isle line 2388.
3842     let expr0_0 = C::temp_writable_gpr(ctx);
3843     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
3844     let expr2_0 = UnaryRmROpcode::Bsr;
3845     let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0);
3846     let expr4_0 = MInst::UnaryRmR {
3847         size: expr1_0,
3848         op: expr2_0,
3849         src: expr3_0,
3850         dst: expr0_0,
3851     };
3852     let expr5_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
3853     let expr6_0 = ProducesFlags::ProducesFlagsReturnsReg {
3854         inst: expr4_0,
3855         result: expr5_0,
3856     };
3857     return Some(expr6_0);
3858 }
3859 
3860 // Generated as internal constructor for term bsr_or_else.
3861 pub fn constructor_bsr_or_else<C: Context>(
3862     ctx: &mut C,
3863     arg0: Type,
3864     arg1: Gpr,
3865     arg2: Gpr,
3866 ) -> Option<Gpr> {
3867     let pattern0_0 = arg0;
3868     let pattern1_0 = arg1;
3869     let pattern2_0 = arg2;
3870     // Rule at src/isa/x64/inst.isle line 2397.
3871     let expr0_0 = constructor_bsr(ctx, pattern0_0, pattern1_0)?;
3872     let expr1_0 = constructor_produces_flags_get_reg(ctx, &expr0_0)?;
3873     let expr2_0 = C::gpr_new(ctx, expr1_0);
3874     let expr3_0 = CC::Z;
3875     let expr4_0 = C::gpr_to_gpr_mem(ctx, pattern2_0);
3876     let expr5_0 = constructor_cmove(ctx, pattern0_0, &expr3_0, &expr4_0, expr2_0)?;
3877     let expr6_0 = constructor_produces_flags_ignore(ctx, &expr0_0)?;
3878     let expr7_0 = constructor_with_flags_reg(ctx, &expr6_0, &expr5_0)?;
3879     let expr8_0 = C::gpr_new(ctx, expr7_0);
3880     return Some(expr8_0);
3881 }
3882 
3883 // Generated as internal constructor for term bsf.
3884 pub fn constructor_bsf<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<ProducesFlags> {
3885     let pattern0_0 = arg0;
3886     let pattern1_0 = arg1;
3887     // Rule at src/isa/x64/inst.isle line 2408.
3888     let expr0_0 = C::temp_writable_gpr(ctx);
3889     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
3890     let expr2_0 = UnaryRmROpcode::Bsf;
3891     let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0);
3892     let expr4_0 = MInst::UnaryRmR {
3893         size: expr1_0,
3894         op: expr2_0,
3895         src: expr3_0,
3896         dst: expr0_0,
3897     };
3898     let expr5_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
3899     let expr6_0 = ProducesFlags::ProducesFlagsReturnsReg {
3900         inst: expr4_0,
3901         result: expr5_0,
3902     };
3903     return Some(expr6_0);
3904 }
3905 
3906 // Generated as internal constructor for term bsf_or_else.
3907 pub fn constructor_bsf_or_else<C: Context>(
3908     ctx: &mut C,
3909     arg0: Type,
3910     arg1: Gpr,
3911     arg2: Gpr,
3912 ) -> Option<Gpr> {
3913     let pattern0_0 = arg0;
3914     let pattern1_0 = arg1;
3915     let pattern2_0 = arg2;
3916     // Rule at src/isa/x64/inst.isle line 2417.
3917     let expr0_0 = constructor_bsf(ctx, pattern0_0, pattern1_0)?;
3918     let expr1_0 = constructor_produces_flags_get_reg(ctx, &expr0_0)?;
3919     let expr2_0 = C::gpr_new(ctx, expr1_0);
3920     let expr3_0 = CC::Z;
3921     let expr4_0 = C::gpr_to_gpr_mem(ctx, pattern2_0);
3922     let expr5_0 = constructor_cmove(ctx, pattern0_0, &expr3_0, &expr4_0, expr2_0)?;
3923     let expr6_0 = constructor_produces_flags_ignore(ctx, &expr0_0)?;
3924     let expr7_0 = constructor_with_flags_reg(ctx, &expr6_0, &expr5_0)?;
3925     let expr8_0 = C::gpr_new(ctx, expr7_0);
3926     return Some(expr8_0);
3927 }
3928 
3929 // Generated as internal constructor for term x64_popcnt.
3930 pub fn constructor_x64_popcnt<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
3931     let pattern0_0 = arg0;
3932     let pattern1_0 = arg1;
3933     // Rule at src/isa/x64/inst.isle line 2428.
3934     let expr0_0 = C::temp_writable_gpr(ctx);
3935     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
3936     let expr2_0 = UnaryRmROpcode::Popcnt;
3937     let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0);
3938     let expr4_0 = MInst::UnaryRmR {
3939         size: expr1_0,
3940         op: expr2_0,
3941         src: expr3_0,
3942         dst: expr0_0,
3943     };
3944     let expr5_0 = C::emit(ctx, &expr4_0);
3945     let expr6_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
3946     return Some(expr6_0);
3947 }
3948 
3949 // Generated as internal constructor for term xmm_min_max_seq.
3950 pub fn constructor_xmm_min_max_seq<C: Context>(
3951     ctx: &mut C,
3952     arg0: Type,
3953     arg1: bool,
3954     arg2: Xmm,
3955     arg3: Xmm,
3956 ) -> Option<Xmm> {
3957     let pattern0_0 = arg0;
3958     let pattern1_0 = arg1;
3959     let pattern2_0 = arg2;
3960     let pattern3_0 = arg3;
3961     // Rule at src/isa/x64/inst.isle line 2436.
3962     let expr0_0 = C::temp_writable_xmm(ctx);
3963     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
3964     let expr2_0 = MInst::XmmMinMaxSeq {
3965         size: expr1_0,
3966         is_min: pattern1_0,
3967         lhs: pattern2_0,
3968         rhs: pattern3_0,
3969         dst: expr0_0,
3970     };
3971     let expr3_0 = C::emit(ctx, &expr2_0);
3972     let expr4_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
3973     return Some(expr4_0);
3974 }
3975 
3976 // Generated as internal constructor for term minss.
3977 pub fn constructor_minss<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
3978     let pattern0_0 = arg0;
3979     let pattern1_0 = arg1;
3980     // Rule at src/isa/x64/inst.isle line 2444.
3981     let expr0_0 = C::temp_writable_xmm(ctx);
3982     let expr1_0 = SseOpcode::Minss;
3983     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
3984     let expr3_0 = MInst::XmmRmR {
3985         op: expr1_0,
3986         src1: pattern0_0,
3987         src2: expr2_0,
3988         dst: expr0_0,
3989     };
3990     let expr4_0 = C::emit(ctx, &expr3_0);
3991     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
3992     return Some(expr5_0);
3993 }
3994 
3995 // Generated as internal constructor for term minsd.
3996 pub fn constructor_minsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
3997     let pattern0_0 = arg0;
3998     let pattern1_0 = arg1;
3999     // Rule at src/isa/x64/inst.isle line 2451.
4000     let expr0_0 = C::temp_writable_xmm(ctx);
4001     let expr1_0 = SseOpcode::Minsd;
4002     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
4003     let expr3_0 = MInst::XmmRmR {
4004         op: expr1_0,
4005         src1: pattern0_0,
4006         src2: expr2_0,
4007         dst: expr0_0,
4008     };
4009     let expr4_0 = C::emit(ctx, &expr3_0);
4010     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4011     return Some(expr5_0);
4012 }
4013 
4014 // Generated as internal constructor for term minps.
4015 pub fn constructor_minps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
4016     let pattern0_0 = arg0;
4017     let pattern1_0 = arg1;
4018     // Rule at src/isa/x64/inst.isle line 2459.
4019     let expr0_0 = C::temp_writable_xmm(ctx);
4020     let expr1_0 = SseOpcode::Minps;
4021     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
4022     let expr3_0 = MInst::XmmRmR {
4023         op: expr1_0,
4024         src1: pattern0_0,
4025         src2: expr2_0,
4026         dst: expr0_0,
4027     };
4028     let expr4_0 = C::emit(ctx, &expr3_0);
4029     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4030     return Some(expr5_0);
4031 }
4032 
4033 // Generated as internal constructor for term minpd.
4034 pub fn constructor_minpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
4035     let pattern0_0 = arg0;
4036     let pattern1_0 = arg1;
4037     // Rule at src/isa/x64/inst.isle line 2466.
4038     let expr0_0 = C::temp_writable_xmm(ctx);
4039     let expr1_0 = SseOpcode::Minpd;
4040     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
4041     let expr3_0 = MInst::XmmRmR {
4042         op: expr1_0,
4043         src1: pattern0_0,
4044         src2: expr2_0,
4045         dst: expr0_0,
4046     };
4047     let expr4_0 = C::emit(ctx, &expr3_0);
4048     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4049     return Some(expr5_0);
4050 }
4051 
4052 // Generated as internal constructor for term maxss.
4053 pub fn constructor_maxss<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
4054     let pattern0_0 = arg0;
4055     let pattern1_0 = arg1;
4056     // Rule at src/isa/x64/inst.isle line 2473.
4057     let expr0_0 = C::temp_writable_xmm(ctx);
4058     let expr1_0 = SseOpcode::Maxss;
4059     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
4060     let expr3_0 = MInst::XmmRmR {
4061         op: expr1_0,
4062         src1: pattern0_0,
4063         src2: expr2_0,
4064         dst: expr0_0,
4065     };
4066     let expr4_0 = C::emit(ctx, &expr3_0);
4067     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4068     return Some(expr5_0);
4069 }
4070 
4071 // Generated as internal constructor for term maxsd.
4072 pub fn constructor_maxsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
4073     let pattern0_0 = arg0;
4074     let pattern1_0 = arg1;
4075     // Rule at src/isa/x64/inst.isle line 2480.
4076     let expr0_0 = C::temp_writable_xmm(ctx);
4077     let expr1_0 = SseOpcode::Maxsd;
4078     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
4079     let expr3_0 = MInst::XmmRmR {
4080         op: expr1_0,
4081         src1: pattern0_0,
4082         src2: expr2_0,
4083         dst: expr0_0,
4084     };
4085     let expr4_0 = C::emit(ctx, &expr3_0);
4086     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4087     return Some(expr5_0);
4088 }
4089 
4090 // Generated as internal constructor for term maxps.
4091 pub fn constructor_maxps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
4092     let pattern0_0 = arg0;
4093     let pattern1_0 = arg1;
4094     // Rule at src/isa/x64/inst.isle line 2487.
4095     let expr0_0 = C::temp_writable_xmm(ctx);
4096     let expr1_0 = SseOpcode::Maxps;
4097     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
4098     let expr3_0 = MInst::XmmRmR {
4099         op: expr1_0,
4100         src1: pattern0_0,
4101         src2: expr2_0,
4102         dst: expr0_0,
4103     };
4104     let expr4_0 = C::emit(ctx, &expr3_0);
4105     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4106     return Some(expr5_0);
4107 }
4108 
4109 // Generated as internal constructor for term maxpd.
4110 pub fn constructor_maxpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
4111     let pattern0_0 = arg0;
4112     let pattern1_0 = arg1;
4113     // Rule at src/isa/x64/inst.isle line 2494.
4114     let expr0_0 = C::temp_writable_xmm(ctx);
4115     let expr1_0 = SseOpcode::Maxpd;
4116     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
4117     let expr3_0 = MInst::XmmRmR {
4118         op: expr1_0,
4119         src1: pattern0_0,
4120         src2: expr2_0,
4121         dst: expr0_0,
4122     };
4123     let expr4_0 = C::emit(ctx, &expr3_0);
4124     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4125     return Some(expr5_0);
4126 }
4127 
4128 // Generated as internal constructor for term reg_to_xmm_mem.
4129 pub fn constructor_reg_to_xmm_mem<C: Context>(ctx: &mut C, arg0: Reg) -> Option<XmmMem> {
4130     let pattern0_0 = arg0;
4131     // Rule at src/isa/x64/inst.isle line 2549.
4132     let expr0_0 = C::xmm_new(ctx, pattern0_0);
4133     let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
4134     return Some(expr1_0);
4135 }
4136 
4137 // Generated as internal constructor for term xmm_to_reg_mem.
4138 pub fn constructor_xmm_to_reg_mem<C: Context>(ctx: &mut C, arg0: Reg) -> Option<XmmMem> {
4139     let pattern0_0 = arg0;
4140     // Rule at src/isa/x64/inst.isle line 2552.
4141     let expr0_0 = C::xmm_new(ctx, pattern0_0);
4142     let expr1_0 = C::xmm_to_reg(ctx, expr0_0);
4143     let expr2_0 = RegMem::Reg { reg: expr1_0 };
4144     let expr3_0 = C::reg_mem_to_xmm_mem(ctx, &expr2_0);
4145     return Some(expr3_0);
4146 }
4147 
4148 // Generated as internal constructor for term writable_gpr_to_r_reg.
4149 pub fn constructor_writable_gpr_to_r_reg<C: Context>(
4150     ctx: &mut C,
4151     arg0: WritableGpr,
4152 ) -> Option<Reg> {
4153     let pattern0_0 = arg0;
4154     // Rule at src/isa/x64/inst.isle line 2556.
4155     let expr0_0 = C::writable_gpr_to_reg(ctx, pattern0_0);
4156     let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0);
4157     return Some(expr1_0);
4158 }
4159 
4160 // Generated as internal constructor for term writable_gpr_to_gpr_mem.
4161 pub fn constructor_writable_gpr_to_gpr_mem<C: Context>(
4162     ctx: &mut C,
4163     arg0: WritableGpr,
4164 ) -> Option<GprMem> {
4165     let pattern0_0 = arg0;
4166     // Rule at src/isa/x64/inst.isle line 2559.
4167     let expr0_0 = C::writable_gpr_to_gpr(ctx, pattern0_0);
4168     let expr1_0 = C::gpr_to_gpr_mem(ctx, expr0_0);
4169     return Some(expr1_0);
4170 }
4171 
4172 // Generated as internal constructor for term writable_gpr_to_value_regs.
4173 pub fn constructor_writable_gpr_to_value_regs<C: Context>(
4174     ctx: &mut C,
4175     arg0: WritableGpr,
4176 ) -> Option<ValueRegs> {
4177     let pattern0_0 = arg0;
4178     // Rule at src/isa/x64/inst.isle line 2562.
4179     let expr0_0 = constructor_writable_gpr_to_r_reg(ctx, pattern0_0)?;
4180     let expr1_0 = C::value_reg(ctx, expr0_0);
4181     return Some(expr1_0);
4182 }
4183 
4184 // Generated as internal constructor for term writable_xmm_to_r_reg.
4185 pub fn constructor_writable_xmm_to_r_reg<C: Context>(
4186     ctx: &mut C,
4187     arg0: WritableXmm,
4188 ) -> Option<Reg> {
4189     let pattern0_0 = arg0;
4190     // Rule at src/isa/x64/inst.isle line 2565.
4191     let expr0_0 = C::writable_xmm_to_reg(ctx, pattern0_0);
4192     let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0);
4193     return Some(expr1_0);
4194 }
4195 
4196 // Generated as internal constructor for term writable_xmm_to_xmm_mem.
4197 pub fn constructor_writable_xmm_to_xmm_mem<C: Context>(
4198     ctx: &mut C,
4199     arg0: WritableXmm,
4200 ) -> Option<XmmMem> {
4201     let pattern0_0 = arg0;
4202     // Rule at src/isa/x64/inst.isle line 2568.
4203     let expr0_0 = C::writable_xmm_to_xmm(ctx, pattern0_0);
4204     let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
4205     return Some(expr1_0);
4206 }
4207 
4208 // Generated as internal constructor for term writable_xmm_to_value_regs.
4209 pub fn constructor_writable_xmm_to_value_regs<C: Context>(
4210     ctx: &mut C,
4211     arg0: WritableXmm,
4212 ) -> Option<ValueRegs> {
4213     let pattern0_0 = arg0;
4214     // Rule at src/isa/x64/inst.isle line 2571.
4215     let expr0_0 = constructor_writable_xmm_to_r_reg(ctx, pattern0_0)?;
4216     let expr1_0 = C::value_reg(ctx, expr0_0);
4217     return Some(expr1_0);
4218 }
4219 
4220 // Generated as internal constructor for term synthetic_amode_to_gpr_mem.
4221 pub fn constructor_synthetic_amode_to_gpr_mem<C: Context>(
4222     ctx: &mut C,
4223     arg0: &SyntheticAmode,
4224 ) -> Option<GprMem> {
4225     let pattern0_0 = arg0;
4226     // Rule at src/isa/x64/inst.isle line 2575.
4227     let expr0_0 = C::synthetic_amode_to_reg_mem(ctx, pattern0_0);
4228     let expr1_0 = C::reg_mem_to_gpr_mem(ctx, &expr0_0);
4229     return Some(expr1_0);
4230 }
4231 
4232 // Generated as internal constructor for term synthetic_amode_to_xmm_mem.
4233 pub fn constructor_synthetic_amode_to_xmm_mem<C: Context>(
4234     ctx: &mut C,
4235     arg0: &SyntheticAmode,
4236 ) -> Option<XmmMem> {
4237     let pattern0_0 = arg0;
4238     // Rule at src/isa/x64/inst.isle line 2578.
4239     let expr0_0 = C::synthetic_amode_to_reg_mem(ctx, pattern0_0);
4240     let expr1_0 = C::reg_mem_to_xmm_mem(ctx, &expr0_0);
4241     return Some(expr1_0);
4242 }
4243 
4244 // Generated as internal constructor for term lower.
4245 pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutput> {
4246     let pattern0_0 = arg0;
4247     if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) {
4248         let pattern2_0 = C::value_type(ctx, pattern1_0);
4249         if pattern2_0 == I128 {
4250             if let Some(()) = C::use_popcnt(ctx, pattern2_0) {
4251                 let pattern5_0 = C::inst_data(ctx, pattern0_0);
4252                 if let &InstructionData::Unary {
4253                     opcode: ref pattern6_0,
4254                     arg: pattern6_1,
4255                 } = &pattern5_0
4256                 {
4257                     if let &Opcode::Popcnt = pattern6_0 {
4258                         // Rule at src/isa/x64/lower.isle line 1628.
4259                         let expr0_0: Type = I64;
4260                         let expr1_0 = C::put_in_regs(ctx, pattern6_1);
4261                         let expr2_0: usize = 0;
4262                         let expr3_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr2_0)?;
4263                         let expr4_0 = constructor_x64_popcnt(ctx, expr0_0, expr3_0)?;
4264                         let expr5_0: Type = I64;
4265                         let expr6_0 = C::put_in_regs(ctx, pattern6_1);
4266                         let expr7_0: usize = 1;
4267                         let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0)?;
4268                         let expr9_0 = constructor_x64_popcnt(ctx, expr5_0, expr8_0)?;
4269                         let expr10_0: Type = I64;
4270                         let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
4271                         let expr12_0 = constructor_add(ctx, expr10_0, expr4_0, &expr11_0)?;
4272                         let expr13_0 = C::gpr_to_reg(ctx, expr12_0);
4273                         let expr14_0: Type = I64;
4274                         let expr15_0: u64 = 0;
4275                         let expr16_0 = constructor_imm(ctx, expr14_0, expr15_0)?;
4276                         let expr17_0 = C::value_regs(ctx, expr13_0, expr16_0);
4277                         let expr18_0 = C::output(ctx, expr17_0);
4278                         return Some(expr18_0);
4279                     }
4280                 }
4281             }
4282         }
4283         if pattern2_0 == I8X16 {
4284             if let Some(()) = C::avx512vl_enabled(ctx, pattern2_0) {
4285                 if let Some(()) = C::avx512bitalg_enabled(ctx, pattern2_0) {
4286                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
4287                     if let &InstructionData::Unary {
4288                         opcode: ref pattern7_0,
4289                         arg: pattern7_1,
4290                     } = &pattern6_0
4291                     {
4292                         if let &Opcode::Popcnt = pattern7_0 {
4293                             // Rule at src/isa/x64/lower.isle line 1720.
4294                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
4295                             let expr1_0 = constructor_vpopcntb(ctx, &expr0_0)?;
4296                             let expr2_0 = constructor_output_xmm(ctx, expr1_0)?;
4297                             return Some(expr2_0);
4298                         }
4299                     }
4300                 }
4301             }
4302         }
4303         if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) {
4304             if let Some(()) = C::use_lzcnt(ctx, pattern2_0) {
4305                 let pattern5_0 = C::inst_data(ctx, pattern0_0);
4306                 if let &InstructionData::Unary {
4307                     opcode: ref pattern6_0,
4308                     arg: pattern6_1,
4309                 } = &pattern5_0
4310                 {
4311                     if let &Opcode::Clz = pattern6_0 {
4312                         // Rule at src/isa/x64/lower.isle line 1536.
4313                         let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1)?;
4314                         let expr1_0 = constructor_lzcnt(ctx, pattern3_0, expr0_0)?;
4315                         let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
4316                         return Some(expr2_0);
4317                     }
4318                 }
4319             }
4320             if let Some(()) = C::use_bmi1(ctx, pattern2_0) {
4321                 let pattern5_0 = C::inst_data(ctx, pattern0_0);
4322                 if let &InstructionData::Unary {
4323                     opcode: ref pattern6_0,
4324                     arg: pattern6_1,
4325                 } = &pattern5_0
4326                 {
4327                     if let &Opcode::Ctz = pattern6_0 {
4328                         // Rule at src/isa/x64/lower.isle line 1578.
4329                         let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1)?;
4330                         let expr1_0 = constructor_tzcnt(ctx, pattern3_0, expr0_0)?;
4331                         let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
4332                         return Some(expr2_0);
4333                     }
4334                 }
4335             }
4336             if let Some(()) = C::use_popcnt(ctx, pattern2_0) {
4337                 let pattern5_0 = C::inst_data(ctx, pattern0_0);
4338                 if let &InstructionData::Unary {
4339                     opcode: ref pattern6_0,
4340                     arg: pattern6_1,
4341                 } = &pattern5_0
4342                 {
4343                     if let &Opcode::Popcnt = pattern6_0 {
4344                         // Rule at src/isa/x64/lower.isle line 1614.
4345                         let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1)?;
4346                         let expr1_0 = constructor_x64_popcnt(ctx, pattern3_0, expr0_0)?;
4347                         let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
4348                         return Some(expr2_0);
4349                     }
4350                 }
4351             }
4352         }
4353         if let Some(pattern3_0) = C::ty_8_or_16(ctx, pattern2_0) {
4354             if let Some(()) = C::use_popcnt(ctx, pattern2_0) {
4355                 let pattern5_0 = C::inst_data(ctx, pattern0_0);
4356                 if let &InstructionData::Unary {
4357                     opcode: ref pattern6_0,
4358                     arg: pattern6_1,
4359                 } = &pattern5_0
4360                 {
4361                     if let &Opcode::Popcnt = pattern6_0 {
4362                         // Rule at src/isa/x64/lower.isle line 1621.
4363                         let expr0_0: Type = I32;
4364                         let expr1_0: Type = I32;
4365                         let expr2_0 = ExtendKind::Zero;
4366                         let expr3_0 =
4367                             constructor_extend_to_gpr(ctx, pattern6_1, expr1_0, &expr2_0)?;
4368                         let expr4_0 = constructor_x64_popcnt(ctx, expr0_0, expr3_0)?;
4369                         let expr5_0 = constructor_output_gpr(ctx, expr4_0)?;
4370                         return Some(expr5_0);
4371                     }
4372                 }
4373             }
4374         }
4375     }
4376     let pattern0_0 = arg0;
4377     let pattern1_0 = C::inst_data(ctx, pattern0_0);
4378     match &pattern1_0 {
4379         &InstructionData::NullAry {
4380             opcode: ref pattern2_0,
4381         } => {
4382             if let &Opcode::Debugtrap = pattern2_0 {
4383                 // Rule at src/isa/x64/lower.isle line 2006.
4384                 let expr0_0 = constructor_hlt(ctx)?;
4385                 let expr1_0 = constructor_side_effect(ctx, &expr0_0)?;
4386                 return Some(expr1_0);
4387             }
4388         }
4389         &InstructionData::UnaryIeee32 {
4390             opcode: ref pattern2_0,
4391             imm: pattern2_1,
4392         } => {
4393             if let &Opcode::F32const = pattern2_0 {
4394                 let pattern4_0 = C::u64_from_ieee32(ctx, pattern2_1);
4395                 // Rule at src/isa/x64/lower.isle line 46.
4396                 let expr0_0: Type = F32;
4397                 let expr1_0 = constructor_imm(ctx, expr0_0, pattern4_0)?;
4398                 let expr2_0 = constructor_output_reg(ctx, expr1_0)?;
4399                 return Some(expr2_0);
4400             }
4401         }
4402         &InstructionData::UnaryIeee64 {
4403             opcode: ref pattern2_0,
4404             imm: pattern2_1,
4405         } => {
4406             if let &Opcode::F64const = pattern2_0 {
4407                 let pattern4_0 = C::u64_from_ieee64(ctx, pattern2_1);
4408                 // Rule at src/isa/x64/lower.isle line 51.
4409                 let expr0_0: Type = F64;
4410                 let expr1_0 = constructor_imm(ctx, expr0_0, pattern4_0)?;
4411                 let expr2_0 = constructor_output_reg(ctx, expr1_0)?;
4412                 return Some(expr2_0);
4413             }
4414         }
4415         &InstructionData::Trap {
4416             opcode: ref pattern2_0,
4417             code: ref pattern2_1,
4418         } => {
4419             match pattern2_0 {
4420                 &Opcode::Trap => {
4421                     // Rule at src/isa/x64/lower.isle line 1435.
4422                     let expr0_0 = constructor_ud2(ctx, pattern2_1)?;
4423                     let expr1_0 = constructor_safepoint(ctx, &expr0_0)?;
4424                     return Some(expr1_0);
4425                 }
4426                 &Opcode::ResumableTrap => {
4427                     // Rule at src/isa/x64/lower.isle line 1440.
4428                     let expr0_0 = constructor_ud2(ctx, pattern2_1)?;
4429                     let expr1_0 = constructor_safepoint(ctx, &expr0_0)?;
4430                     return Some(expr1_0);
4431                 }
4432                 _ => {}
4433             }
4434         }
4435         &InstructionData::TernaryImm8 {
4436             opcode: ref pattern2_0,
4437             args: ref pattern2_1,
4438             imm: pattern2_2,
4439         } => {
4440             if let &Opcode::Insertlane = pattern2_0 {
4441                 let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1);
4442                 let pattern5_0 = C::value_type(ctx, pattern4_0);
4443                 let pattern6_0 = C::u8_from_uimm8(ctx, pattern2_2);
4444                 // Rule at src/isa/x64/lower.isle line 1302.
4445                 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
4446                 let expr1_0 = C::put_in_reg_mem(ctx, pattern4_1);
4447                 let expr2_0 =
4448                     constructor_vec_insert_lane(ctx, pattern5_0, expr0_0, &expr1_0, pattern6_0)?;
4449                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
4450                 return Some(expr3_0);
4451             }
4452         }
4453         &InstructionData::Unary {
4454             opcode: ref pattern2_0,
4455             arg: pattern2_1,
4456         } => {
4457             match pattern2_0 {
4458                 &Opcode::IsNull => {
4459                     let pattern4_0 = C::value_type(ctx, pattern2_1);
4460                     if pattern4_0 == R64 {
4461                         // Rule at src/isa/x64/lower.isle line 1849.
4462                         let expr0_0 = OperandSize::Size64;
4463                         let expr1_0: u32 = 0;
4464                         let expr2_0 = constructor_put_in_gpr(ctx, pattern2_1)?;
4465                         let expr3_0 = constructor_cmp_imm(ctx, &expr0_0, expr1_0, expr2_0)?;
4466                         let expr4_0 = CC::Z;
4467                         let expr5_0 = constructor_setcc(ctx, &expr4_0)?;
4468                         let expr6_0 = constructor_with_flags(ctx, &expr3_0, &expr5_0)?;
4469                         let expr7_0 = C::output(ctx, expr6_0);
4470                         return Some(expr7_0);
4471                     }
4472                 }
4473                 &Opcode::IsInvalid => {
4474                     let pattern4_0 = C::value_type(ctx, pattern2_1);
4475                     if pattern4_0 == R64 {
4476                         // Rule at src/isa/x64/lower.isle line 1857.
4477                         let expr0_0 = OperandSize::Size64;
4478                         let expr1_0: u32 = 4294967295;
4479                         let expr2_0 = constructor_put_in_gpr(ctx, pattern2_1)?;
4480                         let expr3_0 = constructor_cmp_imm(ctx, &expr0_0, expr1_0, expr2_0)?;
4481                         let expr4_0 = CC::Z;
4482                         let expr5_0 = constructor_setcc(ctx, &expr4_0)?;
4483                         let expr6_0 = constructor_with_flags(ctx, &expr3_0, &expr5_0)?;
4484                         let expr7_0 = C::output(ctx, expr6_0);
4485                         return Some(expr7_0);
4486                     }
4487                 }
4488                 _ => {}
4489             }
4490         }
4491         _ => {}
4492     }
4493     if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) {
4494         let pattern2_0 = C::value_type(ctx, pattern1_0);
4495         if pattern2_0 == B128 {
4496             let pattern4_0 = C::inst_data(ctx, pattern0_0);
4497             match &pattern4_0 {
4498                 &InstructionData::UnaryBool {
4499                     opcode: ref pattern5_0,
4500                     imm: pattern5_1,
4501                 } => {
4502                     if let &Opcode::Bconst = pattern5_0 {
4503                         if pattern5_1 == true {
4504                             // Rule at src/isa/x64/lower.isle line 39.
4505                             let expr0_0: Type = B64;
4506                             let expr1_0: u64 = 1;
4507                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
4508                             let expr3_0: Type = B64;
4509                             let expr4_0: u64 = 0;
4510                             let expr5_0 = constructor_imm(ctx, expr3_0, expr4_0)?;
4511                             let expr6_0 = C::value_regs(ctx, expr2_0, expr5_0);
4512                             let expr7_0 = C::output(ctx, expr6_0);
4513                             return Some(expr7_0);
4514                         }
4515                         if pattern5_1 == false {
4516                             // Rule at src/isa/x64/lower.isle line 34.
4517                             let expr0_0: Type = B64;
4518                             let expr1_0: u64 = 0;
4519                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
4520                             let expr3_0: Type = B64;
4521                             let expr4_0: u64 = 0;
4522                             let expr5_0 = constructor_imm(ctx, expr3_0, expr4_0)?;
4523                             let expr6_0 = C::value_regs(ctx, expr2_0, expr5_0);
4524                             let expr7_0 = C::output(ctx, expr6_0);
4525                             return Some(expr7_0);
4526                         }
4527                     }
4528                 }
4529                 &InstructionData::Binary {
4530                     opcode: ref pattern5_0,
4531                     args: ref pattern5_1,
4532                 } => {
4533                     match pattern5_0 {
4534                         &Opcode::Band => {
4535                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
4536                             // Rule at src/isa/x64/lower.isle line 344.
4537                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
4538                             let expr1_0: usize = 0;
4539                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
4540                             let expr3_0: usize = 1;
4541                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
4542                             let expr5_0 = constructor_lo_gpr(ctx, pattern7_1)?;
4543                             let expr6_0: Type = I64;
4544                             let expr7_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
4545                             let expr8_0 = constructor_x64_and(ctx, expr6_0, expr2_0, &expr7_0)?;
4546                             let expr9_0 = constructor_value_gprs(ctx, expr8_0, expr4_0)?;
4547                             let expr10_0 = C::output(ctx, expr9_0);
4548                             return Some(expr10_0);
4549                         }
4550                         &Opcode::Bor => {
4551                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
4552                             // Rule at src/isa/x64/lower.isle line 410.
4553                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
4554                             let expr1_0: usize = 0;
4555                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
4556                             let expr3_0: usize = 1;
4557                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
4558                             let expr5_0 = constructor_lo_gpr(ctx, pattern7_1)?;
4559                             let expr6_0: Type = I64;
4560                             let expr7_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
4561                             let expr8_0 = constructor_or(ctx, expr6_0, expr2_0, &expr7_0)?;
4562                             let expr9_0 = constructor_value_gprs(ctx, expr8_0, expr4_0)?;
4563                             let expr10_0 = C::output(ctx, expr9_0);
4564                             return Some(expr10_0);
4565                         }
4566                         &Opcode::Bxor => {
4567                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
4568                             // Rule at src/isa/x64/lower.isle line 468.
4569                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
4570                             let expr1_0: usize = 0;
4571                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
4572                             let expr3_0: usize = 1;
4573                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
4574                             let expr5_0 = constructor_lo_gpr(ctx, pattern7_1)?;
4575                             let expr6_0: Type = I64;
4576                             let expr7_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
4577                             let expr8_0 = constructor_xor(ctx, expr6_0, expr2_0, &expr7_0)?;
4578                             let expr9_0 = constructor_value_gprs(ctx, expr8_0, expr4_0)?;
4579                             let expr10_0 = C::output(ctx, expr9_0);
4580                             return Some(expr10_0);
4581                         }
4582                         _ => {}
4583                     }
4584                 }
4585                 &InstructionData::Unary {
4586                     opcode: ref pattern5_0,
4587                     arg: pattern5_1,
4588                 } => {
4589                     if let &Opcode::Bnot = pattern5_0 {
4590                         // Rule at src/isa/x64/lower.isle line 1269.
4591                         let expr0_0 = constructor_i128_not(ctx, pattern5_1)?;
4592                         let expr1_0 = C::output(ctx, expr0_0);
4593                         return Some(expr1_0);
4594                     }
4595                 }
4596                 _ => {}
4597             }
4598         }
4599         if pattern2_0 == I8 {
4600             let pattern4_0 = C::inst_data(ctx, pattern0_0);
4601             if let &InstructionData::Unary {
4602                 opcode: ref pattern5_0,
4603                 arg: pattern5_1,
4604             } = &pattern4_0
4605             {
4606                 if let &Opcode::Bitrev = pattern5_0 {
4607                     // Rule at src/isa/x64/lower.isle line 1771.
4608                     let expr0_0: Type = I32;
4609                     let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
4610                     let expr2_0 = constructor_do_bitrev8(ctx, expr0_0, expr1_0)?;
4611                     let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
4612                     return Some(expr3_0);
4613                 }
4614             }
4615         }
4616         if pattern2_0 == I16 {
4617             let pattern4_0 = C::inst_data(ctx, pattern0_0);
4618             if let &InstructionData::Unary {
4619                 opcode: ref pattern5_0,
4620                 arg: pattern5_1,
4621             } = &pattern4_0
4622             {
4623                 if let &Opcode::Bitrev = pattern5_0 {
4624                     // Rule at src/isa/x64/lower.isle line 1774.
4625                     let expr0_0: Type = I32;
4626                     let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
4627                     let expr2_0 = constructor_do_bitrev16(ctx, expr0_0, expr1_0)?;
4628                     let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
4629                     return Some(expr3_0);
4630                 }
4631             }
4632         }
4633         if pattern2_0 == I32 {
4634             let pattern4_0 = C::inst_data(ctx, pattern0_0);
4635             if let &InstructionData::Unary {
4636                 opcode: ref pattern5_0,
4637                 arg: pattern5_1,
4638             } = &pattern4_0
4639             {
4640                 if let &Opcode::Bitrev = pattern5_0 {
4641                     // Rule at src/isa/x64/lower.isle line 1777.
4642                     let expr0_0: Type = I32;
4643                     let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
4644                     let expr2_0 = constructor_do_bitrev32(ctx, expr0_0, expr1_0)?;
4645                     let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
4646                     return Some(expr3_0);
4647                 }
4648             }
4649         }
4650         if pattern2_0 == I64 {
4651             let pattern4_0 = C::inst_data(ctx, pattern0_0);
4652             if let &InstructionData::Unary {
4653                 opcode: ref pattern5_0,
4654                 arg: pattern5_1,
4655             } = &pattern4_0
4656             {
4657                 match pattern5_0 {
4658                     &Opcode::Bitrev => {
4659                         // Rule at src/isa/x64/lower.isle line 1780.
4660                         let expr0_0: Type = I64;
4661                         let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
4662                         let expr2_0 = constructor_do_bitrev64(ctx, expr0_0, expr1_0)?;
4663                         let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
4664                         return Some(expr3_0);
4665                     }
4666                     &Opcode::Uextend => {
4667                         if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) {
4668                             let pattern8_0 = C::inst_data(ctx, pattern7_0);
4669                             match &pattern8_0 {
4670                                 &InstructionData::Binary {
4671                                     opcode: ref pattern9_0,
4672                                     args: ref pattern9_1,
4673                                 } => {
4674                                     match pattern9_0 {
4675                                         &Opcode::Iadd => {
4676                                             let (pattern11_0, pattern11_1) =
4677                                                 C::unpack_value_array_2(ctx, pattern9_1);
4678                                             // Rule at src/isa/x64/lower.isle line 1896.
4679                                             let expr0_0 =
4680                                                 constructor_output_value(ctx, pattern5_1)?;
4681                                             return Some(expr0_0);
4682                                         }
4683                                         &Opcode::Isub => {
4684                                             let (pattern11_0, pattern11_1) =
4685                                                 C::unpack_value_array_2(ctx, pattern9_1);
4686                                             // Rule at src/isa/x64/lower.isle line 1902.
4687                                             let expr0_0 =
4688                                                 constructor_output_value(ctx, pattern5_1)?;
4689                                             return Some(expr0_0);
4690                                         }
4691                                         &Opcode::Imul => {
4692                                             let (pattern11_0, pattern11_1) =
4693                                                 C::unpack_value_array_2(ctx, pattern9_1);
4694                                             // Rule at src/isa/x64/lower.isle line 1905.
4695                                             let expr0_0 =
4696                                                 constructor_output_value(ctx, pattern5_1)?;
4697                                             return Some(expr0_0);
4698                                         }
4699                                         &Opcode::IaddIfcout => {
4700                                             let (pattern11_0, pattern11_1) =
4701                                                 C::unpack_value_array_2(ctx, pattern9_1);
4702                                             // Rule at src/isa/x64/lower.isle line 1899.
4703                                             let expr0_0 =
4704                                                 constructor_output_value(ctx, pattern5_1)?;
4705                                             return Some(expr0_0);
4706                                         }
4707                                         &Opcode::Band => {
4708                                             let (pattern11_0, pattern11_1) =
4709                                                 C::unpack_value_array_2(ctx, pattern9_1);
4710                                             // Rule at src/isa/x64/lower.isle line 1908.
4711                                             let expr0_0 =
4712                                                 constructor_output_value(ctx, pattern5_1)?;
4713                                             return Some(expr0_0);
4714                                         }
4715                                         &Opcode::Bor => {
4716                                             let (pattern11_0, pattern11_1) =
4717                                                 C::unpack_value_array_2(ctx, pattern9_1);
4718                                             // Rule at src/isa/x64/lower.isle line 1911.
4719                                             let expr0_0 =
4720                                                 constructor_output_value(ctx, pattern5_1)?;
4721                                             return Some(expr0_0);
4722                                         }
4723                                         &Opcode::Bxor => {
4724                                             let (pattern11_0, pattern11_1) =
4725                                                 C::unpack_value_array_2(ctx, pattern9_1);
4726                                             // Rule at src/isa/x64/lower.isle line 1914.
4727                                             let expr0_0 =
4728                                                 constructor_output_value(ctx, pattern5_1)?;
4729                                             return Some(expr0_0);
4730                                         }
4731                                         &Opcode::Ishl => {
4732                                             let (pattern11_0, pattern11_1) =
4733                                                 C::unpack_value_array_2(ctx, pattern9_1);
4734                                             // Rule at src/isa/x64/lower.isle line 1917.
4735                                             let expr0_0 =
4736                                                 constructor_output_value(ctx, pattern5_1)?;
4737                                             return Some(expr0_0);
4738                                         }
4739                                         &Opcode::Ushr => {
4740                                             let (pattern11_0, pattern11_1) =
4741                                                 C::unpack_value_array_2(ctx, pattern9_1);
4742                                             // Rule at src/isa/x64/lower.isle line 1920.
4743                                             let expr0_0 =
4744                                                 constructor_output_value(ctx, pattern5_1)?;
4745                                             return Some(expr0_0);
4746                                         }
4747                                         _ => {}
4748                                     }
4749                                 }
4750                                 &InstructionData::Load {
4751                                     opcode: ref pattern9_0,
4752                                     arg: pattern9_1,
4753                                     flags: pattern9_2,
4754                                     offset: pattern9_3,
4755                                 } => {
4756                                     if let &Opcode::Uload32 = pattern9_0 {
4757                                         // Rule at src/isa/x64/lower.isle line 1923.
4758                                         let expr0_0 = constructor_output_value(ctx, pattern5_1)?;
4759                                         return Some(expr0_0);
4760                                     }
4761                                 }
4762                                 _ => {}
4763                             }
4764                         }
4765                         let pattern7_0 = C::value_type(ctx, pattern5_1);
4766                         if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) {
4767                             // Rule at src/isa/x64/lower.isle line 1878.
4768                             let expr0_0: Type = I64;
4769                             let expr1_0 = ExtendKind::Zero;
4770                             let expr2_0 =
4771                                 constructor_extend_to_gpr(ctx, pattern5_1, expr0_0, &expr1_0)?;
4772                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
4773                             return Some(expr3_0);
4774                         }
4775                     }
4776                     _ => {}
4777                 }
4778             }
4779         }
4780         if pattern2_0 == I128 {
4781             let pattern4_0 = C::inst_data(ctx, pattern0_0);
4782             match &pattern4_0 {
4783                 &InstructionData::UnaryImm {
4784                     opcode: ref pattern5_0,
4785                     imm: pattern5_1,
4786                 } => {
4787                     if let &Opcode::Iconst = pattern5_0 {
4788                         let pattern7_0 = C::u64_from_imm64(ctx, pattern5_1);
4789                         // Rule at src/isa/x64/lower.isle line 15.
4790                         let expr0_0: Type = I64;
4791                         let expr1_0 = constructor_imm(ctx, expr0_0, pattern7_0)?;
4792                         let expr2_0: Type = I64;
4793                         let expr3_0: u64 = 0;
4794                         let expr4_0 = constructor_imm(ctx, expr2_0, expr3_0)?;
4795                         let expr5_0 = C::value_regs(ctx, expr1_0, expr4_0);
4796                         let expr6_0 = C::output(ctx, expr5_0);
4797                         return Some(expr6_0);
4798                     }
4799                 }
4800                 &InstructionData::Binary {
4801                     opcode: ref pattern5_0,
4802                     args: ref pattern5_1,
4803                 } => {
4804                     match pattern5_0 {
4805                         &Opcode::Iadd => {
4806                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
4807                             // Rule at src/isa/x64/lower.isle line 111.
4808                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
4809                             let expr1_0: usize = 0;
4810                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
4811                             let expr3_0: usize = 1;
4812                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
4813                             let expr5_0 = C::put_in_regs(ctx, pattern7_1);
4814                             let expr6_0: usize = 0;
4815                             let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?;
4816                             let expr8_0: usize = 1;
4817                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?;
4818                             let expr10_0: Type = I64;
4819                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
4820                             let expr12_0 = constructor_add_with_flags_paired(
4821                                 ctx, expr10_0, expr2_0, &expr11_0,
4822                             )?;
4823                             let expr13_0: Type = I64;
4824                             let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
4825                             let expr15_0 =
4826                                 constructor_adc_paired(ctx, expr13_0, expr4_0, &expr14_0)?;
4827                             let expr16_0 = constructor_with_flags(ctx, &expr12_0, &expr15_0)?;
4828                             let expr17_0 = C::output(ctx, expr16_0);
4829                             return Some(expr17_0);
4830                         }
4831                         &Opcode::Isub => {
4832                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
4833                             // Rule at src/isa/x64/lower.isle line 257.
4834                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
4835                             let expr1_0: usize = 0;
4836                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
4837                             let expr3_0: usize = 1;
4838                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
4839                             let expr5_0 = C::put_in_regs(ctx, pattern7_1);
4840                             let expr6_0: usize = 0;
4841                             let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?;
4842                             let expr8_0: usize = 1;
4843                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?;
4844                             let expr10_0: Type = I64;
4845                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
4846                             let expr12_0 = constructor_sub_with_flags_paired(
4847                                 ctx, expr10_0, expr2_0, &expr11_0,
4848                             )?;
4849                             let expr13_0: Type = I64;
4850                             let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
4851                             let expr15_0 =
4852                                 constructor_sbb_paired(ctx, expr13_0, expr4_0, &expr14_0)?;
4853                             let expr16_0 = constructor_with_flags(ctx, &expr12_0, &expr15_0)?;
4854                             let expr17_0 = C::output(ctx, expr16_0);
4855                             return Some(expr17_0);
4856                         }
4857                         &Opcode::Imul => {
4858                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
4859                             // Rule at src/isa/x64/lower.isle line 957.
4860                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
4861                             let expr1_0: usize = 0;
4862                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
4863                             let expr3_0: usize = 1;
4864                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
4865                             let expr5_0 = C::put_in_regs(ctx, pattern7_1);
4866                             let expr6_0: usize = 0;
4867                             let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?;
4868                             let expr8_0: usize = 1;
4869                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?;
4870                             let expr10_0: Type = I64;
4871                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
4872                             let expr12_0 = constructor_mul(ctx, expr10_0, expr2_0, &expr11_0)?;
4873                             let expr13_0: Type = I64;
4874                             let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
4875                             let expr15_0 = constructor_mul(ctx, expr13_0, expr4_0, &expr14_0)?;
4876                             let expr16_0: Type = I64;
4877                             let expr17_0 = C::gpr_to_gpr_mem_imm(ctx, expr15_0);
4878                             let expr18_0 = constructor_add(ctx, expr16_0, expr12_0, &expr17_0)?;
4879                             let expr19_0: Type = I64;
4880                             let expr20_0 = C::gpr_to_gpr_mem(ctx, expr7_0);
4881                             let expr21_0 = constructor_mulhi_u(ctx, expr19_0, expr2_0, &expr20_0)?;
4882                             let expr22_0: usize = 0;
4883                             let expr23_0 = constructor_value_regs_get_gpr(ctx, expr21_0, expr22_0)?;
4884                             let expr24_0: usize = 1;
4885                             let expr25_0 = constructor_value_regs_get_gpr(ctx, expr21_0, expr24_0)?;
4886                             let expr26_0: Type = I64;
4887                             let expr27_0 = C::gpr_to_gpr_mem_imm(ctx, expr25_0);
4888                             let expr28_0 = constructor_add(ctx, expr26_0, expr18_0, &expr27_0)?;
4889                             let expr29_0 = constructor_value_gprs(ctx, expr23_0, expr28_0)?;
4890                             let expr30_0 = C::output(ctx, expr29_0);
4891                             return Some(expr30_0);
4892                         }
4893                         &Opcode::Band => {
4894                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
4895                             // Rule at src/isa/x64/lower.isle line 334.
4896                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
4897                             let expr1_0: usize = 0;
4898                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
4899                             let expr3_0: usize = 1;
4900                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
4901                             let expr5_0 = C::put_in_regs(ctx, pattern7_1);
4902                             let expr6_0: usize = 0;
4903                             let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?;
4904                             let expr8_0: usize = 1;
4905                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?;
4906                             let expr10_0: Type = I64;
4907                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
4908                             let expr12_0 = constructor_x64_and(ctx, expr10_0, expr2_0, &expr11_0)?;
4909                             let expr13_0: Type = I64;
4910                             let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
4911                             let expr15_0 = constructor_x64_and(ctx, expr13_0, expr4_0, &expr14_0)?;
4912                             let expr16_0 = constructor_value_gprs(ctx, expr12_0, expr15_0)?;
4913                             let expr17_0 = C::output(ctx, expr16_0);
4914                             return Some(expr17_0);
4915                         }
4916                         &Opcode::Bor => {
4917                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
4918                             // Rule at src/isa/x64/lower.isle line 407.
4919                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
4920                             let expr1_0 = C::put_in_regs(ctx, pattern7_1);
4921                             let expr2_0 = constructor_or_i128(ctx, expr0_0, expr1_0)?;
4922                             let expr3_0 = C::output(ctx, expr2_0);
4923                             return Some(expr3_0);
4924                         }
4925                         &Opcode::Bxor => {
4926                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
4927                             // Rule at src/isa/x64/lower.isle line 458.
4928                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
4929                             let expr1_0: usize = 0;
4930                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
4931                             let expr3_0: usize = 1;
4932                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
4933                             let expr5_0 = C::put_in_regs(ctx, pattern7_1);
4934                             let expr6_0: usize = 0;
4935                             let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?;
4936                             let expr8_0: usize = 1;
4937                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?;
4938                             let expr10_0: Type = I64;
4939                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
4940                             let expr12_0 = constructor_xor(ctx, expr10_0, expr2_0, &expr11_0)?;
4941                             let expr13_0: Type = I64;
4942                             let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
4943                             let expr15_0 = constructor_xor(ctx, expr13_0, expr4_0, &expr14_0)?;
4944                             let expr16_0 = constructor_value_gprs(ctx, expr12_0, expr15_0)?;
4945                             let expr17_0 = C::output(ctx, expr16_0);
4946                             return Some(expr17_0);
4947                         }
4948                         &Opcode::Rotl => {
4949                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
4950                             // Rule at src/isa/x64/lower.isle line 830.
4951                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
4952                             let expr1_0 = constructor_lo_gpr(ctx, pattern7_1)?;
4953                             let expr2_0 = constructor_shl_i128(ctx, expr0_0, expr1_0)?;
4954                             let expr3_0: Type = I64;
4955                             let expr4_0: Type = I64;
4956                             let expr5_0: u64 = 128;
4957                             let expr6_0 = constructor_imm(ctx, expr4_0, expr5_0)?;
4958                             let expr7_0 = C::gpr_new(ctx, expr6_0);
4959                             let expr8_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0);
4960                             let expr9_0 = constructor_sub(ctx, expr3_0, expr7_0, &expr8_0)?;
4961                             let expr10_0 = constructor_shr_i128(ctx, expr0_0, expr9_0)?;
4962                             let expr11_0 = constructor_or_i128(ctx, expr2_0, expr10_0)?;
4963                             let expr12_0 = C::output(ctx, expr11_0);
4964                             return Some(expr12_0);
4965                         }
4966                         &Opcode::Rotr => {
4967                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
4968                             // Rule at src/isa/x64/lower.isle line 870.
4969                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
4970                             let expr1_0 = constructor_lo_gpr(ctx, pattern7_1)?;
4971                             let expr2_0 = constructor_shr_i128(ctx, expr0_0, expr1_0)?;
4972                             let expr3_0: Type = I64;
4973                             let expr4_0: Type = I64;
4974                             let expr5_0: u64 = 128;
4975                             let expr6_0 = constructor_imm(ctx, expr4_0, expr5_0)?;
4976                             let expr7_0 = C::gpr_new(ctx, expr6_0);
4977                             let expr8_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0);
4978                             let expr9_0 = constructor_sub(ctx, expr3_0, expr7_0, &expr8_0)?;
4979                             let expr10_0 = constructor_shl_i128(ctx, expr0_0, expr9_0)?;
4980                             let expr11_0 = constructor_or_i128(ctx, expr2_0, expr10_0)?;
4981                             let expr12_0 = C::output(ctx, expr11_0);
4982                             return Some(expr12_0);
4983                         }
4984                         &Opcode::Ishl => {
4985                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
4986                             // Rule at src/isa/x64/lower.isle line 522.
4987                             let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?;
4988                             let expr1_0 = C::put_in_regs(ctx, pattern7_0);
4989                             let expr2_0 = constructor_shl_i128(ctx, expr1_0, expr0_0)?;
4990                             let expr3_0 = C::output(ctx, expr2_0);
4991                             return Some(expr3_0);
4992                         }
4993                         &Opcode::Ushr => {
4994                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
4995                             // Rule at src/isa/x64/lower.isle line 623.
4996                             let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?;
4997                             let expr1_0 = C::put_in_regs(ctx, pattern7_0);
4998                             let expr2_0 = constructor_shr_i128(ctx, expr1_0, expr0_0)?;
4999                             let expr3_0 = C::output(ctx, expr2_0);
5000                             return Some(expr3_0);
5001                         }
5002                         &Opcode::Sshr => {
5003                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5004                             // Rule at src/isa/x64/lower.isle line 728.
5005                             let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?;
5006                             let expr1_0 = C::put_in_regs(ctx, pattern7_0);
5007                             let expr2_0 = constructor_sar_i128(ctx, expr1_0, expr0_0)?;
5008                             let expr3_0 = C::output(ctx, expr2_0);
5009                             return Some(expr3_0);
5010                         }
5011                         _ => {}
5012                     }
5013                 }
5014                 &InstructionData::Unary {
5015                     opcode: ref pattern5_0,
5016                     arg: pattern5_1,
5017                 } => {
5018                     match pattern5_0 {
5019                         &Opcode::Bnot => {
5020                             // Rule at src/isa/x64/lower.isle line 1266.
5021                             let expr0_0 = constructor_i128_not(ctx, pattern5_1)?;
5022                             let expr1_0 = C::output(ctx, expr0_0);
5023                             return Some(expr1_0);
5024                         }
5025                         &Opcode::Bitrev => {
5026                             // Rule at src/isa/x64/lower.isle line 1783.
5027                             let expr0_0: Type = I64;
5028                             let expr1_0 = C::put_in_regs(ctx, pattern5_1);
5029                             let expr2_0: usize = 1;
5030                             let expr3_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr2_0)?;
5031                             let expr4_0 = constructor_do_bitrev64(ctx, expr0_0, expr3_0)?;
5032                             let expr5_0 = C::gpr_to_reg(ctx, expr4_0);
5033                             let expr6_0: Type = I64;
5034                             let expr7_0 = C::put_in_regs(ctx, pattern5_1);
5035                             let expr8_0: usize = 0;
5036                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr7_0, expr8_0)?;
5037                             let expr10_0 = constructor_do_bitrev64(ctx, expr6_0, expr9_0)?;
5038                             let expr11_0 = C::gpr_to_reg(ctx, expr10_0);
5039                             let expr12_0 = C::value_regs(ctx, expr5_0, expr11_0);
5040                             let expr13_0 = C::output(ctx, expr12_0);
5041                             return Some(expr13_0);
5042                         }
5043                         &Opcode::Clz => {
5044                             // Rule at src/isa/x64/lower.isle line 1553.
5045                             let expr0_0: Type = I64;
5046                             let expr1_0: Type = I64;
5047                             let expr2_0 = C::put_in_regs(ctx, pattern5_1);
5048                             let expr3_0: usize = 1;
5049                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr2_0, expr3_0)?;
5050                             let expr5_0 = constructor_do_clz(ctx, expr0_0, expr1_0, expr4_0)?;
5051                             let expr6_0: Type = I64;
5052                             let expr7_0: Type = I64;
5053                             let expr8_0: Type = I64;
5054                             let expr9_0 = C::put_in_regs(ctx, pattern5_1);
5055                             let expr10_0: usize = 0;
5056                             let expr11_0 = constructor_value_regs_get_gpr(ctx, expr9_0, expr10_0)?;
5057                             let expr12_0 = constructor_do_clz(ctx, expr7_0, expr8_0, expr11_0)?;
5058                             let expr13_0: u32 = 64;
5059                             let expr14_0 = RegMemImm::Imm { simm32: expr13_0 };
5060                             let expr15_0 = C::gpr_mem_imm_new(ctx, &expr14_0);
5061                             let expr16_0 = constructor_add(ctx, expr6_0, expr12_0, &expr15_0)?;
5062                             let expr17_0 = OperandSize::Size64;
5063                             let expr18_0: u32 = 64;
5064                             let expr19_0 = constructor_cmp_imm(ctx, &expr17_0, expr18_0, expr5_0)?;
5065                             let expr20_0: Type = I64;
5066                             let expr21_0 = CC::NZ;
5067                             let expr22_0 = C::gpr_to_gpr_mem(ctx, expr5_0);
5068                             let expr23_0 =
5069                                 constructor_cmove(ctx, expr20_0, &expr21_0, &expr22_0, expr16_0)?;
5070                             let expr24_0 = constructor_with_flags_reg(ctx, &expr19_0, &expr23_0)?;
5071                             let expr25_0 = C::gpr_new(ctx, expr24_0);
5072                             let expr26_0 = C::gpr_to_reg(ctx, expr25_0);
5073                             let expr27_0: Type = I64;
5074                             let expr28_0: u64 = 0;
5075                             let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0)?;
5076                             let expr30_0 = C::value_regs(ctx, expr26_0, expr29_0);
5077                             let expr31_0 = C::output(ctx, expr30_0);
5078                             return Some(expr31_0);
5079                         }
5080                         &Opcode::Ctz => {
5081                             // Rule at src/isa/x64/lower.isle line 1595.
5082                             let expr0_0: Type = I64;
5083                             let expr1_0: Type = I64;
5084                             let expr2_0 = C::put_in_regs(ctx, pattern5_1);
5085                             let expr3_0: usize = 0;
5086                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr2_0, expr3_0)?;
5087                             let expr5_0 = constructor_do_ctz(ctx, expr0_0, expr1_0, expr4_0)?;
5088                             let expr6_0: Type = I64;
5089                             let expr7_0: Type = I64;
5090                             let expr8_0: Type = I64;
5091                             let expr9_0 = C::put_in_regs(ctx, pattern5_1);
5092                             let expr10_0: usize = 1;
5093                             let expr11_0 = constructor_value_regs_get_gpr(ctx, expr9_0, expr10_0)?;
5094                             let expr12_0 = constructor_do_ctz(ctx, expr7_0, expr8_0, expr11_0)?;
5095                             let expr13_0: u32 = 64;
5096                             let expr14_0 = RegMemImm::Imm { simm32: expr13_0 };
5097                             let expr15_0 = C::gpr_mem_imm_new(ctx, &expr14_0);
5098                             let expr16_0 = constructor_add(ctx, expr6_0, expr12_0, &expr15_0)?;
5099                             let expr17_0 = OperandSize::Size64;
5100                             let expr18_0: u32 = 64;
5101                             let expr19_0 = constructor_cmp_imm(ctx, &expr17_0, expr18_0, expr5_0)?;
5102                             let expr20_0: Type = I64;
5103                             let expr21_0 = CC::Z;
5104                             let expr22_0 = C::gpr_to_gpr_mem(ctx, expr16_0);
5105                             let expr23_0 =
5106                                 constructor_cmove(ctx, expr20_0, &expr21_0, &expr22_0, expr5_0)?;
5107                             let expr24_0 = constructor_with_flags_reg(ctx, &expr19_0, &expr23_0)?;
5108                             let expr25_0 = C::gpr_new(ctx, expr24_0);
5109                             let expr26_0 = C::gpr_to_reg(ctx, expr25_0);
5110                             let expr27_0: Type = I64;
5111                             let expr28_0: u64 = 0;
5112                             let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0)?;
5113                             let expr30_0 = C::value_regs(ctx, expr26_0, expr29_0);
5114                             let expr31_0 = C::output(ctx, expr30_0);
5115                             return Some(expr31_0);
5116                         }
5117                         &Opcode::Popcnt => {
5118                             // Rule at src/isa/x64/lower.isle line 1647.
5119                             let expr0_0: Type = I64;
5120                             let expr1_0 = C::put_in_regs(ctx, pattern5_1);
5121                             let expr2_0: usize = 0;
5122                             let expr3_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr2_0)?;
5123                             let expr4_0 = constructor_do_popcnt(ctx, expr0_0, expr3_0)?;
5124                             let expr5_0: Type = I64;
5125                             let expr6_0 = C::put_in_regs(ctx, pattern5_1);
5126                             let expr7_0: usize = 1;
5127                             let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0)?;
5128                             let expr9_0 = constructor_do_popcnt(ctx, expr5_0, expr8_0)?;
5129                             let expr10_0: Type = I64;
5130                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
5131                             let expr12_0 = constructor_add(ctx, expr10_0, expr4_0, &expr11_0)?;
5132                             let expr13_0 = C::gpr_to_reg(ctx, expr12_0);
5133                             let expr14_0: Type = I64;
5134                             let expr15_0: u64 = 0;
5135                             let expr16_0 = constructor_imm(ctx, expr14_0, expr15_0)?;
5136                             let expr17_0 = C::value_regs(ctx, expr13_0, expr16_0);
5137                             let expr18_0 = C::output(ctx, expr17_0);
5138                             return Some(expr18_0);
5139                         }
5140                         &Opcode::Bint => {
5141                             // Rule at src/isa/x64/lower.isle line 1998.
5142                             let expr0_0: Type = I64;
5143                             let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
5144                             let expr2_0: u32 = 1;
5145                             let expr3_0 = RegMemImm::Imm { simm32: expr2_0 };
5146                             let expr4_0 = C::gpr_mem_imm_new(ctx, &expr3_0);
5147                             let expr5_0 = constructor_x64_and(ctx, expr0_0, expr1_0, &expr4_0)?;
5148                             let expr6_0 = C::gpr_to_reg(ctx, expr5_0);
5149                             let expr7_0: Type = I64;
5150                             let expr8_0: u64 = 0;
5151                             let expr9_0 = constructor_imm(ctx, expr7_0, expr8_0)?;
5152                             let expr10_0 = C::value_regs(ctx, expr6_0, expr9_0);
5153                             let expr11_0 = C::output(ctx, expr10_0);
5154                             return Some(expr11_0);
5155                         }
5156                         &Opcode::Uextend => {
5157                             let pattern7_0 = C::value_type(ctx, pattern5_1);
5158                             if pattern7_0 == I64 {
5159                                 // Rule at src/isa/x64/lower.isle line 1870.
5160                                 let expr0_0 = C::put_in_reg(ctx, pattern5_1);
5161                                 let expr1_0: Type = I64;
5162                                 let expr2_0: u64 = 0;
5163                                 let expr3_0 = constructor_imm(ctx, expr1_0, expr2_0)?;
5164                                 let expr4_0 = C::value_regs(ctx, expr0_0, expr3_0);
5165                                 let expr5_0 = C::output(ctx, expr4_0);
5166                                 return Some(expr5_0);
5167                             }
5168                             if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) {
5169                                 // Rule at src/isa/x64/lower.isle line 1874.
5170                                 let expr0_0: Type = I64;
5171                                 let expr1_0 = ExtendKind::Zero;
5172                                 let expr2_0 =
5173                                     constructor_extend_to_gpr(ctx, pattern5_1, expr0_0, &expr1_0)?;
5174                                 let expr3_0 = C::gpr_to_reg(ctx, expr2_0);
5175                                 let expr4_0: Type = I64;
5176                                 let expr5_0: u64 = 0;
5177                                 let expr6_0 = constructor_imm(ctx, expr4_0, expr5_0)?;
5178                                 let expr7_0 = C::value_regs(ctx, expr3_0, expr6_0);
5179                                 let expr8_0 = C::output(ctx, expr7_0);
5180                                 return Some(expr8_0);
5181                             }
5182                         }
5183                         _ => {}
5184                     }
5185                 }
5186                 &InstructionData::BinaryImm64 {
5187                     opcode: ref pattern5_0,
5188                     arg: pattern5_1,
5189                     imm: pattern5_2,
5190                 } => {
5191                     if let &Opcode::IaddImm = pattern5_0 {
5192                         let pattern7_0 = C::u64_from_imm64(ctx, pattern5_2);
5193                         // Rule at src/isa/x64/lower.isle line 210.
5194                         let expr0_0 = C::put_in_regs(ctx, pattern5_1);
5195                         let expr1_0: usize = 0;
5196                         let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
5197                         let expr3_0: usize = 1;
5198                         let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
5199                         let expr5_0: Type = I64;
5200                         let expr6_0 = constructor_imm(ctx, expr5_0, pattern7_0)?;
5201                         let expr7_0 = C::gpr_new(ctx, expr6_0);
5202                         let expr8_0: Type = I64;
5203                         let expr9_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
5204                         let expr10_0 =
5205                             constructor_add_with_flags_paired(ctx, expr8_0, expr2_0, &expr9_0)?;
5206                         let expr11_0: Type = I64;
5207                         let expr12_0: u32 = 0;
5208                         let expr13_0 = RegMemImm::Imm { simm32: expr12_0 };
5209                         let expr14_0 = C::gpr_mem_imm_new(ctx, &expr13_0);
5210                         let expr15_0 = constructor_adc_paired(ctx, expr11_0, expr4_0, &expr14_0)?;
5211                         let expr16_0 = constructor_with_flags(ctx, &expr10_0, &expr15_0)?;
5212                         let expr17_0 = C::output(ctx, expr16_0);
5213                         return Some(expr17_0);
5214                     }
5215                 }
5216                 _ => {}
5217             }
5218         }
5219         if pattern2_0 == F32 {
5220             let pattern4_0 = C::inst_data(ctx, pattern0_0);
5221             if let &InstructionData::Binary {
5222                 opcode: ref pattern5_0,
5223                 args: ref pattern5_1,
5224             } = &pattern4_0
5225             {
5226                 match pattern5_0 {
5227                     &Opcode::Fadd => {
5228                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5229                         // Rule at src/isa/x64/lower.isle line 2021.
5230                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5231                         let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5232                         let expr2_0 = constructor_addss(ctx, expr0_0, &expr1_0)?;
5233                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5234                         return Some(expr3_0);
5235                     }
5236                     &Opcode::Fsub => {
5237                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5238                         // Rule at src/isa/x64/lower.isle line 2032.
5239                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5240                         let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5241                         let expr2_0 = constructor_subss(ctx, expr0_0, &expr1_0)?;
5242                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5243                         return Some(expr3_0);
5244                     }
5245                     &Opcode::Fmul => {
5246                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5247                         // Rule at src/isa/x64/lower.isle line 2043.
5248                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5249                         let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5250                         let expr2_0 = constructor_mulss(ctx, expr0_0, &expr1_0)?;
5251                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5252                         return Some(expr3_0);
5253                     }
5254                     &Opcode::Fdiv => {
5255                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5256                         // Rule at src/isa/x64/lower.isle line 2054.
5257                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5258                         let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5259                         let expr2_0 = constructor_divss(ctx, expr0_0, &expr1_0)?;
5260                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5261                         return Some(expr3_0);
5262                     }
5263                     &Opcode::Fmin => {
5264                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5265                         // Rule at src/isa/x64/lower.isle line 2065.
5266                         let expr0_0: Type = F32;
5267                         let expr1_0: bool = true;
5268                         let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5269                         let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5270                         let expr4_0 =
5271                             constructor_xmm_min_max_seq(ctx, expr0_0, expr1_0, expr2_0, expr3_0)?;
5272                         let expr5_0 = constructor_output_xmm(ctx, expr4_0)?;
5273                         return Some(expr5_0);
5274                     }
5275                     &Opcode::FminPseudo => {
5276                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5277                         // Rule at src/isa/x64/lower.isle line 2234.
5278                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5279                         let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5280                         let expr2_0 = constructor_minss(ctx, expr0_0, expr1_0)?;
5281                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5282                         return Some(expr3_0);
5283                     }
5284                     &Opcode::Fmax => {
5285                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5286                         // Rule at src/isa/x64/lower.isle line 2137.
5287                         let expr0_0: Type = F32;
5288                         let expr1_0: bool = false;
5289                         let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5290                         let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5291                         let expr4_0 =
5292                             constructor_xmm_min_max_seq(ctx, expr0_0, expr1_0, expr2_0, expr3_0)?;
5293                         let expr5_0 = constructor_output_xmm(ctx, expr4_0)?;
5294                         return Some(expr5_0);
5295                     }
5296                     &Opcode::FmaxPseudo => {
5297                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5298                         // Rule at src/isa/x64/lower.isle line 2245.
5299                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5300                         let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5301                         let expr2_0 = constructor_maxss(ctx, expr0_0, expr1_0)?;
5302                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5303                         return Some(expr3_0);
5304                     }
5305                     _ => {}
5306                 }
5307             }
5308         }
5309         if pattern2_0 == F64 {
5310             let pattern4_0 = C::inst_data(ctx, pattern0_0);
5311             if let &InstructionData::Binary {
5312                 opcode: ref pattern5_0,
5313                 args: ref pattern5_1,
5314             } = &pattern4_0
5315             {
5316                 match pattern5_0 {
5317                     &Opcode::Fadd => {
5318                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5319                         // Rule at src/isa/x64/lower.isle line 2023.
5320                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5321                         let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5322                         let expr2_0 = constructor_addsd(ctx, expr0_0, &expr1_0)?;
5323                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5324                         return Some(expr3_0);
5325                     }
5326                     &Opcode::Fsub => {
5327                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5328                         // Rule at src/isa/x64/lower.isle line 2034.
5329                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5330                         let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5331                         let expr2_0 = constructor_subsd(ctx, expr0_0, &expr1_0)?;
5332                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5333                         return Some(expr3_0);
5334                     }
5335                     &Opcode::Fmul => {
5336                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5337                         // Rule at src/isa/x64/lower.isle line 2045.
5338                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5339                         let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5340                         let expr2_0 = constructor_mulsd(ctx, expr0_0, &expr1_0)?;
5341                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5342                         return Some(expr3_0);
5343                     }
5344                     &Opcode::Fdiv => {
5345                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5346                         // Rule at src/isa/x64/lower.isle line 2056.
5347                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5348                         let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5349                         let expr2_0 = constructor_divsd(ctx, expr0_0, &expr1_0)?;
5350                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5351                         return Some(expr3_0);
5352                     }
5353                     &Opcode::Fmin => {
5354                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5355                         // Rule at src/isa/x64/lower.isle line 2067.
5356                         let expr0_0: Type = F64;
5357                         let expr1_0: bool = true;
5358                         let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5359                         let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5360                         let expr4_0 =
5361                             constructor_xmm_min_max_seq(ctx, expr0_0, expr1_0, expr2_0, expr3_0)?;
5362                         let expr5_0 = constructor_output_xmm(ctx, expr4_0)?;
5363                         return Some(expr5_0);
5364                     }
5365                     &Opcode::FminPseudo => {
5366                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5367                         // Rule at src/isa/x64/lower.isle line 2236.
5368                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5369                         let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5370                         let expr2_0 = constructor_minsd(ctx, expr0_0, expr1_0)?;
5371                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5372                         return Some(expr3_0);
5373                     }
5374                     &Opcode::Fmax => {
5375                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5376                         // Rule at src/isa/x64/lower.isle line 2139.
5377                         let expr0_0: Type = F64;
5378                         let expr1_0: bool = false;
5379                         let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5380                         let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5381                         let expr4_0 =
5382                             constructor_xmm_min_max_seq(ctx, expr0_0, expr1_0, expr2_0, expr3_0)?;
5383                         let expr5_0 = constructor_output_xmm(ctx, expr4_0)?;
5384                         return Some(expr5_0);
5385                     }
5386                     &Opcode::FmaxPseudo => {
5387                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5388                         // Rule at src/isa/x64/lower.isle line 2247.
5389                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5390                         let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5391                         let expr2_0 = constructor_maxsd(ctx, expr0_0, expr1_0)?;
5392                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5393                         return Some(expr3_0);
5394                     }
5395                     _ => {}
5396                 }
5397             }
5398         }
5399         if pattern2_0 == I8X16 {
5400             let pattern4_0 = C::inst_data(ctx, pattern0_0);
5401             match &pattern4_0 {
5402                 &InstructionData::Binary {
5403                     opcode: ref pattern5_0,
5404                     args: ref pattern5_1,
5405                 } => {
5406                     match pattern5_0 {
5407                         &Opcode::Imin => {
5408                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5409                             // Rule at src/isa/x64/lower.isle line 1402.
5410                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5411                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5412                             let expr2_0 = constructor_pminsb(ctx, expr0_0, &expr1_0)?;
5413                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5414                             return Some(expr3_0);
5415                         }
5416                         &Opcode::Umin => {
5417                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5418                             // Rule at src/isa/x64/lower.isle line 1424.
5419                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5420                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5421                             let expr2_0 = constructor_pminub(ctx, expr0_0, &expr1_0)?;
5422                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5423                             return Some(expr3_0);
5424                         }
5425                         &Opcode::Imax => {
5426                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5427                             // Rule at src/isa/x64/lower.isle line 1391.
5428                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5429                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5430                             let expr2_0 = constructor_pmaxsb(ctx, expr0_0, &expr1_0)?;
5431                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5432                             return Some(expr3_0);
5433                         }
5434                         &Opcode::Umax => {
5435                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5436                             // Rule at src/isa/x64/lower.isle line 1413.
5437                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5438                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5439                             let expr2_0 = constructor_pmaxub(ctx, expr0_0, &expr1_0)?;
5440                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5441                             return Some(expr3_0);
5442                         }
5443                         &Opcode::Ishl => {
5444                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5445                             // Rule at src/isa/x64/lower.isle line 534.
5446                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5447                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
5448                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
5449                             let expr3_0 = constructor_psllw(ctx, expr0_0, &expr2_0)?;
5450                             let expr4_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
5451                             let expr5_0 = constructor_ishl_i8x16_mask(ctx, &expr4_0)?;
5452                             let expr6_0: Type = I8X16;
5453                             let expr7_0 = ExtKind::None;
5454                             let expr8_0 = constructor_x64_load(ctx, expr6_0, &expr5_0, &expr7_0)?;
5455                             let expr9_0: Type = I8X16;
5456                             let expr10_0 = RegMem::Reg { reg: expr8_0 };
5457                             let expr11_0 = C::reg_mem_to_xmm_mem(ctx, &expr10_0);
5458                             let expr12_0 = constructor_sse_and(ctx, expr9_0, expr3_0, &expr11_0)?;
5459                             let expr13_0 = constructor_output_xmm(ctx, expr12_0)?;
5460                             return Some(expr13_0);
5461                         }
5462                         &Opcode::Ushr => {
5463                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5464                             // Rule at src/isa/x64/lower.isle line 633.
5465                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5466                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
5467                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
5468                             let expr3_0 = constructor_psrlw(ctx, expr0_0, &expr2_0)?;
5469                             let expr4_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
5470                             let expr5_0 = constructor_ushr_i8x16_mask(ctx, &expr4_0)?;
5471                             let expr6_0: Type = I8X16;
5472                             let expr7_0 = ExtKind::None;
5473                             let expr8_0 = constructor_x64_load(ctx, expr6_0, &expr5_0, &expr7_0)?;
5474                             let expr9_0: Type = I8X16;
5475                             let expr10_0 = RegMem::Reg { reg: expr8_0 };
5476                             let expr11_0 = C::reg_mem_to_xmm_mem(ctx, &expr10_0);
5477                             let expr12_0 = constructor_sse_and(ctx, expr9_0, expr3_0, &expr11_0)?;
5478                             let expr13_0 = constructor_output_xmm(ctx, expr12_0)?;
5479                             return Some(expr13_0);
5480                         }
5481                         &Opcode::Sshr => {
5482                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5483                             let pattern8_0 = C::value_type(ctx, pattern7_1);
5484                             // Rule at src/isa/x64/lower.isle line 749.
5485                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5486                             let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
5487                             let expr2_0 = constructor_punpcklbw(ctx, expr0_0, &expr1_0)?;
5488                             let expr3_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
5489                             let expr4_0 = constructor_punpckhbw(ctx, expr0_0, &expr3_0)?;
5490                             let expr5_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
5491                             let expr6_0 =
5492                                 constructor_sshr_i8x16_bigger_shift(ctx, pattern8_0, &expr5_0)?;
5493                             let expr7_0 = constructor_psraw(ctx, expr2_0, &expr6_0)?;
5494                             let expr8_0 = constructor_psraw(ctx, expr4_0, &expr6_0)?;
5495                             let expr9_0 = C::xmm_to_xmm_mem(ctx, expr8_0);
5496                             let expr10_0 = constructor_packsswb(ctx, expr7_0, &expr9_0)?;
5497                             let expr11_0 = constructor_output_xmm(ctx, expr10_0)?;
5498                             return Some(expr11_0);
5499                         }
5500                         _ => {}
5501                     }
5502                 }
5503                 &InstructionData::Unary {
5504                     opcode: ref pattern5_0,
5505                     arg: pattern5_1,
5506                 } => {
5507                     match pattern5_0 {
5508                         &Opcode::Ineg => {
5509                             // Rule at src/isa/x64/lower.isle line 889.
5510                             let expr0_0: Type = I8X16;
5511                             let expr1_0: u64 = 0;
5512                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
5513                             let expr3_0 = C::xmm_new(ctx, expr2_0);
5514                             let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
5515                             let expr5_0 = constructor_psubb(ctx, expr3_0, &expr4_0)?;
5516                             let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
5517                             return Some(expr6_0);
5518                         }
5519                         &Opcode::Iabs => {
5520                             // Rule at src/isa/x64/lower.isle line 1210.
5521                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
5522                             let expr1_0 = constructor_pabsb(ctx, &expr0_0)?;
5523                             let expr2_0 = constructor_output_xmm(ctx, expr1_0)?;
5524                             return Some(expr2_0);
5525                         }
5526                         &Opcode::Popcnt => {
5527                             // Rule at src/isa/x64/lower.isle line 1754.
5528                             let expr0_0 = C::popcount_4bit_table(ctx);
5529                             let expr1_0: Type = I8X16;
5530                             let expr2_0 = C::popcount_low_mask(ctx);
5531                             let expr3_0 = constructor_xmm_load_const(ctx, expr1_0, expr2_0)?;
5532                             let expr4_0: Type = I8X16;
5533                             let expr5_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
5534                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr3_0);
5535                             let expr7_0 = constructor_sse_and(ctx, expr4_0, expr5_0, &expr6_0)?;
5536                             let expr8_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
5537                             let expr9_0: u32 = 4;
5538                             let expr10_0 = RegMemImm::Imm { simm32: expr9_0 };
5539                             let expr11_0 = constructor_mov_rmi_to_xmm(ctx, &expr10_0)?;
5540                             let expr12_0 = constructor_psrlw(ctx, expr8_0, &expr11_0)?;
5541                             let expr13_0: Type = I8X16;
5542                             let expr14_0 = C::xmm_to_xmm_mem(ctx, expr3_0);
5543                             let expr15_0 = constructor_sse_and(ctx, expr13_0, expr12_0, &expr14_0)?;
5544                             let expr16_0: Type = I8X16;
5545                             let expr17_0 = C::popcount_4bit_table(ctx);
5546                             let expr18_0 = constructor_xmm_load_const(ctx, expr16_0, expr17_0)?;
5547                             let expr19_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
5548                             let expr20_0 = constructor_pshufb(ctx, expr18_0, &expr19_0)?;
5549                             let expr21_0 = C::xmm_to_xmm_mem(ctx, expr15_0);
5550                             let expr22_0 = constructor_pshufb(ctx, expr18_0, &expr21_0)?;
5551                             let expr23_0 = C::xmm_to_xmm_mem(ctx, expr22_0);
5552                             let expr24_0 = constructor_paddb(ctx, expr20_0, &expr23_0)?;
5553                             let expr25_0 = constructor_output_xmm(ctx, expr24_0)?;
5554                             return Some(expr25_0);
5555                         }
5556                         _ => {}
5557                     }
5558                 }
5559                 _ => {}
5560             }
5561         }
5562         if pattern2_0 == I16X8 {
5563             let pattern4_0 = C::inst_data(ctx, pattern0_0);
5564             match &pattern4_0 {
5565                 &InstructionData::Binary {
5566                     opcode: ref pattern5_0,
5567                     args: ref pattern5_1,
5568                 } => {
5569                     match pattern5_0 {
5570                         &Opcode::Imin => {
5571                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5572                             // Rule at src/isa/x64/lower.isle line 1405.
5573                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5574                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5575                             let expr2_0 = constructor_pminsw(ctx, expr0_0, &expr1_0)?;
5576                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5577                             return Some(expr3_0);
5578                         }
5579                         &Opcode::Umin => {
5580                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5581                             // Rule at src/isa/x64/lower.isle line 1427.
5582                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5583                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5584                             let expr2_0 = constructor_pminuw(ctx, expr0_0, &expr1_0)?;
5585                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5586                             return Some(expr3_0);
5587                         }
5588                         &Opcode::Imax => {
5589                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5590                             // Rule at src/isa/x64/lower.isle line 1394.
5591                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5592                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5593                             let expr2_0 = constructor_pmaxsw(ctx, expr0_0, &expr1_0)?;
5594                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5595                             return Some(expr3_0);
5596                         }
5597                         &Opcode::Umax => {
5598                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5599                             // Rule at src/isa/x64/lower.isle line 1416.
5600                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5601                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5602                             let expr2_0 = constructor_pmaxuw(ctx, expr0_0, &expr1_0)?;
5603                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5604                             return Some(expr3_0);
5605                         }
5606                         &Opcode::Ishl => {
5607                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5608                             // Rule at src/isa/x64/lower.isle line 576.
5609                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5610                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
5611                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
5612                             let expr3_0 = constructor_psllw(ctx, expr0_0, &expr2_0)?;
5613                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
5614                             return Some(expr4_0);
5615                         }
5616                         &Opcode::Ushr => {
5617                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5618                             // Rule at src/isa/x64/lower.isle line 678.
5619                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5620                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
5621                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
5622                             let expr3_0 = constructor_psrlw(ctx, expr0_0, &expr2_0)?;
5623                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
5624                             return Some(expr4_0);
5625                         }
5626                         &Opcode::Sshr => {
5627                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5628                             // Rule at src/isa/x64/lower.isle line 776.
5629                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5630                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
5631                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
5632                             let expr3_0 = constructor_psraw(ctx, expr0_0, &expr2_0)?;
5633                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
5634                             return Some(expr4_0);
5635                         }
5636                         _ => {}
5637                     }
5638                 }
5639                 &InstructionData::Unary {
5640                     opcode: ref pattern5_0,
5641                     arg: pattern5_1,
5642                 } => {
5643                     match pattern5_0 {
5644                         &Opcode::Ineg => {
5645                             // Rule at src/isa/x64/lower.isle line 892.
5646                             let expr0_0: Type = I16X8;
5647                             let expr1_0: u64 = 0;
5648                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
5649                             let expr3_0 = C::xmm_new(ctx, expr2_0);
5650                             let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
5651                             let expr5_0 = constructor_psubw(ctx, expr3_0, &expr4_0)?;
5652                             let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
5653                             return Some(expr6_0);
5654                         }
5655                         &Opcode::Iabs => {
5656                             // Rule at src/isa/x64/lower.isle line 1213.
5657                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
5658                             let expr1_0 = constructor_pabsw(ctx, &expr0_0)?;
5659                             let expr2_0 = constructor_output_xmm(ctx, expr1_0)?;
5660                             return Some(expr2_0);
5661                         }
5662                         _ => {}
5663                     }
5664                 }
5665                 _ => {}
5666             }
5667         }
5668         if pattern2_0 == I32X4 {
5669             let pattern4_0 = C::inst_data(ctx, pattern0_0);
5670             match &pattern4_0 {
5671                 &InstructionData::Binary {
5672                     opcode: ref pattern5_0,
5673                     args: ref pattern5_1,
5674                 } => {
5675                     match pattern5_0 {
5676                         &Opcode::Imin => {
5677                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5678                             // Rule at src/isa/x64/lower.isle line 1408.
5679                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5680                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5681                             let expr2_0 = constructor_pminsd(ctx, expr0_0, &expr1_0)?;
5682                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5683                             return Some(expr3_0);
5684                         }
5685                         &Opcode::Umin => {
5686                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5687                             // Rule at src/isa/x64/lower.isle line 1430.
5688                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5689                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5690                             let expr2_0 = constructor_pminud(ctx, expr0_0, &expr1_0)?;
5691                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5692                             return Some(expr3_0);
5693                         }
5694                         &Opcode::Imax => {
5695                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5696                             // Rule at src/isa/x64/lower.isle line 1397.
5697                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5698                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5699                             let expr2_0 = constructor_pmaxsd(ctx, expr0_0, &expr1_0)?;
5700                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5701                             return Some(expr3_0);
5702                         }
5703                         &Opcode::Umax => {
5704                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5705                             // Rule at src/isa/x64/lower.isle line 1419.
5706                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5707                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5708                             let expr2_0 = constructor_pmaxud(ctx, expr0_0, &expr1_0)?;
5709                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5710                             return Some(expr3_0);
5711                         }
5712                         &Opcode::Ishl => {
5713                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5714                             // Rule at src/isa/x64/lower.isle line 579.
5715                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5716                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
5717                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
5718                             let expr3_0 = constructor_pslld(ctx, expr0_0, &expr2_0)?;
5719                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
5720                             return Some(expr4_0);
5721                         }
5722                         &Opcode::Ushr => {
5723                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5724                             // Rule at src/isa/x64/lower.isle line 681.
5725                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5726                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
5727                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
5728                             let expr3_0 = constructor_psrld(ctx, expr0_0, &expr2_0)?;
5729                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
5730                             return Some(expr4_0);
5731                         }
5732                         &Opcode::Sshr => {
5733                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5734                             // Rule at src/isa/x64/lower.isle line 779.
5735                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5736                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
5737                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
5738                             let expr3_0 = constructor_psrad(ctx, expr0_0, &expr2_0)?;
5739                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
5740                             return Some(expr4_0);
5741                         }
5742                         &Opcode::WideningPairwiseDotProductS => {
5743                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5744                             // Rule at src/isa/x64/lower.isle line 2011.
5745                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5746                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5747                             let expr2_0 = constructor_pmaddwd(ctx, expr0_0, &expr1_0)?;
5748                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5749                             return Some(expr3_0);
5750                         }
5751                         _ => {}
5752                     }
5753                 }
5754                 &InstructionData::Unary {
5755                     opcode: ref pattern5_0,
5756                     arg: pattern5_1,
5757                 } => {
5758                     match pattern5_0 {
5759                         &Opcode::Ineg => {
5760                             // Rule at src/isa/x64/lower.isle line 895.
5761                             let expr0_0: Type = I32X4;
5762                             let expr1_0: u64 = 0;
5763                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
5764                             let expr3_0 = C::xmm_new(ctx, expr2_0);
5765                             let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
5766                             let expr5_0 = constructor_psubd(ctx, expr3_0, &expr4_0)?;
5767                             let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
5768                             return Some(expr6_0);
5769                         }
5770                         &Opcode::Iabs => {
5771                             // Rule at src/isa/x64/lower.isle line 1216.
5772                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
5773                             let expr1_0 = constructor_pabsd(ctx, &expr0_0)?;
5774                             let expr2_0 = constructor_output_xmm(ctx, expr1_0)?;
5775                             return Some(expr2_0);
5776                         }
5777                         _ => {}
5778                     }
5779                 }
5780                 _ => {}
5781             }
5782         }
5783         if pattern2_0 == I64X2 {
5784             let pattern4_0 = C::inst_data(ctx, pattern0_0);
5785             match &pattern4_0 {
5786                 &InstructionData::Binary {
5787                     opcode: ref pattern5_0,
5788                     args: ref pattern5_1,
5789                 } => {
5790                     match pattern5_0 {
5791                         &Opcode::Ishl => {
5792                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5793                             // Rule at src/isa/x64/lower.isle line 582.
5794                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5795                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
5796                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
5797                             let expr3_0 = constructor_psllq(ctx, expr0_0, &expr2_0)?;
5798                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
5799                             return Some(expr4_0);
5800                         }
5801                         &Opcode::Ushr => {
5802                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5803                             // Rule at src/isa/x64/lower.isle line 684.
5804                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5805                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
5806                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
5807                             let expr3_0 = constructor_psrlq(ctx, expr0_0, &expr2_0)?;
5808                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
5809                             return Some(expr4_0);
5810                         }
5811                         &Opcode::Sshr => {
5812                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5813                             // Rule at src/isa/x64/lower.isle line 790.
5814                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5815                             let expr1_0: Type = I64;
5816                             let expr2_0: u8 = 0;
5817                             let expr3_0 = constructor_pextrd(ctx, expr1_0, expr0_0, expr2_0)?;
5818                             let expr4_0: Type = I64;
5819                             let expr5_0: u8 = 1;
5820                             let expr6_0 = constructor_pextrd(ctx, expr4_0, expr0_0, expr5_0)?;
5821                             let expr7_0: Type = I64;
5822                             let expr8_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, expr7_0);
5823                             let expr9_0: Type = I64;
5824                             let expr10_0 = constructor_sar(ctx, expr9_0, expr3_0, &expr8_0)?;
5825                             let expr11_0: Type = I64;
5826                             let expr12_0 = constructor_sar(ctx, expr11_0, expr6_0, &expr8_0)?;
5827                             let expr13_0 = C::gpr_to_gpr_mem(ctx, expr10_0);
5828                             let expr14_0 = C::gpr_to_gpr_mem(ctx, expr12_0);
5829                             let expr15_0 =
5830                                 constructor_make_i64x2_from_lanes(ctx, &expr13_0, &expr14_0)?;
5831                             let expr16_0 = constructor_output_xmm(ctx, expr15_0)?;
5832                             return Some(expr16_0);
5833                         }
5834                         _ => {}
5835                     }
5836                 }
5837                 &InstructionData::Unary {
5838                     opcode: ref pattern5_0,
5839                     arg: pattern5_1,
5840                 } => {
5841                     match pattern5_0 {
5842                         &Opcode::Ineg => {
5843                             // Rule at src/isa/x64/lower.isle line 898.
5844                             let expr0_0: Type = I64X2;
5845                             let expr1_0: u64 = 0;
5846                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
5847                             let expr3_0 = C::xmm_new(ctx, expr2_0);
5848                             let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
5849                             let expr5_0 = constructor_psubq(ctx, expr3_0, &expr4_0)?;
5850                             let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
5851                             return Some(expr6_0);
5852                         }
5853                         &Opcode::Iabs => {
5854                             // Rule at src/isa/x64/lower.isle line 1230.
5855                             let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
5856                             let expr1_0: Type = I64X2;
5857                             let expr2_0: u64 = 0;
5858                             let expr3_0 = constructor_imm(ctx, expr1_0, expr2_0)?;
5859                             let expr4_0 = C::xmm_new(ctx, expr3_0);
5860                             let expr5_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
5861                             let expr6_0 = constructor_psubq(ctx, expr4_0, &expr5_0)?;
5862                             let expr7_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
5863                             let expr8_0 = constructor_blendvpd(ctx, expr6_0, &expr7_0, expr6_0)?;
5864                             let expr9_0 = constructor_output_xmm(ctx, expr8_0)?;
5865                             return Some(expr9_0);
5866                         }
5867                         _ => {}
5868                     }
5869                 }
5870                 _ => {}
5871             }
5872         }
5873         if pattern2_0 == F32X4 {
5874             let pattern4_0 = C::inst_data(ctx, pattern0_0);
5875             match &pattern4_0 {
5876                 &InstructionData::Binary {
5877                     opcode: ref pattern5_0,
5878                     args: ref pattern5_1,
5879                 } => {
5880                     match pattern5_0 {
5881                         &Opcode::Fadd => {
5882                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5883                             // Rule at src/isa/x64/lower.isle line 2025.
5884                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5885                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5886                             let expr2_0 = constructor_addps(ctx, expr0_0, &expr1_0)?;
5887                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5888                             return Some(expr3_0);
5889                         }
5890                         &Opcode::Fsub => {
5891                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5892                             // Rule at src/isa/x64/lower.isle line 2036.
5893                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5894                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5895                             let expr2_0 = constructor_subps(ctx, expr0_0, &expr1_0)?;
5896                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5897                             return Some(expr3_0);
5898                         }
5899                         &Opcode::Fmul => {
5900                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5901                             // Rule at src/isa/x64/lower.isle line 2047.
5902                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5903                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5904                             let expr2_0 = constructor_mulps(ctx, expr0_0, &expr1_0)?;
5905                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5906                             return Some(expr3_0);
5907                         }
5908                         &Opcode::Fdiv => {
5909                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5910                             // Rule at src/isa/x64/lower.isle line 2058.
5911                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5912                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5913                             let expr2_0 = constructor_divps(ctx, expr0_0, &expr1_0)?;
5914                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5915                             return Some(expr3_0);
5916                         }
5917                         &Opcode::Fmin => {
5918                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5919                             // Rule at src/isa/x64/lower.isle line 2082.
5920                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5921                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5922                             let expr2_0 = constructor_minps(ctx, expr0_0, expr1_0)?;
5923                             let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5924                             let expr4_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5925                             let expr5_0 = constructor_minps(ctx, expr3_0, expr4_0)?;
5926                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
5927                             let expr7_0 = constructor_orps(ctx, expr2_0, &expr6_0)?;
5928                             let expr8_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
5929                             let expr9_0 = FcmpImm::Unordered;
5930                             let expr10_0 = constructor_cmpps(ctx, expr7_0, &expr8_0, &expr9_0)?;
5931                             let expr11_0 = C::xmm_to_xmm_mem(ctx, expr10_0);
5932                             let expr12_0 = constructor_orps(ctx, expr7_0, &expr11_0)?;
5933                             let expr13_0: u32 = 10;
5934                             let expr14_0 = RegMemImm::Imm { simm32: expr13_0 };
5935                             let expr15_0 = constructor_mov_rmi_to_xmm(ctx, &expr14_0)?;
5936                             let expr16_0 = constructor_psrld(ctx, expr10_0, &expr15_0)?;
5937                             let expr17_0 = C::xmm_to_xmm_mem(ctx, expr12_0);
5938                             let expr18_0 = constructor_andnps(ctx, expr16_0, &expr17_0)?;
5939                             let expr19_0 = constructor_output_xmm(ctx, expr18_0)?;
5940                             return Some(expr19_0);
5941                         }
5942                         &Opcode::FminPseudo => {
5943                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5944                             // Rule at src/isa/x64/lower.isle line 2238.
5945                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5946                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5947                             let expr2_0 = constructor_minps(ctx, expr0_0, expr1_0)?;
5948                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5949                             return Some(expr3_0);
5950                         }
5951                         &Opcode::Fmax => {
5952                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5953                             // Rule at src/isa/x64/lower.isle line 2145.
5954                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5955                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5956                             let expr2_0 = constructor_maxps(ctx, expr0_0, expr1_0)?;
5957                             let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5958                             let expr4_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5959                             let expr5_0 = constructor_maxps(ctx, expr3_0, expr4_0)?;
5960                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
5961                             let expr7_0 = constructor_xorps(ctx, expr2_0, &expr6_0)?;
5962                             let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
5963                             let expr9_0 = constructor_orps(ctx, expr2_0, &expr8_0)?;
5964                             let expr10_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
5965                             let expr11_0 = constructor_subps(ctx, expr9_0, &expr10_0)?;
5966                             let expr12_0 = C::xmm_to_xmm_mem(ctx, expr9_0);
5967                             let expr13_0 = FcmpImm::Unordered;
5968                             let expr14_0 = constructor_cmpps(ctx, expr9_0, &expr12_0, &expr13_0)?;
5969                             let expr15_0: u32 = 10;
5970                             let expr16_0 = RegMemImm::Imm { simm32: expr15_0 };
5971                             let expr17_0 = constructor_mov_rmi_to_xmm(ctx, &expr16_0)?;
5972                             let expr18_0 = constructor_psrld(ctx, expr14_0, &expr17_0)?;
5973                             let expr19_0 = C::xmm_to_xmm_mem(ctx, expr11_0);
5974                             let expr20_0 = constructor_andnps(ctx, expr18_0, &expr19_0)?;
5975                             let expr21_0 = constructor_output_xmm(ctx, expr20_0)?;
5976                             return Some(expr21_0);
5977                         }
5978                         &Opcode::FmaxPseudo => {
5979                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5980                             // Rule at src/isa/x64/lower.isle line 2249.
5981                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5982                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5983                             let expr2_0 = constructor_maxps(ctx, expr0_0, expr1_0)?;
5984                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5985                             return Some(expr3_0);
5986                         }
5987                         _ => {}
5988                     }
5989                 }
5990                 &InstructionData::Unary {
5991                     opcode: ref pattern5_0,
5992                     arg: pattern5_1,
5993                 } => {
5994                     if let &Opcode::Fabs = pattern5_0 {
5995                         // Rule at src/isa/x64/lower.isle line 1238.
5996                         let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
5997                         let expr1_0: Type = F32X4;
5998                         let expr2_0 = constructor_vector_all_ones(ctx, expr1_0)?;
5999                         let expr3_0: u32 = 1;
6000                         let expr4_0 = RegMemImm::Imm { simm32: expr3_0 };
6001                         let expr5_0 = constructor_mov_rmi_to_xmm(ctx, &expr4_0)?;
6002                         let expr6_0 = constructor_psrld(ctx, expr2_0, &expr5_0)?;
6003                         let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0);
6004                         let expr8_0 = constructor_andps(ctx, expr0_0, &expr7_0)?;
6005                         let expr9_0 = constructor_output_xmm(ctx, expr8_0)?;
6006                         return Some(expr9_0);
6007                     }
6008                 }
6009                 _ => {}
6010             }
6011         }
6012         if pattern2_0 == F64X2 {
6013             let pattern4_0 = C::inst_data(ctx, pattern0_0);
6014             match &pattern4_0 {
6015                 &InstructionData::Binary {
6016                     opcode: ref pattern5_0,
6017                     args: ref pattern5_1,
6018                 } => {
6019                     match pattern5_0 {
6020                         &Opcode::Fadd => {
6021                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6022                             // Rule at src/isa/x64/lower.isle line 2027.
6023                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6024                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6025                             let expr2_0 = constructor_addpd(ctx, expr0_0, &expr1_0)?;
6026                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6027                             return Some(expr3_0);
6028                         }
6029                         &Opcode::Fsub => {
6030                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6031                             // Rule at src/isa/x64/lower.isle line 2038.
6032                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6033                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6034                             let expr2_0 = constructor_subpd(ctx, expr0_0, &expr1_0)?;
6035                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6036                             return Some(expr3_0);
6037                         }
6038                         &Opcode::Fmul => {
6039                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6040                             // Rule at src/isa/x64/lower.isle line 2049.
6041                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6042                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6043                             let expr2_0 = constructor_mulpd(ctx, expr0_0, &expr1_0)?;
6044                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6045                             return Some(expr3_0);
6046                         }
6047                         &Opcode::Fdiv => {
6048                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6049                             // Rule at src/isa/x64/lower.isle line 2060.
6050                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6051                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6052                             let expr2_0 = constructor_divpd(ctx, expr0_0, &expr1_0)?;
6053                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6054                             return Some(expr3_0);
6055                         }
6056                         &Opcode::Fmin => {
6057                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6058                             // Rule at src/isa/x64/lower.isle line 2125.
6059                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6060                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
6061                             let expr2_0 = constructor_minpd(ctx, expr0_0, expr1_0)?;
6062                             let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
6063                             let expr4_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6064                             let expr5_0 = constructor_minpd(ctx, expr3_0, expr4_0)?;
6065                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
6066                             let expr7_0 = constructor_orpd(ctx, expr2_0, &expr6_0)?;
6067                             let expr8_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
6068                             let expr9_0 = FcmpImm::Unordered;
6069                             let expr10_0 = constructor_cmppd(ctx, expr2_0, &expr8_0, &expr9_0)?;
6070                             let expr11_0 = C::xmm_to_xmm_mem(ctx, expr10_0);
6071                             let expr12_0 = constructor_orpd(ctx, expr7_0, &expr11_0)?;
6072                             let expr13_0: u32 = 13;
6073                             let expr14_0 = RegMemImm::Imm { simm32: expr13_0 };
6074                             let expr15_0 = constructor_mov_rmi_to_xmm(ctx, &expr14_0)?;
6075                             let expr16_0 = constructor_psrlq(ctx, expr10_0, &expr15_0)?;
6076                             let expr17_0 = C::xmm_to_xmm_mem(ctx, expr12_0);
6077                             let expr18_0 = constructor_andnpd(ctx, expr16_0, &expr17_0)?;
6078                             let expr19_0 = constructor_output_xmm(ctx, expr18_0)?;
6079                             return Some(expr19_0);
6080                         }
6081                         &Opcode::FminPseudo => {
6082                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6083                             // Rule at src/isa/x64/lower.isle line 2240.
6084                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
6085                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6086                             let expr2_0 = constructor_minpd(ctx, expr0_0, expr1_0)?;
6087                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6088                             return Some(expr3_0);
6089                         }
6090                         &Opcode::Fmax => {
6091                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6092                             // Rule at src/isa/x64/lower.isle line 2188.
6093                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6094                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
6095                             let expr2_0 = constructor_maxpd(ctx, expr0_0, expr1_0)?;
6096                             let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
6097                             let expr4_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6098                             let expr5_0 = constructor_maxpd(ctx, expr3_0, expr4_0)?;
6099                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
6100                             let expr7_0 = constructor_xorpd(ctx, expr2_0, &expr6_0)?;
6101                             let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
6102                             let expr9_0 = constructor_orpd(ctx, expr2_0, &expr8_0)?;
6103                             let expr10_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
6104                             let expr11_0 = constructor_subpd(ctx, expr9_0, &expr10_0)?;
6105                             let expr12_0 = C::xmm_to_xmm_mem(ctx, expr9_0);
6106                             let expr13_0 = FcmpImm::Unordered;
6107                             let expr14_0 = constructor_cmppd(ctx, expr9_0, &expr12_0, &expr13_0)?;
6108                             let expr15_0: u32 = 13;
6109                             let expr16_0 = RegMemImm::Imm { simm32: expr15_0 };
6110                             let expr17_0 = constructor_mov_rmi_to_xmm(ctx, &expr16_0)?;
6111                             let expr18_0 = constructor_psrlq(ctx, expr14_0, &expr17_0)?;
6112                             let expr19_0 = C::xmm_to_xmm_mem(ctx, expr11_0);
6113                             let expr20_0 = constructor_andnpd(ctx, expr18_0, &expr19_0)?;
6114                             let expr21_0 = constructor_output_xmm(ctx, expr20_0)?;
6115                             return Some(expr21_0);
6116                         }
6117                         &Opcode::FmaxPseudo => {
6118                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6119                             // Rule at src/isa/x64/lower.isle line 2251.
6120                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
6121                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6122                             let expr2_0 = constructor_maxpd(ctx, expr0_0, expr1_0)?;
6123                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6124                             return Some(expr3_0);
6125                         }
6126                         _ => {}
6127                     }
6128                 }
6129                 &InstructionData::Unary {
6130                     opcode: ref pattern5_0,
6131                     arg: pattern5_1,
6132                 } => {
6133                     if let &Opcode::Fabs = pattern5_0 {
6134                         // Rule at src/isa/x64/lower.isle line 1244.
6135                         let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
6136                         let expr1_0: Type = F64X2;
6137                         let expr2_0 = constructor_vector_all_ones(ctx, expr1_0)?;
6138                         let expr3_0: u32 = 1;
6139                         let expr4_0 = RegMemImm::Imm { simm32: expr3_0 };
6140                         let expr5_0 = constructor_mov_rmi_to_xmm(ctx, &expr4_0)?;
6141                         let expr6_0 = constructor_psrlq(ctx, expr2_0, &expr5_0)?;
6142                         let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0);
6143                         let expr8_0 = constructor_andpd(ctx, expr0_0, &expr7_0)?;
6144                         let expr9_0 = constructor_output_xmm(ctx, expr8_0)?;
6145                         return Some(expr9_0);
6146                     }
6147                 }
6148                 _ => {}
6149             }
6150         }
6151         let pattern3_0 = C::inst_data(ctx, pattern0_0);
6152         match &pattern3_0 {
6153             &InstructionData::NullAry {
6154                 opcode: ref pattern4_0,
6155             } => {
6156                 if let &Opcode::Null = pattern4_0 {
6157                     // Rule at src/isa/x64/lower.isle line 56.
6158                     let expr0_0: u64 = 0;
6159                     let expr1_0 = constructor_imm(ctx, pattern2_0, expr0_0)?;
6160                     let expr2_0 = constructor_output_reg(ctx, expr1_0)?;
6161                     return Some(expr2_0);
6162                 }
6163             }
6164             &InstructionData::Binary {
6165                 opcode: ref pattern4_0,
6166                 args: ref pattern4_1,
6167             } => {
6168                 if let &Opcode::BandNot = pattern4_0 {
6169                     let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1);
6170                     // Rule at src/isa/x64/lower.isle line 1205.
6171                     let expr0_0 = constructor_put_in_xmm(ctx, pattern6_1)?;
6172                     let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern6_0)?;
6173                     let expr2_0 = constructor_sse_and_not(ctx, pattern2_0, expr0_0, &expr1_0)?;
6174                     let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6175                     return Some(expr3_0);
6176                 }
6177             }
6178             &InstructionData::Ternary {
6179                 opcode: ref pattern4_0,
6180                 args: ref pattern4_1,
6181             } => {
6182                 if let &Opcode::Select = pattern4_0 {
6183                     let (pattern6_0, pattern6_1, pattern6_2) =
6184                         C::unpack_value_array_3(ctx, pattern4_1);
6185                     if let Some(pattern7_0) = C::def_inst(ctx, pattern6_0) {
6186                         let pattern8_0 = C::inst_data(ctx, pattern7_0);
6187                         if let &InstructionData::FloatCompare {
6188                             opcode: ref pattern9_0,
6189                             args: ref pattern9_1,
6190                             cond: ref pattern9_2,
6191                         } = &pattern8_0
6192                         {
6193                             if let &Opcode::Fcmp = pattern9_0 {
6194                                 let (pattern11_0, pattern11_1) =
6195                                     C::unpack_value_array_2(ctx, pattern9_1);
6196                                 match pattern9_2 {
6197                                     &FloatCC::Equal => {
6198                                         // Rule at src/isa/x64/lower.isle line 1524.
6199                                         let expr0_0 =
6200                                             constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
6201                                         let expr1_0 = CC::NZ;
6202                                         let expr2_0 = CC::P;
6203                                         let expr3_0 = constructor_cmove_or_from_values(
6204                                             ctx, pattern2_0, &expr1_0, &expr2_0, pattern6_2,
6205                                             pattern6_1,
6206                                         )?;
6207                                         let expr4_0 =
6208                                             constructor_with_flags(ctx, &expr0_0, &expr3_0)?;
6209                                         let expr5_0 = C::output(ctx, expr4_0);
6210                                         return Some(expr5_0);
6211                                     }
6212                                     &FloatCC::GreaterThan => {
6213                                         // Rule at src/isa/x64/lower.isle line 1476.
6214                                         let expr0_0 =
6215                                             constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
6216                                         let expr1_0 = CC::NBE;
6217                                         let expr2_0 = constructor_cmove_from_values(
6218                                             ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
6219                                         )?;
6220                                         let expr3_0 =
6221                                             constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6222                                         let expr4_0 = C::output(ctx, expr3_0);
6223                                         return Some(expr4_0);
6224                                     }
6225                                     &FloatCC::GreaterThanOrEqual => {
6226                                         // Rule at src/isa/x64/lower.isle line 1479.
6227                                         let expr0_0 =
6228                                             constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
6229                                         let expr1_0 = CC::NB;
6230                                         let expr2_0 = constructor_cmove_from_values(
6231                                             ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
6232                                         )?;
6233                                         let expr3_0 =
6234                                             constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6235                                         let expr4_0 = C::output(ctx, expr3_0);
6236                                         return Some(expr4_0);
6237                                     }
6238                                     &FloatCC::LessThan => {
6239                                         // Rule at src/isa/x64/lower.isle line 1499.
6240                                         let expr0_0 =
6241                                             constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
6242                                         let expr1_0 = CC::NBE;
6243                                         let expr2_0 = constructor_cmove_from_values(
6244                                             ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
6245                                         )?;
6246                                         let expr3_0 =
6247                                             constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6248                                         let expr4_0 = C::output(ctx, expr3_0);
6249                                         return Some(expr4_0);
6250                                     }
6251                                     &FloatCC::LessThanOrEqual => {
6252                                         // Rule at src/isa/x64/lower.isle line 1502.
6253                                         let expr0_0 =
6254                                             constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
6255                                         let expr1_0 = CC::NB;
6256                                         let expr2_0 = constructor_cmove_from_values(
6257                                             ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
6258                                         )?;
6259                                         let expr3_0 =
6260                                             constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6261                                         let expr4_0 = C::output(ctx, expr3_0);
6262                                         return Some(expr4_0);
6263                                     }
6264                                     &FloatCC::NotEqual => {
6265                                         // Rule at src/isa/x64/lower.isle line 1527.
6266                                         let expr0_0 =
6267                                             constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
6268                                         let expr1_0 = CC::NZ;
6269                                         let expr2_0 = CC::P;
6270                                         let expr3_0 = constructor_cmove_or_from_values(
6271                                             ctx, pattern2_0, &expr1_0, &expr2_0, pattern6_1,
6272                                             pattern6_2,
6273                                         )?;
6274                                         let expr4_0 =
6275                                             constructor_with_flags(ctx, &expr0_0, &expr3_0)?;
6276                                         let expr5_0 = C::output(ctx, expr4_0);
6277                                         return Some(expr5_0);
6278                                     }
6279                                     &FloatCC::Ordered => {
6280                                         // Rule at src/isa/x64/lower.isle line 1470.
6281                                         let expr0_0 =
6282                                             constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
6283                                         let expr1_0 = CC::NP;
6284                                         let expr2_0 = constructor_cmove_from_values(
6285                                             ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
6286                                         )?;
6287                                         let expr3_0 =
6288                                             constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6289                                         let expr4_0 = C::output(ctx, expr3_0);
6290                                         return Some(expr4_0);
6291                                     }
6292                                     &FloatCC::Unordered => {
6293                                         // Rule at src/isa/x64/lower.isle line 1473.
6294                                         let expr0_0 =
6295                                             constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
6296                                         let expr1_0 = CC::P;
6297                                         let expr2_0 = constructor_cmove_from_values(
6298                                             ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
6299                                         )?;
6300                                         let expr3_0 =
6301                                             constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6302                                         let expr4_0 = C::output(ctx, expr3_0);
6303                                         return Some(expr4_0);
6304                                     }
6305                                     &FloatCC::UnorderedOrGreaterThan => {
6306                                         // Rule at src/isa/x64/lower.isle line 1505.
6307                                         let expr0_0 =
6308                                             constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
6309                                         let expr1_0 = CC::B;
6310                                         let expr2_0 = constructor_cmove_from_values(
6311                                             ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
6312                                         )?;
6313                                         let expr3_0 =
6314                                             constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6315                                         let expr4_0 = C::output(ctx, expr3_0);
6316                                         return Some(expr4_0);
6317                                     }
6318                                     &FloatCC::UnorderedOrGreaterThanOrEqual => {
6319                                         // Rule at src/isa/x64/lower.isle line 1508.
6320                                         let expr0_0 =
6321                                             constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
6322                                         let expr1_0 = CC::BE;
6323                                         let expr2_0 = constructor_cmove_from_values(
6324                                             ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
6325                                         )?;
6326                                         let expr3_0 =
6327                                             constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6328                                         let expr4_0 = C::output(ctx, expr3_0);
6329                                         return Some(expr4_0);
6330                                     }
6331                                     &FloatCC::UnorderedOrLessThan => {
6332                                         // Rule at src/isa/x64/lower.isle line 1482.
6333                                         let expr0_0 =
6334                                             constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
6335                                         let expr1_0 = CC::B;
6336                                         let expr2_0 = constructor_cmove_from_values(
6337                                             ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
6338                                         )?;
6339                                         let expr3_0 =
6340                                             constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6341                                         let expr4_0 = C::output(ctx, expr3_0);
6342                                         return Some(expr4_0);
6343                                     }
6344                                     &FloatCC::UnorderedOrLessThanOrEqual => {
6345                                         // Rule at src/isa/x64/lower.isle line 1485.
6346                                         let expr0_0 =
6347                                             constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
6348                                         let expr1_0 = CC::BE;
6349                                         let expr2_0 = constructor_cmove_from_values(
6350                                             ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
6351                                         )?;
6352                                         let expr3_0 =
6353                                             constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6354                                         let expr4_0 = C::output(ctx, expr3_0);
6355                                         return Some(expr4_0);
6356                                     }
6357                                     _ => {}
6358                                 }
6359                             }
6360                         }
6361                     }
6362                 }
6363             }
6364             &InstructionData::Unary {
6365                 opcode: ref pattern4_0,
6366                 arg: pattern4_1,
6367             } => {
6368                 match pattern4_0 {
6369                     &Opcode::Breduce => {
6370                         let pattern6_0 = C::value_type(ctx, pattern4_1);
6371                         if pattern6_0 == pattern2_0 {
6372                             // Rule at src/isa/x64/lower.isle line 1984.
6373                             let expr0_0 = constructor_output_value(ctx, pattern4_1)?;
6374                             return Some(expr0_0);
6375                         }
6376                     }
6377                     &Opcode::Bextend => {
6378                         let pattern6_0 = C::value_type(ctx, pattern4_1);
6379                         // Rule at src/isa/x64/lower.isle line 1965.
6380                         let expr0_0 =
6381                             constructor_generic_sextend(ctx, pattern4_1, pattern6_0, pattern2_0)?;
6382                         return Some(expr0_0);
6383                     }
6384                     &Opcode::Ireduce => {
6385                         let pattern6_0 = C::value_type(ctx, pattern4_1);
6386                         if pattern6_0 == pattern2_0 {
6387                             // Rule at src/isa/x64/lower.isle line 1973.
6388                             let expr0_0 = constructor_output_value(ctx, pattern4_1)?;
6389                             return Some(expr0_0);
6390                         }
6391                     }
6392                     &Opcode::Uextend => {
6393                         let pattern6_0 = C::value_type(ctx, pattern4_1);
6394                         if pattern6_0 == pattern2_0 {
6395                             // Rule at src/isa/x64/lower.isle line 1866.
6396                             let expr0_0 = constructor_output_value(ctx, pattern4_1)?;
6397                             return Some(expr0_0);
6398                         }
6399                     }
6400                     &Opcode::Sextend => {
6401                         let pattern6_0 = C::value_type(ctx, pattern4_1);
6402                         // Rule at src/isa/x64/lower.isle line 1959.
6403                         let expr0_0 =
6404                             constructor_generic_sextend(ctx, pattern4_1, pattern6_0, pattern2_0)?;
6405                         return Some(expr0_0);
6406                     }
6407                     _ => {}
6408                 }
6409             }
6410             _ => {}
6411         }
6412         if let Some(()) = C::avx512vl_enabled(ctx, pattern2_0) {
6413             if let Some(()) = C::avx512dq_enabled(ctx, pattern2_0) {
6414                 if let Some((pattern5_0, pattern5_1)) = C::multi_lane(ctx, pattern2_0) {
6415                     if pattern5_0 == 64 {
6416                         if pattern5_1 == 2 {
6417                             let pattern8_0 = C::inst_data(ctx, pattern0_0);
6418                             if let &InstructionData::Binary {
6419                                 opcode: ref pattern9_0,
6420                                 args: ref pattern9_1,
6421                             } = &pattern8_0
6422                             {
6423                                 if let &Opcode::Imul = pattern9_0 {
6424                                     let (pattern11_0, pattern11_1) =
6425                                         C::unpack_value_array_2(ctx, pattern9_1);
6426                                     // Rule at src/isa/x64/lower.isle line 992.
6427                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern11_0)?;
6428                                     let expr1_0 = constructor_put_in_xmm(ctx, pattern11_1)?;
6429                                     let expr2_0 = constructor_vpmullq(ctx, &expr0_0, expr1_0)?;
6430                                     let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6431                                     return Some(expr3_0);
6432                                 }
6433                             }
6434                         }
6435                     }
6436                 }
6437             }
6438             if let Some(()) = C::avx512f_enabled(ctx, pattern2_0) {
6439                 if pattern2_0 == I64X2 {
6440                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
6441                     if let &InstructionData::Unary {
6442                         opcode: ref pattern7_0,
6443                         arg: pattern7_1,
6444                     } = &pattern6_0
6445                     {
6446                         if let &Opcode::Iabs = pattern7_0 {
6447                             // Rule at src/isa/x64/lower.isle line 1220.
6448                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6449                             let expr1_0 = constructor_vpabsq(ctx, &expr0_0)?;
6450                             let expr2_0 = constructor_output_xmm(ctx, expr1_0)?;
6451                             return Some(expr2_0);
6452                         }
6453                     }
6454                 }
6455             }
6456         }
6457         if let Some((pattern3_0, pattern3_1)) = C::multi_lane(ctx, pattern2_0) {
6458             if pattern3_0 == 8 {
6459                 if pattern3_1 == 16 {
6460                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
6461                     if let &InstructionData::Binary {
6462                         opcode: ref pattern7_0,
6463                         args: ref pattern7_1,
6464                     } = &pattern6_0
6465                     {
6466                         match pattern7_0 {
6467                             &Opcode::AvgRound => {
6468                                 let (pattern9_0, pattern9_1) =
6469                                     C::unpack_value_array_2(ctx, pattern7_1);
6470                                 // Rule at src/isa/x64/lower.isle line 903.
6471                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
6472                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
6473                                 let expr2_0 = constructor_pavgb(ctx, expr0_0, &expr1_0)?;
6474                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6475                                 return Some(expr3_0);
6476                             }
6477                             &Opcode::UaddSat => {
6478                                 let (pattern9_0, pattern9_1) =
6479                                     C::unpack_value_array_2(ctx, pattern7_1);
6480                                 // Rule at src/isa/x64/lower.isle line 136.
6481                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
6482                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
6483                                 let expr2_0 = constructor_paddusb(ctx, expr0_0, &expr1_0)?;
6484                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6485                                 return Some(expr3_0);
6486                             }
6487                             &Opcode::SaddSat => {
6488                                 let (pattern9_0, pattern9_1) =
6489                                     C::unpack_value_array_2(ctx, pattern7_1);
6490                                 // Rule at src/isa/x64/lower.isle line 126.
6491                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
6492                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
6493                                 let expr2_0 = constructor_paddsb(ctx, expr0_0, &expr1_0)?;
6494                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6495                                 return Some(expr3_0);
6496                             }
6497                             &Opcode::UsubSat => {
6498                                 let (pattern9_0, pattern9_1) =
6499                                     C::unpack_value_array_2(ctx, pattern7_1);
6500                                 // Rule at src/isa/x64/lower.isle line 282.
6501                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
6502                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
6503                                 let expr2_0 = constructor_psubusb(ctx, expr0_0, &expr1_0)?;
6504                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6505                                 return Some(expr3_0);
6506                             }
6507                             &Opcode::SsubSat => {
6508                                 let (pattern9_0, pattern9_1) =
6509                                     C::unpack_value_array_2(ctx, pattern7_1);
6510                                 // Rule at src/isa/x64/lower.isle line 272.
6511                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
6512                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
6513                                 let expr2_0 = constructor_psubsb(ctx, expr0_0, &expr1_0)?;
6514                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6515                                 return Some(expr3_0);
6516                             }
6517                             &Opcode::Iadd => {
6518                                 let (pattern9_0, pattern9_1) =
6519                                     C::unpack_value_array_2(ctx, pattern7_1);
6520                                 // Rule at src/isa/x64/lower.isle line 94.
6521                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
6522                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
6523                                 let expr2_0 = constructor_paddb(ctx, expr0_0, &expr1_0)?;
6524                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6525                                 return Some(expr3_0);
6526                             }
6527                             &Opcode::Isub => {
6528                                 let (pattern9_0, pattern9_1) =
6529                                     C::unpack_value_array_2(ctx, pattern7_1);
6530                                 // Rule at src/isa/x64/lower.isle line 240.
6531                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
6532                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
6533                                 let expr2_0 = constructor_psubb(ctx, expr0_0, &expr1_0)?;
6534                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6535                                 return Some(expr3_0);
6536                             }
6537                             _ => {}
6538                         }
6539                     }
6540                 }
6541             }
6542             if pattern3_0 == 16 {
6543                 if pattern3_1 == 8 {
6544                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
6545                     if let &InstructionData::Binary {
6546                         opcode: ref pattern7_0,
6547                         args: ref pattern7_1,
6548                     } = &pattern6_0
6549                     {
6550                         match pattern7_0 {
6551                             &Opcode::AvgRound => {
6552                                 let (pattern9_0, pattern9_1) =
6553                                     C::unpack_value_array_2(ctx, pattern7_1);
6554                                 // Rule at src/isa/x64/lower.isle line 907.
6555                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
6556                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
6557                                 let expr2_0 = constructor_pavgw(ctx, expr0_0, &expr1_0)?;
6558                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6559                                 return Some(expr3_0);
6560                             }
6561                             &Opcode::UaddSat => {
6562                                 let (pattern9_0, pattern9_1) =
6563                                     C::unpack_value_array_2(ctx, pattern7_1);
6564                                 // Rule at src/isa/x64/lower.isle line 140.
6565                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
6566                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
6567                                 let expr2_0 = constructor_paddusw(ctx, expr0_0, &expr1_0)?;
6568                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6569                                 return Some(expr3_0);
6570                             }
6571                             &Opcode::SaddSat => {
6572                                 let (pattern9_0, pattern9_1) =
6573                                     C::unpack_value_array_2(ctx, pattern7_1);
6574                                 // Rule at src/isa/x64/lower.isle line 130.
6575                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
6576                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
6577                                 let expr2_0 = constructor_paddsw(ctx, expr0_0, &expr1_0)?;
6578                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6579                                 return Some(expr3_0);
6580                             }
6581                             &Opcode::UsubSat => {
6582                                 let (pattern9_0, pattern9_1) =
6583                                     C::unpack_value_array_2(ctx, pattern7_1);
6584                                 // Rule at src/isa/x64/lower.isle line 286.
6585                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
6586                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
6587                                 let expr2_0 = constructor_psubusw(ctx, expr0_0, &expr1_0)?;
6588                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6589                                 return Some(expr3_0);
6590                             }
6591                             &Opcode::SsubSat => {
6592                                 let (pattern9_0, pattern9_1) =
6593                                     C::unpack_value_array_2(ctx, pattern7_1);
6594                                 // Rule at src/isa/x64/lower.isle line 276.
6595                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
6596                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
6597                                 let expr2_0 = constructor_psubsw(ctx, expr0_0, &expr1_0)?;
6598                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6599                                 return Some(expr3_0);
6600                             }
6601                             &Opcode::Iadd => {
6602                                 let (pattern9_0, pattern9_1) =
6603                                     C::unpack_value_array_2(ctx, pattern7_1);
6604                                 // Rule at src/isa/x64/lower.isle line 98.
6605                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
6606                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
6607                                 let expr2_0 = constructor_paddw(ctx, expr0_0, &expr1_0)?;
6608                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6609                                 return Some(expr3_0);
6610                             }
6611                             &Opcode::Isub => {
6612                                 let (pattern9_0, pattern9_1) =
6613                                     C::unpack_value_array_2(ctx, pattern7_1);
6614                                 // Rule at src/isa/x64/lower.isle line 244.
6615                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
6616                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
6617                                 let expr2_0 = constructor_psubw(ctx, expr0_0, &expr1_0)?;
6618                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6619                                 return Some(expr3_0);
6620                             }
6621                             &Opcode::Imul => {
6622                                 let (pattern9_0, pattern9_1) =
6623                                     C::unpack_value_array_2(ctx, pattern7_1);
6624                                 if let Some(pattern10_0) = C::def_inst(ctx, pattern9_0) {
6625                                     let pattern11_0 = C::inst_data(ctx, pattern10_0);
6626                                     if let &InstructionData::Unary {
6627                                         opcode: ref pattern12_0,
6628                                         arg: pattern12_1,
6629                                     } = &pattern11_0
6630                                     {
6631                                         match pattern12_0 {
6632                                             &Opcode::SwidenLow => {
6633                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
6634                                                 if let Some((pattern15_0, pattern15_1)) =
6635                                                     C::multi_lane(ctx, pattern14_0)
6636                                                 {
6637                                                     if pattern15_0 == 8 {
6638                                                         if pattern15_1 == 16 {
6639                                                             if let Some(pattern18_0) =
6640                                                                 C::def_inst(ctx, pattern9_1)
6641                                                             {
6642                                                                 let pattern19_0 =
6643                                                                     C::inst_data(ctx, pattern18_0);
6644                                                                 if let &InstructionData::Unary {
6645                                                                     opcode: ref pattern20_0,
6646                                                                     arg: pattern20_1,
6647                                                                 } = &pattern19_0
6648                                                                 {
6649                                                                     if let &Opcode::SwidenLow =
6650                                                                         pattern20_0
6651                                                                     {
6652                                                                         let pattern22_0 =
6653                                                                             C::value_type(
6654                                                                                 ctx,
6655                                                                                 pattern20_1,
6656                                                                             );
6657                                                                         if let Some((
6658                                                                             pattern23_0,
6659                                                                             pattern23_1,
6660                                                                         )) = C::multi_lane(
6661                                                                             ctx,
6662                                                                             pattern22_0,
6663                                                                         ) {
6664                                                                             if pattern23_0 == 8 {
6665                                                                                 if pattern23_1 == 16
6666                                                                                 {
6667                                                                                     // Rule at src/isa/x64/lower.isle line 1080.
6668                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
6669                                                                                     let expr1_0 = constructor_pmovsxbw(ctx, &expr0_0)?;
6670                                                                                     let expr2_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
6671                                                                                     let expr3_0 = constructor_pmovsxbw(ctx, &expr2_0)?;
6672                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0);
6673                                                                                     let expr5_0 = constructor_pmullw(ctx, expr1_0, &expr4_0)?;
6674                                                                                     let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
6675                                                                                     return Some(
6676                                                                                         expr6_0,
6677                                                                                     );
6678                                                                                 }
6679                                                                             }
6680                                                                         }
6681                                                                     }
6682                                                                 }
6683                                                             }
6684                                                         }
6685                                                     }
6686                                                 }
6687                                             }
6688                                             &Opcode::SwidenHigh => {
6689                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
6690                                                 if let Some((pattern15_0, pattern15_1)) =
6691                                                     C::multi_lane(ctx, pattern14_0)
6692                                                 {
6693                                                     if pattern15_0 == 8 {
6694                                                         if pattern15_1 == 16 {
6695                                                             if let Some(pattern18_0) =
6696                                                                 C::def_inst(ctx, pattern9_1)
6697                                                             {
6698                                                                 let pattern19_0 =
6699                                                                     C::inst_data(ctx, pattern18_0);
6700                                                                 if let &InstructionData::Unary {
6701                                                                     opcode: ref pattern20_0,
6702                                                                     arg: pattern20_1,
6703                                                                 } = &pattern19_0
6704                                                                 {
6705                                                                     if let &Opcode::SwidenHigh =
6706                                                                         pattern20_0
6707                                                                     {
6708                                                                         let pattern22_0 =
6709                                                                             C::value_type(
6710                                                                                 ctx,
6711                                                                                 pattern20_1,
6712                                                                             );
6713                                                                         if let Some((
6714                                                                             pattern23_0,
6715                                                                             pattern23_1,
6716                                                                         )) = C::multi_lane(
6717                                                                             ctx,
6718                                                                             pattern22_0,
6719                                                                         ) {
6720                                                                             if pattern23_0 == 8 {
6721                                                                                 if pattern23_1 == 16
6722                                                                                 {
6723                                                                                     // Rule at src/isa/x64/lower.isle line 1040.
6724                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
6725                                                                                     let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
6726                                                                                     let expr2_0: u8 = 8;
6727                                                                                     let expr3_0 = OperandSize::Size32;
6728                                                                                     let expr4_0 = constructor_palignr(ctx, expr0_0, &expr1_0, expr2_0, &expr3_0)?;
6729                                                                                     let expr5_0 = C::xmm_to_xmm_mem(ctx, expr4_0);
6730                                                                                     let expr6_0 = constructor_pmovsxbw(ctx, &expr5_0)?;
6731                                                                                     let expr7_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
6732                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
6733                                                                                     let expr9_0: u8 = 8;
6734                                                                                     let expr10_0 = OperandSize::Size32;
6735                                                                                     let expr11_0 = constructor_palignr(ctx, expr7_0, &expr8_0, expr9_0, &expr10_0)?;
6736                                                                                     let expr12_0 = C::xmm_to_xmm_mem(ctx, expr11_0);
6737                                                                                     let expr13_0 = constructor_pmovsxbw(ctx, &expr12_0)?;
6738                                                                                     let expr14_0 = C::xmm_to_xmm_mem(ctx, expr13_0);
6739                                                                                     let expr15_0 = constructor_pmullw(ctx, expr6_0, &expr14_0)?;
6740                                                                                     let expr16_0 = constructor_output_xmm(ctx, expr15_0)?;
6741                                                                                     return Some(
6742                                                                                         expr16_0,
6743                                                                                     );
6744                                                                                 }
6745                                                                             }
6746                                                                         }
6747                                                                     }
6748                                                                 }
6749                                                             }
6750                                                         }
6751                                                     }
6752                                                 }
6753                                             }
6754                                             &Opcode::UwidenLow => {
6755                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
6756                                                 if let Some((pattern15_0, pattern15_1)) =
6757                                                     C::multi_lane(ctx, pattern14_0)
6758                                                 {
6759                                                     if pattern15_0 == 8 {
6760                                                         if pattern15_1 == 16 {
6761                                                             if let Some(pattern18_0) =
6762                                                                 C::def_inst(ctx, pattern9_1)
6763                                                             {
6764                                                                 let pattern19_0 =
6765                                                                     C::inst_data(ctx, pattern18_0);
6766                                                                 if let &InstructionData::Unary {
6767                                                                     opcode: ref pattern20_0,
6768                                                                     arg: pattern20_1,
6769                                                                 } = &pattern19_0
6770                                                                 {
6771                                                                     if let &Opcode::UwidenLow =
6772                                                                         pattern20_0
6773                                                                     {
6774                                                                         let pattern22_0 =
6775                                                                             C::value_type(
6776                                                                                 ctx,
6777                                                                                 pattern20_1,
6778                                                                             );
6779                                                                         if let Some((
6780                                                                             pattern23_0,
6781                                                                             pattern23_1,
6782                                                                         )) = C::multi_lane(
6783                                                                             ctx,
6784                                                                             pattern22_0,
6785                                                                         ) {
6786                                                                             if pattern23_0 == 8 {
6787                                                                                 if pattern23_1 == 16
6788                                                                                 {
6789                                                                                     // Rule at src/isa/x64/lower.isle line 1156.
6790                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
6791                                                                                     let expr1_0 = constructor_pmovzxbw(ctx, &expr0_0)?;
6792                                                                                     let expr2_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
6793                                                                                     let expr3_0 = constructor_pmovzxbw(ctx, &expr2_0)?;
6794                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0);
6795                                                                                     let expr5_0 = constructor_pmullw(ctx, expr1_0, &expr4_0)?;
6796                                                                                     let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
6797                                                                                     return Some(
6798                                                                                         expr6_0,
6799                                                                                     );
6800                                                                                 }
6801                                                                             }
6802                                                                         }
6803                                                                     }
6804                                                                 }
6805                                                             }
6806                                                         }
6807                                                     }
6808                                                 }
6809                                             }
6810                                             &Opcode::UwidenHigh => {
6811                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
6812                                                 if let Some((pattern15_0, pattern15_1)) =
6813                                                     C::multi_lane(ctx, pattern14_0)
6814                                                 {
6815                                                     if pattern15_0 == 8 {
6816                                                         if pattern15_1 == 16 {
6817                                                             if let Some(pattern18_0) =
6818                                                                 C::def_inst(ctx, pattern9_1)
6819                                                             {
6820                                                                 let pattern19_0 =
6821                                                                     C::inst_data(ctx, pattern18_0);
6822                                                                 if let &InstructionData::Unary {
6823                                                                     opcode: ref pattern20_0,
6824                                                                     arg: pattern20_1,
6825                                                                 } = &pattern19_0
6826                                                                 {
6827                                                                     if let &Opcode::UwidenHigh =
6828                                                                         pattern20_0
6829                                                                     {
6830                                                                         let pattern22_0 =
6831                                                                             C::value_type(
6832                                                                                 ctx,
6833                                                                                 pattern20_1,
6834                                                                             );
6835                                                                         if let Some((
6836                                                                             pattern23_0,
6837                                                                             pattern23_1,
6838                                                                         )) = C::multi_lane(
6839                                                                             ctx,
6840                                                                             pattern22_0,
6841                                                                         ) {
6842                                                                             if pattern23_0 == 8 {
6843                                                                                 if pattern23_1 == 16
6844                                                                                 {
6845                                                                                     // Rule at src/isa/x64/lower.isle line 1116.
6846                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
6847                                                                                     let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
6848                                                                                     let expr2_0: u8 = 8;
6849                                                                                     let expr3_0 = OperandSize::Size32;
6850                                                                                     let expr4_0 = constructor_palignr(ctx, expr0_0, &expr1_0, expr2_0, &expr3_0)?;
6851                                                                                     let expr5_0 = C::xmm_to_xmm_mem(ctx, expr4_0);
6852                                                                                     let expr6_0 = constructor_pmovzxbw(ctx, &expr5_0)?;
6853                                                                                     let expr7_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
6854                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
6855                                                                                     let expr9_0: u8 = 8;
6856                                                                                     let expr10_0 = OperandSize::Size32;
6857                                                                                     let expr11_0 = constructor_palignr(ctx, expr7_0, &expr8_0, expr9_0, &expr10_0)?;
6858                                                                                     let expr12_0 = C::xmm_to_xmm_mem(ctx, expr11_0);
6859                                                                                     let expr13_0 = constructor_pmovzxbw(ctx, &expr12_0)?;
6860                                                                                     let expr14_0 = C::xmm_to_xmm_mem(ctx, expr13_0);
6861                                                                                     let expr15_0 = constructor_pmullw(ctx, expr6_0, &expr14_0)?;
6862                                                                                     let expr16_0 = constructor_output_xmm(ctx, expr15_0)?;
6863                                                                                     return Some(
6864                                                                                         expr16_0,
6865                                                                                     );
6866                                                                                 }
6867                                                                             }
6868                                                                         }
6869                                                                     }
6870                                                                 }
6871                                                             }
6872                                                         }
6873                                                     }
6874                                                 }
6875                                             }
6876                                             _ => {}
6877                                         }
6878                                     }
6879                                 }
6880                                 // Rule at src/isa/x64/lower.isle line 984.
6881                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
6882                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
6883                                 let expr2_0 = constructor_pmullw(ctx, expr0_0, &expr1_0)?;
6884                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6885                                 return Some(expr3_0);
6886                             }
6887                             _ => {}
6888                         }
6889                     }
6890                 }
6891             }
6892             if pattern3_0 == 32 {
6893                 if pattern3_1 == 4 {
6894                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
6895                     if let &InstructionData::Binary {
6896                         opcode: ref pattern7_0,
6897                         args: ref pattern7_1,
6898                     } = &pattern6_0
6899                     {
6900                         match pattern7_0 {
6901                             &Opcode::Iadd => {
6902                                 let (pattern9_0, pattern9_1) =
6903                                     C::unpack_value_array_2(ctx, pattern7_1);
6904                                 // Rule at src/isa/x64/lower.isle line 102.
6905                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
6906                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
6907                                 let expr2_0 = constructor_paddd(ctx, expr0_0, &expr1_0)?;
6908                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6909                                 return Some(expr3_0);
6910                             }
6911                             &Opcode::Isub => {
6912                                 let (pattern9_0, pattern9_1) =
6913                                     C::unpack_value_array_2(ctx, pattern7_1);
6914                                 // Rule at src/isa/x64/lower.isle line 248.
6915                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
6916                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
6917                                 let expr2_0 = constructor_psubd(ctx, expr0_0, &expr1_0)?;
6918                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6919                                 return Some(expr3_0);
6920                             }
6921                             &Opcode::Imul => {
6922                                 let (pattern9_0, pattern9_1) =
6923                                     C::unpack_value_array_2(ctx, pattern7_1);
6924                                 if let Some(pattern10_0) = C::def_inst(ctx, pattern9_0) {
6925                                     let pattern11_0 = C::inst_data(ctx, pattern10_0);
6926                                     if let &InstructionData::Unary {
6927                                         opcode: ref pattern12_0,
6928                                         arg: pattern12_1,
6929                                     } = &pattern11_0
6930                                     {
6931                                         match pattern12_0 {
6932                                             &Opcode::SwidenLow => {
6933                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
6934                                                 if let Some((pattern15_0, pattern15_1)) =
6935                                                     C::multi_lane(ctx, pattern14_0)
6936                                                 {
6937                                                     if pattern15_0 == 16 {
6938                                                         if pattern15_1 == 8 {
6939                                                             if let Some(pattern18_0) =
6940                                                                 C::def_inst(ctx, pattern9_1)
6941                                                             {
6942                                                                 let pattern19_0 =
6943                                                                     C::inst_data(ctx, pattern18_0);
6944                                                                 if let &InstructionData::Unary {
6945                                                                     opcode: ref pattern20_0,
6946                                                                     arg: pattern20_1,
6947                                                                 } = &pattern19_0
6948                                                                 {
6949                                                                     if let &Opcode::SwidenLow =
6950                                                                         pattern20_0
6951                                                                     {
6952                                                                         let pattern22_0 =
6953                                                                             C::value_type(
6954                                                                                 ctx,
6955                                                                                 pattern20_1,
6956                                                                             );
6957                                                                         if let Some((
6958                                                                             pattern23_0,
6959                                                                             pattern23_1,
6960                                                                         )) = C::multi_lane(
6961                                                                             ctx,
6962                                                                             pattern22_0,
6963                                                                         ) {
6964                                                                             if pattern23_0 == 16 {
6965                                                                                 if pattern23_1 == 8
6966                                                                                 {
6967                                                                                     // Rule at src/isa/x64/lower.isle line 1090.
6968                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
6969                                                                                     let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
6970                                                                                     let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
6971                                                                                     let expr3_0 = constructor_pmullw(ctx, expr0_0, &expr2_0)?;
6972                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
6973                                                                                     let expr5_0 = constructor_pmulhw(ctx, expr0_0, &expr4_0)?;
6974                                                                                     let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
6975                                                                                     let expr7_0 = constructor_punpcklwd(ctx, expr3_0, &expr6_0)?;
6976                                                                                     let expr8_0 = constructor_output_xmm(ctx, expr7_0)?;
6977                                                                                     return Some(
6978                                                                                         expr8_0,
6979                                                                                     );
6980                                                                                 }
6981                                                                             }
6982                                                                         }
6983                                                                     }
6984                                                                 }
6985                                                             }
6986                                                         }
6987                                                     }
6988                                                 }
6989                                             }
6990                                             &Opcode::SwidenHigh => {
6991                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
6992                                                 if let Some((pattern15_0, pattern15_1)) =
6993                                                     C::multi_lane(ctx, pattern14_0)
6994                                                 {
6995                                                     if pattern15_0 == 16 {
6996                                                         if pattern15_1 == 8 {
6997                                                             if let Some(pattern18_0) =
6998                                                                 C::def_inst(ctx, pattern9_1)
6999                                                             {
7000                                                                 let pattern19_0 =
7001                                                                     C::inst_data(ctx, pattern18_0);
7002                                                                 if let &InstructionData::Unary {
7003                                                                     opcode: ref pattern20_0,
7004                                                                     arg: pattern20_1,
7005                                                                 } = &pattern19_0
7006                                                                 {
7007                                                                     if let &Opcode::SwidenHigh =
7008                                                                         pattern20_0
7009                                                                     {
7010                                                                         let pattern22_0 =
7011                                                                             C::value_type(
7012                                                                                 ctx,
7013                                                                                 pattern20_1,
7014                                                                             );
7015                                                                         if let Some((
7016                                                                             pattern23_0,
7017                                                                             pattern23_1,
7018                                                                         )) = C::multi_lane(
7019                                                                             ctx,
7020                                                                             pattern22_0,
7021                                                                         ) {
7022                                                                             if pattern23_0 == 16 {
7023                                                                                 if pattern23_1 == 8
7024                                                                                 {
7025                                                                                     // Rule at src/isa/x64/lower.isle line 1054.
7026                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
7027                                                                                     let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
7028                                                                                     let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
7029                                                                                     let expr3_0 = constructor_pmullw(ctx, expr0_0, &expr2_0)?;
7030                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
7031                                                                                     let expr5_0 = constructor_pmulhw(ctx, expr0_0, &expr4_0)?;
7032                                                                                     let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
7033                                                                                     let expr7_0 = constructor_punpckhwd(ctx, expr3_0, &expr6_0)?;
7034                                                                                     let expr8_0 = constructor_output_xmm(ctx, expr7_0)?;
7035                                                                                     return Some(
7036                                                                                         expr8_0,
7037                                                                                     );
7038                                                                                 }
7039                                                                             }
7040                                                                         }
7041                                                                     }
7042                                                                 }
7043                                                             }
7044                                                         }
7045                                                     }
7046                                                 }
7047                                             }
7048                                             &Opcode::UwidenLow => {
7049                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
7050                                                 if let Some((pattern15_0, pattern15_1)) =
7051                                                     C::multi_lane(ctx, pattern14_0)
7052                                                 {
7053                                                     if pattern15_0 == 16 {
7054                                                         if pattern15_1 == 8 {
7055                                                             if let Some(pattern18_0) =
7056                                                                 C::def_inst(ctx, pattern9_1)
7057                                                             {
7058                                                                 let pattern19_0 =
7059                                                                     C::inst_data(ctx, pattern18_0);
7060                                                                 if let &InstructionData::Unary {
7061                                                                     opcode: ref pattern20_0,
7062                                                                     arg: pattern20_1,
7063                                                                 } = &pattern19_0
7064                                                                 {
7065                                                                     if let &Opcode::UwidenLow =
7066                                                                         pattern20_0
7067                                                                     {
7068                                                                         let pattern22_0 =
7069                                                                             C::value_type(
7070                                                                                 ctx,
7071                                                                                 pattern20_1,
7072                                                                             );
7073                                                                         if let Some((
7074                                                                             pattern23_0,
7075                                                                             pattern23_1,
7076                                                                         )) = C::multi_lane(
7077                                                                             ctx,
7078                                                                             pattern22_0,
7079                                                                         ) {
7080                                                                             if pattern23_0 == 16 {
7081                                                                                 if pattern23_1 == 8
7082                                                                                 {
7083                                                                                     // Rule at src/isa/x64/lower.isle line 1166.
7084                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
7085                                                                                     let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
7086                                                                                     let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
7087                                                                                     let expr3_0 = constructor_pmullw(ctx, expr0_0, &expr2_0)?;
7088                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
7089                                                                                     let expr5_0 = constructor_pmulhuw(ctx, expr0_0, &expr4_0)?;
7090                                                                                     let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
7091                                                                                     let expr7_0 = constructor_punpcklwd(ctx, expr3_0, &expr6_0)?;
7092                                                                                     let expr8_0 = constructor_output_xmm(ctx, expr7_0)?;
7093                                                                                     return Some(
7094                                                                                         expr8_0,
7095                                                                                     );
7096                                                                                 }
7097                                                                             }
7098                                                                         }
7099                                                                     }
7100                                                                 }
7101                                                             }
7102                                                         }
7103                                                     }
7104                                                 }
7105                                             }
7106                                             &Opcode::UwidenHigh => {
7107                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
7108                                                 if let Some((pattern15_0, pattern15_1)) =
7109                                                     C::multi_lane(ctx, pattern14_0)
7110                                                 {
7111                                                     if pattern15_0 == 16 {
7112                                                         if pattern15_1 == 8 {
7113                                                             if let Some(pattern18_0) =
7114                                                                 C::def_inst(ctx, pattern9_1)
7115                                                             {
7116                                                                 let pattern19_0 =
7117                                                                     C::inst_data(ctx, pattern18_0);
7118                                                                 if let &InstructionData::Unary {
7119                                                                     opcode: ref pattern20_0,
7120                                                                     arg: pattern20_1,
7121                                                                 } = &pattern19_0
7122                                                                 {
7123                                                                     if let &Opcode::UwidenHigh =
7124                                                                         pattern20_0
7125                                                                     {
7126                                                                         let pattern22_0 =
7127                                                                             C::value_type(
7128                                                                                 ctx,
7129                                                                                 pattern20_1,
7130                                                                             );
7131                                                                         if let Some((
7132                                                                             pattern23_0,
7133                                                                             pattern23_1,
7134                                                                         )) = C::multi_lane(
7135                                                                             ctx,
7136                                                                             pattern22_0,
7137                                                                         ) {
7138                                                                             if pattern23_0 == 16 {
7139                                                                                 if pattern23_1 == 8
7140                                                                                 {
7141                                                                                     // Rule at src/isa/x64/lower.isle line 1130.
7142                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
7143                                                                                     let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
7144                                                                                     let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
7145                                                                                     let expr3_0 = constructor_pmullw(ctx, expr0_0, &expr2_0)?;
7146                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
7147                                                                                     let expr5_0 = constructor_pmulhuw(ctx, expr0_0, &expr4_0)?;
7148                                                                                     let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
7149                                                                                     let expr7_0 = constructor_punpckhwd(ctx, expr3_0, &expr6_0)?;
7150                                                                                     let expr8_0 = constructor_output_xmm(ctx, expr7_0)?;
7151                                                                                     return Some(
7152                                                                                         expr8_0,
7153                                                                                     );
7154                                                                                 }
7155                                                                             }
7156                                                                         }
7157                                                                     }
7158                                                                 }
7159                                                             }
7160                                                         }
7161                                                     }
7162                                                 }
7163                                             }
7164                                             _ => {}
7165                                         }
7166                                     }
7167                                 }
7168                                 // Rule at src/isa/x64/lower.isle line 987.
7169                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7170                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7171                                 let expr2_0 = constructor_pmulld(ctx, expr0_0, &expr1_0)?;
7172                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7173                                 return Some(expr3_0);
7174                             }
7175                             _ => {}
7176                         }
7177                     }
7178                 }
7179             }
7180             if pattern3_0 == 64 {
7181                 if pattern3_1 == 2 {
7182                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
7183                     if let &InstructionData::Binary {
7184                         opcode: ref pattern7_0,
7185                         args: ref pattern7_1,
7186                     } = &pattern6_0
7187                     {
7188                         match pattern7_0 {
7189                             &Opcode::Iadd => {
7190                                 let (pattern9_0, pattern9_1) =
7191                                     C::unpack_value_array_2(ctx, pattern7_1);
7192                                 // Rule at src/isa/x64/lower.isle line 106.
7193                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7194                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7195                                 let expr2_0 = constructor_paddq(ctx, expr0_0, &expr1_0)?;
7196                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7197                                 return Some(expr3_0);
7198                             }
7199                             &Opcode::Isub => {
7200                                 let (pattern9_0, pattern9_1) =
7201                                     C::unpack_value_array_2(ctx, pattern7_1);
7202                                 // Rule at src/isa/x64/lower.isle line 252.
7203                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7204                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7205                                 let expr2_0 = constructor_psubq(ctx, expr0_0, &expr1_0)?;
7206                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7207                                 return Some(expr3_0);
7208                             }
7209                             &Opcode::Imul => {
7210                                 let (pattern9_0, pattern9_1) =
7211                                     C::unpack_value_array_2(ctx, pattern7_1);
7212                                 if let Some(pattern10_0) = C::def_inst(ctx, pattern9_0) {
7213                                     let pattern11_0 = C::inst_data(ctx, pattern10_0);
7214                                     if let &InstructionData::Unary {
7215                                         opcode: ref pattern12_0,
7216                                         arg: pattern12_1,
7217                                     } = &pattern11_0
7218                                     {
7219                                         match pattern12_0 {
7220                                             &Opcode::SwidenLow => {
7221                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
7222                                                 if let Some((pattern15_0, pattern15_1)) =
7223                                                     C::multi_lane(ctx, pattern14_0)
7224                                                 {
7225                                                     if pattern15_0 == 32 {
7226                                                         if pattern15_1 == 4 {
7227                                                             if let Some(pattern18_0) =
7228                                                                 C::def_inst(ctx, pattern9_1)
7229                                                             {
7230                                                                 let pattern19_0 =
7231                                                                     C::inst_data(ctx, pattern18_0);
7232                                                                 if let &InstructionData::Unary {
7233                                                                     opcode: ref pattern20_0,
7234                                                                     arg: pattern20_1,
7235                                                                 } = &pattern19_0
7236                                                                 {
7237                                                                     if let &Opcode::SwidenLow =
7238                                                                         pattern20_0
7239                                                                     {
7240                                                                         let pattern22_0 =
7241                                                                             C::value_type(
7242                                                                                 ctx,
7243                                                                                 pattern20_1,
7244                                                                             );
7245                                                                         if let Some((
7246                                                                             pattern23_0,
7247                                                                             pattern23_1,
7248                                                                         )) = C::multi_lane(
7249                                                                             ctx,
7250                                                                             pattern22_0,
7251                                                                         ) {
7252                                                                             if pattern23_0 == 32 {
7253                                                                                 if pattern23_1 == 4
7254                                                                                 {
7255                                                                                     // Rule at src/isa/x64/lower.isle line 1102.
7256                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
7257                                                                                     let expr1_0: u8 = 80;
7258                                                                                     let expr2_0 = OperandSize::Size32;
7259                                                                                     let expr3_0 = constructor_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?;
7260                                                                                     let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
7261                                                                                     let expr5_0: u8 = 80;
7262                                                                                     let expr6_0 = OperandSize::Size32;
7263                                                                                     let expr7_0 = constructor_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?;
7264                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
7265                                                                                     let expr9_0 = constructor_pmuldq(ctx, expr3_0, &expr8_0)?;
7266                                                                                     let expr10_0 = constructor_output_xmm(ctx, expr9_0)?;
7267                                                                                     return Some(
7268                                                                                         expr10_0,
7269                                                                                     );
7270                                                                                 }
7271                                                                             }
7272                                                                         }
7273                                                                     }
7274                                                                 }
7275                                                             }
7276                                                         }
7277                                                     }
7278                                                 }
7279                                             }
7280                                             &Opcode::SwidenHigh => {
7281                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
7282                                                 if let Some((pattern15_0, pattern15_1)) =
7283                                                     C::multi_lane(ctx, pattern14_0)
7284                                                 {
7285                                                     if pattern15_0 == 32 {
7286                                                         if pattern15_1 == 4 {
7287                                                             if let Some(pattern18_0) =
7288                                                                 C::def_inst(ctx, pattern9_1)
7289                                                             {
7290                                                                 let pattern19_0 =
7291                                                                     C::inst_data(ctx, pattern18_0);
7292                                                                 if let &InstructionData::Unary {
7293                                                                     opcode: ref pattern20_0,
7294                                                                     arg: pattern20_1,
7295                                                                 } = &pattern19_0
7296                                                                 {
7297                                                                     if let &Opcode::SwidenHigh =
7298                                                                         pattern20_0
7299                                                                     {
7300                                                                         let pattern22_0 =
7301                                                                             C::value_type(
7302                                                                                 ctx,
7303                                                                                 pattern20_1,
7304                                                                             );
7305                                                                         if let Some((
7306                                                                             pattern23_0,
7307                                                                             pattern23_1,
7308                                                                         )) = C::multi_lane(
7309                                                                             ctx,
7310                                                                             pattern22_0,
7311                                                                         ) {
7312                                                                             if pattern23_0 == 32 {
7313                                                                                 if pattern23_1 == 4
7314                                                                                 {
7315                                                                                     // Rule at src/isa/x64/lower.isle line 1066.
7316                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
7317                                                                                     let expr1_0: u8 = 250;
7318                                                                                     let expr2_0 = OperandSize::Size32;
7319                                                                                     let expr3_0 = constructor_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?;
7320                                                                                     let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
7321                                                                                     let expr5_0: u8 = 250;
7322                                                                                     let expr6_0 = OperandSize::Size32;
7323                                                                                     let expr7_0 = constructor_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?;
7324                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
7325                                                                                     let expr9_0 = constructor_pmuldq(ctx, expr3_0, &expr8_0)?;
7326                                                                                     let expr10_0 = constructor_output_xmm(ctx, expr9_0)?;
7327                                                                                     return Some(
7328                                                                                         expr10_0,
7329                                                                                     );
7330                                                                                 }
7331                                                                             }
7332                                                                         }
7333                                                                     }
7334                                                                 }
7335                                                             }
7336                                                         }
7337                                                     }
7338                                                 }
7339                                             }
7340                                             &Opcode::UwidenLow => {
7341                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
7342                                                 if let Some((pattern15_0, pattern15_1)) =
7343                                                     C::multi_lane(ctx, pattern14_0)
7344                                                 {
7345                                                     if pattern15_0 == 32 {
7346                                                         if pattern15_1 == 4 {
7347                                                             if let Some(pattern18_0) =
7348                                                                 C::def_inst(ctx, pattern9_1)
7349                                                             {
7350                                                                 let pattern19_0 =
7351                                                                     C::inst_data(ctx, pattern18_0);
7352                                                                 if let &InstructionData::Unary {
7353                                                                     opcode: ref pattern20_0,
7354                                                                     arg: pattern20_1,
7355                                                                 } = &pattern19_0
7356                                                                 {
7357                                                                     if let &Opcode::UwidenLow =
7358                                                                         pattern20_0
7359                                                                     {
7360                                                                         let pattern22_0 =
7361                                                                             C::value_type(
7362                                                                                 ctx,
7363                                                                                 pattern20_1,
7364                                                                             );
7365                                                                         if let Some((
7366                                                                             pattern23_0,
7367                                                                             pattern23_1,
7368                                                                         )) = C::multi_lane(
7369                                                                             ctx,
7370                                                                             pattern22_0,
7371                                                                         ) {
7372                                                                             if pattern23_0 == 32 {
7373                                                                                 if pattern23_1 == 4
7374                                                                                 {
7375                                                                                     // Rule at src/isa/x64/lower.isle line 1178.
7376                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
7377                                                                                     let expr1_0: u8 = 80;
7378                                                                                     let expr2_0 = OperandSize::Size32;
7379                                                                                     let expr3_0 = constructor_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?;
7380                                                                                     let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
7381                                                                                     let expr5_0: u8 = 80;
7382                                                                                     let expr6_0 = OperandSize::Size32;
7383                                                                                     let expr7_0 = constructor_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?;
7384                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
7385                                                                                     let expr9_0 = constructor_pmuludq(ctx, expr3_0, &expr8_0)?;
7386                                                                                     let expr10_0 = constructor_output_xmm(ctx, expr9_0)?;
7387                                                                                     return Some(
7388                                                                                         expr10_0,
7389                                                                                     );
7390                                                                                 }
7391                                                                             }
7392                                                                         }
7393                                                                     }
7394                                                                 }
7395                                                             }
7396                                                         }
7397                                                     }
7398                                                 }
7399                                             }
7400                                             &Opcode::UwidenHigh => {
7401                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
7402                                                 if let Some((pattern15_0, pattern15_1)) =
7403                                                     C::multi_lane(ctx, pattern14_0)
7404                                                 {
7405                                                     if pattern15_0 == 32 {
7406                                                         if pattern15_1 == 4 {
7407                                                             if let Some(pattern18_0) =
7408                                                                 C::def_inst(ctx, pattern9_1)
7409                                                             {
7410                                                                 let pattern19_0 =
7411                                                                     C::inst_data(ctx, pattern18_0);
7412                                                                 if let &InstructionData::Unary {
7413                                                                     opcode: ref pattern20_0,
7414                                                                     arg: pattern20_1,
7415                                                                 } = &pattern19_0
7416                                                                 {
7417                                                                     if let &Opcode::UwidenHigh =
7418                                                                         pattern20_0
7419                                                                     {
7420                                                                         let pattern22_0 =
7421                                                                             C::value_type(
7422                                                                                 ctx,
7423                                                                                 pattern20_1,
7424                                                                             );
7425                                                                         if let Some((
7426                                                                             pattern23_0,
7427                                                                             pattern23_1,
7428                                                                         )) = C::multi_lane(
7429                                                                             ctx,
7430                                                                             pattern22_0,
7431                                                                         ) {
7432                                                                             if pattern23_0 == 32 {
7433                                                                                 if pattern23_1 == 4
7434                                                                                 {
7435                                                                                     // Rule at src/isa/x64/lower.isle line 1142.
7436                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
7437                                                                                     let expr1_0: u8 = 250;
7438                                                                                     let expr2_0 = OperandSize::Size32;
7439                                                                                     let expr3_0 = constructor_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?;
7440                                                                                     let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
7441                                                                                     let expr5_0: u8 = 250;
7442                                                                                     let expr6_0 = OperandSize::Size32;
7443                                                                                     let expr7_0 = constructor_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?;
7444                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
7445                                                                                     let expr9_0 = constructor_pmuludq(ctx, expr3_0, &expr8_0)?;
7446                                                                                     let expr10_0 = constructor_output_xmm(ctx, expr9_0)?;
7447                                                                                     return Some(
7448                                                                                         expr10_0,
7449                                                                                     );
7450                                                                                 }
7451                                                                             }
7452                                                                         }
7453                                                                     }
7454                                                                 }
7455                                                             }
7456                                                         }
7457                                                     }
7458                                                 }
7459                                             }
7460                                             _ => {}
7461                                         }
7462                                     }
7463                                 }
7464                                 // Rule at src/isa/x64/lower.isle line 1018.
7465                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7466                                 let expr1_0 = constructor_put_in_xmm(ctx, pattern9_1)?;
7467                                 let expr2_0: u32 = 32;
7468                                 let expr3_0 = RegMemImm::Imm { simm32: expr2_0 };
7469                                 let expr4_0 = constructor_mov_rmi_to_xmm(ctx, &expr3_0)?;
7470                                 let expr5_0 = constructor_psrlq(ctx, expr0_0, &expr4_0)?;
7471                                 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
7472                                 let expr7_0 = constructor_pmuludq(ctx, expr5_0, &expr6_0)?;
7473                                 let expr8_0: u32 = 32;
7474                                 let expr9_0 = RegMemImm::Imm { simm32: expr8_0 };
7475                                 let expr10_0 = constructor_mov_rmi_to_xmm(ctx, &expr9_0)?;
7476                                 let expr11_0 = constructor_psrlq(ctx, expr1_0, &expr10_0)?;
7477                                 let expr12_0 = C::xmm_to_xmm_mem(ctx, expr11_0);
7478                                 let expr13_0 = constructor_pmuludq(ctx, expr0_0, &expr12_0)?;
7479                                 let expr14_0 = C::xmm_to_xmm_mem(ctx, expr13_0);
7480                                 let expr15_0 = constructor_paddq(ctx, expr7_0, &expr14_0)?;
7481                                 let expr16_0: u32 = 32;
7482                                 let expr17_0 = RegMemImm::Imm { simm32: expr16_0 };
7483                                 let expr18_0 = constructor_mov_rmi_to_xmm(ctx, &expr17_0)?;
7484                                 let expr19_0 = constructor_psllq(ctx, expr15_0, &expr18_0)?;
7485                                 let expr20_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
7486                                 let expr21_0 = constructor_pmuludq(ctx, expr0_0, &expr20_0)?;
7487                                 let expr22_0 = C::xmm_to_xmm_mem(ctx, expr19_0);
7488                                 let expr23_0 = constructor_paddq(ctx, expr21_0, &expr22_0)?;
7489                                 let expr24_0 = constructor_output_xmm(ctx, expr23_0)?;
7490                                 return Some(expr24_0);
7491                             }
7492                             _ => {}
7493                         }
7494                     }
7495                 }
7496             }
7497             let pattern4_0 = C::inst_data(ctx, pattern0_0);
7498             match &pattern4_0 {
7499                 &InstructionData::Binary {
7500                     opcode: ref pattern5_0,
7501                     args: ref pattern5_1,
7502                 } => {
7503                     match pattern5_0 {
7504                         &Opcode::Band => {
7505                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7506                             // Rule at src/isa/x64/lower.isle line 328.
7507                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
7508                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
7509                             let expr2_0 = constructor_sse_and(ctx, pattern2_0, expr0_0, &expr1_0)?;
7510                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7511                             return Some(expr3_0);
7512                         }
7513                         &Opcode::Bor => {
7514                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7515                             // Rule at src/isa/x64/lower.isle line 392.
7516                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
7517                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
7518                             let expr2_0 = constructor_sse_or(ctx, pattern2_0, expr0_0, &expr1_0)?;
7519                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7520                             return Some(expr3_0);
7521                         }
7522                         &Opcode::Bxor => {
7523                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7524                             // Rule at src/isa/x64/lower.isle line 453.
7525                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
7526                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
7527                             let expr2_0 = constructor_sse_xor(ctx, pattern2_0, expr0_0, &expr1_0)?;
7528                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7529                             return Some(expr3_0);
7530                         }
7531                         _ => {}
7532                     }
7533                 }
7534                 &InstructionData::Ternary {
7535                     opcode: ref pattern5_0,
7536                     args: ref pattern5_1,
7537                 } => {
7538                     match pattern5_0 {
7539                         &Opcode::Bitselect => {
7540                             let (pattern7_0, pattern7_1, pattern7_2) =
7541                                 C::unpack_value_array_3(ctx, pattern5_1);
7542                             // Rule at src/isa/x64/lower.isle line 1279.
7543                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
7544                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
7545                             let expr2_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
7546                             let expr3_0 = constructor_sse_and(ctx, pattern2_0, expr1_0, &expr2_0)?;
7547                             let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern7_2)?;
7548                             let expr5_0 =
7549                                 constructor_sse_and_not(ctx, pattern2_0, expr0_0, &expr4_0)?;
7550                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr3_0);
7551                             let expr7_0 = constructor_sse_or(ctx, pattern2_0, expr5_0, &expr6_0)?;
7552                             let expr8_0 = constructor_output_xmm(ctx, expr7_0)?;
7553                             return Some(expr8_0);
7554                         }
7555                         &Opcode::Vselect => {
7556                             let (pattern7_0, pattern7_1, pattern7_2) =
7557                                 C::unpack_value_array_3(ctx, pattern5_1);
7558                             // Rule at src/isa/x64/lower.isle line 1293.
7559                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern7_0)?;
7560                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
7561                             let expr2_0 = constructor_put_in_xmm(ctx, pattern7_2)?;
7562                             let expr3_0 = constructor_sse_blend(
7563                                 ctx, pattern2_0, &expr0_0, &expr1_0, expr2_0,
7564                             )?;
7565                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
7566                             return Some(expr4_0);
7567                         }
7568                         _ => {}
7569                     }
7570                 }
7571                 &InstructionData::Unary {
7572                     opcode: ref pattern5_0,
7573                     arg: pattern5_1,
7574                 } => {
7575                     if let &Opcode::Bnot = pattern5_0 {
7576                         // Rule at src/isa/x64/lower.isle line 1274.
7577                         let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
7578                         let expr1_0 = constructor_vector_all_ones(ctx, pattern2_0)?;
7579                         let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
7580                         let expr3_0 = constructor_sse_xor(ctx, pattern2_0, expr0_0, &expr2_0)?;
7581                         let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
7582                         return Some(expr4_0);
7583                     }
7584                 }
7585                 _ => {}
7586             }
7587         }
7588         if let Some(pattern3_0) = C::fits_in_32(ctx, pattern2_0) {
7589             let pattern4_0 = C::inst_data(ctx, pattern0_0);
7590             if let &InstructionData::Unary {
7591                 opcode: ref pattern5_0,
7592                 arg: pattern5_1,
7593             } = &pattern4_0
7594             {
7595                 if let &Opcode::Uextend = pattern5_0 {
7596                     let pattern7_0 = C::value_type(ctx, pattern5_1);
7597                     if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) {
7598                         // Rule at src/isa/x64/lower.isle line 1882.
7599                         let expr0_0: Type = I32;
7600                         let expr1_0 = ExtendKind::Zero;
7601                         let expr2_0 =
7602                             constructor_extend_to_gpr(ctx, pattern5_1, expr0_0, &expr1_0)?;
7603                         let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7604                         return Some(expr3_0);
7605                     }
7606                 }
7607             }
7608         }
7609         if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) {
7610             let pattern4_0 = C::inst_data(ctx, pattern0_0);
7611             match &pattern4_0 {
7612                 &InstructionData::UnaryImm {
7613                     opcode: ref pattern5_0,
7614                     imm: pattern5_1,
7615                 } => {
7616                     if let &Opcode::Iconst = pattern5_0 {
7617                         let pattern7_0 = C::u64_from_imm64(ctx, pattern5_1);
7618                         // Rule at src/isa/x64/lower.isle line 10.
7619                         let expr0_0 = constructor_imm(ctx, pattern3_0, pattern7_0)?;
7620                         let expr1_0 = constructor_output_reg(ctx, expr0_0)?;
7621                         return Some(expr1_0);
7622                     }
7623                 }
7624                 &InstructionData::UnaryBool {
7625                     opcode: ref pattern5_0,
7626                     imm: pattern5_1,
7627                 } => {
7628                     if let &Opcode::Bconst = pattern5_0 {
7629                         if pattern5_1 == true {
7630                             // Rule at src/isa/x64/lower.isle line 28.
7631                             let expr0_0: u64 = 1;
7632                             let expr1_0 = constructor_imm(ctx, pattern3_0, expr0_0)?;
7633                             let expr2_0 = constructor_output_reg(ctx, expr1_0)?;
7634                             return Some(expr2_0);
7635                         }
7636                         if pattern5_1 == false {
7637                             // Rule at src/isa/x64/lower.isle line 24.
7638                             let expr0_0: u64 = 0;
7639                             let expr1_0 = constructor_imm(ctx, pattern3_0, expr0_0)?;
7640                             let expr2_0 = constructor_output_reg(ctx, expr1_0)?;
7641                             return Some(expr2_0);
7642                         }
7643                     }
7644                 }
7645                 &InstructionData::Binary {
7646                     opcode: ref pattern5_0,
7647                     args: ref pattern5_1,
7648                 } => {
7649                     match pattern5_0 {
7650                         &Opcode::Imin => {
7651                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7652                             // Rule at src/isa/x64/lower.isle line 1383.
7653                             let expr0_0 = CC::L;
7654                             let expr1_0 = constructor_cmp_and_choose(
7655                                 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1,
7656                             )?;
7657                             let expr2_0 = C::output(ctx, expr1_0);
7658                             return Some(expr2_0);
7659                         }
7660                         &Opcode::Umin => {
7661                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7662                             // Rule at src/isa/x64/lower.isle line 1377.
7663                             let expr0_0 = CC::B;
7664                             let expr1_0 = constructor_cmp_and_choose(
7665                                 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1,
7666                             )?;
7667                             let expr2_0 = C::output(ctx, expr1_0);
7668                             return Some(expr2_0);
7669                         }
7670                         &Opcode::Imax => {
7671                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7672                             // Rule at src/isa/x64/lower.isle line 1386.
7673                             let expr0_0 = CC::NL;
7674                             let expr1_0 = constructor_cmp_and_choose(
7675                                 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1,
7676                             )?;
7677                             let expr2_0 = C::output(ctx, expr1_0);
7678                             return Some(expr2_0);
7679                         }
7680                         &Opcode::Umax => {
7681                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7682                             // Rule at src/isa/x64/lower.isle line 1380.
7683                             let expr0_0 = CC::NB;
7684                             let expr1_0 = constructor_cmp_and_choose(
7685                                 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1,
7686                             )?;
7687                             let expr2_0 = C::output(ctx, expr1_0);
7688                             return Some(expr2_0);
7689                         }
7690                         &Opcode::Iadd => {
7691                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7692                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
7693                                 // Rule at src/isa/x64/lower.isle line 74.
7694                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
7695                                 let expr1_0 =
7696                                     constructor_add(ctx, pattern3_0, expr0_0, &pattern8_0)?;
7697                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
7698                                 return Some(expr2_0);
7699                             }
7700                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
7701                                 // Rule at src/isa/x64/lower.isle line 86.
7702                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
7703                                 let expr1_0 =
7704                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
7705                                 let expr2_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr1_0)?;
7706                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7707                                 return Some(expr3_0);
7708                             }
7709                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
7710                                 // Rule at src/isa/x64/lower.isle line 70.
7711                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
7712                                 let expr1_0 =
7713                                     constructor_add(ctx, pattern3_0, expr0_0, &pattern8_0)?;
7714                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
7715                                 return Some(expr2_0);
7716                             }
7717                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
7718                                 // Rule at src/isa/x64/lower.isle line 80.
7719                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
7720                                 let expr1_0 =
7721                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
7722                                 let expr2_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr1_0)?;
7723                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7724                                 return Some(expr3_0);
7725                             }
7726                             // Rule at src/isa/x64/lower.isle line 64.
7727                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
7728                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
7729                             let expr2_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr1_0)?;
7730                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7731                             return Some(expr3_0);
7732                         }
7733                         &Opcode::Isub => {
7734                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7735                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
7736                                 // Rule at src/isa/x64/lower.isle line 228.
7737                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
7738                                 let expr1_0 =
7739                                     constructor_sub(ctx, pattern3_0, expr0_0, &pattern8_0)?;
7740                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
7741                                 return Some(expr2_0);
7742                             }
7743                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
7744                                 // Rule at src/isa/x64/lower.isle line 233.
7745                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
7746                                 let expr1_0 =
7747                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
7748                                 let expr2_0 = constructor_sub(ctx, pattern3_0, expr0_0, &expr1_0)?;
7749                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7750                                 return Some(expr3_0);
7751                             }
7752                             // Rule at src/isa/x64/lower.isle line 223.
7753                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
7754                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
7755                             let expr2_0 = constructor_sub(ctx, pattern3_0, expr0_0, &expr1_0)?;
7756                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7757                             return Some(expr3_0);
7758                         }
7759                         &Opcode::Imul => {
7760                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7761                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
7762                                 // Rule at src/isa/x64/lower.isle line 925.
7763                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
7764                                 let expr1_0 =
7765                                     constructor_mul(ctx, pattern3_0, expr0_0, &pattern8_0)?;
7766                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
7767                                 return Some(expr2_0);
7768                             }
7769                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
7770                                 // Rule at src/isa/x64/lower.isle line 937.
7771                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
7772                                 let expr1_0 =
7773                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
7774                                 let expr2_0 = constructor_mul(ctx, pattern3_0, expr0_0, &expr1_0)?;
7775                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7776                                 return Some(expr3_0);
7777                             }
7778                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
7779                                 // Rule at src/isa/x64/lower.isle line 921.
7780                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
7781                                 let expr1_0 =
7782                                     constructor_mul(ctx, pattern3_0, expr0_0, &pattern8_0)?;
7783                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
7784                                 return Some(expr2_0);
7785                             }
7786                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
7787                                 // Rule at src/isa/x64/lower.isle line 931.
7788                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
7789                                 let expr1_0 =
7790                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
7791                                 let expr2_0 = constructor_mul(ctx, pattern3_0, expr0_0, &expr1_0)?;
7792                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7793                                 return Some(expr3_0);
7794                             }
7795                             // Rule at src/isa/x64/lower.isle line 916.
7796                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
7797                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
7798                             let expr2_0 = constructor_mul(ctx, pattern3_0, expr0_0, &expr1_0)?;
7799                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7800                             return Some(expr3_0);
7801                         }
7802                         &Opcode::IaddIfcout => {
7803                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7804                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
7805                                 // Rule at src/isa/x64/lower.isle line 171.
7806                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
7807                                 let expr1_0 =
7808                                     constructor_add(ctx, pattern3_0, expr0_0, &pattern8_0)?;
7809                                 let expr2_0 = C::gpr_to_reg(ctx, expr1_0);
7810                                 let expr3_0 = constructor_output_ifcout(ctx, expr2_0)?;
7811                                 return Some(expr3_0);
7812                             }
7813                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
7814                                 // Rule at src/isa/x64/lower.isle line 181.
7815                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
7816                                 let expr1_0 =
7817                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
7818                                 let expr2_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr1_0)?;
7819                                 let expr3_0 = C::gpr_to_reg(ctx, expr2_0);
7820                                 let expr4_0 = constructor_output_ifcout(ctx, expr3_0)?;
7821                                 return Some(expr4_0);
7822                             }
7823                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
7824                                 // Rule at src/isa/x64/lower.isle line 167.
7825                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
7826                                 let expr1_0 =
7827                                     constructor_add(ctx, pattern3_0, expr0_0, &pattern8_0)?;
7828                                 let expr2_0 = C::gpr_to_reg(ctx, expr1_0);
7829                                 let expr3_0 = constructor_output_ifcout(ctx, expr2_0)?;
7830                                 return Some(expr3_0);
7831                             }
7832                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
7833                                 // Rule at src/isa/x64/lower.isle line 177.
7834                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
7835                                 let expr1_0 =
7836                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
7837                                 let expr2_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr1_0)?;
7838                                 let expr3_0 = C::gpr_to_reg(ctx, expr2_0);
7839                                 let expr4_0 = constructor_output_ifcout(ctx, expr3_0)?;
7840                                 return Some(expr4_0);
7841                             }
7842                             // Rule at src/isa/x64/lower.isle line 161.
7843                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
7844                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
7845                             let expr2_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr1_0)?;
7846                             let expr3_0 = C::gpr_to_reg(ctx, expr2_0);
7847                             let expr4_0 = constructor_output_ifcout(ctx, expr3_0)?;
7848                             return Some(expr4_0);
7849                         }
7850                         &Opcode::Band => {
7851                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7852                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
7853                                 // Rule at src/isa/x64/lower.isle line 317.
7854                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
7855                                 let expr1_0 =
7856                                     constructor_x64_and(ctx, pattern3_0, expr0_0, &pattern8_0)?;
7857                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
7858                                 return Some(expr2_0);
7859                             }
7860                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
7861                                 // Rule at src/isa/x64/lower.isle line 305.
7862                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
7863                                 let expr1_0 =
7864                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
7865                                 let expr2_0 =
7866                                     constructor_x64_and(ctx, pattern3_0, expr0_0, &expr1_0)?;
7867                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7868                                 return Some(expr3_0);
7869                             }
7870                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
7871                                 // Rule at src/isa/x64/lower.isle line 313.
7872                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
7873                                 let expr1_0 =
7874                                     constructor_x64_and(ctx, pattern3_0, expr0_0, &pattern8_0)?;
7875                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
7876                                 return Some(expr2_0);
7877                             }
7878                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
7879                                 // Rule at src/isa/x64/lower.isle line 300.
7880                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
7881                                 let expr1_0 =
7882                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
7883                                 let expr2_0 =
7884                                     constructor_x64_and(ctx, pattern3_0, expr0_0, &expr1_0)?;
7885                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7886                                 return Some(expr3_0);
7887                             }
7888                             // Rule at src/isa/x64/lower.isle line 295.
7889                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
7890                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
7891                             let expr2_0 = constructor_x64_and(ctx, pattern3_0, expr0_0, &expr1_0)?;
7892                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7893                             return Some(expr3_0);
7894                         }
7895                         &Opcode::Bor => {
7896                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7897                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
7898                                 // Rule at src/isa/x64/lower.isle line 381.
7899                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
7900                                 let expr1_0 =
7901                                     constructor_or(ctx, pattern3_0, expr0_0, &pattern8_0)?;
7902                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
7903                                 return Some(expr2_0);
7904                             }
7905                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
7906                                 // Rule at src/isa/x64/lower.isle line 370.
7907                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
7908                                 let expr1_0 =
7909                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
7910                                 let expr2_0 = constructor_or(ctx, pattern3_0, expr0_0, &expr1_0)?;
7911                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7912                                 return Some(expr3_0);
7913                             }
7914                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
7915                                 // Rule at src/isa/x64/lower.isle line 377.
7916                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
7917                                 let expr1_0 =
7918                                     constructor_or(ctx, pattern3_0, expr0_0, &pattern8_0)?;
7919                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
7920                                 return Some(expr2_0);
7921                             }
7922                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
7923                                 // Rule at src/isa/x64/lower.isle line 365.
7924                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
7925                                 let expr1_0 =
7926                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
7927                                 let expr2_0 = constructor_or(ctx, pattern3_0, expr0_0, &expr1_0)?;
7928                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7929                                 return Some(expr3_0);
7930                             }
7931                             // Rule at src/isa/x64/lower.isle line 360.
7932                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
7933                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
7934                             let expr2_0 = constructor_or(ctx, pattern3_0, expr0_0, &expr1_0)?;
7935                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7936                             return Some(expr3_0);
7937                         }
7938                         &Opcode::Bxor => {
7939                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7940                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
7941                                 // Rule at src/isa/x64/lower.isle line 447.
7942                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
7943                                 let expr1_0 =
7944                                     constructor_xor(ctx, pattern3_0, expr0_0, &pattern8_0)?;
7945                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
7946                                 return Some(expr2_0);
7947                             }
7948                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
7949                                 // Rule at src/isa/x64/lower.isle line 436.
7950                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
7951                                 let expr1_0 =
7952                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
7953                                 let expr2_0 = constructor_xor(ctx, pattern3_0, expr0_0, &expr1_0)?;
7954                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7955                                 return Some(expr3_0);
7956                             }
7957                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
7958                                 // Rule at src/isa/x64/lower.isle line 443.
7959                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
7960                                 let expr1_0 =
7961                                     constructor_xor(ctx, pattern3_0, expr0_0, &pattern8_0)?;
7962                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
7963                                 return Some(expr2_0);
7964                             }
7965                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
7966                                 // Rule at src/isa/x64/lower.isle line 431.
7967                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
7968                                 let expr1_0 =
7969                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
7970                                 let expr2_0 = constructor_xor(ctx, pattern3_0, expr0_0, &expr1_0)?;
7971                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7972                                 return Some(expr3_0);
7973                             }
7974                             // Rule at src/isa/x64/lower.isle line 426.
7975                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
7976                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
7977                             let expr2_0 = constructor_xor(ctx, pattern3_0, expr0_0, &expr1_0)?;
7978                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7979                             return Some(expr3_0);
7980                         }
7981                         &Opcode::Ishl => {
7982                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7983                             // Rule at src/isa/x64/lower.isle line 483.
7984                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
7985                             let expr1_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0);
7986                             let expr2_0 = constructor_shl(ctx, pattern3_0, expr0_0, &expr1_0)?;
7987                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7988                             return Some(expr3_0);
7989                         }
7990                         &Opcode::Ushr => {
7991                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7992                             // Rule at src/isa/x64/lower.isle line 589.
7993                             let expr0_0 = ExtendKind::Zero;
7994                             let expr1_0 =
7995                                 constructor_extend_to_gpr(ctx, pattern7_0, pattern3_0, &expr0_0)?;
7996                             let expr2_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0);
7997                             let expr3_0 = constructor_shr(ctx, pattern3_0, expr1_0, &expr2_0)?;
7998                             let expr4_0 = constructor_output_gpr(ctx, expr3_0)?;
7999                             return Some(expr4_0);
8000                         }
8001                         &Opcode::Sshr => {
8002                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8003                             // Rule at src/isa/x64/lower.isle line 691.
8004                             let expr0_0 = ExtendKind::Sign;
8005                             let expr1_0 =
8006                                 constructor_extend_to_gpr(ctx, pattern7_0, pattern3_0, &expr0_0)?;
8007                             let expr2_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0);
8008                             let expr3_0 = constructor_sar(ctx, pattern3_0, expr1_0, &expr2_0)?;
8009                             let expr4_0 = constructor_output_gpr(ctx, expr3_0)?;
8010                             return Some(expr4_0);
8011                         }
8012                         _ => {}
8013                     }
8014                 }
8015                 &InstructionData::Unary {
8016                     opcode: ref pattern5_0,
8017                     arg: pattern5_1,
8018                 } => {
8019                     match pattern5_0 {
8020                         &Opcode::Ineg => {
8021                             // Rule at src/isa/x64/lower.isle line 884.
8022                             let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
8023                             let expr1_0 = constructor_neg(ctx, pattern3_0, expr0_0)?;
8024                             let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
8025                             return Some(expr2_0);
8026                         }
8027                         &Opcode::Bnot => {
8028                             // Rule at src/isa/x64/lower.isle line 1253.
8029                             let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
8030                             let expr1_0 = constructor_not(ctx, pattern3_0, expr0_0)?;
8031                             let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
8032                             return Some(expr2_0);
8033                         }
8034                         &Opcode::Breduce => {
8035                             // Rule at src/isa/x64/lower.isle line 1987.
8036                             let expr0_0 = C::put_in_regs(ctx, pattern5_1);
8037                             let expr1_0: usize = 0;
8038                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
8039                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8040                             return Some(expr3_0);
8041                         }
8042                         &Opcode::Bint => {
8043                             // Rule at src/isa/x64/lower.isle line 1995.
8044                             let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
8045                             let expr1_0: u32 = 1;
8046                             let expr2_0 = RegMemImm::Imm { simm32: expr1_0 };
8047                             let expr3_0 = C::gpr_mem_imm_new(ctx, &expr2_0);
8048                             let expr4_0 = constructor_x64_and(ctx, pattern3_0, expr0_0, &expr3_0)?;
8049                             let expr5_0 = constructor_output_gpr(ctx, expr4_0)?;
8050                             return Some(expr5_0);
8051                         }
8052                         &Opcode::Ireduce => {
8053                             // Rule at src/isa/x64/lower.isle line 1979.
8054                             let expr0_0 = C::put_in_regs(ctx, pattern5_1);
8055                             let expr1_0: usize = 0;
8056                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
8057                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8058                             return Some(expr3_0);
8059                         }
8060                         _ => {}
8061                     }
8062                 }
8063                 &InstructionData::BinaryImm64 {
8064                     opcode: ref pattern5_0,
8065                     arg: pattern5_1,
8066                     imm: pattern5_2,
8067                 } => {
8068                     if let &Opcode::IaddImm = pattern5_0 {
8069                         let pattern7_0 = C::u64_from_imm64(ctx, pattern5_2);
8070                         // Rule at src/isa/x64/lower.isle line 196.
8071                         let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
8072                         let expr1_0 = constructor_imm(ctx, pattern3_0, pattern7_0)?;
8073                         let expr2_0 = constructor_reg_to_gpr_mem_imm(ctx, expr1_0)?;
8074                         let expr3_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr2_0)?;
8075                         let expr4_0 = constructor_output_gpr(ctx, expr3_0)?;
8076                         return Some(expr4_0);
8077                     }
8078                 }
8079                 _ => {}
8080             }
8081         }
8082         if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) {
8083             let pattern4_0 = C::inst_data(ctx, pattern0_0);
8084             match &pattern4_0 {
8085                 &InstructionData::Binary {
8086                     opcode: ref pattern5_0,
8087                     args: ref pattern5_1,
8088                 } => {
8089                     match pattern5_0 {
8090                         &Opcode::Rotl => {
8091                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8092                             if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) {
8093                                 let pattern9_0 = C::inst_data(ctx, pattern8_0);
8094                                 if let &InstructionData::UnaryImm {
8095                                     opcode: ref pattern10_0,
8096                                     imm: pattern10_1,
8097                                 } = &pattern9_0
8098                                 {
8099                                     if let &Opcode::Iconst = pattern10_0 {
8100                                         let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1);
8101                                         // Rule at src/isa/x64/lower.isle line 823.
8102                                         let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8103                                         let expr1_0 = C::const_to_type_masked_imm8(
8104                                             ctx,
8105                                             pattern12_0,
8106                                             pattern3_0,
8107                                         );
8108                                         let expr2_0 = constructor_x64_rotl(
8109                                             ctx, pattern3_0, expr0_0, &expr1_0,
8110                                         )?;
8111                                         let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8112                                         return Some(expr3_0);
8113                                     }
8114                                 }
8115                             }
8116                             // Rule at src/isa/x64/lower.isle line 817.
8117                             let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?;
8118                             let expr1_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8119                             let expr2_0 = C::gpr_to_imm8_gpr(ctx, expr0_0);
8120                             let expr3_0 = constructor_x64_rotl(ctx, pattern3_0, expr1_0, &expr2_0)?;
8121                             let expr4_0 = constructor_output_gpr(ctx, expr3_0)?;
8122                             return Some(expr4_0);
8123                         }
8124                         &Opcode::Rotr => {
8125                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8126                             if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) {
8127                                 let pattern9_0 = C::inst_data(ctx, pattern8_0);
8128                                 if let &InstructionData::UnaryImm {
8129                                     opcode: ref pattern10_0,
8130                                     imm: pattern10_1,
8131                                 } = &pattern9_0
8132                                 {
8133                                     if let &Opcode::Iconst = pattern10_0 {
8134                                         let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1);
8135                                         // Rule at src/isa/x64/lower.isle line 863.
8136                                         let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8137                                         let expr1_0 = C::const_to_type_masked_imm8(
8138                                             ctx,
8139                                             pattern12_0,
8140                                             pattern3_0,
8141                                         );
8142                                         let expr2_0 = constructor_x64_rotr(
8143                                             ctx, pattern3_0, expr0_0, &expr1_0,
8144                                         )?;
8145                                         let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8146                                         return Some(expr3_0);
8147                                     }
8148                                 }
8149                             }
8150                             // Rule at src/isa/x64/lower.isle line 857.
8151                             let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?;
8152                             let expr1_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8153                             let expr2_0 = C::gpr_to_imm8_gpr(ctx, expr0_0);
8154                             let expr3_0 = constructor_x64_rotr(ctx, pattern3_0, expr1_0, &expr2_0)?;
8155                             let expr4_0 = constructor_output_gpr(ctx, expr3_0)?;
8156                             return Some(expr4_0);
8157                         }
8158                         _ => {}
8159                     }
8160                 }
8161                 &InstructionData::Unary {
8162                     opcode: ref pattern5_0,
8163                     arg: pattern5_1,
8164                 } => {
8165                     match pattern5_0 {
8166                         &Opcode::Clz => {
8167                             // Rule at src/isa/x64/lower.isle line 1543.
8168                             let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
8169                             let expr1_0 = constructor_do_clz(ctx, pattern3_0, pattern3_0, expr0_0)?;
8170                             let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
8171                             return Some(expr2_0);
8172                         }
8173                         &Opcode::Ctz => {
8174                             // Rule at src/isa/x64/lower.isle line 1585.
8175                             let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
8176                             let expr1_0 = constructor_do_ctz(ctx, pattern3_0, pattern3_0, expr0_0)?;
8177                             let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
8178                             return Some(expr2_0);
8179                         }
8180                         &Opcode::Popcnt => {
8181                             // Rule at src/isa/x64/lower.isle line 1637.
8182                             let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
8183                             let expr1_0 = constructor_do_popcnt(ctx, pattern3_0, expr0_0)?;
8184                             let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
8185                             return Some(expr2_0);
8186                         }
8187                         _ => {}
8188                     }
8189                 }
8190                 _ => {}
8191             }
8192         }
8193         if let Some(pattern3_0) = C::ty_8_or_16(ctx, pattern2_0) {
8194             let pattern4_0 = C::inst_data(ctx, pattern0_0);
8195             match &pattern4_0 {
8196                 &InstructionData::Binary {
8197                     opcode: ref pattern5_0,
8198                     args: ref pattern5_1,
8199                 } => {
8200                     match pattern5_0 {
8201                         &Opcode::Rotl => {
8202                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8203                             if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) {
8204                                 let pattern9_0 = C::inst_data(ctx, pattern8_0);
8205                                 if let &InstructionData::UnaryImm {
8206                                     opcode: ref pattern10_0,
8207                                     imm: pattern10_1,
8208                                 } = &pattern9_0
8209                                 {
8210                                     if let &Opcode::Iconst = pattern10_0 {
8211                                         let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1);
8212                                         // Rule at src/isa/x64/lower.isle line 809.
8213                                         let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8214                                         let expr1_0 = C::const_to_type_masked_imm8(
8215                                             ctx,
8216                                             pattern12_0,
8217                                             pattern3_0,
8218                                         );
8219                                         let expr2_0 = constructor_x64_rotl(
8220                                             ctx, pattern3_0, expr0_0, &expr1_0,
8221                                         )?;
8222                                         let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8223                                         return Some(expr3_0);
8224                                     }
8225                                 }
8226                             }
8227                             // Rule at src/isa/x64/lower.isle line 805.
8228                             let expr0_0: Type = I32;
8229                             let expr1_0 = ExtendKind::Zero;
8230                             let expr2_0 =
8231                                 constructor_extend_to_gpr(ctx, pattern7_1, expr0_0, &expr1_0)?;
8232                             let expr3_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8233                             let expr4_0 = C::gpr_to_imm8_gpr(ctx, expr2_0);
8234                             let expr5_0 = constructor_x64_rotl(ctx, pattern3_0, expr3_0, &expr4_0)?;
8235                             let expr6_0 = constructor_output_gpr(ctx, expr5_0)?;
8236                             return Some(expr6_0);
8237                         }
8238                         &Opcode::Rotr => {
8239                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8240                             if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) {
8241                                 let pattern9_0 = C::inst_data(ctx, pattern8_0);
8242                                 if let &InstructionData::UnaryImm {
8243                                     opcode: ref pattern10_0,
8244                                     imm: pattern10_1,
8245                                 } = &pattern9_0
8246                                 {
8247                                     if let &Opcode::Iconst = pattern10_0 {
8248                                         let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1);
8249                                         // Rule at src/isa/x64/lower.isle line 849.
8250                                         let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8251                                         let expr1_0 = C::const_to_type_masked_imm8(
8252                                             ctx,
8253                                             pattern12_0,
8254                                             pattern3_0,
8255                                         );
8256                                         let expr2_0 = constructor_x64_rotr(
8257                                             ctx, pattern3_0, expr0_0, &expr1_0,
8258                                         )?;
8259                                         let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8260                                         return Some(expr3_0);
8261                                     }
8262                                 }
8263                             }
8264                             // Rule at src/isa/x64/lower.isle line 845.
8265                             let expr0_0: Type = I32;
8266                             let expr1_0 = ExtendKind::Zero;
8267                             let expr2_0 =
8268                                 constructor_extend_to_gpr(ctx, pattern7_1, expr0_0, &expr1_0)?;
8269                             let expr3_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8270                             let expr4_0 = C::gpr_to_imm8_gpr(ctx, expr2_0);
8271                             let expr5_0 = constructor_x64_rotr(ctx, pattern3_0, expr3_0, &expr4_0)?;
8272                             let expr6_0 = constructor_output_gpr(ctx, expr5_0)?;
8273                             return Some(expr6_0);
8274                         }
8275                         _ => {}
8276                     }
8277                 }
8278                 &InstructionData::Unary {
8279                     opcode: ref pattern5_0,
8280                     arg: pattern5_1,
8281                 } => {
8282                     match pattern5_0 {
8283                         &Opcode::Clz => {
8284                             // Rule at src/isa/x64/lower.isle line 1548.
8285                             let expr0_0: Type = I32;
8286                             let expr1_0: Type = I32;
8287                             let expr2_0 = ExtendKind::Zero;
8288                             let expr3_0 =
8289                                 constructor_extend_to_gpr(ctx, pattern5_1, expr1_0, &expr2_0)?;
8290                             let expr4_0 = constructor_do_clz(ctx, expr0_0, pattern3_0, expr3_0)?;
8291                             let expr5_0 = constructor_output_gpr(ctx, expr4_0)?;
8292                             return Some(expr5_0);
8293                         }
8294                         &Opcode::Ctz => {
8295                             // Rule at src/isa/x64/lower.isle line 1590.
8296                             let expr0_0: Type = I32;
8297                             let expr1_0: Type = I32;
8298                             let expr2_0 = ExtendKind::Zero;
8299                             let expr3_0 =
8300                                 constructor_extend_to_gpr(ctx, pattern5_1, expr1_0, &expr2_0)?;
8301                             let expr4_0 = constructor_do_ctz(ctx, expr0_0, pattern3_0, expr3_0)?;
8302                             let expr5_0 = constructor_output_gpr(ctx, expr4_0)?;
8303                             return Some(expr5_0);
8304                         }
8305                         &Opcode::Popcnt => {
8306                             // Rule at src/isa/x64/lower.isle line 1642.
8307                             let expr0_0: Type = I32;
8308                             let expr1_0: Type = I32;
8309                             let expr2_0 = ExtendKind::Zero;
8310                             let expr3_0 =
8311                                 constructor_extend_to_gpr(ctx, pattern5_1, expr1_0, &expr2_0)?;
8312                             let expr4_0 = constructor_do_popcnt(ctx, expr0_0, expr3_0)?;
8313                             let expr5_0 = constructor_output_gpr(ctx, expr4_0)?;
8314                             return Some(expr5_0);
8315                         }
8316                         _ => {}
8317                     }
8318                 }
8319                 _ => {}
8320             }
8321         }
8322     }
8323     return None;
8324 }
8325 
8326 // Generated as internal constructor for term output_ifcout.
8327 pub fn constructor_output_ifcout<C: Context>(ctx: &mut C, arg0: Reg) -> Option<InstOutput> {
8328     let pattern0_0 = arg0;
8329     // Rule at src/isa/x64/lower.isle line 157.
8330     let expr0_0 = C::value_reg(ctx, pattern0_0);
8331     let expr1_0 = C::value_regs_invalid(ctx);
8332     let expr2_0 = C::output_pair(ctx, expr0_0, expr1_0);
8333     return Some(expr2_0);
8334 }
8335 
8336 // Generated as internal constructor for term sse_and.
8337 pub fn constructor_sse_and<C: Context>(
8338     ctx: &mut C,
8339     arg0: Type,
8340     arg1: Xmm,
8341     arg2: &XmmMem,
8342 ) -> Option<Xmm> {
8343     let pattern0_0 = arg0;
8344     if pattern0_0 == F32X4 {
8345         let pattern2_0 = arg1;
8346         let pattern3_0 = arg2;
8347         // Rule at src/isa/x64/lower.isle line 324.
8348         let expr0_0 = constructor_andps(ctx, pattern2_0, pattern3_0)?;
8349         return Some(expr0_0);
8350     }
8351     if pattern0_0 == F64X2 {
8352         let pattern2_0 = arg1;
8353         let pattern3_0 = arg2;
8354         // Rule at src/isa/x64/lower.isle line 325.
8355         let expr0_0 = constructor_andpd(ctx, pattern2_0, pattern3_0)?;
8356         return Some(expr0_0);
8357     }
8358     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
8359         let pattern2_0 = arg1;
8360         let pattern3_0 = arg2;
8361         // Rule at src/isa/x64/lower.isle line 326.
8362         let expr0_0 = constructor_pand(ctx, pattern2_0, pattern3_0)?;
8363         return Some(expr0_0);
8364     }
8365     return None;
8366 }
8367 
8368 // Generated as internal constructor for term sse_or.
8369 pub fn constructor_sse_or<C: Context>(
8370     ctx: &mut C,
8371     arg0: Type,
8372     arg1: Xmm,
8373     arg2: &XmmMem,
8374 ) -> Option<Xmm> {
8375     let pattern0_0 = arg0;
8376     if pattern0_0 == F32X4 {
8377         let pattern2_0 = arg1;
8378         let pattern3_0 = arg2;
8379         // Rule at src/isa/x64/lower.isle line 388.
8380         let expr0_0 = constructor_orps(ctx, pattern2_0, pattern3_0)?;
8381         return Some(expr0_0);
8382     }
8383     if pattern0_0 == F64X2 {
8384         let pattern2_0 = arg1;
8385         let pattern3_0 = arg2;
8386         // Rule at src/isa/x64/lower.isle line 389.
8387         let expr0_0 = constructor_orpd(ctx, pattern2_0, pattern3_0)?;
8388         return Some(expr0_0);
8389     }
8390     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
8391         let pattern2_0 = arg1;
8392         let pattern3_0 = arg2;
8393         // Rule at src/isa/x64/lower.isle line 390.
8394         let expr0_0 = constructor_por(ctx, pattern2_0, pattern3_0)?;
8395         return Some(expr0_0);
8396     }
8397     return None;
8398 }
8399 
8400 // Generated as internal constructor for term or_i128.
8401 pub fn constructor_or_i128<C: Context>(
8402     ctx: &mut C,
8403     arg0: ValueRegs,
8404     arg1: ValueRegs,
8405 ) -> Option<ValueRegs> {
8406     let pattern0_0 = arg0;
8407     let pattern1_0 = arg1;
8408     // Rule at src/isa/x64/lower.isle line 399.
8409     let expr0_0: usize = 0;
8410     let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?;
8411     let expr2_0: usize = 1;
8412     let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?;
8413     let expr4_0: usize = 0;
8414     let expr5_0 = constructor_value_regs_get_gpr(ctx, pattern1_0, expr4_0)?;
8415     let expr6_0: usize = 1;
8416     let expr7_0 = constructor_value_regs_get_gpr(ctx, pattern1_0, expr6_0)?;
8417     let expr8_0: Type = I64;
8418     let expr9_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
8419     let expr10_0 = constructor_or(ctx, expr8_0, expr1_0, &expr9_0)?;
8420     let expr11_0: Type = I64;
8421     let expr12_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
8422     let expr13_0 = constructor_or(ctx, expr11_0, expr3_0, &expr12_0)?;
8423     let expr14_0 = constructor_value_gprs(ctx, expr10_0, expr13_0)?;
8424     return Some(expr14_0);
8425 }
8426 
8427 // Generated as internal constructor for term shl_i128.
8428 pub fn constructor_shl_i128<C: Context>(
8429     ctx: &mut C,
8430     arg0: ValueRegs,
8431     arg1: Gpr,
8432 ) -> Option<ValueRegs> {
8433     let pattern0_0 = arg0;
8434     let pattern1_0 = arg1;
8435     // Rule at src/isa/x64/lower.isle line 489.
8436     let expr0_0: usize = 0;
8437     let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?;
8438     let expr2_0: usize = 1;
8439     let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?;
8440     let expr4_0: Type = I64;
8441     let expr5_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
8442     let expr6_0 = constructor_shl(ctx, expr4_0, expr1_0, &expr5_0)?;
8443     let expr7_0: Type = I64;
8444     let expr8_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
8445     let expr9_0 = constructor_shl(ctx, expr7_0, expr3_0, &expr8_0)?;
8446     let expr10_0: Type = I64;
8447     let expr11_0: Type = I64;
8448     let expr12_0: Type = I64;
8449     let expr13_0: u64 = 64;
8450     let expr14_0 = constructor_imm(ctx, expr12_0, expr13_0)?;
8451     let expr15_0 = C::gpr_new(ctx, expr14_0);
8452     let expr16_0 = C::gpr_to_gpr_mem_imm(ctx, pattern1_0);
8453     let expr17_0 = constructor_sub(ctx, expr11_0, expr15_0, &expr16_0)?;
8454     let expr18_0 = C::gpr_to_imm8_gpr(ctx, expr17_0);
8455     let expr19_0 = constructor_shr(ctx, expr10_0, expr1_0, &expr18_0)?;
8456     let expr20_0: Type = I64;
8457     let expr21_0: u64 = 0;
8458     let expr22_0 = constructor_imm(ctx, expr20_0, expr21_0)?;
8459     let expr23_0 = C::gpr_new(ctx, expr22_0);
8460     let expr24_0 = OperandSize::Size64;
8461     let expr25_0: u32 = 127;
8462     let expr26_0 = RegMemImm::Imm { simm32: expr25_0 };
8463     let expr27_0 = C::gpr_mem_imm_new(ctx, &expr26_0);
8464     let expr28_0 = constructor_test(ctx, &expr24_0, &expr27_0, pattern1_0)?;
8465     let expr29_0: Type = I64;
8466     let expr30_0 = CC::Z;
8467     let expr31_0 = C::gpr_to_gpr_mem(ctx, expr23_0);
8468     let expr32_0 = constructor_cmove(ctx, expr29_0, &expr30_0, &expr31_0, expr19_0)?;
8469     let expr33_0 = constructor_with_flags_reg(ctx, &expr28_0, &expr32_0)?;
8470     let expr34_0 = C::gpr_new(ctx, expr33_0);
8471     let expr35_0: Type = I64;
8472     let expr36_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
8473     let expr37_0 = constructor_or(ctx, expr35_0, expr34_0, &expr36_0)?;
8474     let expr38_0 = OperandSize::Size64;
8475     let expr39_0: u32 = 64;
8476     let expr40_0 = RegMemImm::Imm { simm32: expr39_0 };
8477     let expr41_0 = C::gpr_mem_imm_new(ctx, &expr40_0);
8478     let expr42_0 = constructor_test(ctx, &expr38_0, &expr41_0, pattern1_0)?;
8479     let expr43_0: Type = I64;
8480     let expr44_0 = CC::Z;
8481     let expr45_0 = C::gpr_to_gpr_mem(ctx, expr6_0);
8482     let expr46_0 = constructor_cmove(ctx, expr43_0, &expr44_0, &expr45_0, expr23_0)?;
8483     let expr47_0: Type = I64;
8484     let expr48_0 = CC::Z;
8485     let expr49_0 = C::gpr_to_gpr_mem(ctx, expr37_0);
8486     let expr50_0 = constructor_cmove(ctx, expr47_0, &expr48_0, &expr49_0, expr6_0)?;
8487     let expr51_0 = constructor_consumes_flags_concat(ctx, &expr46_0, &expr50_0)?;
8488     let expr52_0 = constructor_with_flags(ctx, &expr42_0, &expr51_0)?;
8489     return Some(expr52_0);
8490 }
8491 
8492 // Generated as internal constructor for term ishl_i8x16_mask.
8493 pub fn constructor_ishl_i8x16_mask<C: Context>(
8494     ctx: &mut C,
8495     arg0: &RegMemImm,
8496 ) -> Option<SyntheticAmode> {
8497     let pattern0_0 = arg0;
8498     match pattern0_0 {
8499         &RegMemImm::Imm { simm32: pattern1_0 } => {
8500             // Rule at src/isa/x64/lower.isle line 552.
8501             let expr0_0 = C::ishl_i8x16_mask_for_const(ctx, pattern1_0);
8502             return Some(expr0_0);
8503         }
8504         &RegMemImm::Reg { reg: pattern1_0 } => {
8505             // Rule at src/isa/x64/lower.isle line 561.
8506             let expr0_0 = C::ishl_i8x16_mask_table(ctx);
8507             let expr1_0 = constructor_lea(ctx, &expr0_0)?;
8508             let expr2_0: Type = I64;
8509             let expr3_0 = C::gpr_new(ctx, pattern1_0);
8510             let expr4_0: u8 = 4;
8511             let expr5_0 = C::imm8_to_imm8_gpr(ctx, expr4_0);
8512             let expr6_0 = constructor_shl(ctx, expr2_0, expr3_0, &expr5_0)?;
8513             let expr7_0: u32 = 0;
8514             let expr8_0: u8 = 0;
8515             let expr9_0 = C::amode_imm_reg_reg_shift(ctx, expr7_0, expr1_0, expr6_0, expr8_0);
8516             let expr10_0 = C::amode_to_synthetic_amode(ctx, &expr9_0);
8517             return Some(expr10_0);
8518         }
8519         &RegMemImm::Mem {
8520             addr: ref pattern1_0,
8521         } => {
8522             // Rule at src/isa/x64/lower.isle line 571.
8523             let expr0_0: Type = I64;
8524             let expr1_0 = ExtKind::None;
8525             let expr2_0 = constructor_x64_load(ctx, expr0_0, pattern1_0, &expr1_0)?;
8526             let expr3_0 = RegMemImm::Reg { reg: expr2_0 };
8527             let expr4_0 = constructor_ishl_i8x16_mask(ctx, &expr3_0)?;
8528             return Some(expr4_0);
8529         }
8530         _ => {}
8531     }
8532     return None;
8533 }
8534 
8535 // Generated as internal constructor for term shr_i128.
8536 pub fn constructor_shr_i128<C: Context>(
8537     ctx: &mut C,
8538     arg0: ValueRegs,
8539     arg1: Gpr,
8540 ) -> Option<ValueRegs> {
8541     let pattern0_0 = arg0;
8542     let pattern1_0 = arg1;
8543     // Rule at src/isa/x64/lower.isle line 596.
8544     let expr0_0: usize = 0;
8545     let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?;
8546     let expr2_0: usize = 1;
8547     let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?;
8548     let expr4_0: Type = I64;
8549     let expr5_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
8550     let expr6_0 = constructor_shr(ctx, expr4_0, expr1_0, &expr5_0)?;
8551     let expr7_0: Type = I64;
8552     let expr8_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
8553     let expr9_0 = constructor_shr(ctx, expr7_0, expr3_0, &expr8_0)?;
8554     let expr10_0: Type = I64;
8555     let expr11_0: Type = I64;
8556     let expr12_0: Type = I64;
8557     let expr13_0: u64 = 64;
8558     let expr14_0 = constructor_imm(ctx, expr12_0, expr13_0)?;
8559     let expr15_0 = C::gpr_new(ctx, expr14_0);
8560     let expr16_0 = C::gpr_to_gpr_mem_imm(ctx, pattern1_0);
8561     let expr17_0 = constructor_sub(ctx, expr11_0, expr15_0, &expr16_0)?;
8562     let expr18_0 = C::gpr_to_imm8_gpr(ctx, expr17_0);
8563     let expr19_0 = constructor_shl(ctx, expr10_0, expr3_0, &expr18_0)?;
8564     let expr20_0 = OperandSize::Size64;
8565     let expr21_0: u32 = 127;
8566     let expr22_0 = RegMemImm::Imm { simm32: expr21_0 };
8567     let expr23_0 = C::gpr_mem_imm_new(ctx, &expr22_0);
8568     let expr24_0 = constructor_test(ctx, &expr20_0, &expr23_0, pattern1_0)?;
8569     let expr25_0: Type = I64;
8570     let expr26_0 = CC::Z;
8571     let expr27_0: Type = I64;
8572     let expr28_0: u64 = 0;
8573     let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0)?;
8574     let expr30_0 = C::reg_to_gpr_mem(ctx, expr29_0);
8575     let expr31_0 = constructor_cmove(ctx, expr25_0, &expr26_0, &expr30_0, expr19_0)?;
8576     let expr32_0 = constructor_with_flags_reg(ctx, &expr24_0, &expr31_0)?;
8577     let expr33_0 = C::gpr_new(ctx, expr32_0);
8578     let expr34_0: Type = I64;
8579     let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr6_0);
8580     let expr36_0 = constructor_or(ctx, expr34_0, expr33_0, &expr35_0)?;
8581     let expr37_0 = OperandSize::Size64;
8582     let expr38_0: u32 = 64;
8583     let expr39_0 = RegMemImm::Imm { simm32: expr38_0 };
8584     let expr40_0 = C::gpr_mem_imm_new(ctx, &expr39_0);
8585     let expr41_0 = constructor_test(ctx, &expr37_0, &expr40_0, pattern1_0)?;
8586     let expr42_0: Type = I64;
8587     let expr43_0 = CC::Z;
8588     let expr44_0 = C::gpr_to_gpr_mem(ctx, expr36_0);
8589     let expr45_0 = constructor_cmove(ctx, expr42_0, &expr43_0, &expr44_0, expr9_0)?;
8590     let expr46_0: Type = I64;
8591     let expr47_0 = CC::Z;
8592     let expr48_0 = C::gpr_to_gpr_mem(ctx, expr9_0);
8593     let expr49_0: Type = I64;
8594     let expr50_0: u64 = 0;
8595     let expr51_0 = constructor_imm(ctx, expr49_0, expr50_0)?;
8596     let expr52_0 = C::gpr_new(ctx, expr51_0);
8597     let expr53_0 = constructor_cmove(ctx, expr46_0, &expr47_0, &expr48_0, expr52_0)?;
8598     let expr54_0 = constructor_consumes_flags_concat(ctx, &expr45_0, &expr53_0)?;
8599     let expr55_0 = constructor_with_flags(ctx, &expr41_0, &expr54_0)?;
8600     return Some(expr55_0);
8601 }
8602 
8603 // Generated as internal constructor for term ushr_i8x16_mask.
8604 pub fn constructor_ushr_i8x16_mask<C: Context>(
8605     ctx: &mut C,
8606     arg0: &RegMemImm,
8607 ) -> Option<SyntheticAmode> {
8608     let pattern0_0 = arg0;
8609     match pattern0_0 {
8610         &RegMemImm::Imm { simm32: pattern1_0 } => {
8611             // Rule at src/isa/x64/lower.isle line 653.
8612             let expr0_0 = C::ushr_i8x16_mask_for_const(ctx, pattern1_0);
8613             return Some(expr0_0);
8614         }
8615         &RegMemImm::Reg { reg: pattern1_0 } => {
8616             // Rule at src/isa/x64/lower.isle line 662.
8617             let expr0_0 = C::ushr_i8x16_mask_table(ctx);
8618             let expr1_0 = constructor_lea(ctx, &expr0_0)?;
8619             let expr2_0: Type = I64;
8620             let expr3_0 = C::gpr_new(ctx, pattern1_0);
8621             let expr4_0: u8 = 4;
8622             let expr5_0 = C::imm8_to_imm8_gpr(ctx, expr4_0);
8623             let expr6_0 = constructor_shl(ctx, expr2_0, expr3_0, &expr5_0)?;
8624             let expr7_0: u32 = 0;
8625             let expr8_0: u8 = 0;
8626             let expr9_0 = C::amode_imm_reg_reg_shift(ctx, expr7_0, expr1_0, expr6_0, expr8_0);
8627             let expr10_0 = C::amode_to_synthetic_amode(ctx, &expr9_0);
8628             return Some(expr10_0);
8629         }
8630         &RegMemImm::Mem {
8631             addr: ref pattern1_0,
8632         } => {
8633             // Rule at src/isa/x64/lower.isle line 673.
8634             let expr0_0: Type = I64;
8635             let expr1_0 = ExtKind::None;
8636             let expr2_0 = constructor_x64_load(ctx, expr0_0, pattern1_0, &expr1_0)?;
8637             let expr3_0 = RegMemImm::Reg { reg: expr2_0 };
8638             let expr4_0 = constructor_ushr_i8x16_mask(ctx, &expr3_0)?;
8639             return Some(expr4_0);
8640         }
8641         _ => {}
8642     }
8643     return None;
8644 }
8645 
8646 // Generated as internal constructor for term sar_i128.
8647 pub fn constructor_sar_i128<C: Context>(
8648     ctx: &mut C,
8649     arg0: ValueRegs,
8650     arg1: Gpr,
8651 ) -> Option<ValueRegs> {
8652     let pattern0_0 = arg0;
8653     let pattern1_0 = arg1;
8654     // Rule at src/isa/x64/lower.isle line 698.
8655     let expr0_0: usize = 0;
8656     let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?;
8657     let expr2_0: usize = 1;
8658     let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?;
8659     let expr4_0: Type = I64;
8660     let expr5_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
8661     let expr6_0 = constructor_shr(ctx, expr4_0, expr1_0, &expr5_0)?;
8662     let expr7_0: Type = I64;
8663     let expr8_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
8664     let expr9_0 = constructor_sar(ctx, expr7_0, expr3_0, &expr8_0)?;
8665     let expr10_0: Type = I64;
8666     let expr11_0: Type = I64;
8667     let expr12_0: Type = I64;
8668     let expr13_0: u64 = 64;
8669     let expr14_0 = constructor_imm(ctx, expr12_0, expr13_0)?;
8670     let expr15_0 = C::gpr_new(ctx, expr14_0);
8671     let expr16_0 = C::gpr_to_gpr_mem_imm(ctx, pattern1_0);
8672     let expr17_0 = constructor_sub(ctx, expr11_0, expr15_0, &expr16_0)?;
8673     let expr18_0 = C::gpr_to_imm8_gpr(ctx, expr17_0);
8674     let expr19_0 = constructor_shl(ctx, expr10_0, expr3_0, &expr18_0)?;
8675     let expr20_0 = OperandSize::Size64;
8676     let expr21_0: u32 = 127;
8677     let expr22_0 = RegMemImm::Imm { simm32: expr21_0 };
8678     let expr23_0 = C::gpr_mem_imm_new(ctx, &expr22_0);
8679     let expr24_0 = constructor_test(ctx, &expr20_0, &expr23_0, pattern1_0)?;
8680     let expr25_0: Type = I64;
8681     let expr26_0 = CC::Z;
8682     let expr27_0: Type = I64;
8683     let expr28_0: u64 = 0;
8684     let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0)?;
8685     let expr30_0 = C::reg_to_gpr_mem(ctx, expr29_0);
8686     let expr31_0 = constructor_cmove(ctx, expr25_0, &expr26_0, &expr30_0, expr19_0)?;
8687     let expr32_0 = constructor_with_flags_reg(ctx, &expr24_0, &expr31_0)?;
8688     let expr33_0 = C::gpr_new(ctx, expr32_0);
8689     let expr34_0: Type = I64;
8690     let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr33_0);
8691     let expr36_0 = constructor_or(ctx, expr34_0, expr6_0, &expr35_0)?;
8692     let expr37_0: Type = I64;
8693     let expr38_0: u8 = 63;
8694     let expr39_0 = C::imm8_to_imm8_gpr(ctx, expr38_0);
8695     let expr40_0 = constructor_sar(ctx, expr37_0, expr3_0, &expr39_0)?;
8696     let expr41_0 = OperandSize::Size64;
8697     let expr42_0: u32 = 64;
8698     let expr43_0 = RegMemImm::Imm { simm32: expr42_0 };
8699     let expr44_0 = C::gpr_mem_imm_new(ctx, &expr43_0);
8700     let expr45_0 = constructor_test(ctx, &expr41_0, &expr44_0, pattern1_0)?;
8701     let expr46_0: Type = I64;
8702     let expr47_0 = CC::Z;
8703     let expr48_0 = C::gpr_to_gpr_mem(ctx, expr36_0);
8704     let expr49_0 = constructor_cmove(ctx, expr46_0, &expr47_0, &expr48_0, expr9_0)?;
8705     let expr50_0: Type = I64;
8706     let expr51_0 = CC::Z;
8707     let expr52_0 = C::gpr_to_gpr_mem(ctx, expr9_0);
8708     let expr53_0 = constructor_cmove(ctx, expr50_0, &expr51_0, &expr52_0, expr40_0)?;
8709     let expr54_0 = constructor_consumes_flags_concat(ctx, &expr49_0, &expr53_0)?;
8710     let expr55_0 = constructor_with_flags(ctx, &expr45_0, &expr54_0)?;
8711     return Some(expr55_0);
8712 }
8713 
8714 // Generated as internal constructor for term sshr_i8x16_bigger_shift.
8715 pub fn constructor_sshr_i8x16_bigger_shift<C: Context>(
8716     ctx: &mut C,
8717     arg0: Type,
8718     arg1: &RegMemImm,
8719 ) -> Option<XmmMemImm> {
8720     let pattern0_0 = arg0;
8721     let pattern1_0 = arg1;
8722     match pattern1_0 {
8723         &RegMemImm::Imm { simm32: pattern2_0 } => {
8724             // Rule at src/isa/x64/lower.isle line 762.
8725             let expr0_0: u32 = 8;
8726             let expr1_0 = C::u32_add(ctx, pattern2_0, expr0_0);
8727             let expr2_0 = RegMemImm::Imm { simm32: expr1_0 };
8728             let expr3_0 = C::xmm_mem_imm_new(ctx, &expr2_0);
8729             return Some(expr3_0);
8730         }
8731         &RegMemImm::Reg { reg: pattern2_0 } => {
8732             // Rule at src/isa/x64/lower.isle line 764.
8733             let expr0_0 = C::gpr_new(ctx, pattern2_0);
8734             let expr1_0: u32 = 8;
8735             let expr2_0 = RegMemImm::Imm { simm32: expr1_0 };
8736             let expr3_0 = C::gpr_mem_imm_new(ctx, &expr2_0);
8737             let expr4_0 = constructor_add(ctx, pattern0_0, expr0_0, &expr3_0)?;
8738             let expr5_0 = C::gpr_to_reg(ctx, expr4_0);
8739             let expr6_0 = RegMemImm::Reg { reg: expr5_0 };
8740             let expr7_0 = constructor_mov_rmi_to_xmm(ctx, &expr6_0)?;
8741             return Some(expr7_0);
8742         }
8743         &RegMemImm::Mem {
8744             addr: ref pattern2_0,
8745         } => {
8746             // Rule at src/isa/x64/lower.isle line 768.
8747             let expr0_0: u64 = 8;
8748             let expr1_0 = constructor_imm(ctx, pattern0_0, expr0_0)?;
8749             let expr2_0 = C::gpr_new(ctx, expr1_0);
8750             let expr3_0 = C::gpr_mem_imm_new(ctx, pattern1_0);
8751             let expr4_0 = constructor_add(ctx, pattern0_0, expr2_0, &expr3_0)?;
8752             let expr5_0 = C::gpr_to_reg(ctx, expr4_0);
8753             let expr6_0 = RegMemImm::Reg { reg: expr5_0 };
8754             let expr7_0 = constructor_mov_rmi_to_xmm(ctx, &expr6_0)?;
8755             return Some(expr7_0);
8756         }
8757         _ => {}
8758     }
8759     return None;
8760 }
8761 
8762 // Generated as internal constructor for term sse_and_not.
8763 pub fn constructor_sse_and_not<C: Context>(
8764     ctx: &mut C,
8765     arg0: Type,
8766     arg1: Xmm,
8767     arg2: &XmmMem,
8768 ) -> Option<Xmm> {
8769     let pattern0_0 = arg0;
8770     if pattern0_0 == F32X4 {
8771         let pattern2_0 = arg1;
8772         let pattern3_0 = arg2;
8773         // Rule at src/isa/x64/lower.isle line 1194.
8774         let expr0_0 = constructor_andnps(ctx, pattern2_0, pattern3_0)?;
8775         return Some(expr0_0);
8776     }
8777     if pattern0_0 == F64X2 {
8778         let pattern2_0 = arg1;
8779         let pattern3_0 = arg2;
8780         // Rule at src/isa/x64/lower.isle line 1195.
8781         let expr0_0 = constructor_andnpd(ctx, pattern2_0, pattern3_0)?;
8782         return Some(expr0_0);
8783     }
8784     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
8785         let pattern2_0 = arg1;
8786         let pattern3_0 = arg2;
8787         // Rule at src/isa/x64/lower.isle line 1196.
8788         let expr0_0 = constructor_pandn(ctx, pattern2_0, pattern3_0)?;
8789         return Some(expr0_0);
8790     }
8791     return None;
8792 }
8793 
8794 // Generated as internal constructor for term i128_not.
8795 pub fn constructor_i128_not<C: Context>(ctx: &mut C, arg0: Value) -> Option<ValueRegs> {
8796     let pattern0_0 = arg0;
8797     // Rule at src/isa/x64/lower.isle line 1259.
8798     let expr0_0 = C::put_in_regs(ctx, pattern0_0);
8799     let expr1_0: usize = 0;
8800     let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
8801     let expr3_0: usize = 1;
8802     let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
8803     let expr5_0: Type = I64;
8804     let expr6_0 = constructor_not(ctx, expr5_0, expr2_0)?;
8805     let expr7_0: Type = I64;
8806     let expr8_0 = constructor_not(ctx, expr7_0, expr4_0)?;
8807     let expr9_0 = constructor_value_gprs(ctx, expr6_0, expr8_0)?;
8808     return Some(expr9_0);
8809 }
8810 
8811 // Generated as internal constructor for term vec_insert_lane.
8812 pub fn constructor_vec_insert_lane<C: Context>(
8813     ctx: &mut C,
8814     arg0: Type,
8815     arg1: Xmm,
8816     arg2: &RegMem,
8817     arg3: u8,
8818 ) -> Option<Xmm> {
8819     let pattern0_0 = arg0;
8820     if pattern0_0 == I8X16 {
8821         let pattern2_0 = arg1;
8822         let pattern3_0 = arg2;
8823         let pattern4_0 = arg3;
8824         // Rule at src/isa/x64/lower.isle line 1313.
8825         let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0);
8826         let expr1_0 = constructor_pinsrb(ctx, pattern2_0, &expr0_0, pattern4_0)?;
8827         return Some(expr1_0);
8828     }
8829     if pattern0_0 == I16X8 {
8830         let pattern2_0 = arg1;
8831         let pattern3_0 = arg2;
8832         let pattern4_0 = arg3;
8833         // Rule at src/isa/x64/lower.isle line 1317.
8834         let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0);
8835         let expr1_0 = constructor_pinsrw(ctx, pattern2_0, &expr0_0, pattern4_0)?;
8836         return Some(expr1_0);
8837     }
8838     if pattern0_0 == I32X4 {
8839         let pattern2_0 = arg1;
8840         let pattern3_0 = arg2;
8841         let pattern4_0 = arg3;
8842         // Rule at src/isa/x64/lower.isle line 1321.
8843         let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0);
8844         let expr1_0 = OperandSize::Size32;
8845         let expr2_0 = constructor_pinsrd(ctx, pattern2_0, &expr0_0, pattern4_0, &expr1_0)?;
8846         return Some(expr2_0);
8847     }
8848     if pattern0_0 == I64X2 {
8849         let pattern2_0 = arg1;
8850         let pattern3_0 = arg2;
8851         let pattern4_0 = arg3;
8852         // Rule at src/isa/x64/lower.isle line 1325.
8853         let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0);
8854         let expr1_0 = OperandSize::Size64;
8855         let expr2_0 = constructor_pinsrd(ctx, pattern2_0, &expr0_0, pattern4_0, &expr1_0)?;
8856         return Some(expr2_0);
8857     }
8858     if pattern0_0 == F32X4 {
8859         let pattern2_0 = arg1;
8860         let pattern3_0 = arg2;
8861         let pattern4_0 = arg3;
8862         // Rule at src/isa/x64/lower.isle line 1329.
8863         let expr0_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0);
8864         let expr1_0 = C::sse_insertps_lane_imm(ctx, pattern4_0);
8865         let expr2_0 = constructor_insertps(ctx, pattern2_0, &expr0_0, expr1_0)?;
8866         return Some(expr2_0);
8867     }
8868     if pattern0_0 == F64X2 {
8869         let pattern2_0 = arg1;
8870         let pattern3_0 = arg2;
8871         if let &RegMem::Reg { reg: pattern4_0 } = pattern3_0 {
8872             let pattern5_0 = arg3;
8873             if pattern5_0 == 0 {
8874                 // Rule at src/isa/x64/lower.isle line 1351.
8875                 let expr0_0 = constructor_reg_to_xmm_mem(ctx, pattern4_0)?;
8876                 let expr1_0 = constructor_movsd(ctx, pattern2_0, &expr0_0)?;
8877                 return Some(expr1_0);
8878             }
8879         }
8880         let pattern4_0 = arg3;
8881         if pattern4_0 == 0 {
8882             // Rule at src/isa/x64/lower.isle line 1353.
8883             let expr0_0 = SseOpcode::Movsd;
8884             let expr1_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0);
8885             let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?;
8886             let expr3_0 = C::xmm_to_xmm_mem(ctx, expr2_0);
8887             let expr4_0 = constructor_movsd(ctx, pattern2_0, &expr3_0)?;
8888             return Some(expr4_0);
8889         }
8890         if pattern4_0 == 1 {
8891             // Rule at src/isa/x64/lower.isle line 1362.
8892             let expr0_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0);
8893             let expr1_0 = constructor_movlhps(ctx, pattern2_0, &expr0_0)?;
8894             return Some(expr1_0);
8895         }
8896     }
8897     return None;
8898 }
8899 
8900 // Generated as internal constructor for term cmp_and_choose.
8901 pub fn constructor_cmp_and_choose<C: Context>(
8902     ctx: &mut C,
8903     arg0: Type,
8904     arg1: &CC,
8905     arg2: Value,
8906     arg3: Value,
8907 ) -> Option<ValueRegs> {
8908     let pattern0_0 = arg0;
8909     if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) {
8910         let pattern2_0 = arg1;
8911         let pattern3_0 = arg2;
8912         let pattern4_0 = arg3;
8913         // Rule at src/isa/x64/lower.isle line 1370.
8914         let expr0_0 = constructor_put_in_gpr(ctx, pattern3_0)?;
8915         let expr1_0 = constructor_put_in_gpr(ctx, pattern4_0)?;
8916         let expr2_0 = C::raw_operand_size_of_type(ctx, pattern1_0);
8917         let expr3_0 = C::gpr_to_gpr_mem_imm(ctx, expr0_0);
8918         let expr4_0 = constructor_cmp(ctx, &expr2_0, &expr3_0, expr1_0)?;
8919         let expr5_0 = C::gpr_to_gpr_mem(ctx, expr1_0);
8920         let expr6_0 = constructor_cmove(ctx, pattern1_0, pattern2_0, &expr5_0, expr0_0)?;
8921         let expr7_0 = constructor_with_flags_reg(ctx, &expr4_0, &expr6_0)?;
8922         let expr8_0 = C::value_reg(ctx, expr7_0);
8923         return Some(expr8_0);
8924     }
8925     return None;
8926 }
8927 
8928 // Generated as internal constructor for term do_clz.
8929 pub fn constructor_do_clz<C: Context>(
8930     ctx: &mut C,
8931     arg0: Type,
8932     arg1: Type,
8933     arg2: Gpr,
8934 ) -> Option<Gpr> {
8935     let pattern0_0 = arg0;
8936     let pattern1_0 = arg1;
8937     let pattern2_0 = arg2;
8938     // Rule at src/isa/x64/lower.isle line 1568.
8939     let expr0_0: Type = I64;
8940     let expr1_0: i64 = -1;
8941     let expr2_0 = constructor_imm_i64(ctx, expr0_0, expr1_0)?;
8942     let expr3_0 = C::gpr_new(ctx, expr2_0);
8943     let expr4_0 = constructor_bsr_or_else(ctx, pattern0_0, pattern2_0, expr3_0)?;
8944     let expr5_0 = C::gpr_to_reg(ctx, expr4_0);
8945     let expr6_0 = C::ty_bits_u64(ctx, pattern1_0);
8946     let expr7_0: u64 = 1;
8947     let expr8_0 = C::u64_sub(ctx, expr6_0, expr7_0);
8948     let expr9_0 = constructor_imm(ctx, pattern0_0, expr8_0)?;
8949     let expr10_0 = C::gpr_new(ctx, expr9_0);
8950     let expr11_0 = constructor_reg_to_gpr_mem_imm(ctx, expr5_0)?;
8951     let expr12_0 = constructor_sub(ctx, pattern0_0, expr10_0, &expr11_0)?;
8952     return Some(expr12_0);
8953 }
8954 
8955 // Generated as internal constructor for term do_ctz.
8956 pub fn constructor_do_ctz<C: Context>(
8957     ctx: &mut C,
8958     arg0: Type,
8959     arg1: Type,
8960     arg2: Gpr,
8961 ) -> Option<Gpr> {
8962     let pattern0_0 = arg0;
8963     let pattern1_0 = arg1;
8964     let pattern2_0 = arg2;
8965     // Rule at src/isa/x64/lower.isle line 1609.
8966     let expr0_0: Type = I64;
8967     let expr1_0 = C::ty_bits_u64(ctx, pattern1_0);
8968     let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
8969     let expr3_0 = C::gpr_new(ctx, expr2_0);
8970     let expr4_0 = constructor_bsf_or_else(ctx, pattern0_0, pattern2_0, expr3_0)?;
8971     return Some(expr4_0);
8972 }
8973 
8974 // Generated as internal constructor for term do_popcnt.
8975 pub fn constructor_do_popcnt<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
8976     let pattern0_0 = arg0;
8977     if pattern0_0 == I32 {
8978         let pattern2_0 = arg1;
8979         // Rule at src/isa/x64/lower.isle line 1700.
8980         let expr0_0: Type = I32;
8981         let expr1_0: u8 = 1;
8982         let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 };
8983         let expr3_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr2_0);
8984         let expr4_0 = constructor_shr(ctx, expr0_0, pattern2_0, &expr3_0)?;
8985         let expr5_0: Type = I32;
8986         let expr6_0: u64 = 2004318071;
8987         let expr7_0 = constructor_imm(ctx, expr5_0, expr6_0)?;
8988         let expr8_0 = C::gpr_new(ctx, expr7_0);
8989         let expr9_0: Type = I32;
8990         let expr10_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0);
8991         let expr11_0 = constructor_x64_and(ctx, expr9_0, expr4_0, &expr10_0)?;
8992         let expr12_0: Type = I32;
8993         let expr13_0 = C::gpr_to_gpr_mem_imm(ctx, expr11_0);
8994         let expr14_0 = constructor_sub(ctx, expr12_0, pattern2_0, &expr13_0)?;
8995         let expr15_0: Type = I32;
8996         let expr16_0: u8 = 1;
8997         let expr17_0 = Imm8Reg::Imm8 { imm: expr16_0 };
8998         let expr18_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr17_0);
8999         let expr19_0 = constructor_shr(ctx, expr15_0, expr11_0, &expr18_0)?;
9000         let expr20_0: Type = I32;
9001         let expr21_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0);
9002         let expr22_0 = constructor_x64_and(ctx, expr20_0, expr19_0, &expr21_0)?;
9003         let expr23_0: Type = I32;
9004         let expr24_0 = C::gpr_to_gpr_mem_imm(ctx, expr22_0);
9005         let expr25_0 = constructor_sub(ctx, expr23_0, expr14_0, &expr24_0)?;
9006         let expr26_0: Type = I32;
9007         let expr27_0: u8 = 1;
9008         let expr28_0 = Imm8Reg::Imm8 { imm: expr27_0 };
9009         let expr29_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr28_0);
9010         let expr30_0 = constructor_shr(ctx, expr26_0, expr22_0, &expr29_0)?;
9011         let expr31_0: Type = I32;
9012         let expr32_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0);
9013         let expr33_0 = constructor_x64_and(ctx, expr31_0, expr30_0, &expr32_0)?;
9014         let expr34_0: Type = I32;
9015         let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr33_0);
9016         let expr36_0 = constructor_sub(ctx, expr34_0, expr25_0, &expr35_0)?;
9017         let expr37_0: Type = I32;
9018         let expr38_0: Type = I32;
9019         let expr39_0: u8 = 4;
9020         let expr40_0 = Imm8Reg::Imm8 { imm: expr39_0 };
9021         let expr41_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr40_0);
9022         let expr42_0 = constructor_shr(ctx, expr38_0, expr36_0, &expr41_0)?;
9023         let expr43_0 = C::gpr_to_gpr_mem_imm(ctx, expr36_0);
9024         let expr44_0 = constructor_add(ctx, expr37_0, expr42_0, &expr43_0)?;
9025         let expr45_0: Type = I32;
9026         let expr46_0: u32 = 252645135;
9027         let expr47_0 = RegMemImm::Imm { simm32: expr46_0 };
9028         let expr48_0 = C::gpr_mem_imm_new(ctx, &expr47_0);
9029         let expr49_0 = constructor_x64_and(ctx, expr45_0, expr44_0, &expr48_0)?;
9030         let expr50_0: Type = I32;
9031         let expr51_0: u32 = 16843009;
9032         let expr52_0 = RegMemImm::Imm { simm32: expr51_0 };
9033         let expr53_0 = C::gpr_mem_imm_new(ctx, &expr52_0);
9034         let expr54_0 = constructor_mul(ctx, expr50_0, expr49_0, &expr53_0)?;
9035         let expr55_0: Type = I32;
9036         let expr56_0: u8 = 24;
9037         let expr57_0 = Imm8Reg::Imm8 { imm: expr56_0 };
9038         let expr58_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr57_0);
9039         let expr59_0 = constructor_shr(ctx, expr55_0, expr54_0, &expr58_0)?;
9040         return Some(expr59_0);
9041     }
9042     if pattern0_0 == I64 {
9043         let pattern2_0 = arg1;
9044         // Rule at src/isa/x64/lower.isle line 1657.
9045         let expr0_0: Type = I64;
9046         let expr1_0: u8 = 1;
9047         let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 };
9048         let expr3_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr2_0);
9049         let expr4_0 = constructor_shr(ctx, expr0_0, pattern2_0, &expr3_0)?;
9050         let expr5_0: Type = I64;
9051         let expr6_0: u64 = 8608480567731124087;
9052         let expr7_0 = constructor_imm(ctx, expr5_0, expr6_0)?;
9053         let expr8_0 = C::gpr_new(ctx, expr7_0);
9054         let expr9_0: Type = I64;
9055         let expr10_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0);
9056         let expr11_0 = constructor_x64_and(ctx, expr9_0, expr4_0, &expr10_0)?;
9057         let expr12_0: Type = I64;
9058         let expr13_0 = C::gpr_to_gpr_mem_imm(ctx, expr11_0);
9059         let expr14_0 = constructor_sub(ctx, expr12_0, pattern2_0, &expr13_0)?;
9060         let expr15_0: Type = I64;
9061         let expr16_0: u8 = 1;
9062         let expr17_0 = Imm8Reg::Imm8 { imm: expr16_0 };
9063         let expr18_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr17_0);
9064         let expr19_0 = constructor_shr(ctx, expr15_0, expr11_0, &expr18_0)?;
9065         let expr20_0: Type = I64;
9066         let expr21_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0);
9067         let expr22_0 = constructor_x64_and(ctx, expr20_0, expr19_0, &expr21_0)?;
9068         let expr23_0: Type = I64;
9069         let expr24_0 = C::gpr_to_gpr_mem_imm(ctx, expr22_0);
9070         let expr25_0 = constructor_sub(ctx, expr23_0, expr14_0, &expr24_0)?;
9071         let expr26_0: Type = I64;
9072         let expr27_0: u8 = 1;
9073         let expr28_0 = Imm8Reg::Imm8 { imm: expr27_0 };
9074         let expr29_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr28_0);
9075         let expr30_0 = constructor_shr(ctx, expr26_0, expr22_0, &expr29_0)?;
9076         let expr31_0: Type = I64;
9077         let expr32_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0);
9078         let expr33_0 = constructor_x64_and(ctx, expr31_0, expr30_0, &expr32_0)?;
9079         let expr34_0: Type = I64;
9080         let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr33_0);
9081         let expr36_0 = constructor_sub(ctx, expr34_0, expr25_0, &expr35_0)?;
9082         let expr37_0: Type = I64;
9083         let expr38_0: Type = I64;
9084         let expr39_0: u8 = 4;
9085         let expr40_0 = Imm8Reg::Imm8 { imm: expr39_0 };
9086         let expr41_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr40_0);
9087         let expr42_0 = constructor_shr(ctx, expr38_0, expr36_0, &expr41_0)?;
9088         let expr43_0 = C::gpr_to_gpr_mem_imm(ctx, expr36_0);
9089         let expr44_0 = constructor_add(ctx, expr37_0, expr42_0, &expr43_0)?;
9090         let expr45_0: Type = I64;
9091         let expr46_0: u64 = 1085102592571150095;
9092         let expr47_0 = constructor_imm(ctx, expr45_0, expr46_0)?;
9093         let expr48_0 = C::gpr_new(ctx, expr47_0);
9094         let expr49_0: Type = I64;
9095         let expr50_0 = C::gpr_to_gpr_mem_imm(ctx, expr48_0);
9096         let expr51_0 = constructor_x64_and(ctx, expr49_0, expr44_0, &expr50_0)?;
9097         let expr52_0: Type = I64;
9098         let expr53_0: u64 = 72340172838076673;
9099         let expr54_0 = constructor_imm(ctx, expr52_0, expr53_0)?;
9100         let expr55_0 = C::gpr_new(ctx, expr54_0);
9101         let expr56_0: Type = I64;
9102         let expr57_0 = C::gpr_to_gpr_mem_imm(ctx, expr55_0);
9103         let expr58_0 = constructor_mul(ctx, expr56_0, expr51_0, &expr57_0)?;
9104         let expr59_0: Type = I64;
9105         let expr60_0: u8 = 56;
9106         let expr61_0 = Imm8Reg::Imm8 { imm: expr60_0 };
9107         let expr62_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr61_0);
9108         let expr63_0 = constructor_shr(ctx, expr59_0, expr58_0, &expr62_0)?;
9109         return Some(expr63_0);
9110     }
9111     return None;
9112 }
9113 
9114 // Generated as internal constructor for term do_bitrev8.
9115 pub fn constructor_do_bitrev8<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
9116     let pattern0_0 = arg0;
9117     let pattern1_0 = arg1;
9118     // Rule at src/isa/x64/lower.isle line 1789.
9119     let expr0_0 = C::ty_mask(ctx, pattern0_0);
9120     let expr1_0: u64 = 6148914691236517205;
9121     let expr2_0 = C::u64_and(ctx, expr0_0, expr1_0);
9122     let expr3_0 = constructor_imm(ctx, pattern0_0, expr2_0)?;
9123     let expr4_0 = C::gpr_new(ctx, expr3_0);
9124     let expr5_0 = C::gpr_to_gpr_mem_imm(ctx, expr4_0);
9125     let expr6_0 = constructor_x64_and(ctx, pattern0_0, pattern1_0, &expr5_0)?;
9126     let expr7_0: u8 = 1;
9127     let expr8_0 = Imm8Reg::Imm8 { imm: expr7_0 };
9128     let expr9_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr8_0);
9129     let expr10_0 = constructor_shr(ctx, pattern0_0, pattern1_0, &expr9_0)?;
9130     let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr4_0);
9131     let expr12_0 = constructor_x64_and(ctx, pattern0_0, expr10_0, &expr11_0)?;
9132     let expr13_0: u8 = 1;
9133     let expr14_0 = Imm8Reg::Imm8 { imm: expr13_0 };
9134     let expr15_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr14_0);
9135     let expr16_0 = constructor_shl(ctx, pattern0_0, expr6_0, &expr15_0)?;
9136     let expr17_0 = C::gpr_to_gpr_mem_imm(ctx, expr12_0);
9137     let expr18_0 = constructor_or(ctx, pattern0_0, expr16_0, &expr17_0)?;
9138     let expr19_0: u64 = 3689348814741910323;
9139     let expr20_0 = C::u64_and(ctx, expr0_0, expr19_0);
9140     let expr21_0 = constructor_imm(ctx, pattern0_0, expr20_0)?;
9141     let expr22_0 = C::gpr_new(ctx, expr21_0);
9142     let expr23_0 = C::gpr_to_gpr_mem_imm(ctx, expr22_0);
9143     let expr24_0 = constructor_x64_and(ctx, pattern0_0, expr18_0, &expr23_0)?;
9144     let expr25_0: u8 = 2;
9145     let expr26_0 = Imm8Reg::Imm8 { imm: expr25_0 };
9146     let expr27_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr26_0);
9147     let expr28_0 = constructor_shr(ctx, pattern0_0, expr18_0, &expr27_0)?;
9148     let expr29_0 = C::gpr_to_gpr_mem_imm(ctx, expr22_0);
9149     let expr30_0 = constructor_x64_and(ctx, pattern0_0, expr28_0, &expr29_0)?;
9150     let expr31_0: u8 = 2;
9151     let expr32_0 = Imm8Reg::Imm8 { imm: expr31_0 };
9152     let expr33_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr32_0);
9153     let expr34_0 = constructor_shl(ctx, pattern0_0, expr24_0, &expr33_0)?;
9154     let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr30_0);
9155     let expr36_0 = constructor_or(ctx, pattern0_0, expr34_0, &expr35_0)?;
9156     let expr37_0: u64 = 1085102592571150095;
9157     let expr38_0 = C::u64_and(ctx, expr0_0, expr37_0);
9158     let expr39_0 = constructor_imm(ctx, pattern0_0, expr38_0)?;
9159     let expr40_0 = C::gpr_new(ctx, expr39_0);
9160     let expr41_0 = C::gpr_to_gpr_mem_imm(ctx, expr40_0);
9161     let expr42_0 = constructor_x64_and(ctx, pattern0_0, expr36_0, &expr41_0)?;
9162     let expr43_0: u8 = 4;
9163     let expr44_0 = Imm8Reg::Imm8 { imm: expr43_0 };
9164     let expr45_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr44_0);
9165     let expr46_0 = constructor_shr(ctx, pattern0_0, expr36_0, &expr45_0)?;
9166     let expr47_0 = C::gpr_to_gpr_mem_imm(ctx, expr40_0);
9167     let expr48_0 = constructor_x64_and(ctx, pattern0_0, expr46_0, &expr47_0)?;
9168     let expr49_0: u8 = 4;
9169     let expr50_0 = Imm8Reg::Imm8 { imm: expr49_0 };
9170     let expr51_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr50_0);
9171     let expr52_0 = constructor_shl(ctx, pattern0_0, expr42_0, &expr51_0)?;
9172     let expr53_0 = C::gpr_to_gpr_mem_imm(ctx, expr48_0);
9173     let expr54_0 = constructor_or(ctx, pattern0_0, expr52_0, &expr53_0)?;
9174     return Some(expr54_0);
9175 }
9176 
9177 // Generated as internal constructor for term do_bitrev16.
9178 pub fn constructor_do_bitrev16<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
9179     let pattern0_0 = arg0;
9180     let pattern1_0 = arg1;
9181     // Rule at src/isa/x64/lower.isle line 1812.
9182     let expr0_0 = constructor_do_bitrev8(ctx, pattern0_0, pattern1_0)?;
9183     let expr1_0 = C::ty_mask(ctx, pattern0_0);
9184     let expr2_0: u64 = 71777214294589695;
9185     let expr3_0 = C::u64_and(ctx, expr1_0, expr2_0);
9186     let expr4_0 = constructor_imm(ctx, pattern0_0, expr3_0)?;
9187     let expr5_0 = C::gpr_new(ctx, expr4_0);
9188     let expr6_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
9189     let expr7_0 = constructor_x64_and(ctx, pattern0_0, expr0_0, &expr6_0)?;
9190     let expr8_0: u8 = 8;
9191     let expr9_0 = Imm8Reg::Imm8 { imm: expr8_0 };
9192     let expr10_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr9_0);
9193     let expr11_0 = constructor_shr(ctx, pattern0_0, expr0_0, &expr10_0)?;
9194     let expr12_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
9195     let expr13_0 = constructor_x64_and(ctx, pattern0_0, expr11_0, &expr12_0)?;
9196     let expr14_0: u8 = 8;
9197     let expr15_0 = Imm8Reg::Imm8 { imm: expr14_0 };
9198     let expr16_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr15_0);
9199     let expr17_0 = constructor_shl(ctx, pattern0_0, expr7_0, &expr16_0)?;
9200     let expr18_0 = C::gpr_to_gpr_mem_imm(ctx, expr13_0);
9201     let expr19_0 = constructor_or(ctx, pattern0_0, expr17_0, &expr18_0)?;
9202     return Some(expr19_0);
9203 }
9204 
9205 // Generated as internal constructor for term do_bitrev32.
9206 pub fn constructor_do_bitrev32<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
9207     let pattern0_0 = arg0;
9208     let pattern1_0 = arg1;
9209     // Rule at src/isa/x64/lower.isle line 1824.
9210     let expr0_0 = constructor_do_bitrev16(ctx, pattern0_0, pattern1_0)?;
9211     let expr1_0 = C::ty_mask(ctx, pattern0_0);
9212     let expr2_0: u64 = 281470681808895;
9213     let expr3_0 = C::u64_and(ctx, expr1_0, expr2_0);
9214     let expr4_0 = constructor_imm(ctx, pattern0_0, expr3_0)?;
9215     let expr5_0 = C::gpr_new(ctx, expr4_0);
9216     let expr6_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
9217     let expr7_0 = constructor_x64_and(ctx, pattern0_0, expr0_0, &expr6_0)?;
9218     let expr8_0: u8 = 16;
9219     let expr9_0 = Imm8Reg::Imm8 { imm: expr8_0 };
9220     let expr10_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr9_0);
9221     let expr11_0 = constructor_shr(ctx, pattern0_0, expr0_0, &expr10_0)?;
9222     let expr12_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
9223     let expr13_0 = constructor_x64_and(ctx, pattern0_0, expr11_0, &expr12_0)?;
9224     let expr14_0: u8 = 16;
9225     let expr15_0 = Imm8Reg::Imm8 { imm: expr14_0 };
9226     let expr16_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr15_0);
9227     let expr17_0 = constructor_shl(ctx, pattern0_0, expr7_0, &expr16_0)?;
9228     let expr18_0 = C::gpr_to_gpr_mem_imm(ctx, expr13_0);
9229     let expr19_0 = constructor_or(ctx, pattern0_0, expr17_0, &expr18_0)?;
9230     return Some(expr19_0);
9231 }
9232 
9233 // Generated as internal constructor for term do_bitrev64.
9234 pub fn constructor_do_bitrev64<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
9235     let pattern0_0 = arg0;
9236     if pattern0_0 == I64 {
9237         let pattern2_0 = arg1;
9238         // Rule at src/isa/x64/lower.isle line 1836.
9239         let expr0_0 = constructor_do_bitrev32(ctx, pattern0_0, pattern2_0)?;
9240         let expr1_0: u64 = 4294967295;
9241         let expr2_0 = constructor_imm(ctx, pattern0_0, expr1_0)?;
9242         let expr3_0 = C::gpr_new(ctx, expr2_0);
9243         let expr4_0 = C::gpr_to_gpr_mem_imm(ctx, expr3_0);
9244         let expr5_0 = constructor_x64_and(ctx, pattern0_0, expr0_0, &expr4_0)?;
9245         let expr6_0: u8 = 32;
9246         let expr7_0 = Imm8Reg::Imm8 { imm: expr6_0 };
9247         let expr8_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr7_0);
9248         let expr9_0 = constructor_shr(ctx, pattern0_0, expr0_0, &expr8_0)?;
9249         let expr10_0: u8 = 32;
9250         let expr11_0 = Imm8Reg::Imm8 { imm: expr10_0 };
9251         let expr12_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr11_0);
9252         let expr13_0 = constructor_shl(ctx, pattern0_0, expr5_0, &expr12_0)?;
9253         let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
9254         let expr15_0 = constructor_or(ctx, pattern0_0, expr13_0, &expr14_0)?;
9255         return Some(expr15_0);
9256     }
9257     return None;
9258 }
9259 
9260 // Generated as internal constructor for term generic_sextend.
9261 pub fn constructor_generic_sextend<C: Context>(
9262     ctx: &mut C,
9263     arg0: Value,
9264     arg1: Type,
9265     arg2: Type,
9266 ) -> Option<InstOutput> {
9267     let pattern0_0 = arg0;
9268     let pattern1_0 = arg1;
9269     if let Some(pattern2_0) = C::fits_in_32(ctx, pattern1_0) {
9270         let pattern3_0 = arg2;
9271         if let Some(pattern4_0) = C::fits_in_32(ctx, pattern3_0) {
9272             // Rule at src/isa/x64/lower.isle line 1956.
9273             let expr0_0: Type = I32;
9274             let expr1_0 = ExtendKind::Sign;
9275             let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?;
9276             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
9277             return Some(expr3_0);
9278         }
9279         if let Some(pattern4_0) = C::ty_int_bool_64(ctx, pattern3_0) {
9280             // Rule at src/isa/x64/lower.isle line 1952.
9281             let expr0_0: Type = I64;
9282             let expr1_0 = ExtendKind::Sign;
9283             let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?;
9284             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
9285             return Some(expr3_0);
9286         }
9287         if let Some(pattern4_0) = C::ty_int_bool_128(ctx, pattern3_0) {
9288             // Rule at src/isa/x64/lower.isle line 1946.
9289             let expr0_0: Type = I64;
9290             let expr1_0 = ExtendKind::Sign;
9291             let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?;
9292             let expr3_0 = constructor_spread_sign_bit(ctx, expr2_0)?;
9293             let expr4_0 = C::gpr_to_reg(ctx, expr2_0);
9294             let expr5_0 = C::gpr_to_reg(ctx, expr3_0);
9295             let expr6_0 = C::value_regs(ctx, expr4_0, expr5_0);
9296             let expr7_0 = C::output(ctx, expr6_0);
9297             return Some(expr7_0);
9298         }
9299     }
9300     if let Some(pattern2_0) = C::ty_int_bool_64(ctx, pattern1_0) {
9301         let pattern3_0 = arg2;
9302         if let Some(pattern4_0) = C::ty_int_bool_128(ctx, pattern3_0) {
9303             // Rule at src/isa/x64/lower.isle line 1942.
9304             let expr0_0 = C::put_in_reg(ctx, pattern0_0);
9305             let expr1_0 = constructor_put_in_gpr(ctx, pattern0_0)?;
9306             let expr2_0 = constructor_spread_sign_bit(ctx, expr1_0)?;
9307             let expr3_0 = C::gpr_to_reg(ctx, expr2_0);
9308             let expr4_0 = C::value_regs(ctx, expr0_0, expr3_0);
9309             let expr5_0 = C::output(ctx, expr4_0);
9310             return Some(expr5_0);
9311         }
9312     }
9313     let pattern2_0 = arg2;
9314     if pattern2_0 == pattern1_0 {
9315         // Rule at src/isa/x64/lower.isle line 1932.
9316         let expr0_0 = constructor_output_value(ctx, pattern0_0)?;
9317         return Some(expr0_0);
9318     }
9319     return None;
9320 }
9321 
9322 // Generated as internal constructor for term spread_sign_bit.
9323 pub fn constructor_spread_sign_bit<C: Context>(ctx: &mut C, arg0: Gpr) -> Option<Gpr> {
9324     let pattern0_0 = arg0;
9325     // Rule at src/isa/x64/lower.isle line 1938.
9326     let expr0_0: Type = I64;
9327     let expr1_0: u8 = 63;
9328     let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 };
9329     let expr3_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr2_0);
9330     let expr4_0 = constructor_sar(ctx, expr0_0, pattern0_0, &expr3_0)?;
9331     return Some(expr4_0);
9332 }
9333