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