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 temp_writable_reg(&mut self, arg0: Type) -> WritableReg;
29     fn invalid_reg(&mut self) -> Reg;
30     fn put_in_reg(&mut self, arg0: Value) -> Reg;
31     fn put_in_regs(&mut self, arg0: Value) -> ValueRegs;
32     fn value_regs_get(&mut self, arg0: ValueRegs, arg1: usize) -> Reg;
33     fn u8_as_u64(&mut self, arg0: u8) -> u64;
34     fn u16_as_u64(&mut self, arg0: u16) -> u64;
35     fn u32_as_u64(&mut self, arg0: u32) -> u64;
36     fn ty_bits(&mut self, arg0: Type) -> u8;
37     fn ty_bits_u16(&mut self, arg0: Type) -> u16;
38     fn ty_bytes(&mut self, arg0: Type) -> u16;
39     fn lane_type(&mut self, arg0: Type) -> Type;
40     fn fits_in_16(&mut self, arg0: Type) -> Option<Type>;
41     fn fits_in_32(&mut self, arg0: Type) -> Option<Type>;
42     fn fits_in_64(&mut self, arg0: Type) -> Option<Type>;
43     fn ty_32_or_64(&mut self, arg0: Type) -> Option<Type>;
44     fn ty_8_or_16(&mut self, arg0: Type) -> Option<Type>;
45     fn vec128(&mut self, arg0: Type) -> Option<Type>;
46     fn not_i64x2(&mut self, arg0: Type) -> Option<()>;
47     fn value_list_slice(&mut self, arg0: ValueList) -> ValueSlice;
48     fn unwrap_head_value_list_1(&mut self, arg0: ValueList) -> (Value, ValueSlice);
49     fn unwrap_head_value_list_2(&mut self, arg0: ValueList) -> (Value, Value, ValueSlice);
50     fn writable_reg_to_reg(&mut self, arg0: WritableReg) -> Reg;
51     fn u8_from_uimm8(&mut self, arg0: Uimm8) -> u8;
52     fn u64_from_imm64(&mut self, arg0: Imm64) -> u64;
53     fn nonzero_u64_from_imm64(&mut self, arg0: Imm64) -> Option<u64>;
54     fn u64_from_ieee32(&mut self, arg0: Ieee32) -> u64;
55     fn u64_from_ieee64(&mut self, arg0: Ieee64) -> u64;
56     fn inst_results(&mut self, arg0: Inst) -> ValueSlice;
57     fn first_result(&mut self, arg0: Inst) -> Option<Value>;
58     fn inst_data(&mut self, arg0: Inst) -> InstructionData;
59     fn value_type(&mut self, arg0: Value) -> Type;
60     fn multi_lane(&mut self, arg0: Type) -> Option<(u8, u16)>;
61     fn def_inst(&mut self, arg0: Value) -> Option<Inst>;
62     fn emit(&mut self, arg0: &MInst) -> Unit;
63     fn emit_safepoint(&mut self, arg0: &MInst) -> Unit;
64     fn trap_code_division_by_zero(&mut self) -> TrapCode;
65     fn trap_code_integer_overflow(&mut self) -> TrapCode;
66     fn trap_code_bad_conversion_to_integer(&mut self) -> TrapCode;
67     fn avoid_div_traps(&mut self, arg0: Type) -> Option<()>;
68     fn func_ref_data(&mut self, arg0: FuncRef) -> (SigRef, ExternalName, RelocDistance);
69     fn symbol_value_data(
70         &mut self,
71         arg0: GlobalValue,
72     ) -> Option<(ExternalName, RelocDistance, i64)>;
73     fn reloc_distance_near(&mut self, arg0: RelocDistance) -> Option<()>;
74     fn operand_size_of_type_32_64(&mut self, arg0: Type) -> OperandSize;
75     fn raw_operand_size_of_type(&mut self, arg0: Type) -> OperandSize;
76     fn put_in_reg_mem_imm(&mut self, arg0: Value) -> RegMemImm;
77     fn put_in_reg_mem(&mut self, arg0: Value) -> RegMem;
78     fn synthetic_amode_to_reg_mem(&mut self, arg0: &SyntheticAmode) -> RegMem;
79     fn amode_imm_reg_reg_shift(&mut self, arg0: u32, arg1: Gpr, arg2: Gpr, arg3: u8) -> Amode;
80     fn amode_to_synthetic_amode(&mut self, arg0: &Amode) -> SyntheticAmode;
81     fn put_masked_in_imm8_gpr(&mut self, arg0: Value, arg1: Type) -> Imm8Gpr;
82     fn encode_fcmp_imm(&mut self, arg0: &FcmpImm) -> u8;
83     fn imm8_reg_to_imm8_gpr(&mut self, arg0: &Imm8Reg) -> Imm8Gpr;
84     fn writable_gpr_to_reg(&mut self, arg0: WritableGpr) -> WritableReg;
85     fn writable_xmm_to_reg(&mut self, arg0: WritableXmm) -> WritableReg;
86     fn writable_reg_to_xmm(&mut self, arg0: WritableReg) -> WritableXmm;
87     fn writable_xmm_to_xmm(&mut self, arg0: WritableXmm) -> Xmm;
88     fn writable_gpr_to_gpr(&mut self, arg0: WritableGpr) -> Gpr;
89     fn gpr_to_reg(&mut self, arg0: Gpr) -> Reg;
90     fn gpr_to_gpr_mem(&mut self, arg0: Gpr) -> GprMem;
91     fn gpr_to_gpr_mem_imm(&mut self, arg0: Gpr) -> GprMemImm;
92     fn xmm_to_reg(&mut self, arg0: Xmm) -> Reg;
93     fn xmm_to_xmm_mem_imm(&mut self, arg0: Xmm) -> XmmMemImm;
94     fn temp_writable_gpr(&mut self) -> WritableGpr;
95     fn temp_writable_xmm(&mut self) -> WritableXmm;
96     fn reg_mem_to_xmm_mem(&mut self, arg0: &RegMem) -> XmmMem;
97     fn gpr_mem_imm_new(&mut self, arg0: &RegMemImm) -> GprMemImm;
98     fn xmm_mem_imm_new(&mut self, arg0: &RegMemImm) -> XmmMemImm;
99     fn xmm_to_xmm_mem(&mut self, arg0: Xmm) -> XmmMem;
100     fn xmm_mem_to_reg_mem(&mut self, arg0: &XmmMem) -> RegMem;
101     fn gpr_mem_to_reg_mem(&mut self, arg0: &GprMem) -> RegMem;
102     fn xmm_new(&mut self, arg0: Reg) -> Xmm;
103     fn gpr_new(&mut self, arg0: Reg) -> Gpr;
104     fn reg_mem_to_gpr_mem(&mut self, arg0: &RegMem) -> GprMem;
105     fn reg_to_gpr_mem(&mut self, arg0: Reg) -> GprMem;
106     fn gpr_to_imm8_gpr(&mut self, arg0: Gpr) -> Imm8Gpr;
107     fn imm8_to_imm8_gpr(&mut self, arg0: u8) -> Imm8Gpr;
108     fn xmm0(&mut self) -> WritableXmm;
109     fn avx512vl_enabled(&mut self, arg0: Type) -> Option<()>;
110     fn avx512dq_enabled(&mut self, arg0: Type) -> Option<()>;
111     fn avx512f_enabled(&mut self, arg0: Type) -> Option<()>;
112     fn imm8_from_value(&mut self, arg0: Value) -> Option<Imm8Reg>;
113     fn const_to_type_masked_imm8(&mut self, arg0: u64, arg1: Type) -> Imm8Gpr;
114     fn simm32_from_value(&mut self, arg0: Value) -> Option<GprMemImm>;
115     fn simm32_from_imm64(&mut self, arg0: Imm64) -> Option<GprMemImm>;
116     fn sinkable_load(&mut self, arg0: Value) -> Option<SinkableLoad>;
117     fn sink_load(&mut self, arg0: &SinkableLoad) -> RegMemImm;
118     fn ext_mode(&mut self, arg0: u16, arg1: u16) -> ExtMode;
119     fn nonzero_u64_fits_in_u32(&mut self, arg0: u64) -> Option<u64>;
120     fn ishl_i8x16_mask_for_const(&mut self, arg0: u32) -> SyntheticAmode;
121     fn ishl_i8x16_mask_table(&mut self) -> SyntheticAmode;
122     fn ushr_i8x16_mask_for_const(&mut self, arg0: u32) -> SyntheticAmode;
123     fn ushr_i8x16_mask_table(&mut self) -> SyntheticAmode;
124     fn sse_insertps_lane_imm(&mut self, arg0: u8) -> u8;
125 }
126 
127 /// Internal type SideEffectNoResult: defined at src/prelude.isle line 308.
128 #[derive(Clone, Debug)]
129 pub enum SideEffectNoResult {
130     Inst { inst: MInst },
131 }
132 
133 /// Internal type ProducesFlags: defined at src/prelude.isle line 327.
134 #[derive(Clone, Debug)]
135 pub enum ProducesFlags {
136     ProducesFlags { inst: MInst, result: Reg },
137 }
138 
139 /// Internal type ConsumesFlags: defined at src/prelude.isle line 330.
140 #[derive(Clone, Debug)]
141 pub enum ConsumesFlags {
142     ConsumesFlags { inst: MInst, result: Reg },
143 }
144 
145 /// Internal type MInst: defined at src/isa/x64/inst.isle line 8.
146 #[derive(Clone)]
147 pub enum MInst {
148     Nop {
149         len: u8,
150     },
151     AluRmiR {
152         size: OperandSize,
153         op: AluRmiROpcode,
154         src1: Gpr,
155         src2: GprMemImm,
156         dst: WritableGpr,
157     },
158     UnaryRmR {
159         size: OperandSize,
160         op: UnaryRmROpcode,
161         src: GprMem,
162         dst: WritableGpr,
163     },
164     Not {
165         size: OperandSize,
166         src: Gpr,
167         dst: WritableGpr,
168     },
169     Neg {
170         size: OperandSize,
171         src: Gpr,
172         dst: WritableGpr,
173     },
174     Div {
175         size: OperandSize,
176         signed: bool,
177         divisor: GprMem,
178         dividend: Gpr,
179         dst_quotient: WritableGpr,
180         dst_remainder: WritableGpr,
181     },
182     MulHi {
183         size: OperandSize,
184         signed: bool,
185         src1: Gpr,
186         src2: GprMem,
187         dst_lo: WritableGpr,
188         dst_hi: WritableGpr,
189     },
190     CheckedDivOrRemSeq {
191         kind: DivOrRemKind,
192         size: OperandSize,
193         dividend: Gpr,
194         divisor: WritableGpr,
195         dst_quotient: WritableGpr,
196         dst_remainder: WritableGpr,
197         tmp: OptionWritableGpr,
198     },
199     SignExtendData {
200         size: OperandSize,
201         src: Gpr,
202         dst: WritableGpr,
203     },
204     Imm {
205         dst_size: OperandSize,
206         simm64: u64,
207         dst: WritableGpr,
208     },
209     MovRR {
210         size: OperandSize,
211         src: Gpr,
212         dst: WritableGpr,
213     },
214     MovzxRmR {
215         ext_mode: ExtMode,
216         src: GprMem,
217         dst: WritableGpr,
218     },
219     Mov64MR {
220         src: SyntheticAmode,
221         dst: WritableGpr,
222     },
223     LoadEffectiveAddress {
224         addr: SyntheticAmode,
225         dst: WritableGpr,
226     },
227     MovsxRmR {
228         ext_mode: ExtMode,
229         src: GprMem,
230         dst: WritableGpr,
231     },
232     MovRM {
233         size: OperandSize,
234         src: Gpr,
235         dst: SyntheticAmode,
236     },
237     ShiftR {
238         size: OperandSize,
239         kind: ShiftKind,
240         src: Gpr,
241         num_bits: Imm8Gpr,
242         dst: WritableGpr,
243     },
244     XmmRmiReg {
245         opcode: SseOpcode,
246         src1: Xmm,
247         src2: XmmMemImm,
248         dst: WritableXmm,
249     },
250     CmpRmiR {
251         size: OperandSize,
252         opcode: CmpOpcode,
253         src: GprMemImm,
254         dst: Gpr,
255     },
256     Setcc {
257         cc: CC,
258         dst: WritableGpr,
259     },
260     Cmove {
261         size: OperandSize,
262         cc: CC,
263         consequent: GprMem,
264         alternative: Gpr,
265         dst: WritableGpr,
266     },
267     Push64 {
268         src: GprMemImm,
269     },
270     Pop64 {
271         dst: WritableGpr,
272     },
273     XmmRmR {
274         op: SseOpcode,
275         src1: Xmm,
276         src2: XmmMem,
277         dst: WritableXmm,
278     },
279     XmmRmREvex {
280         op: Avx512Opcode,
281         src1: XmmMem,
282         src2: Xmm,
283         dst: WritableXmm,
284     },
285     XmmUnaryRmR {
286         op: SseOpcode,
287         src: XmmMem,
288         dst: WritableXmm,
289     },
290     XmmUnaryRmREvex {
291         op: Avx512Opcode,
292         src: XmmMem,
293         dst: WritableXmm,
294     },
295     XmmMovRM {
296         op: SseOpcode,
297         src: Reg,
298         dst: SyntheticAmode,
299     },
300     XmmLoadConst {
301         src: VCodeConstant,
302         dst: WritableReg,
303         ty: Type,
304     },
305     XmmToGpr {
306         op: SseOpcode,
307         src: Xmm,
308         dst: WritableGpr,
309         dst_size: OperandSize,
310     },
311     GprToXmm {
312         op: SseOpcode,
313         src: GprMem,
314         dst: WritableXmm,
315         src_size: OperandSize,
316     },
317     CvtUint64ToFloatSeq {
318         dst_size: OperandSize,
319         src: WritableGpr,
320         dst: WritableXmm,
321         tmp_gpr1: WritableGpr,
322         tmp_gpr2: WritableGpr,
323     },
324     CvtFloatToSintSeq {
325         dst_size: OperandSize,
326         src_size: OperandSize,
327         is_saturating: bool,
328         src: WritableXmm,
329         dst: WritableGpr,
330         tmp_gpr: WritableGpr,
331         tmp_xmm: WritableXmm,
332     },
333     CvtFloatToUintSeq {
334         dst_size: OperandSize,
335         src_size: OperandSize,
336         is_saturating: bool,
337         src: WritableXmm,
338         dst: WritableGpr,
339         tmp_gpr: WritableGpr,
340         tmp_xmm: WritableXmm,
341     },
342     XmmMinMaxSeq {
343         size: OperandSize,
344         is_min: bool,
345         lhs: Xmm,
346         rhs_dst: WritableXmm,
347     },
348     XmmCmove {
349         size: OperandSize,
350         cc: CC,
351         src: XmmMem,
352         dst: WritableXmm,
353     },
354     XmmCmpRmR {
355         op: SseOpcode,
356         src: XmmMem,
357         dst: Xmm,
358     },
359     XmmRmRImm {
360         op: SseOpcode,
361         src1: Reg,
362         src2: RegMem,
363         dst: WritableReg,
364         imm: u8,
365         size: OperandSize,
366     },
367     CallKnown {
368         dest: ExternalName,
369         uses: VecReg,
370         defs: VecWritableReg,
371         opcode: Opcode,
372     },
373     CallUnknown {
374         dest: RegMem,
375         uses: VecReg,
376         defs: VecWritableReg,
377         opcode: Opcode,
378     },
379     Ret,
380     EpiloguePlaceholder,
381     JmpKnown {
382         dst: MachLabel,
383     },
384     JmpIf {
385         cc: CC,
386         taken: MachLabel,
387     },
388     JmpCond {
389         cc: CC,
390         taken: MachLabel,
391         not_taken: MachLabel,
392     },
393     JmpTableSeq {
394         idx: Reg,
395         tmp1: WritableReg,
396         tmp2: WritableReg,
397         default_target: MachLabel,
398         targets: VecMachLabel,
399         targets_for_term: VecMachLabel,
400     },
401     JmpUnknown {
402         target: RegMem,
403     },
404     TrapIf {
405         cc: CC,
406         trap_code: TrapCode,
407     },
408     Hlt,
409     Ud2 {
410         trap_code: TrapCode,
411     },
412     LoadExtName {
413         dst: WritableReg,
414         name: BoxExternalName,
415         offset: i64,
416     },
417     LockCmpxchg {
418         ty: Type,
419         replacement: Reg,
420         expected: Reg,
421         mem: SyntheticAmode,
422         dst_old: WritableReg,
423     },
424     AtomicRmwSeq {
425         ty: Type,
426         op: AtomicRmwOp,
427         address: Reg,
428         operand: Reg,
429         temp: WritableReg,
430         dst_old: WritableReg,
431     },
432     Fence {
433         kind: FenceKind,
434     },
435     VirtualSPOffsetAdj {
436         offset: i64,
437     },
438     XmmUninitializedValue {
439         dst: WritableXmm,
440     },
441     ElfTlsGetAddr {
442         symbol: ExternalName,
443     },
444     MachOTlsGetAddr {
445         symbol: ExternalName,
446     },
447     ValueLabelMarker {
448         reg: Reg,
449         label: ValueLabel,
450     },
451     Unwind {
452         inst: UnwindInst,
453     },
454 }
455 
456 /// Internal type ExtendKind: defined at src/isa/x64/inst.isle line 1089.
457 #[derive(Copy, Clone, PartialEq, Eq, Debug)]
458 pub enum ExtendKind {
459     Sign,
460     Zero,
461 }
462 
463 // Generated as internal constructor for term temp_reg.
464 pub fn constructor_temp_reg<C: Context>(ctx: &mut C, arg0: Type) -> Option<Reg> {
465     let pattern0_0 = arg0;
466     // Rule at src/prelude.isle line 73.
467     let expr0_0 = C::temp_writable_reg(ctx, pattern0_0);
468     let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0);
469     return Some(expr1_0);
470 }
471 
472 // Generated as internal constructor for term lo_reg.
473 pub fn constructor_lo_reg<C: Context>(ctx: &mut C, arg0: Value) -> Option<Reg> {
474     let pattern0_0 = arg0;
475     // Rule at src/prelude.isle line 108.
476     let expr0_0 = C::put_in_regs(ctx, pattern0_0);
477     let expr1_0: usize = 0;
478     let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0);
479     return Some(expr2_0);
480 }
481 
482 // Generated as internal constructor for term value_regs_none.
483 pub fn constructor_value_regs_none<C: Context>(
484     ctx: &mut C,
485     arg0: &SideEffectNoResult,
486 ) -> Option<ValueRegs> {
487     let pattern0_0 = arg0;
488     if let &SideEffectNoResult::Inst {
489         inst: ref pattern1_0,
490     } = pattern0_0
491     {
492         // Rule at src/prelude.isle line 313.
493         let expr0_0 = C::emit(ctx, &pattern1_0);
494         let expr1_0 = C::value_regs_invalid(ctx);
495         return Some(expr1_0);
496     }
497     return None;
498 }
499 
500 // Generated as internal constructor for term safepoint.
501 pub fn constructor_safepoint<C: Context>(
502     ctx: &mut C,
503     arg0: &SideEffectNoResult,
504 ) -> Option<ValueRegs> {
505     let pattern0_0 = arg0;
506     if let &SideEffectNoResult::Inst {
507         inst: ref pattern1_0,
508     } = pattern0_0
509     {
510         // Rule at src/prelude.isle line 319.
511         let expr0_0 = C::emit_safepoint(ctx, &pattern1_0);
512         let expr1_0 = C::value_regs_invalid(ctx);
513         return Some(expr1_0);
514     }
515     return None;
516 }
517 
518 // Generated as internal constructor for term with_flags.
519 pub fn constructor_with_flags<C: Context>(
520     ctx: &mut C,
521     arg0: &ProducesFlags,
522     arg1: &ConsumesFlags,
523 ) -> Option<ValueRegs> {
524     let pattern0_0 = arg0;
525     if let &ProducesFlags::ProducesFlags {
526         inst: ref pattern1_0,
527         result: pattern1_1,
528     } = pattern0_0
529     {
530         let pattern2_0 = arg1;
531         if let &ConsumesFlags::ConsumesFlags {
532             inst: ref pattern3_0,
533             result: pattern3_1,
534         } = pattern2_0
535         {
536             // Rule at src/prelude.isle line 340.
537             let expr0_0 = C::emit(ctx, &pattern1_0);
538             let expr1_0 = C::emit(ctx, &pattern3_0);
539             let expr2_0 = C::value_regs(ctx, pattern1_1, pattern3_1);
540             return Some(expr2_0);
541         }
542     }
543     return None;
544 }
545 
546 // Generated as internal constructor for term with_flags_1.
547 pub fn constructor_with_flags_1<C: Context>(
548     ctx: &mut C,
549     arg0: &ProducesFlags,
550     arg1: &ConsumesFlags,
551 ) -> Option<Reg> {
552     let pattern0_0 = arg0;
553     if let &ProducesFlags::ProducesFlags {
554         inst: ref pattern1_0,
555         result: pattern1_1,
556     } = pattern0_0
557     {
558         let pattern2_0 = arg1;
559         if let &ConsumesFlags::ConsumesFlags {
560             inst: ref pattern3_0,
561             result: pattern3_1,
562         } = pattern2_0
563         {
564             // Rule at src/prelude.isle line 348.
565             let expr0_0 = C::emit(ctx, &pattern1_0);
566             let expr1_0 = C::emit(ctx, &pattern3_0);
567             return Some(pattern3_1);
568         }
569     }
570     return None;
571 }
572 
573 // Generated as internal constructor for term with_flags_2.
574 pub fn constructor_with_flags_2<C: Context>(
575     ctx: &mut C,
576     arg0: &ProducesFlags,
577     arg1: &ConsumesFlags,
578     arg2: &ConsumesFlags,
579 ) -> Option<ValueRegs> {
580     let pattern0_0 = arg0;
581     if let &ProducesFlags::ProducesFlags {
582         inst: ref pattern1_0,
583         result: pattern1_1,
584     } = pattern0_0
585     {
586         let pattern2_0 = arg1;
587         if let &ConsumesFlags::ConsumesFlags {
588             inst: ref pattern3_0,
589             result: pattern3_1,
590         } = pattern2_0
591         {
592             let pattern4_0 = arg2;
593             if let &ConsumesFlags::ConsumesFlags {
594                 inst: ref pattern5_0,
595                 result: pattern5_1,
596             } = pattern4_0
597             {
598                 // Rule at src/prelude.isle line 358.
599                 let expr0_0 = C::emit(ctx, &pattern1_0);
600                 let expr1_0 = C::emit(ctx, &pattern5_0);
601                 let expr2_0 = C::emit(ctx, &pattern3_0);
602                 let expr3_0 = C::value_regs(ctx, pattern3_1, pattern5_1);
603                 return Some(expr3_0);
604             }
605         }
606     }
607     return None;
608 }
609 
610 // Generated as internal constructor for term operand_size_bits.
611 pub fn constructor_operand_size_bits<C: Context>(ctx: &mut C, arg0: &OperandSize) -> Option<u16> {
612     let pattern0_0 = arg0;
613     match pattern0_0 {
614         &OperandSize::Size8 => {
615             // Rule at src/isa/x64/inst.isle line 509.
616             let expr0_0: u16 = 8;
617             return Some(expr0_0);
618         }
619         &OperandSize::Size16 => {
620             // Rule at src/isa/x64/inst.isle line 510.
621             let expr0_0: u16 = 16;
622             return Some(expr0_0);
623         }
624         &OperandSize::Size32 => {
625             // Rule at src/isa/x64/inst.isle line 511.
626             let expr0_0: u16 = 32;
627             return Some(expr0_0);
628         }
629         &OperandSize::Size64 => {
630             // Rule at src/isa/x64/inst.isle line 512.
631             let expr0_0: u16 = 64;
632             return Some(expr0_0);
633         }
634         _ => {}
635     }
636     return None;
637 }
638 
639 // Generated as internal constructor for term put_in_gpr.
640 pub fn constructor_put_in_gpr<C: Context>(ctx: &mut C, arg0: Value) -> Option<Gpr> {
641     let pattern0_0 = arg0;
642     // Rule at src/isa/x64/inst.isle line 949.
643     let expr0_0 = C::put_in_reg(ctx, pattern0_0);
644     let expr1_0 = C::gpr_new(ctx, expr0_0);
645     return Some(expr1_0);
646 }
647 
648 // Generated as internal constructor for term put_in_gpr_mem.
649 pub fn constructor_put_in_gpr_mem<C: Context>(ctx: &mut C, arg0: Value) -> Option<GprMem> {
650     let pattern0_0 = arg0;
651     // Rule at src/isa/x64/inst.isle line 956.
652     let expr0_0 = C::put_in_reg_mem(ctx, pattern0_0);
653     let expr1_0 = C::reg_mem_to_gpr_mem(ctx, &expr0_0);
654     return Some(expr1_0);
655 }
656 
657 // Generated as internal constructor for term put_in_gpr_mem_imm.
658 pub fn constructor_put_in_gpr_mem_imm<C: Context>(ctx: &mut C, arg0: Value) -> Option<GprMemImm> {
659     let pattern0_0 = arg0;
660     // Rule at src/isa/x64/inst.isle line 963.
661     let expr0_0 = C::put_in_reg_mem_imm(ctx, pattern0_0);
662     let expr1_0 = C::gpr_mem_imm_new(ctx, &expr0_0);
663     return Some(expr1_0);
664 }
665 
666 // Generated as internal constructor for term put_in_xmm.
667 pub fn constructor_put_in_xmm<C: Context>(ctx: &mut C, arg0: Value) -> Option<Xmm> {
668     let pattern0_0 = arg0;
669     // Rule at src/isa/x64/inst.isle line 970.
670     let expr0_0 = C::put_in_reg(ctx, pattern0_0);
671     let expr1_0 = C::xmm_new(ctx, expr0_0);
672     return Some(expr1_0);
673 }
674 
675 // Generated as internal constructor for term put_in_xmm_mem.
676 pub fn constructor_put_in_xmm_mem<C: Context>(ctx: &mut C, arg0: Value) -> Option<XmmMem> {
677     let pattern0_0 = arg0;
678     // Rule at src/isa/x64/inst.isle line 977.
679     let expr0_0 = C::put_in_reg_mem(ctx, pattern0_0);
680     let expr1_0 = C::reg_mem_to_xmm_mem(ctx, &expr0_0);
681     return Some(expr1_0);
682 }
683 
684 // Generated as internal constructor for term put_in_xmm_mem_imm.
685 pub fn constructor_put_in_xmm_mem_imm<C: Context>(ctx: &mut C, arg0: Value) -> Option<XmmMemImm> {
686     let pattern0_0 = arg0;
687     // Rule at src/isa/x64/inst.isle line 984.
688     let expr0_0 = C::put_in_reg_mem_imm(ctx, pattern0_0);
689     let expr1_0 = C::xmm_mem_imm_new(ctx, &expr0_0);
690     return Some(expr1_0);
691 }
692 
693 // Generated as internal constructor for term value_gpr.
694 pub fn constructor_value_gpr<C: Context>(ctx: &mut C, arg0: Gpr) -> Option<ValueRegs> {
695     let pattern0_0 = arg0;
696     // Rule at src/isa/x64/inst.isle line 989.
697     let expr0_0 = C::gpr_to_reg(ctx, pattern0_0);
698     let expr1_0 = C::value_reg(ctx, expr0_0);
699     return Some(expr1_0);
700 }
701 
702 // Generated as internal constructor for term value_gprs.
703 pub fn constructor_value_gprs<C: Context>(ctx: &mut C, arg0: Gpr, arg1: Gpr) -> Option<ValueRegs> {
704     let pattern0_0 = arg0;
705     let pattern1_0 = arg1;
706     // Rule at src/isa/x64/inst.isle line 994.
707     let expr0_0 = C::gpr_to_reg(ctx, pattern0_0);
708     let expr1_0 = C::gpr_to_reg(ctx, pattern1_0);
709     let expr2_0 = C::value_regs(ctx, expr0_0, expr1_0);
710     return Some(expr2_0);
711 }
712 
713 // Generated as internal constructor for term value_xmm.
714 pub fn constructor_value_xmm<C: Context>(ctx: &mut C, arg0: Xmm) -> Option<ValueRegs> {
715     let pattern0_0 = arg0;
716     // Rule at src/isa/x64/inst.isle line 999.
717     let expr0_0 = C::xmm_to_reg(ctx, pattern0_0);
718     let expr1_0 = C::value_reg(ctx, expr0_0);
719     return Some(expr1_0);
720 }
721 
722 // Generated as internal constructor for term value_regs_get_gpr.
723 pub fn constructor_value_regs_get_gpr<C: Context>(
724     ctx: &mut C,
725     arg0: ValueRegs,
726     arg1: usize,
727 ) -> Option<Gpr> {
728     let pattern0_0 = arg0;
729     let pattern1_0 = arg1;
730     // Rule at src/isa/x64/inst.isle line 1006.
731     let expr0_0 = C::value_regs_get(ctx, pattern0_0, pattern1_0);
732     let expr1_0 = C::gpr_new(ctx, expr0_0);
733     return Some(expr1_0);
734 }
735 
736 // Generated as internal constructor for term lo_gpr.
737 pub fn constructor_lo_gpr<C: Context>(ctx: &mut C, arg0: Value) -> Option<Gpr> {
738     let pattern0_0 = arg0;
739     // Rule at src/isa/x64/inst.isle line 1019.
740     let expr0_0 = constructor_lo_reg(ctx, pattern0_0)?;
741     let expr1_0 = C::gpr_new(ctx, expr0_0);
742     return Some(expr1_0);
743 }
744 
745 // Generated as internal constructor for term sink_load_to_gpr_mem_imm.
746 pub fn constructor_sink_load_to_gpr_mem_imm<C: Context>(
747     ctx: &mut C,
748     arg0: &SinkableLoad,
749 ) -> Option<GprMemImm> {
750     let pattern0_0 = arg0;
751     // Rule at src/isa/x64/inst.isle line 1079.
752     let expr0_0 = C::sink_load(ctx, pattern0_0);
753     let expr1_0 = C::gpr_mem_imm_new(ctx, &expr0_0);
754     return Some(expr1_0);
755 }
756 
757 // Generated as internal constructor for term extend_to_gpr.
758 pub fn constructor_extend_to_gpr<C: Context>(
759     ctx: &mut C,
760     arg0: Value,
761     arg1: Type,
762     arg2: &ExtendKind,
763 ) -> Option<Gpr> {
764     let pattern0_0 = arg0;
765     let pattern1_0 = C::value_type(ctx, pattern0_0);
766     let pattern2_0 = arg1;
767     if pattern2_0 == pattern1_0 {
768         let pattern4_0 = arg2;
769         // Rule at src/isa/x64/inst.isle line 1101.
770         let expr0_0 = constructor_put_in_gpr(ctx, pattern0_0)?;
771         return Some(expr0_0);
772     }
773     let pattern3_0 = arg2;
774     // Rule at src/isa/x64/inst.isle line 1104.
775     let expr0_0 = C::ty_bits_u16(ctx, pattern1_0);
776     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern2_0);
777     let expr2_0 = constructor_operand_size_bits(ctx, &expr1_0)?;
778     let expr3_0 = C::ext_mode(ctx, expr0_0, expr2_0);
779     let expr4_0 = constructor_put_in_gpr_mem(ctx, pattern0_0)?;
780     let expr5_0 = constructor_extend(ctx, pattern3_0, pattern2_0, &expr3_0, &expr4_0)?;
781     return Some(expr5_0);
782 }
783 
784 // Generated as internal constructor for term extend.
785 pub fn constructor_extend<C: Context>(
786     ctx: &mut C,
787     arg0: &ExtendKind,
788     arg1: Type,
789     arg2: &ExtMode,
790     arg3: &GprMem,
791 ) -> Option<Gpr> {
792     let pattern0_0 = arg0;
793     match pattern0_0 {
794         &ExtendKind::Sign => {
795             let pattern2_0 = arg1;
796             let pattern3_0 = arg2;
797             let pattern4_0 = arg3;
798             // Rule at src/isa/x64/inst.isle line 1124.
799             let expr0_0 = constructor_movsx(ctx, pattern2_0, pattern3_0, pattern4_0)?;
800             return Some(expr0_0);
801         }
802         &ExtendKind::Zero => {
803             let pattern2_0 = arg1;
804             let pattern3_0 = arg2;
805             let pattern4_0 = arg3;
806             // Rule at src/isa/x64/inst.isle line 1120.
807             let expr0_0 = constructor_movzx(ctx, pattern2_0, pattern3_0, pattern4_0)?;
808             return Some(expr0_0);
809         }
810         _ => {}
811     }
812     return None;
813 }
814 
815 // Generated as internal constructor for term sse_xor_op.
816 pub fn constructor_sse_xor_op<C: Context>(ctx: &mut C, arg0: Type) -> Option<SseOpcode> {
817     let pattern0_0 = arg0;
818     if pattern0_0 == F32X4 {
819         // Rule at src/isa/x64/inst.isle line 1131.
820         let expr0_0 = SseOpcode::Xorps;
821         return Some(expr0_0);
822     }
823     if pattern0_0 == F64X2 {
824         // Rule at src/isa/x64/inst.isle line 1132.
825         let expr0_0 = SseOpcode::Xorpd;
826         return Some(expr0_0);
827     }
828     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
829         // Rule at src/isa/x64/inst.isle line 1133.
830         let expr0_0 = SseOpcode::Pxor;
831         return Some(expr0_0);
832     }
833     return None;
834 }
835 
836 // Generated as internal constructor for term sse_xor.
837 pub fn constructor_sse_xor<C: Context>(
838     ctx: &mut C,
839     arg0: Type,
840     arg1: Xmm,
841     arg2: &XmmMem,
842 ) -> Option<Xmm> {
843     let pattern0_0 = arg0;
844     let pattern1_0 = arg1;
845     let pattern2_0 = arg2;
846     // Rule at src/isa/x64/inst.isle line 1137.
847     let expr0_0 = constructor_sse_xor_op(ctx, pattern0_0)?;
848     let expr1_0 = constructor_xmm_rm_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
849     return Some(expr1_0);
850 }
851 
852 // Generated as internal constructor for term sse_cmp_op.
853 pub fn constructor_sse_cmp_op<C: Context>(ctx: &mut C, arg0: Type) -> Option<SseOpcode> {
854     let pattern0_0 = arg0;
855     if pattern0_0 == F32X4 {
856         // Rule at src/isa/x64/inst.isle line 1146.
857         let expr0_0 = SseOpcode::Cmpps;
858         return Some(expr0_0);
859     }
860     if pattern0_0 == F64X2 {
861         // Rule at src/isa/x64/inst.isle line 1147.
862         let expr0_0 = SseOpcode::Cmppd;
863         return Some(expr0_0);
864     }
865     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
866         if pattern1_0 == 8 {
867             if pattern1_1 == 16 {
868                 // Rule at src/isa/x64/inst.isle line 1142.
869                 let expr0_0 = SseOpcode::Pcmpeqb;
870                 return Some(expr0_0);
871             }
872         }
873         if pattern1_0 == 16 {
874             if pattern1_1 == 8 {
875                 // Rule at src/isa/x64/inst.isle line 1143.
876                 let expr0_0 = SseOpcode::Pcmpeqw;
877                 return Some(expr0_0);
878             }
879         }
880         if pattern1_0 == 32 {
881             if pattern1_1 == 4 {
882                 // Rule at src/isa/x64/inst.isle line 1144.
883                 let expr0_0 = SseOpcode::Pcmpeqd;
884                 return Some(expr0_0);
885             }
886         }
887         if pattern1_0 == 64 {
888             if pattern1_1 == 2 {
889                 // Rule at src/isa/x64/inst.isle line 1145.
890                 let expr0_0 = SseOpcode::Pcmpeqq;
891                 return Some(expr0_0);
892             }
893         }
894     }
895     return None;
896 }
897 
898 // Generated as internal constructor for term vector_all_ones.
899 pub fn constructor_vector_all_ones<C: Context>(ctx: &mut C, arg0: Type) -> Option<Xmm> {
900     let pattern0_0 = arg0;
901     // Rule at src/isa/x64/inst.isle line 1161.
902     let expr0_0 = C::temp_writable_xmm(ctx);
903     let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
904     let expr2_0: Type = I32X4;
905     let expr3_0 = constructor_sse_cmp_op(ctx, expr2_0)?;
906     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
907     let expr5_0 = MInst::XmmRmR {
908         op: expr3_0,
909         src1: expr1_0,
910         src2: expr4_0,
911         dst: expr0_0,
912     };
913     let expr6_0 = C::emit(ctx, &expr5_0);
914     return Some(expr1_0);
915 }
916 
917 // Generated as internal constructor for term make_i64x2_from_lanes.
918 pub fn constructor_make_i64x2_from_lanes<C: Context>(
919     ctx: &mut C,
920     arg0: &GprMem,
921     arg1: &GprMem,
922 ) -> Option<Xmm> {
923     let pattern0_0 = arg0;
924     let pattern1_0 = arg1;
925     // Rule at src/isa/x64/inst.isle line 1172.
926     let expr0_0 = C::temp_writable_xmm(ctx);
927     let expr1_0 = C::writable_xmm_to_reg(ctx, expr0_0);
928     let expr2_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
929     let expr3_0 = C::xmm_to_reg(ctx, expr2_0);
930     let expr4_0 = MInst::XmmUninitializedValue { dst: expr0_0 };
931     let expr5_0 = C::emit(ctx, &expr4_0);
932     let expr6_0 = SseOpcode::Pinsrd;
933     let expr7_0 = C::gpr_mem_to_reg_mem(ctx, pattern0_0);
934     let expr8_0: u8 = 0;
935     let expr9_0 = OperandSize::Size64;
936     let expr10_0 = MInst::XmmRmRImm {
937         op: expr6_0,
938         src1: expr3_0,
939         src2: expr7_0,
940         dst: expr1_0,
941         imm: expr8_0,
942         size: expr9_0,
943     };
944     let expr11_0 = C::emit(ctx, &expr10_0);
945     let expr12_0 = SseOpcode::Pinsrd;
946     let expr13_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0);
947     let expr14_0: u8 = 1;
948     let expr15_0 = OperandSize::Size64;
949     let expr16_0 = MInst::XmmRmRImm {
950         op: expr12_0,
951         src1: expr3_0,
952         src2: expr13_0,
953         dst: expr1_0,
954         imm: expr14_0,
955         size: expr15_0,
956     };
957     let expr17_0 = C::emit(ctx, &expr16_0);
958     return Some(expr2_0);
959 }
960 
961 // Generated as internal constructor for term mov_rmi_to_xmm.
962 pub fn constructor_mov_rmi_to_xmm<C: Context>(ctx: &mut C, arg0: &RegMemImm) -> Option<XmmMemImm> {
963     let pattern0_0 = arg0;
964     match pattern0_0 {
965         &RegMemImm::Imm { simm32: pattern1_0 } => {
966             // Rule at src/isa/x64/inst.isle line 1195.
967             let expr0_0 = C::xmm_mem_imm_new(ctx, pattern0_0);
968             return Some(expr0_0);
969         }
970         &RegMemImm::Reg { reg: pattern1_0 } => {
971             // Rule at src/isa/x64/inst.isle line 1196.
972             let expr0_0 = SseOpcode::Movd;
973             let expr1_0 = C::reg_to_gpr_mem(ctx, pattern1_0);
974             let expr2_0 = OperandSize::Size32;
975             let expr3_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr1_0, &expr2_0)?;
976             let expr4_0 = C::xmm_to_xmm_mem_imm(ctx, expr3_0);
977             return Some(expr4_0);
978         }
979         &RegMemImm::Mem {
980             addr: ref pattern1_0,
981         } => {
982             // Rule at src/isa/x64/inst.isle line 1194.
983             let expr0_0 = C::xmm_mem_imm_new(ctx, pattern0_0);
984             return Some(expr0_0);
985         }
986         _ => {}
987     }
988     return None;
989 }
990 
991 // Generated as internal constructor for term x64_load.
992 pub fn constructor_x64_load<C: Context>(
993     ctx: &mut C,
994     arg0: Type,
995     arg1: &SyntheticAmode,
996     arg2: &ExtKind,
997 ) -> Option<Reg> {
998     let pattern0_0 = arg0;
999     if pattern0_0 == I64 {
1000         let pattern2_0 = arg1;
1001         let pattern3_0 = arg2;
1002         // Rule at src/isa/x64/inst.isle line 1211.
1003         let expr0_0 = C::temp_writable_gpr(ctx);
1004         let expr1_0 = MInst::Mov64MR {
1005             src: pattern2_0.clone(),
1006             dst: expr0_0,
1007         };
1008         let expr2_0 = C::emit(ctx, &expr1_0);
1009         let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
1010         let expr4_0 = C::gpr_to_reg(ctx, expr3_0);
1011         return Some(expr4_0);
1012     }
1013     if pattern0_0 == F32 {
1014         let pattern2_0 = arg1;
1015         let pattern3_0 = arg2;
1016         // Rule at src/isa/x64/inst.isle line 1216.
1017         let expr0_0 = SseOpcode::Movss;
1018         let expr1_0 = C::synthetic_amode_to_reg_mem(ctx, pattern2_0);
1019         let expr2_0 = C::reg_mem_to_xmm_mem(ctx, &expr1_0);
1020         let expr3_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr2_0)?;
1021         let expr4_0 = C::xmm_to_reg(ctx, expr3_0);
1022         return Some(expr4_0);
1023     }
1024     if pattern0_0 == F64 {
1025         let pattern2_0 = arg1;
1026         let pattern3_0 = arg2;
1027         // Rule at src/isa/x64/inst.isle line 1220.
1028         let expr0_0 = SseOpcode::Movsd;
1029         let expr1_0 = C::synthetic_amode_to_reg_mem(ctx, pattern2_0);
1030         let expr2_0 = C::reg_mem_to_xmm_mem(ctx, &expr1_0);
1031         let expr3_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr2_0)?;
1032         let expr4_0 = C::xmm_to_reg(ctx, expr3_0);
1033         return Some(expr4_0);
1034     }
1035     if pattern0_0 == F32X4 {
1036         let pattern2_0 = arg1;
1037         let pattern3_0 = arg2;
1038         // Rule at src/isa/x64/inst.isle line 1224.
1039         let expr0_0 = SseOpcode::Movups;
1040         let expr1_0 = C::synthetic_amode_to_reg_mem(ctx, pattern2_0);
1041         let expr2_0 = C::reg_mem_to_xmm_mem(ctx, &expr1_0);
1042         let expr3_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr2_0)?;
1043         let expr4_0 = C::xmm_to_reg(ctx, expr3_0);
1044         return Some(expr4_0);
1045     }
1046     if pattern0_0 == F64X2 {
1047         let pattern2_0 = arg1;
1048         let pattern3_0 = arg2;
1049         // Rule at src/isa/x64/inst.isle line 1228.
1050         let expr0_0 = SseOpcode::Movupd;
1051         let expr1_0 = C::synthetic_amode_to_reg_mem(ctx, pattern2_0);
1052         let expr2_0 = C::reg_mem_to_xmm_mem(ctx, &expr1_0);
1053         let expr3_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr2_0)?;
1054         let expr4_0 = C::xmm_to_reg(ctx, expr3_0);
1055         return Some(expr4_0);
1056     }
1057     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
1058         let pattern2_0 = arg1;
1059         let pattern3_0 = arg2;
1060         // Rule at src/isa/x64/inst.isle line 1232.
1061         let expr0_0 = SseOpcode::Movdqu;
1062         let expr1_0 = C::synthetic_amode_to_reg_mem(ctx, pattern2_0);
1063         let expr2_0 = C::reg_mem_to_xmm_mem(ctx, &expr1_0);
1064         let expr3_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr2_0)?;
1065         let expr4_0 = C::xmm_to_reg(ctx, expr3_0);
1066         return Some(expr4_0);
1067     }
1068     if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) {
1069         let pattern2_0 = arg1;
1070         let pattern3_0 = arg2;
1071         if let &ExtKind::SignExtend = pattern3_0 {
1072             // Rule at src/isa/x64/inst.isle line 1206.
1073             let expr0_0 = C::ty_bytes(ctx, pattern1_0);
1074             let expr1_0: u16 = 8;
1075             let expr2_0 = C::ext_mode(ctx, expr0_0, expr1_0);
1076             let expr3_0 = C::synthetic_amode_to_reg_mem(ctx, pattern2_0);
1077             let expr4_0 = C::reg_mem_to_gpr_mem(ctx, &expr3_0);
1078             let expr5_0 = constructor_movsx(ctx, pattern1_0, &expr2_0, &expr4_0)?;
1079             let expr6_0 = C::gpr_to_reg(ctx, expr5_0);
1080             return Some(expr6_0);
1081         }
1082     }
1083     return None;
1084 }
1085 
1086 // Generated as internal constructor for term alu_rmi_r.
1087 pub fn constructor_alu_rmi_r<C: Context>(
1088     ctx: &mut C,
1089     arg0: Type,
1090     arg1: &AluRmiROpcode,
1091     arg2: Gpr,
1092     arg3: &GprMemImm,
1093 ) -> Option<Gpr> {
1094     let pattern0_0 = arg0;
1095     let pattern1_0 = arg1;
1096     let pattern2_0 = arg2;
1097     let pattern3_0 = arg3;
1098     // Rule at src/isa/x64/inst.isle line 1244.
1099     let expr0_0 = C::temp_writable_gpr(ctx);
1100     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
1101     let expr2_0 = MInst::AluRmiR {
1102         size: expr1_0,
1103         op: pattern1_0.clone(),
1104         src1: pattern2_0,
1105         src2: pattern3_0.clone(),
1106         dst: expr0_0,
1107     };
1108     let expr3_0 = C::emit(ctx, &expr2_0);
1109     let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
1110     return Some(expr4_0);
1111 }
1112 
1113 // Generated as internal constructor for term add.
1114 pub fn constructor_add<C: Context>(
1115     ctx: &mut C,
1116     arg0: Type,
1117     arg1: Gpr,
1118     arg2: &GprMemImm,
1119 ) -> Option<Gpr> {
1120     let pattern0_0 = arg0;
1121     let pattern1_0 = arg1;
1122     let pattern2_0 = arg2;
1123     // Rule at src/isa/x64/inst.isle line 1252.
1124     let expr0_0 = AluRmiROpcode::Add;
1125     let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1126     return Some(expr1_0);
1127 }
1128 
1129 // Generated as internal constructor for term add_with_flags.
1130 pub fn constructor_add_with_flags<C: Context>(
1131     ctx: &mut C,
1132     arg0: Type,
1133     arg1: Gpr,
1134     arg2: &GprMemImm,
1135 ) -> Option<ProducesFlags> {
1136     let pattern0_0 = arg0;
1137     let pattern1_0 = arg1;
1138     let pattern2_0 = arg2;
1139     // Rule at src/isa/x64/inst.isle line 1260.
1140     let expr0_0 = C::temp_writable_gpr(ctx);
1141     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
1142     let expr2_0 = AluRmiROpcode::Add;
1143     let expr3_0 = MInst::AluRmiR {
1144         size: expr1_0,
1145         op: expr2_0,
1146         src1: pattern1_0,
1147         src2: pattern2_0.clone(),
1148         dst: expr0_0,
1149     };
1150     let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
1151     let expr5_0 = C::gpr_to_reg(ctx, expr4_0);
1152     let expr6_0 = ProducesFlags::ProducesFlags {
1153         inst: expr3_0,
1154         result: expr5_0,
1155     };
1156     return Some(expr6_0);
1157 }
1158 
1159 // Generated as internal constructor for term adc.
1160 pub fn constructor_adc<C: Context>(
1161     ctx: &mut C,
1162     arg0: Type,
1163     arg1: Gpr,
1164     arg2: &GprMemImm,
1165 ) -> Option<ConsumesFlags> {
1166     let pattern0_0 = arg0;
1167     let pattern1_0 = arg1;
1168     let pattern2_0 = arg2;
1169     // Rule at src/isa/x64/inst.isle line 1271.
1170     let expr0_0 = C::temp_writable_gpr(ctx);
1171     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
1172     let expr2_0 = AluRmiROpcode::Adc;
1173     let expr3_0 = MInst::AluRmiR {
1174         size: expr1_0,
1175         op: expr2_0,
1176         src1: pattern1_0,
1177         src2: pattern2_0.clone(),
1178         dst: expr0_0,
1179     };
1180     let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
1181     let expr5_0 = C::gpr_to_reg(ctx, expr4_0);
1182     let expr6_0 = ConsumesFlags::ConsumesFlags {
1183         inst: expr3_0,
1184         result: expr5_0,
1185     };
1186     return Some(expr6_0);
1187 }
1188 
1189 // Generated as internal constructor for term sub.
1190 pub fn constructor_sub<C: Context>(
1191     ctx: &mut C,
1192     arg0: Type,
1193     arg1: Gpr,
1194     arg2: &GprMemImm,
1195 ) -> Option<Gpr> {
1196     let pattern0_0 = arg0;
1197     let pattern1_0 = arg1;
1198     let pattern2_0 = arg2;
1199     // Rule at src/isa/x64/inst.isle line 1282.
1200     let expr0_0 = AluRmiROpcode::Sub;
1201     let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1202     return Some(expr1_0);
1203 }
1204 
1205 // Generated as internal constructor for term sub_with_flags.
1206 pub fn constructor_sub_with_flags<C: Context>(
1207     ctx: &mut C,
1208     arg0: Type,
1209     arg1: Gpr,
1210     arg2: &GprMemImm,
1211 ) -> Option<ProducesFlags> {
1212     let pattern0_0 = arg0;
1213     let pattern1_0 = arg1;
1214     let pattern2_0 = arg2;
1215     // Rule at src/isa/x64/inst.isle line 1290.
1216     let expr0_0 = C::temp_writable_gpr(ctx);
1217     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
1218     let expr2_0 = AluRmiROpcode::Sub;
1219     let expr3_0 = MInst::AluRmiR {
1220         size: expr1_0,
1221         op: expr2_0,
1222         src1: pattern1_0,
1223         src2: pattern2_0.clone(),
1224         dst: expr0_0,
1225     };
1226     let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
1227     let expr5_0 = C::gpr_to_reg(ctx, expr4_0);
1228     let expr6_0 = ProducesFlags::ProducesFlags {
1229         inst: expr3_0,
1230         result: expr5_0,
1231     };
1232     return Some(expr6_0);
1233 }
1234 
1235 // Generated as internal constructor for term sbb.
1236 pub fn constructor_sbb<C: Context>(
1237     ctx: &mut C,
1238     arg0: Type,
1239     arg1: Gpr,
1240     arg2: &GprMemImm,
1241 ) -> Option<ConsumesFlags> {
1242     let pattern0_0 = arg0;
1243     let pattern1_0 = arg1;
1244     let pattern2_0 = arg2;
1245     // Rule at src/isa/x64/inst.isle line 1301.
1246     let expr0_0 = C::temp_writable_gpr(ctx);
1247     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
1248     let expr2_0 = AluRmiROpcode::Sbb;
1249     let expr3_0 = MInst::AluRmiR {
1250         size: expr1_0,
1251         op: expr2_0,
1252         src1: pattern1_0,
1253         src2: pattern2_0.clone(),
1254         dst: expr0_0,
1255     };
1256     let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
1257     let expr5_0 = C::gpr_to_reg(ctx, expr4_0);
1258     let expr6_0 = ConsumesFlags::ConsumesFlags {
1259         inst: expr3_0,
1260         result: expr5_0,
1261     };
1262     return Some(expr6_0);
1263 }
1264 
1265 // Generated as internal constructor for term mul.
1266 pub fn constructor_mul<C: Context>(
1267     ctx: &mut C,
1268     arg0: Type,
1269     arg1: Gpr,
1270     arg2: &GprMemImm,
1271 ) -> Option<Gpr> {
1272     let pattern0_0 = arg0;
1273     let pattern1_0 = arg1;
1274     let pattern2_0 = arg2;
1275     // Rule at src/isa/x64/inst.isle line 1312.
1276     let expr0_0 = AluRmiROpcode::Mul;
1277     let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1278     return Some(expr1_0);
1279 }
1280 
1281 // Generated as internal constructor for term x64_and.
1282 pub fn constructor_x64_and<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 1320.
1292     let expr0_0 = AluRmiROpcode::And;
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 or.
1298 pub fn constructor_or<C: Context>(
1299     ctx: &mut C,
1300     arg0: Type,
1301     arg1: Gpr,
1302     arg2: &GprMemImm,
1303 ) -> Option<Gpr> {
1304     let pattern0_0 = arg0;
1305     let pattern1_0 = arg1;
1306     let pattern2_0 = arg2;
1307     // Rule at src/isa/x64/inst.isle line 1328.
1308     let expr0_0 = AluRmiROpcode::Or;
1309     let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1310     return Some(expr1_0);
1311 }
1312 
1313 // Generated as internal constructor for term xor.
1314 pub fn constructor_xor<C: Context>(
1315     ctx: &mut C,
1316     arg0: Type,
1317     arg1: Gpr,
1318     arg2: &GprMemImm,
1319 ) -> Option<Gpr> {
1320     let pattern0_0 = arg0;
1321     let pattern1_0 = arg1;
1322     let pattern2_0 = arg2;
1323     // Rule at src/isa/x64/inst.isle line 1336.
1324     let expr0_0 = AluRmiROpcode::Xor;
1325     let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1326     return Some(expr1_0);
1327 }
1328 
1329 // Generated as internal constructor for term imm.
1330 pub fn constructor_imm<C: Context>(ctx: &mut C, arg0: Type, arg1: u64) -> Option<Reg> {
1331     let pattern0_0 = arg0;
1332     if pattern0_0 == I64 {
1333         let pattern2_0 = arg1;
1334         if let Some(pattern3_0) = C::nonzero_u64_fits_in_u32(ctx, pattern2_0) {
1335             // Rule at src/isa/x64/inst.isle line 1369.
1336             let expr0_0 = C::temp_writable_gpr(ctx);
1337             let expr1_0 = OperandSize::Size32;
1338             let expr2_0 = MInst::Imm {
1339                 dst_size: expr1_0,
1340                 simm64: pattern3_0,
1341                 dst: expr0_0,
1342             };
1343             let expr3_0 = C::emit(ctx, &expr2_0);
1344             let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
1345             let expr5_0 = C::gpr_to_reg(ctx, expr4_0);
1346             return Some(expr5_0);
1347         }
1348     }
1349     if pattern0_0 == F32 {
1350         let pattern2_0 = arg1;
1351         if pattern2_0 == 0 {
1352             // Rule at src/isa/x64/inst.isle line 1398.
1353             let expr0_0 = C::temp_writable_xmm(ctx);
1354             let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
1355             let expr2_0 = SseOpcode::Xorps;
1356             let expr3_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
1357             let expr4_0 = MInst::XmmRmR {
1358                 op: expr2_0,
1359                 src1: expr1_0,
1360                 src2: expr3_0,
1361                 dst: expr0_0,
1362             };
1363             let expr5_0 = C::emit(ctx, &expr4_0);
1364             let expr6_0 = C::xmm_to_reg(ctx, expr1_0);
1365             return Some(expr6_0);
1366         }
1367         // Rule at src/isa/x64/inst.isle line 1353.
1368         let expr0_0 = SseOpcode::Movd;
1369         let expr1_0: Type = I32;
1370         let expr2_0 = constructor_imm(ctx, expr1_0, pattern2_0)?;
1371         let expr3_0 = RegMem::Reg { reg: expr2_0 };
1372         let expr4_0 = C::reg_mem_to_gpr_mem(ctx, &expr3_0);
1373         let expr5_0 = OperandSize::Size32;
1374         let expr6_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr4_0, &expr5_0)?;
1375         let expr7_0 = C::xmm_to_reg(ctx, expr6_0);
1376         return Some(expr7_0);
1377     }
1378     if pattern0_0 == F64 {
1379         let pattern2_0 = arg1;
1380         if pattern2_0 == 0 {
1381             // Rule at src/isa/x64/inst.isle line 1410.
1382             let expr0_0 = C::temp_writable_xmm(ctx);
1383             let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
1384             let expr2_0 = SseOpcode::Xorpd;
1385             let expr3_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
1386             let expr4_0 = MInst::XmmRmR {
1387                 op: expr2_0,
1388                 src1: expr1_0,
1389                 src2: expr3_0,
1390                 dst: expr0_0,
1391             };
1392             let expr5_0 = C::emit(ctx, &expr4_0);
1393             let expr6_0 = C::xmm_to_reg(ctx, expr1_0);
1394             return Some(expr6_0);
1395         }
1396         // Rule at src/isa/x64/inst.isle line 1359.
1397         let expr0_0 = SseOpcode::Movq;
1398         let expr1_0: Type = I64;
1399         let expr2_0 = constructor_imm(ctx, expr1_0, pattern2_0)?;
1400         let expr3_0 = RegMem::Reg { reg: expr2_0 };
1401         let expr4_0 = C::reg_mem_to_gpr_mem(ctx, &expr3_0);
1402         let expr5_0 = OperandSize::Size64;
1403         let expr6_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr4_0, &expr5_0)?;
1404         let expr7_0 = C::xmm_to_reg(ctx, expr6_0);
1405         return Some(expr7_0);
1406     }
1407     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
1408         let pattern2_0 = arg1;
1409         if pattern2_0 == 0 {
1410             // Rule at src/isa/x64/inst.isle line 1388.
1411             let expr0_0 = C::temp_writable_xmm(ctx);
1412             let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
1413             let expr2_0 = constructor_sse_xor_op(ctx, pattern0_0)?;
1414             let expr3_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
1415             let expr4_0 = MInst::XmmRmR {
1416                 op: expr2_0,
1417                 src1: expr1_0,
1418                 src2: expr3_0,
1419                 dst: expr0_0,
1420             };
1421             let expr5_0 = C::emit(ctx, &expr4_0);
1422             let expr6_0 = C::xmm_to_reg(ctx, expr1_0);
1423             return Some(expr6_0);
1424         }
1425     }
1426     if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) {
1427         let pattern2_0 = arg1;
1428         if pattern2_0 == 0 {
1429             // Rule at src/isa/x64/inst.isle line 1375.
1430             let expr0_0 = C::temp_writable_gpr(ctx);
1431             let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
1432             let expr2_0 = C::operand_size_of_type_32_64(ctx, pattern1_0);
1433             let expr3_0 = AluRmiROpcode::Xor;
1434             let expr4_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0);
1435             let expr5_0 = MInst::AluRmiR {
1436                 size: expr2_0,
1437                 op: expr3_0,
1438                 src1: expr1_0,
1439                 src2: expr4_0,
1440                 dst: expr0_0,
1441             };
1442             let expr6_0 = C::emit(ctx, &expr5_0);
1443             let expr7_0 = C::gpr_to_reg(ctx, expr1_0);
1444             return Some(expr7_0);
1445         }
1446         // Rule at src/isa/x64/inst.isle line 1346.
1447         let expr0_0 = C::temp_writable_gpr(ctx);
1448         let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern1_0);
1449         let expr2_0 = MInst::Imm {
1450             dst_size: expr1_0,
1451             simm64: pattern2_0,
1452             dst: expr0_0,
1453         };
1454         let expr3_0 = C::emit(ctx, &expr2_0);
1455         let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
1456         let expr5_0 = C::gpr_to_reg(ctx, expr4_0);
1457         return Some(expr5_0);
1458     }
1459     return None;
1460 }
1461 
1462 // Generated as internal constructor for term shift_r.
1463 pub fn constructor_shift_r<C: Context>(
1464     ctx: &mut C,
1465     arg0: Type,
1466     arg1: &ShiftKind,
1467     arg2: Gpr,
1468     arg3: &Imm8Gpr,
1469 ) -> Option<Gpr> {
1470     let pattern0_0 = arg0;
1471     let pattern1_0 = arg1;
1472     let pattern2_0 = arg2;
1473     let pattern3_0 = arg3;
1474     // Rule at src/isa/x64/inst.isle line 1423.
1475     let expr0_0 = C::temp_writable_gpr(ctx);
1476     let expr1_0 = C::raw_operand_size_of_type(ctx, pattern0_0);
1477     let expr2_0 = MInst::ShiftR {
1478         size: expr1_0,
1479         kind: pattern1_0.clone(),
1480         src: pattern2_0,
1481         num_bits: pattern3_0.clone(),
1482         dst: expr0_0,
1483     };
1484     let expr3_0 = C::emit(ctx, &expr2_0);
1485     let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
1486     return Some(expr4_0);
1487 }
1488 
1489 // Generated as internal constructor for term x64_rotl.
1490 pub fn constructor_x64_rotl<C: Context>(
1491     ctx: &mut C,
1492     arg0: Type,
1493     arg1: Gpr,
1494     arg2: &Imm8Gpr,
1495 ) -> Option<Gpr> {
1496     let pattern0_0 = arg0;
1497     let pattern1_0 = arg1;
1498     let pattern2_0 = arg2;
1499     // Rule at src/isa/x64/inst.isle line 1433.
1500     let expr0_0 = ShiftKind::RotateLeft;
1501     let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1502     return Some(expr1_0);
1503 }
1504 
1505 // Generated as internal constructor for term x64_rotr.
1506 pub fn constructor_x64_rotr<C: Context>(
1507     ctx: &mut C,
1508     arg0: Type,
1509     arg1: Gpr,
1510     arg2: &Imm8Gpr,
1511 ) -> Option<Gpr> {
1512     let pattern0_0 = arg0;
1513     let pattern1_0 = arg1;
1514     let pattern2_0 = arg2;
1515     // Rule at src/isa/x64/inst.isle line 1438.
1516     let expr0_0 = ShiftKind::RotateRight;
1517     let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1518     return Some(expr1_0);
1519 }
1520 
1521 // Generated as internal constructor for term shl.
1522 pub fn constructor_shl<C: Context>(
1523     ctx: &mut C,
1524     arg0: Type,
1525     arg1: Gpr,
1526     arg2: &Imm8Gpr,
1527 ) -> Option<Gpr> {
1528     let pattern0_0 = arg0;
1529     let pattern1_0 = arg1;
1530     let pattern2_0 = arg2;
1531     // Rule at src/isa/x64/inst.isle line 1443.
1532     let expr0_0 = ShiftKind::ShiftLeft;
1533     let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1534     return Some(expr1_0);
1535 }
1536 
1537 // Generated as internal constructor for term shr.
1538 pub fn constructor_shr<C: Context>(
1539     ctx: &mut C,
1540     arg0: Type,
1541     arg1: Gpr,
1542     arg2: &Imm8Gpr,
1543 ) -> Option<Gpr> {
1544     let pattern0_0 = arg0;
1545     let pattern1_0 = arg1;
1546     let pattern2_0 = arg2;
1547     // Rule at src/isa/x64/inst.isle line 1448.
1548     let expr0_0 = ShiftKind::ShiftRightLogical;
1549     let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1550     return Some(expr1_0);
1551 }
1552 
1553 // Generated as internal constructor for term sar.
1554 pub fn constructor_sar<C: Context>(
1555     ctx: &mut C,
1556     arg0: Type,
1557     arg1: Gpr,
1558     arg2: &Imm8Gpr,
1559 ) -> Option<Gpr> {
1560     let pattern0_0 = arg0;
1561     let pattern1_0 = arg1;
1562     let pattern2_0 = arg2;
1563     // Rule at src/isa/x64/inst.isle line 1453.
1564     let expr0_0 = ShiftKind::ShiftRightArithmetic;
1565     let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1566     return Some(expr1_0);
1567 }
1568 
1569 // Generated as internal constructor for term cmp_rmi_r.
1570 pub fn constructor_cmp_rmi_r<C: Context>(
1571     ctx: &mut C,
1572     arg0: &OperandSize,
1573     arg1: &CmpOpcode,
1574     arg2: &GprMemImm,
1575     arg3: Gpr,
1576 ) -> Option<ProducesFlags> {
1577     let pattern0_0 = arg0;
1578     let pattern1_0 = arg1;
1579     let pattern2_0 = arg2;
1580     let pattern3_0 = arg3;
1581     // Rule at src/isa/x64/inst.isle line 1458.
1582     let expr0_0 = MInst::CmpRmiR {
1583         size: pattern0_0.clone(),
1584         opcode: pattern1_0.clone(),
1585         src: pattern2_0.clone(),
1586         dst: pattern3_0,
1587     };
1588     let expr1_0 = C::invalid_reg(ctx);
1589     let expr2_0 = ProducesFlags::ProducesFlags {
1590         inst: expr0_0,
1591         result: expr1_0,
1592     };
1593     return Some(expr2_0);
1594 }
1595 
1596 // Generated as internal constructor for term cmp.
1597 pub fn constructor_cmp<C: Context>(
1598     ctx: &mut C,
1599     arg0: &OperandSize,
1600     arg1: &GprMemImm,
1601     arg2: Gpr,
1602 ) -> Option<ProducesFlags> {
1603     let pattern0_0 = arg0;
1604     let pattern1_0 = arg1;
1605     let pattern2_0 = arg2;
1606     // Rule at src/isa/x64/inst.isle line 1467.
1607     let expr0_0 = CmpOpcode::Cmp;
1608     let expr1_0 = constructor_cmp_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1609     return Some(expr1_0);
1610 }
1611 
1612 // Generated as internal constructor for term test.
1613 pub fn constructor_test<C: Context>(
1614     ctx: &mut C,
1615     arg0: &OperandSize,
1616     arg1: &GprMemImm,
1617     arg2: Gpr,
1618 ) -> Option<ProducesFlags> {
1619     let pattern0_0 = arg0;
1620     let pattern1_0 = arg1;
1621     let pattern2_0 = arg2;
1622     // Rule at src/isa/x64/inst.isle line 1472.
1623     let expr0_0 = CmpOpcode::Test;
1624     let expr1_0 = constructor_cmp_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1625     return Some(expr1_0);
1626 }
1627 
1628 // Generated as internal constructor for term cmove.
1629 pub fn constructor_cmove<C: Context>(
1630     ctx: &mut C,
1631     arg0: Type,
1632     arg1: &CC,
1633     arg2: &GprMem,
1634     arg3: Gpr,
1635 ) -> Option<ConsumesFlags> {
1636     let pattern0_0 = arg0;
1637     let pattern1_0 = arg1;
1638     let pattern2_0 = arg2;
1639     let pattern3_0 = arg3;
1640     // Rule at src/isa/x64/inst.isle line 1477.
1641     let expr0_0 = C::temp_writable_gpr(ctx);
1642     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
1643     let expr2_0 = MInst::Cmove {
1644         size: expr1_0,
1645         cc: pattern1_0.clone(),
1646         consequent: pattern2_0.clone(),
1647         alternative: pattern3_0,
1648         dst: expr0_0,
1649     };
1650     let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
1651     let expr4_0 = C::gpr_to_reg(ctx, expr3_0);
1652     let expr5_0 = ConsumesFlags::ConsumesFlags {
1653         inst: expr2_0,
1654         result: expr4_0,
1655     };
1656     return Some(expr5_0);
1657 }
1658 
1659 // Generated as internal constructor for term movzx.
1660 pub fn constructor_movzx<C: Context>(
1661     ctx: &mut C,
1662     arg0: Type,
1663     arg1: &ExtMode,
1664     arg2: &GprMem,
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 1485.
1670     let expr0_0 = C::temp_writable_gpr(ctx);
1671     let expr1_0 = MInst::MovzxRmR {
1672         ext_mode: pattern1_0.clone(),
1673         src: pattern2_0.clone(),
1674         dst: expr0_0,
1675     };
1676     let expr2_0 = C::emit(ctx, &expr1_0);
1677     let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
1678     return Some(expr3_0);
1679 }
1680 
1681 // Generated as internal constructor for term movsx.
1682 pub fn constructor_movsx<C: Context>(
1683     ctx: &mut C,
1684     arg0: Type,
1685     arg1: &ExtMode,
1686     arg2: &GprMem,
1687 ) -> Option<Gpr> {
1688     let pattern0_0 = arg0;
1689     let pattern1_0 = arg1;
1690     let pattern2_0 = arg2;
1691     // Rule at src/isa/x64/inst.isle line 1492.
1692     let expr0_0 = C::temp_writable_gpr(ctx);
1693     let expr1_0 = MInst::MovsxRmR {
1694         ext_mode: pattern1_0.clone(),
1695         src: pattern2_0.clone(),
1696         dst: expr0_0,
1697     };
1698     let expr2_0 = C::emit(ctx, &expr1_0);
1699     let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
1700     return Some(expr3_0);
1701 }
1702 
1703 // Generated as internal constructor for term xmm_rm_r.
1704 pub fn constructor_xmm_rm_r<C: Context>(
1705     ctx: &mut C,
1706     arg0: Type,
1707     arg1: &SseOpcode,
1708     arg2: Xmm,
1709     arg3: &XmmMem,
1710 ) -> Option<Xmm> {
1711     let pattern0_0 = arg0;
1712     let pattern1_0 = arg1;
1713     let pattern2_0 = arg2;
1714     let pattern3_0 = arg3;
1715     // Rule at src/isa/x64/inst.isle line 1499.
1716     let expr0_0 = C::temp_writable_xmm(ctx);
1717     let expr1_0 = MInst::XmmRmR {
1718         op: pattern1_0.clone(),
1719         src1: pattern2_0,
1720         src2: pattern3_0.clone(),
1721         dst: expr0_0,
1722     };
1723     let expr2_0 = C::emit(ctx, &expr1_0);
1724     let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
1725     return Some(expr3_0);
1726 }
1727 
1728 // Generated as internal constructor for term paddb.
1729 pub fn constructor_paddb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1730     let pattern0_0 = arg0;
1731     let pattern1_0 = arg1;
1732     // Rule at src/isa/x64/inst.isle line 1506.
1733     let expr0_0: Type = I8X16;
1734     let expr1_0 = SseOpcode::Paddb;
1735     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1736     return Some(expr2_0);
1737 }
1738 
1739 // Generated as internal constructor for term paddw.
1740 pub fn constructor_paddw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1741     let pattern0_0 = arg0;
1742     let pattern1_0 = arg1;
1743     // Rule at src/isa/x64/inst.isle line 1511.
1744     let expr0_0: Type = I16X8;
1745     let expr1_0 = SseOpcode::Paddw;
1746     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1747     return Some(expr2_0);
1748 }
1749 
1750 // Generated as internal constructor for term paddd.
1751 pub fn constructor_paddd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1752     let pattern0_0 = arg0;
1753     let pattern1_0 = arg1;
1754     // Rule at src/isa/x64/inst.isle line 1516.
1755     let expr0_0: Type = I32X4;
1756     let expr1_0 = SseOpcode::Paddd;
1757     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1758     return Some(expr2_0);
1759 }
1760 
1761 // Generated as internal constructor for term paddq.
1762 pub fn constructor_paddq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1763     let pattern0_0 = arg0;
1764     let pattern1_0 = arg1;
1765     // Rule at src/isa/x64/inst.isle line 1521.
1766     let expr0_0: Type = I64X2;
1767     let expr1_0 = SseOpcode::Paddq;
1768     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1769     return Some(expr2_0);
1770 }
1771 
1772 // Generated as internal constructor for term paddsb.
1773 pub fn constructor_paddsb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1774     let pattern0_0 = arg0;
1775     let pattern1_0 = arg1;
1776     // Rule at src/isa/x64/inst.isle line 1526.
1777     let expr0_0: Type = I8X16;
1778     let expr1_0 = SseOpcode::Paddsb;
1779     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1780     return Some(expr2_0);
1781 }
1782 
1783 // Generated as internal constructor for term paddsw.
1784 pub fn constructor_paddsw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1785     let pattern0_0 = arg0;
1786     let pattern1_0 = arg1;
1787     // Rule at src/isa/x64/inst.isle line 1531.
1788     let expr0_0: Type = I16X8;
1789     let expr1_0 = SseOpcode::Paddsw;
1790     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1791     return Some(expr2_0);
1792 }
1793 
1794 // Generated as internal constructor for term paddusb.
1795 pub fn constructor_paddusb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1796     let pattern0_0 = arg0;
1797     let pattern1_0 = arg1;
1798     // Rule at src/isa/x64/inst.isle line 1536.
1799     let expr0_0: Type = I8X16;
1800     let expr1_0 = SseOpcode::Paddusb;
1801     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1802     return Some(expr2_0);
1803 }
1804 
1805 // Generated as internal constructor for term paddusw.
1806 pub fn constructor_paddusw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1807     let pattern0_0 = arg0;
1808     let pattern1_0 = arg1;
1809     // Rule at src/isa/x64/inst.isle line 1541.
1810     let expr0_0: Type = I16X8;
1811     let expr1_0 = SseOpcode::Paddusw;
1812     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1813     return Some(expr2_0);
1814 }
1815 
1816 // Generated as internal constructor for term psubb.
1817 pub fn constructor_psubb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1818     let pattern0_0 = arg0;
1819     let pattern1_0 = arg1;
1820     // Rule at src/isa/x64/inst.isle line 1546.
1821     let expr0_0: Type = I8X16;
1822     let expr1_0 = SseOpcode::Psubb;
1823     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1824     return Some(expr2_0);
1825 }
1826 
1827 // Generated as internal constructor for term psubw.
1828 pub fn constructor_psubw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1829     let pattern0_0 = arg0;
1830     let pattern1_0 = arg1;
1831     // Rule at src/isa/x64/inst.isle line 1551.
1832     let expr0_0: Type = I16X8;
1833     let expr1_0 = SseOpcode::Psubw;
1834     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1835     return Some(expr2_0);
1836 }
1837 
1838 // Generated as internal constructor for term psubd.
1839 pub fn constructor_psubd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1840     let pattern0_0 = arg0;
1841     let pattern1_0 = arg1;
1842     // Rule at src/isa/x64/inst.isle line 1556.
1843     let expr0_0: Type = I32X4;
1844     let expr1_0 = SseOpcode::Psubd;
1845     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1846     return Some(expr2_0);
1847 }
1848 
1849 // Generated as internal constructor for term psubq.
1850 pub fn constructor_psubq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1851     let pattern0_0 = arg0;
1852     let pattern1_0 = arg1;
1853     // Rule at src/isa/x64/inst.isle line 1561.
1854     let expr0_0: Type = I64X2;
1855     let expr1_0 = SseOpcode::Psubq;
1856     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1857     return Some(expr2_0);
1858 }
1859 
1860 // Generated as internal constructor for term psubsb.
1861 pub fn constructor_psubsb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1862     let pattern0_0 = arg0;
1863     let pattern1_0 = arg1;
1864     // Rule at src/isa/x64/inst.isle line 1566.
1865     let expr0_0: Type = I8X16;
1866     let expr1_0 = SseOpcode::Psubsb;
1867     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1868     return Some(expr2_0);
1869 }
1870 
1871 // Generated as internal constructor for term psubsw.
1872 pub fn constructor_psubsw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1873     let pattern0_0 = arg0;
1874     let pattern1_0 = arg1;
1875     // Rule at src/isa/x64/inst.isle line 1571.
1876     let expr0_0: Type = I16X8;
1877     let expr1_0 = SseOpcode::Psubsw;
1878     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1879     return Some(expr2_0);
1880 }
1881 
1882 // Generated as internal constructor for term psubusb.
1883 pub fn constructor_psubusb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1884     let pattern0_0 = arg0;
1885     let pattern1_0 = arg1;
1886     // Rule at src/isa/x64/inst.isle line 1576.
1887     let expr0_0: Type = I8X16;
1888     let expr1_0 = SseOpcode::Psubusb;
1889     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1890     return Some(expr2_0);
1891 }
1892 
1893 // Generated as internal constructor for term psubusw.
1894 pub fn constructor_psubusw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1895     let pattern0_0 = arg0;
1896     let pattern1_0 = arg1;
1897     // Rule at src/isa/x64/inst.isle line 1581.
1898     let expr0_0: Type = I16X8;
1899     let expr1_0 = SseOpcode::Psubusw;
1900     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1901     return Some(expr2_0);
1902 }
1903 
1904 // Generated as internal constructor for term pavgb.
1905 pub fn constructor_pavgb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1906     let pattern0_0 = arg0;
1907     let pattern1_0 = arg1;
1908     // Rule at src/isa/x64/inst.isle line 1586.
1909     let expr0_0: Type = I8X16;
1910     let expr1_0 = SseOpcode::Pavgb;
1911     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1912     return Some(expr2_0);
1913 }
1914 
1915 // Generated as internal constructor for term pavgw.
1916 pub fn constructor_pavgw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1917     let pattern0_0 = arg0;
1918     let pattern1_0 = arg1;
1919     // Rule at src/isa/x64/inst.isle line 1591.
1920     let expr0_0: Type = I16X8;
1921     let expr1_0 = SseOpcode::Pavgw;
1922     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1923     return Some(expr2_0);
1924 }
1925 
1926 // Generated as internal constructor for term pand.
1927 pub fn constructor_pand<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1928     let pattern0_0 = arg0;
1929     let pattern1_0 = arg1;
1930     // Rule at src/isa/x64/inst.isle line 1596.
1931     let expr0_0: Type = F32X4;
1932     let expr1_0 = SseOpcode::Pand;
1933     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1934     return Some(expr2_0);
1935 }
1936 
1937 // Generated as internal constructor for term andps.
1938 pub fn constructor_andps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1939     let pattern0_0 = arg0;
1940     let pattern1_0 = arg1;
1941     // Rule at src/isa/x64/inst.isle line 1601.
1942     let expr0_0: Type = F32X4;
1943     let expr1_0 = SseOpcode::Andps;
1944     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1945     return Some(expr2_0);
1946 }
1947 
1948 // Generated as internal constructor for term andpd.
1949 pub fn constructor_andpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1950     let pattern0_0 = arg0;
1951     let pattern1_0 = arg1;
1952     // Rule at src/isa/x64/inst.isle line 1606.
1953     let expr0_0: Type = F64X2;
1954     let expr1_0 = SseOpcode::Andpd;
1955     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1956     return Some(expr2_0);
1957 }
1958 
1959 // Generated as internal constructor for term por.
1960 pub fn constructor_por<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1961     let pattern0_0 = arg0;
1962     let pattern1_0 = arg1;
1963     // Rule at src/isa/x64/inst.isle line 1611.
1964     let expr0_0: Type = F32X4;
1965     let expr1_0 = SseOpcode::Por;
1966     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1967     return Some(expr2_0);
1968 }
1969 
1970 // Generated as internal constructor for term orps.
1971 pub fn constructor_orps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1972     let pattern0_0 = arg0;
1973     let pattern1_0 = arg1;
1974     // Rule at src/isa/x64/inst.isle line 1616.
1975     let expr0_0: Type = F32X4;
1976     let expr1_0 = SseOpcode::Orps;
1977     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1978     return Some(expr2_0);
1979 }
1980 
1981 // Generated as internal constructor for term orpd.
1982 pub fn constructor_orpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1983     let pattern0_0 = arg0;
1984     let pattern1_0 = arg1;
1985     // Rule at src/isa/x64/inst.isle line 1621.
1986     let expr0_0: Type = F64X2;
1987     let expr1_0 = SseOpcode::Orpd;
1988     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
1989     return Some(expr2_0);
1990 }
1991 
1992 // Generated as internal constructor for term pxor.
1993 pub fn constructor_pxor<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
1994     let pattern0_0 = arg0;
1995     let pattern1_0 = arg1;
1996     // Rule at src/isa/x64/inst.isle line 1626.
1997     let expr0_0: Type = I8X16;
1998     let expr1_0 = SseOpcode::Pxor;
1999     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2000     return Some(expr2_0);
2001 }
2002 
2003 // Generated as internal constructor for term xorps.
2004 pub fn constructor_xorps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2005     let pattern0_0 = arg0;
2006     let pattern1_0 = arg1;
2007     // Rule at src/isa/x64/inst.isle line 1631.
2008     let expr0_0: Type = F32X4;
2009     let expr1_0 = SseOpcode::Xorps;
2010     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2011     return Some(expr2_0);
2012 }
2013 
2014 // Generated as internal constructor for term xorpd.
2015 pub fn constructor_xorpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2016     let pattern0_0 = arg0;
2017     let pattern1_0 = arg1;
2018     // Rule at src/isa/x64/inst.isle line 1636.
2019     let expr0_0: Type = F64X2;
2020     let expr1_0 = SseOpcode::Xorpd;
2021     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2022     return Some(expr2_0);
2023 }
2024 
2025 // Generated as internal constructor for term pmullw.
2026 pub fn constructor_pmullw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2027     let pattern0_0 = arg0;
2028     let pattern1_0 = arg1;
2029     // Rule at src/isa/x64/inst.isle line 1641.
2030     let expr0_0: Type = I16X8;
2031     let expr1_0 = SseOpcode::Pmullw;
2032     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2033     return Some(expr2_0);
2034 }
2035 
2036 // Generated as internal constructor for term pmulld.
2037 pub fn constructor_pmulld<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2038     let pattern0_0 = arg0;
2039     let pattern1_0 = arg1;
2040     // Rule at src/isa/x64/inst.isle line 1646.
2041     let expr0_0: Type = I16X8;
2042     let expr1_0 = SseOpcode::Pmulld;
2043     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2044     return Some(expr2_0);
2045 }
2046 
2047 // Generated as internal constructor for term pmulhw.
2048 pub fn constructor_pmulhw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2049     let pattern0_0 = arg0;
2050     let pattern1_0 = arg1;
2051     // Rule at src/isa/x64/inst.isle line 1651.
2052     let expr0_0: Type = I16X8;
2053     let expr1_0 = SseOpcode::Pmulhw;
2054     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2055     return Some(expr2_0);
2056 }
2057 
2058 // Generated as internal constructor for term pmulhuw.
2059 pub fn constructor_pmulhuw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2060     let pattern0_0 = arg0;
2061     let pattern1_0 = arg1;
2062     // Rule at src/isa/x64/inst.isle line 1656.
2063     let expr0_0: Type = I16X8;
2064     let expr1_0 = SseOpcode::Pmulhuw;
2065     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2066     return Some(expr2_0);
2067 }
2068 
2069 // Generated as internal constructor for term pmuldq.
2070 pub fn constructor_pmuldq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2071     let pattern0_0 = arg0;
2072     let pattern1_0 = arg1;
2073     // Rule at src/isa/x64/inst.isle line 1661.
2074     let expr0_0: Type = I16X8;
2075     let expr1_0 = SseOpcode::Pmuldq;
2076     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2077     return Some(expr2_0);
2078 }
2079 
2080 // Generated as internal constructor for term pmuludq.
2081 pub fn constructor_pmuludq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2082     let pattern0_0 = arg0;
2083     let pattern1_0 = arg1;
2084     // Rule at src/isa/x64/inst.isle line 1666.
2085     let expr0_0: Type = I64X2;
2086     let expr1_0 = SseOpcode::Pmuludq;
2087     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2088     return Some(expr2_0);
2089 }
2090 
2091 // Generated as internal constructor for term punpckhwd.
2092 pub fn constructor_punpckhwd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2093     let pattern0_0 = arg0;
2094     let pattern1_0 = arg1;
2095     // Rule at src/isa/x64/inst.isle line 1671.
2096     let expr0_0: Type = I16X8;
2097     let expr1_0 = SseOpcode::Punpckhwd;
2098     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2099     return Some(expr2_0);
2100 }
2101 
2102 // Generated as internal constructor for term punpcklwd.
2103 pub fn constructor_punpcklwd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2104     let pattern0_0 = arg0;
2105     let pattern1_0 = arg1;
2106     // Rule at src/isa/x64/inst.isle line 1676.
2107     let expr0_0: Type = I16X8;
2108     let expr1_0 = SseOpcode::Punpcklwd;
2109     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2110     return Some(expr2_0);
2111 }
2112 
2113 // Generated as internal constructor for term andnps.
2114 pub fn constructor_andnps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2115     let pattern0_0 = arg0;
2116     let pattern1_0 = arg1;
2117     // Rule at src/isa/x64/inst.isle line 1681.
2118     let expr0_0: Type = F32X4;
2119     let expr1_0 = SseOpcode::Andnps;
2120     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2121     return Some(expr2_0);
2122 }
2123 
2124 // Generated as internal constructor for term andnpd.
2125 pub fn constructor_andnpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2126     let pattern0_0 = arg0;
2127     let pattern1_0 = arg1;
2128     // Rule at src/isa/x64/inst.isle line 1686.
2129     let expr0_0: Type = F64X2;
2130     let expr1_0 = SseOpcode::Andnpd;
2131     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2132     return Some(expr2_0);
2133 }
2134 
2135 // Generated as internal constructor for term pandn.
2136 pub fn constructor_pandn<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2137     let pattern0_0 = arg0;
2138     let pattern1_0 = arg1;
2139     // Rule at src/isa/x64/inst.isle line 1691.
2140     let expr0_0: Type = F64X2;
2141     let expr1_0 = SseOpcode::Pandn;
2142     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2143     return Some(expr2_0);
2144 }
2145 
2146 // Generated as internal constructor for term sse_blend_op.
2147 pub fn constructor_sse_blend_op<C: Context>(ctx: &mut C, arg0: Type) -> Option<SseOpcode> {
2148     let pattern0_0 = arg0;
2149     if pattern0_0 == F32X4 {
2150         // Rule at src/isa/x64/inst.isle line 1695.
2151         let expr0_0 = SseOpcode::Blendvps;
2152         return Some(expr0_0);
2153     }
2154     if pattern0_0 == F64X2 {
2155         // Rule at src/isa/x64/inst.isle line 1696.
2156         let expr0_0 = SseOpcode::Blendvpd;
2157         return Some(expr0_0);
2158     }
2159     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
2160         // Rule at src/isa/x64/inst.isle line 1697.
2161         let expr0_0 = SseOpcode::Pblendvb;
2162         return Some(expr0_0);
2163     }
2164     return None;
2165 }
2166 
2167 // Generated as internal constructor for term sse_mov_op.
2168 pub fn constructor_sse_mov_op<C: Context>(ctx: &mut C, arg0: Type) -> Option<SseOpcode> {
2169     let pattern0_0 = arg0;
2170     if pattern0_0 == F32X4 {
2171         // Rule at src/isa/x64/inst.isle line 1700.
2172         let expr0_0 = SseOpcode::Movaps;
2173         return Some(expr0_0);
2174     }
2175     if pattern0_0 == F64X2 {
2176         // Rule at src/isa/x64/inst.isle line 1701.
2177         let expr0_0 = SseOpcode::Movapd;
2178         return Some(expr0_0);
2179     }
2180     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
2181         // Rule at src/isa/x64/inst.isle line 1702.
2182         let expr0_0 = SseOpcode::Movdqa;
2183         return Some(expr0_0);
2184     }
2185     return None;
2186 }
2187 
2188 // Generated as internal constructor for term sse_blend.
2189 pub fn constructor_sse_blend<C: Context>(
2190     ctx: &mut C,
2191     arg0: Type,
2192     arg1: &XmmMem,
2193     arg2: &XmmMem,
2194     arg3: Xmm,
2195 ) -> Option<Xmm> {
2196     let pattern0_0 = arg0;
2197     let pattern1_0 = arg1;
2198     let pattern2_0 = arg2;
2199     let pattern3_0 = arg3;
2200     // Rule at src/isa/x64/inst.isle line 1706.
2201     let expr0_0 = C::xmm0(ctx);
2202     let expr1_0 = constructor_sse_mov_op(ctx, pattern0_0)?;
2203     let expr2_0 = MInst::XmmUnaryRmR {
2204         op: expr1_0,
2205         src: pattern1_0.clone(),
2206         dst: expr0_0,
2207     };
2208     let expr3_0 = C::emit(ctx, &expr2_0);
2209     let expr4_0 = constructor_sse_blend_op(ctx, pattern0_0)?;
2210     let expr5_0 = constructor_xmm_rm_r(ctx, pattern0_0, &expr4_0, pattern3_0, pattern2_0)?;
2211     return Some(expr5_0);
2212 }
2213 
2214 // Generated as internal constructor for term blendvpd.
2215 pub fn constructor_blendvpd<C: Context>(
2216     ctx: &mut C,
2217     arg0: Xmm,
2218     arg1: &XmmMem,
2219     arg2: Xmm,
2220 ) -> Option<Xmm> {
2221     let pattern0_0 = arg0;
2222     let pattern1_0 = arg1;
2223     let pattern2_0 = arg2;
2224     // Rule at src/isa/x64/inst.isle line 1720.
2225     let expr0_0 = C::xmm0(ctx);
2226     let expr1_0 = SseOpcode::Movapd;
2227     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern2_0);
2228     let expr3_0 = MInst::XmmUnaryRmR {
2229         op: expr1_0,
2230         src: expr2_0,
2231         dst: expr0_0,
2232     };
2233     let expr4_0 = C::emit(ctx, &expr3_0);
2234     let expr5_0: Type = F64X2;
2235     let expr6_0 = SseOpcode::Blendvpd;
2236     let expr7_0 = constructor_xmm_rm_r(ctx, expr5_0, &expr6_0, pattern0_0, pattern1_0)?;
2237     return Some(expr7_0);
2238 }
2239 
2240 // Generated as internal constructor for term movsd.
2241 pub fn constructor_movsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2242     let pattern0_0 = arg0;
2243     let pattern1_0 = arg1;
2244     // Rule at src/isa/x64/inst.isle line 1734.
2245     let expr0_0: Type = I8X16;
2246     let expr1_0 = SseOpcode::Movsd;
2247     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2248     return Some(expr2_0);
2249 }
2250 
2251 // Generated as internal constructor for term movlhps.
2252 pub fn constructor_movlhps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2253     let pattern0_0 = arg0;
2254     let pattern1_0 = arg1;
2255     // Rule at src/isa/x64/inst.isle line 1739.
2256     let expr0_0: Type = I8X16;
2257     let expr1_0 = SseOpcode::Movlhps;
2258     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2259     return Some(expr2_0);
2260 }
2261 
2262 // Generated as internal constructor for term pmaxsb.
2263 pub fn constructor_pmaxsb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2264     let pattern0_0 = arg0;
2265     let pattern1_0 = arg1;
2266     // Rule at src/isa/x64/inst.isle line 1744.
2267     let expr0_0: Type = I8X16;
2268     let expr1_0 = SseOpcode::Pmaxsb;
2269     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2270     return Some(expr2_0);
2271 }
2272 
2273 // Generated as internal constructor for term pmaxsw.
2274 pub fn constructor_pmaxsw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
2275     let pattern0_0 = arg0;
2276     let pattern1_0 = arg1;
2277     // Rule at src/isa/x64/inst.isle line 1749.
2278     let expr0_0: Type = I8X16;
2279     let expr1_0 = SseOpcode::Pmaxsw;
2280     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
2281     return Some(expr2_0);
2282 }
2283 
2284 // Generated as internal constructor for term pmaxsd.
2285 pub fn constructor_pmaxsd<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 1754.
2289     let expr0_0: Type = I8X16;
2290     let expr1_0 = SseOpcode::Pmaxsd;
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 pminsb.
2296 pub fn constructor_pminsb<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 1759.
2300     let expr0_0: Type = I8X16;
2301     let expr1_0 = SseOpcode::Pminsb;
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 pminsw.
2307 pub fn constructor_pminsw<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 1764.
2311     let expr0_0: Type = I8X16;
2312     let expr1_0 = SseOpcode::Pminsw;
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 pminsd.
2318 pub fn constructor_pminsd<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 1769.
2322     let expr0_0: Type = I8X16;
2323     let expr1_0 = SseOpcode::Pminsd;
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 pmaxub.
2329 pub fn constructor_pmaxub<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 1774.
2333     let expr0_0: Type = I8X16;
2334     let expr1_0 = SseOpcode::Pmaxub;
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 pmaxuw.
2340 pub fn constructor_pmaxuw<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 1779.
2344     let expr0_0: Type = I8X16;
2345     let expr1_0 = SseOpcode::Pmaxuw;
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 pmaxud.
2351 pub fn constructor_pmaxud<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 1784.
2355     let expr0_0: Type = I8X16;
2356     let expr1_0 = SseOpcode::Pmaxud;
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 pminub.
2362 pub fn constructor_pminub<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 1789.
2366     let expr0_0: Type = I8X16;
2367     let expr1_0 = SseOpcode::Pminub;
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 pminuw.
2373 pub fn constructor_pminuw<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 1794.
2377     let expr0_0: Type = I8X16;
2378     let expr1_0 = SseOpcode::Pminuw;
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 pminud.
2384 pub fn constructor_pminud<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 1799.
2388     let expr0_0: Type = I8X16;
2389     let expr1_0 = SseOpcode::Pminud;
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 punpcklbw.
2395 pub fn constructor_punpcklbw<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 1804.
2399     let expr0_0: Type = I8X16;
2400     let expr1_0 = SseOpcode::Punpcklbw;
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 punpckhbw.
2406 pub fn constructor_punpckhbw<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 1809.
2410     let expr0_0: Type = I8X16;
2411     let expr1_0 = SseOpcode::Punpckhbw;
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 packsswb.
2417 pub fn constructor_packsswb<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 1814.
2421     let expr0_0: Type = I8X16;
2422     let expr1_0 = SseOpcode::Packsswb;
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 xmm_rm_r_imm.
2428 pub fn constructor_xmm_rm_r_imm<C: Context>(
2429     ctx: &mut C,
2430     arg0: &SseOpcode,
2431     arg1: Reg,
2432     arg2: &RegMem,
2433     arg3: u8,
2434     arg4: &OperandSize,
2435 ) -> Option<Xmm> {
2436     let pattern0_0 = arg0;
2437     let pattern1_0 = arg1;
2438     let pattern2_0 = arg2;
2439     let pattern3_0 = arg3;
2440     let pattern4_0 = arg4;
2441     // Rule at src/isa/x64/inst.isle line 1819.
2442     let expr0_0 = C::temp_writable_xmm(ctx);
2443     let expr1_0 = C::writable_xmm_to_reg(ctx, expr0_0);
2444     let expr2_0 = MInst::XmmRmRImm {
2445         op: pattern0_0.clone(),
2446         src1: pattern1_0,
2447         src2: pattern2_0.clone(),
2448         dst: expr1_0,
2449         imm: pattern3_0,
2450         size: pattern4_0.clone(),
2451     };
2452     let expr3_0 = C::emit(ctx, &expr2_0);
2453     let expr4_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
2454     return Some(expr4_0);
2455 }
2456 
2457 // Generated as internal constructor for term palignr.
2458 pub fn constructor_palignr<C: Context>(
2459     ctx: &mut C,
2460     arg0: Xmm,
2461     arg1: &XmmMem,
2462     arg2: u8,
2463     arg3: &OperandSize,
2464 ) -> Option<Xmm> {
2465     let pattern0_0 = arg0;
2466     let pattern1_0 = arg1;
2467     let pattern2_0 = arg2;
2468     let pattern3_0 = arg3;
2469     // Rule at src/isa/x64/inst.isle line 1831.
2470     let expr0_0 = SseOpcode::Palignr;
2471     let expr1_0 = C::xmm_to_reg(ctx, pattern0_0);
2472     let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0);
2473     let expr3_0 =
2474         constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, pattern3_0)?;
2475     return Some(expr3_0);
2476 }
2477 
2478 // Generated as internal constructor for term cmpps.
2479 pub fn constructor_cmpps<C: Context>(
2480     ctx: &mut C,
2481     arg0: Xmm,
2482     arg1: &XmmMem,
2483     arg2: &FcmpImm,
2484 ) -> Option<Xmm> {
2485     let pattern0_0 = arg0;
2486     let pattern1_0 = arg1;
2487     let pattern2_0 = arg2;
2488     // Rule at src/isa/x64/inst.isle line 1840.
2489     let expr0_0 = SseOpcode::Cmpps;
2490     let expr1_0 = C::xmm_to_reg(ctx, pattern0_0);
2491     let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0);
2492     let expr3_0 = C::encode_fcmp_imm(ctx, pattern2_0);
2493     let expr4_0 = OperandSize::Size32;
2494     let expr5_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, expr3_0, &expr4_0)?;
2495     return Some(expr5_0);
2496 }
2497 
2498 // Generated as internal constructor for term pinsrb.
2499 pub fn constructor_pinsrb<C: Context>(
2500     ctx: &mut C,
2501     arg0: Xmm,
2502     arg1: &GprMem,
2503     arg2: u8,
2504 ) -> Option<Xmm> {
2505     let pattern0_0 = arg0;
2506     let pattern1_0 = arg1;
2507     let pattern2_0 = arg2;
2508     // Rule at src/isa/x64/inst.isle line 1849.
2509     let expr0_0 = SseOpcode::Pinsrb;
2510     let expr1_0 = C::xmm_to_reg(ctx, pattern0_0);
2511     let expr2_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0);
2512     let expr3_0 = OperandSize::Size32;
2513     let expr4_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, &expr3_0)?;
2514     return Some(expr4_0);
2515 }
2516 
2517 // Generated as internal constructor for term pinsrw.
2518 pub fn constructor_pinsrw<C: Context>(
2519     ctx: &mut C,
2520     arg0: Xmm,
2521     arg1: &GprMem,
2522     arg2: u8,
2523 ) -> Option<Xmm> {
2524     let pattern0_0 = arg0;
2525     let pattern1_0 = arg1;
2526     let pattern2_0 = arg2;
2527     // Rule at src/isa/x64/inst.isle line 1858.
2528     let expr0_0 = SseOpcode::Pinsrw;
2529     let expr1_0 = C::xmm_to_reg(ctx, pattern0_0);
2530     let expr2_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0);
2531     let expr3_0 = OperandSize::Size32;
2532     let expr4_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, &expr3_0)?;
2533     return Some(expr4_0);
2534 }
2535 
2536 // Generated as internal constructor for term pinsrd.
2537 pub fn constructor_pinsrd<C: Context>(
2538     ctx: &mut C,
2539     arg0: Xmm,
2540     arg1: &GprMem,
2541     arg2: u8,
2542     arg3: &OperandSize,
2543 ) -> Option<Xmm> {
2544     let pattern0_0 = arg0;
2545     let pattern1_0 = arg1;
2546     let pattern2_0 = arg2;
2547     let pattern3_0 = arg3;
2548     // Rule at src/isa/x64/inst.isle line 1867.
2549     let expr0_0 = SseOpcode::Pinsrd;
2550     let expr1_0 = C::xmm_to_reg(ctx, pattern0_0);
2551     let expr2_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0);
2552     let expr3_0 =
2553         constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, pattern3_0)?;
2554     return Some(expr3_0);
2555 }
2556 
2557 // Generated as internal constructor for term insertps.
2558 pub fn constructor_insertps<C: Context>(
2559     ctx: &mut C,
2560     arg0: Xmm,
2561     arg1: &XmmMem,
2562     arg2: u8,
2563 ) -> Option<Xmm> {
2564     let pattern0_0 = arg0;
2565     let pattern1_0 = arg1;
2566     let pattern2_0 = arg2;
2567     // Rule at src/isa/x64/inst.isle line 1876.
2568     let expr0_0 = SseOpcode::Insertps;
2569     let expr1_0 = C::xmm_to_reg(ctx, pattern0_0);
2570     let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0);
2571     let expr3_0 = OperandSize::Size32;
2572     let expr4_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, &expr3_0)?;
2573     return Some(expr4_0);
2574 }
2575 
2576 // Generated as internal constructor for term pshufd.
2577 pub fn constructor_pshufd<C: Context>(
2578     ctx: &mut C,
2579     arg0: &XmmMem,
2580     arg1: u8,
2581     arg2: &OperandSize,
2582 ) -> Option<Xmm> {
2583     let pattern0_0 = arg0;
2584     let pattern1_0 = arg1;
2585     let pattern2_0 = arg2;
2586     // Rule at src/isa/x64/inst.isle line 1885.
2587     let expr0_0 = C::temp_writable_xmm(ctx);
2588     let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
2589     let expr2_0 = SseOpcode::Pshufd;
2590     let expr3_0 = C::xmm_to_reg(ctx, expr1_0);
2591     let expr4_0 = C::xmm_mem_to_reg_mem(ctx, pattern0_0);
2592     let expr5_0 = C::writable_xmm_to_reg(ctx, expr0_0);
2593     let expr6_0 = MInst::XmmRmRImm {
2594         op: expr2_0,
2595         src1: expr3_0,
2596         src2: expr4_0,
2597         dst: expr5_0,
2598         imm: pattern1_0,
2599         size: pattern2_0.clone(),
2600     };
2601     let expr7_0 = C::emit(ctx, &expr6_0);
2602     return Some(expr1_0);
2603 }
2604 
2605 // Generated as internal constructor for term xmm_unary_rm_r.
2606 pub fn constructor_xmm_unary_rm_r<C: Context>(
2607     ctx: &mut C,
2608     arg0: &SseOpcode,
2609     arg1: &XmmMem,
2610 ) -> Option<Xmm> {
2611     let pattern0_0 = arg0;
2612     let pattern1_0 = arg1;
2613     // Rule at src/isa/x64/inst.isle line 1898.
2614     let expr0_0 = C::temp_writable_xmm(ctx);
2615     let expr1_0 = MInst::XmmUnaryRmR {
2616         op: pattern0_0.clone(),
2617         src: pattern1_0.clone(),
2618         dst: expr0_0,
2619     };
2620     let expr2_0 = C::emit(ctx, &expr1_0);
2621     let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
2622     return Some(expr3_0);
2623 }
2624 
2625 // Generated as internal constructor for term pmovsxbw.
2626 pub fn constructor_pmovsxbw<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
2627     let pattern0_0 = arg0;
2628     // Rule at src/isa/x64/inst.isle line 1905.
2629     let expr0_0 = SseOpcode::Pmovsxbw;
2630     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
2631     return Some(expr1_0);
2632 }
2633 
2634 // Generated as internal constructor for term pmovzxbw.
2635 pub fn constructor_pmovzxbw<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
2636     let pattern0_0 = arg0;
2637     // Rule at src/isa/x64/inst.isle line 1910.
2638     let expr0_0 = SseOpcode::Pmovzxbw;
2639     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
2640     return Some(expr1_0);
2641 }
2642 
2643 // Generated as internal constructor for term pabsb.
2644 pub fn constructor_pabsb<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
2645     let pattern0_0 = arg0;
2646     // Rule at src/isa/x64/inst.isle line 1915.
2647     let expr0_0 = SseOpcode::Pabsb;
2648     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
2649     return Some(expr1_0);
2650 }
2651 
2652 // Generated as internal constructor for term pabsw.
2653 pub fn constructor_pabsw<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
2654     let pattern0_0 = arg0;
2655     // Rule at src/isa/x64/inst.isle line 1920.
2656     let expr0_0 = SseOpcode::Pabsw;
2657     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
2658     return Some(expr1_0);
2659 }
2660 
2661 // Generated as internal constructor for term pabsd.
2662 pub fn constructor_pabsd<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
2663     let pattern0_0 = arg0;
2664     // Rule at src/isa/x64/inst.isle line 1925.
2665     let expr0_0 = SseOpcode::Pabsd;
2666     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
2667     return Some(expr1_0);
2668 }
2669 
2670 // Generated as internal constructor for term xmm_unary_rm_r_evex.
2671 pub fn constructor_xmm_unary_rm_r_evex<C: Context>(
2672     ctx: &mut C,
2673     arg0: &Avx512Opcode,
2674     arg1: &XmmMem,
2675 ) -> Option<Xmm> {
2676     let pattern0_0 = arg0;
2677     let pattern1_0 = arg1;
2678     // Rule at src/isa/x64/inst.isle line 1930.
2679     let expr0_0 = C::temp_writable_xmm(ctx);
2680     let expr1_0 = MInst::XmmUnaryRmREvex {
2681         op: pattern0_0.clone(),
2682         src: pattern1_0.clone(),
2683         dst: expr0_0,
2684     };
2685     let expr2_0 = C::emit(ctx, &expr1_0);
2686     let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
2687     return Some(expr3_0);
2688 }
2689 
2690 // Generated as internal constructor for term vpabsq.
2691 pub fn constructor_vpabsq<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
2692     let pattern0_0 = arg0;
2693     // Rule at src/isa/x64/inst.isle line 1937.
2694     let expr0_0 = Avx512Opcode::Vpabsq;
2695     let expr1_0 = constructor_xmm_unary_rm_r_evex(ctx, &expr0_0, pattern0_0)?;
2696     return Some(expr1_0);
2697 }
2698 
2699 // Generated as internal constructor for term xmm_rm_r_evex.
2700 pub fn constructor_xmm_rm_r_evex<C: Context>(
2701     ctx: &mut C,
2702     arg0: &Avx512Opcode,
2703     arg1: &XmmMem,
2704     arg2: Xmm,
2705 ) -> Option<Xmm> {
2706     let pattern0_0 = arg0;
2707     let pattern1_0 = arg1;
2708     let pattern2_0 = arg2;
2709     // Rule at src/isa/x64/inst.isle line 1942.
2710     let expr0_0 = C::temp_writable_xmm(ctx);
2711     let expr1_0 = MInst::XmmRmREvex {
2712         op: pattern0_0.clone(),
2713         src1: pattern1_0.clone(),
2714         src2: pattern2_0,
2715         dst: expr0_0,
2716     };
2717     let expr2_0 = C::emit(ctx, &expr1_0);
2718     let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
2719     return Some(expr3_0);
2720 }
2721 
2722 // Generated as internal constructor for term vpmullq.
2723 pub fn constructor_vpmullq<C: Context>(ctx: &mut C, arg0: &XmmMem, arg1: Xmm) -> Option<Xmm> {
2724     let pattern0_0 = arg0;
2725     let pattern1_0 = arg1;
2726     // Rule at src/isa/x64/inst.isle line 1954.
2727     let expr0_0 = Avx512Opcode::Vpmullq;
2728     let expr1_0 = constructor_xmm_rm_r_evex(ctx, &expr0_0, pattern0_0, pattern1_0)?;
2729     return Some(expr1_0);
2730 }
2731 
2732 // Generated as internal constructor for term mul_hi.
2733 pub fn constructor_mul_hi<C: Context>(
2734     ctx: &mut C,
2735     arg0: Type,
2736     arg1: bool,
2737     arg2: Gpr,
2738     arg3: &GprMem,
2739 ) -> Option<ValueRegs> {
2740     let pattern0_0 = arg0;
2741     let pattern1_0 = arg1;
2742     let pattern2_0 = arg2;
2743     let pattern3_0 = arg3;
2744     // Rule at src/isa/x64/inst.isle line 1963.
2745     let expr0_0 = C::temp_writable_gpr(ctx);
2746     let expr1_0 = C::temp_writable_gpr(ctx);
2747     let expr2_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
2748     let expr3_0 = MInst::MulHi {
2749         size: expr2_0,
2750         signed: pattern1_0,
2751         src1: pattern2_0,
2752         src2: pattern3_0.clone(),
2753         dst_lo: expr0_0,
2754         dst_hi: expr1_0,
2755     };
2756     let expr4_0 = C::emit(ctx, &expr3_0);
2757     let expr5_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
2758     let expr6_0 = C::writable_gpr_to_gpr(ctx, expr1_0);
2759     let expr7_0 = constructor_value_gprs(ctx, expr5_0, expr6_0)?;
2760     return Some(expr7_0);
2761 }
2762 
2763 // Generated as internal constructor for term mulhi_u.
2764 pub fn constructor_mulhi_u<C: Context>(
2765     ctx: &mut C,
2766     arg0: Type,
2767     arg1: Gpr,
2768     arg2: &GprMem,
2769 ) -> Option<ValueRegs> {
2770     let pattern0_0 = arg0;
2771     let pattern1_0 = arg1;
2772     let pattern2_0 = arg2;
2773     // Rule at src/isa/x64/inst.isle line 1979.
2774     let expr0_0: bool = false;
2775     let expr1_0 = constructor_mul_hi(ctx, pattern0_0, expr0_0, pattern1_0, pattern2_0)?;
2776     return Some(expr1_0);
2777 }
2778 
2779 // Generated as internal constructor for term xmm_rmi_xmm.
2780 pub fn constructor_xmm_rmi_xmm<C: Context>(
2781     ctx: &mut C,
2782     arg0: &SseOpcode,
2783     arg1: Xmm,
2784     arg2: &XmmMemImm,
2785 ) -> Option<Xmm> {
2786     let pattern0_0 = arg0;
2787     let pattern1_0 = arg1;
2788     let pattern2_0 = arg2;
2789     // Rule at src/isa/x64/inst.isle line 1984.
2790     let expr0_0 = C::temp_writable_xmm(ctx);
2791     let expr1_0 = MInst::XmmRmiReg {
2792         opcode: pattern0_0.clone(),
2793         src1: pattern1_0,
2794         src2: pattern2_0.clone(),
2795         dst: expr0_0,
2796     };
2797     let expr2_0 = C::emit(ctx, &expr1_0);
2798     let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
2799     return Some(expr3_0);
2800 }
2801 
2802 // Generated as internal constructor for term psllw.
2803 pub fn constructor_psllw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
2804     let pattern0_0 = arg0;
2805     let pattern1_0 = arg1;
2806     // Rule at src/isa/x64/inst.isle line 1994.
2807     let expr0_0 = SseOpcode::Psllw;
2808     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
2809     return Some(expr1_0);
2810 }
2811 
2812 // Generated as internal constructor for term pslld.
2813 pub fn constructor_pslld<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
2814     let pattern0_0 = arg0;
2815     let pattern1_0 = arg1;
2816     // Rule at src/isa/x64/inst.isle line 1999.
2817     let expr0_0 = SseOpcode::Pslld;
2818     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
2819     return Some(expr1_0);
2820 }
2821 
2822 // Generated as internal constructor for term psllq.
2823 pub fn constructor_psllq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
2824     let pattern0_0 = arg0;
2825     let pattern1_0 = arg1;
2826     // Rule at src/isa/x64/inst.isle line 2004.
2827     let expr0_0 = SseOpcode::Psllq;
2828     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
2829     return Some(expr1_0);
2830 }
2831 
2832 // Generated as internal constructor for term psrlw.
2833 pub fn constructor_psrlw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
2834     let pattern0_0 = arg0;
2835     let pattern1_0 = arg1;
2836     // Rule at src/isa/x64/inst.isle line 2009.
2837     let expr0_0 = SseOpcode::Psrlw;
2838     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
2839     return Some(expr1_0);
2840 }
2841 
2842 // Generated as internal constructor for term psrld.
2843 pub fn constructor_psrld<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
2844     let pattern0_0 = arg0;
2845     let pattern1_0 = arg1;
2846     // Rule at src/isa/x64/inst.isle line 2014.
2847     let expr0_0 = SseOpcode::Psrld;
2848     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
2849     return Some(expr1_0);
2850 }
2851 
2852 // Generated as internal constructor for term psrlq.
2853 pub fn constructor_psrlq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
2854     let pattern0_0 = arg0;
2855     let pattern1_0 = arg1;
2856     // Rule at src/isa/x64/inst.isle line 2019.
2857     let expr0_0 = SseOpcode::Psrlq;
2858     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
2859     return Some(expr1_0);
2860 }
2861 
2862 // Generated as internal constructor for term psraw.
2863 pub fn constructor_psraw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
2864     let pattern0_0 = arg0;
2865     let pattern1_0 = arg1;
2866     // Rule at src/isa/x64/inst.isle line 2024.
2867     let expr0_0 = SseOpcode::Psraw;
2868     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
2869     return Some(expr1_0);
2870 }
2871 
2872 // Generated as internal constructor for term psrad.
2873 pub fn constructor_psrad<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
2874     let pattern0_0 = arg0;
2875     let pattern1_0 = arg1;
2876     // Rule at src/isa/x64/inst.isle line 2029.
2877     let expr0_0 = SseOpcode::Psrad;
2878     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
2879     return Some(expr1_0);
2880 }
2881 
2882 // Generated as internal constructor for term pextrd.
2883 pub fn constructor_pextrd<C: Context>(ctx: &mut C, arg0: Type, arg1: Xmm, arg2: u8) -> Option<Gpr> {
2884     let pattern0_0 = arg0;
2885     let pattern1_0 = arg1;
2886     let pattern2_0 = arg2;
2887     // Rule at src/isa/x64/inst.isle line 2034.
2888     let expr0_0 = C::temp_writable_gpr(ctx);
2889     let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
2890     let expr2_0 = SseOpcode::Pextrd;
2891     let expr3_0 = C::gpr_to_reg(ctx, expr1_0);
2892     let expr4_0 = C::xmm_to_reg(ctx, pattern1_0);
2893     let expr5_0 = RegMem::Reg { reg: expr4_0 };
2894     let expr6_0 = C::writable_gpr_to_reg(ctx, expr0_0);
2895     let expr7_0 = C::lane_type(ctx, pattern0_0);
2896     let expr8_0 = C::operand_size_of_type_32_64(ctx, expr7_0);
2897     let expr9_0 = MInst::XmmRmRImm {
2898         op: expr2_0,
2899         src1: expr3_0,
2900         src2: expr5_0,
2901         dst: expr6_0,
2902         imm: pattern2_0,
2903         size: expr8_0,
2904     };
2905     let expr10_0 = C::emit(ctx, &expr9_0);
2906     return Some(expr1_0);
2907 }
2908 
2909 // Generated as internal constructor for term cmppd.
2910 pub fn constructor_cmppd<C: Context>(
2911     ctx: &mut C,
2912     arg0: Xmm,
2913     arg1: &XmmMem,
2914     arg2: &FcmpImm,
2915 ) -> Option<Xmm> {
2916     let pattern0_0 = arg0;
2917     let pattern1_0 = arg1;
2918     let pattern2_0 = arg2;
2919     // Rule at src/isa/x64/inst.isle line 2051.
2920     let expr0_0 = SseOpcode::Cmppd;
2921     let expr1_0 = C::xmm_to_reg(ctx, pattern0_0);
2922     let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0);
2923     let expr3_0 = C::encode_fcmp_imm(ctx, pattern2_0);
2924     let expr4_0 = OperandSize::Size32;
2925     let expr5_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, expr3_0, &expr4_0)?;
2926     return Some(expr5_0);
2927 }
2928 
2929 // Generated as internal constructor for term gpr_to_xmm.
2930 pub fn constructor_gpr_to_xmm<C: Context>(
2931     ctx: &mut C,
2932     arg0: &SseOpcode,
2933     arg1: &GprMem,
2934     arg2: &OperandSize,
2935 ) -> Option<Xmm> {
2936     let pattern0_0 = arg0;
2937     let pattern1_0 = arg1;
2938     let pattern2_0 = arg2;
2939     // Rule at src/isa/x64/inst.isle line 2060.
2940     let expr0_0 = C::temp_writable_xmm(ctx);
2941     let expr1_0 = MInst::GprToXmm {
2942         op: pattern0_0.clone(),
2943         src: pattern1_0.clone(),
2944         dst: expr0_0,
2945         src_size: pattern2_0.clone(),
2946     };
2947     let expr2_0 = C::emit(ctx, &expr1_0);
2948     let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
2949     return Some(expr3_0);
2950 }
2951 
2952 // Generated as internal constructor for term not.
2953 pub fn constructor_not<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
2954     let pattern0_0 = arg0;
2955     let pattern1_0 = arg1;
2956     // Rule at src/isa/x64/inst.isle line 2067.
2957     let expr0_0 = C::temp_writable_gpr(ctx);
2958     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
2959     let expr2_0 = MInst::Not {
2960         size: expr1_0,
2961         src: pattern1_0,
2962         dst: expr0_0,
2963     };
2964     let expr3_0 = C::emit(ctx, &expr2_0);
2965     let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
2966     return Some(expr4_0);
2967 }
2968 
2969 // Generated as internal constructor for term neg.
2970 pub fn constructor_neg<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
2971     let pattern0_0 = arg0;
2972     let pattern1_0 = arg1;
2973     // Rule at src/isa/x64/inst.isle line 2075.
2974     let expr0_0 = C::temp_writable_gpr(ctx);
2975     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
2976     let expr2_0 = MInst::Neg {
2977         size: expr1_0,
2978         src: pattern1_0,
2979         dst: expr0_0,
2980     };
2981     let expr3_0 = C::emit(ctx, &expr2_0);
2982     let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
2983     return Some(expr4_0);
2984 }
2985 
2986 // Generated as internal constructor for term lea.
2987 pub fn constructor_lea<C: Context>(ctx: &mut C, arg0: &SyntheticAmode) -> Option<Gpr> {
2988     let pattern0_0 = arg0;
2989     // Rule at src/isa/x64/inst.isle line 2082.
2990     let expr0_0 = C::temp_writable_gpr(ctx);
2991     let expr1_0 = MInst::LoadEffectiveAddress {
2992         addr: pattern0_0.clone(),
2993         dst: expr0_0,
2994     };
2995     let expr2_0 = C::emit(ctx, &expr1_0);
2996     let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
2997     return Some(expr3_0);
2998 }
2999 
3000 // Generated as internal constructor for term ud2.
3001 pub fn constructor_ud2<C: Context>(ctx: &mut C, arg0: &TrapCode) -> Option<SideEffectNoResult> {
3002     let pattern0_0 = arg0;
3003     // Rule at src/isa/x64/inst.isle line 2089.
3004     let expr0_0 = MInst::Ud2 {
3005         trap_code: pattern0_0.clone(),
3006     };
3007     let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 };
3008     return Some(expr1_0);
3009 }
3010 
3011 // Generated as internal constructor for term lower.
3012 pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<ValueRegs> {
3013     let pattern0_0 = arg0;
3014     let pattern1_0 = C::inst_data(ctx, pattern0_0);
3015     match &pattern1_0 {
3016         &InstructionData::UnaryIeee32 {
3017             opcode: ref pattern2_0,
3018             imm: pattern2_1,
3019         } => {
3020             if let &Opcode::F32const = &pattern2_0 {
3021                 let pattern4_0 = C::u64_from_ieee32(ctx, pattern2_1);
3022                 // Rule at src/isa/x64/lower.isle line 46.
3023                 let expr0_0: Type = F32;
3024                 let expr1_0 = constructor_imm(ctx, expr0_0, pattern4_0)?;
3025                 let expr2_0 = C::value_reg(ctx, expr1_0);
3026                 return Some(expr2_0);
3027             }
3028         }
3029         &InstructionData::UnaryIeee64 {
3030             opcode: ref pattern2_0,
3031             imm: pattern2_1,
3032         } => {
3033             if let &Opcode::F64const = &pattern2_0 {
3034                 let pattern4_0 = C::u64_from_ieee64(ctx, pattern2_1);
3035                 // Rule at src/isa/x64/lower.isle line 51.
3036                 let expr0_0: Type = F64;
3037                 let expr1_0 = constructor_imm(ctx, expr0_0, pattern4_0)?;
3038                 let expr2_0 = C::value_reg(ctx, expr1_0);
3039                 return Some(expr2_0);
3040             }
3041         }
3042         &InstructionData::Trap {
3043             opcode: ref pattern2_0,
3044             code: ref pattern2_1,
3045         } => {
3046             match &pattern2_0 {
3047                 &Opcode::Trap => {
3048                     // Rule at src/isa/x64/lower.isle line 1532.
3049                     let expr0_0 = constructor_ud2(ctx, &pattern2_1)?;
3050                     let expr1_0 = constructor_safepoint(ctx, &expr0_0)?;
3051                     return Some(expr1_0);
3052                 }
3053                 &Opcode::ResumableTrap => {
3054                     // Rule at src/isa/x64/lower.isle line 1537.
3055                     let expr0_0 = constructor_ud2(ctx, &pattern2_1)?;
3056                     let expr1_0 = constructor_safepoint(ctx, &expr0_0)?;
3057                     return Some(expr1_0);
3058                 }
3059                 _ => {}
3060             }
3061         }
3062         &InstructionData::TernaryImm8 {
3063             opcode: ref pattern2_0,
3064             args: ref pattern2_1,
3065             imm: pattern2_2,
3066         } => {
3067             if let &Opcode::Insertlane = &pattern2_0 {
3068                 let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, &pattern2_1);
3069                 let pattern5_0 = C::value_type(ctx, pattern4_0);
3070                 let pattern6_0 = C::u8_from_uimm8(ctx, pattern2_2);
3071                 // Rule at src/isa/x64/lower.isle line 1399.
3072                 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
3073                 let expr1_0 = C::put_in_reg_mem(ctx, pattern4_1);
3074                 let expr2_0 =
3075                     constructor_vec_insert_lane(ctx, pattern5_0, expr0_0, &expr1_0, pattern6_0)?;
3076                 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
3077                 return Some(expr3_0);
3078             }
3079         }
3080         _ => {}
3081     }
3082     if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) {
3083         let pattern2_0 = C::value_type(ctx, pattern1_0);
3084         if pattern2_0 == B128 {
3085             let pattern4_0 = C::inst_data(ctx, pattern0_0);
3086             match &pattern4_0 {
3087                 &InstructionData::UnaryBool {
3088                     opcode: ref pattern5_0,
3089                     imm: pattern5_1,
3090                 } => {
3091                     if let &Opcode::Bconst = &pattern5_0 {
3092                         if pattern5_1 == true {
3093                             // Rule at src/isa/x64/lower.isle line 39.
3094                             let expr0_0: Type = B64;
3095                             let expr1_0: u64 = 1;
3096                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
3097                             let expr3_0: Type = B64;
3098                             let expr4_0: u64 = 0;
3099                             let expr5_0 = constructor_imm(ctx, expr3_0, expr4_0)?;
3100                             let expr6_0 = C::value_regs(ctx, expr2_0, expr5_0);
3101                             return Some(expr6_0);
3102                         }
3103                         if pattern5_1 == false {
3104                             // Rule at src/isa/x64/lower.isle line 34.
3105                             let expr0_0: Type = B64;
3106                             let expr1_0: u64 = 0;
3107                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
3108                             let expr3_0: Type = B64;
3109                             let expr4_0: u64 = 0;
3110                             let expr5_0 = constructor_imm(ctx, expr3_0, expr4_0)?;
3111                             let expr6_0 = C::value_regs(ctx, expr2_0, expr5_0);
3112                             return Some(expr6_0);
3113                         }
3114                     }
3115                 }
3116                 &InstructionData::Binary {
3117                     opcode: ref pattern5_0,
3118                     args: ref pattern5_1,
3119                 } => {
3120                     match &pattern5_0 {
3121                         &Opcode::Band => {
3122                             let (pattern7_0, pattern7_1) =
3123                                 C::unpack_value_array_2(ctx, &pattern5_1);
3124                             // Rule at src/isa/x64/lower.isle line 386.
3125                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
3126                             let expr1_0: usize = 0;
3127                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
3128                             let expr3_0: usize = 1;
3129                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
3130                             let expr5_0 = constructor_lo_gpr(ctx, pattern7_1)?;
3131                             let expr6_0: Type = I64;
3132                             let expr7_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
3133                             let expr8_0 = constructor_x64_and(ctx, expr6_0, expr2_0, &expr7_0)?;
3134                             let expr9_0 = constructor_value_gprs(ctx, expr8_0, expr4_0)?;
3135                             return Some(expr9_0);
3136                         }
3137                         &Opcode::Bor => {
3138                             let (pattern7_0, pattern7_1) =
3139                                 C::unpack_value_array_2(ctx, &pattern5_1);
3140                             // Rule at src/isa/x64/lower.isle line 462.
3141                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
3142                             let expr1_0: usize = 0;
3143                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
3144                             let expr3_0: usize = 1;
3145                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
3146                             let expr5_0 = constructor_lo_gpr(ctx, pattern7_1)?;
3147                             let expr6_0: Type = I64;
3148                             let expr7_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
3149                             let expr8_0 = constructor_or(ctx, expr6_0, expr2_0, &expr7_0)?;
3150                             let expr9_0 = constructor_value_gprs(ctx, expr8_0, expr4_0)?;
3151                             return Some(expr9_0);
3152                         }
3153                         &Opcode::Bxor => {
3154                             let (pattern7_0, pattern7_1) =
3155                                 C::unpack_value_array_2(ctx, &pattern5_1);
3156                             // Rule at src/isa/x64/lower.isle line 528.
3157                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
3158                             let expr1_0: usize = 0;
3159                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
3160                             let expr3_0: usize = 1;
3161                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
3162                             let expr5_0 = constructor_lo_gpr(ctx, pattern7_1)?;
3163                             let expr6_0: Type = I64;
3164                             let expr7_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
3165                             let expr8_0 = constructor_xor(ctx, expr6_0, expr2_0, &expr7_0)?;
3166                             let expr9_0 = constructor_value_gprs(ctx, expr8_0, expr4_0)?;
3167                             return Some(expr9_0);
3168                         }
3169                         _ => {}
3170                     }
3171                 }
3172                 &InstructionData::Unary {
3173                     opcode: ref pattern5_0,
3174                     arg: pattern5_1,
3175                 } => {
3176                     if let &Opcode::Bnot = &pattern5_0 {
3177                         // Rule at src/isa/x64/lower.isle line 1366.
3178                         let expr0_0 = constructor_i128_not(ctx, pattern5_1)?;
3179                         return Some(expr0_0);
3180                     }
3181                 }
3182                 _ => {}
3183             }
3184         }
3185         if pattern2_0 == I128 {
3186             let pattern4_0 = C::inst_data(ctx, pattern0_0);
3187             match &pattern4_0 {
3188                 &InstructionData::UnaryImm {
3189                     opcode: ref pattern5_0,
3190                     imm: pattern5_1,
3191                 } => {
3192                     if let &Opcode::Iconst = &pattern5_0 {
3193                         let pattern7_0 = C::u64_from_imm64(ctx, pattern5_1);
3194                         // Rule at src/isa/x64/lower.isle line 15.
3195                         let expr0_0: Type = I64;
3196                         let expr1_0 = constructor_imm(ctx, expr0_0, pattern7_0)?;
3197                         let expr2_0: Type = I64;
3198                         let expr3_0: u64 = 0;
3199                         let expr4_0 = constructor_imm(ctx, expr2_0, expr3_0)?;
3200                         let expr5_0 = C::value_regs(ctx, expr1_0, expr4_0);
3201                         return Some(expr5_0);
3202                     }
3203                 }
3204                 &InstructionData::Binary {
3205                     opcode: ref pattern5_0,
3206                     args: ref pattern5_1,
3207                 } => {
3208                     match &pattern5_0 {
3209                         &Opcode::Iadd => {
3210                             let (pattern7_0, pattern7_1) =
3211                                 C::unpack_value_array_2(ctx, &pattern5_1);
3212                             // Rule at src/isa/x64/lower.isle line 117.
3213                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
3214                             let expr1_0: usize = 0;
3215                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
3216                             let expr3_0: usize = 1;
3217                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
3218                             let expr5_0 = C::put_in_regs(ctx, pattern7_1);
3219                             let expr6_0: usize = 0;
3220                             let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?;
3221                             let expr8_0: usize = 1;
3222                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?;
3223                             let expr10_0: Type = I64;
3224                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
3225                             let expr12_0 =
3226                                 constructor_add_with_flags(ctx, expr10_0, expr2_0, &expr11_0)?;
3227                             let expr13_0: Type = I64;
3228                             let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
3229                             let expr15_0 = constructor_adc(ctx, expr13_0, expr4_0, &expr14_0)?;
3230                             let expr16_0 = constructor_with_flags(ctx, &expr12_0, &expr15_0)?;
3231                             return Some(expr16_0);
3232                         }
3233                         &Opcode::Isub => {
3234                             let (pattern7_0, pattern7_1) =
3235                                 C::unpack_value_array_2(ctx, &pattern5_1);
3236                             // Rule at src/isa/x64/lower.isle line 286.
3237                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
3238                             let expr1_0: usize = 0;
3239                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
3240                             let expr3_0: usize = 1;
3241                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
3242                             let expr5_0 = C::put_in_regs(ctx, pattern7_1);
3243                             let expr6_0: usize = 0;
3244                             let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?;
3245                             let expr8_0: usize = 1;
3246                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?;
3247                             let expr10_0: Type = I64;
3248                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
3249                             let expr12_0 =
3250                                 constructor_sub_with_flags(ctx, expr10_0, expr2_0, &expr11_0)?;
3251                             let expr13_0: Type = I64;
3252                             let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
3253                             let expr15_0 = constructor_sbb(ctx, expr13_0, expr4_0, &expr14_0)?;
3254                             let expr16_0 = constructor_with_flags(ctx, &expr12_0, &expr15_0)?;
3255                             return Some(expr16_0);
3256                         }
3257                         &Opcode::Imul => {
3258                             let (pattern7_0, pattern7_1) =
3259                                 C::unpack_value_array_2(ctx, &pattern5_1);
3260                             // Rule at src/isa/x64/lower.isle line 1052.
3261                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
3262                             let expr1_0: usize = 0;
3263                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
3264                             let expr3_0: usize = 1;
3265                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
3266                             let expr5_0 = C::put_in_regs(ctx, pattern7_1);
3267                             let expr6_0: usize = 0;
3268                             let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?;
3269                             let expr8_0: usize = 1;
3270                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?;
3271                             let expr10_0: Type = I64;
3272                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
3273                             let expr12_0 = constructor_mul(ctx, expr10_0, expr2_0, &expr11_0)?;
3274                             let expr13_0: Type = I64;
3275                             let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
3276                             let expr15_0 = constructor_mul(ctx, expr13_0, expr4_0, &expr14_0)?;
3277                             let expr16_0: Type = I64;
3278                             let expr17_0 = C::gpr_to_gpr_mem_imm(ctx, expr15_0);
3279                             let expr18_0 = constructor_add(ctx, expr16_0, expr12_0, &expr17_0)?;
3280                             let expr19_0: Type = I64;
3281                             let expr20_0 = C::gpr_to_gpr_mem(ctx, expr7_0);
3282                             let expr21_0 = constructor_mulhi_u(ctx, expr19_0, expr2_0, &expr20_0)?;
3283                             let expr22_0: usize = 0;
3284                             let expr23_0 = constructor_value_regs_get_gpr(ctx, expr21_0, expr22_0)?;
3285                             let expr24_0: usize = 1;
3286                             let expr25_0 = constructor_value_regs_get_gpr(ctx, expr21_0, expr24_0)?;
3287                             let expr26_0: Type = I64;
3288                             let expr27_0 = C::gpr_to_gpr_mem_imm(ctx, expr25_0);
3289                             let expr28_0 = constructor_add(ctx, expr26_0, expr18_0, &expr27_0)?;
3290                             let expr29_0 = constructor_value_gprs(ctx, expr23_0, expr28_0)?;
3291                             return Some(expr29_0);
3292                         }
3293                         &Opcode::Band => {
3294                             let (pattern7_0, pattern7_1) =
3295                                 C::unpack_value_array_2(ctx, &pattern5_1);
3296                             // Rule at src/isa/x64/lower.isle line 376.
3297                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
3298                             let expr1_0: usize = 0;
3299                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
3300                             let expr3_0: usize = 1;
3301                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
3302                             let expr5_0 = C::put_in_regs(ctx, pattern7_1);
3303                             let expr6_0: usize = 0;
3304                             let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?;
3305                             let expr8_0: usize = 1;
3306                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?;
3307                             let expr10_0: Type = I64;
3308                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
3309                             let expr12_0 = constructor_x64_and(ctx, expr10_0, expr2_0, &expr11_0)?;
3310                             let expr13_0: Type = I64;
3311                             let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
3312                             let expr15_0 = constructor_x64_and(ctx, expr13_0, expr4_0, &expr14_0)?;
3313                             let expr16_0 = constructor_value_gprs(ctx, expr12_0, expr15_0)?;
3314                             return Some(expr16_0);
3315                         }
3316                         &Opcode::Bor => {
3317                             let (pattern7_0, pattern7_1) =
3318                                 C::unpack_value_array_2(ctx, &pattern5_1);
3319                             // Rule at src/isa/x64/lower.isle line 459.
3320                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
3321                             let expr1_0 = C::put_in_regs(ctx, pattern7_1);
3322                             let expr2_0 = constructor_or_i128(ctx, expr0_0, expr1_0)?;
3323                             return Some(expr2_0);
3324                         }
3325                         &Opcode::Bxor => {
3326                             let (pattern7_0, pattern7_1) =
3327                                 C::unpack_value_array_2(ctx, &pattern5_1);
3328                             // Rule at src/isa/x64/lower.isle line 518.
3329                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
3330                             let expr1_0: usize = 0;
3331                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
3332                             let expr3_0: usize = 1;
3333                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
3334                             let expr5_0 = C::put_in_regs(ctx, pattern7_1);
3335                             let expr6_0: usize = 0;
3336                             let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?;
3337                             let expr8_0: usize = 1;
3338                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?;
3339                             let expr10_0: Type = I64;
3340                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
3341                             let expr12_0 = constructor_xor(ctx, expr10_0, expr2_0, &expr11_0)?;
3342                             let expr13_0: Type = I64;
3343                             let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
3344                             let expr15_0 = constructor_xor(ctx, expr13_0, expr4_0, &expr14_0)?;
3345                             let expr16_0 = constructor_value_gprs(ctx, expr12_0, expr15_0)?;
3346                             return Some(expr16_0);
3347                         }
3348                         &Opcode::Rotl => {
3349                             let (pattern7_0, pattern7_1) =
3350                                 C::unpack_value_array_2(ctx, &pattern5_1);
3351                             // Rule at src/isa/x64/lower.isle line 916.
3352                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
3353                             let expr1_0 = constructor_lo_gpr(ctx, pattern7_1)?;
3354                             let expr2_0 = constructor_shl_i128(ctx, expr0_0, expr1_0)?;
3355                             let expr3_0: Type = I64;
3356                             let expr4_0: Type = I64;
3357                             let expr5_0: u64 = 128;
3358                             let expr6_0 = constructor_imm(ctx, expr4_0, expr5_0)?;
3359                             let expr7_0 = C::gpr_new(ctx, expr6_0);
3360                             let expr8_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0);
3361                             let expr9_0 = constructor_sub(ctx, expr3_0, expr7_0, &expr8_0)?;
3362                             let expr10_0 = constructor_shr_i128(ctx, expr0_0, expr9_0)?;
3363                             let expr11_0 = constructor_or_i128(ctx, expr2_0, expr10_0)?;
3364                             return Some(expr11_0);
3365                         }
3366                         &Opcode::Rotr => {
3367                             let (pattern7_0, pattern7_1) =
3368                                 C::unpack_value_array_2(ctx, &pattern5_1);
3369                             // Rule at src/isa/x64/lower.isle line 958.
3370                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
3371                             let expr1_0 = constructor_lo_gpr(ctx, pattern7_1)?;
3372                             let expr2_0 = constructor_shr_i128(ctx, expr0_0, expr1_0)?;
3373                             let expr3_0: Type = I64;
3374                             let expr4_0: Type = I64;
3375                             let expr5_0: u64 = 128;
3376                             let expr6_0 = constructor_imm(ctx, expr4_0, expr5_0)?;
3377                             let expr7_0 = C::gpr_new(ctx, expr6_0);
3378                             let expr8_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0);
3379                             let expr9_0 = constructor_sub(ctx, expr3_0, expr7_0, &expr8_0)?;
3380                             let expr10_0 = constructor_shl_i128(ctx, expr0_0, expr9_0)?;
3381                             let expr11_0 = constructor_or_i128(ctx, expr2_0, expr10_0)?;
3382                             return Some(expr11_0);
3383                         }
3384                         &Opcode::Ishl => {
3385                             let (pattern7_0, pattern7_1) =
3386                                 C::unpack_value_array_2(ctx, &pattern5_1);
3387                             // Rule at src/isa/x64/lower.isle line 583.
3388                             let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?;
3389                             let expr1_0 = C::put_in_regs(ctx, pattern7_0);
3390                             let expr2_0 = constructor_shl_i128(ctx, expr1_0, expr0_0)?;
3391                             return Some(expr2_0);
3392                         }
3393                         &Opcode::Ushr => {
3394                             let (pattern7_0, pattern7_1) =
3395                                 C::unpack_value_array_2(ctx, &pattern5_1);
3396                             // Rule at src/isa/x64/lower.isle line 695.
3397                             let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?;
3398                             let expr1_0 = C::put_in_regs(ctx, pattern7_0);
3399                             let expr2_0 = constructor_shr_i128(ctx, expr1_0, expr0_0)?;
3400                             return Some(expr2_0);
3401                         }
3402                         &Opcode::Sshr => {
3403                             let (pattern7_0, pattern7_1) =
3404                                 C::unpack_value_array_2(ctx, &pattern5_1);
3405                             // Rule at src/isa/x64/lower.isle line 810.
3406                             let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?;
3407                             let expr1_0 = C::put_in_regs(ctx, pattern7_0);
3408                             let expr2_0 = constructor_sar_i128(ctx, expr1_0, expr0_0)?;
3409                             return Some(expr2_0);
3410                         }
3411                         _ => {}
3412                     }
3413                 }
3414                 &InstructionData::Unary {
3415                     opcode: ref pattern5_0,
3416                     arg: pattern5_1,
3417                 } => {
3418                     if let &Opcode::Bnot = &pattern5_0 {
3419                         // Rule at src/isa/x64/lower.isle line 1363.
3420                         let expr0_0 = constructor_i128_not(ctx, pattern5_1)?;
3421                         return Some(expr0_0);
3422                     }
3423                 }
3424                 &InstructionData::BinaryImm64 {
3425                     opcode: ref pattern5_0,
3426                     arg: pattern5_1,
3427                     imm: pattern5_2,
3428                 } => {
3429                     if let &Opcode::IaddImm = &pattern5_0 {
3430                         let pattern7_0 = C::u64_from_imm64(ctx, pattern5_2);
3431                         // Rule at src/isa/x64/lower.isle line 232.
3432                         let expr0_0 = C::put_in_regs(ctx, pattern5_1);
3433                         let expr1_0: usize = 0;
3434                         let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
3435                         let expr3_0: usize = 1;
3436                         let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
3437                         let expr5_0: Type = I64;
3438                         let expr6_0 = constructor_imm(ctx, expr5_0, pattern7_0)?;
3439                         let expr7_0 = C::gpr_new(ctx, expr6_0);
3440                         let expr8_0: Type = I64;
3441                         let expr9_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
3442                         let expr10_0 = constructor_add_with_flags(ctx, expr8_0, expr2_0, &expr9_0)?;
3443                         let expr11_0: Type = I64;
3444                         let expr12_0: u32 = 0;
3445                         let expr13_0 = RegMemImm::Imm { simm32: expr12_0 };
3446                         let expr14_0 = C::gpr_mem_imm_new(ctx, &expr13_0);
3447                         let expr15_0 = constructor_adc(ctx, expr11_0, expr4_0, &expr14_0)?;
3448                         let expr16_0 = constructor_with_flags(ctx, &expr10_0, &expr15_0)?;
3449                         return Some(expr16_0);
3450                     }
3451                 }
3452                 _ => {}
3453             }
3454         }
3455         if pattern2_0 == I8X16 {
3456             let pattern4_0 = C::inst_data(ctx, pattern0_0);
3457             match &pattern4_0 {
3458                 &InstructionData::Binary {
3459                     opcode: ref pattern5_0,
3460                     args: ref pattern5_1,
3461                 } => {
3462                     match &pattern5_0 {
3463                         &Opcode::Imin => {
3464                             let (pattern7_0, pattern7_1) =
3465                                 C::unpack_value_array_2(ctx, &pattern5_1);
3466                             // Rule at src/isa/x64/lower.isle line 1499.
3467                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3468                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
3469                             let expr2_0 = constructor_pminsb(ctx, expr0_0, &expr1_0)?;
3470                             let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
3471                             return Some(expr3_0);
3472                         }
3473                         &Opcode::Umin => {
3474                             let (pattern7_0, pattern7_1) =
3475                                 C::unpack_value_array_2(ctx, &pattern5_1);
3476                             // Rule at src/isa/x64/lower.isle line 1521.
3477                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3478                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
3479                             let expr2_0 = constructor_pminub(ctx, expr0_0, &expr1_0)?;
3480                             let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
3481                             return Some(expr3_0);
3482                         }
3483                         &Opcode::Imax => {
3484                             let (pattern7_0, pattern7_1) =
3485                                 C::unpack_value_array_2(ctx, &pattern5_1);
3486                             // Rule at src/isa/x64/lower.isle line 1488.
3487                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3488                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
3489                             let expr2_0 = constructor_pmaxsb(ctx, expr0_0, &expr1_0)?;
3490                             let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
3491                             return Some(expr3_0);
3492                         }
3493                         &Opcode::Umax => {
3494                             let (pattern7_0, pattern7_1) =
3495                                 C::unpack_value_array_2(ctx, &pattern5_1);
3496                             // Rule at src/isa/x64/lower.isle line 1510.
3497                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3498                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
3499                             let expr2_0 = constructor_pmaxub(ctx, expr0_0, &expr1_0)?;
3500                             let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
3501                             return Some(expr3_0);
3502                         }
3503                         &Opcode::Ishl => {
3504                             let (pattern7_0, pattern7_1) =
3505                                 C::unpack_value_array_2(ctx, &pattern5_1);
3506                             // Rule at src/isa/x64/lower.isle line 595.
3507                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3508                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
3509                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
3510                             let expr3_0 = constructor_psllw(ctx, expr0_0, &expr2_0)?;
3511                             let expr4_0 = constructor_ishl_i8x16_mask(ctx, &expr1_0)?;
3512                             let expr5_0: Type = I8X16;
3513                             let expr6_0 = ExtKind::None;
3514                             let expr7_0 = constructor_x64_load(ctx, expr5_0, &expr4_0, &expr6_0)?;
3515                             let expr8_0: Type = I8X16;
3516                             let expr9_0 = RegMem::Reg { reg: expr7_0 };
3517                             let expr10_0 = C::reg_mem_to_xmm_mem(ctx, &expr9_0);
3518                             let expr11_0 = constructor_sse_and(ctx, expr8_0, expr3_0, &expr10_0)?;
3519                             let expr12_0 = constructor_value_xmm(ctx, expr11_0)?;
3520                             return Some(expr12_0);
3521                         }
3522                         &Opcode::Ushr => {
3523                             let (pattern7_0, pattern7_1) =
3524                                 C::unpack_value_array_2(ctx, &pattern5_1);
3525                             // Rule at src/isa/x64/lower.isle line 705.
3526                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3527                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
3528                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
3529                             let expr3_0 = constructor_psrlw(ctx, expr0_0, &expr2_0)?;
3530                             let expr4_0 = constructor_ushr_i8x16_mask(ctx, &expr1_0)?;
3531                             let expr5_0: Type = I8X16;
3532                             let expr6_0 = ExtKind::None;
3533                             let expr7_0 = constructor_x64_load(ctx, expr5_0, &expr4_0, &expr6_0)?;
3534                             let expr8_0: Type = I8X16;
3535                             let expr9_0 = RegMem::Reg { reg: expr7_0 };
3536                             let expr10_0 = C::reg_mem_to_xmm_mem(ctx, &expr9_0);
3537                             let expr11_0 = constructor_sse_and(ctx, expr8_0, expr3_0, &expr10_0)?;
3538                             let expr12_0 = constructor_value_xmm(ctx, expr11_0)?;
3539                             return Some(expr12_0);
3540                         }
3541                         &Opcode::Sshr => {
3542                             let (pattern7_0, pattern7_1) =
3543                                 C::unpack_value_array_2(ctx, &pattern5_1);
3544                             let pattern8_0 = C::value_type(ctx, pattern7_1);
3545                             // Rule at src/isa/x64/lower.isle line 831.
3546                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3547                             let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
3548                             let expr2_0 = constructor_punpcklbw(ctx, expr0_0, &expr1_0)?;
3549                             let expr3_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
3550                             let expr4_0 = constructor_punpckhbw(ctx, expr0_0, &expr3_0)?;
3551                             let expr5_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
3552                             let expr6_0 =
3553                                 constructor_sshr_i8x16_bigger_shift(ctx, pattern8_0, &expr5_0)?;
3554                             let expr7_0 = constructor_psraw(ctx, expr2_0, &expr6_0)?;
3555                             let expr8_0 = constructor_psraw(ctx, expr4_0, &expr6_0)?;
3556                             let expr9_0 = C::xmm_to_xmm_mem(ctx, expr8_0);
3557                             let expr10_0 = constructor_packsswb(ctx, expr7_0, &expr9_0)?;
3558                             let expr11_0 = constructor_value_xmm(ctx, expr10_0)?;
3559                             return Some(expr11_0);
3560                         }
3561                         _ => {}
3562                     }
3563                 }
3564                 &InstructionData::Unary {
3565                     opcode: ref pattern5_0,
3566                     arg: pattern5_1,
3567                 } => {
3568                     match &pattern5_0 {
3569                         &Opcode::Ineg => {
3570                             // Rule at src/isa/x64/lower.isle line 977.
3571                             let expr0_0: Type = I8X16;
3572                             let expr1_0: u64 = 0;
3573                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
3574                             let expr3_0 = C::xmm_new(ctx, expr2_0);
3575                             let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
3576                             let expr5_0 = constructor_psubb(ctx, expr3_0, &expr4_0)?;
3577                             let expr6_0 = constructor_value_xmm(ctx, expr5_0)?;
3578                             return Some(expr6_0);
3579                         }
3580                         &Opcode::Iabs => {
3581                             // Rule at src/isa/x64/lower.isle line 1307.
3582                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
3583                             let expr1_0 = constructor_pabsb(ctx, &expr0_0)?;
3584                             let expr2_0 = constructor_value_xmm(ctx, expr1_0)?;
3585                             return Some(expr2_0);
3586                         }
3587                         _ => {}
3588                     }
3589                 }
3590                 _ => {}
3591             }
3592         }
3593         if pattern2_0 == I16X8 {
3594             let pattern4_0 = C::inst_data(ctx, pattern0_0);
3595             match &pattern4_0 {
3596                 &InstructionData::Binary {
3597                     opcode: ref pattern5_0,
3598                     args: ref pattern5_1,
3599                 } => {
3600                     match &pattern5_0 {
3601                         &Opcode::Imin => {
3602                             let (pattern7_0, pattern7_1) =
3603                                 C::unpack_value_array_2(ctx, &pattern5_1);
3604                             // Rule at src/isa/x64/lower.isle line 1502.
3605                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3606                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
3607                             let expr2_0 = constructor_pminsw(ctx, expr0_0, &expr1_0)?;
3608                             let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
3609                             return Some(expr3_0);
3610                         }
3611                         &Opcode::Umin => {
3612                             let (pattern7_0, pattern7_1) =
3613                                 C::unpack_value_array_2(ctx, &pattern5_1);
3614                             // Rule at src/isa/x64/lower.isle line 1524.
3615                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3616                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
3617                             let expr2_0 = constructor_pminuw(ctx, expr0_0, &expr1_0)?;
3618                             let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
3619                             return Some(expr3_0);
3620                         }
3621                         &Opcode::Imax => {
3622                             let (pattern7_0, pattern7_1) =
3623                                 C::unpack_value_array_2(ctx, &pattern5_1);
3624                             // Rule at src/isa/x64/lower.isle line 1491.
3625                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3626                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
3627                             let expr2_0 = constructor_pmaxsw(ctx, expr0_0, &expr1_0)?;
3628                             let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
3629                             return Some(expr3_0);
3630                         }
3631                         &Opcode::Umax => {
3632                             let (pattern7_0, pattern7_1) =
3633                                 C::unpack_value_array_2(ctx, &pattern5_1);
3634                             // Rule at src/isa/x64/lower.isle line 1513.
3635                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3636                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
3637                             let expr2_0 = constructor_pmaxuw(ctx, expr0_0, &expr1_0)?;
3638                             let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
3639                             return Some(expr3_0);
3640                         }
3641                         &Opcode::Ishl => {
3642                             let (pattern7_0, pattern7_1) =
3643                                 C::unpack_value_array_2(ctx, &pattern5_1);
3644                             // Rule at src/isa/x64/lower.isle line 639.
3645                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3646                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
3647                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
3648                             let expr3_0 = constructor_psllw(ctx, expr0_0, &expr2_0)?;
3649                             let expr4_0 = constructor_value_xmm(ctx, expr3_0)?;
3650                             return Some(expr4_0);
3651                         }
3652                         &Opcode::Ushr => {
3653                             let (pattern7_0, pattern7_1) =
3654                                 C::unpack_value_array_2(ctx, &pattern5_1);
3655                             // Rule at src/isa/x64/lower.isle line 751.
3656                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3657                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
3658                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
3659                             let expr3_0 = constructor_psrlw(ctx, expr0_0, &expr2_0)?;
3660                             let expr4_0 = constructor_value_xmm(ctx, expr3_0)?;
3661                             return Some(expr4_0);
3662                         }
3663                         &Opcode::Sshr => {
3664                             let (pattern7_0, pattern7_1) =
3665                                 C::unpack_value_array_2(ctx, &pattern5_1);
3666                             // Rule at src/isa/x64/lower.isle line 858.
3667                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3668                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
3669                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
3670                             let expr3_0 = constructor_psraw(ctx, expr0_0, &expr2_0)?;
3671                             let expr4_0 = constructor_value_xmm(ctx, expr3_0)?;
3672                             return Some(expr4_0);
3673                         }
3674                         _ => {}
3675                     }
3676                 }
3677                 &InstructionData::Unary {
3678                     opcode: ref pattern5_0,
3679                     arg: pattern5_1,
3680                 } => {
3681                     match &pattern5_0 {
3682                         &Opcode::Ineg => {
3683                             // Rule at src/isa/x64/lower.isle line 981.
3684                             let expr0_0: Type = I16X8;
3685                             let expr1_0: u64 = 0;
3686                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
3687                             let expr3_0 = C::xmm_new(ctx, expr2_0);
3688                             let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
3689                             let expr5_0 = constructor_psubw(ctx, expr3_0, &expr4_0)?;
3690                             let expr6_0 = constructor_value_xmm(ctx, expr5_0)?;
3691                             return Some(expr6_0);
3692                         }
3693                         &Opcode::Iabs => {
3694                             // Rule at src/isa/x64/lower.isle line 1310.
3695                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
3696                             let expr1_0 = constructor_pabsw(ctx, &expr0_0)?;
3697                             let expr2_0 = constructor_value_xmm(ctx, expr1_0)?;
3698                             return Some(expr2_0);
3699                         }
3700                         _ => {}
3701                     }
3702                 }
3703                 _ => {}
3704             }
3705         }
3706         if pattern2_0 == I32X4 {
3707             let pattern4_0 = C::inst_data(ctx, pattern0_0);
3708             match &pattern4_0 {
3709                 &InstructionData::Binary {
3710                     opcode: ref pattern5_0,
3711                     args: ref pattern5_1,
3712                 } => {
3713                     match &pattern5_0 {
3714                         &Opcode::Imin => {
3715                             let (pattern7_0, pattern7_1) =
3716                                 C::unpack_value_array_2(ctx, &pattern5_1);
3717                             // Rule at src/isa/x64/lower.isle line 1505.
3718                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3719                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
3720                             let expr2_0 = constructor_pminsd(ctx, expr0_0, &expr1_0)?;
3721                             let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
3722                             return Some(expr3_0);
3723                         }
3724                         &Opcode::Umin => {
3725                             let (pattern7_0, pattern7_1) =
3726                                 C::unpack_value_array_2(ctx, &pattern5_1);
3727                             // Rule at src/isa/x64/lower.isle line 1527.
3728                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3729                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
3730                             let expr2_0 = constructor_pminud(ctx, expr0_0, &expr1_0)?;
3731                             let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
3732                             return Some(expr3_0);
3733                         }
3734                         &Opcode::Imax => {
3735                             let (pattern7_0, pattern7_1) =
3736                                 C::unpack_value_array_2(ctx, &pattern5_1);
3737                             // Rule at src/isa/x64/lower.isle line 1494.
3738                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3739                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
3740                             let expr2_0 = constructor_pmaxsd(ctx, expr0_0, &expr1_0)?;
3741                             let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
3742                             return Some(expr3_0);
3743                         }
3744                         &Opcode::Umax => {
3745                             let (pattern7_0, pattern7_1) =
3746                                 C::unpack_value_array_2(ctx, &pattern5_1);
3747                             // Rule at src/isa/x64/lower.isle line 1516.
3748                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3749                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
3750                             let expr2_0 = constructor_pmaxud(ctx, expr0_0, &expr1_0)?;
3751                             let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
3752                             return Some(expr3_0);
3753                         }
3754                         &Opcode::Ishl => {
3755                             let (pattern7_0, pattern7_1) =
3756                                 C::unpack_value_array_2(ctx, &pattern5_1);
3757                             // Rule at src/isa/x64/lower.isle line 643.
3758                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3759                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
3760                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
3761                             let expr3_0 = constructor_pslld(ctx, expr0_0, &expr2_0)?;
3762                             let expr4_0 = constructor_value_xmm(ctx, expr3_0)?;
3763                             return Some(expr4_0);
3764                         }
3765                         &Opcode::Ushr => {
3766                             let (pattern7_0, pattern7_1) =
3767                                 C::unpack_value_array_2(ctx, &pattern5_1);
3768                             // Rule at src/isa/x64/lower.isle line 755.
3769                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3770                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
3771                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
3772                             let expr3_0 = constructor_psrld(ctx, expr0_0, &expr2_0)?;
3773                             let expr4_0 = constructor_value_xmm(ctx, expr3_0)?;
3774                             return Some(expr4_0);
3775                         }
3776                         &Opcode::Sshr => {
3777                             let (pattern7_0, pattern7_1) =
3778                                 C::unpack_value_array_2(ctx, &pattern5_1);
3779                             // Rule at src/isa/x64/lower.isle line 862.
3780                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3781                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
3782                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
3783                             let expr3_0 = constructor_psrad(ctx, expr0_0, &expr2_0)?;
3784                             let expr4_0 = constructor_value_xmm(ctx, expr3_0)?;
3785                             return Some(expr4_0);
3786                         }
3787                         _ => {}
3788                     }
3789                 }
3790                 &InstructionData::Unary {
3791                     opcode: ref pattern5_0,
3792                     arg: pattern5_1,
3793                 } => {
3794                     match &pattern5_0 {
3795                         &Opcode::Ineg => {
3796                             // Rule at src/isa/x64/lower.isle line 985.
3797                             let expr0_0: Type = I32X4;
3798                             let expr1_0: u64 = 0;
3799                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
3800                             let expr3_0 = C::xmm_new(ctx, expr2_0);
3801                             let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
3802                             let expr5_0 = constructor_psubd(ctx, expr3_0, &expr4_0)?;
3803                             let expr6_0 = constructor_value_xmm(ctx, expr5_0)?;
3804                             return Some(expr6_0);
3805                         }
3806                         &Opcode::Iabs => {
3807                             // Rule at src/isa/x64/lower.isle line 1313.
3808                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
3809                             let expr1_0 = constructor_pabsd(ctx, &expr0_0)?;
3810                             let expr2_0 = constructor_value_xmm(ctx, expr1_0)?;
3811                             return Some(expr2_0);
3812                         }
3813                         _ => {}
3814                     }
3815                 }
3816                 _ => {}
3817             }
3818         }
3819         if pattern2_0 == I64X2 {
3820             let pattern4_0 = C::inst_data(ctx, pattern0_0);
3821             match &pattern4_0 {
3822                 &InstructionData::Binary {
3823                     opcode: ref pattern5_0,
3824                     args: ref pattern5_1,
3825                 } => {
3826                     match &pattern5_0 {
3827                         &Opcode::Ishl => {
3828                             let (pattern7_0, pattern7_1) =
3829                                 C::unpack_value_array_2(ctx, &pattern5_1);
3830                             // Rule at src/isa/x64/lower.isle line 647.
3831                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3832                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
3833                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
3834                             let expr3_0 = constructor_psllq(ctx, expr0_0, &expr2_0)?;
3835                             let expr4_0 = constructor_value_xmm(ctx, expr3_0)?;
3836                             return Some(expr4_0);
3837                         }
3838                         &Opcode::Ushr => {
3839                             let (pattern7_0, pattern7_1) =
3840                                 C::unpack_value_array_2(ctx, &pattern5_1);
3841                             // Rule at src/isa/x64/lower.isle line 759.
3842                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3843                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
3844                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
3845                             let expr3_0 = constructor_psrlq(ctx, expr0_0, &expr2_0)?;
3846                             let expr4_0 = constructor_value_xmm(ctx, expr3_0)?;
3847                             return Some(expr4_0);
3848                         }
3849                         &Opcode::Sshr => {
3850                             let (pattern7_0, pattern7_1) =
3851                                 C::unpack_value_array_2(ctx, &pattern5_1);
3852                             // Rule at src/isa/x64/lower.isle line 874.
3853                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
3854                             let expr1_0: Type = I64;
3855                             let expr2_0: u8 = 0;
3856                             let expr3_0 = constructor_pextrd(ctx, expr1_0, expr0_0, expr2_0)?;
3857                             let expr4_0: Type = I64;
3858                             let expr5_0: u8 = 1;
3859                             let expr6_0 = constructor_pextrd(ctx, expr4_0, expr0_0, expr5_0)?;
3860                             let expr7_0: Type = I64;
3861                             let expr8_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, expr7_0);
3862                             let expr9_0: Type = I64;
3863                             let expr10_0 = constructor_sar(ctx, expr9_0, expr3_0, &expr8_0)?;
3864                             let expr11_0: Type = I64;
3865                             let expr12_0 = constructor_sar(ctx, expr11_0, expr6_0, &expr8_0)?;
3866                             let expr13_0 = C::gpr_to_gpr_mem(ctx, expr10_0);
3867                             let expr14_0 = C::gpr_to_gpr_mem(ctx, expr12_0);
3868                             let expr15_0 =
3869                                 constructor_make_i64x2_from_lanes(ctx, &expr13_0, &expr14_0)?;
3870                             let expr16_0 = constructor_value_xmm(ctx, expr15_0)?;
3871                             return Some(expr16_0);
3872                         }
3873                         _ => {}
3874                     }
3875                 }
3876                 &InstructionData::Unary {
3877                     opcode: ref pattern5_0,
3878                     arg: pattern5_1,
3879                 } => {
3880                     match &pattern5_0 {
3881                         &Opcode::Ineg => {
3882                             // Rule at src/isa/x64/lower.isle line 989.
3883                             let expr0_0: Type = I64X2;
3884                             let expr1_0: u64 = 0;
3885                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
3886                             let expr3_0 = C::xmm_new(ctx, expr2_0);
3887                             let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
3888                             let expr5_0 = constructor_psubq(ctx, expr3_0, &expr4_0)?;
3889                             let expr6_0 = constructor_value_xmm(ctx, expr5_0)?;
3890                             return Some(expr6_0);
3891                         }
3892                         &Opcode::Iabs => {
3893                             // Rule at src/isa/x64/lower.isle line 1327.
3894                             let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
3895                             let expr1_0: Type = I64X2;
3896                             let expr2_0: u64 = 0;
3897                             let expr3_0 = constructor_imm(ctx, expr1_0, expr2_0)?;
3898                             let expr4_0 = C::xmm_new(ctx, expr3_0);
3899                             let expr5_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
3900                             let expr6_0 = constructor_psubq(ctx, expr4_0, &expr5_0)?;
3901                             let expr7_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
3902                             let expr8_0 = constructor_blendvpd(ctx, expr6_0, &expr7_0, expr6_0)?;
3903                             let expr9_0 = constructor_value_xmm(ctx, expr8_0)?;
3904                             return Some(expr9_0);
3905                         }
3906                         _ => {}
3907                     }
3908                 }
3909                 _ => {}
3910             }
3911         }
3912         if pattern2_0 == F32X4 {
3913             let pattern4_0 = C::inst_data(ctx, pattern0_0);
3914             if let &InstructionData::Unary {
3915                 opcode: ref pattern5_0,
3916                 arg: pattern5_1,
3917             } = &pattern4_0
3918             {
3919                 if let &Opcode::Fabs = &pattern5_0 {
3920                     // Rule at src/isa/x64/lower.isle line 1335.
3921                     let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
3922                     let expr1_0: Type = F32X4;
3923                     let expr2_0 = constructor_vector_all_ones(ctx, expr1_0)?;
3924                     let expr3_0: u32 = 1;
3925                     let expr4_0 = RegMemImm::Imm { simm32: expr3_0 };
3926                     let expr5_0 = C::xmm_mem_imm_new(ctx, &expr4_0);
3927                     let expr6_0 = constructor_psrld(ctx, expr2_0, &expr5_0)?;
3928                     let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0);
3929                     let expr8_0 = constructor_andps(ctx, expr0_0, &expr7_0)?;
3930                     let expr9_0 = constructor_value_xmm(ctx, expr8_0)?;
3931                     return Some(expr9_0);
3932                 }
3933             }
3934         }
3935         if pattern2_0 == F64X2 {
3936             let pattern4_0 = C::inst_data(ctx, pattern0_0);
3937             if let &InstructionData::Unary {
3938                 opcode: ref pattern5_0,
3939                 arg: pattern5_1,
3940             } = &pattern4_0
3941             {
3942                 if let &Opcode::Fabs = &pattern5_0 {
3943                     // Rule at src/isa/x64/lower.isle line 1341.
3944                     let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
3945                     let expr1_0: Type = F64X2;
3946                     let expr2_0 = constructor_vector_all_ones(ctx, expr1_0)?;
3947                     let expr3_0: u32 = 1;
3948                     let expr4_0 = RegMemImm::Imm { simm32: expr3_0 };
3949                     let expr5_0 = C::xmm_mem_imm_new(ctx, &expr4_0);
3950                     let expr6_0 = constructor_psrlq(ctx, expr2_0, &expr5_0)?;
3951                     let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0);
3952                     let expr8_0 = constructor_andpd(ctx, expr0_0, &expr7_0)?;
3953                     let expr9_0 = constructor_value_xmm(ctx, expr8_0)?;
3954                     return Some(expr9_0);
3955                 }
3956             }
3957         }
3958         let pattern3_0 = C::inst_data(ctx, pattern0_0);
3959         match &pattern3_0 {
3960             &InstructionData::NullAry {
3961                 opcode: ref pattern4_0,
3962             } => {
3963                 if let &Opcode::Null = &pattern4_0 {
3964                     // Rule at src/isa/x64/lower.isle line 56.
3965                     let expr0_0: u64 = 0;
3966                     let expr1_0 = constructor_imm(ctx, pattern2_0, expr0_0)?;
3967                     let expr2_0 = C::value_reg(ctx, expr1_0);
3968                     return Some(expr2_0);
3969                 }
3970             }
3971             &InstructionData::Binary {
3972                 opcode: ref pattern4_0,
3973                 args: ref pattern4_1,
3974             } => {
3975                 if let &Opcode::BandNot = &pattern4_0 {
3976                     let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, &pattern4_1);
3977                     // Rule at src/isa/x64/lower.isle line 1300.
3978                     let expr0_0 = constructor_put_in_xmm(ctx, pattern6_1)?;
3979                     let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern6_0)?;
3980                     let expr2_0 = constructor_sse_and_not(ctx, pattern2_0, expr0_0, &expr1_0)?;
3981                     let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
3982                     return Some(expr3_0);
3983                 }
3984             }
3985             _ => {}
3986         }
3987         if let Some(()) = C::avx512vl_enabled(ctx, pattern2_0) {
3988             if let Some(()) = C::avx512dq_enabled(ctx, pattern2_0) {
3989                 if let Some((pattern5_0, pattern5_1)) = C::multi_lane(ctx, pattern2_0) {
3990                     if pattern5_0 == 64 {
3991                         if pattern5_1 == 2 {
3992                             let pattern8_0 = C::inst_data(ctx, pattern0_0);
3993                             if let &InstructionData::Binary {
3994                                 opcode: ref pattern9_0,
3995                                 args: ref pattern9_1,
3996                             } = &pattern8_0
3997                             {
3998                                 if let &Opcode::Imul = &pattern9_0 {
3999                                     let (pattern11_0, pattern11_1) =
4000                                         C::unpack_value_array_2(ctx, &pattern9_1);
4001                                     // Rule at src/isa/x64/lower.isle line 1087.
4002                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern11_0)?;
4003                                     let expr1_0 = constructor_put_in_xmm(ctx, pattern11_1)?;
4004                                     let expr2_0 = constructor_vpmullq(ctx, &expr0_0, expr1_0)?;
4005                                     let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
4006                                     return Some(expr3_0);
4007                                 }
4008                             }
4009                         }
4010                     }
4011                 }
4012             }
4013             if let Some(()) = C::avx512f_enabled(ctx, pattern2_0) {
4014                 if pattern2_0 == I64X2 {
4015                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
4016                     if let &InstructionData::Unary {
4017                         opcode: ref pattern7_0,
4018                         arg: pattern7_1,
4019                     } = &pattern6_0
4020                     {
4021                         if let &Opcode::Iabs = &pattern7_0 {
4022                             // Rule at src/isa/x64/lower.isle line 1317.
4023                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
4024                             let expr1_0 = constructor_vpabsq(ctx, &expr0_0)?;
4025                             let expr2_0 = constructor_value_xmm(ctx, expr1_0)?;
4026                             return Some(expr2_0);
4027                         }
4028                     }
4029                 }
4030             }
4031         }
4032         if let Some((pattern3_0, pattern3_1)) = C::multi_lane(ctx, pattern2_0) {
4033             if pattern3_0 == 8 {
4034                 if pattern3_1 == 16 {
4035                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
4036                     if let &InstructionData::Binary {
4037                         opcode: ref pattern7_0,
4038                         args: ref pattern7_1,
4039                     } = &pattern6_0
4040                     {
4041                         match &pattern7_0 {
4042                             &Opcode::AvgRound => {
4043                                 let (pattern9_0, pattern9_1) =
4044                                     C::unpack_value_array_2(ctx, &pattern7_1);
4045                                 // Rule at src/isa/x64/lower.isle line 995.
4046                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
4047                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
4048                                 let expr2_0 = constructor_pavgb(ctx, expr0_0, &expr1_0)?;
4049                                 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
4050                                 return Some(expr3_0);
4051                             }
4052                             &Opcode::UaddSat => {
4053                                 let (pattern9_0, pattern9_1) =
4054                                     C::unpack_value_array_2(ctx, &pattern7_1);
4055                                 // Rule at src/isa/x64/lower.isle line 144.
4056                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
4057                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
4058                                 let expr2_0 = constructor_paddusb(ctx, expr0_0, &expr1_0)?;
4059                                 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
4060                                 return Some(expr3_0);
4061                             }
4062                             &Opcode::SaddSat => {
4063                                 let (pattern9_0, pattern9_1) =
4064                                     C::unpack_value_array_2(ctx, &pattern7_1);
4065                                 // Rule at src/isa/x64/lower.isle line 132.
4066                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
4067                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
4068                                 let expr2_0 = constructor_paddsb(ctx, expr0_0, &expr1_0)?;
4069                                 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
4070                                 return Some(expr3_0);
4071                             }
4072                             &Opcode::UsubSat => {
4073                                 let (pattern9_0, pattern9_1) =
4074                                     C::unpack_value_array_2(ctx, &pattern7_1);
4075                                 // Rule at src/isa/x64/lower.isle line 313.
4076                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
4077                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
4078                                 let expr2_0 = constructor_psubusb(ctx, expr0_0, &expr1_0)?;
4079                                 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
4080                                 return Some(expr3_0);
4081                             }
4082                             &Opcode::SsubSat => {
4083                                 let (pattern9_0, pattern9_1) =
4084                                     C::unpack_value_array_2(ctx, &pattern7_1);
4085                                 // Rule at src/isa/x64/lower.isle line 301.
4086                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
4087                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
4088                                 let expr2_0 = constructor_psubsb(ctx, expr0_0, &expr1_0)?;
4089                                 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
4090                                 return Some(expr3_0);
4091                             }
4092                             &Opcode::Iadd => {
4093                                 let (pattern9_0, pattern9_1) =
4094                                     C::unpack_value_array_2(ctx, &pattern7_1);
4095                                 // Rule at src/isa/x64/lower.isle line 96.
4096                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
4097                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
4098                                 let expr2_0 = constructor_paddb(ctx, expr0_0, &expr1_0)?;
4099                                 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
4100                                 return Some(expr3_0);
4101                             }
4102                             &Opcode::Isub => {
4103                                 let (pattern9_0, pattern9_1) =
4104                                     C::unpack_value_array_2(ctx, &pattern7_1);
4105                                 // Rule at src/isa/x64/lower.isle line 265.
4106                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
4107                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
4108                                 let expr2_0 = constructor_psubb(ctx, expr0_0, &expr1_0)?;
4109                                 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
4110                                 return Some(expr3_0);
4111                             }
4112                             _ => {}
4113                         }
4114                     }
4115                 }
4116             }
4117             if pattern3_0 == 16 {
4118                 if pattern3_1 == 8 {
4119                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
4120                     if let &InstructionData::Binary {
4121                         opcode: ref pattern7_0,
4122                         args: ref pattern7_1,
4123                     } = &pattern6_0
4124                     {
4125                         match &pattern7_0 {
4126                             &Opcode::AvgRound => {
4127                                 let (pattern9_0, pattern9_1) =
4128                                     C::unpack_value_array_2(ctx, &pattern7_1);
4129                                 // Rule at src/isa/x64/lower.isle line 999.
4130                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
4131                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
4132                                 let expr2_0 = constructor_pavgw(ctx, expr0_0, &expr1_0)?;
4133                                 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
4134                                 return Some(expr3_0);
4135                             }
4136                             &Opcode::UaddSat => {
4137                                 let (pattern9_0, pattern9_1) =
4138                                     C::unpack_value_array_2(ctx, &pattern7_1);
4139                                 // Rule at src/isa/x64/lower.isle line 149.
4140                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
4141                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
4142                                 let expr2_0 = constructor_paddusw(ctx, expr0_0, &expr1_0)?;
4143                                 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
4144                                 return Some(expr3_0);
4145                             }
4146                             &Opcode::SaddSat => {
4147                                 let (pattern9_0, pattern9_1) =
4148                                     C::unpack_value_array_2(ctx, &pattern7_1);
4149                                 // Rule at src/isa/x64/lower.isle line 137.
4150                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
4151                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
4152                                 let expr2_0 = constructor_paddsw(ctx, expr0_0, &expr1_0)?;
4153                                 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
4154                                 return Some(expr3_0);
4155                             }
4156                             &Opcode::UsubSat => {
4157                                 let (pattern9_0, pattern9_1) =
4158                                     C::unpack_value_array_2(ctx, &pattern7_1);
4159                                 // Rule at src/isa/x64/lower.isle line 318.
4160                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
4161                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
4162                                 let expr2_0 = constructor_psubusw(ctx, expr0_0, &expr1_0)?;
4163                                 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
4164                                 return Some(expr3_0);
4165                             }
4166                             &Opcode::SsubSat => {
4167                                 let (pattern9_0, pattern9_1) =
4168                                     C::unpack_value_array_2(ctx, &pattern7_1);
4169                                 // Rule at src/isa/x64/lower.isle line 306.
4170                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
4171                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
4172                                 let expr2_0 = constructor_psubsw(ctx, expr0_0, &expr1_0)?;
4173                                 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
4174                                 return Some(expr3_0);
4175                             }
4176                             &Opcode::Iadd => {
4177                                 let (pattern9_0, pattern9_1) =
4178                                     C::unpack_value_array_2(ctx, &pattern7_1);
4179                                 // Rule at src/isa/x64/lower.isle line 101.
4180                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
4181                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
4182                                 let expr2_0 = constructor_paddw(ctx, expr0_0, &expr1_0)?;
4183                                 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
4184                                 return Some(expr3_0);
4185                             }
4186                             &Opcode::Isub => {
4187                                 let (pattern9_0, pattern9_1) =
4188                                     C::unpack_value_array_2(ctx, &pattern7_1);
4189                                 // Rule at src/isa/x64/lower.isle line 270.
4190                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
4191                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
4192                                 let expr2_0 = constructor_psubw(ctx, expr0_0, &expr1_0)?;
4193                                 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
4194                                 return Some(expr3_0);
4195                             }
4196                             &Opcode::Imul => {
4197                                 let (pattern9_0, pattern9_1) =
4198                                     C::unpack_value_array_2(ctx, &pattern7_1);
4199                                 if let Some(pattern10_0) = C::def_inst(ctx, pattern9_0) {
4200                                     let pattern11_0 = C::inst_data(ctx, pattern10_0);
4201                                     if let &InstructionData::Unary {
4202                                         opcode: ref pattern12_0,
4203                                         arg: pattern12_1,
4204                                     } = &pattern11_0
4205                                     {
4206                                         match &pattern12_0 {
4207                                             &Opcode::SwidenLow => {
4208                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
4209                                                 if let Some((pattern15_0, pattern15_1)) =
4210                                                     C::multi_lane(ctx, pattern14_0)
4211                                                 {
4212                                                     if pattern15_0 == 8 {
4213                                                         if pattern15_1 == 16 {
4214                                                             if let Some(pattern18_0) =
4215                                                                 C::def_inst(ctx, pattern9_1)
4216                                                             {
4217                                                                 let pattern19_0 =
4218                                                                     C::inst_data(ctx, pattern18_0);
4219                                                                 if let &InstructionData::Unary {
4220                                                                     opcode: ref pattern20_0,
4221                                                                     arg: pattern20_1,
4222                                                                 } = &pattern19_0
4223                                                                 {
4224                                                                     if let &Opcode::SwidenLow =
4225                                                                         &pattern20_0
4226                                                                     {
4227                                                                         let pattern22_0 =
4228                                                                             C::value_type(
4229                                                                                 ctx,
4230                                                                                 pattern20_1,
4231                                                                             );
4232                                                                         if let Some((
4233                                                                             pattern23_0,
4234                                                                             pattern23_1,
4235                                                                         )) = C::multi_lane(
4236                                                                             ctx,
4237                                                                             pattern22_0,
4238                                                                         ) {
4239                                                                             if pattern23_0 == 8 {
4240                                                                                 if pattern23_1 == 16
4241                                                                                 {
4242                                                                                     // Rule at src/isa/x64/lower.isle line 1175.
4243                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
4244                                                                                     let expr1_0 = constructor_pmovsxbw(ctx, &expr0_0)?;
4245                                                                                     let expr2_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
4246                                                                                     let expr3_0 = constructor_pmovsxbw(ctx, &expr2_0)?;
4247                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0);
4248                                                                                     let expr5_0 = constructor_pmullw(ctx, expr1_0, &expr4_0)?;
4249                                                                                     let expr6_0 = constructor_value_xmm(ctx, expr5_0)?;
4250                                                                                     return Some(
4251                                                                                         expr6_0,
4252                                                                                     );
4253                                                                                 }
4254                                                                             }
4255                                                                         }
4256                                                                     }
4257                                                                 }
4258                                                             }
4259                                                         }
4260                                                     }
4261                                                 }
4262                                             }
4263                                             &Opcode::SwidenHigh => {
4264                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
4265                                                 if let Some((pattern15_0, pattern15_1)) =
4266                                                     C::multi_lane(ctx, pattern14_0)
4267                                                 {
4268                                                     if pattern15_0 == 8 {
4269                                                         if pattern15_1 == 16 {
4270                                                             if let Some(pattern18_0) =
4271                                                                 C::def_inst(ctx, pattern9_1)
4272                                                             {
4273                                                                 let pattern19_0 =
4274                                                                     C::inst_data(ctx, pattern18_0);
4275                                                                 if let &InstructionData::Unary {
4276                                                                     opcode: ref pattern20_0,
4277                                                                     arg: pattern20_1,
4278                                                                 } = &pattern19_0
4279                                                                 {
4280                                                                     if let &Opcode::SwidenHigh =
4281                                                                         &pattern20_0
4282                                                                     {
4283                                                                         let pattern22_0 =
4284                                                                             C::value_type(
4285                                                                                 ctx,
4286                                                                                 pattern20_1,
4287                                                                             );
4288                                                                         if let Some((
4289                                                                             pattern23_0,
4290                                                                             pattern23_1,
4291                                                                         )) = C::multi_lane(
4292                                                                             ctx,
4293                                                                             pattern22_0,
4294                                                                         ) {
4295                                                                             if pattern23_0 == 8 {
4296                                                                                 if pattern23_1 == 16
4297                                                                                 {
4298                                                                                     // Rule at src/isa/x64/lower.isle line 1135.
4299                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
4300                                                                                     let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
4301                                                                                     let expr2_0: u8 = 8;
4302                                                                                     let expr3_0 = OperandSize::Size32;
4303                                                                                     let expr4_0 = constructor_palignr(ctx, expr0_0, &expr1_0, expr2_0, &expr3_0)?;
4304                                                                                     let expr5_0 = C::xmm_to_xmm_mem(ctx, expr4_0);
4305                                                                                     let expr6_0 = constructor_pmovsxbw(ctx, &expr5_0)?;
4306                                                                                     let expr7_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
4307                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
4308                                                                                     let expr9_0: u8 = 8;
4309                                                                                     let expr10_0 = OperandSize::Size32;
4310                                                                                     let expr11_0 = constructor_palignr(ctx, expr7_0, &expr8_0, expr9_0, &expr10_0)?;
4311                                                                                     let expr12_0 = C::xmm_to_xmm_mem(ctx, expr11_0);
4312                                                                                     let expr13_0 = constructor_pmovsxbw(ctx, &expr12_0)?;
4313                                                                                     let expr14_0 = C::xmm_to_xmm_mem(ctx, expr13_0);
4314                                                                                     let expr15_0 = constructor_pmullw(ctx, expr6_0, &expr14_0)?;
4315                                                                                     let expr16_0 = constructor_value_xmm(ctx, expr15_0)?;
4316                                                                                     return Some(
4317                                                                                         expr16_0,
4318                                                                                     );
4319                                                                                 }
4320                                                                             }
4321                                                                         }
4322                                                                     }
4323                                                                 }
4324                                                             }
4325                                                         }
4326                                                     }
4327                                                 }
4328                                             }
4329                                             &Opcode::UwidenLow => {
4330                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
4331                                                 if let Some((pattern15_0, pattern15_1)) =
4332                                                     C::multi_lane(ctx, pattern14_0)
4333                                                 {
4334                                                     if pattern15_0 == 8 {
4335                                                         if pattern15_1 == 16 {
4336                                                             if let Some(pattern18_0) =
4337                                                                 C::def_inst(ctx, pattern9_1)
4338                                                             {
4339                                                                 let pattern19_0 =
4340                                                                     C::inst_data(ctx, pattern18_0);
4341                                                                 if let &InstructionData::Unary {
4342                                                                     opcode: ref pattern20_0,
4343                                                                     arg: pattern20_1,
4344                                                                 } = &pattern19_0
4345                                                                 {
4346                                                                     if let &Opcode::UwidenLow =
4347                                                                         &pattern20_0
4348                                                                     {
4349                                                                         let pattern22_0 =
4350                                                                             C::value_type(
4351                                                                                 ctx,
4352                                                                                 pattern20_1,
4353                                                                             );
4354                                                                         if let Some((
4355                                                                             pattern23_0,
4356                                                                             pattern23_1,
4357                                                                         )) = C::multi_lane(
4358                                                                             ctx,
4359                                                                             pattern22_0,
4360                                                                         ) {
4361                                                                             if pattern23_0 == 8 {
4362                                                                                 if pattern23_1 == 16
4363                                                                                 {
4364                                                                                     // Rule at src/isa/x64/lower.isle line 1251.
4365                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
4366                                                                                     let expr1_0 = constructor_pmovzxbw(ctx, &expr0_0)?;
4367                                                                                     let expr2_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
4368                                                                                     let expr3_0 = constructor_pmovzxbw(ctx, &expr2_0)?;
4369                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0);
4370                                                                                     let expr5_0 = constructor_pmullw(ctx, expr1_0, &expr4_0)?;
4371                                                                                     let expr6_0 = constructor_value_xmm(ctx, expr5_0)?;
4372                                                                                     return Some(
4373                                                                                         expr6_0,
4374                                                                                     );
4375                                                                                 }
4376                                                                             }
4377                                                                         }
4378                                                                     }
4379                                                                 }
4380                                                             }
4381                                                         }
4382                                                     }
4383                                                 }
4384                                             }
4385                                             &Opcode::UwidenHigh => {
4386                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
4387                                                 if let Some((pattern15_0, pattern15_1)) =
4388                                                     C::multi_lane(ctx, pattern14_0)
4389                                                 {
4390                                                     if pattern15_0 == 8 {
4391                                                         if pattern15_1 == 16 {
4392                                                             if let Some(pattern18_0) =
4393                                                                 C::def_inst(ctx, pattern9_1)
4394                                                             {
4395                                                                 let pattern19_0 =
4396                                                                     C::inst_data(ctx, pattern18_0);
4397                                                                 if let &InstructionData::Unary {
4398                                                                     opcode: ref pattern20_0,
4399                                                                     arg: pattern20_1,
4400                                                                 } = &pattern19_0
4401                                                                 {
4402                                                                     if let &Opcode::UwidenHigh =
4403                                                                         &pattern20_0
4404                                                                     {
4405                                                                         let pattern22_0 =
4406                                                                             C::value_type(
4407                                                                                 ctx,
4408                                                                                 pattern20_1,
4409                                                                             );
4410                                                                         if let Some((
4411                                                                             pattern23_0,
4412                                                                             pattern23_1,
4413                                                                         )) = C::multi_lane(
4414                                                                             ctx,
4415                                                                             pattern22_0,
4416                                                                         ) {
4417                                                                             if pattern23_0 == 8 {
4418                                                                                 if pattern23_1 == 16
4419                                                                                 {
4420                                                                                     // Rule at src/isa/x64/lower.isle line 1211.
4421                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
4422                                                                                     let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
4423                                                                                     let expr2_0: u8 = 8;
4424                                                                                     let expr3_0 = OperandSize::Size32;
4425                                                                                     let expr4_0 = constructor_palignr(ctx, expr0_0, &expr1_0, expr2_0, &expr3_0)?;
4426                                                                                     let expr5_0 = C::xmm_to_xmm_mem(ctx, expr4_0);
4427                                                                                     let expr6_0 = constructor_pmovzxbw(ctx, &expr5_0)?;
4428                                                                                     let expr7_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
4429                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
4430                                                                                     let expr9_0: u8 = 8;
4431                                                                                     let expr10_0 = OperandSize::Size32;
4432                                                                                     let expr11_0 = constructor_palignr(ctx, expr7_0, &expr8_0, expr9_0, &expr10_0)?;
4433                                                                                     let expr12_0 = C::xmm_to_xmm_mem(ctx, expr11_0);
4434                                                                                     let expr13_0 = constructor_pmovzxbw(ctx, &expr12_0)?;
4435                                                                                     let expr14_0 = C::xmm_to_xmm_mem(ctx, expr13_0);
4436                                                                                     let expr15_0 = constructor_pmullw(ctx, expr6_0, &expr14_0)?;
4437                                                                                     let expr16_0 = constructor_value_xmm(ctx, expr15_0)?;
4438                                                                                     return Some(
4439                                                                                         expr16_0,
4440                                                                                     );
4441                                                                                 }
4442                                                                             }
4443                                                                         }
4444                                                                     }
4445                                                                 }
4446                                                             }
4447                                                         }
4448                                                     }
4449                                                 }
4450                                             }
4451                                             _ => {}
4452                                         }
4453                                     }
4454                                 }
4455                                 // Rule at src/isa/x64/lower.isle line 1079.
4456                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
4457                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
4458                                 let expr2_0 = constructor_pmullw(ctx, expr0_0, &expr1_0)?;
4459                                 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
4460                                 return Some(expr3_0);
4461                             }
4462                             _ => {}
4463                         }
4464                     }
4465                 }
4466             }
4467             if pattern3_0 == 32 {
4468                 if pattern3_1 == 4 {
4469                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
4470                     if let &InstructionData::Binary {
4471                         opcode: ref pattern7_0,
4472                         args: ref pattern7_1,
4473                     } = &pattern6_0
4474                     {
4475                         match &pattern7_0 {
4476                             &Opcode::Iadd => {
4477                                 let (pattern9_0, pattern9_1) =
4478                                     C::unpack_value_array_2(ctx, &pattern7_1);
4479                                 // Rule at src/isa/x64/lower.isle line 106.
4480                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
4481                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
4482                                 let expr2_0 = constructor_paddd(ctx, expr0_0, &expr1_0)?;
4483                                 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
4484                                 return Some(expr3_0);
4485                             }
4486                             &Opcode::Isub => {
4487                                 let (pattern9_0, pattern9_1) =
4488                                     C::unpack_value_array_2(ctx, &pattern7_1);
4489                                 // Rule at src/isa/x64/lower.isle line 275.
4490                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
4491                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
4492                                 let expr2_0 = constructor_psubd(ctx, expr0_0, &expr1_0)?;
4493                                 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
4494                                 return Some(expr3_0);
4495                             }
4496                             &Opcode::Imul => {
4497                                 let (pattern9_0, pattern9_1) =
4498                                     C::unpack_value_array_2(ctx, &pattern7_1);
4499                                 if let Some(pattern10_0) = C::def_inst(ctx, pattern9_0) {
4500                                     let pattern11_0 = C::inst_data(ctx, pattern10_0);
4501                                     if let &InstructionData::Unary {
4502                                         opcode: ref pattern12_0,
4503                                         arg: pattern12_1,
4504                                     } = &pattern11_0
4505                                     {
4506                                         match &pattern12_0 {
4507                                             &Opcode::SwidenLow => {
4508                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
4509                                                 if let Some((pattern15_0, pattern15_1)) =
4510                                                     C::multi_lane(ctx, pattern14_0)
4511                                                 {
4512                                                     if pattern15_0 == 16 {
4513                                                         if pattern15_1 == 8 {
4514                                                             if let Some(pattern18_0) =
4515                                                                 C::def_inst(ctx, pattern9_1)
4516                                                             {
4517                                                                 let pattern19_0 =
4518                                                                     C::inst_data(ctx, pattern18_0);
4519                                                                 if let &InstructionData::Unary {
4520                                                                     opcode: ref pattern20_0,
4521                                                                     arg: pattern20_1,
4522                                                                 } = &pattern19_0
4523                                                                 {
4524                                                                     if let &Opcode::SwidenLow =
4525                                                                         &pattern20_0
4526                                                                     {
4527                                                                         let pattern22_0 =
4528                                                                             C::value_type(
4529                                                                                 ctx,
4530                                                                                 pattern20_1,
4531                                                                             );
4532                                                                         if let Some((
4533                                                                             pattern23_0,
4534                                                                             pattern23_1,
4535                                                                         )) = C::multi_lane(
4536                                                                             ctx,
4537                                                                             pattern22_0,
4538                                                                         ) {
4539                                                                             if pattern23_0 == 16 {
4540                                                                                 if pattern23_1 == 8
4541                                                                                 {
4542                                                                                     // Rule at src/isa/x64/lower.isle line 1185.
4543                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
4544                                                                                     let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
4545                                                                                     let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
4546                                                                                     let expr3_0 = constructor_pmullw(ctx, expr0_0, &expr2_0)?;
4547                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
4548                                                                                     let expr5_0 = constructor_pmulhw(ctx, expr0_0, &expr4_0)?;
4549                                                                                     let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
4550                                                                                     let expr7_0 = constructor_punpcklwd(ctx, expr3_0, &expr6_0)?;
4551                                                                                     let expr8_0 = constructor_value_xmm(ctx, expr7_0)?;
4552                                                                                     return Some(
4553                                                                                         expr8_0,
4554                                                                                     );
4555                                                                                 }
4556                                                                             }
4557                                                                         }
4558                                                                     }
4559                                                                 }
4560                                                             }
4561                                                         }
4562                                                     }
4563                                                 }
4564                                             }
4565                                             &Opcode::SwidenHigh => {
4566                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
4567                                                 if let Some((pattern15_0, pattern15_1)) =
4568                                                     C::multi_lane(ctx, pattern14_0)
4569                                                 {
4570                                                     if pattern15_0 == 16 {
4571                                                         if pattern15_1 == 8 {
4572                                                             if let Some(pattern18_0) =
4573                                                                 C::def_inst(ctx, pattern9_1)
4574                                                             {
4575                                                                 let pattern19_0 =
4576                                                                     C::inst_data(ctx, pattern18_0);
4577                                                                 if let &InstructionData::Unary {
4578                                                                     opcode: ref pattern20_0,
4579                                                                     arg: pattern20_1,
4580                                                                 } = &pattern19_0
4581                                                                 {
4582                                                                     if let &Opcode::SwidenHigh =
4583                                                                         &pattern20_0
4584                                                                     {
4585                                                                         let pattern22_0 =
4586                                                                             C::value_type(
4587                                                                                 ctx,
4588                                                                                 pattern20_1,
4589                                                                             );
4590                                                                         if let Some((
4591                                                                             pattern23_0,
4592                                                                             pattern23_1,
4593                                                                         )) = C::multi_lane(
4594                                                                             ctx,
4595                                                                             pattern22_0,
4596                                                                         ) {
4597                                                                             if pattern23_0 == 16 {
4598                                                                                 if pattern23_1 == 8
4599                                                                                 {
4600                                                                                     // Rule at src/isa/x64/lower.isle line 1149.
4601                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
4602                                                                                     let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
4603                                                                                     let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
4604                                                                                     let expr3_0 = constructor_pmullw(ctx, expr0_0, &expr2_0)?;
4605                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
4606                                                                                     let expr5_0 = constructor_pmulhw(ctx, expr0_0, &expr4_0)?;
4607                                                                                     let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
4608                                                                                     let expr7_0 = constructor_punpckhwd(ctx, expr3_0, &expr6_0)?;
4609                                                                                     let expr8_0 = constructor_value_xmm(ctx, expr7_0)?;
4610                                                                                     return Some(
4611                                                                                         expr8_0,
4612                                                                                     );
4613                                                                                 }
4614                                                                             }
4615                                                                         }
4616                                                                     }
4617                                                                 }
4618                                                             }
4619                                                         }
4620                                                     }
4621                                                 }
4622                                             }
4623                                             &Opcode::UwidenLow => {
4624                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
4625                                                 if let Some((pattern15_0, pattern15_1)) =
4626                                                     C::multi_lane(ctx, pattern14_0)
4627                                                 {
4628                                                     if pattern15_0 == 16 {
4629                                                         if pattern15_1 == 8 {
4630                                                             if let Some(pattern18_0) =
4631                                                                 C::def_inst(ctx, pattern9_1)
4632                                                             {
4633                                                                 let pattern19_0 =
4634                                                                     C::inst_data(ctx, pattern18_0);
4635                                                                 if let &InstructionData::Unary {
4636                                                                     opcode: ref pattern20_0,
4637                                                                     arg: pattern20_1,
4638                                                                 } = &pattern19_0
4639                                                                 {
4640                                                                     if let &Opcode::UwidenLow =
4641                                                                         &pattern20_0
4642                                                                     {
4643                                                                         let pattern22_0 =
4644                                                                             C::value_type(
4645                                                                                 ctx,
4646                                                                                 pattern20_1,
4647                                                                             );
4648                                                                         if let Some((
4649                                                                             pattern23_0,
4650                                                                             pattern23_1,
4651                                                                         )) = C::multi_lane(
4652                                                                             ctx,
4653                                                                             pattern22_0,
4654                                                                         ) {
4655                                                                             if pattern23_0 == 16 {
4656                                                                                 if pattern23_1 == 8
4657                                                                                 {
4658                                                                                     // Rule at src/isa/x64/lower.isle line 1261.
4659                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
4660                                                                                     let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
4661                                                                                     let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
4662                                                                                     let expr3_0 = constructor_pmullw(ctx, expr0_0, &expr2_0)?;
4663                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
4664                                                                                     let expr5_0 = constructor_pmulhuw(ctx, expr0_0, &expr4_0)?;
4665                                                                                     let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
4666                                                                                     let expr7_0 = constructor_punpcklwd(ctx, expr3_0, &expr6_0)?;
4667                                                                                     let expr8_0 = constructor_value_xmm(ctx, expr7_0)?;
4668                                                                                     return Some(
4669                                                                                         expr8_0,
4670                                                                                     );
4671                                                                                 }
4672                                                                             }
4673                                                                         }
4674                                                                     }
4675                                                                 }
4676                                                             }
4677                                                         }
4678                                                     }
4679                                                 }
4680                                             }
4681                                             &Opcode::UwidenHigh => {
4682                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
4683                                                 if let Some((pattern15_0, pattern15_1)) =
4684                                                     C::multi_lane(ctx, pattern14_0)
4685                                                 {
4686                                                     if pattern15_0 == 16 {
4687                                                         if pattern15_1 == 8 {
4688                                                             if let Some(pattern18_0) =
4689                                                                 C::def_inst(ctx, pattern9_1)
4690                                                             {
4691                                                                 let pattern19_0 =
4692                                                                     C::inst_data(ctx, pattern18_0);
4693                                                                 if let &InstructionData::Unary {
4694                                                                     opcode: ref pattern20_0,
4695                                                                     arg: pattern20_1,
4696                                                                 } = &pattern19_0
4697                                                                 {
4698                                                                     if let &Opcode::UwidenHigh =
4699                                                                         &pattern20_0
4700                                                                     {
4701                                                                         let pattern22_0 =
4702                                                                             C::value_type(
4703                                                                                 ctx,
4704                                                                                 pattern20_1,
4705                                                                             );
4706                                                                         if let Some((
4707                                                                             pattern23_0,
4708                                                                             pattern23_1,
4709                                                                         )) = C::multi_lane(
4710                                                                             ctx,
4711                                                                             pattern22_0,
4712                                                                         ) {
4713                                                                             if pattern23_0 == 16 {
4714                                                                                 if pattern23_1 == 8
4715                                                                                 {
4716                                                                                     // Rule at src/isa/x64/lower.isle line 1225.
4717                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
4718                                                                                     let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
4719                                                                                     let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
4720                                                                                     let expr3_0 = constructor_pmullw(ctx, expr0_0, &expr2_0)?;
4721                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
4722                                                                                     let expr5_0 = constructor_pmulhuw(ctx, expr0_0, &expr4_0)?;
4723                                                                                     let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
4724                                                                                     let expr7_0 = constructor_punpckhwd(ctx, expr3_0, &expr6_0)?;
4725                                                                                     let expr8_0 = constructor_value_xmm(ctx, expr7_0)?;
4726                                                                                     return Some(
4727                                                                                         expr8_0,
4728                                                                                     );
4729                                                                                 }
4730                                                                             }
4731                                                                         }
4732                                                                     }
4733                                                                 }
4734                                                             }
4735                                                         }
4736                                                     }
4737                                                 }
4738                                             }
4739                                             _ => {}
4740                                         }
4741                                     }
4742                                 }
4743                                 // Rule at src/isa/x64/lower.isle line 1082.
4744                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
4745                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
4746                                 let expr2_0 = constructor_pmulld(ctx, expr0_0, &expr1_0)?;
4747                                 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
4748                                 return Some(expr3_0);
4749                             }
4750                             _ => {}
4751                         }
4752                     }
4753                 }
4754             }
4755             if pattern3_0 == 64 {
4756                 if pattern3_1 == 2 {
4757                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
4758                     if let &InstructionData::Binary {
4759                         opcode: ref pattern7_0,
4760                         args: ref pattern7_1,
4761                     } = &pattern6_0
4762                     {
4763                         match &pattern7_0 {
4764                             &Opcode::Iadd => {
4765                                 let (pattern9_0, pattern9_1) =
4766                                     C::unpack_value_array_2(ctx, &pattern7_1);
4767                                 // Rule at src/isa/x64/lower.isle line 111.
4768                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
4769                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
4770                                 let expr2_0 = constructor_paddq(ctx, expr0_0, &expr1_0)?;
4771                                 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
4772                                 return Some(expr3_0);
4773                             }
4774                             &Opcode::Isub => {
4775                                 let (pattern9_0, pattern9_1) =
4776                                     C::unpack_value_array_2(ctx, &pattern7_1);
4777                                 // Rule at src/isa/x64/lower.isle line 280.
4778                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
4779                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
4780                                 let expr2_0 = constructor_psubq(ctx, expr0_0, &expr1_0)?;
4781                                 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
4782                                 return Some(expr3_0);
4783                             }
4784                             &Opcode::Imul => {
4785                                 let (pattern9_0, pattern9_1) =
4786                                     C::unpack_value_array_2(ctx, &pattern7_1);
4787                                 if let Some(pattern10_0) = C::def_inst(ctx, pattern9_0) {
4788                                     let pattern11_0 = C::inst_data(ctx, pattern10_0);
4789                                     if let &InstructionData::Unary {
4790                                         opcode: ref pattern12_0,
4791                                         arg: pattern12_1,
4792                                     } = &pattern11_0
4793                                     {
4794                                         match &pattern12_0 {
4795                                             &Opcode::SwidenLow => {
4796                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
4797                                                 if let Some((pattern15_0, pattern15_1)) =
4798                                                     C::multi_lane(ctx, pattern14_0)
4799                                                 {
4800                                                     if pattern15_0 == 32 {
4801                                                         if pattern15_1 == 4 {
4802                                                             if let Some(pattern18_0) =
4803                                                                 C::def_inst(ctx, pattern9_1)
4804                                                             {
4805                                                                 let pattern19_0 =
4806                                                                     C::inst_data(ctx, pattern18_0);
4807                                                                 if let &InstructionData::Unary {
4808                                                                     opcode: ref pattern20_0,
4809                                                                     arg: pattern20_1,
4810                                                                 } = &pattern19_0
4811                                                                 {
4812                                                                     if let &Opcode::SwidenLow =
4813                                                                         &pattern20_0
4814                                                                     {
4815                                                                         let pattern22_0 =
4816                                                                             C::value_type(
4817                                                                                 ctx,
4818                                                                                 pattern20_1,
4819                                                                             );
4820                                                                         if let Some((
4821                                                                             pattern23_0,
4822                                                                             pattern23_1,
4823                                                                         )) = C::multi_lane(
4824                                                                             ctx,
4825                                                                             pattern22_0,
4826                                                                         ) {
4827                                                                             if pattern23_0 == 32 {
4828                                                                                 if pattern23_1 == 4
4829                                                                                 {
4830                                                                                     // Rule at src/isa/x64/lower.isle line 1197.
4831                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
4832                                                                                     let expr1_0: u8 = 80;
4833                                                                                     let expr2_0 = OperandSize::Size32;
4834                                                                                     let expr3_0 = constructor_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?;
4835                                                                                     let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
4836                                                                                     let expr5_0: u8 = 80;
4837                                                                                     let expr6_0 = OperandSize::Size32;
4838                                                                                     let expr7_0 = constructor_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?;
4839                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
4840                                                                                     let expr9_0 = constructor_pmuldq(ctx, expr3_0, &expr8_0)?;
4841                                                                                     let expr10_0 = constructor_value_xmm(ctx, expr9_0)?;
4842                                                                                     return Some(
4843                                                                                         expr10_0,
4844                                                                                     );
4845                                                                                 }
4846                                                                             }
4847                                                                         }
4848                                                                     }
4849                                                                 }
4850                                                             }
4851                                                         }
4852                                                     }
4853                                                 }
4854                                             }
4855                                             &Opcode::SwidenHigh => {
4856                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
4857                                                 if let Some((pattern15_0, pattern15_1)) =
4858                                                     C::multi_lane(ctx, pattern14_0)
4859                                                 {
4860                                                     if pattern15_0 == 32 {
4861                                                         if pattern15_1 == 4 {
4862                                                             if let Some(pattern18_0) =
4863                                                                 C::def_inst(ctx, pattern9_1)
4864                                                             {
4865                                                                 let pattern19_0 =
4866                                                                     C::inst_data(ctx, pattern18_0);
4867                                                                 if let &InstructionData::Unary {
4868                                                                     opcode: ref pattern20_0,
4869                                                                     arg: pattern20_1,
4870                                                                 } = &pattern19_0
4871                                                                 {
4872                                                                     if let &Opcode::SwidenHigh =
4873                                                                         &pattern20_0
4874                                                                     {
4875                                                                         let pattern22_0 =
4876                                                                             C::value_type(
4877                                                                                 ctx,
4878                                                                                 pattern20_1,
4879                                                                             );
4880                                                                         if let Some((
4881                                                                             pattern23_0,
4882                                                                             pattern23_1,
4883                                                                         )) = C::multi_lane(
4884                                                                             ctx,
4885                                                                             pattern22_0,
4886                                                                         ) {
4887                                                                             if pattern23_0 == 32 {
4888                                                                                 if pattern23_1 == 4
4889                                                                                 {
4890                                                                                     // Rule at src/isa/x64/lower.isle line 1161.
4891                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
4892                                                                                     let expr1_0: u8 = 250;
4893                                                                                     let expr2_0 = OperandSize::Size32;
4894                                                                                     let expr3_0 = constructor_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?;
4895                                                                                     let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
4896                                                                                     let expr5_0: u8 = 250;
4897                                                                                     let expr6_0 = OperandSize::Size32;
4898                                                                                     let expr7_0 = constructor_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?;
4899                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
4900                                                                                     let expr9_0 = constructor_pmuldq(ctx, expr3_0, &expr8_0)?;
4901                                                                                     let expr10_0 = constructor_value_xmm(ctx, expr9_0)?;
4902                                                                                     return Some(
4903                                                                                         expr10_0,
4904                                                                                     );
4905                                                                                 }
4906                                                                             }
4907                                                                         }
4908                                                                     }
4909                                                                 }
4910                                                             }
4911                                                         }
4912                                                     }
4913                                                 }
4914                                             }
4915                                             &Opcode::UwidenLow => {
4916                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
4917                                                 if let Some((pattern15_0, pattern15_1)) =
4918                                                     C::multi_lane(ctx, pattern14_0)
4919                                                 {
4920                                                     if pattern15_0 == 32 {
4921                                                         if pattern15_1 == 4 {
4922                                                             if let Some(pattern18_0) =
4923                                                                 C::def_inst(ctx, pattern9_1)
4924                                                             {
4925                                                                 let pattern19_0 =
4926                                                                     C::inst_data(ctx, pattern18_0);
4927                                                                 if let &InstructionData::Unary {
4928                                                                     opcode: ref pattern20_0,
4929                                                                     arg: pattern20_1,
4930                                                                 } = &pattern19_0
4931                                                                 {
4932                                                                     if let &Opcode::UwidenLow =
4933                                                                         &pattern20_0
4934                                                                     {
4935                                                                         let pattern22_0 =
4936                                                                             C::value_type(
4937                                                                                 ctx,
4938                                                                                 pattern20_1,
4939                                                                             );
4940                                                                         if let Some((
4941                                                                             pattern23_0,
4942                                                                             pattern23_1,
4943                                                                         )) = C::multi_lane(
4944                                                                             ctx,
4945                                                                             pattern22_0,
4946                                                                         ) {
4947                                                                             if pattern23_0 == 32 {
4948                                                                                 if pattern23_1 == 4
4949                                                                                 {
4950                                                                                     // Rule at src/isa/x64/lower.isle line 1273.
4951                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
4952                                                                                     let expr1_0: u8 = 80;
4953                                                                                     let expr2_0 = OperandSize::Size32;
4954                                                                                     let expr3_0 = constructor_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?;
4955                                                                                     let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
4956                                                                                     let expr5_0: u8 = 80;
4957                                                                                     let expr6_0 = OperandSize::Size32;
4958                                                                                     let expr7_0 = constructor_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?;
4959                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
4960                                                                                     let expr9_0 = constructor_pmuludq(ctx, expr3_0, &expr8_0)?;
4961                                                                                     let expr10_0 = constructor_value_xmm(ctx, expr9_0)?;
4962                                                                                     return Some(
4963                                                                                         expr10_0,
4964                                                                                     );
4965                                                                                 }
4966                                                                             }
4967                                                                         }
4968                                                                     }
4969                                                                 }
4970                                                             }
4971                                                         }
4972                                                     }
4973                                                 }
4974                                             }
4975                                             &Opcode::UwidenHigh => {
4976                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
4977                                                 if let Some((pattern15_0, pattern15_1)) =
4978                                                     C::multi_lane(ctx, pattern14_0)
4979                                                 {
4980                                                     if pattern15_0 == 32 {
4981                                                         if pattern15_1 == 4 {
4982                                                             if let Some(pattern18_0) =
4983                                                                 C::def_inst(ctx, pattern9_1)
4984                                                             {
4985                                                                 let pattern19_0 =
4986                                                                     C::inst_data(ctx, pattern18_0);
4987                                                                 if let &InstructionData::Unary {
4988                                                                     opcode: ref pattern20_0,
4989                                                                     arg: pattern20_1,
4990                                                                 } = &pattern19_0
4991                                                                 {
4992                                                                     if let &Opcode::UwidenHigh =
4993                                                                         &pattern20_0
4994                                                                     {
4995                                                                         let pattern22_0 =
4996                                                                             C::value_type(
4997                                                                                 ctx,
4998                                                                                 pattern20_1,
4999                                                                             );
5000                                                                         if let Some((
5001                                                                             pattern23_0,
5002                                                                             pattern23_1,
5003                                                                         )) = C::multi_lane(
5004                                                                             ctx,
5005                                                                             pattern22_0,
5006                                                                         ) {
5007                                                                             if pattern23_0 == 32 {
5008                                                                                 if pattern23_1 == 4
5009                                                                                 {
5010                                                                                     // Rule at src/isa/x64/lower.isle line 1237.
5011                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
5012                                                                                     let expr1_0: u8 = 250;
5013                                                                                     let expr2_0 = OperandSize::Size32;
5014                                                                                     let expr3_0 = constructor_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?;
5015                                                                                     let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
5016                                                                                     let expr5_0: u8 = 250;
5017                                                                                     let expr6_0 = OperandSize::Size32;
5018                                                                                     let expr7_0 = constructor_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?;
5019                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
5020                                                                                     let expr9_0 = constructor_pmuludq(ctx, expr3_0, &expr8_0)?;
5021                                                                                     let expr10_0 = constructor_value_xmm(ctx, expr9_0)?;
5022                                                                                     return Some(
5023                                                                                         expr10_0,
5024                                                                                     );
5025                                                                                 }
5026                                                                             }
5027                                                                         }
5028                                                                     }
5029                                                                 }
5030                                                             }
5031                                                         }
5032                                                     }
5033                                                 }
5034                                             }
5035                                             _ => {}
5036                                         }
5037                                     }
5038                                 }
5039                                 // Rule at src/isa/x64/lower.isle line 1113.
5040                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
5041                                 let expr1_0 = constructor_put_in_xmm(ctx, pattern9_1)?;
5042                                 let expr2_0: u32 = 32;
5043                                 let expr3_0 = RegMemImm::Imm { simm32: expr2_0 };
5044                                 let expr4_0 = C::xmm_mem_imm_new(ctx, &expr3_0);
5045                                 let expr5_0 = constructor_psrlq(ctx, expr0_0, &expr4_0)?;
5046                                 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
5047                                 let expr7_0 = constructor_pmuludq(ctx, expr5_0, &expr6_0)?;
5048                                 let expr8_0: u32 = 32;
5049                                 let expr9_0 = RegMemImm::Imm { simm32: expr8_0 };
5050                                 let expr10_0 = C::xmm_mem_imm_new(ctx, &expr9_0);
5051                                 let expr11_0 = constructor_psrlq(ctx, expr1_0, &expr10_0)?;
5052                                 let expr12_0 = C::xmm_to_xmm_mem(ctx, expr11_0);
5053                                 let expr13_0 = constructor_pmuludq(ctx, expr0_0, &expr12_0)?;
5054                                 let expr14_0 = C::xmm_to_xmm_mem(ctx, expr13_0);
5055                                 let expr15_0 = constructor_paddq(ctx, expr7_0, &expr14_0)?;
5056                                 let expr16_0: u32 = 32;
5057                                 let expr17_0 = RegMemImm::Imm { simm32: expr16_0 };
5058                                 let expr18_0 = C::xmm_mem_imm_new(ctx, &expr17_0);
5059                                 let expr19_0 = constructor_psllq(ctx, expr15_0, &expr18_0)?;
5060                                 let expr20_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
5061                                 let expr21_0 = constructor_pmuludq(ctx, expr0_0, &expr20_0)?;
5062                                 let expr22_0 = C::xmm_to_xmm_mem(ctx, expr19_0);
5063                                 let expr23_0 = constructor_paddq(ctx, expr21_0, &expr22_0)?;
5064                                 let expr24_0 = constructor_value_xmm(ctx, expr23_0)?;
5065                                 return Some(expr24_0);
5066                             }
5067                             _ => {}
5068                         }
5069                     }
5070                 }
5071             }
5072             let pattern4_0 = C::inst_data(ctx, pattern0_0);
5073             match &pattern4_0 {
5074                 &InstructionData::Binary {
5075                     opcode: ref pattern5_0,
5076                     args: ref pattern5_1,
5077                 } => {
5078                     match &pattern5_0 {
5079                         &Opcode::Band => {
5080                             let (pattern7_0, pattern7_1) =
5081                                 C::unpack_value_array_2(ctx, &pattern5_1);
5082                             // Rule at src/isa/x64/lower.isle line 368.
5083                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5084                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5085                             let expr2_0 = constructor_sse_and(ctx, pattern2_0, expr0_0, &expr1_0)?;
5086                             let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
5087                             return Some(expr3_0);
5088                         }
5089                         &Opcode::Bor => {
5090                             let (pattern7_0, pattern7_1) =
5091                                 C::unpack_value_array_2(ctx, &pattern5_1);
5092                             // Rule at src/isa/x64/lower.isle line 442.
5093                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5094                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5095                             let expr2_0 = constructor_sse_or(ctx, pattern2_0, expr0_0, &expr1_0)?;
5096                             let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
5097                             return Some(expr3_0);
5098                         }
5099                         &Opcode::Bxor => {
5100                             let (pattern7_0, pattern7_1) =
5101                                 C::unpack_value_array_2(ctx, &pattern5_1);
5102                             // Rule at src/isa/x64/lower.isle line 513.
5103                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5104                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5105                             let expr2_0 = constructor_sse_xor(ctx, pattern2_0, expr0_0, &expr1_0)?;
5106                             let expr3_0 = constructor_value_xmm(ctx, expr2_0)?;
5107                             return Some(expr3_0);
5108                         }
5109                         _ => {}
5110                     }
5111                 }
5112                 &InstructionData::Ternary {
5113                     opcode: ref pattern5_0,
5114                     args: ref pattern5_1,
5115                 } => {
5116                     match &pattern5_0 {
5117                         &Opcode::Bitselect => {
5118                             let (pattern7_0, pattern7_1, pattern7_2) =
5119                                 C::unpack_value_array_3(ctx, &pattern5_1);
5120                             // Rule at src/isa/x64/lower.isle line 1376.
5121                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5122                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5123                             let expr2_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
5124                             let expr3_0 = constructor_sse_and(ctx, pattern2_0, expr1_0, &expr2_0)?;
5125                             let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern7_2)?;
5126                             let expr5_0 =
5127                                 constructor_sse_and_not(ctx, pattern2_0, expr0_0, &expr4_0)?;
5128                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr3_0);
5129                             let expr7_0 = constructor_sse_or(ctx, pattern2_0, expr5_0, &expr6_0)?;
5130                             let expr8_0 = constructor_value_xmm(ctx, expr7_0)?;
5131                             return Some(expr8_0);
5132                         }
5133                         &Opcode::Vselect => {
5134                             let (pattern7_0, pattern7_1, pattern7_2) =
5135                                 C::unpack_value_array_3(ctx, &pattern5_1);
5136                             // Rule at src/isa/x64/lower.isle line 1390.
5137                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern7_0)?;
5138                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5139                             let expr2_0 = constructor_put_in_xmm(ctx, pattern7_2)?;
5140                             let expr3_0 = constructor_sse_blend(
5141                                 ctx, pattern2_0, &expr0_0, &expr1_0, expr2_0,
5142                             )?;
5143                             let expr4_0 = constructor_value_xmm(ctx, expr3_0)?;
5144                             return Some(expr4_0);
5145                         }
5146                         _ => {}
5147                     }
5148                 }
5149                 &InstructionData::Unary {
5150                     opcode: ref pattern5_0,
5151                     arg: pattern5_1,
5152                 } => {
5153                     if let &Opcode::Bnot = &pattern5_0 {
5154                         // Rule at src/isa/x64/lower.isle line 1371.
5155                         let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
5156                         let expr1_0 = constructor_vector_all_ones(ctx, pattern2_0)?;
5157                         let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
5158                         let expr3_0 = constructor_sse_xor(ctx, pattern2_0, expr0_0, &expr2_0)?;
5159                         let expr4_0 = constructor_value_xmm(ctx, expr3_0)?;
5160                         return Some(expr4_0);
5161                     }
5162                 }
5163                 _ => {}
5164             }
5165         }
5166         if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) {
5167             let pattern4_0 = C::inst_data(ctx, pattern0_0);
5168             match &pattern4_0 {
5169                 &InstructionData::UnaryImm {
5170                     opcode: ref pattern5_0,
5171                     imm: pattern5_1,
5172                 } => {
5173                     if let &Opcode::Iconst = &pattern5_0 {
5174                         let pattern7_0 = C::u64_from_imm64(ctx, pattern5_1);
5175                         // Rule at src/isa/x64/lower.isle line 10.
5176                         let expr0_0 = constructor_imm(ctx, pattern3_0, pattern7_0)?;
5177                         let expr1_0 = C::value_reg(ctx, expr0_0);
5178                         return Some(expr1_0);
5179                     }
5180                 }
5181                 &InstructionData::UnaryBool {
5182                     opcode: ref pattern5_0,
5183                     imm: pattern5_1,
5184                 } => {
5185                     if let &Opcode::Bconst = &pattern5_0 {
5186                         if pattern5_1 == true {
5187                             // Rule at src/isa/x64/lower.isle line 28.
5188                             let expr0_0: u64 = 1;
5189                             let expr1_0 = constructor_imm(ctx, pattern3_0, expr0_0)?;
5190                             let expr2_0 = C::value_reg(ctx, expr1_0);
5191                             return Some(expr2_0);
5192                         }
5193                         if pattern5_1 == false {
5194                             // Rule at src/isa/x64/lower.isle line 24.
5195                             let expr0_0: u64 = 0;
5196                             let expr1_0 = constructor_imm(ctx, pattern3_0, expr0_0)?;
5197                             let expr2_0 = C::value_reg(ctx, expr1_0);
5198                             return Some(expr2_0);
5199                         }
5200                     }
5201                 }
5202                 &InstructionData::Binary {
5203                     opcode: ref pattern5_0,
5204                     args: ref pattern5_1,
5205                 } => {
5206                     match &pattern5_0 {
5207                         &Opcode::Imin => {
5208                             let (pattern7_0, pattern7_1) =
5209                                 C::unpack_value_array_2(ctx, &pattern5_1);
5210                             // Rule at src/isa/x64/lower.isle line 1480.
5211                             let expr0_0 = CC::L;
5212                             let expr1_0 = constructor_cmp_and_choose(
5213                                 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1,
5214                             )?;
5215                             return Some(expr1_0);
5216                         }
5217                         &Opcode::Umin => {
5218                             let (pattern7_0, pattern7_1) =
5219                                 C::unpack_value_array_2(ctx, &pattern5_1);
5220                             // Rule at src/isa/x64/lower.isle line 1474.
5221                             let expr0_0 = CC::B;
5222                             let expr1_0 = constructor_cmp_and_choose(
5223                                 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1,
5224                             )?;
5225                             return Some(expr1_0);
5226                         }
5227                         &Opcode::Imax => {
5228                             let (pattern7_0, pattern7_1) =
5229                                 C::unpack_value_array_2(ctx, &pattern5_1);
5230                             // Rule at src/isa/x64/lower.isle line 1483.
5231                             let expr0_0 = CC::NL;
5232                             let expr1_0 = constructor_cmp_and_choose(
5233                                 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1,
5234                             )?;
5235                             return Some(expr1_0);
5236                         }
5237                         &Opcode::Umax => {
5238                             let (pattern7_0, pattern7_1) =
5239                                 C::unpack_value_array_2(ctx, &pattern5_1);
5240                             // Rule at src/isa/x64/lower.isle line 1477.
5241                             let expr0_0 = CC::NB;
5242                             let expr1_0 = constructor_cmp_and_choose(
5243                                 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1,
5244                             )?;
5245                             return Some(expr1_0);
5246                         }
5247                         &Opcode::Iadd => {
5248                             let (pattern7_0, pattern7_1) =
5249                                 C::unpack_value_array_2(ctx, &pattern5_1);
5250                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
5251                                 // Rule at src/isa/x64/lower.isle line 76.
5252                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
5253                                 let expr1_0 =
5254                                     constructor_add(ctx, pattern3_0, expr0_0, &pattern8_0)?;
5255                                 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?;
5256                                 return Some(expr2_0);
5257                             }
5258                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
5259                                 // Rule at src/isa/x64/lower.isle line 88.
5260                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
5261                                 let expr1_0 =
5262                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
5263                                 let expr2_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr1_0)?;
5264                                 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?;
5265                                 return Some(expr3_0);
5266                             }
5267                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
5268                                 // Rule at src/isa/x64/lower.isle line 72.
5269                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5270                                 let expr1_0 =
5271                                     constructor_add(ctx, pattern3_0, expr0_0, &pattern8_0)?;
5272                                 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?;
5273                                 return Some(expr2_0);
5274                             }
5275                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
5276                                 // Rule at src/isa/x64/lower.isle line 82.
5277                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5278                                 let expr1_0 =
5279                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
5280                                 let expr2_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr1_0)?;
5281                                 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?;
5282                                 return Some(expr3_0);
5283                             }
5284                             // Rule at src/isa/x64/lower.isle line 64.
5285                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5286                             let expr1_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
5287                             let expr2_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0);
5288                             let expr3_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr2_0)?;
5289                             let expr4_0 = constructor_value_gpr(ctx, expr3_0)?;
5290                             return Some(expr4_0);
5291                         }
5292                         &Opcode::Isub => {
5293                             let (pattern7_0, pattern7_1) =
5294                                 C::unpack_value_array_2(ctx, &pattern5_1);
5295                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
5296                                 // Rule at src/isa/x64/lower.isle line 252.
5297                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5298                                 let expr1_0 =
5299                                     constructor_sub(ctx, pattern3_0, expr0_0, &pattern8_0)?;
5300                                 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?;
5301                                 return Some(expr2_0);
5302                             }
5303                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
5304                                 // Rule at src/isa/x64/lower.isle line 257.
5305                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5306                                 let expr1_0 =
5307                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
5308                                 let expr2_0 = constructor_sub(ctx, pattern3_0, expr0_0, &expr1_0)?;
5309                                 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?;
5310                                 return Some(expr3_0);
5311                             }
5312                             // Rule at src/isa/x64/lower.isle line 245.
5313                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5314                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
5315                             let expr2_0 = constructor_sub(ctx, pattern3_0, expr0_0, &expr1_0)?;
5316                             let expr3_0 = constructor_value_gpr(ctx, expr2_0)?;
5317                             return Some(expr3_0);
5318                         }
5319                         &Opcode::Imul => {
5320                             let (pattern7_0, pattern7_1) =
5321                                 C::unpack_value_array_2(ctx, &pattern5_1);
5322                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
5323                                 // Rule at src/isa/x64/lower.isle line 1019.
5324                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
5325                                 let expr1_0 =
5326                                     constructor_mul(ctx, pattern3_0, expr0_0, &pattern8_0)?;
5327                                 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?;
5328                                 return Some(expr2_0);
5329                             }
5330                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
5331                                 // Rule at src/isa/x64/lower.isle line 1031.
5332                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
5333                                 let expr1_0 =
5334                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
5335                                 let expr2_0 = constructor_mul(ctx, pattern3_0, expr0_0, &expr1_0)?;
5336                                 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?;
5337                                 return Some(expr3_0);
5338                             }
5339                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
5340                                 // Rule at src/isa/x64/lower.isle line 1015.
5341                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5342                                 let expr1_0 =
5343                                     constructor_mul(ctx, pattern3_0, expr0_0, &pattern8_0)?;
5344                                 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?;
5345                                 return Some(expr2_0);
5346                             }
5347                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
5348                                 // Rule at src/isa/x64/lower.isle line 1025.
5349                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5350                                 let expr1_0 =
5351                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
5352                                 let expr2_0 = constructor_mul(ctx, pattern3_0, expr0_0, &expr1_0)?;
5353                                 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?;
5354                                 return Some(expr3_0);
5355                             }
5356                             // Rule at src/isa/x64/lower.isle line 1008.
5357                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5358                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
5359                             let expr2_0 = constructor_mul(ctx, pattern3_0, expr0_0, &expr1_0)?;
5360                             let expr3_0 = constructor_value_gpr(ctx, expr2_0)?;
5361                             return Some(expr3_0);
5362                         }
5363                         &Opcode::IaddIfcout => {
5364                             let (pattern7_0, pattern7_1) =
5365                                 C::unpack_value_array_2(ctx, &pattern5_1);
5366                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
5367                                 // Rule at src/isa/x64/lower.isle line 183.
5368                                 let expr0_0 = C::temp_writable_gpr(ctx);
5369                                 let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
5370                                 let expr2_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
5371                                 let expr3_0 =
5372                                     constructor_add(ctx, pattern3_0, expr2_0, &pattern8_0)?;
5373                                 let expr4_0 = constructor_value_gprs(ctx, expr3_0, expr1_0)?;
5374                                 return Some(expr4_0);
5375                             }
5376                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
5377                                 // Rule at src/isa/x64/lower.isle line 199.
5378                                 let expr0_0 = C::temp_writable_gpr(ctx);
5379                                 let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
5380                                 let expr2_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
5381                                 let expr3_0 =
5382                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
5383                                 let expr4_0 = constructor_add(ctx, pattern3_0, expr2_0, &expr3_0)?;
5384                                 let expr5_0 = constructor_value_gprs(ctx, expr4_0, expr1_0)?;
5385                                 return Some(expr5_0);
5386                             }
5387                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
5388                                 // Rule at src/isa/x64/lower.isle line 177.
5389                                 let expr0_0 = C::temp_writable_gpr(ctx);
5390                                 let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
5391                                 let expr2_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5392                                 let expr3_0 =
5393                                     constructor_add(ctx, pattern3_0, expr2_0, &pattern8_0)?;
5394                                 let expr4_0 = constructor_value_gprs(ctx, expr3_0, expr1_0)?;
5395                                 return Some(expr4_0);
5396                             }
5397                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
5398                                 // Rule at src/isa/x64/lower.isle line 191.
5399                                 let expr0_0 = C::temp_writable_gpr(ctx);
5400                                 let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
5401                                 let expr2_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5402                                 let expr3_0 =
5403                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
5404                                 let expr4_0 = constructor_add(ctx, pattern3_0, expr2_0, &expr3_0)?;
5405                                 let expr5_0 = constructor_value_gprs(ctx, expr4_0, expr1_0)?;
5406                                 return Some(expr5_0);
5407                             }
5408                             // Rule at src/isa/x64/lower.isle line 167.
5409                             let expr0_0 = C::temp_writable_gpr(ctx);
5410                             let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
5411                             let expr2_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5412                             let expr3_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
5413                             let expr4_0 = constructor_add(ctx, pattern3_0, expr2_0, &expr3_0)?;
5414                             let expr5_0 = constructor_value_gprs(ctx, expr4_0, expr1_0)?;
5415                             return Some(expr5_0);
5416                         }
5417                         &Opcode::Band => {
5418                             let (pattern7_0, pattern7_1) =
5419                                 C::unpack_value_array_2(ctx, &pattern5_1);
5420                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
5421                                 // Rule at src/isa/x64/lower.isle line 355.
5422                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
5423                                 let expr1_0 =
5424                                     constructor_x64_and(ctx, pattern3_0, expr0_0, &pattern8_0)?;
5425                                 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?;
5426                                 return Some(expr2_0);
5427                             }
5428                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
5429                                 // Rule at src/isa/x64/lower.isle line 341.
5430                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
5431                                 let expr1_0 =
5432                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
5433                                 let expr2_0 =
5434                                     constructor_x64_and(ctx, pattern3_0, expr0_0, &expr1_0)?;
5435                                 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?;
5436                                 return Some(expr3_0);
5437                             }
5438                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
5439                                 // Rule at src/isa/x64/lower.isle line 349.
5440                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5441                                 let expr1_0 =
5442                                     constructor_x64_and(ctx, pattern3_0, expr0_0, &pattern8_0)?;
5443                                 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?;
5444                                 return Some(expr2_0);
5445                             }
5446                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
5447                                 // Rule at src/isa/x64/lower.isle line 335.
5448                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5449                                 let expr1_0 =
5450                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
5451                                 let expr2_0 =
5452                                     constructor_x64_and(ctx, pattern3_0, expr0_0, &expr1_0)?;
5453                                 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?;
5454                                 return Some(expr3_0);
5455                             }
5456                             // Rule at src/isa/x64/lower.isle line 328.
5457                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5458                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
5459                             let expr2_0 = constructor_x64_and(ctx, pattern3_0, expr0_0, &expr1_0)?;
5460                             let expr3_0 = constructor_value_gpr(ctx, expr2_0)?;
5461                             return Some(expr3_0);
5462                         }
5463                         &Opcode::Bor => {
5464                             let (pattern7_0, pattern7_1) =
5465                                 C::unpack_value_array_2(ctx, &pattern5_1);
5466                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
5467                                 // Rule at src/isa/x64/lower.isle line 429.
5468                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
5469                                 let expr1_0 =
5470                                     constructor_or(ctx, pattern3_0, expr0_0, &pattern8_0)?;
5471                                 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?;
5472                                 return Some(expr2_0);
5473                             }
5474                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
5475                                 // Rule at src/isa/x64/lower.isle line 415.
5476                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
5477                                 let expr1_0 =
5478                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
5479                                 let expr2_0 = constructor_or(ctx, pattern3_0, expr0_0, &expr1_0)?;
5480                                 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?;
5481                                 return Some(expr3_0);
5482                             }
5483                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
5484                                 // Rule at src/isa/x64/lower.isle line 423.
5485                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5486                                 let expr1_0 =
5487                                     constructor_or(ctx, pattern3_0, expr0_0, &pattern8_0)?;
5488                                 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?;
5489                                 return Some(expr2_0);
5490                             }
5491                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
5492                                 // Rule at src/isa/x64/lower.isle line 409.
5493                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5494                                 let expr1_0 =
5495                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
5496                                 let expr2_0 = constructor_or(ctx, pattern3_0, expr0_0, &expr1_0)?;
5497                                 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?;
5498                                 return Some(expr3_0);
5499                             }
5500                             // Rule at src/isa/x64/lower.isle line 402.
5501                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5502                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
5503                             let expr2_0 = constructor_or(ctx, pattern3_0, expr0_0, &expr1_0)?;
5504                             let expr3_0 = constructor_value_gpr(ctx, expr2_0)?;
5505                             return Some(expr3_0);
5506                         }
5507                         &Opcode::Bxor => {
5508                             let (pattern7_0, pattern7_1) =
5509                                 C::unpack_value_array_2(ctx, &pattern5_1);
5510                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
5511                                 // Rule at src/isa/x64/lower.isle line 505.
5512                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
5513                                 let expr1_0 =
5514                                     constructor_xor(ctx, pattern3_0, expr0_0, &pattern8_0)?;
5515                                 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?;
5516                                 return Some(expr2_0);
5517                             }
5518                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
5519                                 // Rule at src/isa/x64/lower.isle line 491.
5520                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
5521                                 let expr1_0 =
5522                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
5523                                 let expr2_0 = constructor_xor(ctx, pattern3_0, expr0_0, &expr1_0)?;
5524                                 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?;
5525                                 return Some(expr3_0);
5526                             }
5527                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
5528                                 // Rule at src/isa/x64/lower.isle line 499.
5529                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5530                                 let expr1_0 =
5531                                     constructor_xor(ctx, pattern3_0, expr0_0, &pattern8_0)?;
5532                                 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?;
5533                                 return Some(expr2_0);
5534                             }
5535                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
5536                                 // Rule at src/isa/x64/lower.isle line 485.
5537                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5538                                 let expr1_0 =
5539                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
5540                                 let expr2_0 = constructor_xor(ctx, pattern3_0, expr0_0, &expr1_0)?;
5541                                 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?;
5542                                 return Some(expr3_0);
5543                             }
5544                             // Rule at src/isa/x64/lower.isle line 478.
5545                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5546                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
5547                             let expr2_0 = constructor_xor(ctx, pattern3_0, expr0_0, &expr1_0)?;
5548                             let expr3_0 = constructor_value_gpr(ctx, expr2_0)?;
5549                             return Some(expr3_0);
5550                         }
5551                         &Opcode::Ishl => {
5552                             let (pattern7_0, pattern7_1) =
5553                                 C::unpack_value_array_2(ctx, &pattern5_1);
5554                             // Rule at src/isa/x64/lower.isle line 543.
5555                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5556                             let expr1_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0);
5557                             let expr2_0 = constructor_shl(ctx, pattern3_0, expr0_0, &expr1_0)?;
5558                             let expr3_0 = constructor_value_gpr(ctx, expr2_0)?;
5559                             return Some(expr3_0);
5560                         }
5561                         &Opcode::Ushr => {
5562                             let (pattern7_0, pattern7_1) =
5563                                 C::unpack_value_array_2(ctx, &pattern5_1);
5564                             // Rule at src/isa/x64/lower.isle line 655.
5565                             let expr0_0 = ExtendKind::Zero;
5566                             let expr1_0 =
5567                                 constructor_extend_to_gpr(ctx, pattern7_0, pattern3_0, &expr0_0)?;
5568                             let expr2_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0);
5569                             let expr3_0 = constructor_shr(ctx, pattern3_0, expr1_0, &expr2_0)?;
5570                             let expr4_0 = constructor_value_gpr(ctx, expr3_0)?;
5571                             return Some(expr4_0);
5572                         }
5573                         &Opcode::Sshr => {
5574                             let (pattern7_0, pattern7_1) =
5575                                 C::unpack_value_array_2(ctx, &pattern5_1);
5576                             // Rule at src/isa/x64/lower.isle line 767.
5577                             let expr0_0 = ExtendKind::Sign;
5578                             let expr1_0 =
5579                                 constructor_extend_to_gpr(ctx, pattern7_0, pattern3_0, &expr0_0)?;
5580                             let expr2_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0);
5581                             let expr3_0 = constructor_sar(ctx, pattern3_0, expr1_0, &expr2_0)?;
5582                             let expr4_0 = constructor_value_gpr(ctx, expr3_0)?;
5583                             return Some(expr4_0);
5584                         }
5585                         _ => {}
5586                     }
5587                 }
5588                 &InstructionData::Unary {
5589                     opcode: ref pattern5_0,
5590                     arg: pattern5_1,
5591                 } => {
5592                     match &pattern5_0 {
5593                         &Opcode::Ineg => {
5594                             // Rule at src/isa/x64/lower.isle line 972.
5595                             let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
5596                             let expr1_0 = constructor_neg(ctx, pattern3_0, expr0_0)?;
5597                             let expr2_0 = constructor_value_gpr(ctx, expr1_0)?;
5598                             return Some(expr2_0);
5599                         }
5600                         &Opcode::Bnot => {
5601                             // Rule at src/isa/x64/lower.isle line 1350.
5602                             let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
5603                             let expr1_0 = constructor_not(ctx, pattern3_0, expr0_0)?;
5604                             let expr2_0 = constructor_value_gpr(ctx, expr1_0)?;
5605                             return Some(expr2_0);
5606                         }
5607                         _ => {}
5608                     }
5609                 }
5610                 &InstructionData::BinaryImm64 {
5611                     opcode: ref pattern5_0,
5612                     arg: pattern5_1,
5613                     imm: pattern5_2,
5614                 } => {
5615                     if let &Opcode::IaddImm = &pattern5_0 {
5616                         let pattern7_0 = C::u64_from_imm64(ctx, pattern5_2);
5617                         // Rule at src/isa/x64/lower.isle line 218.
5618                         let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
5619                         let expr1_0 = constructor_imm(ctx, pattern3_0, pattern7_0)?;
5620                         let expr2_0 = C::gpr_new(ctx, expr1_0);
5621                         let expr3_0 = C::gpr_to_gpr_mem_imm(ctx, expr2_0);
5622                         let expr4_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr3_0)?;
5623                         let expr5_0 = constructor_value_gpr(ctx, expr4_0)?;
5624                         return Some(expr5_0);
5625                     }
5626                 }
5627                 _ => {}
5628             }
5629         }
5630         if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) {
5631             let pattern4_0 = C::inst_data(ctx, pattern0_0);
5632             if let &InstructionData::Binary {
5633                 opcode: ref pattern5_0,
5634                 args: ref pattern5_1,
5635             } = &pattern4_0
5636             {
5637                 match &pattern5_0 {
5638                     &Opcode::Rotl => {
5639                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1);
5640                         if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) {
5641                             let pattern9_0 = C::inst_data(ctx, pattern8_0);
5642                             if let &InstructionData::UnaryImm {
5643                                 opcode: ref pattern10_0,
5644                                 imm: pattern10_1,
5645                             } = &pattern9_0
5646                             {
5647                                 if let &Opcode::Iconst = &pattern10_0 {
5648                                     let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1);
5649                                     // Rule at src/isa/x64/lower.isle line 908.
5650                                     let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5651                                     let expr1_0 =
5652                                         C::const_to_type_masked_imm8(ctx, pattern12_0, pattern3_0);
5653                                     let expr2_0 =
5654                                         constructor_x64_rotl(ctx, pattern3_0, expr0_0, &expr1_0)?;
5655                                     let expr3_0 = constructor_value_gpr(ctx, expr2_0)?;
5656                                     return Some(expr3_0);
5657                                 }
5658                             }
5659                         }
5660                         // Rule at src/isa/x64/lower.isle line 902.
5661                         let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?;
5662                         let expr1_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5663                         let expr2_0 = C::gpr_to_imm8_gpr(ctx, expr0_0);
5664                         let expr3_0 = constructor_x64_rotl(ctx, pattern3_0, expr1_0, &expr2_0)?;
5665                         let expr4_0 = constructor_value_gpr(ctx, expr3_0)?;
5666                         return Some(expr4_0);
5667                     }
5668                     &Opcode::Rotr => {
5669                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1);
5670                         if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) {
5671                             let pattern9_0 = C::inst_data(ctx, pattern8_0);
5672                             if let &InstructionData::UnaryImm {
5673                                 opcode: ref pattern10_0,
5674                                 imm: pattern10_1,
5675                             } = &pattern9_0
5676                             {
5677                                 if let &Opcode::Iconst = &pattern10_0 {
5678                                     let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1);
5679                                     // Rule at src/isa/x64/lower.isle line 950.
5680                                     let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5681                                     let expr1_0 =
5682                                         C::const_to_type_masked_imm8(ctx, pattern12_0, pattern3_0);
5683                                     let expr2_0 =
5684                                         constructor_x64_rotr(ctx, pattern3_0, expr0_0, &expr1_0)?;
5685                                     let expr3_0 = constructor_value_gpr(ctx, expr2_0)?;
5686                                     return Some(expr3_0);
5687                                 }
5688                             }
5689                         }
5690                         // Rule at src/isa/x64/lower.isle line 944.
5691                         let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?;
5692                         let expr1_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5693                         let expr2_0 = C::gpr_to_imm8_gpr(ctx, expr0_0);
5694                         let expr3_0 = constructor_x64_rotr(ctx, pattern3_0, expr1_0, &expr2_0)?;
5695                         let expr4_0 = constructor_value_gpr(ctx, expr3_0)?;
5696                         return Some(expr4_0);
5697                     }
5698                     _ => {}
5699                 }
5700             }
5701         }
5702         if let Some(pattern3_0) = C::ty_8_or_16(ctx, pattern2_0) {
5703             let pattern4_0 = C::inst_data(ctx, pattern0_0);
5704             if let &InstructionData::Binary {
5705                 opcode: ref pattern5_0,
5706                 args: ref pattern5_1,
5707             } = &pattern4_0
5708             {
5709                 match &pattern5_0 {
5710                     &Opcode::Rotl => {
5711                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1);
5712                         if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) {
5713                             let pattern9_0 = C::inst_data(ctx, pattern8_0);
5714                             if let &InstructionData::UnaryImm {
5715                                 opcode: ref pattern10_0,
5716                                 imm: pattern10_1,
5717                             } = &pattern9_0
5718                             {
5719                                 if let &Opcode::Iconst = &pattern10_0 {
5720                                     let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1);
5721                                     // Rule at src/isa/x64/lower.isle line 893.
5722                                     let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5723                                     let expr1_0 =
5724                                         C::const_to_type_masked_imm8(ctx, pattern12_0, pattern3_0);
5725                                     let expr2_0 =
5726                                         constructor_x64_rotl(ctx, pattern3_0, expr0_0, &expr1_0)?;
5727                                     let expr3_0 = constructor_value_gpr(ctx, expr2_0)?;
5728                                     return Some(expr3_0);
5729                                 }
5730                             }
5731                         }
5732                         // Rule at src/isa/x64/lower.isle line 889.
5733                         let expr0_0: Type = I32;
5734                         let expr1_0 = ExtendKind::Zero;
5735                         let expr2_0 =
5736                             constructor_extend_to_gpr(ctx, pattern7_1, expr0_0, &expr1_0)?;
5737                         let expr3_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5738                         let expr4_0 = C::gpr_to_imm8_gpr(ctx, expr2_0);
5739                         let expr5_0 = constructor_x64_rotl(ctx, pattern3_0, expr3_0, &expr4_0)?;
5740                         let expr6_0 = constructor_value_gpr(ctx, expr5_0)?;
5741                         return Some(expr6_0);
5742                     }
5743                     &Opcode::Rotr => {
5744                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1);
5745                         if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) {
5746                             let pattern9_0 = C::inst_data(ctx, pattern8_0);
5747                             if let &InstructionData::UnaryImm {
5748                                 opcode: ref pattern10_0,
5749                                 imm: pattern10_1,
5750                             } = &pattern9_0
5751                             {
5752                                 if let &Opcode::Iconst = &pattern10_0 {
5753                                     let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1);
5754                                     // Rule at src/isa/x64/lower.isle line 935.
5755                                     let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5756                                     let expr1_0 =
5757                                         C::const_to_type_masked_imm8(ctx, pattern12_0, pattern3_0);
5758                                     let expr2_0 =
5759                                         constructor_x64_rotr(ctx, pattern3_0, expr0_0, &expr1_0)?;
5760                                     let expr3_0 = constructor_value_gpr(ctx, expr2_0)?;
5761                                     return Some(expr3_0);
5762                                 }
5763                             }
5764                         }
5765                         // Rule at src/isa/x64/lower.isle line 931.
5766                         let expr0_0: Type = I32;
5767                         let expr1_0 = ExtendKind::Zero;
5768                         let expr2_0 =
5769                             constructor_extend_to_gpr(ctx, pattern7_1, expr0_0, &expr1_0)?;
5770                         let expr3_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
5771                         let expr4_0 = C::gpr_to_imm8_gpr(ctx, expr2_0);
5772                         let expr5_0 = constructor_x64_rotr(ctx, pattern3_0, expr3_0, &expr4_0)?;
5773                         let expr6_0 = constructor_value_gpr(ctx, expr5_0)?;
5774                         return Some(expr6_0);
5775                     }
5776                     _ => {}
5777                 }
5778             }
5779         }
5780     }
5781     return None;
5782 }
5783 
5784 // Generated as internal constructor for term sse_and.
5785 pub fn constructor_sse_and<C: Context>(
5786     ctx: &mut C,
5787     arg0: Type,
5788     arg1: Xmm,
5789     arg2: &XmmMem,
5790 ) -> Option<Xmm> {
5791     let pattern0_0 = arg0;
5792     if pattern0_0 == F32X4 {
5793         let pattern2_0 = arg1;
5794         let pattern3_0 = arg2;
5795         // Rule at src/isa/x64/lower.isle line 364.
5796         let expr0_0 = constructor_andps(ctx, pattern2_0, pattern3_0)?;
5797         return Some(expr0_0);
5798     }
5799     if pattern0_0 == F64X2 {
5800         let pattern2_0 = arg1;
5801         let pattern3_0 = arg2;
5802         // Rule at src/isa/x64/lower.isle line 365.
5803         let expr0_0 = constructor_andpd(ctx, pattern2_0, pattern3_0)?;
5804         return Some(expr0_0);
5805     }
5806     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
5807         let pattern2_0 = arg1;
5808         let pattern3_0 = arg2;
5809         // Rule at src/isa/x64/lower.isle line 366.
5810         let expr0_0 = constructor_pand(ctx, pattern2_0, pattern3_0)?;
5811         return Some(expr0_0);
5812     }
5813     return None;
5814 }
5815 
5816 // Generated as internal constructor for term sse_or.
5817 pub fn constructor_sse_or<C: Context>(
5818     ctx: &mut C,
5819     arg0: Type,
5820     arg1: Xmm,
5821     arg2: &XmmMem,
5822 ) -> Option<Xmm> {
5823     let pattern0_0 = arg0;
5824     if pattern0_0 == F32X4 {
5825         let pattern2_0 = arg1;
5826         let pattern3_0 = arg2;
5827         // Rule at src/isa/x64/lower.isle line 438.
5828         let expr0_0 = constructor_orps(ctx, pattern2_0, pattern3_0)?;
5829         return Some(expr0_0);
5830     }
5831     if pattern0_0 == F64X2 {
5832         let pattern2_0 = arg1;
5833         let pattern3_0 = arg2;
5834         // Rule at src/isa/x64/lower.isle line 439.
5835         let expr0_0 = constructor_orpd(ctx, pattern2_0, pattern3_0)?;
5836         return Some(expr0_0);
5837     }
5838     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
5839         let pattern2_0 = arg1;
5840         let pattern3_0 = arg2;
5841         // Rule at src/isa/x64/lower.isle line 440.
5842         let expr0_0 = constructor_por(ctx, pattern2_0, pattern3_0)?;
5843         return Some(expr0_0);
5844     }
5845     return None;
5846 }
5847 
5848 // Generated as internal constructor for term or_i128.
5849 pub fn constructor_or_i128<C: Context>(
5850     ctx: &mut C,
5851     arg0: ValueRegs,
5852     arg1: ValueRegs,
5853 ) -> Option<ValueRegs> {
5854     let pattern0_0 = arg0;
5855     let pattern1_0 = arg1;
5856     // Rule at src/isa/x64/lower.isle line 451.
5857     let expr0_0: usize = 0;
5858     let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?;
5859     let expr2_0: usize = 1;
5860     let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?;
5861     let expr4_0: usize = 0;
5862     let expr5_0 = constructor_value_regs_get_gpr(ctx, pattern1_0, expr4_0)?;
5863     let expr6_0: usize = 1;
5864     let expr7_0 = constructor_value_regs_get_gpr(ctx, pattern1_0, expr6_0)?;
5865     let expr8_0: Type = I64;
5866     let expr9_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
5867     let expr10_0 = constructor_or(ctx, expr8_0, expr1_0, &expr9_0)?;
5868     let expr11_0: Type = I64;
5869     let expr12_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
5870     let expr13_0 = constructor_or(ctx, expr11_0, expr3_0, &expr12_0)?;
5871     let expr14_0 = constructor_value_gprs(ctx, expr10_0, expr13_0)?;
5872     return Some(expr14_0);
5873 }
5874 
5875 // Generated as internal constructor for term shl_i128.
5876 pub fn constructor_shl_i128<C: Context>(
5877     ctx: &mut C,
5878     arg0: ValueRegs,
5879     arg1: Gpr,
5880 ) -> Option<ValueRegs> {
5881     let pattern0_0 = arg0;
5882     let pattern1_0 = arg1;
5883     // Rule at src/isa/x64/lower.isle line 549.
5884     let expr0_0: usize = 0;
5885     let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?;
5886     let expr2_0: usize = 1;
5887     let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?;
5888     let expr4_0: Type = I64;
5889     let expr5_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
5890     let expr6_0 = constructor_shl(ctx, expr4_0, expr1_0, &expr5_0)?;
5891     let expr7_0: Type = I64;
5892     let expr8_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
5893     let expr9_0 = constructor_shl(ctx, expr7_0, expr3_0, &expr8_0)?;
5894     let expr10_0: Type = I64;
5895     let expr11_0: Type = I64;
5896     let expr12_0: Type = I64;
5897     let expr13_0: u64 = 64;
5898     let expr14_0 = constructor_imm(ctx, expr12_0, expr13_0)?;
5899     let expr15_0 = C::gpr_new(ctx, expr14_0);
5900     let expr16_0 = C::gpr_to_gpr_mem_imm(ctx, pattern1_0);
5901     let expr17_0 = constructor_sub(ctx, expr11_0, expr15_0, &expr16_0)?;
5902     let expr18_0 = C::gpr_to_imm8_gpr(ctx, expr17_0);
5903     let expr19_0 = constructor_shr(ctx, expr10_0, expr1_0, &expr18_0)?;
5904     let expr20_0: Type = I64;
5905     let expr21_0: u64 = 0;
5906     let expr22_0 = constructor_imm(ctx, expr20_0, expr21_0)?;
5907     let expr23_0 = C::gpr_new(ctx, expr22_0);
5908     let expr24_0 = OperandSize::Size64;
5909     let expr25_0: u32 = 127;
5910     let expr26_0 = RegMemImm::Imm { simm32: expr25_0 };
5911     let expr27_0 = C::gpr_mem_imm_new(ctx, &expr26_0);
5912     let expr28_0 = constructor_test(ctx, &expr24_0, &expr27_0, pattern1_0)?;
5913     let expr29_0: Type = I64;
5914     let expr30_0 = CC::Z;
5915     let expr31_0 = C::gpr_to_gpr_mem(ctx, expr23_0);
5916     let expr32_0 = constructor_cmove(ctx, expr29_0, &expr30_0, &expr31_0, expr19_0)?;
5917     let expr33_0 = constructor_with_flags_1(ctx, &expr28_0, &expr32_0)?;
5918     let expr34_0 = C::gpr_new(ctx, expr33_0);
5919     let expr35_0: Type = I64;
5920     let expr36_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
5921     let expr37_0 = constructor_or(ctx, expr35_0, expr34_0, &expr36_0)?;
5922     let expr38_0 = OperandSize::Size64;
5923     let expr39_0: u32 = 64;
5924     let expr40_0 = RegMemImm::Imm { simm32: expr39_0 };
5925     let expr41_0 = C::gpr_mem_imm_new(ctx, &expr40_0);
5926     let expr42_0 = constructor_test(ctx, &expr38_0, &expr41_0, pattern1_0)?;
5927     let expr43_0: Type = I64;
5928     let expr44_0 = CC::Z;
5929     let expr45_0 = C::gpr_to_gpr_mem(ctx, expr6_0);
5930     let expr46_0 = constructor_cmove(ctx, expr43_0, &expr44_0, &expr45_0, expr23_0)?;
5931     let expr47_0: Type = I64;
5932     let expr48_0 = CC::Z;
5933     let expr49_0 = C::gpr_to_gpr_mem(ctx, expr37_0);
5934     let expr50_0 = constructor_cmove(ctx, expr47_0, &expr48_0, &expr49_0, expr6_0)?;
5935     let expr51_0 = constructor_with_flags_2(ctx, &expr42_0, &expr46_0, &expr50_0)?;
5936     return Some(expr51_0);
5937 }
5938 
5939 // Generated as internal constructor for term ishl_i8x16_mask.
5940 pub fn constructor_ishl_i8x16_mask<C: Context>(
5941     ctx: &mut C,
5942     arg0: &RegMemImm,
5943 ) -> Option<SyntheticAmode> {
5944     let pattern0_0 = arg0;
5945     match pattern0_0 {
5946         &RegMemImm::Imm { simm32: pattern1_0 } => {
5947             // Rule at src/isa/x64/lower.isle line 615.
5948             let expr0_0 = C::ishl_i8x16_mask_for_const(ctx, pattern1_0);
5949             return Some(expr0_0);
5950         }
5951         &RegMemImm::Reg { reg: pattern1_0 } => {
5952             // Rule at src/isa/x64/lower.isle line 624.
5953             let expr0_0 = C::ishl_i8x16_mask_table(ctx);
5954             let expr1_0 = constructor_lea(ctx, &expr0_0)?;
5955             let expr2_0: Type = I64;
5956             let expr3_0 = C::gpr_new(ctx, pattern1_0);
5957             let expr4_0: u8 = 4;
5958             let expr5_0 = C::imm8_to_imm8_gpr(ctx, expr4_0);
5959             let expr6_0 = constructor_shl(ctx, expr2_0, expr3_0, &expr5_0)?;
5960             let expr7_0: u32 = 0;
5961             let expr8_0: u8 = 0;
5962             let expr9_0 = C::amode_imm_reg_reg_shift(ctx, expr7_0, expr1_0, expr6_0, expr8_0);
5963             let expr10_0 = C::amode_to_synthetic_amode(ctx, &expr9_0);
5964             return Some(expr10_0);
5965         }
5966         &RegMemImm::Mem {
5967             addr: ref pattern1_0,
5968         } => {
5969             // Rule at src/isa/x64/lower.isle line 634.
5970             let expr0_0: Type = I64;
5971             let expr1_0 = ExtKind::None;
5972             let expr2_0 = constructor_x64_load(ctx, expr0_0, &pattern1_0, &expr1_0)?;
5973             let expr3_0 = RegMemImm::Reg { reg: expr2_0 };
5974             let expr4_0 = constructor_ishl_i8x16_mask(ctx, &expr3_0)?;
5975             return Some(expr4_0);
5976         }
5977         _ => {}
5978     }
5979     return None;
5980 }
5981 
5982 // Generated as internal constructor for term shr_i128.
5983 pub fn constructor_shr_i128<C: Context>(
5984     ctx: &mut C,
5985     arg0: ValueRegs,
5986     arg1: Gpr,
5987 ) -> Option<ValueRegs> {
5988     let pattern0_0 = arg0;
5989     let pattern1_0 = arg1;
5990     // Rule at src/isa/x64/lower.isle line 662.
5991     let expr0_0: usize = 0;
5992     let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?;
5993     let expr2_0: usize = 1;
5994     let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?;
5995     let expr4_0: Type = I64;
5996     let expr5_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
5997     let expr6_0 = constructor_shr(ctx, expr4_0, expr1_0, &expr5_0)?;
5998     let expr7_0: Type = I64;
5999     let expr8_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
6000     let expr9_0 = constructor_shr(ctx, expr7_0, expr3_0, &expr8_0)?;
6001     let expr10_0: Type = I64;
6002     let expr11_0: Type = I64;
6003     let expr12_0: Type = I64;
6004     let expr13_0: u64 = 64;
6005     let expr14_0 = constructor_imm(ctx, expr12_0, expr13_0)?;
6006     let expr15_0 = C::gpr_new(ctx, expr14_0);
6007     let expr16_0 = C::gpr_to_gpr_mem_imm(ctx, pattern1_0);
6008     let expr17_0 = constructor_sub(ctx, expr11_0, expr15_0, &expr16_0)?;
6009     let expr18_0 = C::gpr_to_imm8_gpr(ctx, expr17_0);
6010     let expr19_0 = constructor_shl(ctx, expr10_0, expr3_0, &expr18_0)?;
6011     let expr20_0 = OperandSize::Size64;
6012     let expr21_0: u32 = 127;
6013     let expr22_0 = RegMemImm::Imm { simm32: expr21_0 };
6014     let expr23_0 = C::gpr_mem_imm_new(ctx, &expr22_0);
6015     let expr24_0 = constructor_test(ctx, &expr20_0, &expr23_0, pattern1_0)?;
6016     let expr25_0: Type = I64;
6017     let expr26_0 = CC::Z;
6018     let expr27_0: Type = I64;
6019     let expr28_0: u64 = 0;
6020     let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0)?;
6021     let expr30_0 = C::gpr_new(ctx, expr29_0);
6022     let expr31_0 = C::gpr_to_gpr_mem(ctx, expr30_0);
6023     let expr32_0 = constructor_cmove(ctx, expr25_0, &expr26_0, &expr31_0, expr19_0)?;
6024     let expr33_0 = constructor_with_flags_1(ctx, &expr24_0, &expr32_0)?;
6025     let expr34_0 = C::gpr_new(ctx, expr33_0);
6026     let expr35_0: Type = I64;
6027     let expr36_0 = C::gpr_to_gpr_mem_imm(ctx, expr6_0);
6028     let expr37_0 = constructor_or(ctx, expr35_0, expr34_0, &expr36_0)?;
6029     let expr38_0 = OperandSize::Size64;
6030     let expr39_0: u32 = 64;
6031     let expr40_0 = RegMemImm::Imm { simm32: expr39_0 };
6032     let expr41_0 = C::gpr_mem_imm_new(ctx, &expr40_0);
6033     let expr42_0 = constructor_test(ctx, &expr38_0, &expr41_0, pattern1_0)?;
6034     let expr43_0: Type = I64;
6035     let expr44_0 = CC::Z;
6036     let expr45_0 = C::gpr_to_gpr_mem(ctx, expr37_0);
6037     let expr46_0 = constructor_cmove(ctx, expr43_0, &expr44_0, &expr45_0, expr9_0)?;
6038     let expr47_0: Type = I64;
6039     let expr48_0 = CC::Z;
6040     let expr49_0 = C::gpr_to_gpr_mem(ctx, expr9_0);
6041     let expr50_0: Type = I64;
6042     let expr51_0: u64 = 0;
6043     let expr52_0 = constructor_imm(ctx, expr50_0, expr51_0)?;
6044     let expr53_0 = C::gpr_new(ctx, expr52_0);
6045     let expr54_0 = constructor_cmove(ctx, expr47_0, &expr48_0, &expr49_0, expr53_0)?;
6046     let expr55_0 = constructor_with_flags_2(ctx, &expr42_0, &expr46_0, &expr54_0)?;
6047     return Some(expr55_0);
6048 }
6049 
6050 // Generated as internal constructor for term ushr_i8x16_mask.
6051 pub fn constructor_ushr_i8x16_mask<C: Context>(
6052     ctx: &mut C,
6053     arg0: &RegMemImm,
6054 ) -> Option<SyntheticAmode> {
6055     let pattern0_0 = arg0;
6056     match pattern0_0 {
6057         &RegMemImm::Imm { simm32: pattern1_0 } => {
6058             // Rule at src/isa/x64/lower.isle line 727.
6059             let expr0_0 = C::ushr_i8x16_mask_for_const(ctx, pattern1_0);
6060             return Some(expr0_0);
6061         }
6062         &RegMemImm::Reg { reg: pattern1_0 } => {
6063             // Rule at src/isa/x64/lower.isle line 736.
6064             let expr0_0 = C::ushr_i8x16_mask_table(ctx);
6065             let expr1_0 = constructor_lea(ctx, &expr0_0)?;
6066             let expr2_0: Type = I64;
6067             let expr3_0 = C::gpr_new(ctx, pattern1_0);
6068             let expr4_0: u8 = 4;
6069             let expr5_0 = C::imm8_to_imm8_gpr(ctx, expr4_0);
6070             let expr6_0 = constructor_shl(ctx, expr2_0, expr3_0, &expr5_0)?;
6071             let expr7_0: u32 = 0;
6072             let expr8_0: u8 = 0;
6073             let expr9_0 = C::amode_imm_reg_reg_shift(ctx, expr7_0, expr1_0, expr6_0, expr8_0);
6074             let expr10_0 = C::amode_to_synthetic_amode(ctx, &expr9_0);
6075             return Some(expr10_0);
6076         }
6077         &RegMemImm::Mem {
6078             addr: ref pattern1_0,
6079         } => {
6080             // Rule at src/isa/x64/lower.isle line 746.
6081             let expr0_0: Type = I64;
6082             let expr1_0 = ExtKind::None;
6083             let expr2_0 = constructor_x64_load(ctx, expr0_0, &pattern1_0, &expr1_0)?;
6084             let expr3_0 = RegMemImm::Reg { reg: expr2_0 };
6085             let expr4_0 = constructor_ushr_i8x16_mask(ctx, &expr3_0)?;
6086             return Some(expr4_0);
6087         }
6088         _ => {}
6089     }
6090     return None;
6091 }
6092 
6093 // Generated as internal constructor for term sar_i128.
6094 pub fn constructor_sar_i128<C: Context>(
6095     ctx: &mut C,
6096     arg0: ValueRegs,
6097     arg1: Gpr,
6098 ) -> Option<ValueRegs> {
6099     let pattern0_0 = arg0;
6100     let pattern1_0 = arg1;
6101     // Rule at src/isa/x64/lower.isle line 774.
6102     let expr0_0: usize = 0;
6103     let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?;
6104     let expr2_0: usize = 1;
6105     let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?;
6106     let expr4_0: Type = I64;
6107     let expr5_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
6108     let expr6_0 = constructor_shr(ctx, expr4_0, expr1_0, &expr5_0)?;
6109     let expr7_0: Type = I64;
6110     let expr8_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
6111     let expr9_0 = constructor_sar(ctx, expr7_0, expr3_0, &expr8_0)?;
6112     let expr10_0: Type = I64;
6113     let expr11_0: Type = I64;
6114     let expr12_0: Type = I64;
6115     let expr13_0: u64 = 64;
6116     let expr14_0 = constructor_imm(ctx, expr12_0, expr13_0)?;
6117     let expr15_0 = C::gpr_new(ctx, expr14_0);
6118     let expr16_0 = C::gpr_to_gpr_mem_imm(ctx, pattern1_0);
6119     let expr17_0 = constructor_sub(ctx, expr11_0, expr15_0, &expr16_0)?;
6120     let expr18_0 = C::gpr_to_imm8_gpr(ctx, expr17_0);
6121     let expr19_0 = constructor_shl(ctx, expr10_0, expr3_0, &expr18_0)?;
6122     let expr20_0 = OperandSize::Size64;
6123     let expr21_0: u32 = 127;
6124     let expr22_0 = RegMemImm::Imm { simm32: expr21_0 };
6125     let expr23_0 = C::gpr_mem_imm_new(ctx, &expr22_0);
6126     let expr24_0 = constructor_test(ctx, &expr20_0, &expr23_0, pattern1_0)?;
6127     let expr25_0: Type = I64;
6128     let expr26_0 = CC::Z;
6129     let expr27_0: Type = I64;
6130     let expr28_0: u64 = 0;
6131     let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0)?;
6132     let expr30_0 = C::gpr_new(ctx, expr29_0);
6133     let expr31_0 = C::gpr_to_gpr_mem(ctx, expr30_0);
6134     let expr32_0 = constructor_cmove(ctx, expr25_0, &expr26_0, &expr31_0, expr19_0)?;
6135     let expr33_0 = constructor_with_flags_1(ctx, &expr24_0, &expr32_0)?;
6136     let expr34_0 = C::gpr_new(ctx, expr33_0);
6137     let expr35_0: Type = I64;
6138     let expr36_0 = C::gpr_to_gpr_mem_imm(ctx, expr34_0);
6139     let expr37_0 = constructor_or(ctx, expr35_0, expr6_0, &expr36_0)?;
6140     let expr38_0: Type = I64;
6141     let expr39_0: u8 = 63;
6142     let expr40_0 = C::imm8_to_imm8_gpr(ctx, expr39_0);
6143     let expr41_0 = constructor_sar(ctx, expr38_0, expr3_0, &expr40_0)?;
6144     let expr42_0 = OperandSize::Size64;
6145     let expr43_0: u32 = 64;
6146     let expr44_0 = RegMemImm::Imm { simm32: expr43_0 };
6147     let expr45_0 = C::gpr_mem_imm_new(ctx, &expr44_0);
6148     let expr46_0 = constructor_test(ctx, &expr42_0, &expr45_0, pattern1_0)?;
6149     let expr47_0: Type = I64;
6150     let expr48_0 = CC::Z;
6151     let expr49_0 = C::gpr_to_gpr_mem(ctx, expr37_0);
6152     let expr50_0 = constructor_cmove(ctx, expr47_0, &expr48_0, &expr49_0, expr9_0)?;
6153     let expr51_0: Type = I64;
6154     let expr52_0 = CC::Z;
6155     let expr53_0 = C::gpr_to_gpr_mem(ctx, expr9_0);
6156     let expr54_0 = constructor_cmove(ctx, expr51_0, &expr52_0, &expr53_0, expr41_0)?;
6157     let expr55_0 = constructor_with_flags_2(ctx, &expr46_0, &expr50_0, &expr54_0)?;
6158     return Some(expr55_0);
6159 }
6160 
6161 // Generated as internal constructor for term sshr_i8x16_bigger_shift.
6162 pub fn constructor_sshr_i8x16_bigger_shift<C: Context>(
6163     ctx: &mut C,
6164     arg0: Type,
6165     arg1: &RegMemImm,
6166 ) -> Option<XmmMemImm> {
6167     let pattern0_0 = arg0;
6168     let pattern1_0 = arg1;
6169     match pattern1_0 {
6170         &RegMemImm::Imm { simm32: pattern2_0 } => {
6171             // Rule at src/isa/x64/lower.isle line 844.
6172             let expr0_0: u32 = 8;
6173             let expr1_0 = C::u32_add(ctx, pattern2_0, expr0_0);
6174             let expr2_0 = RegMemImm::Imm { simm32: expr1_0 };
6175             let expr3_0 = C::xmm_mem_imm_new(ctx, &expr2_0);
6176             return Some(expr3_0);
6177         }
6178         &RegMemImm::Reg { reg: pattern2_0 } => {
6179             // Rule at src/isa/x64/lower.isle line 846.
6180             let expr0_0 = C::gpr_new(ctx, pattern2_0);
6181             let expr1_0: u32 = 8;
6182             let expr2_0 = RegMemImm::Imm { simm32: expr1_0 };
6183             let expr3_0 = C::gpr_mem_imm_new(ctx, &expr2_0);
6184             let expr4_0 = constructor_add(ctx, pattern0_0, expr0_0, &expr3_0)?;
6185             let expr5_0 = C::gpr_to_reg(ctx, expr4_0);
6186             let expr6_0 = RegMemImm::Reg { reg: expr5_0 };
6187             let expr7_0 = constructor_mov_rmi_to_xmm(ctx, &expr6_0)?;
6188             return Some(expr7_0);
6189         }
6190         &RegMemImm::Mem {
6191             addr: ref pattern2_0,
6192         } => {
6193             // Rule at src/isa/x64/lower.isle line 850.
6194             let expr0_0: u64 = 8;
6195             let expr1_0 = constructor_imm(ctx, pattern0_0, expr0_0)?;
6196             let expr2_0 = C::gpr_new(ctx, expr1_0);
6197             let expr3_0 = C::gpr_mem_imm_new(ctx, pattern1_0);
6198             let expr4_0 = constructor_add(ctx, pattern0_0, expr2_0, &expr3_0)?;
6199             let expr5_0 = C::gpr_to_reg(ctx, expr4_0);
6200             let expr6_0 = RegMemImm::Reg { reg: expr5_0 };
6201             let expr7_0 = constructor_mov_rmi_to_xmm(ctx, &expr6_0)?;
6202             return Some(expr7_0);
6203         }
6204         _ => {}
6205     }
6206     return None;
6207 }
6208 
6209 // Generated as internal constructor for term sse_and_not.
6210 pub fn constructor_sse_and_not<C: Context>(
6211     ctx: &mut C,
6212     arg0: Type,
6213     arg1: Xmm,
6214     arg2: &XmmMem,
6215 ) -> Option<Xmm> {
6216     let pattern0_0 = arg0;
6217     if pattern0_0 == F32X4 {
6218         let pattern2_0 = arg1;
6219         let pattern3_0 = arg2;
6220         // Rule at src/isa/x64/lower.isle line 1289.
6221         let expr0_0 = constructor_andnps(ctx, pattern2_0, pattern3_0)?;
6222         return Some(expr0_0);
6223     }
6224     if pattern0_0 == F64X2 {
6225         let pattern2_0 = arg1;
6226         let pattern3_0 = arg2;
6227         // Rule at src/isa/x64/lower.isle line 1290.
6228         let expr0_0 = constructor_andnpd(ctx, pattern2_0, pattern3_0)?;
6229         return Some(expr0_0);
6230     }
6231     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
6232         let pattern2_0 = arg1;
6233         let pattern3_0 = arg2;
6234         // Rule at src/isa/x64/lower.isle line 1291.
6235         let expr0_0 = constructor_pandn(ctx, pattern2_0, pattern3_0)?;
6236         return Some(expr0_0);
6237     }
6238     return None;
6239 }
6240 
6241 // Generated as internal constructor for term i128_not.
6242 pub fn constructor_i128_not<C: Context>(ctx: &mut C, arg0: Value) -> Option<ValueRegs> {
6243     let pattern0_0 = arg0;
6244     // Rule at src/isa/x64/lower.isle line 1356.
6245     let expr0_0 = C::put_in_regs(ctx, pattern0_0);
6246     let expr1_0: usize = 0;
6247     let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
6248     let expr3_0: usize = 1;
6249     let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
6250     let expr5_0: Type = I64;
6251     let expr6_0 = constructor_not(ctx, expr5_0, expr2_0)?;
6252     let expr7_0: Type = I64;
6253     let expr8_0 = constructor_not(ctx, expr7_0, expr4_0)?;
6254     let expr9_0 = constructor_value_gprs(ctx, expr6_0, expr8_0)?;
6255     return Some(expr9_0);
6256 }
6257 
6258 // Generated as internal constructor for term vec_insert_lane.
6259 pub fn constructor_vec_insert_lane<C: Context>(
6260     ctx: &mut C,
6261     arg0: Type,
6262     arg1: Xmm,
6263     arg2: &RegMem,
6264     arg3: u8,
6265 ) -> Option<Xmm> {
6266     let pattern0_0 = arg0;
6267     if pattern0_0 == I8X16 {
6268         let pattern2_0 = arg1;
6269         let pattern3_0 = arg2;
6270         let pattern4_0 = arg3;
6271         // Rule at src/isa/x64/lower.isle line 1410.
6272         let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0);
6273         let expr1_0 = constructor_pinsrb(ctx, pattern2_0, &expr0_0, pattern4_0)?;
6274         return Some(expr1_0);
6275     }
6276     if pattern0_0 == I16X8 {
6277         let pattern2_0 = arg1;
6278         let pattern3_0 = arg2;
6279         let pattern4_0 = arg3;
6280         // Rule at src/isa/x64/lower.isle line 1414.
6281         let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0);
6282         let expr1_0 = constructor_pinsrw(ctx, pattern2_0, &expr0_0, pattern4_0)?;
6283         return Some(expr1_0);
6284     }
6285     if pattern0_0 == I32X4 {
6286         let pattern2_0 = arg1;
6287         let pattern3_0 = arg2;
6288         let pattern4_0 = arg3;
6289         // Rule at src/isa/x64/lower.isle line 1418.
6290         let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0);
6291         let expr1_0 = OperandSize::Size32;
6292         let expr2_0 = constructor_pinsrd(ctx, pattern2_0, &expr0_0, pattern4_0, &expr1_0)?;
6293         return Some(expr2_0);
6294     }
6295     if pattern0_0 == I64X2 {
6296         let pattern2_0 = arg1;
6297         let pattern3_0 = arg2;
6298         let pattern4_0 = arg3;
6299         // Rule at src/isa/x64/lower.isle line 1422.
6300         let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0);
6301         let expr1_0 = OperandSize::Size64;
6302         let expr2_0 = constructor_pinsrd(ctx, pattern2_0, &expr0_0, pattern4_0, &expr1_0)?;
6303         return Some(expr2_0);
6304     }
6305     if pattern0_0 == F32X4 {
6306         let pattern2_0 = arg1;
6307         let pattern3_0 = arg2;
6308         let pattern4_0 = arg3;
6309         // Rule at src/isa/x64/lower.isle line 1426.
6310         let expr0_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0);
6311         let expr1_0 = C::sse_insertps_lane_imm(ctx, pattern4_0);
6312         let expr2_0 = constructor_insertps(ctx, pattern2_0, &expr0_0, expr1_0)?;
6313         return Some(expr2_0);
6314     }
6315     if pattern0_0 == F64X2 {
6316         let pattern2_0 = arg1;
6317         let pattern3_0 = arg2;
6318         if let &RegMem::Reg { reg: pattern4_0 } = pattern3_0 {
6319             let pattern5_0 = arg3;
6320             if pattern5_0 == 0 {
6321                 // Rule at src/isa/x64/lower.isle line 1448.
6322                 let expr0_0 = RegMem::Reg { reg: pattern4_0 };
6323                 let expr1_0 = C::reg_mem_to_xmm_mem(ctx, &expr0_0);
6324                 let expr2_0 = constructor_movsd(ctx, pattern2_0, &expr1_0)?;
6325                 return Some(expr2_0);
6326             }
6327         }
6328         let pattern4_0 = arg3;
6329         if pattern4_0 == 0 {
6330             // Rule at src/isa/x64/lower.isle line 1450.
6331             let expr0_0 = SseOpcode::Movsd;
6332             let expr1_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0);
6333             let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?;
6334             let expr3_0 = C::xmm_to_xmm_mem(ctx, expr2_0);
6335             let expr4_0 = constructor_movsd(ctx, pattern2_0, &expr3_0)?;
6336             return Some(expr4_0);
6337         }
6338         if pattern4_0 == 1 {
6339             // Rule at src/isa/x64/lower.isle line 1459.
6340             let expr0_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0);
6341             let expr1_0 = constructor_movlhps(ctx, pattern2_0, &expr0_0)?;
6342             return Some(expr1_0);
6343         }
6344     }
6345     return None;
6346 }
6347 
6348 // Generated as internal constructor for term cmp_and_choose.
6349 pub fn constructor_cmp_and_choose<C: Context>(
6350     ctx: &mut C,
6351     arg0: Type,
6352     arg1: &CC,
6353     arg2: Value,
6354     arg3: Value,
6355 ) -> Option<ValueRegs> {
6356     let pattern0_0 = arg0;
6357     if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) {
6358         let pattern2_0 = arg1;
6359         let pattern3_0 = arg2;
6360         let pattern4_0 = arg3;
6361         // Rule at src/isa/x64/lower.isle line 1467.
6362         let expr0_0 = constructor_put_in_gpr(ctx, pattern3_0)?;
6363         let expr1_0 = constructor_put_in_gpr(ctx, pattern4_0)?;
6364         let expr2_0 = C::raw_operand_size_of_type(ctx, pattern1_0);
6365         let expr3_0 = C::gpr_to_gpr_mem_imm(ctx, expr0_0);
6366         let expr4_0 = constructor_cmp(ctx, &expr2_0, &expr3_0, expr1_0)?;
6367         let expr5_0 = C::gpr_to_gpr_mem(ctx, expr1_0);
6368         let expr6_0 = constructor_cmove(ctx, pattern1_0, pattern2_0, &expr5_0, expr0_0)?;
6369         let expr7_0 = constructor_with_flags_1(ctx, &expr4_0, &expr6_0)?;
6370         let expr8_0 = C::value_reg(ctx, expr7_0);
6371         return Some(expr8_0);
6372     }
6373     return None;
6374 }
6375