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_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_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_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 xmm_load_const.
1235 pub fn constructor_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 add.
1283 pub fn constructor_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 add_with_flags_paired.
1299 pub fn constructor_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 adc_paired.
1328 pub fn constructor_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 sub.
1357 pub fn constructor_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 sub_with_flags_paired.
1373 pub fn constructor_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 sbb_paired.
1402 pub fn constructor_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 mul.
1431 pub fn constructor_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 or.
1488 pub fn constructor_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 xor.
1504 pub fn constructor_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 shl.
1718 pub fn constructor_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 shr.
1734 pub fn constructor_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 sar.
1750 pub fn constructor_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 cmp.
1789 pub fn constructor_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 cmp_imm.
1805 pub fn constructor_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 fpcmp.
1843 pub fn constructor_fpcmp<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 1543.
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 1547.
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 test.
1874 pub fn constructor_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 1552.
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 1559.
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 1567.
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 1578.
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 1602.
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 1599.
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 1609.
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 1621.
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 1636.
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 1658.
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 1655.
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 setcc.
2227 pub fn constructor_setcc<C: Context>(ctx: &mut C, arg0: &CC) -> Option<ConsumesFlags> {
2228     let pattern0_0 = arg0;
2229     // Rule at src/isa/x64/inst.isle line 1663.
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 movzx.
2244 pub fn constructor_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 1671.
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 movsx.
2266 pub fn constructor_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 1678.
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 1685.
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 paddb.
2313 pub fn constructor_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 1692.
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 paddw.
2324 pub fn constructor_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 1697.
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 paddd.
2335 pub fn constructor_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 1702.
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 paddq.
2346 pub fn constructor_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 1707.
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 paddsb.
2357 pub fn constructor_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 1712.
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 paddsw.
2368 pub fn constructor_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 1717.
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 paddusb.
2379 pub fn constructor_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 1722.
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 paddusw.
2390 pub fn constructor_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 1727.
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 psubb.
2401 pub fn constructor_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 1732.
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 psubw.
2412 pub fn constructor_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 1737.
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 psubd.
2423 pub fn constructor_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 1742.
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 psubq.
2434 pub fn constructor_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 1747.
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 psubsb.
2445 pub fn constructor_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 1752.
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 psubsw.
2456 pub fn constructor_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 1757.
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 psubusb.
2467 pub fn constructor_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 1762.
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 psubusw.
2478 pub fn constructor_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 1767.
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 pavgb.
2489 pub fn constructor_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 1772.
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 pavgw.
2500 pub fn constructor_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 1777.
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 pand.
2511 pub fn constructor_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 1782.
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 andps.
2522 pub fn constructor_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 1787.
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 andpd.
2533 pub fn constructor_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 1792.
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 por.
2544 pub fn constructor_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 1797.
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 orps.
2555 pub fn constructor_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 1802.
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 orpd.
2566 pub fn constructor_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 1807.
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 pxor.
2577 pub fn constructor_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 1812.
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 xorps.
2588 pub fn constructor_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 1817.
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 xorpd.
2599 pub fn constructor_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 1822.
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 pmullw.
2610 pub fn constructor_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 1827.
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 pmulld.
2621 pub fn constructor_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 1832.
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 pmulhw.
2632 pub fn constructor_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 1837.
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 pmulhuw.
2643 pub fn constructor_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 1842.
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 pmuldq.
2654 pub fn constructor_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 1847.
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 pmuludq.
2665 pub fn constructor_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 1852.
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 punpckhwd.
2676 pub fn constructor_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 1857.
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 punpcklwd.
2687 pub fn constructor_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 1862.
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 andnps.
2698 pub fn constructor_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 1867.
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 andnpd.
2709 pub fn constructor_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 1872.
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 pandn.
2720 pub fn constructor_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 1877.
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 addss.
2731 pub fn constructor_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 1882.
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 addsd.
2742 pub fn constructor_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 1887.
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 addps.
2753 pub fn constructor_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 1892.
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 addpd.
2764 pub fn constructor_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 1897.
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 subss.
2775 pub fn constructor_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 1902.
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 subsd.
2786 pub fn constructor_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 1907.
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 subps.
2797 pub fn constructor_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 1912.
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 subpd.
2808 pub fn constructor_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 1917.
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 mulss.
2819 pub fn constructor_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 1922.
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 mulsd.
2830 pub fn constructor_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 1927.
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 mulps.
2841 pub fn constructor_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 1932.
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 mulpd.
2852 pub fn constructor_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 1937.
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 divss.
2863 pub fn constructor_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 1942.
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 divsd.
2874 pub fn constructor_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 1947.
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 divps.
2885 pub fn constructor_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 1952.
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 divpd.
2896 pub fn constructor_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 1957.
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 1961.
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 1962.
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 1963.
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 1966.
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 1967.
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 1968.
2942         let expr0_0 = SseOpcode::Movdqa;
2943         return Some(expr0_0);
2944     }
2945     return None;
2946 }
2947 
2948 // Generated as internal constructor for term sse_blend.
2949 pub fn constructor_sse_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 1972.
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 blendvpd.
2975 pub fn constructor_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 1986.
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 movsd.
3001 pub fn constructor_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 2000.
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 movlhps.
3012 pub fn constructor_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 2005.
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 pmaxs.
3023 pub fn constructor_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 2010.
3034         let expr0_0 = constructor_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 2011.
3041         let expr0_0 = constructor_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 2012.
3048         let expr0_0 = constructor_pmaxsd(ctx, pattern2_0, pattern3_0)?;
3049         return Some(expr0_0);
3050     }
3051     return None;
3052 }
3053 
3054 // Generated as internal constructor for term pmaxsb.
3055 pub fn constructor_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 2015.
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 pmaxsw.
3066 pub fn constructor_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 2017.
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 pmaxsd.
3077 pub fn constructor_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 2019.
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 pmins.
3088 pub fn constructor_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 2023.
3099         let expr0_0 = constructor_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 2024.
3106         let expr0_0 = constructor_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 2025.
3113         let expr0_0 = constructor_pminsd(ctx, pattern2_0, pattern3_0)?;
3114         return Some(expr0_0);
3115     }
3116     return None;
3117 }
3118 
3119 // Generated as internal constructor for term pminsb.
3120 pub fn constructor_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 2028.
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 pminsw.
3131 pub fn constructor_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 2030.
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 pminsd.
3142 pub fn constructor_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 2032.
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 pmaxu.
3153 pub fn constructor_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 2036.
3164         let expr0_0 = constructor_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 2037.
3171         let expr0_0 = constructor_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 2038.
3178         let expr0_0 = constructor_pmaxud(ctx, pattern2_0, pattern3_0)?;
3179         return Some(expr0_0);
3180     }
3181     return None;
3182 }
3183 
3184 // Generated as internal constructor for term pmaxub.
3185 pub fn constructor_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 2041.
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 pmaxuw.
3196 pub fn constructor_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 2043.
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 pmaxud.
3207 pub fn constructor_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 2045.
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 pminu.
3218 pub fn constructor_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 2049.
3229         let expr0_0 = constructor_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 2050.
3236         let expr0_0 = constructor_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 2051.
3243         let expr0_0 = constructor_pminud(ctx, pattern2_0, pattern3_0)?;
3244         return Some(expr0_0);
3245     }
3246     return None;
3247 }
3248 
3249 // Generated as internal constructor for term pminub.
3250 pub fn constructor_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 2054.
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 pminuw.
3261 pub fn constructor_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 2056.
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 pminud.
3272 pub fn constructor_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 2058.
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 punpcklbw.
3283 pub fn constructor_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 2062.
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 punpckhbw.
3294 pub fn constructor_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 2067.
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 packsswb.
3305 pub fn constructor_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 2072.
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 2077.
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 palignr.
3346 pub fn constructor_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 2089.
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 cmpps.
3367 pub fn constructor_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 2098.
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 pinsrb.
3387 pub fn constructor_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 2107.
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 pinsrw.
3406 pub fn constructor_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 2116.
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 pinsrd.
3425 pub fn constructor_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 2125.
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 pmaddwd.
3446 pub fn constructor_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 2134.
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 insertps.
3464 pub fn constructor_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 2144.
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 pshufd.
3483 pub fn constructor_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 2153.
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 pshufb.
3512 pub fn constructor_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 2165.
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 2175.
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 pmovsxbw.
3550 pub fn constructor_pmovsxbw<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
3551     let pattern0_0 = arg0;
3552     // Rule at src/isa/x64/inst.isle line 2182.
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 pmovzxbw.
3559 pub fn constructor_pmovzxbw<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
3560     let pattern0_0 = arg0;
3561     // Rule at src/isa/x64/inst.isle line 2187.
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 pabsb.
3568 pub fn constructor_pabsb<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
3569     let pattern0_0 = arg0;
3570     // Rule at src/isa/x64/inst.isle line 2192.
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 pabsw.
3577 pub fn constructor_pabsw<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
3578     let pattern0_0 = arg0;
3579     // Rule at src/isa/x64/inst.isle line 2197.
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 pabsd.
3586 pub fn constructor_pabsd<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
3587     let pattern0_0 = arg0;
3588     // Rule at src/isa/x64/inst.isle line 2202.
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 2207.
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 vpabsq.
3615 pub fn constructor_vpabsq<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
3616     let pattern0_0 = arg0;
3617     // Rule at src/isa/x64/inst.isle line 2214.
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 vpopcntb.
3624 pub fn constructor_vpopcntb<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
3625     let pattern0_0 = arg0;
3626     // Rule at src/isa/x64/inst.isle line 2219.
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 2224.
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 vpmullq.
3656 pub fn constructor_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 2236.
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 2245.
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 2260.
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 2265.
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 psllw.
3736 pub fn constructor_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 2275.
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 pslld.
3746 pub fn constructor_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 2280.
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 psllq.
3756 pub fn constructor_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 2285.
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 psrlw.
3766 pub fn constructor_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 2290.
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 psrld.
3776 pub fn constructor_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 2295.
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 psrlq.
3786 pub fn constructor_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 2300.
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 psraw.
3796 pub fn constructor_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 2305.
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 psrad.
3806 pub fn constructor_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 2310.
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 pextrd.
3816 pub fn constructor_pextrd<C: Context>(ctx: &mut C, arg0: Type, arg1: Xmm, arg2: u8) -> Option<Gpr> {
3817     let pattern0_0 = arg0;
3818     let pattern1_0 = arg1;
3819     let pattern2_0 = arg2;
3820     // Rule at src/isa/x64/inst.isle line 2315.
3821     let expr0_0 = C::temp_writable_gpr(ctx);
3822     let expr1_0 = SseOpcode::Pextrd;
3823     let expr2_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
3824     let expr3_0 = C::xmm_to_reg(ctx, pattern1_0);
3825     let expr4_0 = constructor_xmm_to_reg_mem(ctx, expr3_0)?;
3826     let expr5_0 = C::xmm_mem_to_reg_mem(ctx, &expr4_0);
3827     let expr6_0 = C::writable_gpr_to_reg(ctx, expr0_0);
3828     let expr7_0 = C::lane_type(ctx, pattern0_0);
3829     let expr8_0 = C::operand_size_of_type_32_64(ctx, expr7_0);
3830     let expr9_0 = MInst::XmmRmRImm {
3831         op: expr1_0,
3832         src1: expr2_0,
3833         src2: expr5_0,
3834         dst: expr6_0,
3835         imm: pattern2_0,
3836         size: expr8_0,
3837     };
3838     let expr10_0 = C::emit(ctx, &expr9_0);
3839     let expr11_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
3840     return Some(expr11_0);
3841 }
3842 
3843 // Generated as internal constructor for term cmppd.
3844 pub fn constructor_cmppd<C: Context>(
3845     ctx: &mut C,
3846     arg0: Xmm,
3847     arg1: &XmmMem,
3848     arg2: &FcmpImm,
3849 ) -> Option<Xmm> {
3850     let pattern0_0 = arg0;
3851     let pattern1_0 = arg1;
3852     let pattern2_0 = arg2;
3853     // Rule at src/isa/x64/inst.isle line 2331.
3854     let expr0_0 = SseOpcode::Cmppd;
3855     let expr1_0 = C::xmm_to_reg(ctx, pattern0_0);
3856     let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0);
3857     let expr3_0 = C::encode_fcmp_imm(ctx, pattern2_0);
3858     let expr4_0 = OperandSize::Size32;
3859     let expr5_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, expr3_0, &expr4_0)?;
3860     return Some(expr5_0);
3861 }
3862 
3863 // Generated as internal constructor for term gpr_to_xmm.
3864 pub fn constructor_gpr_to_xmm<C: Context>(
3865     ctx: &mut C,
3866     arg0: &SseOpcode,
3867     arg1: &GprMem,
3868     arg2: &OperandSize,
3869 ) -> Option<Xmm> {
3870     let pattern0_0 = arg0;
3871     let pattern1_0 = arg1;
3872     let pattern2_0 = arg2;
3873     // Rule at src/isa/x64/inst.isle line 2340.
3874     let expr0_0 = C::temp_writable_xmm(ctx);
3875     let expr1_0 = MInst::GprToXmm {
3876         op: pattern0_0.clone(),
3877         src: pattern1_0.clone(),
3878         dst: expr0_0,
3879         src_size: pattern2_0.clone(),
3880     };
3881     let expr2_0 = C::emit(ctx, &expr1_0);
3882     let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
3883     return Some(expr3_0);
3884 }
3885 
3886 // Generated as internal constructor for term not.
3887 pub fn constructor_not<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
3888     let pattern0_0 = arg0;
3889     let pattern1_0 = arg1;
3890     // Rule at src/isa/x64/inst.isle line 2347.
3891     let expr0_0 = C::temp_writable_gpr(ctx);
3892     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
3893     let expr2_0 = MInst::Not {
3894         size: expr1_0,
3895         src: pattern1_0,
3896         dst: expr0_0,
3897     };
3898     let expr3_0 = C::emit(ctx, &expr2_0);
3899     let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
3900     return Some(expr4_0);
3901 }
3902 
3903 // Generated as internal constructor for term neg.
3904 pub fn constructor_neg<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
3905     let pattern0_0 = arg0;
3906     let pattern1_0 = arg1;
3907     // Rule at src/isa/x64/inst.isle line 2355.
3908     let expr0_0 = C::temp_writable_gpr(ctx);
3909     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
3910     let expr2_0 = MInst::Neg {
3911         size: expr1_0,
3912         src: pattern1_0,
3913         dst: expr0_0,
3914     };
3915     let expr3_0 = C::emit(ctx, &expr2_0);
3916     let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
3917     return Some(expr4_0);
3918 }
3919 
3920 // Generated as internal constructor for term lea.
3921 pub fn constructor_lea<C: Context>(ctx: &mut C, arg0: &SyntheticAmode) -> Option<Gpr> {
3922     let pattern0_0 = arg0;
3923     // Rule at src/isa/x64/inst.isle line 2362.
3924     let expr0_0 = C::temp_writable_gpr(ctx);
3925     let expr1_0 = MInst::LoadEffectiveAddress {
3926         addr: pattern0_0.clone(),
3927         dst: expr0_0,
3928     };
3929     let expr2_0 = C::emit(ctx, &expr1_0);
3930     let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
3931     return Some(expr3_0);
3932 }
3933 
3934 // Generated as internal constructor for term ud2.
3935 pub fn constructor_ud2<C: Context>(ctx: &mut C, arg0: &TrapCode) -> Option<SideEffectNoResult> {
3936     let pattern0_0 = arg0;
3937     // Rule at src/isa/x64/inst.isle line 2369.
3938     let expr0_0 = MInst::Ud2 {
3939         trap_code: pattern0_0.clone(),
3940     };
3941     let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 };
3942     return Some(expr1_0);
3943 }
3944 
3945 // Generated as internal constructor for term hlt.
3946 pub fn constructor_hlt<C: Context>(ctx: &mut C) -> Option<SideEffectNoResult> {
3947     // Rule at src/isa/x64/inst.isle line 2374.
3948     let expr0_0 = MInst::Hlt;
3949     let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 };
3950     return Some(expr1_0);
3951 }
3952 
3953 // Generated as internal constructor for term lzcnt.
3954 pub fn constructor_lzcnt<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
3955     let pattern0_0 = arg0;
3956     let pattern1_0 = arg1;
3957     // Rule at src/isa/x64/inst.isle line 2379.
3958     let expr0_0 = C::temp_writable_gpr(ctx);
3959     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
3960     let expr2_0 = UnaryRmROpcode::Lzcnt;
3961     let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0);
3962     let expr4_0 = MInst::UnaryRmR {
3963         size: expr1_0,
3964         op: expr2_0,
3965         src: expr3_0,
3966         dst: expr0_0,
3967     };
3968     let expr5_0 = C::emit(ctx, &expr4_0);
3969     let expr6_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
3970     return Some(expr6_0);
3971 }
3972 
3973 // Generated as internal constructor for term tzcnt.
3974 pub fn constructor_tzcnt<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
3975     let pattern0_0 = arg0;
3976     let pattern1_0 = arg1;
3977     // Rule at src/isa/x64/inst.isle line 2387.
3978     let expr0_0 = C::temp_writable_gpr(ctx);
3979     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
3980     let expr2_0 = UnaryRmROpcode::Tzcnt;
3981     let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0);
3982     let expr4_0 = MInst::UnaryRmR {
3983         size: expr1_0,
3984         op: expr2_0,
3985         src: expr3_0,
3986         dst: expr0_0,
3987     };
3988     let expr5_0 = C::emit(ctx, &expr4_0);
3989     let expr6_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
3990     return Some(expr6_0);
3991 }
3992 
3993 // Generated as internal constructor for term bsr.
3994 pub fn constructor_bsr<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<ProducesFlags> {
3995     let pattern0_0 = arg0;
3996     let pattern1_0 = arg1;
3997     // Rule at src/isa/x64/inst.isle line 2395.
3998     let expr0_0 = C::temp_writable_gpr(ctx);
3999     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
4000     let expr2_0 = UnaryRmROpcode::Bsr;
4001     let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0);
4002     let expr4_0 = MInst::UnaryRmR {
4003         size: expr1_0,
4004         op: expr2_0,
4005         src: expr3_0,
4006         dst: expr0_0,
4007     };
4008     let expr5_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
4009     let expr6_0 = ProducesFlags::ProducesFlagsReturnsReg {
4010         inst: expr4_0,
4011         result: expr5_0,
4012     };
4013     return Some(expr6_0);
4014 }
4015 
4016 // Generated as internal constructor for term bsr_or_else.
4017 pub fn constructor_bsr_or_else<C: Context>(
4018     ctx: &mut C,
4019     arg0: Type,
4020     arg1: Gpr,
4021     arg2: Gpr,
4022 ) -> Option<Gpr> {
4023     let pattern0_0 = arg0;
4024     let pattern1_0 = arg1;
4025     let pattern2_0 = arg2;
4026     // Rule at src/isa/x64/inst.isle line 2404.
4027     let expr0_0 = constructor_bsr(ctx, pattern0_0, pattern1_0)?;
4028     let expr1_0 = constructor_produces_flags_get_reg(ctx, &expr0_0)?;
4029     let expr2_0 = C::gpr_new(ctx, expr1_0);
4030     let expr3_0 = CC::Z;
4031     let expr4_0 = C::gpr_to_gpr_mem(ctx, pattern2_0);
4032     let expr5_0 = constructor_cmove(ctx, pattern0_0, &expr3_0, &expr4_0, expr2_0)?;
4033     let expr6_0 = constructor_produces_flags_ignore(ctx, &expr0_0)?;
4034     let expr7_0 = constructor_with_flags_reg(ctx, &expr6_0, &expr5_0)?;
4035     let expr8_0 = C::gpr_new(ctx, expr7_0);
4036     return Some(expr8_0);
4037 }
4038 
4039 // Generated as internal constructor for term bsf.
4040 pub fn constructor_bsf<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<ProducesFlags> {
4041     let pattern0_0 = arg0;
4042     let pattern1_0 = arg1;
4043     // Rule at src/isa/x64/inst.isle line 2415.
4044     let expr0_0 = C::temp_writable_gpr(ctx);
4045     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
4046     let expr2_0 = UnaryRmROpcode::Bsf;
4047     let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0);
4048     let expr4_0 = MInst::UnaryRmR {
4049         size: expr1_0,
4050         op: expr2_0,
4051         src: expr3_0,
4052         dst: expr0_0,
4053     };
4054     let expr5_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
4055     let expr6_0 = ProducesFlags::ProducesFlagsReturnsReg {
4056         inst: expr4_0,
4057         result: expr5_0,
4058     };
4059     return Some(expr6_0);
4060 }
4061 
4062 // Generated as internal constructor for term bsf_or_else.
4063 pub fn constructor_bsf_or_else<C: Context>(
4064     ctx: &mut C,
4065     arg0: Type,
4066     arg1: Gpr,
4067     arg2: Gpr,
4068 ) -> Option<Gpr> {
4069     let pattern0_0 = arg0;
4070     let pattern1_0 = arg1;
4071     let pattern2_0 = arg2;
4072     // Rule at src/isa/x64/inst.isle line 2424.
4073     let expr0_0 = constructor_bsf(ctx, pattern0_0, pattern1_0)?;
4074     let expr1_0 = constructor_produces_flags_get_reg(ctx, &expr0_0)?;
4075     let expr2_0 = C::gpr_new(ctx, expr1_0);
4076     let expr3_0 = CC::Z;
4077     let expr4_0 = C::gpr_to_gpr_mem(ctx, pattern2_0);
4078     let expr5_0 = constructor_cmove(ctx, pattern0_0, &expr3_0, &expr4_0, expr2_0)?;
4079     let expr6_0 = constructor_produces_flags_ignore(ctx, &expr0_0)?;
4080     let expr7_0 = constructor_with_flags_reg(ctx, &expr6_0, &expr5_0)?;
4081     let expr8_0 = C::gpr_new(ctx, expr7_0);
4082     return Some(expr8_0);
4083 }
4084 
4085 // Generated as internal constructor for term x64_popcnt.
4086 pub fn constructor_x64_popcnt<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
4087     let pattern0_0 = arg0;
4088     let pattern1_0 = arg1;
4089     // Rule at src/isa/x64/inst.isle line 2435.
4090     let expr0_0 = C::temp_writable_gpr(ctx);
4091     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
4092     let expr2_0 = UnaryRmROpcode::Popcnt;
4093     let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0);
4094     let expr4_0 = MInst::UnaryRmR {
4095         size: expr1_0,
4096         op: expr2_0,
4097         src: expr3_0,
4098         dst: expr0_0,
4099     };
4100     let expr5_0 = C::emit(ctx, &expr4_0);
4101     let expr6_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
4102     return Some(expr6_0);
4103 }
4104 
4105 // Generated as internal constructor for term xmm_min_max_seq.
4106 pub fn constructor_xmm_min_max_seq<C: Context>(
4107     ctx: &mut C,
4108     arg0: Type,
4109     arg1: bool,
4110     arg2: Xmm,
4111     arg3: Xmm,
4112 ) -> Option<Xmm> {
4113     let pattern0_0 = arg0;
4114     let pattern1_0 = arg1;
4115     let pattern2_0 = arg2;
4116     let pattern3_0 = arg3;
4117     // Rule at src/isa/x64/inst.isle line 2443.
4118     let expr0_0 = C::temp_writable_xmm(ctx);
4119     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
4120     let expr2_0 = MInst::XmmMinMaxSeq {
4121         size: expr1_0,
4122         is_min: pattern1_0,
4123         lhs: pattern2_0,
4124         rhs: pattern3_0,
4125         dst: expr0_0,
4126     };
4127     let expr3_0 = C::emit(ctx, &expr2_0);
4128     let expr4_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4129     return Some(expr4_0);
4130 }
4131 
4132 // Generated as internal constructor for term minss.
4133 pub fn constructor_minss<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
4134     let pattern0_0 = arg0;
4135     let pattern1_0 = arg1;
4136     // Rule at src/isa/x64/inst.isle line 2451.
4137     let expr0_0 = C::temp_writable_xmm(ctx);
4138     let expr1_0 = SseOpcode::Minss;
4139     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
4140     let expr3_0 = MInst::XmmRmR {
4141         op: expr1_0,
4142         src1: pattern0_0,
4143         src2: expr2_0,
4144         dst: expr0_0,
4145     };
4146     let expr4_0 = C::emit(ctx, &expr3_0);
4147     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4148     return Some(expr5_0);
4149 }
4150 
4151 // Generated as internal constructor for term minsd.
4152 pub fn constructor_minsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
4153     let pattern0_0 = arg0;
4154     let pattern1_0 = arg1;
4155     // Rule at src/isa/x64/inst.isle line 2458.
4156     let expr0_0 = C::temp_writable_xmm(ctx);
4157     let expr1_0 = SseOpcode::Minsd;
4158     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
4159     let expr3_0 = MInst::XmmRmR {
4160         op: expr1_0,
4161         src1: pattern0_0,
4162         src2: expr2_0,
4163         dst: expr0_0,
4164     };
4165     let expr4_0 = C::emit(ctx, &expr3_0);
4166     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4167     return Some(expr5_0);
4168 }
4169 
4170 // Generated as internal constructor for term minps.
4171 pub fn constructor_minps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
4172     let pattern0_0 = arg0;
4173     let pattern1_0 = arg1;
4174     // Rule at src/isa/x64/inst.isle line 2466.
4175     let expr0_0 = C::temp_writable_xmm(ctx);
4176     let expr1_0 = SseOpcode::Minps;
4177     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
4178     let expr3_0 = MInst::XmmRmR {
4179         op: expr1_0,
4180         src1: pattern0_0,
4181         src2: expr2_0,
4182         dst: expr0_0,
4183     };
4184     let expr4_0 = C::emit(ctx, &expr3_0);
4185     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4186     return Some(expr5_0);
4187 }
4188 
4189 // Generated as internal constructor for term minpd.
4190 pub fn constructor_minpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
4191     let pattern0_0 = arg0;
4192     let pattern1_0 = arg1;
4193     // Rule at src/isa/x64/inst.isle line 2473.
4194     let expr0_0 = C::temp_writable_xmm(ctx);
4195     let expr1_0 = SseOpcode::Minpd;
4196     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
4197     let expr3_0 = MInst::XmmRmR {
4198         op: expr1_0,
4199         src1: pattern0_0,
4200         src2: expr2_0,
4201         dst: expr0_0,
4202     };
4203     let expr4_0 = C::emit(ctx, &expr3_0);
4204     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4205     return Some(expr5_0);
4206 }
4207 
4208 // Generated as internal constructor for term maxss.
4209 pub fn constructor_maxss<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
4210     let pattern0_0 = arg0;
4211     let pattern1_0 = arg1;
4212     // Rule at src/isa/x64/inst.isle line 2480.
4213     let expr0_0 = C::temp_writable_xmm(ctx);
4214     let expr1_0 = SseOpcode::Maxss;
4215     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
4216     let expr3_0 = MInst::XmmRmR {
4217         op: expr1_0,
4218         src1: pattern0_0,
4219         src2: expr2_0,
4220         dst: expr0_0,
4221     };
4222     let expr4_0 = C::emit(ctx, &expr3_0);
4223     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4224     return Some(expr5_0);
4225 }
4226 
4227 // Generated as internal constructor for term maxsd.
4228 pub fn constructor_maxsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
4229     let pattern0_0 = arg0;
4230     let pattern1_0 = arg1;
4231     // Rule at src/isa/x64/inst.isle line 2487.
4232     let expr0_0 = C::temp_writable_xmm(ctx);
4233     let expr1_0 = SseOpcode::Maxsd;
4234     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
4235     let expr3_0 = MInst::XmmRmR {
4236         op: expr1_0,
4237         src1: pattern0_0,
4238         src2: expr2_0,
4239         dst: expr0_0,
4240     };
4241     let expr4_0 = C::emit(ctx, &expr3_0);
4242     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4243     return Some(expr5_0);
4244 }
4245 
4246 // Generated as internal constructor for term maxps.
4247 pub fn constructor_maxps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
4248     let pattern0_0 = arg0;
4249     let pattern1_0 = arg1;
4250     // Rule at src/isa/x64/inst.isle line 2494.
4251     let expr0_0 = C::temp_writable_xmm(ctx);
4252     let expr1_0 = SseOpcode::Maxps;
4253     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
4254     let expr3_0 = MInst::XmmRmR {
4255         op: expr1_0,
4256         src1: pattern0_0,
4257         src2: expr2_0,
4258         dst: expr0_0,
4259     };
4260     let expr4_0 = C::emit(ctx, &expr3_0);
4261     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4262     return Some(expr5_0);
4263 }
4264 
4265 // Generated as internal constructor for term maxpd.
4266 pub fn constructor_maxpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
4267     let pattern0_0 = arg0;
4268     let pattern1_0 = arg1;
4269     // Rule at src/isa/x64/inst.isle line 2501.
4270     let expr0_0 = C::temp_writable_xmm(ctx);
4271     let expr1_0 = SseOpcode::Maxpd;
4272     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
4273     let expr3_0 = MInst::XmmRmR {
4274         op: expr1_0,
4275         src1: pattern0_0,
4276         src2: expr2_0,
4277         dst: expr0_0,
4278     };
4279     let expr4_0 = C::emit(ctx, &expr3_0);
4280     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4281     return Some(expr5_0);
4282 }
4283 
4284 // Generated as internal constructor for term pcmpeq.
4285 pub fn constructor_pcmpeq<C: Context>(
4286     ctx: &mut C,
4287     arg0: Type,
4288     arg1: Xmm,
4289     arg2: &XmmMem,
4290 ) -> Option<Xmm> {
4291     let pattern0_0 = arg0;
4292     if pattern0_0 == I8X16 {
4293         let pattern2_0 = arg1;
4294         let pattern3_0 = arg2;
4295         // Rule at src/isa/x64/inst.isle line 2508.
4296         let expr0_0 = constructor_pcmpeqb(ctx, pattern2_0, pattern3_0)?;
4297         return Some(expr0_0);
4298     }
4299     if pattern0_0 == I16X8 {
4300         let pattern2_0 = arg1;
4301         let pattern3_0 = arg2;
4302         // Rule at src/isa/x64/inst.isle line 2509.
4303         let expr0_0 = constructor_pcmpeqw(ctx, pattern2_0, pattern3_0)?;
4304         return Some(expr0_0);
4305     }
4306     if pattern0_0 == I32X4 {
4307         let pattern2_0 = arg1;
4308         let pattern3_0 = arg2;
4309         // Rule at src/isa/x64/inst.isle line 2510.
4310         let expr0_0 = constructor_pcmpeqd(ctx, pattern2_0, pattern3_0)?;
4311         return Some(expr0_0);
4312     }
4313     if pattern0_0 == I64X2 {
4314         let pattern2_0 = arg1;
4315         let pattern3_0 = arg2;
4316         // Rule at src/isa/x64/inst.isle line 2511.
4317         let expr0_0 = constructor_pcmpeqq(ctx, pattern2_0, pattern3_0)?;
4318         return Some(expr0_0);
4319     }
4320     return None;
4321 }
4322 
4323 // Generated as internal constructor for term pcmpeqb.
4324 pub fn constructor_pcmpeqb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
4325     let pattern0_0 = arg0;
4326     let pattern1_0 = arg1;
4327     // Rule at src/isa/x64/inst.isle line 2514.
4328     let expr0_0: Type = I8X16;
4329     let expr1_0 = SseOpcode::Pcmpeqb;
4330     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
4331     return Some(expr2_0);
4332 }
4333 
4334 // Generated as internal constructor for term pcmpeqw.
4335 pub fn constructor_pcmpeqw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
4336     let pattern0_0 = arg0;
4337     let pattern1_0 = arg1;
4338     // Rule at src/isa/x64/inst.isle line 2516.
4339     let expr0_0: Type = I16X8;
4340     let expr1_0 = SseOpcode::Pcmpeqw;
4341     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
4342     return Some(expr2_0);
4343 }
4344 
4345 // Generated as internal constructor for term pcmpeqd.
4346 pub fn constructor_pcmpeqd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
4347     let pattern0_0 = arg0;
4348     let pattern1_0 = arg1;
4349     // Rule at src/isa/x64/inst.isle line 2518.
4350     let expr0_0: Type = I32X4;
4351     let expr1_0 = SseOpcode::Pcmpeqd;
4352     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
4353     return Some(expr2_0);
4354 }
4355 
4356 // Generated as internal constructor for term pcmpeqq.
4357 pub fn constructor_pcmpeqq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
4358     let pattern0_0 = arg0;
4359     let pattern1_0 = arg1;
4360     // Rule at src/isa/x64/inst.isle line 2520.
4361     let expr0_0: Type = I64X2;
4362     let expr1_0 = SseOpcode::Pcmpeqq;
4363     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
4364     return Some(expr2_0);
4365 }
4366 
4367 // Generated as internal constructor for term pcmpgt.
4368 pub fn constructor_pcmpgt<C: Context>(
4369     ctx: &mut C,
4370     arg0: Type,
4371     arg1: Xmm,
4372     arg2: &XmmMem,
4373 ) -> Option<Xmm> {
4374     let pattern0_0 = arg0;
4375     if pattern0_0 == I8X16 {
4376         let pattern2_0 = arg1;
4377         let pattern3_0 = arg2;
4378         // Rule at src/isa/x64/inst.isle line 2524.
4379         let expr0_0 = constructor_pcmpgtb(ctx, pattern2_0, pattern3_0)?;
4380         return Some(expr0_0);
4381     }
4382     if pattern0_0 == I16X8 {
4383         let pattern2_0 = arg1;
4384         let pattern3_0 = arg2;
4385         // Rule at src/isa/x64/inst.isle line 2525.
4386         let expr0_0 = constructor_pcmpgtw(ctx, pattern2_0, pattern3_0)?;
4387         return Some(expr0_0);
4388     }
4389     if pattern0_0 == I32X4 {
4390         let pattern2_0 = arg1;
4391         let pattern3_0 = arg2;
4392         // Rule at src/isa/x64/inst.isle line 2526.
4393         let expr0_0 = constructor_pcmpgtd(ctx, pattern2_0, pattern3_0)?;
4394         return Some(expr0_0);
4395     }
4396     if pattern0_0 == I64X2 {
4397         let pattern2_0 = arg1;
4398         let pattern3_0 = arg2;
4399         // Rule at src/isa/x64/inst.isle line 2527.
4400         let expr0_0 = constructor_pcmpgtq(ctx, pattern2_0, pattern3_0)?;
4401         return Some(expr0_0);
4402     }
4403     return None;
4404 }
4405 
4406 // Generated as internal constructor for term pcmpgtb.
4407 pub fn constructor_pcmpgtb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
4408     let pattern0_0 = arg0;
4409     let pattern1_0 = arg1;
4410     // Rule at src/isa/x64/inst.isle line 2530.
4411     let expr0_0: Type = I8X16;
4412     let expr1_0 = SseOpcode::Pcmpgtb;
4413     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
4414     return Some(expr2_0);
4415 }
4416 
4417 // Generated as internal constructor for term pcmpgtw.
4418 pub fn constructor_pcmpgtw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
4419     let pattern0_0 = arg0;
4420     let pattern1_0 = arg1;
4421     // Rule at src/isa/x64/inst.isle line 2532.
4422     let expr0_0: Type = I16X8;
4423     let expr1_0 = SseOpcode::Pcmpgtw;
4424     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
4425     return Some(expr2_0);
4426 }
4427 
4428 // Generated as internal constructor for term pcmpgtd.
4429 pub fn constructor_pcmpgtd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
4430     let pattern0_0 = arg0;
4431     let pattern1_0 = arg1;
4432     // Rule at src/isa/x64/inst.isle line 2534.
4433     let expr0_0: Type = I32X4;
4434     let expr1_0 = SseOpcode::Pcmpgtd;
4435     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
4436     return Some(expr2_0);
4437 }
4438 
4439 // Generated as internal constructor for term pcmpgtq.
4440 pub fn constructor_pcmpgtq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
4441     let pattern0_0 = arg0;
4442     let pattern1_0 = arg1;
4443     // Rule at src/isa/x64/inst.isle line 2536.
4444     let expr0_0: Type = I64X2;
4445     let expr1_0 = SseOpcode::Pcmpgtq;
4446     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
4447     return Some(expr2_0);
4448 }
4449 
4450 // Generated as internal constructor for term reg_to_xmm_mem.
4451 pub fn constructor_reg_to_xmm_mem<C: Context>(ctx: &mut C, arg0: Reg) -> Option<XmmMem> {
4452     let pattern0_0 = arg0;
4453     // Rule at src/isa/x64/inst.isle line 2590.
4454     let expr0_0 = C::xmm_new(ctx, pattern0_0);
4455     let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
4456     return Some(expr1_0);
4457 }
4458 
4459 // Generated as internal constructor for term xmm_to_reg_mem.
4460 pub fn constructor_xmm_to_reg_mem<C: Context>(ctx: &mut C, arg0: Reg) -> Option<XmmMem> {
4461     let pattern0_0 = arg0;
4462     // Rule at src/isa/x64/inst.isle line 2593.
4463     let expr0_0 = C::xmm_new(ctx, pattern0_0);
4464     let expr1_0 = C::xmm_to_reg(ctx, expr0_0);
4465     let expr2_0 = RegMem::Reg { reg: expr1_0 };
4466     let expr3_0 = C::reg_mem_to_xmm_mem(ctx, &expr2_0);
4467     return Some(expr3_0);
4468 }
4469 
4470 // Generated as internal constructor for term writable_gpr_to_r_reg.
4471 pub fn constructor_writable_gpr_to_r_reg<C: Context>(
4472     ctx: &mut C,
4473     arg0: WritableGpr,
4474 ) -> Option<Reg> {
4475     let pattern0_0 = arg0;
4476     // Rule at src/isa/x64/inst.isle line 2597.
4477     let expr0_0 = C::writable_gpr_to_reg(ctx, pattern0_0);
4478     let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0);
4479     return Some(expr1_0);
4480 }
4481 
4482 // Generated as internal constructor for term writable_gpr_to_gpr_mem.
4483 pub fn constructor_writable_gpr_to_gpr_mem<C: Context>(
4484     ctx: &mut C,
4485     arg0: WritableGpr,
4486 ) -> Option<GprMem> {
4487     let pattern0_0 = arg0;
4488     // Rule at src/isa/x64/inst.isle line 2600.
4489     let expr0_0 = C::writable_gpr_to_gpr(ctx, pattern0_0);
4490     let expr1_0 = C::gpr_to_gpr_mem(ctx, expr0_0);
4491     return Some(expr1_0);
4492 }
4493 
4494 // Generated as internal constructor for term writable_gpr_to_value_regs.
4495 pub fn constructor_writable_gpr_to_value_regs<C: Context>(
4496     ctx: &mut C,
4497     arg0: WritableGpr,
4498 ) -> Option<ValueRegs> {
4499     let pattern0_0 = arg0;
4500     // Rule at src/isa/x64/inst.isle line 2603.
4501     let expr0_0 = constructor_writable_gpr_to_r_reg(ctx, pattern0_0)?;
4502     let expr1_0 = C::value_reg(ctx, expr0_0);
4503     return Some(expr1_0);
4504 }
4505 
4506 // Generated as internal constructor for term writable_xmm_to_r_reg.
4507 pub fn constructor_writable_xmm_to_r_reg<C: Context>(
4508     ctx: &mut C,
4509     arg0: WritableXmm,
4510 ) -> Option<Reg> {
4511     let pattern0_0 = arg0;
4512     // Rule at src/isa/x64/inst.isle line 2606.
4513     let expr0_0 = C::writable_xmm_to_reg(ctx, pattern0_0);
4514     let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0);
4515     return Some(expr1_0);
4516 }
4517 
4518 // Generated as internal constructor for term writable_xmm_to_xmm_mem.
4519 pub fn constructor_writable_xmm_to_xmm_mem<C: Context>(
4520     ctx: &mut C,
4521     arg0: WritableXmm,
4522 ) -> Option<XmmMem> {
4523     let pattern0_0 = arg0;
4524     // Rule at src/isa/x64/inst.isle line 2609.
4525     let expr0_0 = C::writable_xmm_to_xmm(ctx, pattern0_0);
4526     let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
4527     return Some(expr1_0);
4528 }
4529 
4530 // Generated as internal constructor for term writable_xmm_to_value_regs.
4531 pub fn constructor_writable_xmm_to_value_regs<C: Context>(
4532     ctx: &mut C,
4533     arg0: WritableXmm,
4534 ) -> Option<ValueRegs> {
4535     let pattern0_0 = arg0;
4536     // Rule at src/isa/x64/inst.isle line 2612.
4537     let expr0_0 = constructor_writable_xmm_to_r_reg(ctx, pattern0_0)?;
4538     let expr1_0 = C::value_reg(ctx, expr0_0);
4539     return Some(expr1_0);
4540 }
4541 
4542 // Generated as internal constructor for term synthetic_amode_to_gpr_mem.
4543 pub fn constructor_synthetic_amode_to_gpr_mem<C: Context>(
4544     ctx: &mut C,
4545     arg0: &SyntheticAmode,
4546 ) -> Option<GprMem> {
4547     let pattern0_0 = arg0;
4548     // Rule at src/isa/x64/inst.isle line 2616.
4549     let expr0_0 = C::synthetic_amode_to_reg_mem(ctx, pattern0_0);
4550     let expr1_0 = C::reg_mem_to_gpr_mem(ctx, &expr0_0);
4551     return Some(expr1_0);
4552 }
4553 
4554 // Generated as internal constructor for term synthetic_amode_to_xmm_mem.
4555 pub fn constructor_synthetic_amode_to_xmm_mem<C: Context>(
4556     ctx: &mut C,
4557     arg0: &SyntheticAmode,
4558 ) -> Option<XmmMem> {
4559     let pattern0_0 = arg0;
4560     // Rule at src/isa/x64/inst.isle line 2619.
4561     let expr0_0 = C::synthetic_amode_to_reg_mem(ctx, pattern0_0);
4562     let expr1_0 = C::reg_mem_to_xmm_mem(ctx, &expr0_0);
4563     return Some(expr1_0);
4564 }
4565 
4566 // Generated as internal constructor for term lower.
4567 pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutput> {
4568     let pattern0_0 = arg0;
4569     if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) {
4570         let pattern2_0 = C::value_type(ctx, pattern1_0);
4571         if pattern2_0 == I128 {
4572             if let Some(()) = C::use_popcnt(ctx, pattern2_0) {
4573                 let pattern5_0 = C::inst_data(ctx, pattern0_0);
4574                 if let &InstructionData::Unary {
4575                     opcode: ref pattern6_0,
4576                     arg: pattern6_1,
4577                 } = &pattern5_0
4578                 {
4579                     if let &Opcode::Popcnt = pattern6_0 {
4580                         // Rule at src/isa/x64/lower.isle line 1729.
4581                         let expr0_0: Type = I64;
4582                         let expr1_0 = C::put_in_regs(ctx, pattern6_1);
4583                         let expr2_0: usize = 0;
4584                         let expr3_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr2_0)?;
4585                         let expr4_0 = constructor_x64_popcnt(ctx, expr0_0, expr3_0)?;
4586                         let expr5_0: Type = I64;
4587                         let expr6_0 = C::put_in_regs(ctx, pattern6_1);
4588                         let expr7_0: usize = 1;
4589                         let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0)?;
4590                         let expr9_0 = constructor_x64_popcnt(ctx, expr5_0, expr8_0)?;
4591                         let expr10_0: Type = I64;
4592                         let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
4593                         let expr12_0 = constructor_add(ctx, expr10_0, expr4_0, &expr11_0)?;
4594                         let expr13_0 = C::gpr_to_reg(ctx, expr12_0);
4595                         let expr14_0: Type = I64;
4596                         let expr15_0: u64 = 0;
4597                         let expr16_0 = constructor_imm(ctx, expr14_0, expr15_0)?;
4598                         let expr17_0 = C::value_regs(ctx, expr13_0, expr16_0);
4599                         let expr18_0 = C::output(ctx, expr17_0);
4600                         return Some(expr18_0);
4601                     }
4602                 }
4603             }
4604         }
4605         if pattern2_0 == I8X16 {
4606             if let Some(()) = C::avx512vl_enabled(ctx, pattern2_0) {
4607                 if let Some(()) = C::avx512bitalg_enabled(ctx, pattern2_0) {
4608                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
4609                     if let &InstructionData::Unary {
4610                         opcode: ref pattern7_0,
4611                         arg: pattern7_1,
4612                     } = &pattern6_0
4613                     {
4614                         if let &Opcode::Popcnt = pattern7_0 {
4615                             // Rule at src/isa/x64/lower.isle line 1821.
4616                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
4617                             let expr1_0 = constructor_vpopcntb(ctx, &expr0_0)?;
4618                             let expr2_0 = constructor_output_xmm(ctx, expr1_0)?;
4619                             return Some(expr2_0);
4620                         }
4621                     }
4622                 }
4623             }
4624         }
4625         if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) {
4626             if let Some(()) = C::use_lzcnt(ctx, pattern2_0) {
4627                 let pattern5_0 = C::inst_data(ctx, pattern0_0);
4628                 if let &InstructionData::Unary {
4629                     opcode: ref pattern6_0,
4630                     arg: pattern6_1,
4631                 } = &pattern5_0
4632                 {
4633                     if let &Opcode::Clz = pattern6_0 {
4634                         // Rule at src/isa/x64/lower.isle line 1637.
4635                         let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1)?;
4636                         let expr1_0 = constructor_lzcnt(ctx, pattern3_0, expr0_0)?;
4637                         let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
4638                         return Some(expr2_0);
4639                     }
4640                 }
4641             }
4642             if let Some(()) = C::use_bmi1(ctx, pattern2_0) {
4643                 let pattern5_0 = C::inst_data(ctx, pattern0_0);
4644                 if let &InstructionData::Unary {
4645                     opcode: ref pattern6_0,
4646                     arg: pattern6_1,
4647                 } = &pattern5_0
4648                 {
4649                     if let &Opcode::Ctz = pattern6_0 {
4650                         // Rule at src/isa/x64/lower.isle line 1679.
4651                         let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1)?;
4652                         let expr1_0 = constructor_tzcnt(ctx, pattern3_0, expr0_0)?;
4653                         let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
4654                         return Some(expr2_0);
4655                     }
4656                 }
4657             }
4658             if let Some(()) = C::use_popcnt(ctx, pattern2_0) {
4659                 let pattern5_0 = C::inst_data(ctx, pattern0_0);
4660                 if let &InstructionData::Unary {
4661                     opcode: ref pattern6_0,
4662                     arg: pattern6_1,
4663                 } = &pattern5_0
4664                 {
4665                     if let &Opcode::Popcnt = pattern6_0 {
4666                         // Rule at src/isa/x64/lower.isle line 1715.
4667                         let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1)?;
4668                         let expr1_0 = constructor_x64_popcnt(ctx, pattern3_0, expr0_0)?;
4669                         let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
4670                         return Some(expr2_0);
4671                     }
4672                 }
4673             }
4674         }
4675         if let Some(pattern3_0) = C::ty_8_or_16(ctx, pattern2_0) {
4676             if let Some(()) = C::use_popcnt(ctx, pattern2_0) {
4677                 let pattern5_0 = C::inst_data(ctx, pattern0_0);
4678                 if let &InstructionData::Unary {
4679                     opcode: ref pattern6_0,
4680                     arg: pattern6_1,
4681                 } = &pattern5_0
4682                 {
4683                     if let &Opcode::Popcnt = pattern6_0 {
4684                         // Rule at src/isa/x64/lower.isle line 1722.
4685                         let expr0_0: Type = I32;
4686                         let expr1_0: Type = I32;
4687                         let expr2_0 = ExtendKind::Zero;
4688                         let expr3_0 =
4689                             constructor_extend_to_gpr(ctx, pattern6_1, expr1_0, &expr2_0)?;
4690                         let expr4_0 = constructor_x64_popcnt(ctx, expr0_0, expr3_0)?;
4691                         let expr5_0 = constructor_output_gpr(ctx, expr4_0)?;
4692                         return Some(expr5_0);
4693                     }
4694                 }
4695             }
4696         }
4697     }
4698     let pattern0_0 = arg0;
4699     let pattern1_0 = C::inst_data(ctx, pattern0_0);
4700     match &pattern1_0 {
4701         &InstructionData::NullAry {
4702             opcode: ref pattern2_0,
4703         } => {
4704             if let &Opcode::Debugtrap = pattern2_0 {
4705                 // Rule at src/isa/x64/lower.isle line 2107.
4706                 let expr0_0 = constructor_hlt(ctx)?;
4707                 let expr1_0 = constructor_side_effect(ctx, &expr0_0)?;
4708                 return Some(expr1_0);
4709             }
4710         }
4711         &InstructionData::UnaryIeee32 {
4712             opcode: ref pattern2_0,
4713             imm: pattern2_1,
4714         } => {
4715             if let &Opcode::F32const = pattern2_0 {
4716                 let pattern4_0 = C::u64_from_ieee32(ctx, pattern2_1);
4717                 // Rule at src/isa/x64/lower.isle line 46.
4718                 let expr0_0: Type = F32;
4719                 let expr1_0 = constructor_imm(ctx, expr0_0, pattern4_0)?;
4720                 let expr2_0 = constructor_output_reg(ctx, expr1_0)?;
4721                 return Some(expr2_0);
4722             }
4723         }
4724         &InstructionData::UnaryIeee64 {
4725             opcode: ref pattern2_0,
4726             imm: pattern2_1,
4727         } => {
4728             if let &Opcode::F64const = pattern2_0 {
4729                 let pattern4_0 = C::u64_from_ieee64(ctx, pattern2_1);
4730                 // Rule at src/isa/x64/lower.isle line 51.
4731                 let expr0_0: Type = F64;
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::Trap {
4738             opcode: ref pattern2_0,
4739             code: ref pattern2_1,
4740         } => {
4741             match pattern2_0 {
4742                 &Opcode::Trap => {
4743                     // Rule at src/isa/x64/lower.isle line 1435.
4744                     let expr0_0 = constructor_ud2(ctx, pattern2_1)?;
4745                     let expr1_0 = constructor_safepoint(ctx, &expr0_0)?;
4746                     return Some(expr1_0);
4747                 }
4748                 &Opcode::ResumableTrap => {
4749                     // Rule at src/isa/x64/lower.isle line 1440.
4750                     let expr0_0 = constructor_ud2(ctx, pattern2_1)?;
4751                     let expr1_0 = constructor_safepoint(ctx, &expr0_0)?;
4752                     return Some(expr1_0);
4753                 }
4754                 _ => {}
4755             }
4756         }
4757         &InstructionData::TernaryImm8 {
4758             opcode: ref pattern2_0,
4759             args: ref pattern2_1,
4760             imm: pattern2_2,
4761         } => {
4762             if let &Opcode::Insertlane = pattern2_0 {
4763                 let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1);
4764                 let pattern5_0 = C::value_type(ctx, pattern4_0);
4765                 let pattern6_0 = C::u8_from_uimm8(ctx, pattern2_2);
4766                 // Rule at src/isa/x64/lower.isle line 1302.
4767                 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
4768                 let expr1_0 = C::put_in_reg_mem(ctx, pattern4_1);
4769                 let expr2_0 =
4770                     constructor_vec_insert_lane(ctx, pattern5_0, expr0_0, &expr1_0, pattern6_0)?;
4771                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
4772                 return Some(expr3_0);
4773             }
4774         }
4775         &InstructionData::IntCompare {
4776             opcode: ref pattern2_0,
4777             args: ref pattern2_1,
4778             cond: ref pattern2_2,
4779         } => {
4780             if let &Opcode::Icmp = pattern2_0 {
4781                 let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1);
4782                 let pattern5_0 = C::value_type(ctx, pattern4_0);
4783                 if pattern5_0 == I128 {
4784                     match pattern2_2 {
4785                         &IntCC::Equal => {
4786                             // Rule at src/isa/x64/lower.isle line 1515.
4787                             let expr0_0 = C::put_in_regs(ctx, pattern4_0);
4788                             let expr1_0: usize = 0;
4789                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
4790                             let expr3_0 = C::put_in_regs(ctx, pattern4_0);
4791                             let expr4_0: usize = 1;
4792                             let expr5_0 = constructor_value_regs_get_gpr(ctx, expr3_0, expr4_0)?;
4793                             let expr6_0 = C::put_in_regs(ctx, pattern4_1);
4794                             let expr7_0: usize = 0;
4795                             let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0)?;
4796                             let expr9_0 = C::put_in_regs(ctx, pattern4_1);
4797                             let expr10_0: usize = 1;
4798                             let expr11_0 = constructor_value_regs_get_gpr(ctx, expr9_0, expr10_0)?;
4799                             let expr12_0 = OperandSize::Size64;
4800                             let expr13_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0);
4801                             let expr14_0 = constructor_cmp(ctx, &expr12_0, &expr13_0, expr2_0)?;
4802                             let expr15_0 = CC::Z;
4803                             let expr16_0 = constructor_setcc(ctx, &expr15_0)?;
4804                             let expr17_0 = constructor_with_flags_reg(ctx, &expr14_0, &expr16_0)?;
4805                             let expr18_0 = OperandSize::Size64;
4806                             let expr19_0 = C::gpr_to_gpr_mem_imm(ctx, expr11_0);
4807                             let expr20_0 = constructor_cmp(ctx, &expr18_0, &expr19_0, expr5_0)?;
4808                             let expr21_0 = CC::Z;
4809                             let expr22_0 = constructor_setcc(ctx, &expr21_0)?;
4810                             let expr23_0 = constructor_with_flags_reg(ctx, &expr20_0, &expr22_0)?;
4811                             let expr24_0: Type = I64;
4812                             let expr25_0 = C::gpr_new(ctx, expr17_0);
4813                             let expr26_0 = constructor_reg_to_gpr_mem_imm(ctx, expr23_0)?;
4814                             let expr27_0 = constructor_x64_and(ctx, expr24_0, expr25_0, &expr26_0)?;
4815                             let expr28_0 = C::gpr_to_reg(ctx, expr27_0);
4816                             let expr29_0: Type = I64;
4817                             let expr30_0 = C::gpr_new(ctx, expr28_0);
4818                             let expr31_0: u32 = 1;
4819                             let expr32_0 = RegMemImm::Imm { simm32: expr31_0 };
4820                             let expr33_0 = C::gpr_mem_imm_new(ctx, &expr32_0);
4821                             let expr34_0 = constructor_x64_and_with_flags_paired(
4822                                 ctx, expr29_0, expr30_0, &expr33_0,
4823                             )?;
4824                             let expr35_0 = CC::NZ;
4825                             let expr36_0 = constructor_setcc(ctx, &expr35_0)?;
4826                             let expr37_0 = constructor_with_flags(ctx, &expr34_0, &expr36_0)?;
4827                             let expr38_0 = C::output(ctx, expr37_0);
4828                             return Some(expr38_0);
4829                         }
4830                         &IntCC::NotEqual => {
4831                             // Rule at src/isa/x64/lower.isle line 1533.
4832                             let expr0_0 = C::put_in_regs(ctx, pattern4_0);
4833                             let expr1_0: usize = 0;
4834                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
4835                             let expr3_0 = C::put_in_regs(ctx, pattern4_0);
4836                             let expr4_0: usize = 1;
4837                             let expr5_0 = constructor_value_regs_get_gpr(ctx, expr3_0, expr4_0)?;
4838                             let expr6_0 = C::put_in_regs(ctx, pattern4_1);
4839                             let expr7_0: usize = 0;
4840                             let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0)?;
4841                             let expr9_0 = C::put_in_regs(ctx, pattern4_1);
4842                             let expr10_0: usize = 1;
4843                             let expr11_0 = constructor_value_regs_get_gpr(ctx, expr9_0, expr10_0)?;
4844                             let expr12_0 = OperandSize::Size64;
4845                             let expr13_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0);
4846                             let expr14_0 = constructor_cmp(ctx, &expr12_0, &expr13_0, expr2_0)?;
4847                             let expr15_0 = CC::NZ;
4848                             let expr16_0 = constructor_setcc(ctx, &expr15_0)?;
4849                             let expr17_0 = constructor_with_flags_reg(ctx, &expr14_0, &expr16_0)?;
4850                             let expr18_0 = OperandSize::Size64;
4851                             let expr19_0 = C::gpr_to_gpr_mem_imm(ctx, expr11_0);
4852                             let expr20_0 = constructor_cmp(ctx, &expr18_0, &expr19_0, expr5_0)?;
4853                             let expr21_0 = CC::NZ;
4854                             let expr22_0 = constructor_setcc(ctx, &expr21_0)?;
4855                             let expr23_0 = constructor_with_flags_reg(ctx, &expr20_0, &expr22_0)?;
4856                             let expr24_0: Type = I64;
4857                             let expr25_0 = C::gpr_new(ctx, expr17_0);
4858                             let expr26_0 = constructor_reg_to_gpr_mem_imm(ctx, expr23_0)?;
4859                             let expr27_0 = constructor_or(ctx, expr24_0, expr25_0, &expr26_0)?;
4860                             let expr28_0 = C::gpr_to_reg(ctx, expr27_0);
4861                             let expr29_0: Type = I64;
4862                             let expr30_0 = C::gpr_new(ctx, expr28_0);
4863                             let expr31_0: u32 = 1;
4864                             let expr32_0 = RegMemImm::Imm { simm32: expr31_0 };
4865                             let expr33_0 = C::gpr_mem_imm_new(ctx, &expr32_0);
4866                             let expr34_0 = constructor_x64_and_with_flags_paired(
4867                                 ctx, expr29_0, expr30_0, &expr33_0,
4868                             )?;
4869                             let expr35_0 = CC::NZ;
4870                             let expr36_0 = constructor_setcc(ctx, &expr35_0)?;
4871                             let expr37_0 = constructor_with_flags(ctx, &expr34_0, &expr36_0)?;
4872                             let expr38_0 = C::output(ctx, expr37_0);
4873                             return Some(expr38_0);
4874                         }
4875                         _ => {}
4876                     }
4877                 }
4878                 if pattern5_0 == I64X2 {
4879                     match pattern2_2 {
4880                         &IntCC::SignedGreaterThanOrEqual => {
4881                             // Rule at src/isa/x64/lower.isle line 1500.
4882                             let expr0_0: Type = I64X2;
4883                             let expr1_0 = constructor_put_in_xmm(ctx, pattern4_1)?;
4884                             let expr2_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?;
4885                             let expr3_0 = constructor_pcmpgt(ctx, expr0_0, expr1_0, &expr2_0)?;
4886                             let expr4_0: Type = I64X2;
4887                             let expr5_0 = constructor_vector_all_ones(ctx, expr4_0)?;
4888                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
4889                             let expr7_0 = constructor_pxor(ctx, expr3_0, &expr6_0)?;
4890                             let expr8_0 = constructor_output_xmm(ctx, expr7_0)?;
4891                             return Some(expr8_0);
4892                         }
4893                         &IntCC::SignedLessThanOrEqual => {
4894                             // Rule at src/isa/x64/lower.isle line 1504.
4895                             let expr0_0: Type = I64X2;
4896                             let expr1_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
4897                             let expr2_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
4898                             let expr3_0 = constructor_pcmpgt(ctx, expr0_0, expr1_0, &expr2_0)?;
4899                             let expr4_0: Type = I64X2;
4900                             let expr5_0 = constructor_vector_all_ones(ctx, expr4_0)?;
4901                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
4902                             let expr7_0 = constructor_pxor(ctx, expr3_0, &expr6_0)?;
4903                             let expr8_0 = constructor_output_xmm(ctx, expr7_0)?;
4904                             return Some(expr8_0);
4905                         }
4906                         _ => {}
4907                     }
4908                 }
4909                 if let Some(pattern6_0) = C::fits_in_64(ctx, pattern5_0) {
4910                     // Rule at src/isa/x64/lower.isle line 1448.
4911                     let expr0_0 = C::raw_operand_size_of_type(ctx, pattern6_0);
4912                     let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern4_1)?;
4913                     let expr2_0 = constructor_put_in_gpr(ctx, pattern4_0)?;
4914                     let expr3_0 = constructor_cmp(ctx, &expr0_0, &expr1_0, expr2_0)?;
4915                     let expr4_0 = C::intcc_to_cc(ctx, pattern2_2);
4916                     let expr5_0 = constructor_setcc(ctx, &expr4_0)?;
4917                     let expr6_0 = constructor_with_flags(ctx, &expr3_0, &expr5_0)?;
4918                     let expr7_0 = C::output(ctx, expr6_0);
4919                     return Some(expr7_0);
4920                 }
4921                 if let Some(pattern6_0) = C::vec128(ctx, pattern5_0) {
4922                     match pattern2_2 {
4923                         &IntCC::Equal => {
4924                             // Rule at src/isa/x64/lower.isle line 1457.
4925                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
4926                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
4927                             let expr2_0 = constructor_pcmpeq(ctx, pattern6_0, expr0_0, &expr1_0)?;
4928                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
4929                             return Some(expr3_0);
4930                         }
4931                         &IntCC::NotEqual => {
4932                             // Rule at src/isa/x64/lower.isle line 1461.
4933                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
4934                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
4935                             let expr2_0 = constructor_pcmpeq(ctx, pattern6_0, expr0_0, &expr1_0)?;
4936                             let expr3_0 = constructor_vector_all_ones(ctx, pattern6_0)?;
4937                             let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0);
4938                             let expr5_0 = constructor_pxor(ctx, expr2_0, &expr4_0)?;
4939                             let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
4940                             return Some(expr6_0);
4941                         }
4942                         &IntCC::SignedGreaterThan => {
4943                             // Rule at src/isa/x64/lower.isle line 1468.
4944                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
4945                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
4946                             let expr2_0 = constructor_pcmpgt(ctx, pattern6_0, expr0_0, &expr1_0)?;
4947                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
4948                             return Some(expr3_0);
4949                         }
4950                         &IntCC::SignedGreaterThanOrEqual => {
4951                             // Rule at src/isa/x64/lower.isle line 1485.
4952                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
4953                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
4954                             let expr2_0 = constructor_pmaxs(ctx, pattern6_0, expr0_0, &expr1_0)?;
4955                             let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
4956                             let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0);
4957                             let expr5_0 = constructor_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0)?;
4958                             let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
4959                             return Some(expr6_0);
4960                         }
4961                         &IntCC::SignedLessThan => {
4962                             // Rule at src/isa/x64/lower.isle line 1470.
4963                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1)?;
4964                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?;
4965                             let expr2_0 = constructor_pcmpgt(ctx, pattern6_0, expr0_0, &expr1_0)?;
4966                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
4967                             return Some(expr3_0);
4968                         }
4969                         &IntCC::SignedLessThanOrEqual => {
4970                             // Rule at src/isa/x64/lower.isle line 1488.
4971                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
4972                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
4973                             let expr2_0 = constructor_pmins(ctx, pattern6_0, expr0_0, &expr1_0)?;
4974                             let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
4975                             let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0);
4976                             let expr5_0 = constructor_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0)?;
4977                             let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
4978                             return Some(expr6_0);
4979                         }
4980                         &IntCC::UnsignedGreaterThan => {
4981                             // Rule at src/isa/x64/lower.isle line 1472.
4982                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
4983                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
4984                             let expr2_0 = constructor_pmaxu(ctx, pattern6_0, expr0_0, &expr1_0)?;
4985                             let expr3_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
4986                             let expr4_0 = constructor_pcmpeq(ctx, pattern6_0, expr2_0, &expr3_0)?;
4987                             let expr5_0 = constructor_vector_all_ones(ctx, pattern6_0)?;
4988                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
4989                             let expr7_0 = constructor_pxor(ctx, expr4_0, &expr6_0)?;
4990                             let expr8_0 = constructor_output_xmm(ctx, expr7_0)?;
4991                             return Some(expr8_0);
4992                         }
4993                         &IntCC::UnsignedGreaterThanOrEqual => {
4994                             // Rule at src/isa/x64/lower.isle line 1491.
4995                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
4996                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
4997                             let expr2_0 = constructor_pmaxu(ctx, pattern6_0, expr0_0, &expr1_0)?;
4998                             let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
4999                             let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0);
5000                             let expr5_0 = constructor_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0)?;
5001                             let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
5002                             return Some(expr6_0);
5003                         }
5004                         &IntCC::UnsignedLessThan => {
5005                             // Rule at src/isa/x64/lower.isle line 1477.
5006                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
5007                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
5008                             let expr2_0 = constructor_pminu(ctx, pattern6_0, expr0_0, &expr1_0)?;
5009                             let expr3_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
5010                             let expr4_0 = constructor_pcmpeq(ctx, pattern6_0, expr2_0, &expr3_0)?;
5011                             let expr5_0 = constructor_vector_all_ones(ctx, pattern6_0)?;
5012                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
5013                             let expr7_0 = constructor_pxor(ctx, expr4_0, &expr6_0)?;
5014                             let expr8_0 = constructor_output_xmm(ctx, expr7_0)?;
5015                             return Some(expr8_0);
5016                         }
5017                         &IntCC::UnsignedLessThanOrEqual => {
5018                             // Rule at src/isa/x64/lower.isle line 1494.
5019                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
5020                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
5021                             let expr2_0 = constructor_pminu(ctx, pattern6_0, expr0_0, &expr1_0)?;
5022                             let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
5023                             let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0);
5024                             let expr5_0 = constructor_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0)?;
5025                             let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
5026                             return Some(expr6_0);
5027                         }
5028                         _ => {}
5029                     }
5030                 }
5031             }
5032         }
5033         &InstructionData::Unary {
5034             opcode: ref pattern2_0,
5035             arg: pattern2_1,
5036         } => {
5037             match pattern2_0 {
5038                 &Opcode::IsNull => {
5039                     let pattern4_0 = C::value_type(ctx, pattern2_1);
5040                     if pattern4_0 == R64 {
5041                         // Rule at src/isa/x64/lower.isle line 1950.
5042                         let expr0_0 = OperandSize::Size64;
5043                         let expr1_0: u32 = 0;
5044                         let expr2_0 = constructor_put_in_gpr(ctx, pattern2_1)?;
5045                         let expr3_0 = constructor_cmp_imm(ctx, &expr0_0, expr1_0, expr2_0)?;
5046                         let expr4_0 = CC::Z;
5047                         let expr5_0 = constructor_setcc(ctx, &expr4_0)?;
5048                         let expr6_0 = constructor_with_flags(ctx, &expr3_0, &expr5_0)?;
5049                         let expr7_0 = C::output(ctx, expr6_0);
5050                         return Some(expr7_0);
5051                     }
5052                 }
5053                 &Opcode::IsInvalid => {
5054                     let pattern4_0 = C::value_type(ctx, pattern2_1);
5055                     if pattern4_0 == R64 {
5056                         // Rule at src/isa/x64/lower.isle line 1958.
5057                         let expr0_0 = OperandSize::Size64;
5058                         let expr1_0: u32 = 4294967295;
5059                         let expr2_0 = constructor_put_in_gpr(ctx, pattern2_1)?;
5060                         let expr3_0 = constructor_cmp_imm(ctx, &expr0_0, expr1_0, expr2_0)?;
5061                         let expr4_0 = CC::Z;
5062                         let expr5_0 = constructor_setcc(ctx, &expr4_0)?;
5063                         let expr6_0 = constructor_with_flags(ctx, &expr3_0, &expr5_0)?;
5064                         let expr7_0 = C::output(ctx, expr6_0);
5065                         return Some(expr7_0);
5066                     }
5067                 }
5068                 _ => {}
5069             }
5070         }
5071         _ => {}
5072     }
5073     if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) {
5074         let pattern2_0 = C::value_type(ctx, pattern1_0);
5075         if pattern2_0 == B128 {
5076             let pattern4_0 = C::inst_data(ctx, pattern0_0);
5077             match &pattern4_0 {
5078                 &InstructionData::UnaryBool {
5079                     opcode: ref pattern5_0,
5080                     imm: pattern5_1,
5081                 } => {
5082                     if let &Opcode::Bconst = pattern5_0 {
5083                         if pattern5_1 == true {
5084                             // Rule at src/isa/x64/lower.isle line 39.
5085                             let expr0_0: Type = B64;
5086                             let expr1_0: u64 = 1;
5087                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
5088                             let expr3_0: Type = B64;
5089                             let expr4_0: u64 = 0;
5090                             let expr5_0 = constructor_imm(ctx, expr3_0, expr4_0)?;
5091                             let expr6_0 = C::value_regs(ctx, expr2_0, expr5_0);
5092                             let expr7_0 = C::output(ctx, expr6_0);
5093                             return Some(expr7_0);
5094                         }
5095                         if pattern5_1 == false {
5096                             // Rule at src/isa/x64/lower.isle line 34.
5097                             let expr0_0: Type = B64;
5098                             let expr1_0: u64 = 0;
5099                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
5100                             let expr3_0: Type = B64;
5101                             let expr4_0: u64 = 0;
5102                             let expr5_0 = constructor_imm(ctx, expr3_0, expr4_0)?;
5103                             let expr6_0 = C::value_regs(ctx, expr2_0, expr5_0);
5104                             let expr7_0 = C::output(ctx, expr6_0);
5105                             return Some(expr7_0);
5106                         }
5107                     }
5108                 }
5109                 &InstructionData::Binary {
5110                     opcode: ref pattern5_0,
5111                     args: ref pattern5_1,
5112                 } => {
5113                     match pattern5_0 {
5114                         &Opcode::Band => {
5115                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5116                             // Rule at src/isa/x64/lower.isle line 344.
5117                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
5118                             let expr1_0: usize = 0;
5119                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
5120                             let expr3_0: usize = 1;
5121                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
5122                             let expr5_0 = constructor_lo_gpr(ctx, pattern7_1)?;
5123                             let expr6_0: Type = I64;
5124                             let expr7_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
5125                             let expr8_0 = constructor_x64_and(ctx, expr6_0, expr2_0, &expr7_0)?;
5126                             let expr9_0 = constructor_value_gprs(ctx, expr8_0, expr4_0)?;
5127                             let expr10_0 = C::output(ctx, expr9_0);
5128                             return Some(expr10_0);
5129                         }
5130                         &Opcode::Bor => {
5131                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5132                             // Rule at src/isa/x64/lower.isle line 410.
5133                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
5134                             let expr1_0: usize = 0;
5135                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
5136                             let expr3_0: usize = 1;
5137                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
5138                             let expr5_0 = constructor_lo_gpr(ctx, pattern7_1)?;
5139                             let expr6_0: Type = I64;
5140                             let expr7_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
5141                             let expr8_0 = constructor_or(ctx, expr6_0, expr2_0, &expr7_0)?;
5142                             let expr9_0 = constructor_value_gprs(ctx, expr8_0, expr4_0)?;
5143                             let expr10_0 = C::output(ctx, expr9_0);
5144                             return Some(expr10_0);
5145                         }
5146                         &Opcode::Bxor => {
5147                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5148                             // Rule at src/isa/x64/lower.isle line 468.
5149                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
5150                             let expr1_0: usize = 0;
5151                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
5152                             let expr3_0: usize = 1;
5153                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
5154                             let expr5_0 = constructor_lo_gpr(ctx, pattern7_1)?;
5155                             let expr6_0: Type = I64;
5156                             let expr7_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
5157                             let expr8_0 = constructor_xor(ctx, expr6_0, expr2_0, &expr7_0)?;
5158                             let expr9_0 = constructor_value_gprs(ctx, expr8_0, expr4_0)?;
5159                             let expr10_0 = C::output(ctx, expr9_0);
5160                             return Some(expr10_0);
5161                         }
5162                         _ => {}
5163                     }
5164                 }
5165                 &InstructionData::Unary {
5166                     opcode: ref pattern5_0,
5167                     arg: pattern5_1,
5168                 } => {
5169                     if let &Opcode::Bnot = pattern5_0 {
5170                         // Rule at src/isa/x64/lower.isle line 1269.
5171                         let expr0_0 = constructor_i128_not(ctx, pattern5_1)?;
5172                         let expr1_0 = C::output(ctx, expr0_0);
5173                         return Some(expr1_0);
5174                     }
5175                 }
5176                 _ => {}
5177             }
5178         }
5179         if pattern2_0 == I8 {
5180             let pattern4_0 = C::inst_data(ctx, pattern0_0);
5181             if let &InstructionData::Unary {
5182                 opcode: ref pattern5_0,
5183                 arg: pattern5_1,
5184             } = &pattern4_0
5185             {
5186                 if let &Opcode::Bitrev = pattern5_0 {
5187                     // Rule at src/isa/x64/lower.isle line 1872.
5188                     let expr0_0: Type = I32;
5189                     let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
5190                     let expr2_0 = constructor_do_bitrev8(ctx, expr0_0, expr1_0)?;
5191                     let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
5192                     return Some(expr3_0);
5193                 }
5194             }
5195         }
5196         if pattern2_0 == I16 {
5197             let pattern4_0 = C::inst_data(ctx, pattern0_0);
5198             if let &InstructionData::Unary {
5199                 opcode: ref pattern5_0,
5200                 arg: pattern5_1,
5201             } = &pattern4_0
5202             {
5203                 if let &Opcode::Bitrev = pattern5_0 {
5204                     // Rule at src/isa/x64/lower.isle line 1875.
5205                     let expr0_0: Type = I32;
5206                     let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
5207                     let expr2_0 = constructor_do_bitrev16(ctx, expr0_0, expr1_0)?;
5208                     let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
5209                     return Some(expr3_0);
5210                 }
5211             }
5212         }
5213         if pattern2_0 == I32 {
5214             let pattern4_0 = C::inst_data(ctx, pattern0_0);
5215             if let &InstructionData::Unary {
5216                 opcode: ref pattern5_0,
5217                 arg: pattern5_1,
5218             } = &pattern4_0
5219             {
5220                 if let &Opcode::Bitrev = pattern5_0 {
5221                     // Rule at src/isa/x64/lower.isle line 1878.
5222                     let expr0_0: Type = I32;
5223                     let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
5224                     let expr2_0 = constructor_do_bitrev32(ctx, expr0_0, expr1_0)?;
5225                     let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
5226                     return Some(expr3_0);
5227                 }
5228             }
5229         }
5230         if pattern2_0 == I64 {
5231             let pattern4_0 = C::inst_data(ctx, pattern0_0);
5232             if let &InstructionData::Unary {
5233                 opcode: ref pattern5_0,
5234                 arg: pattern5_1,
5235             } = &pattern4_0
5236             {
5237                 match pattern5_0 {
5238                     &Opcode::Bitrev => {
5239                         // Rule at src/isa/x64/lower.isle line 1881.
5240                         let expr0_0: Type = I64;
5241                         let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
5242                         let expr2_0 = constructor_do_bitrev64(ctx, expr0_0, expr1_0)?;
5243                         let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
5244                         return Some(expr3_0);
5245                     }
5246                     &Opcode::Uextend => {
5247                         if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) {
5248                             if let Some(pattern8_0) = C::first_result(ctx, pattern7_0) {
5249                                 let pattern9_0 = C::value_type(ctx, pattern8_0);
5250                                 if pattern9_0 == I32 {
5251                                     let pattern11_0 = C::inst_data(ctx, pattern7_0);
5252                                     match &pattern11_0 {
5253                                         &InstructionData::Binary {
5254                                             opcode: ref pattern12_0,
5255                                             args: ref pattern12_1,
5256                                         } => {
5257                                             match pattern12_0 {
5258                                                 &Opcode::Iadd => {
5259                                                     let (pattern14_0, pattern14_1) =
5260                                                         C::unpack_value_array_2(ctx, pattern12_1);
5261                                                     // Rule at src/isa/x64/lower.isle line 1997.
5262                                                     let expr0_0 =
5263                                                         constructor_output_value(ctx, pattern5_1)?;
5264                                                     return Some(expr0_0);
5265                                                 }
5266                                                 &Opcode::Isub => {
5267                                                     let (pattern14_0, pattern14_1) =
5268                                                         C::unpack_value_array_2(ctx, pattern12_1);
5269                                                     // Rule at src/isa/x64/lower.isle line 2003.
5270                                                     let expr0_0 =
5271                                                         constructor_output_value(ctx, pattern5_1)?;
5272                                                     return Some(expr0_0);
5273                                                 }
5274                                                 &Opcode::Imul => {
5275                                                     let (pattern14_0, pattern14_1) =
5276                                                         C::unpack_value_array_2(ctx, pattern12_1);
5277                                                     // Rule at src/isa/x64/lower.isle line 2006.
5278                                                     let expr0_0 =
5279                                                         constructor_output_value(ctx, pattern5_1)?;
5280                                                     return Some(expr0_0);
5281                                                 }
5282                                                 &Opcode::IaddIfcout => {
5283                                                     let (pattern14_0, pattern14_1) =
5284                                                         C::unpack_value_array_2(ctx, pattern12_1);
5285                                                     // Rule at src/isa/x64/lower.isle line 2000.
5286                                                     let expr0_0 =
5287                                                         constructor_output_value(ctx, pattern5_1)?;
5288                                                     return Some(expr0_0);
5289                                                 }
5290                                                 &Opcode::Band => {
5291                                                     let (pattern14_0, pattern14_1) =
5292                                                         C::unpack_value_array_2(ctx, pattern12_1);
5293                                                     // Rule at src/isa/x64/lower.isle line 2009.
5294                                                     let expr0_0 =
5295                                                         constructor_output_value(ctx, pattern5_1)?;
5296                                                     return Some(expr0_0);
5297                                                 }
5298                                                 &Opcode::Bor => {
5299                                                     let (pattern14_0, pattern14_1) =
5300                                                         C::unpack_value_array_2(ctx, pattern12_1);
5301                                                     // Rule at src/isa/x64/lower.isle line 2012.
5302                                                     let expr0_0 =
5303                                                         constructor_output_value(ctx, pattern5_1)?;
5304                                                     return Some(expr0_0);
5305                                                 }
5306                                                 &Opcode::Bxor => {
5307                                                     let (pattern14_0, pattern14_1) =
5308                                                         C::unpack_value_array_2(ctx, pattern12_1);
5309                                                     // Rule at src/isa/x64/lower.isle line 2015.
5310                                                     let expr0_0 =
5311                                                         constructor_output_value(ctx, pattern5_1)?;
5312                                                     return Some(expr0_0);
5313                                                 }
5314                                                 &Opcode::Ishl => {
5315                                                     let (pattern14_0, pattern14_1) =
5316                                                         C::unpack_value_array_2(ctx, pattern12_1);
5317                                                     // Rule at src/isa/x64/lower.isle line 2018.
5318                                                     let expr0_0 =
5319                                                         constructor_output_value(ctx, pattern5_1)?;
5320                                                     return Some(expr0_0);
5321                                                 }
5322                                                 &Opcode::Ushr => {
5323                                                     let (pattern14_0, pattern14_1) =
5324                                                         C::unpack_value_array_2(ctx, pattern12_1);
5325                                                     // Rule at src/isa/x64/lower.isle line 2021.
5326                                                     let expr0_0 =
5327                                                         constructor_output_value(ctx, pattern5_1)?;
5328                                                     return Some(expr0_0);
5329                                                 }
5330                                                 _ => {}
5331                                             }
5332                                         }
5333                                         &InstructionData::Load {
5334                                             opcode: ref pattern12_0,
5335                                             arg: pattern12_1,
5336                                             flags: pattern12_2,
5337                                             offset: pattern12_3,
5338                                         } => {
5339                                             if let &Opcode::Uload32 = pattern12_0 {
5340                                                 // Rule at src/isa/x64/lower.isle line 2024.
5341                                                 let expr0_0 =
5342                                                     constructor_output_value(ctx, pattern5_1)?;
5343                                                 return Some(expr0_0);
5344                                             }
5345                                         }
5346                                         _ => {}
5347                                     }
5348                                 }
5349                             }
5350                         }
5351                         let pattern7_0 = C::value_type(ctx, pattern5_1);
5352                         if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) {
5353                             // Rule at src/isa/x64/lower.isle line 1979.
5354                             let expr0_0: Type = I64;
5355                             let expr1_0 = ExtendKind::Zero;
5356                             let expr2_0 =
5357                                 constructor_extend_to_gpr(ctx, pattern5_1, expr0_0, &expr1_0)?;
5358                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
5359                             return Some(expr3_0);
5360                         }
5361                     }
5362                     _ => {}
5363                 }
5364             }
5365         }
5366         if pattern2_0 == I128 {
5367             let pattern4_0 = C::inst_data(ctx, pattern0_0);
5368             match &pattern4_0 {
5369                 &InstructionData::UnaryImm {
5370                     opcode: ref pattern5_0,
5371                     imm: pattern5_1,
5372                 } => {
5373                     if let &Opcode::Iconst = pattern5_0 {
5374                         let pattern7_0 = C::u64_from_imm64(ctx, pattern5_1);
5375                         // Rule at src/isa/x64/lower.isle line 15.
5376                         let expr0_0: Type = I64;
5377                         let expr1_0 = constructor_imm(ctx, expr0_0, pattern7_0)?;
5378                         let expr2_0: Type = I64;
5379                         let expr3_0: u64 = 0;
5380                         let expr4_0 = constructor_imm(ctx, expr2_0, expr3_0)?;
5381                         let expr5_0 = C::value_regs(ctx, expr1_0, expr4_0);
5382                         let expr6_0 = C::output(ctx, expr5_0);
5383                         return Some(expr6_0);
5384                     }
5385                 }
5386                 &InstructionData::Binary {
5387                     opcode: ref pattern5_0,
5388                     args: ref pattern5_1,
5389                 } => {
5390                     match pattern5_0 {
5391                         &Opcode::Iadd => {
5392                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5393                             // Rule at src/isa/x64/lower.isle line 111.
5394                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
5395                             let expr1_0: usize = 0;
5396                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
5397                             let expr3_0: usize = 1;
5398                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
5399                             let expr5_0 = C::put_in_regs(ctx, pattern7_1);
5400                             let expr6_0: usize = 0;
5401                             let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?;
5402                             let expr8_0: usize = 1;
5403                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?;
5404                             let expr10_0: Type = I64;
5405                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
5406                             let expr12_0 = constructor_add_with_flags_paired(
5407                                 ctx, expr10_0, expr2_0, &expr11_0,
5408                             )?;
5409                             let expr13_0: Type = I64;
5410                             let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
5411                             let expr15_0 =
5412                                 constructor_adc_paired(ctx, expr13_0, expr4_0, &expr14_0)?;
5413                             let expr16_0 = constructor_with_flags(ctx, &expr12_0, &expr15_0)?;
5414                             let expr17_0 = C::output(ctx, expr16_0);
5415                             return Some(expr17_0);
5416                         }
5417                         &Opcode::Isub => {
5418                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5419                             // Rule at src/isa/x64/lower.isle line 257.
5420                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
5421                             let expr1_0: usize = 0;
5422                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
5423                             let expr3_0: usize = 1;
5424                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
5425                             let expr5_0 = C::put_in_regs(ctx, pattern7_1);
5426                             let expr6_0: usize = 0;
5427                             let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?;
5428                             let expr8_0: usize = 1;
5429                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?;
5430                             let expr10_0: Type = I64;
5431                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
5432                             let expr12_0 = constructor_sub_with_flags_paired(
5433                                 ctx, expr10_0, expr2_0, &expr11_0,
5434                             )?;
5435                             let expr13_0: Type = I64;
5436                             let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
5437                             let expr15_0 =
5438                                 constructor_sbb_paired(ctx, expr13_0, expr4_0, &expr14_0)?;
5439                             let expr16_0 = constructor_with_flags(ctx, &expr12_0, &expr15_0)?;
5440                             let expr17_0 = C::output(ctx, expr16_0);
5441                             return Some(expr17_0);
5442                         }
5443                         &Opcode::Imul => {
5444                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5445                             // Rule at src/isa/x64/lower.isle line 957.
5446                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
5447                             let expr1_0: usize = 0;
5448                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
5449                             let expr3_0: usize = 1;
5450                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
5451                             let expr5_0 = C::put_in_regs(ctx, pattern7_1);
5452                             let expr6_0: usize = 0;
5453                             let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?;
5454                             let expr8_0: usize = 1;
5455                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?;
5456                             let expr10_0: Type = I64;
5457                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
5458                             let expr12_0 = constructor_mul(ctx, expr10_0, expr2_0, &expr11_0)?;
5459                             let expr13_0: Type = I64;
5460                             let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
5461                             let expr15_0 = constructor_mul(ctx, expr13_0, expr4_0, &expr14_0)?;
5462                             let expr16_0: Type = I64;
5463                             let expr17_0 = C::gpr_to_gpr_mem_imm(ctx, expr15_0);
5464                             let expr18_0 = constructor_add(ctx, expr16_0, expr12_0, &expr17_0)?;
5465                             let expr19_0: Type = I64;
5466                             let expr20_0 = C::gpr_to_gpr_mem(ctx, expr7_0);
5467                             let expr21_0 = constructor_mulhi_u(ctx, expr19_0, expr2_0, &expr20_0)?;
5468                             let expr22_0: usize = 0;
5469                             let expr23_0 = constructor_value_regs_get_gpr(ctx, expr21_0, expr22_0)?;
5470                             let expr24_0: usize = 1;
5471                             let expr25_0 = constructor_value_regs_get_gpr(ctx, expr21_0, expr24_0)?;
5472                             let expr26_0: Type = I64;
5473                             let expr27_0 = C::gpr_to_gpr_mem_imm(ctx, expr25_0);
5474                             let expr28_0 = constructor_add(ctx, expr26_0, expr18_0, &expr27_0)?;
5475                             let expr29_0 = constructor_value_gprs(ctx, expr23_0, expr28_0)?;
5476                             let expr30_0 = C::output(ctx, expr29_0);
5477                             return Some(expr30_0);
5478                         }
5479                         &Opcode::Band => {
5480                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5481                             // Rule at src/isa/x64/lower.isle line 334.
5482                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
5483                             let expr1_0: usize = 0;
5484                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
5485                             let expr3_0: usize = 1;
5486                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
5487                             let expr5_0 = C::put_in_regs(ctx, pattern7_1);
5488                             let expr6_0: usize = 0;
5489                             let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?;
5490                             let expr8_0: usize = 1;
5491                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?;
5492                             let expr10_0: Type = I64;
5493                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
5494                             let expr12_0 = constructor_x64_and(ctx, expr10_0, expr2_0, &expr11_0)?;
5495                             let expr13_0: Type = I64;
5496                             let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
5497                             let expr15_0 = constructor_x64_and(ctx, expr13_0, expr4_0, &expr14_0)?;
5498                             let expr16_0 = constructor_value_gprs(ctx, expr12_0, expr15_0)?;
5499                             let expr17_0 = C::output(ctx, expr16_0);
5500                             return Some(expr17_0);
5501                         }
5502                         &Opcode::Bor => {
5503                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5504                             // Rule at src/isa/x64/lower.isle line 407.
5505                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
5506                             let expr1_0 = C::put_in_regs(ctx, pattern7_1);
5507                             let expr2_0 = constructor_or_i128(ctx, expr0_0, expr1_0)?;
5508                             let expr3_0 = C::output(ctx, expr2_0);
5509                             return Some(expr3_0);
5510                         }
5511                         &Opcode::Bxor => {
5512                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5513                             // Rule at src/isa/x64/lower.isle line 458.
5514                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
5515                             let expr1_0: usize = 0;
5516                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
5517                             let expr3_0: usize = 1;
5518                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
5519                             let expr5_0 = C::put_in_regs(ctx, pattern7_1);
5520                             let expr6_0: usize = 0;
5521                             let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?;
5522                             let expr8_0: usize = 1;
5523                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?;
5524                             let expr10_0: Type = I64;
5525                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
5526                             let expr12_0 = constructor_xor(ctx, expr10_0, expr2_0, &expr11_0)?;
5527                             let expr13_0: Type = I64;
5528                             let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
5529                             let expr15_0 = constructor_xor(ctx, expr13_0, expr4_0, &expr14_0)?;
5530                             let expr16_0 = constructor_value_gprs(ctx, expr12_0, expr15_0)?;
5531                             let expr17_0 = C::output(ctx, expr16_0);
5532                             return Some(expr17_0);
5533                         }
5534                         &Opcode::Rotl => {
5535                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5536                             // Rule at src/isa/x64/lower.isle line 830.
5537                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
5538                             let expr1_0 = constructor_lo_gpr(ctx, pattern7_1)?;
5539                             let expr2_0 = constructor_shl_i128(ctx, expr0_0, expr1_0)?;
5540                             let expr3_0: Type = I64;
5541                             let expr4_0: Type = I64;
5542                             let expr5_0: u64 = 128;
5543                             let expr6_0 = constructor_imm(ctx, expr4_0, expr5_0)?;
5544                             let expr7_0 = C::gpr_new(ctx, expr6_0);
5545                             let expr8_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0);
5546                             let expr9_0 = constructor_sub(ctx, expr3_0, expr7_0, &expr8_0)?;
5547                             let expr10_0 = constructor_shr_i128(ctx, expr0_0, expr9_0)?;
5548                             let expr11_0 = constructor_or_i128(ctx, expr2_0, expr10_0)?;
5549                             let expr12_0 = C::output(ctx, expr11_0);
5550                             return Some(expr12_0);
5551                         }
5552                         &Opcode::Rotr => {
5553                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5554                             // Rule at src/isa/x64/lower.isle line 870.
5555                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
5556                             let expr1_0 = constructor_lo_gpr(ctx, pattern7_1)?;
5557                             let expr2_0 = constructor_shr_i128(ctx, expr0_0, expr1_0)?;
5558                             let expr3_0: Type = I64;
5559                             let expr4_0: Type = I64;
5560                             let expr5_0: u64 = 128;
5561                             let expr6_0 = constructor_imm(ctx, expr4_0, expr5_0)?;
5562                             let expr7_0 = C::gpr_new(ctx, expr6_0);
5563                             let expr8_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0);
5564                             let expr9_0 = constructor_sub(ctx, expr3_0, expr7_0, &expr8_0)?;
5565                             let expr10_0 = constructor_shl_i128(ctx, expr0_0, expr9_0)?;
5566                             let expr11_0 = constructor_or_i128(ctx, expr2_0, expr10_0)?;
5567                             let expr12_0 = C::output(ctx, expr11_0);
5568                             return Some(expr12_0);
5569                         }
5570                         &Opcode::Ishl => {
5571                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5572                             // Rule at src/isa/x64/lower.isle line 522.
5573                             let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?;
5574                             let expr1_0 = C::put_in_regs(ctx, pattern7_0);
5575                             let expr2_0 = constructor_shl_i128(ctx, expr1_0, expr0_0)?;
5576                             let expr3_0 = C::output(ctx, expr2_0);
5577                             return Some(expr3_0);
5578                         }
5579                         &Opcode::Ushr => {
5580                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5581                             // Rule at src/isa/x64/lower.isle line 623.
5582                             let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?;
5583                             let expr1_0 = C::put_in_regs(ctx, pattern7_0);
5584                             let expr2_0 = constructor_shr_i128(ctx, expr1_0, expr0_0)?;
5585                             let expr3_0 = C::output(ctx, expr2_0);
5586                             return Some(expr3_0);
5587                         }
5588                         &Opcode::Sshr => {
5589                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5590                             // Rule at src/isa/x64/lower.isle line 728.
5591                             let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?;
5592                             let expr1_0 = C::put_in_regs(ctx, pattern7_0);
5593                             let expr2_0 = constructor_sar_i128(ctx, expr1_0, expr0_0)?;
5594                             let expr3_0 = C::output(ctx, expr2_0);
5595                             return Some(expr3_0);
5596                         }
5597                         _ => {}
5598                     }
5599                 }
5600                 &InstructionData::Unary {
5601                     opcode: ref pattern5_0,
5602                     arg: pattern5_1,
5603                 } => {
5604                     match pattern5_0 {
5605                         &Opcode::Bnot => {
5606                             // Rule at src/isa/x64/lower.isle line 1266.
5607                             let expr0_0 = constructor_i128_not(ctx, pattern5_1)?;
5608                             let expr1_0 = C::output(ctx, expr0_0);
5609                             return Some(expr1_0);
5610                         }
5611                         &Opcode::Bitrev => {
5612                             // Rule at src/isa/x64/lower.isle line 1884.
5613                             let expr0_0: Type = I64;
5614                             let expr1_0 = C::put_in_regs(ctx, pattern5_1);
5615                             let expr2_0: usize = 1;
5616                             let expr3_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr2_0)?;
5617                             let expr4_0 = constructor_do_bitrev64(ctx, expr0_0, expr3_0)?;
5618                             let expr5_0 = C::gpr_to_reg(ctx, expr4_0);
5619                             let expr6_0: Type = I64;
5620                             let expr7_0 = C::put_in_regs(ctx, pattern5_1);
5621                             let expr8_0: usize = 0;
5622                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr7_0, expr8_0)?;
5623                             let expr10_0 = constructor_do_bitrev64(ctx, expr6_0, expr9_0)?;
5624                             let expr11_0 = C::gpr_to_reg(ctx, expr10_0);
5625                             let expr12_0 = C::value_regs(ctx, expr5_0, expr11_0);
5626                             let expr13_0 = C::output(ctx, expr12_0);
5627                             return Some(expr13_0);
5628                         }
5629                         &Opcode::Clz => {
5630                             // Rule at src/isa/x64/lower.isle line 1654.
5631                             let expr0_0: Type = I64;
5632                             let expr1_0: Type = I64;
5633                             let expr2_0 = C::put_in_regs(ctx, pattern5_1);
5634                             let expr3_0: usize = 1;
5635                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr2_0, expr3_0)?;
5636                             let expr5_0 = constructor_do_clz(ctx, expr0_0, expr1_0, expr4_0)?;
5637                             let expr6_0: Type = I64;
5638                             let expr7_0: Type = I64;
5639                             let expr8_0: Type = I64;
5640                             let expr9_0 = C::put_in_regs(ctx, pattern5_1);
5641                             let expr10_0: usize = 0;
5642                             let expr11_0 = constructor_value_regs_get_gpr(ctx, expr9_0, expr10_0)?;
5643                             let expr12_0 = constructor_do_clz(ctx, expr7_0, expr8_0, expr11_0)?;
5644                             let expr13_0: u32 = 64;
5645                             let expr14_0 = RegMemImm::Imm { simm32: expr13_0 };
5646                             let expr15_0 = C::gpr_mem_imm_new(ctx, &expr14_0);
5647                             let expr16_0 = constructor_add(ctx, expr6_0, expr12_0, &expr15_0)?;
5648                             let expr17_0 = OperandSize::Size64;
5649                             let expr18_0: u32 = 64;
5650                             let expr19_0 = constructor_cmp_imm(ctx, &expr17_0, expr18_0, expr5_0)?;
5651                             let expr20_0: Type = I64;
5652                             let expr21_0 = CC::NZ;
5653                             let expr22_0 = C::gpr_to_gpr_mem(ctx, expr5_0);
5654                             let expr23_0 =
5655                                 constructor_cmove(ctx, expr20_0, &expr21_0, &expr22_0, expr16_0)?;
5656                             let expr24_0 = constructor_with_flags_reg(ctx, &expr19_0, &expr23_0)?;
5657                             let expr25_0 = C::gpr_new(ctx, expr24_0);
5658                             let expr26_0 = C::gpr_to_reg(ctx, expr25_0);
5659                             let expr27_0: Type = I64;
5660                             let expr28_0: u64 = 0;
5661                             let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0)?;
5662                             let expr30_0 = C::value_regs(ctx, expr26_0, expr29_0);
5663                             let expr31_0 = C::output(ctx, expr30_0);
5664                             return Some(expr31_0);
5665                         }
5666                         &Opcode::Ctz => {
5667                             // Rule at src/isa/x64/lower.isle line 1696.
5668                             let expr0_0: Type = I64;
5669                             let expr1_0: Type = I64;
5670                             let expr2_0 = C::put_in_regs(ctx, pattern5_1);
5671                             let expr3_0: usize = 0;
5672                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr2_0, expr3_0)?;
5673                             let expr5_0 = constructor_do_ctz(ctx, expr0_0, expr1_0, expr4_0)?;
5674                             let expr6_0: Type = I64;
5675                             let expr7_0: Type = I64;
5676                             let expr8_0: Type = I64;
5677                             let expr9_0 = C::put_in_regs(ctx, pattern5_1);
5678                             let expr10_0: usize = 1;
5679                             let expr11_0 = constructor_value_regs_get_gpr(ctx, expr9_0, expr10_0)?;
5680                             let expr12_0 = constructor_do_ctz(ctx, expr7_0, expr8_0, expr11_0)?;
5681                             let expr13_0: u32 = 64;
5682                             let expr14_0 = RegMemImm::Imm { simm32: expr13_0 };
5683                             let expr15_0 = C::gpr_mem_imm_new(ctx, &expr14_0);
5684                             let expr16_0 = constructor_add(ctx, expr6_0, expr12_0, &expr15_0)?;
5685                             let expr17_0 = OperandSize::Size64;
5686                             let expr18_0: u32 = 64;
5687                             let expr19_0 = constructor_cmp_imm(ctx, &expr17_0, expr18_0, expr5_0)?;
5688                             let expr20_0: Type = I64;
5689                             let expr21_0 = CC::Z;
5690                             let expr22_0 = C::gpr_to_gpr_mem(ctx, expr16_0);
5691                             let expr23_0 =
5692                                 constructor_cmove(ctx, expr20_0, &expr21_0, &expr22_0, expr5_0)?;
5693                             let expr24_0 = constructor_with_flags_reg(ctx, &expr19_0, &expr23_0)?;
5694                             let expr25_0 = C::gpr_new(ctx, expr24_0);
5695                             let expr26_0 = C::gpr_to_reg(ctx, expr25_0);
5696                             let expr27_0: Type = I64;
5697                             let expr28_0: u64 = 0;
5698                             let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0)?;
5699                             let expr30_0 = C::value_regs(ctx, expr26_0, expr29_0);
5700                             let expr31_0 = C::output(ctx, expr30_0);
5701                             return Some(expr31_0);
5702                         }
5703                         &Opcode::Popcnt => {
5704                             // Rule at src/isa/x64/lower.isle line 1748.
5705                             let expr0_0: Type = I64;
5706                             let expr1_0 = C::put_in_regs(ctx, pattern5_1);
5707                             let expr2_0: usize = 0;
5708                             let expr3_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr2_0)?;
5709                             let expr4_0 = constructor_do_popcnt(ctx, expr0_0, expr3_0)?;
5710                             let expr5_0: Type = I64;
5711                             let expr6_0 = C::put_in_regs(ctx, pattern5_1);
5712                             let expr7_0: usize = 1;
5713                             let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0)?;
5714                             let expr9_0 = constructor_do_popcnt(ctx, expr5_0, expr8_0)?;
5715                             let expr10_0: Type = I64;
5716                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
5717                             let expr12_0 = constructor_add(ctx, expr10_0, expr4_0, &expr11_0)?;
5718                             let expr13_0 = C::gpr_to_reg(ctx, expr12_0);
5719                             let expr14_0: Type = I64;
5720                             let expr15_0: u64 = 0;
5721                             let expr16_0 = constructor_imm(ctx, expr14_0, expr15_0)?;
5722                             let expr17_0 = C::value_regs(ctx, expr13_0, expr16_0);
5723                             let expr18_0 = C::output(ctx, expr17_0);
5724                             return Some(expr18_0);
5725                         }
5726                         &Opcode::Bint => {
5727                             // Rule at src/isa/x64/lower.isle line 2099.
5728                             let expr0_0: Type = I64;
5729                             let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
5730                             let expr2_0: u32 = 1;
5731                             let expr3_0 = RegMemImm::Imm { simm32: expr2_0 };
5732                             let expr4_0 = C::gpr_mem_imm_new(ctx, &expr3_0);
5733                             let expr5_0 = constructor_x64_and(ctx, expr0_0, expr1_0, &expr4_0)?;
5734                             let expr6_0 = C::gpr_to_reg(ctx, expr5_0);
5735                             let expr7_0: Type = I64;
5736                             let expr8_0: u64 = 0;
5737                             let expr9_0 = constructor_imm(ctx, expr7_0, expr8_0)?;
5738                             let expr10_0 = C::value_regs(ctx, expr6_0, expr9_0);
5739                             let expr11_0 = C::output(ctx, expr10_0);
5740                             return Some(expr11_0);
5741                         }
5742                         &Opcode::Uextend => {
5743                             let pattern7_0 = C::value_type(ctx, pattern5_1);
5744                             if pattern7_0 == I64 {
5745                                 // Rule at src/isa/x64/lower.isle line 1971.
5746                                 let expr0_0 = C::put_in_reg(ctx, pattern5_1);
5747                                 let expr1_0: Type = I64;
5748                                 let expr2_0: u64 = 0;
5749                                 let expr3_0 = constructor_imm(ctx, expr1_0, expr2_0)?;
5750                                 let expr4_0 = C::value_regs(ctx, expr0_0, expr3_0);
5751                                 let expr5_0 = C::output(ctx, expr4_0);
5752                                 return Some(expr5_0);
5753                             }
5754                             if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) {
5755                                 // Rule at src/isa/x64/lower.isle line 1975.
5756                                 let expr0_0: Type = I64;
5757                                 let expr1_0 = ExtendKind::Zero;
5758                                 let expr2_0 =
5759                                     constructor_extend_to_gpr(ctx, pattern5_1, expr0_0, &expr1_0)?;
5760                                 let expr3_0 = C::gpr_to_reg(ctx, expr2_0);
5761                                 let expr4_0: Type = I64;
5762                                 let expr5_0: u64 = 0;
5763                                 let expr6_0 = constructor_imm(ctx, expr4_0, expr5_0)?;
5764                                 let expr7_0 = C::value_regs(ctx, expr3_0, expr6_0);
5765                                 let expr8_0 = C::output(ctx, expr7_0);
5766                                 return Some(expr8_0);
5767                             }
5768                         }
5769                         _ => {}
5770                     }
5771                 }
5772                 &InstructionData::BinaryImm64 {
5773                     opcode: ref pattern5_0,
5774                     arg: pattern5_1,
5775                     imm: pattern5_2,
5776                 } => {
5777                     if let &Opcode::IaddImm = pattern5_0 {
5778                         let pattern7_0 = C::u64_from_imm64(ctx, pattern5_2);
5779                         // Rule at src/isa/x64/lower.isle line 210.
5780                         let expr0_0 = C::put_in_regs(ctx, pattern5_1);
5781                         let expr1_0: usize = 0;
5782                         let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
5783                         let expr3_0: usize = 1;
5784                         let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
5785                         let expr5_0: Type = I64;
5786                         let expr6_0 = constructor_imm(ctx, expr5_0, pattern7_0)?;
5787                         let expr7_0 = C::gpr_new(ctx, expr6_0);
5788                         let expr8_0: Type = I64;
5789                         let expr9_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
5790                         let expr10_0 =
5791                             constructor_add_with_flags_paired(ctx, expr8_0, expr2_0, &expr9_0)?;
5792                         let expr11_0: Type = I64;
5793                         let expr12_0: u32 = 0;
5794                         let expr13_0 = RegMemImm::Imm { simm32: expr12_0 };
5795                         let expr14_0 = C::gpr_mem_imm_new(ctx, &expr13_0);
5796                         let expr15_0 = constructor_adc_paired(ctx, expr11_0, expr4_0, &expr14_0)?;
5797                         let expr16_0 = constructor_with_flags(ctx, &expr10_0, &expr15_0)?;
5798                         let expr17_0 = C::output(ctx, expr16_0);
5799                         return Some(expr17_0);
5800                     }
5801                 }
5802                 _ => {}
5803             }
5804         }
5805         if pattern2_0 == F32 {
5806             let pattern4_0 = C::inst_data(ctx, pattern0_0);
5807             if let &InstructionData::Binary {
5808                 opcode: ref pattern5_0,
5809                 args: ref pattern5_1,
5810             } = &pattern4_0
5811             {
5812                 match pattern5_0 {
5813                     &Opcode::Fadd => {
5814                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5815                         // Rule at src/isa/x64/lower.isle line 2122.
5816                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5817                         let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5818                         let expr2_0 = constructor_addss(ctx, expr0_0, &expr1_0)?;
5819                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5820                         return Some(expr3_0);
5821                     }
5822                     &Opcode::Fsub => {
5823                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5824                         // Rule at src/isa/x64/lower.isle line 2133.
5825                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5826                         let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5827                         let expr2_0 = constructor_subss(ctx, expr0_0, &expr1_0)?;
5828                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5829                         return Some(expr3_0);
5830                     }
5831                     &Opcode::Fmul => {
5832                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5833                         // Rule at src/isa/x64/lower.isle line 2144.
5834                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5835                         let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5836                         let expr2_0 = constructor_mulss(ctx, expr0_0, &expr1_0)?;
5837                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5838                         return Some(expr3_0);
5839                     }
5840                     &Opcode::Fdiv => {
5841                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5842                         // Rule at src/isa/x64/lower.isle line 2155.
5843                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5844                         let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5845                         let expr2_0 = constructor_divss(ctx, expr0_0, &expr1_0)?;
5846                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5847                         return Some(expr3_0);
5848                     }
5849                     &Opcode::Fmin => {
5850                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5851                         // Rule at src/isa/x64/lower.isle line 2166.
5852                         let expr0_0: Type = F32;
5853                         let expr1_0: bool = true;
5854                         let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5855                         let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5856                         let expr4_0 =
5857                             constructor_xmm_min_max_seq(ctx, expr0_0, expr1_0, expr2_0, expr3_0)?;
5858                         let expr5_0 = constructor_output_xmm(ctx, expr4_0)?;
5859                         return Some(expr5_0);
5860                     }
5861                     &Opcode::FminPseudo => {
5862                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5863                         // Rule at src/isa/x64/lower.isle line 2335.
5864                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5865                         let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5866                         let expr2_0 = constructor_minss(ctx, expr0_0, expr1_0)?;
5867                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5868                         return Some(expr3_0);
5869                     }
5870                     &Opcode::Fmax => {
5871                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5872                         // Rule at src/isa/x64/lower.isle line 2238.
5873                         let expr0_0: Type = F32;
5874                         let expr1_0: bool = false;
5875                         let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5876                         let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5877                         let expr4_0 =
5878                             constructor_xmm_min_max_seq(ctx, expr0_0, expr1_0, expr2_0, expr3_0)?;
5879                         let expr5_0 = constructor_output_xmm(ctx, expr4_0)?;
5880                         return Some(expr5_0);
5881                     }
5882                     &Opcode::FmaxPseudo => {
5883                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5884                         // Rule at src/isa/x64/lower.isle line 2346.
5885                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5886                         let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5887                         let expr2_0 = constructor_maxss(ctx, expr0_0, expr1_0)?;
5888                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5889                         return Some(expr3_0);
5890                     }
5891                     _ => {}
5892                 }
5893             }
5894         }
5895         if pattern2_0 == F64 {
5896             let pattern4_0 = C::inst_data(ctx, pattern0_0);
5897             if let &InstructionData::Binary {
5898                 opcode: ref pattern5_0,
5899                 args: ref pattern5_1,
5900             } = &pattern4_0
5901             {
5902                 match pattern5_0 {
5903                     &Opcode::Fadd => {
5904                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5905                         // Rule at src/isa/x64/lower.isle line 2124.
5906                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5907                         let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5908                         let expr2_0 = constructor_addsd(ctx, expr0_0, &expr1_0)?;
5909                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5910                         return Some(expr3_0);
5911                     }
5912                     &Opcode::Fsub => {
5913                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5914                         // Rule at src/isa/x64/lower.isle line 2135.
5915                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5916                         let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5917                         let expr2_0 = constructor_subsd(ctx, expr0_0, &expr1_0)?;
5918                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5919                         return Some(expr3_0);
5920                     }
5921                     &Opcode::Fmul => {
5922                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5923                         // Rule at src/isa/x64/lower.isle line 2146.
5924                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5925                         let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5926                         let expr2_0 = constructor_mulsd(ctx, expr0_0, &expr1_0)?;
5927                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5928                         return Some(expr3_0);
5929                     }
5930                     &Opcode::Fdiv => {
5931                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5932                         // Rule at src/isa/x64/lower.isle line 2157.
5933                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5934                         let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5935                         let expr2_0 = constructor_divsd(ctx, expr0_0, &expr1_0)?;
5936                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5937                         return Some(expr3_0);
5938                     }
5939                     &Opcode::Fmin => {
5940                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5941                         // Rule at src/isa/x64/lower.isle line 2168.
5942                         let expr0_0: Type = F64;
5943                         let expr1_0: bool = true;
5944                         let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5945                         let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5946                         let expr4_0 =
5947                             constructor_xmm_min_max_seq(ctx, expr0_0, expr1_0, expr2_0, expr3_0)?;
5948                         let expr5_0 = constructor_output_xmm(ctx, expr4_0)?;
5949                         return Some(expr5_0);
5950                     }
5951                     &Opcode::FminPseudo => {
5952                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5953                         // Rule at src/isa/x64/lower.isle line 2337.
5954                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5955                         let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5956                         let expr2_0 = constructor_minsd(ctx, expr0_0, expr1_0)?;
5957                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5958                         return Some(expr3_0);
5959                     }
5960                     &Opcode::Fmax => {
5961                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5962                         // Rule at src/isa/x64/lower.isle line 2240.
5963                         let expr0_0: Type = F64;
5964                         let expr1_0: bool = false;
5965                         let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5966                         let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5967                         let expr4_0 =
5968                             constructor_xmm_min_max_seq(ctx, expr0_0, expr1_0, expr2_0, expr3_0)?;
5969                         let expr5_0 = constructor_output_xmm(ctx, expr4_0)?;
5970                         return Some(expr5_0);
5971                     }
5972                     &Opcode::FmaxPseudo => {
5973                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5974                         // Rule at src/isa/x64/lower.isle line 2348.
5975                         let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
5976                         let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5977                         let expr2_0 = constructor_maxsd(ctx, expr0_0, expr1_0)?;
5978                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
5979                         return Some(expr3_0);
5980                     }
5981                     _ => {}
5982                 }
5983             }
5984         }
5985         if pattern2_0 == I8X16 {
5986             let pattern4_0 = C::inst_data(ctx, pattern0_0);
5987             match &pattern4_0 {
5988                 &InstructionData::Binary {
5989                     opcode: ref pattern5_0,
5990                     args: ref pattern5_1,
5991                 } => {
5992                     match pattern5_0 {
5993                         &Opcode::Imin => {
5994                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
5995                             // Rule at src/isa/x64/lower.isle line 1402.
5996                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
5997                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5998                             let expr2_0 = constructor_pminsb(ctx, expr0_0, &expr1_0)?;
5999                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6000                             return Some(expr3_0);
6001                         }
6002                         &Opcode::Umin => {
6003                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6004                             // Rule at src/isa/x64/lower.isle line 1424.
6005                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6006                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6007                             let expr2_0 = constructor_pminub(ctx, expr0_0, &expr1_0)?;
6008                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6009                             return Some(expr3_0);
6010                         }
6011                         &Opcode::Imax => {
6012                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6013                             // Rule at src/isa/x64/lower.isle line 1391.
6014                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6015                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6016                             let expr2_0 = constructor_pmaxsb(ctx, expr0_0, &expr1_0)?;
6017                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6018                             return Some(expr3_0);
6019                         }
6020                         &Opcode::Umax => {
6021                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6022                             // Rule at src/isa/x64/lower.isle line 1413.
6023                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6024                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6025                             let expr2_0 = constructor_pmaxub(ctx, expr0_0, &expr1_0)?;
6026                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6027                             return Some(expr3_0);
6028                         }
6029                         &Opcode::Ishl => {
6030                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6031                             // Rule at src/isa/x64/lower.isle line 534.
6032                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6033                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
6034                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
6035                             let expr3_0 = constructor_psllw(ctx, expr0_0, &expr2_0)?;
6036                             let expr4_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
6037                             let expr5_0 = constructor_ishl_i8x16_mask(ctx, &expr4_0)?;
6038                             let expr6_0: Type = I8X16;
6039                             let expr7_0 = ExtKind::None;
6040                             let expr8_0 = constructor_x64_load(ctx, expr6_0, &expr5_0, &expr7_0)?;
6041                             let expr9_0: Type = I8X16;
6042                             let expr10_0 = RegMem::Reg { reg: expr8_0 };
6043                             let expr11_0 = C::reg_mem_to_xmm_mem(ctx, &expr10_0);
6044                             let expr12_0 = constructor_sse_and(ctx, expr9_0, expr3_0, &expr11_0)?;
6045                             let expr13_0 = constructor_output_xmm(ctx, expr12_0)?;
6046                             return Some(expr13_0);
6047                         }
6048                         &Opcode::Ushr => {
6049                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6050                             // Rule at src/isa/x64/lower.isle line 633.
6051                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6052                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
6053                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
6054                             let expr3_0 = constructor_psrlw(ctx, expr0_0, &expr2_0)?;
6055                             let expr4_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
6056                             let expr5_0 = constructor_ushr_i8x16_mask(ctx, &expr4_0)?;
6057                             let expr6_0: Type = I8X16;
6058                             let expr7_0 = ExtKind::None;
6059                             let expr8_0 = constructor_x64_load(ctx, expr6_0, &expr5_0, &expr7_0)?;
6060                             let expr9_0: Type = I8X16;
6061                             let expr10_0 = RegMem::Reg { reg: expr8_0 };
6062                             let expr11_0 = C::reg_mem_to_xmm_mem(ctx, &expr10_0);
6063                             let expr12_0 = constructor_sse_and(ctx, expr9_0, expr3_0, &expr11_0)?;
6064                             let expr13_0 = constructor_output_xmm(ctx, expr12_0)?;
6065                             return Some(expr13_0);
6066                         }
6067                         &Opcode::Sshr => {
6068                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6069                             let pattern8_0 = C::value_type(ctx, pattern7_1);
6070                             // Rule at src/isa/x64/lower.isle line 749.
6071                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6072                             let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
6073                             let expr2_0 = constructor_punpcklbw(ctx, expr0_0, &expr1_0)?;
6074                             let expr3_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
6075                             let expr4_0 = constructor_punpckhbw(ctx, expr0_0, &expr3_0)?;
6076                             let expr5_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
6077                             let expr6_0 =
6078                                 constructor_sshr_i8x16_bigger_shift(ctx, pattern8_0, &expr5_0)?;
6079                             let expr7_0 = constructor_psraw(ctx, expr2_0, &expr6_0)?;
6080                             let expr8_0 = constructor_psraw(ctx, expr4_0, &expr6_0)?;
6081                             let expr9_0 = C::xmm_to_xmm_mem(ctx, expr8_0);
6082                             let expr10_0 = constructor_packsswb(ctx, expr7_0, &expr9_0)?;
6083                             let expr11_0 = constructor_output_xmm(ctx, expr10_0)?;
6084                             return Some(expr11_0);
6085                         }
6086                         _ => {}
6087                     }
6088                 }
6089                 &InstructionData::Unary {
6090                     opcode: ref pattern5_0,
6091                     arg: pattern5_1,
6092                 } => {
6093                     match pattern5_0 {
6094                         &Opcode::Ineg => {
6095                             // Rule at src/isa/x64/lower.isle line 889.
6096                             let expr0_0: Type = I8X16;
6097                             let expr1_0: u64 = 0;
6098                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
6099                             let expr3_0 = C::xmm_new(ctx, expr2_0);
6100                             let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
6101                             let expr5_0 = constructor_psubb(ctx, expr3_0, &expr4_0)?;
6102                             let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
6103                             return Some(expr6_0);
6104                         }
6105                         &Opcode::Iabs => {
6106                             // Rule at src/isa/x64/lower.isle line 1210.
6107                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
6108                             let expr1_0 = constructor_pabsb(ctx, &expr0_0)?;
6109                             let expr2_0 = constructor_output_xmm(ctx, expr1_0)?;
6110                             return Some(expr2_0);
6111                         }
6112                         &Opcode::Popcnt => {
6113                             // Rule at src/isa/x64/lower.isle line 1855.
6114                             let expr0_0 = C::popcount_4bit_table(ctx);
6115                             let expr1_0: Type = I8X16;
6116                             let expr2_0 = C::popcount_low_mask(ctx);
6117                             let expr3_0 = constructor_xmm_load_const(ctx, expr1_0, expr2_0)?;
6118                             let expr4_0: Type = I8X16;
6119                             let expr5_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
6120                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr3_0);
6121                             let expr7_0 = constructor_sse_and(ctx, expr4_0, expr5_0, &expr6_0)?;
6122                             let expr8_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
6123                             let expr9_0: u32 = 4;
6124                             let expr10_0 = RegMemImm::Imm { simm32: expr9_0 };
6125                             let expr11_0 = constructor_mov_rmi_to_xmm(ctx, &expr10_0)?;
6126                             let expr12_0 = constructor_psrlw(ctx, expr8_0, &expr11_0)?;
6127                             let expr13_0: Type = I8X16;
6128                             let expr14_0 = C::xmm_to_xmm_mem(ctx, expr3_0);
6129                             let expr15_0 = constructor_sse_and(ctx, expr13_0, expr12_0, &expr14_0)?;
6130                             let expr16_0: Type = I8X16;
6131                             let expr17_0 = C::popcount_4bit_table(ctx);
6132                             let expr18_0 = constructor_xmm_load_const(ctx, expr16_0, expr17_0)?;
6133                             let expr19_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
6134                             let expr20_0 = constructor_pshufb(ctx, expr18_0, &expr19_0)?;
6135                             let expr21_0 = C::xmm_to_xmm_mem(ctx, expr15_0);
6136                             let expr22_0 = constructor_pshufb(ctx, expr18_0, &expr21_0)?;
6137                             let expr23_0 = C::xmm_to_xmm_mem(ctx, expr22_0);
6138                             let expr24_0 = constructor_paddb(ctx, expr20_0, &expr23_0)?;
6139                             let expr25_0 = constructor_output_xmm(ctx, expr24_0)?;
6140                             return Some(expr25_0);
6141                         }
6142                         _ => {}
6143                     }
6144                 }
6145                 _ => {}
6146             }
6147         }
6148         if pattern2_0 == I16X8 {
6149             let pattern4_0 = C::inst_data(ctx, pattern0_0);
6150             match &pattern4_0 {
6151                 &InstructionData::Binary {
6152                     opcode: ref pattern5_0,
6153                     args: ref pattern5_1,
6154                 } => {
6155                     match pattern5_0 {
6156                         &Opcode::Imin => {
6157                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6158                             // Rule at src/isa/x64/lower.isle line 1405.
6159                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6160                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6161                             let expr2_0 = constructor_pminsw(ctx, expr0_0, &expr1_0)?;
6162                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6163                             return Some(expr3_0);
6164                         }
6165                         &Opcode::Umin => {
6166                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6167                             // Rule at src/isa/x64/lower.isle line 1427.
6168                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6169                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6170                             let expr2_0 = constructor_pminuw(ctx, expr0_0, &expr1_0)?;
6171                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6172                             return Some(expr3_0);
6173                         }
6174                         &Opcode::Imax => {
6175                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6176                             // Rule at src/isa/x64/lower.isle line 1394.
6177                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6178                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6179                             let expr2_0 = constructor_pmaxsw(ctx, expr0_0, &expr1_0)?;
6180                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6181                             return Some(expr3_0);
6182                         }
6183                         &Opcode::Umax => {
6184                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6185                             // Rule at src/isa/x64/lower.isle line 1416.
6186                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6187                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6188                             let expr2_0 = constructor_pmaxuw(ctx, expr0_0, &expr1_0)?;
6189                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6190                             return Some(expr3_0);
6191                         }
6192                         &Opcode::Ishl => {
6193                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6194                             // Rule at src/isa/x64/lower.isle line 576.
6195                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6196                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
6197                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
6198                             let expr3_0 = constructor_psllw(ctx, expr0_0, &expr2_0)?;
6199                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
6200                             return Some(expr4_0);
6201                         }
6202                         &Opcode::Ushr => {
6203                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6204                             // Rule at src/isa/x64/lower.isle line 678.
6205                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6206                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
6207                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
6208                             let expr3_0 = constructor_psrlw(ctx, expr0_0, &expr2_0)?;
6209                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
6210                             return Some(expr4_0);
6211                         }
6212                         &Opcode::Sshr => {
6213                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6214                             // Rule at src/isa/x64/lower.isle line 776.
6215                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6216                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
6217                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
6218                             let expr3_0 = constructor_psraw(ctx, expr0_0, &expr2_0)?;
6219                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
6220                             return Some(expr4_0);
6221                         }
6222                         _ => {}
6223                     }
6224                 }
6225                 &InstructionData::Unary {
6226                     opcode: ref pattern5_0,
6227                     arg: pattern5_1,
6228                 } => {
6229                     match pattern5_0 {
6230                         &Opcode::Ineg => {
6231                             // Rule at src/isa/x64/lower.isle line 892.
6232                             let expr0_0: Type = I16X8;
6233                             let expr1_0: u64 = 0;
6234                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
6235                             let expr3_0 = C::xmm_new(ctx, expr2_0);
6236                             let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
6237                             let expr5_0 = constructor_psubw(ctx, expr3_0, &expr4_0)?;
6238                             let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
6239                             return Some(expr6_0);
6240                         }
6241                         &Opcode::Iabs => {
6242                             // Rule at src/isa/x64/lower.isle line 1213.
6243                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
6244                             let expr1_0 = constructor_pabsw(ctx, &expr0_0)?;
6245                             let expr2_0 = constructor_output_xmm(ctx, expr1_0)?;
6246                             return Some(expr2_0);
6247                         }
6248                         _ => {}
6249                     }
6250                 }
6251                 _ => {}
6252             }
6253         }
6254         if pattern2_0 == I32X4 {
6255             let pattern4_0 = C::inst_data(ctx, pattern0_0);
6256             match &pattern4_0 {
6257                 &InstructionData::Binary {
6258                     opcode: ref pattern5_0,
6259                     args: ref pattern5_1,
6260                 } => {
6261                     match pattern5_0 {
6262                         &Opcode::Imin => {
6263                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6264                             // Rule at src/isa/x64/lower.isle line 1408.
6265                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6266                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6267                             let expr2_0 = constructor_pminsd(ctx, expr0_0, &expr1_0)?;
6268                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6269                             return Some(expr3_0);
6270                         }
6271                         &Opcode::Umin => {
6272                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6273                             // Rule at src/isa/x64/lower.isle line 1430.
6274                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6275                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6276                             let expr2_0 = constructor_pminud(ctx, expr0_0, &expr1_0)?;
6277                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6278                             return Some(expr3_0);
6279                         }
6280                         &Opcode::Imax => {
6281                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6282                             // Rule at src/isa/x64/lower.isle line 1397.
6283                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6284                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6285                             let expr2_0 = constructor_pmaxsd(ctx, expr0_0, &expr1_0)?;
6286                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6287                             return Some(expr3_0);
6288                         }
6289                         &Opcode::Umax => {
6290                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6291                             // Rule at src/isa/x64/lower.isle line 1419.
6292                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6293                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6294                             let expr2_0 = constructor_pmaxud(ctx, expr0_0, &expr1_0)?;
6295                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6296                             return Some(expr3_0);
6297                         }
6298                         &Opcode::Ishl => {
6299                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6300                             // Rule at src/isa/x64/lower.isle line 579.
6301                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6302                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
6303                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
6304                             let expr3_0 = constructor_pslld(ctx, expr0_0, &expr2_0)?;
6305                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
6306                             return Some(expr4_0);
6307                         }
6308                         &Opcode::Ushr => {
6309                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6310                             // Rule at src/isa/x64/lower.isle line 681.
6311                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6312                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
6313                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
6314                             let expr3_0 = constructor_psrld(ctx, expr0_0, &expr2_0)?;
6315                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
6316                             return Some(expr4_0);
6317                         }
6318                         &Opcode::Sshr => {
6319                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6320                             // Rule at src/isa/x64/lower.isle line 779.
6321                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6322                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
6323                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
6324                             let expr3_0 = constructor_psrad(ctx, expr0_0, &expr2_0)?;
6325                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
6326                             return Some(expr4_0);
6327                         }
6328                         &Opcode::WideningPairwiseDotProductS => {
6329                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6330                             // Rule at src/isa/x64/lower.isle line 2112.
6331                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6332                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6333                             let expr2_0 = constructor_pmaddwd(ctx, expr0_0, &expr1_0)?;
6334                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6335                             return Some(expr3_0);
6336                         }
6337                         _ => {}
6338                     }
6339                 }
6340                 &InstructionData::Unary {
6341                     opcode: ref pattern5_0,
6342                     arg: pattern5_1,
6343                 } => {
6344                     match pattern5_0 {
6345                         &Opcode::Ineg => {
6346                             // Rule at src/isa/x64/lower.isle line 895.
6347                             let expr0_0: Type = I32X4;
6348                             let expr1_0: u64 = 0;
6349                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
6350                             let expr3_0 = C::xmm_new(ctx, expr2_0);
6351                             let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
6352                             let expr5_0 = constructor_psubd(ctx, expr3_0, &expr4_0)?;
6353                             let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
6354                             return Some(expr6_0);
6355                         }
6356                         &Opcode::Iabs => {
6357                             // Rule at src/isa/x64/lower.isle line 1216.
6358                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
6359                             let expr1_0 = constructor_pabsd(ctx, &expr0_0)?;
6360                             let expr2_0 = constructor_output_xmm(ctx, expr1_0)?;
6361                             return Some(expr2_0);
6362                         }
6363                         _ => {}
6364                     }
6365                 }
6366                 _ => {}
6367             }
6368         }
6369         if pattern2_0 == I64X2 {
6370             let pattern4_0 = C::inst_data(ctx, pattern0_0);
6371             match &pattern4_0 {
6372                 &InstructionData::Binary {
6373                     opcode: ref pattern5_0,
6374                     args: ref pattern5_1,
6375                 } => {
6376                     match pattern5_0 {
6377                         &Opcode::Ishl => {
6378                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6379                             // Rule at src/isa/x64/lower.isle line 582.
6380                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6381                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
6382                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
6383                             let expr3_0 = constructor_psllq(ctx, expr0_0, &expr2_0)?;
6384                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
6385                             return Some(expr4_0);
6386                         }
6387                         &Opcode::Ushr => {
6388                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6389                             // Rule at src/isa/x64/lower.isle line 684.
6390                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6391                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
6392                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
6393                             let expr3_0 = constructor_psrlq(ctx, expr0_0, &expr2_0)?;
6394                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
6395                             return Some(expr4_0);
6396                         }
6397                         &Opcode::Sshr => {
6398                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6399                             // Rule at src/isa/x64/lower.isle line 790.
6400                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6401                             let expr1_0: Type = I64;
6402                             let expr2_0: u8 = 0;
6403                             let expr3_0 = constructor_pextrd(ctx, expr1_0, expr0_0, expr2_0)?;
6404                             let expr4_0: Type = I64;
6405                             let expr5_0: u8 = 1;
6406                             let expr6_0 = constructor_pextrd(ctx, expr4_0, expr0_0, expr5_0)?;
6407                             let expr7_0: Type = I64;
6408                             let expr8_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, expr7_0);
6409                             let expr9_0: Type = I64;
6410                             let expr10_0 = constructor_sar(ctx, expr9_0, expr3_0, &expr8_0)?;
6411                             let expr11_0: Type = I64;
6412                             let expr12_0 = constructor_sar(ctx, expr11_0, expr6_0, &expr8_0)?;
6413                             let expr13_0 = C::gpr_to_gpr_mem(ctx, expr10_0);
6414                             let expr14_0 = C::gpr_to_gpr_mem(ctx, expr12_0);
6415                             let expr15_0 =
6416                                 constructor_make_i64x2_from_lanes(ctx, &expr13_0, &expr14_0)?;
6417                             let expr16_0 = constructor_output_xmm(ctx, expr15_0)?;
6418                             return Some(expr16_0);
6419                         }
6420                         _ => {}
6421                     }
6422                 }
6423                 &InstructionData::Unary {
6424                     opcode: ref pattern5_0,
6425                     arg: pattern5_1,
6426                 } => {
6427                     match pattern5_0 {
6428                         &Opcode::Ineg => {
6429                             // Rule at src/isa/x64/lower.isle line 898.
6430                             let expr0_0: Type = I64X2;
6431                             let expr1_0: u64 = 0;
6432                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
6433                             let expr3_0 = C::xmm_new(ctx, expr2_0);
6434                             let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
6435                             let expr5_0 = constructor_psubq(ctx, expr3_0, &expr4_0)?;
6436                             let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
6437                             return Some(expr6_0);
6438                         }
6439                         &Opcode::Iabs => {
6440                             // Rule at src/isa/x64/lower.isle line 1230.
6441                             let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
6442                             let expr1_0: Type = I64X2;
6443                             let expr2_0: u64 = 0;
6444                             let expr3_0 = constructor_imm(ctx, expr1_0, expr2_0)?;
6445                             let expr4_0 = C::xmm_new(ctx, expr3_0);
6446                             let expr5_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
6447                             let expr6_0 = constructor_psubq(ctx, expr4_0, &expr5_0)?;
6448                             let expr7_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
6449                             let expr8_0 = constructor_blendvpd(ctx, expr6_0, &expr7_0, expr6_0)?;
6450                             let expr9_0 = constructor_output_xmm(ctx, expr8_0)?;
6451                             return Some(expr9_0);
6452                         }
6453                         _ => {}
6454                     }
6455                 }
6456                 _ => {}
6457             }
6458         }
6459         if pattern2_0 == F32X4 {
6460             let pattern4_0 = C::inst_data(ctx, pattern0_0);
6461             match &pattern4_0 {
6462                 &InstructionData::Binary {
6463                     opcode: ref pattern5_0,
6464                     args: ref pattern5_1,
6465                 } => {
6466                     match pattern5_0 {
6467                         &Opcode::Fadd => {
6468                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6469                             // Rule at src/isa/x64/lower.isle line 2126.
6470                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6471                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6472                             let expr2_0 = constructor_addps(ctx, expr0_0, &expr1_0)?;
6473                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6474                             return Some(expr3_0);
6475                         }
6476                         &Opcode::Fsub => {
6477                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6478                             // Rule at src/isa/x64/lower.isle line 2137.
6479                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6480                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6481                             let expr2_0 = constructor_subps(ctx, expr0_0, &expr1_0)?;
6482                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6483                             return Some(expr3_0);
6484                         }
6485                         &Opcode::Fmul => {
6486                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6487                             // Rule at src/isa/x64/lower.isle line 2148.
6488                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6489                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6490                             let expr2_0 = constructor_mulps(ctx, expr0_0, &expr1_0)?;
6491                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6492                             return Some(expr3_0);
6493                         }
6494                         &Opcode::Fdiv => {
6495                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6496                             // Rule at src/isa/x64/lower.isle line 2159.
6497                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6498                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6499                             let expr2_0 = constructor_divps(ctx, expr0_0, &expr1_0)?;
6500                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6501                             return Some(expr3_0);
6502                         }
6503                         &Opcode::Fmin => {
6504                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6505                             // Rule at src/isa/x64/lower.isle line 2183.
6506                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6507                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
6508                             let expr2_0 = constructor_minps(ctx, expr0_0, expr1_0)?;
6509                             let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
6510                             let expr4_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6511                             let expr5_0 = constructor_minps(ctx, expr3_0, expr4_0)?;
6512                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
6513                             let expr7_0 = constructor_orps(ctx, expr2_0, &expr6_0)?;
6514                             let expr8_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
6515                             let expr9_0 = FcmpImm::Unordered;
6516                             let expr10_0 = constructor_cmpps(ctx, expr7_0, &expr8_0, &expr9_0)?;
6517                             let expr11_0 = C::xmm_to_xmm_mem(ctx, expr10_0);
6518                             let expr12_0 = constructor_orps(ctx, expr7_0, &expr11_0)?;
6519                             let expr13_0: u32 = 10;
6520                             let expr14_0 = RegMemImm::Imm { simm32: expr13_0 };
6521                             let expr15_0 = constructor_mov_rmi_to_xmm(ctx, &expr14_0)?;
6522                             let expr16_0 = constructor_psrld(ctx, expr10_0, &expr15_0)?;
6523                             let expr17_0 = C::xmm_to_xmm_mem(ctx, expr12_0);
6524                             let expr18_0 = constructor_andnps(ctx, expr16_0, &expr17_0)?;
6525                             let expr19_0 = constructor_output_xmm(ctx, expr18_0)?;
6526                             return Some(expr19_0);
6527                         }
6528                         &Opcode::FminPseudo => {
6529                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6530                             // Rule at src/isa/x64/lower.isle line 2339.
6531                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
6532                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6533                             let expr2_0 = constructor_minps(ctx, expr0_0, expr1_0)?;
6534                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6535                             return Some(expr3_0);
6536                         }
6537                         &Opcode::Fmax => {
6538                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6539                             // Rule at src/isa/x64/lower.isle line 2246.
6540                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6541                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
6542                             let expr2_0 = constructor_maxps(ctx, expr0_0, expr1_0)?;
6543                             let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
6544                             let expr4_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6545                             let expr5_0 = constructor_maxps(ctx, expr3_0, expr4_0)?;
6546                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
6547                             let expr7_0 = constructor_xorps(ctx, expr2_0, &expr6_0)?;
6548                             let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
6549                             let expr9_0 = constructor_orps(ctx, expr2_0, &expr8_0)?;
6550                             let expr10_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
6551                             let expr11_0 = constructor_subps(ctx, expr9_0, &expr10_0)?;
6552                             let expr12_0 = C::xmm_to_xmm_mem(ctx, expr9_0);
6553                             let expr13_0 = FcmpImm::Unordered;
6554                             let expr14_0 = constructor_cmpps(ctx, expr9_0, &expr12_0, &expr13_0)?;
6555                             let expr15_0: u32 = 10;
6556                             let expr16_0 = RegMemImm::Imm { simm32: expr15_0 };
6557                             let expr17_0 = constructor_mov_rmi_to_xmm(ctx, &expr16_0)?;
6558                             let expr18_0 = constructor_psrld(ctx, expr14_0, &expr17_0)?;
6559                             let expr19_0 = C::xmm_to_xmm_mem(ctx, expr11_0);
6560                             let expr20_0 = constructor_andnps(ctx, expr18_0, &expr19_0)?;
6561                             let expr21_0 = constructor_output_xmm(ctx, expr20_0)?;
6562                             return Some(expr21_0);
6563                         }
6564                         &Opcode::FmaxPseudo => {
6565                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6566                             // Rule at src/isa/x64/lower.isle line 2350.
6567                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
6568                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6569                             let expr2_0 = constructor_maxps(ctx, expr0_0, expr1_0)?;
6570                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6571                             return Some(expr3_0);
6572                         }
6573                         _ => {}
6574                     }
6575                 }
6576                 &InstructionData::Unary {
6577                     opcode: ref pattern5_0,
6578                     arg: pattern5_1,
6579                 } => {
6580                     if let &Opcode::Fabs = pattern5_0 {
6581                         // Rule at src/isa/x64/lower.isle line 1238.
6582                         let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
6583                         let expr1_0: Type = F32X4;
6584                         let expr2_0 = constructor_vector_all_ones(ctx, expr1_0)?;
6585                         let expr3_0: u32 = 1;
6586                         let expr4_0 = RegMemImm::Imm { simm32: expr3_0 };
6587                         let expr5_0 = constructor_mov_rmi_to_xmm(ctx, &expr4_0)?;
6588                         let expr6_0 = constructor_psrld(ctx, expr2_0, &expr5_0)?;
6589                         let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0);
6590                         let expr8_0 = constructor_andps(ctx, expr0_0, &expr7_0)?;
6591                         let expr9_0 = constructor_output_xmm(ctx, expr8_0)?;
6592                         return Some(expr9_0);
6593                     }
6594                 }
6595                 _ => {}
6596             }
6597         }
6598         if pattern2_0 == F64X2 {
6599             let pattern4_0 = C::inst_data(ctx, pattern0_0);
6600             match &pattern4_0 {
6601                 &InstructionData::Binary {
6602                     opcode: ref pattern5_0,
6603                     args: ref pattern5_1,
6604                 } => {
6605                     match pattern5_0 {
6606                         &Opcode::Fadd => {
6607                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6608                             // Rule at src/isa/x64/lower.isle line 2128.
6609                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6610                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6611                             let expr2_0 = constructor_addpd(ctx, expr0_0, &expr1_0)?;
6612                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6613                             return Some(expr3_0);
6614                         }
6615                         &Opcode::Fsub => {
6616                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6617                             // Rule at src/isa/x64/lower.isle line 2139.
6618                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6619                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6620                             let expr2_0 = constructor_subpd(ctx, expr0_0, &expr1_0)?;
6621                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6622                             return Some(expr3_0);
6623                         }
6624                         &Opcode::Fmul => {
6625                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6626                             // Rule at src/isa/x64/lower.isle line 2150.
6627                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6628                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6629                             let expr2_0 = constructor_mulpd(ctx, expr0_0, &expr1_0)?;
6630                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6631                             return Some(expr3_0);
6632                         }
6633                         &Opcode::Fdiv => {
6634                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6635                             // Rule at src/isa/x64/lower.isle line 2161.
6636                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6637                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
6638                             let expr2_0 = constructor_divpd(ctx, expr0_0, &expr1_0)?;
6639                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6640                             return Some(expr3_0);
6641                         }
6642                         &Opcode::Fmin => {
6643                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6644                             // Rule at src/isa/x64/lower.isle line 2226.
6645                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6646                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
6647                             let expr2_0 = constructor_minpd(ctx, expr0_0, expr1_0)?;
6648                             let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
6649                             let expr4_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6650                             let expr5_0 = constructor_minpd(ctx, expr3_0, expr4_0)?;
6651                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
6652                             let expr7_0 = constructor_orpd(ctx, expr2_0, &expr6_0)?;
6653                             let expr8_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
6654                             let expr9_0 = FcmpImm::Unordered;
6655                             let expr10_0 = constructor_cmppd(ctx, expr2_0, &expr8_0, &expr9_0)?;
6656                             let expr11_0 = C::xmm_to_xmm_mem(ctx, expr10_0);
6657                             let expr12_0 = constructor_orpd(ctx, expr7_0, &expr11_0)?;
6658                             let expr13_0: u32 = 13;
6659                             let expr14_0 = RegMemImm::Imm { simm32: expr13_0 };
6660                             let expr15_0 = constructor_mov_rmi_to_xmm(ctx, &expr14_0)?;
6661                             let expr16_0 = constructor_psrlq(ctx, expr10_0, &expr15_0)?;
6662                             let expr17_0 = C::xmm_to_xmm_mem(ctx, expr12_0);
6663                             let expr18_0 = constructor_andnpd(ctx, expr16_0, &expr17_0)?;
6664                             let expr19_0 = constructor_output_xmm(ctx, expr18_0)?;
6665                             return Some(expr19_0);
6666                         }
6667                         &Opcode::FminPseudo => {
6668                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6669                             // Rule at src/isa/x64/lower.isle line 2341.
6670                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
6671                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6672                             let expr2_0 = constructor_minpd(ctx, expr0_0, expr1_0)?;
6673                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6674                             return Some(expr3_0);
6675                         }
6676                         &Opcode::Fmax => {
6677                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6678                             // Rule at src/isa/x64/lower.isle line 2289.
6679                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6680                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
6681                             let expr2_0 = constructor_maxpd(ctx, expr0_0, expr1_0)?;
6682                             let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
6683                             let expr4_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6684                             let expr5_0 = constructor_maxpd(ctx, expr3_0, expr4_0)?;
6685                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
6686                             let expr7_0 = constructor_xorpd(ctx, expr2_0, &expr6_0)?;
6687                             let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
6688                             let expr9_0 = constructor_orpd(ctx, expr2_0, &expr8_0)?;
6689                             let expr10_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
6690                             let expr11_0 = constructor_subpd(ctx, expr9_0, &expr10_0)?;
6691                             let expr12_0 = C::xmm_to_xmm_mem(ctx, expr9_0);
6692                             let expr13_0 = FcmpImm::Unordered;
6693                             let expr14_0 = constructor_cmppd(ctx, expr9_0, &expr12_0, &expr13_0)?;
6694                             let expr15_0: u32 = 13;
6695                             let expr16_0 = RegMemImm::Imm { simm32: expr15_0 };
6696                             let expr17_0 = constructor_mov_rmi_to_xmm(ctx, &expr16_0)?;
6697                             let expr18_0 = constructor_psrlq(ctx, expr14_0, &expr17_0)?;
6698                             let expr19_0 = C::xmm_to_xmm_mem(ctx, expr11_0);
6699                             let expr20_0 = constructor_andnpd(ctx, expr18_0, &expr19_0)?;
6700                             let expr21_0 = constructor_output_xmm(ctx, expr20_0)?;
6701                             return Some(expr21_0);
6702                         }
6703                         &Opcode::FmaxPseudo => {
6704                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
6705                             // Rule at src/isa/x64/lower.isle line 2352.
6706                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
6707                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
6708                             let expr2_0 = constructor_maxpd(ctx, expr0_0, expr1_0)?;
6709                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6710                             return Some(expr3_0);
6711                         }
6712                         _ => {}
6713                     }
6714                 }
6715                 &InstructionData::Unary {
6716                     opcode: ref pattern5_0,
6717                     arg: pattern5_1,
6718                 } => {
6719                     if let &Opcode::Fabs = pattern5_0 {
6720                         // Rule at src/isa/x64/lower.isle line 1244.
6721                         let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
6722                         let expr1_0: Type = F64X2;
6723                         let expr2_0 = constructor_vector_all_ones(ctx, expr1_0)?;
6724                         let expr3_0: u32 = 1;
6725                         let expr4_0 = RegMemImm::Imm { simm32: expr3_0 };
6726                         let expr5_0 = constructor_mov_rmi_to_xmm(ctx, &expr4_0)?;
6727                         let expr6_0 = constructor_psrlq(ctx, expr2_0, &expr5_0)?;
6728                         let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0);
6729                         let expr8_0 = constructor_andpd(ctx, expr0_0, &expr7_0)?;
6730                         let expr9_0 = constructor_output_xmm(ctx, expr8_0)?;
6731                         return Some(expr9_0);
6732                     }
6733                 }
6734                 _ => {}
6735             }
6736         }
6737         let pattern3_0 = C::inst_data(ctx, pattern0_0);
6738         match &pattern3_0 {
6739             &InstructionData::NullAry {
6740                 opcode: ref pattern4_0,
6741             } => {
6742                 if let &Opcode::Null = pattern4_0 {
6743                     // Rule at src/isa/x64/lower.isle line 56.
6744                     let expr0_0: u64 = 0;
6745                     let expr1_0 = constructor_imm(ctx, pattern2_0, expr0_0)?;
6746                     let expr2_0 = constructor_output_reg(ctx, expr1_0)?;
6747                     return Some(expr2_0);
6748                 }
6749             }
6750             &InstructionData::Binary {
6751                 opcode: ref pattern4_0,
6752                 args: ref pattern4_1,
6753             } => {
6754                 if let &Opcode::BandNot = pattern4_0 {
6755                     let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1);
6756                     // Rule at src/isa/x64/lower.isle line 1205.
6757                     let expr0_0 = constructor_put_in_xmm(ctx, pattern6_1)?;
6758                     let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern6_0)?;
6759                     let expr2_0 = constructor_sse_and_not(ctx, pattern2_0, expr0_0, &expr1_0)?;
6760                     let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6761                     return Some(expr3_0);
6762                 }
6763             }
6764             &InstructionData::Ternary {
6765                 opcode: ref pattern4_0,
6766                 args: ref pattern4_1,
6767             } => {
6768                 if let &Opcode::Select = pattern4_0 {
6769                     let (pattern6_0, pattern6_1, pattern6_2) =
6770                         C::unpack_value_array_3(ctx, pattern4_1);
6771                     if let Some(pattern7_0) = C::def_inst(ctx, pattern6_0) {
6772                         let pattern8_0 = C::inst_data(ctx, pattern7_0);
6773                         if let &InstructionData::FloatCompare {
6774                             opcode: ref pattern9_0,
6775                             args: ref pattern9_1,
6776                             cond: ref pattern9_2,
6777                         } = &pattern8_0
6778                         {
6779                             if let &Opcode::Fcmp = pattern9_0 {
6780                                 let (pattern11_0, pattern11_1) =
6781                                     C::unpack_value_array_2(ctx, pattern9_1);
6782                                 match pattern9_2 {
6783                                     &FloatCC::Equal => {
6784                                         // Rule at src/isa/x64/lower.isle line 1625.
6785                                         let expr0_0 =
6786                                             constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
6787                                         let expr1_0 = CC::NZ;
6788                                         let expr2_0 = CC::P;
6789                                         let expr3_0 = constructor_cmove_or_from_values(
6790                                             ctx, pattern2_0, &expr1_0, &expr2_0, pattern6_2,
6791                                             pattern6_1,
6792                                         )?;
6793                                         let expr4_0 =
6794                                             constructor_with_flags(ctx, &expr0_0, &expr3_0)?;
6795                                         let expr5_0 = C::output(ctx, expr4_0);
6796                                         return Some(expr5_0);
6797                                     }
6798                                     &FloatCC::GreaterThan => {
6799                                         // Rule at src/isa/x64/lower.isle line 1577.
6800                                         let expr0_0 =
6801                                             constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
6802                                         let expr1_0 = CC::NBE;
6803                                         let expr2_0 = constructor_cmove_from_values(
6804                                             ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
6805                                         )?;
6806                                         let expr3_0 =
6807                                             constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6808                                         let expr4_0 = C::output(ctx, expr3_0);
6809                                         return Some(expr4_0);
6810                                     }
6811                                     &FloatCC::GreaterThanOrEqual => {
6812                                         // Rule at src/isa/x64/lower.isle line 1580.
6813                                         let expr0_0 =
6814                                             constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
6815                                         let expr1_0 = CC::NB;
6816                                         let expr2_0 = constructor_cmove_from_values(
6817                                             ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
6818                                         )?;
6819                                         let expr3_0 =
6820                                             constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6821                                         let expr4_0 = C::output(ctx, expr3_0);
6822                                         return Some(expr4_0);
6823                                     }
6824                                     &FloatCC::LessThan => {
6825                                         // Rule at src/isa/x64/lower.isle line 1600.
6826                                         let expr0_0 =
6827                                             constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
6828                                         let expr1_0 = CC::NBE;
6829                                         let expr2_0 = constructor_cmove_from_values(
6830                                             ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
6831                                         )?;
6832                                         let expr3_0 =
6833                                             constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6834                                         let expr4_0 = C::output(ctx, expr3_0);
6835                                         return Some(expr4_0);
6836                                     }
6837                                     &FloatCC::LessThanOrEqual => {
6838                                         // Rule at src/isa/x64/lower.isle line 1603.
6839                                         let expr0_0 =
6840                                             constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
6841                                         let expr1_0 = CC::NB;
6842                                         let expr2_0 = constructor_cmove_from_values(
6843                                             ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
6844                                         )?;
6845                                         let expr3_0 =
6846                                             constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6847                                         let expr4_0 = C::output(ctx, expr3_0);
6848                                         return Some(expr4_0);
6849                                     }
6850                                     &FloatCC::NotEqual => {
6851                                         // Rule at src/isa/x64/lower.isle line 1628.
6852                                         let expr0_0 =
6853                                             constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
6854                                         let expr1_0 = CC::NZ;
6855                                         let expr2_0 = CC::P;
6856                                         let expr3_0 = constructor_cmove_or_from_values(
6857                                             ctx, pattern2_0, &expr1_0, &expr2_0, pattern6_1,
6858                                             pattern6_2,
6859                                         )?;
6860                                         let expr4_0 =
6861                                             constructor_with_flags(ctx, &expr0_0, &expr3_0)?;
6862                                         let expr5_0 = C::output(ctx, expr4_0);
6863                                         return Some(expr5_0);
6864                                     }
6865                                     &FloatCC::Ordered => {
6866                                         // Rule at src/isa/x64/lower.isle line 1571.
6867                                         let expr0_0 =
6868                                             constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
6869                                         let expr1_0 = CC::NP;
6870                                         let expr2_0 = constructor_cmove_from_values(
6871                                             ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
6872                                         )?;
6873                                         let expr3_0 =
6874                                             constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6875                                         let expr4_0 = C::output(ctx, expr3_0);
6876                                         return Some(expr4_0);
6877                                     }
6878                                     &FloatCC::Unordered => {
6879                                         // Rule at src/isa/x64/lower.isle line 1574.
6880                                         let expr0_0 =
6881                                             constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
6882                                         let expr1_0 = CC::P;
6883                                         let expr2_0 = constructor_cmove_from_values(
6884                                             ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
6885                                         )?;
6886                                         let expr3_0 =
6887                                             constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6888                                         let expr4_0 = C::output(ctx, expr3_0);
6889                                         return Some(expr4_0);
6890                                     }
6891                                     &FloatCC::UnorderedOrGreaterThan => {
6892                                         // Rule at src/isa/x64/lower.isle line 1606.
6893                                         let expr0_0 =
6894                                             constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
6895                                         let expr1_0 = CC::B;
6896                                         let expr2_0 = constructor_cmove_from_values(
6897                                             ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
6898                                         )?;
6899                                         let expr3_0 =
6900                                             constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6901                                         let expr4_0 = C::output(ctx, expr3_0);
6902                                         return Some(expr4_0);
6903                                     }
6904                                     &FloatCC::UnorderedOrGreaterThanOrEqual => {
6905                                         // Rule at src/isa/x64/lower.isle line 1609.
6906                                         let expr0_0 =
6907                                             constructor_fpcmp(ctx, pattern11_0, pattern11_1)?;
6908                                         let expr1_0 = CC::BE;
6909                                         let expr2_0 = constructor_cmove_from_values(
6910                                             ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
6911                                         )?;
6912                                         let expr3_0 =
6913                                             constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6914                                         let expr4_0 = C::output(ctx, expr3_0);
6915                                         return Some(expr4_0);
6916                                     }
6917                                     &FloatCC::UnorderedOrLessThan => {
6918                                         // Rule at src/isa/x64/lower.isle line 1583.
6919                                         let expr0_0 =
6920                                             constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
6921                                         let expr1_0 = CC::B;
6922                                         let expr2_0 = constructor_cmove_from_values(
6923                                             ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
6924                                         )?;
6925                                         let expr3_0 =
6926                                             constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6927                                         let expr4_0 = C::output(ctx, expr3_0);
6928                                         return Some(expr4_0);
6929                                     }
6930                                     &FloatCC::UnorderedOrLessThanOrEqual => {
6931                                         // Rule at src/isa/x64/lower.isle line 1586.
6932                                         let expr0_0 =
6933                                             constructor_fpcmp(ctx, pattern11_1, pattern11_0)?;
6934                                         let expr1_0 = CC::BE;
6935                                         let expr2_0 = constructor_cmove_from_values(
6936                                             ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
6937                                         )?;
6938                                         let expr3_0 =
6939                                             constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6940                                         let expr4_0 = C::output(ctx, expr3_0);
6941                                         return Some(expr4_0);
6942                                     }
6943                                     _ => {}
6944                                 }
6945                             }
6946                         }
6947                     }
6948                 }
6949             }
6950             &InstructionData::Unary {
6951                 opcode: ref pattern4_0,
6952                 arg: pattern4_1,
6953             } => {
6954                 match pattern4_0 {
6955                     &Opcode::Breduce => {
6956                         let pattern6_0 = C::value_type(ctx, pattern4_1);
6957                         if pattern6_0 == pattern2_0 {
6958                             // Rule at src/isa/x64/lower.isle line 2085.
6959                             let expr0_0 = constructor_output_value(ctx, pattern4_1)?;
6960                             return Some(expr0_0);
6961                         }
6962                     }
6963                     &Opcode::Bextend => {
6964                         let pattern6_0 = C::value_type(ctx, pattern4_1);
6965                         // Rule at src/isa/x64/lower.isle line 2066.
6966                         let expr0_0 =
6967                             constructor_generic_sextend(ctx, pattern4_1, pattern6_0, pattern2_0)?;
6968                         return Some(expr0_0);
6969                     }
6970                     &Opcode::Ireduce => {
6971                         let pattern6_0 = C::value_type(ctx, pattern4_1);
6972                         if pattern6_0 == pattern2_0 {
6973                             // Rule at src/isa/x64/lower.isle line 2074.
6974                             let expr0_0 = constructor_output_value(ctx, pattern4_1)?;
6975                             return Some(expr0_0);
6976                         }
6977                     }
6978                     &Opcode::Uextend => {
6979                         let pattern6_0 = C::value_type(ctx, pattern4_1);
6980                         if pattern6_0 == pattern2_0 {
6981                             // Rule at src/isa/x64/lower.isle line 1967.
6982                             let expr0_0 = constructor_output_value(ctx, pattern4_1)?;
6983                             return Some(expr0_0);
6984                         }
6985                     }
6986                     &Opcode::Sextend => {
6987                         let pattern6_0 = C::value_type(ctx, pattern4_1);
6988                         // Rule at src/isa/x64/lower.isle line 2060.
6989                         let expr0_0 =
6990                             constructor_generic_sextend(ctx, pattern4_1, pattern6_0, pattern2_0)?;
6991                         return Some(expr0_0);
6992                     }
6993                     _ => {}
6994                 }
6995             }
6996             _ => {}
6997         }
6998         if let Some(()) = C::avx512vl_enabled(ctx, pattern2_0) {
6999             if let Some(()) = C::avx512dq_enabled(ctx, pattern2_0) {
7000                 if let Some((pattern5_0, pattern5_1)) = C::multi_lane(ctx, pattern2_0) {
7001                     if pattern5_0 == 64 {
7002                         if pattern5_1 == 2 {
7003                             let pattern8_0 = C::inst_data(ctx, pattern0_0);
7004                             if let &InstructionData::Binary {
7005                                 opcode: ref pattern9_0,
7006                                 args: ref pattern9_1,
7007                             } = &pattern8_0
7008                             {
7009                                 if let &Opcode::Imul = pattern9_0 {
7010                                     let (pattern11_0, pattern11_1) =
7011                                         C::unpack_value_array_2(ctx, pattern9_1);
7012                                     // Rule at src/isa/x64/lower.isle line 992.
7013                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern11_0)?;
7014                                     let expr1_0 = constructor_put_in_xmm(ctx, pattern11_1)?;
7015                                     let expr2_0 = constructor_vpmullq(ctx, &expr0_0, expr1_0)?;
7016                                     let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7017                                     return Some(expr3_0);
7018                                 }
7019                             }
7020                         }
7021                     }
7022                 }
7023             }
7024             if let Some(()) = C::avx512f_enabled(ctx, pattern2_0) {
7025                 if pattern2_0 == I64X2 {
7026                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
7027                     if let &InstructionData::Unary {
7028                         opcode: ref pattern7_0,
7029                         arg: pattern7_1,
7030                     } = &pattern6_0
7031                     {
7032                         if let &Opcode::Iabs = pattern7_0 {
7033                             // Rule at src/isa/x64/lower.isle line 1220.
7034                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
7035                             let expr1_0 = constructor_vpabsq(ctx, &expr0_0)?;
7036                             let expr2_0 = constructor_output_xmm(ctx, expr1_0)?;
7037                             return Some(expr2_0);
7038                         }
7039                     }
7040                 }
7041             }
7042         }
7043         if let Some((pattern3_0, pattern3_1)) = C::multi_lane(ctx, pattern2_0) {
7044             if pattern3_0 == 8 {
7045                 if pattern3_1 == 16 {
7046                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
7047                     if let &InstructionData::Binary {
7048                         opcode: ref pattern7_0,
7049                         args: ref pattern7_1,
7050                     } = &pattern6_0
7051                     {
7052                         match pattern7_0 {
7053                             &Opcode::AvgRound => {
7054                                 let (pattern9_0, pattern9_1) =
7055                                     C::unpack_value_array_2(ctx, pattern7_1);
7056                                 // Rule at src/isa/x64/lower.isle line 903.
7057                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7058                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7059                                 let expr2_0 = constructor_pavgb(ctx, expr0_0, &expr1_0)?;
7060                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7061                                 return Some(expr3_0);
7062                             }
7063                             &Opcode::UaddSat => {
7064                                 let (pattern9_0, pattern9_1) =
7065                                     C::unpack_value_array_2(ctx, pattern7_1);
7066                                 // Rule at src/isa/x64/lower.isle line 136.
7067                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7068                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7069                                 let expr2_0 = constructor_paddusb(ctx, expr0_0, &expr1_0)?;
7070                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7071                                 return Some(expr3_0);
7072                             }
7073                             &Opcode::SaddSat => {
7074                                 let (pattern9_0, pattern9_1) =
7075                                     C::unpack_value_array_2(ctx, pattern7_1);
7076                                 // Rule at src/isa/x64/lower.isle line 126.
7077                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7078                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7079                                 let expr2_0 = constructor_paddsb(ctx, expr0_0, &expr1_0)?;
7080                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7081                                 return Some(expr3_0);
7082                             }
7083                             &Opcode::UsubSat => {
7084                                 let (pattern9_0, pattern9_1) =
7085                                     C::unpack_value_array_2(ctx, pattern7_1);
7086                                 // Rule at src/isa/x64/lower.isle line 282.
7087                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7088                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7089                                 let expr2_0 = constructor_psubusb(ctx, expr0_0, &expr1_0)?;
7090                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7091                                 return Some(expr3_0);
7092                             }
7093                             &Opcode::SsubSat => {
7094                                 let (pattern9_0, pattern9_1) =
7095                                     C::unpack_value_array_2(ctx, pattern7_1);
7096                                 // Rule at src/isa/x64/lower.isle line 272.
7097                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7098                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7099                                 let expr2_0 = constructor_psubsb(ctx, expr0_0, &expr1_0)?;
7100                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7101                                 return Some(expr3_0);
7102                             }
7103                             &Opcode::Iadd => {
7104                                 let (pattern9_0, pattern9_1) =
7105                                     C::unpack_value_array_2(ctx, pattern7_1);
7106                                 // Rule at src/isa/x64/lower.isle line 94.
7107                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7108                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7109                                 let expr2_0 = constructor_paddb(ctx, expr0_0, &expr1_0)?;
7110                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7111                                 return Some(expr3_0);
7112                             }
7113                             &Opcode::Isub => {
7114                                 let (pattern9_0, pattern9_1) =
7115                                     C::unpack_value_array_2(ctx, pattern7_1);
7116                                 // Rule at src/isa/x64/lower.isle line 240.
7117                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7118                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7119                                 let expr2_0 = constructor_psubb(ctx, expr0_0, &expr1_0)?;
7120                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7121                                 return Some(expr3_0);
7122                             }
7123                             _ => {}
7124                         }
7125                     }
7126                 }
7127             }
7128             if pattern3_0 == 16 {
7129                 if pattern3_1 == 8 {
7130                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
7131                     if let &InstructionData::Binary {
7132                         opcode: ref pattern7_0,
7133                         args: ref pattern7_1,
7134                     } = &pattern6_0
7135                     {
7136                         match pattern7_0 {
7137                             &Opcode::AvgRound => {
7138                                 let (pattern9_0, pattern9_1) =
7139                                     C::unpack_value_array_2(ctx, pattern7_1);
7140                                 // Rule at src/isa/x64/lower.isle line 907.
7141                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7142                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7143                                 let expr2_0 = constructor_pavgw(ctx, expr0_0, &expr1_0)?;
7144                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7145                                 return Some(expr3_0);
7146                             }
7147                             &Opcode::UaddSat => {
7148                                 let (pattern9_0, pattern9_1) =
7149                                     C::unpack_value_array_2(ctx, pattern7_1);
7150                                 // Rule at src/isa/x64/lower.isle line 140.
7151                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7152                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7153                                 let expr2_0 = constructor_paddusw(ctx, expr0_0, &expr1_0)?;
7154                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7155                                 return Some(expr3_0);
7156                             }
7157                             &Opcode::SaddSat => {
7158                                 let (pattern9_0, pattern9_1) =
7159                                     C::unpack_value_array_2(ctx, pattern7_1);
7160                                 // Rule at src/isa/x64/lower.isle line 130.
7161                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7162                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7163                                 let expr2_0 = constructor_paddsw(ctx, expr0_0, &expr1_0)?;
7164                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7165                                 return Some(expr3_0);
7166                             }
7167                             &Opcode::UsubSat => {
7168                                 let (pattern9_0, pattern9_1) =
7169                                     C::unpack_value_array_2(ctx, pattern7_1);
7170                                 // Rule at src/isa/x64/lower.isle line 286.
7171                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7172                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7173                                 let expr2_0 = constructor_psubusw(ctx, expr0_0, &expr1_0)?;
7174                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7175                                 return Some(expr3_0);
7176                             }
7177                             &Opcode::SsubSat => {
7178                                 let (pattern9_0, pattern9_1) =
7179                                     C::unpack_value_array_2(ctx, pattern7_1);
7180                                 // Rule at src/isa/x64/lower.isle line 276.
7181                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7182                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7183                                 let expr2_0 = constructor_psubsw(ctx, expr0_0, &expr1_0)?;
7184                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7185                                 return Some(expr3_0);
7186                             }
7187                             &Opcode::Iadd => {
7188                                 let (pattern9_0, pattern9_1) =
7189                                     C::unpack_value_array_2(ctx, pattern7_1);
7190                                 // Rule at src/isa/x64/lower.isle line 98.
7191                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7192                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7193                                 let expr2_0 = constructor_paddw(ctx, expr0_0, &expr1_0)?;
7194                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7195                                 return Some(expr3_0);
7196                             }
7197                             &Opcode::Isub => {
7198                                 let (pattern9_0, pattern9_1) =
7199                                     C::unpack_value_array_2(ctx, pattern7_1);
7200                                 // Rule at src/isa/x64/lower.isle line 244.
7201                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7202                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7203                                 let expr2_0 = constructor_psubw(ctx, expr0_0, &expr1_0)?;
7204                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7205                                 return Some(expr3_0);
7206                             }
7207                             &Opcode::Imul => {
7208                                 let (pattern9_0, pattern9_1) =
7209                                     C::unpack_value_array_2(ctx, pattern7_1);
7210                                 if let Some(pattern10_0) = C::def_inst(ctx, pattern9_0) {
7211                                     let pattern11_0 = C::inst_data(ctx, pattern10_0);
7212                                     if let &InstructionData::Unary {
7213                                         opcode: ref pattern12_0,
7214                                         arg: pattern12_1,
7215                                     } = &pattern11_0
7216                                     {
7217                                         match pattern12_0 {
7218                                             &Opcode::SwidenLow => {
7219                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
7220                                                 if let Some((pattern15_0, pattern15_1)) =
7221                                                     C::multi_lane(ctx, pattern14_0)
7222                                                 {
7223                                                     if pattern15_0 == 8 {
7224                                                         if pattern15_1 == 16 {
7225                                                             if let Some(pattern18_0) =
7226                                                                 C::def_inst(ctx, pattern9_1)
7227                                                             {
7228                                                                 let pattern19_0 =
7229                                                                     C::inst_data(ctx, pattern18_0);
7230                                                                 if let &InstructionData::Unary {
7231                                                                     opcode: ref pattern20_0,
7232                                                                     arg: pattern20_1,
7233                                                                 } = &pattern19_0
7234                                                                 {
7235                                                                     if let &Opcode::SwidenLow =
7236                                                                         pattern20_0
7237                                                                     {
7238                                                                         let pattern22_0 =
7239                                                                             C::value_type(
7240                                                                                 ctx,
7241                                                                                 pattern20_1,
7242                                                                             );
7243                                                                         if let Some((
7244                                                                             pattern23_0,
7245                                                                             pattern23_1,
7246                                                                         )) = C::multi_lane(
7247                                                                             ctx,
7248                                                                             pattern22_0,
7249                                                                         ) {
7250                                                                             if pattern23_0 == 8 {
7251                                                                                 if pattern23_1 == 16
7252                                                                                 {
7253                                                                                     // Rule at src/isa/x64/lower.isle line 1080.
7254                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
7255                                                                                     let expr1_0 = constructor_pmovsxbw(ctx, &expr0_0)?;
7256                                                                                     let expr2_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
7257                                                                                     let expr3_0 = constructor_pmovsxbw(ctx, &expr2_0)?;
7258                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0);
7259                                                                                     let expr5_0 = constructor_pmullw(ctx, expr1_0, &expr4_0)?;
7260                                                                                     let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
7261                                                                                     return Some(
7262                                                                                         expr6_0,
7263                                                                                     );
7264                                                                                 }
7265                                                                             }
7266                                                                         }
7267                                                                     }
7268                                                                 }
7269                                                             }
7270                                                         }
7271                                                     }
7272                                                 }
7273                                             }
7274                                             &Opcode::SwidenHigh => {
7275                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
7276                                                 if let Some((pattern15_0, pattern15_1)) =
7277                                                     C::multi_lane(ctx, pattern14_0)
7278                                                 {
7279                                                     if pattern15_0 == 8 {
7280                                                         if pattern15_1 == 16 {
7281                                                             if let Some(pattern18_0) =
7282                                                                 C::def_inst(ctx, pattern9_1)
7283                                                             {
7284                                                                 let pattern19_0 =
7285                                                                     C::inst_data(ctx, pattern18_0);
7286                                                                 if let &InstructionData::Unary {
7287                                                                     opcode: ref pattern20_0,
7288                                                                     arg: pattern20_1,
7289                                                                 } = &pattern19_0
7290                                                                 {
7291                                                                     if let &Opcode::SwidenHigh =
7292                                                                         pattern20_0
7293                                                                     {
7294                                                                         let pattern22_0 =
7295                                                                             C::value_type(
7296                                                                                 ctx,
7297                                                                                 pattern20_1,
7298                                                                             );
7299                                                                         if let Some((
7300                                                                             pattern23_0,
7301                                                                             pattern23_1,
7302                                                                         )) = C::multi_lane(
7303                                                                             ctx,
7304                                                                             pattern22_0,
7305                                                                         ) {
7306                                                                             if pattern23_0 == 8 {
7307                                                                                 if pattern23_1 == 16
7308                                                                                 {
7309                                                                                     // Rule at src/isa/x64/lower.isle line 1040.
7310                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
7311                                                                                     let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
7312                                                                                     let expr2_0: u8 = 8;
7313                                                                                     let expr3_0 = OperandSize::Size32;
7314                                                                                     let expr4_0 = constructor_palignr(ctx, expr0_0, &expr1_0, expr2_0, &expr3_0)?;
7315                                                                                     let expr5_0 = C::xmm_to_xmm_mem(ctx, expr4_0);
7316                                                                                     let expr6_0 = constructor_pmovsxbw(ctx, &expr5_0)?;
7317                                                                                     let expr7_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
7318                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
7319                                                                                     let expr9_0: u8 = 8;
7320                                                                                     let expr10_0 = OperandSize::Size32;
7321                                                                                     let expr11_0 = constructor_palignr(ctx, expr7_0, &expr8_0, expr9_0, &expr10_0)?;
7322                                                                                     let expr12_0 = C::xmm_to_xmm_mem(ctx, expr11_0);
7323                                                                                     let expr13_0 = constructor_pmovsxbw(ctx, &expr12_0)?;
7324                                                                                     let expr14_0 = C::xmm_to_xmm_mem(ctx, expr13_0);
7325                                                                                     let expr15_0 = constructor_pmullw(ctx, expr6_0, &expr14_0)?;
7326                                                                                     let expr16_0 = constructor_output_xmm(ctx, expr15_0)?;
7327                                                                                     return Some(
7328                                                                                         expr16_0,
7329                                                                                     );
7330                                                                                 }
7331                                                                             }
7332                                                                         }
7333                                                                     }
7334                                                                 }
7335                                                             }
7336                                                         }
7337                                                     }
7338                                                 }
7339                                             }
7340                                             &Opcode::UwidenLow => {
7341                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
7342                                                 if let Some((pattern15_0, pattern15_1)) =
7343                                                     C::multi_lane(ctx, pattern14_0)
7344                                                 {
7345                                                     if pattern15_0 == 8 {
7346                                                         if pattern15_1 == 16 {
7347                                                             if let Some(pattern18_0) =
7348                                                                 C::def_inst(ctx, pattern9_1)
7349                                                             {
7350                                                                 let pattern19_0 =
7351                                                                     C::inst_data(ctx, pattern18_0);
7352                                                                 if let &InstructionData::Unary {
7353                                                                     opcode: ref pattern20_0,
7354                                                                     arg: pattern20_1,
7355                                                                 } = &pattern19_0
7356                                                                 {
7357                                                                     if let &Opcode::UwidenLow =
7358                                                                         pattern20_0
7359                                                                     {
7360                                                                         let pattern22_0 =
7361                                                                             C::value_type(
7362                                                                                 ctx,
7363                                                                                 pattern20_1,
7364                                                                             );
7365                                                                         if let Some((
7366                                                                             pattern23_0,
7367                                                                             pattern23_1,
7368                                                                         )) = C::multi_lane(
7369                                                                             ctx,
7370                                                                             pattern22_0,
7371                                                                         ) {
7372                                                                             if pattern23_0 == 8 {
7373                                                                                 if pattern23_1 == 16
7374                                                                                 {
7375                                                                                     // Rule at src/isa/x64/lower.isle line 1156.
7376                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
7377                                                                                     let expr1_0 = constructor_pmovzxbw(ctx, &expr0_0)?;
7378                                                                                     let expr2_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
7379                                                                                     let expr3_0 = constructor_pmovzxbw(ctx, &expr2_0)?;
7380                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0);
7381                                                                                     let expr5_0 = constructor_pmullw(ctx, expr1_0, &expr4_0)?;
7382                                                                                     let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
7383                                                                                     return Some(
7384                                                                                         expr6_0,
7385                                                                                     );
7386                                                                                 }
7387                                                                             }
7388                                                                         }
7389                                                                     }
7390                                                                 }
7391                                                             }
7392                                                         }
7393                                                     }
7394                                                 }
7395                                             }
7396                                             &Opcode::UwidenHigh => {
7397                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
7398                                                 if let Some((pattern15_0, pattern15_1)) =
7399                                                     C::multi_lane(ctx, pattern14_0)
7400                                                 {
7401                                                     if pattern15_0 == 8 {
7402                                                         if pattern15_1 == 16 {
7403                                                             if let Some(pattern18_0) =
7404                                                                 C::def_inst(ctx, pattern9_1)
7405                                                             {
7406                                                                 let pattern19_0 =
7407                                                                     C::inst_data(ctx, pattern18_0);
7408                                                                 if let &InstructionData::Unary {
7409                                                                     opcode: ref pattern20_0,
7410                                                                     arg: pattern20_1,
7411                                                                 } = &pattern19_0
7412                                                                 {
7413                                                                     if let &Opcode::UwidenHigh =
7414                                                                         pattern20_0
7415                                                                     {
7416                                                                         let pattern22_0 =
7417                                                                             C::value_type(
7418                                                                                 ctx,
7419                                                                                 pattern20_1,
7420                                                                             );
7421                                                                         if let Some((
7422                                                                             pattern23_0,
7423                                                                             pattern23_1,
7424                                                                         )) = C::multi_lane(
7425                                                                             ctx,
7426                                                                             pattern22_0,
7427                                                                         ) {
7428                                                                             if pattern23_0 == 8 {
7429                                                                                 if pattern23_1 == 16
7430                                                                                 {
7431                                                                                     // Rule at src/isa/x64/lower.isle line 1116.
7432                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
7433                                                                                     let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
7434                                                                                     let expr2_0: u8 = 8;
7435                                                                                     let expr3_0 = OperandSize::Size32;
7436                                                                                     let expr4_0 = constructor_palignr(ctx, expr0_0, &expr1_0, expr2_0, &expr3_0)?;
7437                                                                                     let expr5_0 = C::xmm_to_xmm_mem(ctx, expr4_0);
7438                                                                                     let expr6_0 = constructor_pmovzxbw(ctx, &expr5_0)?;
7439                                                                                     let expr7_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
7440                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
7441                                                                                     let expr9_0: u8 = 8;
7442                                                                                     let expr10_0 = OperandSize::Size32;
7443                                                                                     let expr11_0 = constructor_palignr(ctx, expr7_0, &expr8_0, expr9_0, &expr10_0)?;
7444                                                                                     let expr12_0 = C::xmm_to_xmm_mem(ctx, expr11_0);
7445                                                                                     let expr13_0 = constructor_pmovzxbw(ctx, &expr12_0)?;
7446                                                                                     let expr14_0 = C::xmm_to_xmm_mem(ctx, expr13_0);
7447                                                                                     let expr15_0 = constructor_pmullw(ctx, expr6_0, &expr14_0)?;
7448                                                                                     let expr16_0 = constructor_output_xmm(ctx, expr15_0)?;
7449                                                                                     return Some(
7450                                                                                         expr16_0,
7451                                                                                     );
7452                                                                                 }
7453                                                                             }
7454                                                                         }
7455                                                                     }
7456                                                                 }
7457                                                             }
7458                                                         }
7459                                                     }
7460                                                 }
7461                                             }
7462                                             _ => {}
7463                                         }
7464                                     }
7465                                 }
7466                                 // Rule at src/isa/x64/lower.isle line 984.
7467                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7468                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7469                                 let expr2_0 = constructor_pmullw(ctx, expr0_0, &expr1_0)?;
7470                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7471                                 return Some(expr3_0);
7472                             }
7473                             _ => {}
7474                         }
7475                     }
7476                 }
7477             }
7478             if pattern3_0 == 32 {
7479                 if pattern3_1 == 4 {
7480                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
7481                     if let &InstructionData::Binary {
7482                         opcode: ref pattern7_0,
7483                         args: ref pattern7_1,
7484                     } = &pattern6_0
7485                     {
7486                         match pattern7_0 {
7487                             &Opcode::Iadd => {
7488                                 let (pattern9_0, pattern9_1) =
7489                                     C::unpack_value_array_2(ctx, pattern7_1);
7490                                 // Rule at src/isa/x64/lower.isle line 102.
7491                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7492                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7493                                 let expr2_0 = constructor_paddd(ctx, expr0_0, &expr1_0)?;
7494                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7495                                 return Some(expr3_0);
7496                             }
7497                             &Opcode::Isub => {
7498                                 let (pattern9_0, pattern9_1) =
7499                                     C::unpack_value_array_2(ctx, pattern7_1);
7500                                 // Rule at src/isa/x64/lower.isle line 248.
7501                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7502                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7503                                 let expr2_0 = constructor_psubd(ctx, expr0_0, &expr1_0)?;
7504                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7505                                 return Some(expr3_0);
7506                             }
7507                             &Opcode::Imul => {
7508                                 let (pattern9_0, pattern9_1) =
7509                                     C::unpack_value_array_2(ctx, pattern7_1);
7510                                 if let Some(pattern10_0) = C::def_inst(ctx, pattern9_0) {
7511                                     let pattern11_0 = C::inst_data(ctx, pattern10_0);
7512                                     if let &InstructionData::Unary {
7513                                         opcode: ref pattern12_0,
7514                                         arg: pattern12_1,
7515                                     } = &pattern11_0
7516                                     {
7517                                         match pattern12_0 {
7518                                             &Opcode::SwidenLow => {
7519                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
7520                                                 if let Some((pattern15_0, pattern15_1)) =
7521                                                     C::multi_lane(ctx, pattern14_0)
7522                                                 {
7523                                                     if pattern15_0 == 16 {
7524                                                         if pattern15_1 == 8 {
7525                                                             if let Some(pattern18_0) =
7526                                                                 C::def_inst(ctx, pattern9_1)
7527                                                             {
7528                                                                 let pattern19_0 =
7529                                                                     C::inst_data(ctx, pattern18_0);
7530                                                                 if let &InstructionData::Unary {
7531                                                                     opcode: ref pattern20_0,
7532                                                                     arg: pattern20_1,
7533                                                                 } = &pattern19_0
7534                                                                 {
7535                                                                     if let &Opcode::SwidenLow =
7536                                                                         pattern20_0
7537                                                                     {
7538                                                                         let pattern22_0 =
7539                                                                             C::value_type(
7540                                                                                 ctx,
7541                                                                                 pattern20_1,
7542                                                                             );
7543                                                                         if let Some((
7544                                                                             pattern23_0,
7545                                                                             pattern23_1,
7546                                                                         )) = C::multi_lane(
7547                                                                             ctx,
7548                                                                             pattern22_0,
7549                                                                         ) {
7550                                                                             if pattern23_0 == 16 {
7551                                                                                 if pattern23_1 == 8
7552                                                                                 {
7553                                                                                     // Rule at src/isa/x64/lower.isle line 1090.
7554                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
7555                                                                                     let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
7556                                                                                     let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
7557                                                                                     let expr3_0 = constructor_pmullw(ctx, expr0_0, &expr2_0)?;
7558                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
7559                                                                                     let expr5_0 = constructor_pmulhw(ctx, expr0_0, &expr4_0)?;
7560                                                                                     let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
7561                                                                                     let expr7_0 = constructor_punpcklwd(ctx, expr3_0, &expr6_0)?;
7562                                                                                     let expr8_0 = constructor_output_xmm(ctx, expr7_0)?;
7563                                                                                     return Some(
7564                                                                                         expr8_0,
7565                                                                                     );
7566                                                                                 }
7567                                                                             }
7568                                                                         }
7569                                                                     }
7570                                                                 }
7571                                                             }
7572                                                         }
7573                                                     }
7574                                                 }
7575                                             }
7576                                             &Opcode::SwidenHigh => {
7577                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
7578                                                 if let Some((pattern15_0, pattern15_1)) =
7579                                                     C::multi_lane(ctx, pattern14_0)
7580                                                 {
7581                                                     if pattern15_0 == 16 {
7582                                                         if pattern15_1 == 8 {
7583                                                             if let Some(pattern18_0) =
7584                                                                 C::def_inst(ctx, pattern9_1)
7585                                                             {
7586                                                                 let pattern19_0 =
7587                                                                     C::inst_data(ctx, pattern18_0);
7588                                                                 if let &InstructionData::Unary {
7589                                                                     opcode: ref pattern20_0,
7590                                                                     arg: pattern20_1,
7591                                                                 } = &pattern19_0
7592                                                                 {
7593                                                                     if let &Opcode::SwidenHigh =
7594                                                                         pattern20_0
7595                                                                     {
7596                                                                         let pattern22_0 =
7597                                                                             C::value_type(
7598                                                                                 ctx,
7599                                                                                 pattern20_1,
7600                                                                             );
7601                                                                         if let Some((
7602                                                                             pattern23_0,
7603                                                                             pattern23_1,
7604                                                                         )) = C::multi_lane(
7605                                                                             ctx,
7606                                                                             pattern22_0,
7607                                                                         ) {
7608                                                                             if pattern23_0 == 16 {
7609                                                                                 if pattern23_1 == 8
7610                                                                                 {
7611                                                                                     // Rule at src/isa/x64/lower.isle line 1054.
7612                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
7613                                                                                     let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
7614                                                                                     let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
7615                                                                                     let expr3_0 = constructor_pmullw(ctx, expr0_0, &expr2_0)?;
7616                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
7617                                                                                     let expr5_0 = constructor_pmulhw(ctx, expr0_0, &expr4_0)?;
7618                                                                                     let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
7619                                                                                     let expr7_0 = constructor_punpckhwd(ctx, expr3_0, &expr6_0)?;
7620                                                                                     let expr8_0 = constructor_output_xmm(ctx, expr7_0)?;
7621                                                                                     return Some(
7622                                                                                         expr8_0,
7623                                                                                     );
7624                                                                                 }
7625                                                                             }
7626                                                                         }
7627                                                                     }
7628                                                                 }
7629                                                             }
7630                                                         }
7631                                                     }
7632                                                 }
7633                                             }
7634                                             &Opcode::UwidenLow => {
7635                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
7636                                                 if let Some((pattern15_0, pattern15_1)) =
7637                                                     C::multi_lane(ctx, pattern14_0)
7638                                                 {
7639                                                     if pattern15_0 == 16 {
7640                                                         if pattern15_1 == 8 {
7641                                                             if let Some(pattern18_0) =
7642                                                                 C::def_inst(ctx, pattern9_1)
7643                                                             {
7644                                                                 let pattern19_0 =
7645                                                                     C::inst_data(ctx, pattern18_0);
7646                                                                 if let &InstructionData::Unary {
7647                                                                     opcode: ref pattern20_0,
7648                                                                     arg: pattern20_1,
7649                                                                 } = &pattern19_0
7650                                                                 {
7651                                                                     if let &Opcode::UwidenLow =
7652                                                                         pattern20_0
7653                                                                     {
7654                                                                         let pattern22_0 =
7655                                                                             C::value_type(
7656                                                                                 ctx,
7657                                                                                 pattern20_1,
7658                                                                             );
7659                                                                         if let Some((
7660                                                                             pattern23_0,
7661                                                                             pattern23_1,
7662                                                                         )) = C::multi_lane(
7663                                                                             ctx,
7664                                                                             pattern22_0,
7665                                                                         ) {
7666                                                                             if pattern23_0 == 16 {
7667                                                                                 if pattern23_1 == 8
7668                                                                                 {
7669                                                                                     // Rule at src/isa/x64/lower.isle line 1166.
7670                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
7671                                                                                     let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
7672                                                                                     let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
7673                                                                                     let expr3_0 = constructor_pmullw(ctx, expr0_0, &expr2_0)?;
7674                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
7675                                                                                     let expr5_0 = constructor_pmulhuw(ctx, expr0_0, &expr4_0)?;
7676                                                                                     let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
7677                                                                                     let expr7_0 = constructor_punpcklwd(ctx, expr3_0, &expr6_0)?;
7678                                                                                     let expr8_0 = constructor_output_xmm(ctx, expr7_0)?;
7679                                                                                     return Some(
7680                                                                                         expr8_0,
7681                                                                                     );
7682                                                                                 }
7683                                                                             }
7684                                                                         }
7685                                                                     }
7686                                                                 }
7687                                                             }
7688                                                         }
7689                                                     }
7690                                                 }
7691                                             }
7692                                             &Opcode::UwidenHigh => {
7693                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
7694                                                 if let Some((pattern15_0, pattern15_1)) =
7695                                                     C::multi_lane(ctx, pattern14_0)
7696                                                 {
7697                                                     if pattern15_0 == 16 {
7698                                                         if pattern15_1 == 8 {
7699                                                             if let Some(pattern18_0) =
7700                                                                 C::def_inst(ctx, pattern9_1)
7701                                                             {
7702                                                                 let pattern19_0 =
7703                                                                     C::inst_data(ctx, pattern18_0);
7704                                                                 if let &InstructionData::Unary {
7705                                                                     opcode: ref pattern20_0,
7706                                                                     arg: pattern20_1,
7707                                                                 } = &pattern19_0
7708                                                                 {
7709                                                                     if let &Opcode::UwidenHigh =
7710                                                                         pattern20_0
7711                                                                     {
7712                                                                         let pattern22_0 =
7713                                                                             C::value_type(
7714                                                                                 ctx,
7715                                                                                 pattern20_1,
7716                                                                             );
7717                                                                         if let Some((
7718                                                                             pattern23_0,
7719                                                                             pattern23_1,
7720                                                                         )) = C::multi_lane(
7721                                                                             ctx,
7722                                                                             pattern22_0,
7723                                                                         ) {
7724                                                                             if pattern23_0 == 16 {
7725                                                                                 if pattern23_1 == 8
7726                                                                                 {
7727                                                                                     // Rule at src/isa/x64/lower.isle line 1130.
7728                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
7729                                                                                     let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
7730                                                                                     let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
7731                                                                                     let expr3_0 = constructor_pmullw(ctx, expr0_0, &expr2_0)?;
7732                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
7733                                                                                     let expr5_0 = constructor_pmulhuw(ctx, expr0_0, &expr4_0)?;
7734                                                                                     let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
7735                                                                                     let expr7_0 = constructor_punpckhwd(ctx, expr3_0, &expr6_0)?;
7736                                                                                     let expr8_0 = constructor_output_xmm(ctx, expr7_0)?;
7737                                                                                     return Some(
7738                                                                                         expr8_0,
7739                                                                                     );
7740                                                                                 }
7741                                                                             }
7742                                                                         }
7743                                                                     }
7744                                                                 }
7745                                                             }
7746                                                         }
7747                                                     }
7748                                                 }
7749                                             }
7750                                             _ => {}
7751                                         }
7752                                     }
7753                                 }
7754                                 // Rule at src/isa/x64/lower.isle line 987.
7755                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7756                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7757                                 let expr2_0 = constructor_pmulld(ctx, expr0_0, &expr1_0)?;
7758                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7759                                 return Some(expr3_0);
7760                             }
7761                             _ => {}
7762                         }
7763                     }
7764                 }
7765             }
7766             if pattern3_0 == 64 {
7767                 if pattern3_1 == 2 {
7768                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
7769                     if let &InstructionData::Binary {
7770                         opcode: ref pattern7_0,
7771                         args: ref pattern7_1,
7772                     } = &pattern6_0
7773                     {
7774                         match pattern7_0 {
7775                             &Opcode::Iadd => {
7776                                 let (pattern9_0, pattern9_1) =
7777                                     C::unpack_value_array_2(ctx, pattern7_1);
7778                                 // Rule at src/isa/x64/lower.isle line 106.
7779                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7780                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7781                                 let expr2_0 = constructor_paddq(ctx, expr0_0, &expr1_0)?;
7782                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7783                                 return Some(expr3_0);
7784                             }
7785                             &Opcode::Isub => {
7786                                 let (pattern9_0, pattern9_1) =
7787                                     C::unpack_value_array_2(ctx, pattern7_1);
7788                                 // Rule at src/isa/x64/lower.isle line 252.
7789                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
7790                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
7791                                 let expr2_0 = constructor_psubq(ctx, expr0_0, &expr1_0)?;
7792                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7793                                 return Some(expr3_0);
7794                             }
7795                             &Opcode::Imul => {
7796                                 let (pattern9_0, pattern9_1) =
7797                                     C::unpack_value_array_2(ctx, pattern7_1);
7798                                 if let Some(pattern10_0) = C::def_inst(ctx, pattern9_0) {
7799                                     let pattern11_0 = C::inst_data(ctx, pattern10_0);
7800                                     if let &InstructionData::Unary {
7801                                         opcode: ref pattern12_0,
7802                                         arg: pattern12_1,
7803                                     } = &pattern11_0
7804                                     {
7805                                         match pattern12_0 {
7806                                             &Opcode::SwidenLow => {
7807                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
7808                                                 if let Some((pattern15_0, pattern15_1)) =
7809                                                     C::multi_lane(ctx, pattern14_0)
7810                                                 {
7811                                                     if pattern15_0 == 32 {
7812                                                         if pattern15_1 == 4 {
7813                                                             if let Some(pattern18_0) =
7814                                                                 C::def_inst(ctx, pattern9_1)
7815                                                             {
7816                                                                 let pattern19_0 =
7817                                                                     C::inst_data(ctx, pattern18_0);
7818                                                                 if let &InstructionData::Unary {
7819                                                                     opcode: ref pattern20_0,
7820                                                                     arg: pattern20_1,
7821                                                                 } = &pattern19_0
7822                                                                 {
7823                                                                     if let &Opcode::SwidenLow =
7824                                                                         pattern20_0
7825                                                                     {
7826                                                                         let pattern22_0 =
7827                                                                             C::value_type(
7828                                                                                 ctx,
7829                                                                                 pattern20_1,
7830                                                                             );
7831                                                                         if let Some((
7832                                                                             pattern23_0,
7833                                                                             pattern23_1,
7834                                                                         )) = C::multi_lane(
7835                                                                             ctx,
7836                                                                             pattern22_0,
7837                                                                         ) {
7838                                                                             if pattern23_0 == 32 {
7839                                                                                 if pattern23_1 == 4
7840                                                                                 {
7841                                                                                     // Rule at src/isa/x64/lower.isle line 1102.
7842                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
7843                                                                                     let expr1_0: u8 = 80;
7844                                                                                     let expr2_0 = OperandSize::Size32;
7845                                                                                     let expr3_0 = constructor_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?;
7846                                                                                     let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
7847                                                                                     let expr5_0: u8 = 80;
7848                                                                                     let expr6_0 = OperandSize::Size32;
7849                                                                                     let expr7_0 = constructor_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?;
7850                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
7851                                                                                     let expr9_0 = constructor_pmuldq(ctx, expr3_0, &expr8_0)?;
7852                                                                                     let expr10_0 = constructor_output_xmm(ctx, expr9_0)?;
7853                                                                                     return Some(
7854                                                                                         expr10_0,
7855                                                                                     );
7856                                                                                 }
7857                                                                             }
7858                                                                         }
7859                                                                     }
7860                                                                 }
7861                                                             }
7862                                                         }
7863                                                     }
7864                                                 }
7865                                             }
7866                                             &Opcode::SwidenHigh => {
7867                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
7868                                                 if let Some((pattern15_0, pattern15_1)) =
7869                                                     C::multi_lane(ctx, pattern14_0)
7870                                                 {
7871                                                     if pattern15_0 == 32 {
7872                                                         if pattern15_1 == 4 {
7873                                                             if let Some(pattern18_0) =
7874                                                                 C::def_inst(ctx, pattern9_1)
7875                                                             {
7876                                                                 let pattern19_0 =
7877                                                                     C::inst_data(ctx, pattern18_0);
7878                                                                 if let &InstructionData::Unary {
7879                                                                     opcode: ref pattern20_0,
7880                                                                     arg: pattern20_1,
7881                                                                 } = &pattern19_0
7882                                                                 {
7883                                                                     if let &Opcode::SwidenHigh =
7884                                                                         pattern20_0
7885                                                                     {
7886                                                                         let pattern22_0 =
7887                                                                             C::value_type(
7888                                                                                 ctx,
7889                                                                                 pattern20_1,
7890                                                                             );
7891                                                                         if let Some((
7892                                                                             pattern23_0,
7893                                                                             pattern23_1,
7894                                                                         )) = C::multi_lane(
7895                                                                             ctx,
7896                                                                             pattern22_0,
7897                                                                         ) {
7898                                                                             if pattern23_0 == 32 {
7899                                                                                 if pattern23_1 == 4
7900                                                                                 {
7901                                                                                     // Rule at src/isa/x64/lower.isle line 1066.
7902                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
7903                                                                                     let expr1_0: u8 = 250;
7904                                                                                     let expr2_0 = OperandSize::Size32;
7905                                                                                     let expr3_0 = constructor_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?;
7906                                                                                     let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
7907                                                                                     let expr5_0: u8 = 250;
7908                                                                                     let expr6_0 = OperandSize::Size32;
7909                                                                                     let expr7_0 = constructor_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?;
7910                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
7911                                                                                     let expr9_0 = constructor_pmuldq(ctx, expr3_0, &expr8_0)?;
7912                                                                                     let expr10_0 = constructor_output_xmm(ctx, expr9_0)?;
7913                                                                                     return Some(
7914                                                                                         expr10_0,
7915                                                                                     );
7916                                                                                 }
7917                                                                             }
7918                                                                         }
7919                                                                     }
7920                                                                 }
7921                                                             }
7922                                                         }
7923                                                     }
7924                                                 }
7925                                             }
7926                                             &Opcode::UwidenLow => {
7927                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
7928                                                 if let Some((pattern15_0, pattern15_1)) =
7929                                                     C::multi_lane(ctx, pattern14_0)
7930                                                 {
7931                                                     if pattern15_0 == 32 {
7932                                                         if pattern15_1 == 4 {
7933                                                             if let Some(pattern18_0) =
7934                                                                 C::def_inst(ctx, pattern9_1)
7935                                                             {
7936                                                                 let pattern19_0 =
7937                                                                     C::inst_data(ctx, pattern18_0);
7938                                                                 if let &InstructionData::Unary {
7939                                                                     opcode: ref pattern20_0,
7940                                                                     arg: pattern20_1,
7941                                                                 } = &pattern19_0
7942                                                                 {
7943                                                                     if let &Opcode::UwidenLow =
7944                                                                         pattern20_0
7945                                                                     {
7946                                                                         let pattern22_0 =
7947                                                                             C::value_type(
7948                                                                                 ctx,
7949                                                                                 pattern20_1,
7950                                                                             );
7951                                                                         if let Some((
7952                                                                             pattern23_0,
7953                                                                             pattern23_1,
7954                                                                         )) = C::multi_lane(
7955                                                                             ctx,
7956                                                                             pattern22_0,
7957                                                                         ) {
7958                                                                             if pattern23_0 == 32 {
7959                                                                                 if pattern23_1 == 4
7960                                                                                 {
7961                                                                                     // Rule at src/isa/x64/lower.isle line 1178.
7962                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
7963                                                                                     let expr1_0: u8 = 80;
7964                                                                                     let expr2_0 = OperandSize::Size32;
7965                                                                                     let expr3_0 = constructor_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?;
7966                                                                                     let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
7967                                                                                     let expr5_0: u8 = 80;
7968                                                                                     let expr6_0 = OperandSize::Size32;
7969                                                                                     let expr7_0 = constructor_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?;
7970                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
7971                                                                                     let expr9_0 = constructor_pmuludq(ctx, expr3_0, &expr8_0)?;
7972                                                                                     let expr10_0 = constructor_output_xmm(ctx, expr9_0)?;
7973                                                                                     return Some(
7974                                                                                         expr10_0,
7975                                                                                     );
7976                                                                                 }
7977                                                                             }
7978                                                                         }
7979                                                                     }
7980                                                                 }
7981                                                             }
7982                                                         }
7983                                                     }
7984                                                 }
7985                                             }
7986                                             &Opcode::UwidenHigh => {
7987                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
7988                                                 if let Some((pattern15_0, pattern15_1)) =
7989                                                     C::multi_lane(ctx, pattern14_0)
7990                                                 {
7991                                                     if pattern15_0 == 32 {
7992                                                         if pattern15_1 == 4 {
7993                                                             if let Some(pattern18_0) =
7994                                                                 C::def_inst(ctx, pattern9_1)
7995                                                             {
7996                                                                 let pattern19_0 =
7997                                                                     C::inst_data(ctx, pattern18_0);
7998                                                                 if let &InstructionData::Unary {
7999                                                                     opcode: ref pattern20_0,
8000                                                                     arg: pattern20_1,
8001                                                                 } = &pattern19_0
8002                                                                 {
8003                                                                     if let &Opcode::UwidenHigh =
8004                                                                         pattern20_0
8005                                                                     {
8006                                                                         let pattern22_0 =
8007                                                                             C::value_type(
8008                                                                                 ctx,
8009                                                                                 pattern20_1,
8010                                                                             );
8011                                                                         if let Some((
8012                                                                             pattern23_0,
8013                                                                             pattern23_1,
8014                                                                         )) = C::multi_lane(
8015                                                                             ctx,
8016                                                                             pattern22_0,
8017                                                                         ) {
8018                                                                             if pattern23_0 == 32 {
8019                                                                                 if pattern23_1 == 4
8020                                                                                 {
8021                                                                                     // Rule at src/isa/x64/lower.isle line 1142.
8022                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
8023                                                                                     let expr1_0: u8 = 250;
8024                                                                                     let expr2_0 = OperandSize::Size32;
8025                                                                                     let expr3_0 = constructor_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?;
8026                                                                                     let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
8027                                                                                     let expr5_0: u8 = 250;
8028                                                                                     let expr6_0 = OperandSize::Size32;
8029                                                                                     let expr7_0 = constructor_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?;
8030                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
8031                                                                                     let expr9_0 = constructor_pmuludq(ctx, expr3_0, &expr8_0)?;
8032                                                                                     let expr10_0 = constructor_output_xmm(ctx, expr9_0)?;
8033                                                                                     return Some(
8034                                                                                         expr10_0,
8035                                                                                     );
8036                                                                                 }
8037                                                                             }
8038                                                                         }
8039                                                                     }
8040                                                                 }
8041                                                             }
8042                                                         }
8043                                                     }
8044                                                 }
8045                                             }
8046                                             _ => {}
8047                                         }
8048                                     }
8049                                 }
8050                                 // Rule at src/isa/x64/lower.isle line 1018.
8051                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
8052                                 let expr1_0 = constructor_put_in_xmm(ctx, pattern9_1)?;
8053                                 let expr2_0: u32 = 32;
8054                                 let expr3_0 = RegMemImm::Imm { simm32: expr2_0 };
8055                                 let expr4_0 = constructor_mov_rmi_to_xmm(ctx, &expr3_0)?;
8056                                 let expr5_0 = constructor_psrlq(ctx, expr0_0, &expr4_0)?;
8057                                 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
8058                                 let expr7_0 = constructor_pmuludq(ctx, expr5_0, &expr6_0)?;
8059                                 let expr8_0: u32 = 32;
8060                                 let expr9_0 = RegMemImm::Imm { simm32: expr8_0 };
8061                                 let expr10_0 = constructor_mov_rmi_to_xmm(ctx, &expr9_0)?;
8062                                 let expr11_0 = constructor_psrlq(ctx, expr1_0, &expr10_0)?;
8063                                 let expr12_0 = C::xmm_to_xmm_mem(ctx, expr11_0);
8064                                 let expr13_0 = constructor_pmuludq(ctx, expr0_0, &expr12_0)?;
8065                                 let expr14_0 = C::xmm_to_xmm_mem(ctx, expr13_0);
8066                                 let expr15_0 = constructor_paddq(ctx, expr7_0, &expr14_0)?;
8067                                 let expr16_0: u32 = 32;
8068                                 let expr17_0 = RegMemImm::Imm { simm32: expr16_0 };
8069                                 let expr18_0 = constructor_mov_rmi_to_xmm(ctx, &expr17_0)?;
8070                                 let expr19_0 = constructor_psllq(ctx, expr15_0, &expr18_0)?;
8071                                 let expr20_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
8072                                 let expr21_0 = constructor_pmuludq(ctx, expr0_0, &expr20_0)?;
8073                                 let expr22_0 = C::xmm_to_xmm_mem(ctx, expr19_0);
8074                                 let expr23_0 = constructor_paddq(ctx, expr21_0, &expr22_0)?;
8075                                 let expr24_0 = constructor_output_xmm(ctx, expr23_0)?;
8076                                 return Some(expr24_0);
8077                             }
8078                             _ => {}
8079                         }
8080                     }
8081                 }
8082             }
8083             let pattern4_0 = C::inst_data(ctx, pattern0_0);
8084             match &pattern4_0 {
8085                 &InstructionData::Binary {
8086                     opcode: ref pattern5_0,
8087                     args: ref pattern5_1,
8088                 } => {
8089                     match pattern5_0 {
8090                         &Opcode::Band => {
8091                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8092                             // Rule at src/isa/x64/lower.isle line 328.
8093                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8094                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8095                             let expr2_0 = constructor_sse_and(ctx, pattern2_0, expr0_0, &expr1_0)?;
8096                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8097                             return Some(expr3_0);
8098                         }
8099                         &Opcode::Bor => {
8100                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8101                             // Rule at src/isa/x64/lower.isle line 392.
8102                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8103                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8104                             let expr2_0 = constructor_sse_or(ctx, pattern2_0, expr0_0, &expr1_0)?;
8105                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8106                             return Some(expr3_0);
8107                         }
8108                         &Opcode::Bxor => {
8109                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8110                             // Rule at src/isa/x64/lower.isle line 453.
8111                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8112                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8113                             let expr2_0 = constructor_sse_xor(ctx, pattern2_0, expr0_0, &expr1_0)?;
8114                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8115                             return Some(expr3_0);
8116                         }
8117                         _ => {}
8118                     }
8119                 }
8120                 &InstructionData::Ternary {
8121                     opcode: ref pattern5_0,
8122                     args: ref pattern5_1,
8123                 } => {
8124                     match pattern5_0 {
8125                         &Opcode::Bitselect => {
8126                             let (pattern7_0, pattern7_1, pattern7_2) =
8127                                 C::unpack_value_array_3(ctx, pattern5_1);
8128                             // Rule at src/isa/x64/lower.isle line 1279.
8129                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8130                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
8131                             let expr2_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
8132                             let expr3_0 = constructor_sse_and(ctx, pattern2_0, expr1_0, &expr2_0)?;
8133                             let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern7_2)?;
8134                             let expr5_0 =
8135                                 constructor_sse_and_not(ctx, pattern2_0, expr0_0, &expr4_0)?;
8136                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr3_0);
8137                             let expr7_0 = constructor_sse_or(ctx, pattern2_0, expr5_0, &expr6_0)?;
8138                             let expr8_0 = constructor_output_xmm(ctx, expr7_0)?;
8139                             return Some(expr8_0);
8140                         }
8141                         &Opcode::Vselect => {
8142                             let (pattern7_0, pattern7_1, pattern7_2) =
8143                                 C::unpack_value_array_3(ctx, pattern5_1);
8144                             // Rule at src/isa/x64/lower.isle line 1293.
8145                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern7_0)?;
8146                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8147                             let expr2_0 = constructor_put_in_xmm(ctx, pattern7_2)?;
8148                             let expr3_0 = constructor_sse_blend(
8149                                 ctx, pattern2_0, &expr0_0, &expr1_0, expr2_0,
8150                             )?;
8151                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
8152                             return Some(expr4_0);
8153                         }
8154                         _ => {}
8155                     }
8156                 }
8157                 &InstructionData::Unary {
8158                     opcode: ref pattern5_0,
8159                     arg: pattern5_1,
8160                 } => {
8161                     if let &Opcode::Bnot = pattern5_0 {
8162                         // Rule at src/isa/x64/lower.isle line 1274.
8163                         let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
8164                         let expr1_0 = constructor_vector_all_ones(ctx, pattern2_0)?;
8165                         let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
8166                         let expr3_0 = constructor_sse_xor(ctx, pattern2_0, expr0_0, &expr2_0)?;
8167                         let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
8168                         return Some(expr4_0);
8169                     }
8170                 }
8171                 _ => {}
8172             }
8173         }
8174         if let Some(pattern3_0) = C::fits_in_32(ctx, pattern2_0) {
8175             let pattern4_0 = C::inst_data(ctx, pattern0_0);
8176             if let &InstructionData::Unary {
8177                 opcode: ref pattern5_0,
8178                 arg: pattern5_1,
8179             } = &pattern4_0
8180             {
8181                 if let &Opcode::Uextend = pattern5_0 {
8182                     let pattern7_0 = C::value_type(ctx, pattern5_1);
8183                     if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) {
8184                         // Rule at src/isa/x64/lower.isle line 1983.
8185                         let expr0_0: Type = I32;
8186                         let expr1_0 = ExtendKind::Zero;
8187                         let expr2_0 =
8188                             constructor_extend_to_gpr(ctx, pattern5_1, expr0_0, &expr1_0)?;
8189                         let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8190                         return Some(expr3_0);
8191                     }
8192                 }
8193             }
8194         }
8195         if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) {
8196             let pattern4_0 = C::inst_data(ctx, pattern0_0);
8197             match &pattern4_0 {
8198                 &InstructionData::UnaryImm {
8199                     opcode: ref pattern5_0,
8200                     imm: pattern5_1,
8201                 } => {
8202                     if let &Opcode::Iconst = pattern5_0 {
8203                         let pattern7_0 = C::u64_from_imm64(ctx, pattern5_1);
8204                         // Rule at src/isa/x64/lower.isle line 10.
8205                         let expr0_0 = constructor_imm(ctx, pattern3_0, pattern7_0)?;
8206                         let expr1_0 = constructor_output_reg(ctx, expr0_0)?;
8207                         return Some(expr1_0);
8208                     }
8209                 }
8210                 &InstructionData::UnaryBool {
8211                     opcode: ref pattern5_0,
8212                     imm: pattern5_1,
8213                 } => {
8214                     if let &Opcode::Bconst = pattern5_0 {
8215                         if pattern5_1 == true {
8216                             // Rule at src/isa/x64/lower.isle line 28.
8217                             let expr0_0: u64 = 1;
8218                             let expr1_0 = constructor_imm(ctx, pattern3_0, expr0_0)?;
8219                             let expr2_0 = constructor_output_reg(ctx, expr1_0)?;
8220                             return Some(expr2_0);
8221                         }
8222                         if pattern5_1 == false {
8223                             // Rule at src/isa/x64/lower.isle line 24.
8224                             let expr0_0: u64 = 0;
8225                             let expr1_0 = constructor_imm(ctx, pattern3_0, expr0_0)?;
8226                             let expr2_0 = constructor_output_reg(ctx, expr1_0)?;
8227                             return Some(expr2_0);
8228                         }
8229                     }
8230                 }
8231                 &InstructionData::Binary {
8232                     opcode: ref pattern5_0,
8233                     args: ref pattern5_1,
8234                 } => {
8235                     match pattern5_0 {
8236                         &Opcode::Imin => {
8237                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8238                             // Rule at src/isa/x64/lower.isle line 1383.
8239                             let expr0_0 = CC::L;
8240                             let expr1_0 = constructor_cmp_and_choose(
8241                                 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1,
8242                             )?;
8243                             let expr2_0 = C::output(ctx, expr1_0);
8244                             return Some(expr2_0);
8245                         }
8246                         &Opcode::Umin => {
8247                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8248                             // Rule at src/isa/x64/lower.isle line 1377.
8249                             let expr0_0 = CC::B;
8250                             let expr1_0 = constructor_cmp_and_choose(
8251                                 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1,
8252                             )?;
8253                             let expr2_0 = C::output(ctx, expr1_0);
8254                             return Some(expr2_0);
8255                         }
8256                         &Opcode::Imax => {
8257                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8258                             // Rule at src/isa/x64/lower.isle line 1386.
8259                             let expr0_0 = CC::NL;
8260                             let expr1_0 = constructor_cmp_and_choose(
8261                                 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1,
8262                             )?;
8263                             let expr2_0 = C::output(ctx, expr1_0);
8264                             return Some(expr2_0);
8265                         }
8266                         &Opcode::Umax => {
8267                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8268                             // Rule at src/isa/x64/lower.isle line 1380.
8269                             let expr0_0 = CC::NB;
8270                             let expr1_0 = constructor_cmp_and_choose(
8271                                 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1,
8272                             )?;
8273                             let expr2_0 = C::output(ctx, expr1_0);
8274                             return Some(expr2_0);
8275                         }
8276                         &Opcode::Iadd => {
8277                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8278                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
8279                                 // Rule at src/isa/x64/lower.isle line 74.
8280                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
8281                                 let expr1_0 =
8282                                     constructor_add(ctx, pattern3_0, expr0_0, &pattern8_0)?;
8283                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
8284                                 return Some(expr2_0);
8285                             }
8286                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
8287                                 // Rule at src/isa/x64/lower.isle line 86.
8288                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
8289                                 let expr1_0 =
8290                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
8291                                 let expr2_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr1_0)?;
8292                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8293                                 return Some(expr3_0);
8294                             }
8295                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
8296                                 // Rule at src/isa/x64/lower.isle line 70.
8297                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8298                                 let expr1_0 =
8299                                     constructor_add(ctx, pattern3_0, expr0_0, &pattern8_0)?;
8300                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
8301                                 return Some(expr2_0);
8302                             }
8303                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
8304                                 // Rule at src/isa/x64/lower.isle line 80.
8305                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8306                                 let expr1_0 =
8307                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
8308                                 let expr2_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr1_0)?;
8309                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8310                                 return Some(expr3_0);
8311                             }
8312                             // Rule at src/isa/x64/lower.isle line 64.
8313                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8314                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
8315                             let expr2_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr1_0)?;
8316                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8317                             return Some(expr3_0);
8318                         }
8319                         &Opcode::Isub => {
8320                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8321                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
8322                                 // Rule at src/isa/x64/lower.isle line 228.
8323                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8324                                 let expr1_0 =
8325                                     constructor_sub(ctx, pattern3_0, expr0_0, &pattern8_0)?;
8326                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
8327                                 return Some(expr2_0);
8328                             }
8329                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
8330                                 // Rule at src/isa/x64/lower.isle line 233.
8331                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8332                                 let expr1_0 =
8333                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
8334                                 let expr2_0 = constructor_sub(ctx, pattern3_0, expr0_0, &expr1_0)?;
8335                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8336                                 return Some(expr3_0);
8337                             }
8338                             // Rule at src/isa/x64/lower.isle line 223.
8339                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8340                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
8341                             let expr2_0 = constructor_sub(ctx, pattern3_0, expr0_0, &expr1_0)?;
8342                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8343                             return Some(expr3_0);
8344                         }
8345                         &Opcode::Imul => {
8346                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8347                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
8348                                 // Rule at src/isa/x64/lower.isle line 925.
8349                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
8350                                 let expr1_0 =
8351                                     constructor_mul(ctx, pattern3_0, expr0_0, &pattern8_0)?;
8352                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
8353                                 return Some(expr2_0);
8354                             }
8355                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
8356                                 // Rule at src/isa/x64/lower.isle line 937.
8357                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
8358                                 let expr1_0 =
8359                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
8360                                 let expr2_0 = constructor_mul(ctx, pattern3_0, expr0_0, &expr1_0)?;
8361                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8362                                 return Some(expr3_0);
8363                             }
8364                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
8365                                 // Rule at src/isa/x64/lower.isle line 921.
8366                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8367                                 let expr1_0 =
8368                                     constructor_mul(ctx, pattern3_0, expr0_0, &pattern8_0)?;
8369                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
8370                                 return Some(expr2_0);
8371                             }
8372                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
8373                                 // Rule at src/isa/x64/lower.isle line 931.
8374                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8375                                 let expr1_0 =
8376                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
8377                                 let expr2_0 = constructor_mul(ctx, pattern3_0, expr0_0, &expr1_0)?;
8378                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8379                                 return Some(expr3_0);
8380                             }
8381                             // Rule at src/isa/x64/lower.isle line 916.
8382                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8383                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
8384                             let expr2_0 = constructor_mul(ctx, pattern3_0, expr0_0, &expr1_0)?;
8385                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8386                             return Some(expr3_0);
8387                         }
8388                         &Opcode::IaddIfcout => {
8389                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8390                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
8391                                 // Rule at src/isa/x64/lower.isle line 171.
8392                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
8393                                 let expr1_0 =
8394                                     constructor_add(ctx, pattern3_0, expr0_0, &pattern8_0)?;
8395                                 let expr2_0 = C::gpr_to_reg(ctx, expr1_0);
8396                                 let expr3_0 = constructor_output_ifcout(ctx, expr2_0)?;
8397                                 return Some(expr3_0);
8398                             }
8399                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
8400                                 // Rule at src/isa/x64/lower.isle line 181.
8401                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
8402                                 let expr1_0 =
8403                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
8404                                 let expr2_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr1_0)?;
8405                                 let expr3_0 = C::gpr_to_reg(ctx, expr2_0);
8406                                 let expr4_0 = constructor_output_ifcout(ctx, expr3_0)?;
8407                                 return Some(expr4_0);
8408                             }
8409                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
8410                                 // Rule at src/isa/x64/lower.isle line 167.
8411                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8412                                 let expr1_0 =
8413                                     constructor_add(ctx, pattern3_0, expr0_0, &pattern8_0)?;
8414                                 let expr2_0 = C::gpr_to_reg(ctx, expr1_0);
8415                                 let expr3_0 = constructor_output_ifcout(ctx, expr2_0)?;
8416                                 return Some(expr3_0);
8417                             }
8418                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
8419                                 // Rule at src/isa/x64/lower.isle line 177.
8420                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8421                                 let expr1_0 =
8422                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
8423                                 let expr2_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr1_0)?;
8424                                 let expr3_0 = C::gpr_to_reg(ctx, expr2_0);
8425                                 let expr4_0 = constructor_output_ifcout(ctx, expr3_0)?;
8426                                 return Some(expr4_0);
8427                             }
8428                             // Rule at src/isa/x64/lower.isle line 161.
8429                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8430                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
8431                             let expr2_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr1_0)?;
8432                             let expr3_0 = C::gpr_to_reg(ctx, expr2_0);
8433                             let expr4_0 = constructor_output_ifcout(ctx, expr3_0)?;
8434                             return Some(expr4_0);
8435                         }
8436                         &Opcode::Band => {
8437                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8438                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
8439                                 // Rule at src/isa/x64/lower.isle line 317.
8440                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
8441                                 let expr1_0 =
8442                                     constructor_x64_and(ctx, pattern3_0, expr0_0, &pattern8_0)?;
8443                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
8444                                 return Some(expr2_0);
8445                             }
8446                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
8447                                 // Rule at src/isa/x64/lower.isle line 305.
8448                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
8449                                 let expr1_0 =
8450                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
8451                                 let expr2_0 =
8452                                     constructor_x64_and(ctx, pattern3_0, expr0_0, &expr1_0)?;
8453                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8454                                 return Some(expr3_0);
8455                             }
8456                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
8457                                 // Rule at src/isa/x64/lower.isle line 313.
8458                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8459                                 let expr1_0 =
8460                                     constructor_x64_and(ctx, pattern3_0, expr0_0, &pattern8_0)?;
8461                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
8462                                 return Some(expr2_0);
8463                             }
8464                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
8465                                 // Rule at src/isa/x64/lower.isle line 300.
8466                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8467                                 let expr1_0 =
8468                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
8469                                 let expr2_0 =
8470                                     constructor_x64_and(ctx, pattern3_0, expr0_0, &expr1_0)?;
8471                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8472                                 return Some(expr3_0);
8473                             }
8474                             // Rule at src/isa/x64/lower.isle line 295.
8475                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8476                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
8477                             let expr2_0 = constructor_x64_and(ctx, pattern3_0, expr0_0, &expr1_0)?;
8478                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8479                             return Some(expr3_0);
8480                         }
8481                         &Opcode::Bor => {
8482                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8483                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
8484                                 // Rule at src/isa/x64/lower.isle line 381.
8485                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
8486                                 let expr1_0 =
8487                                     constructor_or(ctx, pattern3_0, expr0_0, &pattern8_0)?;
8488                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
8489                                 return Some(expr2_0);
8490                             }
8491                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
8492                                 // Rule at src/isa/x64/lower.isle line 370.
8493                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
8494                                 let expr1_0 =
8495                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
8496                                 let expr2_0 = constructor_or(ctx, pattern3_0, expr0_0, &expr1_0)?;
8497                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8498                                 return Some(expr3_0);
8499                             }
8500                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
8501                                 // Rule at src/isa/x64/lower.isle line 377.
8502                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8503                                 let expr1_0 =
8504                                     constructor_or(ctx, pattern3_0, expr0_0, &pattern8_0)?;
8505                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
8506                                 return Some(expr2_0);
8507                             }
8508                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
8509                                 // Rule at src/isa/x64/lower.isle line 365.
8510                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8511                                 let expr1_0 =
8512                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
8513                                 let expr2_0 = constructor_or(ctx, pattern3_0, expr0_0, &expr1_0)?;
8514                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8515                                 return Some(expr3_0);
8516                             }
8517                             // Rule at src/isa/x64/lower.isle line 360.
8518                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8519                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
8520                             let expr2_0 = constructor_or(ctx, pattern3_0, expr0_0, &expr1_0)?;
8521                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8522                             return Some(expr3_0);
8523                         }
8524                         &Opcode::Bxor => {
8525                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8526                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
8527                                 // Rule at src/isa/x64/lower.isle line 447.
8528                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
8529                                 let expr1_0 =
8530                                     constructor_xor(ctx, pattern3_0, expr0_0, &pattern8_0)?;
8531                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
8532                                 return Some(expr2_0);
8533                             }
8534                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
8535                                 // Rule at src/isa/x64/lower.isle line 436.
8536                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
8537                                 let expr1_0 =
8538                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
8539                                 let expr2_0 = constructor_xor(ctx, pattern3_0, expr0_0, &expr1_0)?;
8540                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8541                                 return Some(expr3_0);
8542                             }
8543                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
8544                                 // Rule at src/isa/x64/lower.isle line 443.
8545                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8546                                 let expr1_0 =
8547                                     constructor_xor(ctx, pattern3_0, expr0_0, &pattern8_0)?;
8548                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
8549                                 return Some(expr2_0);
8550                             }
8551                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
8552                                 // Rule at src/isa/x64/lower.isle line 431.
8553                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8554                                 let expr1_0 =
8555                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
8556                                 let expr2_0 = constructor_xor(ctx, pattern3_0, expr0_0, &expr1_0)?;
8557                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8558                                 return Some(expr3_0);
8559                             }
8560                             // Rule at src/isa/x64/lower.isle line 426.
8561                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8562                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
8563                             let expr2_0 = constructor_xor(ctx, pattern3_0, expr0_0, &expr1_0)?;
8564                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8565                             return Some(expr3_0);
8566                         }
8567                         &Opcode::Ishl => {
8568                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8569                             // Rule at src/isa/x64/lower.isle line 483.
8570                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8571                             let expr1_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0);
8572                             let expr2_0 = constructor_shl(ctx, pattern3_0, expr0_0, &expr1_0)?;
8573                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8574                             return Some(expr3_0);
8575                         }
8576                         &Opcode::Ushr => {
8577                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8578                             // Rule at src/isa/x64/lower.isle line 589.
8579                             let expr0_0 = ExtendKind::Zero;
8580                             let expr1_0 =
8581                                 constructor_extend_to_gpr(ctx, pattern7_0, pattern3_0, &expr0_0)?;
8582                             let expr2_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0);
8583                             let expr3_0 = constructor_shr(ctx, pattern3_0, expr1_0, &expr2_0)?;
8584                             let expr4_0 = constructor_output_gpr(ctx, expr3_0)?;
8585                             return Some(expr4_0);
8586                         }
8587                         &Opcode::Sshr => {
8588                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8589                             // Rule at src/isa/x64/lower.isle line 691.
8590                             let expr0_0 = ExtendKind::Sign;
8591                             let expr1_0 =
8592                                 constructor_extend_to_gpr(ctx, pattern7_0, pattern3_0, &expr0_0)?;
8593                             let expr2_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0);
8594                             let expr3_0 = constructor_sar(ctx, pattern3_0, expr1_0, &expr2_0)?;
8595                             let expr4_0 = constructor_output_gpr(ctx, expr3_0)?;
8596                             return Some(expr4_0);
8597                         }
8598                         _ => {}
8599                     }
8600                 }
8601                 &InstructionData::Unary {
8602                     opcode: ref pattern5_0,
8603                     arg: pattern5_1,
8604                 } => {
8605                     match pattern5_0 {
8606                         &Opcode::Ineg => {
8607                             // Rule at src/isa/x64/lower.isle line 884.
8608                             let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
8609                             let expr1_0 = constructor_neg(ctx, pattern3_0, expr0_0)?;
8610                             let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
8611                             return Some(expr2_0);
8612                         }
8613                         &Opcode::Bnot => {
8614                             // Rule at src/isa/x64/lower.isle line 1253.
8615                             let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
8616                             let expr1_0 = constructor_not(ctx, pattern3_0, expr0_0)?;
8617                             let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
8618                             return Some(expr2_0);
8619                         }
8620                         &Opcode::Breduce => {
8621                             // Rule at src/isa/x64/lower.isle line 2088.
8622                             let expr0_0 = C::put_in_regs(ctx, pattern5_1);
8623                             let expr1_0: usize = 0;
8624                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
8625                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8626                             return Some(expr3_0);
8627                         }
8628                         &Opcode::Bint => {
8629                             // Rule at src/isa/x64/lower.isle line 2096.
8630                             let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
8631                             let expr1_0: u32 = 1;
8632                             let expr2_0 = RegMemImm::Imm { simm32: expr1_0 };
8633                             let expr3_0 = C::gpr_mem_imm_new(ctx, &expr2_0);
8634                             let expr4_0 = constructor_x64_and(ctx, pattern3_0, expr0_0, &expr3_0)?;
8635                             let expr5_0 = constructor_output_gpr(ctx, expr4_0)?;
8636                             return Some(expr5_0);
8637                         }
8638                         &Opcode::Ireduce => {
8639                             // Rule at src/isa/x64/lower.isle line 2080.
8640                             let expr0_0 = C::put_in_regs(ctx, pattern5_1);
8641                             let expr1_0: usize = 0;
8642                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
8643                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8644                             return Some(expr3_0);
8645                         }
8646                         _ => {}
8647                     }
8648                 }
8649                 &InstructionData::BinaryImm64 {
8650                     opcode: ref pattern5_0,
8651                     arg: pattern5_1,
8652                     imm: pattern5_2,
8653                 } => {
8654                     if let &Opcode::IaddImm = pattern5_0 {
8655                         let pattern7_0 = C::u64_from_imm64(ctx, pattern5_2);
8656                         // Rule at src/isa/x64/lower.isle line 196.
8657                         let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
8658                         let expr1_0 = constructor_imm(ctx, pattern3_0, pattern7_0)?;
8659                         let expr2_0 = constructor_reg_to_gpr_mem_imm(ctx, expr1_0)?;
8660                         let expr3_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr2_0)?;
8661                         let expr4_0 = constructor_output_gpr(ctx, expr3_0)?;
8662                         return Some(expr4_0);
8663                     }
8664                 }
8665                 _ => {}
8666             }
8667         }
8668         if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) {
8669             let pattern4_0 = C::inst_data(ctx, pattern0_0);
8670             match &pattern4_0 {
8671                 &InstructionData::Binary {
8672                     opcode: ref pattern5_0,
8673                     args: ref pattern5_1,
8674                 } => {
8675                     match pattern5_0 {
8676                         &Opcode::Rotl => {
8677                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8678                             if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) {
8679                                 let pattern9_0 = C::inst_data(ctx, pattern8_0);
8680                                 if let &InstructionData::UnaryImm {
8681                                     opcode: ref pattern10_0,
8682                                     imm: pattern10_1,
8683                                 } = &pattern9_0
8684                                 {
8685                                     if let &Opcode::Iconst = pattern10_0 {
8686                                         let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1);
8687                                         // Rule at src/isa/x64/lower.isle line 823.
8688                                         let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8689                                         let expr1_0 = C::const_to_type_masked_imm8(
8690                                             ctx,
8691                                             pattern12_0,
8692                                             pattern3_0,
8693                                         );
8694                                         let expr2_0 = constructor_x64_rotl(
8695                                             ctx, pattern3_0, expr0_0, &expr1_0,
8696                                         )?;
8697                                         let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8698                                         return Some(expr3_0);
8699                                     }
8700                                 }
8701                             }
8702                             // Rule at src/isa/x64/lower.isle line 817.
8703                             let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?;
8704                             let expr1_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8705                             let expr2_0 = C::gpr_to_imm8_gpr(ctx, expr0_0);
8706                             let expr3_0 = constructor_x64_rotl(ctx, pattern3_0, expr1_0, &expr2_0)?;
8707                             let expr4_0 = constructor_output_gpr(ctx, expr3_0)?;
8708                             return Some(expr4_0);
8709                         }
8710                         &Opcode::Rotr => {
8711                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8712                             if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) {
8713                                 let pattern9_0 = C::inst_data(ctx, pattern8_0);
8714                                 if let &InstructionData::UnaryImm {
8715                                     opcode: ref pattern10_0,
8716                                     imm: pattern10_1,
8717                                 } = &pattern9_0
8718                                 {
8719                                     if let &Opcode::Iconst = pattern10_0 {
8720                                         let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1);
8721                                         // Rule at src/isa/x64/lower.isle line 863.
8722                                         let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8723                                         let expr1_0 = C::const_to_type_masked_imm8(
8724                                             ctx,
8725                                             pattern12_0,
8726                                             pattern3_0,
8727                                         );
8728                                         let expr2_0 = constructor_x64_rotr(
8729                                             ctx, pattern3_0, expr0_0, &expr1_0,
8730                                         )?;
8731                                         let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8732                                         return Some(expr3_0);
8733                                     }
8734                                 }
8735                             }
8736                             // Rule at src/isa/x64/lower.isle line 857.
8737                             let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?;
8738                             let expr1_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8739                             let expr2_0 = C::gpr_to_imm8_gpr(ctx, expr0_0);
8740                             let expr3_0 = constructor_x64_rotr(ctx, pattern3_0, expr1_0, &expr2_0)?;
8741                             let expr4_0 = constructor_output_gpr(ctx, expr3_0)?;
8742                             return Some(expr4_0);
8743                         }
8744                         _ => {}
8745                     }
8746                 }
8747                 &InstructionData::Unary {
8748                     opcode: ref pattern5_0,
8749                     arg: pattern5_1,
8750                 } => {
8751                     match pattern5_0 {
8752                         &Opcode::Clz => {
8753                             // Rule at src/isa/x64/lower.isle line 1644.
8754                             let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
8755                             let expr1_0 = constructor_do_clz(ctx, pattern3_0, pattern3_0, expr0_0)?;
8756                             let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
8757                             return Some(expr2_0);
8758                         }
8759                         &Opcode::Ctz => {
8760                             // Rule at src/isa/x64/lower.isle line 1686.
8761                             let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
8762                             let expr1_0 = constructor_do_ctz(ctx, pattern3_0, pattern3_0, expr0_0)?;
8763                             let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
8764                             return Some(expr2_0);
8765                         }
8766                         &Opcode::Popcnt => {
8767                             // Rule at src/isa/x64/lower.isle line 1738.
8768                             let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
8769                             let expr1_0 = constructor_do_popcnt(ctx, pattern3_0, expr0_0)?;
8770                             let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
8771                             return Some(expr2_0);
8772                         }
8773                         _ => {}
8774                     }
8775                 }
8776                 _ => {}
8777             }
8778         }
8779         if let Some(pattern3_0) = C::ty_8_or_16(ctx, pattern2_0) {
8780             let pattern4_0 = C::inst_data(ctx, pattern0_0);
8781             match &pattern4_0 {
8782                 &InstructionData::Binary {
8783                     opcode: ref pattern5_0,
8784                     args: ref pattern5_1,
8785                 } => {
8786                     match pattern5_0 {
8787                         &Opcode::Rotl => {
8788                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8789                             if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) {
8790                                 let pattern9_0 = C::inst_data(ctx, pattern8_0);
8791                                 if let &InstructionData::UnaryImm {
8792                                     opcode: ref pattern10_0,
8793                                     imm: pattern10_1,
8794                                 } = &pattern9_0
8795                                 {
8796                                     if let &Opcode::Iconst = pattern10_0 {
8797                                         let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1);
8798                                         // Rule at src/isa/x64/lower.isle line 809.
8799                                         let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8800                                         let expr1_0 = C::const_to_type_masked_imm8(
8801                                             ctx,
8802                                             pattern12_0,
8803                                             pattern3_0,
8804                                         );
8805                                         let expr2_0 = constructor_x64_rotl(
8806                                             ctx, pattern3_0, expr0_0, &expr1_0,
8807                                         )?;
8808                                         let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8809                                         return Some(expr3_0);
8810                                     }
8811                                 }
8812                             }
8813                             // Rule at src/isa/x64/lower.isle line 805.
8814                             let expr0_0: Type = I32;
8815                             let expr1_0 = ExtendKind::Zero;
8816                             let expr2_0 =
8817                                 constructor_extend_to_gpr(ctx, pattern7_1, expr0_0, &expr1_0)?;
8818                             let expr3_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8819                             let expr4_0 = C::gpr_to_imm8_gpr(ctx, expr2_0);
8820                             let expr5_0 = constructor_x64_rotl(ctx, pattern3_0, expr3_0, &expr4_0)?;
8821                             let expr6_0 = constructor_output_gpr(ctx, expr5_0)?;
8822                             return Some(expr6_0);
8823                         }
8824                         &Opcode::Rotr => {
8825                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8826                             if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) {
8827                                 let pattern9_0 = C::inst_data(ctx, pattern8_0);
8828                                 if let &InstructionData::UnaryImm {
8829                                     opcode: ref pattern10_0,
8830                                     imm: pattern10_1,
8831                                 } = &pattern9_0
8832                                 {
8833                                     if let &Opcode::Iconst = pattern10_0 {
8834                                         let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1);
8835                                         // Rule at src/isa/x64/lower.isle line 849.
8836                                         let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8837                                         let expr1_0 = C::const_to_type_masked_imm8(
8838                                             ctx,
8839                                             pattern12_0,
8840                                             pattern3_0,
8841                                         );
8842                                         let expr2_0 = constructor_x64_rotr(
8843                                             ctx, pattern3_0, expr0_0, &expr1_0,
8844                                         )?;
8845                                         let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
8846                                         return Some(expr3_0);
8847                                     }
8848                                 }
8849                             }
8850                             // Rule at src/isa/x64/lower.isle line 845.
8851                             let expr0_0: Type = I32;
8852                             let expr1_0 = ExtendKind::Zero;
8853                             let expr2_0 =
8854                                 constructor_extend_to_gpr(ctx, pattern7_1, expr0_0, &expr1_0)?;
8855                             let expr3_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
8856                             let expr4_0 = C::gpr_to_imm8_gpr(ctx, expr2_0);
8857                             let expr5_0 = constructor_x64_rotr(ctx, pattern3_0, expr3_0, &expr4_0)?;
8858                             let expr6_0 = constructor_output_gpr(ctx, expr5_0)?;
8859                             return Some(expr6_0);
8860                         }
8861                         _ => {}
8862                     }
8863                 }
8864                 &InstructionData::Unary {
8865                     opcode: ref pattern5_0,
8866                     arg: pattern5_1,
8867                 } => {
8868                     match pattern5_0 {
8869                         &Opcode::Clz => {
8870                             // Rule at src/isa/x64/lower.isle line 1649.
8871                             let expr0_0: Type = I32;
8872                             let expr1_0: Type = I32;
8873                             let expr2_0 = ExtendKind::Zero;
8874                             let expr3_0 =
8875                                 constructor_extend_to_gpr(ctx, pattern5_1, expr1_0, &expr2_0)?;
8876                             let expr4_0 = constructor_do_clz(ctx, expr0_0, pattern3_0, expr3_0)?;
8877                             let expr5_0 = constructor_output_gpr(ctx, expr4_0)?;
8878                             return Some(expr5_0);
8879                         }
8880                         &Opcode::Ctz => {
8881                             // Rule at src/isa/x64/lower.isle line 1691.
8882                             let expr0_0: Type = I32;
8883                             let expr1_0: Type = I32;
8884                             let expr2_0 = ExtendKind::Zero;
8885                             let expr3_0 =
8886                                 constructor_extend_to_gpr(ctx, pattern5_1, expr1_0, &expr2_0)?;
8887                             let expr4_0 = constructor_do_ctz(ctx, expr0_0, pattern3_0, expr3_0)?;
8888                             let expr5_0 = constructor_output_gpr(ctx, expr4_0)?;
8889                             return Some(expr5_0);
8890                         }
8891                         &Opcode::Popcnt => {
8892                             // Rule at src/isa/x64/lower.isle line 1743.
8893                             let expr0_0: Type = I32;
8894                             let expr1_0: Type = I32;
8895                             let expr2_0 = ExtendKind::Zero;
8896                             let expr3_0 =
8897                                 constructor_extend_to_gpr(ctx, pattern5_1, expr1_0, &expr2_0)?;
8898                             let expr4_0 = constructor_do_popcnt(ctx, expr0_0, expr3_0)?;
8899                             let expr5_0 = constructor_output_gpr(ctx, expr4_0)?;
8900                             return Some(expr5_0);
8901                         }
8902                         _ => {}
8903                     }
8904                 }
8905                 _ => {}
8906             }
8907         }
8908     }
8909     return None;
8910 }
8911 
8912 // Generated as internal constructor for term output_ifcout.
8913 pub fn constructor_output_ifcout<C: Context>(ctx: &mut C, arg0: Reg) -> Option<InstOutput> {
8914     let pattern0_0 = arg0;
8915     // Rule at src/isa/x64/lower.isle line 157.
8916     let expr0_0 = C::value_reg(ctx, pattern0_0);
8917     let expr1_0 = C::value_regs_invalid(ctx);
8918     let expr2_0 = C::output_pair(ctx, expr0_0, expr1_0);
8919     return Some(expr2_0);
8920 }
8921 
8922 // Generated as internal constructor for term sse_and.
8923 pub fn constructor_sse_and<C: Context>(
8924     ctx: &mut C,
8925     arg0: Type,
8926     arg1: Xmm,
8927     arg2: &XmmMem,
8928 ) -> Option<Xmm> {
8929     let pattern0_0 = arg0;
8930     if pattern0_0 == F32X4 {
8931         let pattern2_0 = arg1;
8932         let pattern3_0 = arg2;
8933         // Rule at src/isa/x64/lower.isle line 324.
8934         let expr0_0 = constructor_andps(ctx, pattern2_0, pattern3_0)?;
8935         return Some(expr0_0);
8936     }
8937     if pattern0_0 == F64X2 {
8938         let pattern2_0 = arg1;
8939         let pattern3_0 = arg2;
8940         // Rule at src/isa/x64/lower.isle line 325.
8941         let expr0_0 = constructor_andpd(ctx, pattern2_0, pattern3_0)?;
8942         return Some(expr0_0);
8943     }
8944     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
8945         let pattern2_0 = arg1;
8946         let pattern3_0 = arg2;
8947         // Rule at src/isa/x64/lower.isle line 326.
8948         let expr0_0 = constructor_pand(ctx, pattern2_0, pattern3_0)?;
8949         return Some(expr0_0);
8950     }
8951     return None;
8952 }
8953 
8954 // Generated as internal constructor for term sse_or.
8955 pub fn constructor_sse_or<C: Context>(
8956     ctx: &mut C,
8957     arg0: Type,
8958     arg1: Xmm,
8959     arg2: &XmmMem,
8960 ) -> Option<Xmm> {
8961     let pattern0_0 = arg0;
8962     if pattern0_0 == F32X4 {
8963         let pattern2_0 = arg1;
8964         let pattern3_0 = arg2;
8965         // Rule at src/isa/x64/lower.isle line 388.
8966         let expr0_0 = constructor_orps(ctx, pattern2_0, pattern3_0)?;
8967         return Some(expr0_0);
8968     }
8969     if pattern0_0 == F64X2 {
8970         let pattern2_0 = arg1;
8971         let pattern3_0 = arg2;
8972         // Rule at src/isa/x64/lower.isle line 389.
8973         let expr0_0 = constructor_orpd(ctx, pattern2_0, pattern3_0)?;
8974         return Some(expr0_0);
8975     }
8976     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
8977         let pattern2_0 = arg1;
8978         let pattern3_0 = arg2;
8979         // Rule at src/isa/x64/lower.isle line 390.
8980         let expr0_0 = constructor_por(ctx, pattern2_0, pattern3_0)?;
8981         return Some(expr0_0);
8982     }
8983     return None;
8984 }
8985 
8986 // Generated as internal constructor for term or_i128.
8987 pub fn constructor_or_i128<C: Context>(
8988     ctx: &mut C,
8989     arg0: ValueRegs,
8990     arg1: ValueRegs,
8991 ) -> Option<ValueRegs> {
8992     let pattern0_0 = arg0;
8993     let pattern1_0 = arg1;
8994     // Rule at src/isa/x64/lower.isle line 399.
8995     let expr0_0: usize = 0;
8996     let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?;
8997     let expr2_0: usize = 1;
8998     let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?;
8999     let expr4_0: usize = 0;
9000     let expr5_0 = constructor_value_regs_get_gpr(ctx, pattern1_0, expr4_0)?;
9001     let expr6_0: usize = 1;
9002     let expr7_0 = constructor_value_regs_get_gpr(ctx, pattern1_0, expr6_0)?;
9003     let expr8_0: Type = I64;
9004     let expr9_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
9005     let expr10_0 = constructor_or(ctx, expr8_0, expr1_0, &expr9_0)?;
9006     let expr11_0: Type = I64;
9007     let expr12_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
9008     let expr13_0 = constructor_or(ctx, expr11_0, expr3_0, &expr12_0)?;
9009     let expr14_0 = constructor_value_gprs(ctx, expr10_0, expr13_0)?;
9010     return Some(expr14_0);
9011 }
9012 
9013 // Generated as internal constructor for term shl_i128.
9014 pub fn constructor_shl_i128<C: Context>(
9015     ctx: &mut C,
9016     arg0: ValueRegs,
9017     arg1: Gpr,
9018 ) -> Option<ValueRegs> {
9019     let pattern0_0 = arg0;
9020     let pattern1_0 = arg1;
9021     // Rule at src/isa/x64/lower.isle line 489.
9022     let expr0_0: usize = 0;
9023     let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?;
9024     let expr2_0: usize = 1;
9025     let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?;
9026     let expr4_0: Type = I64;
9027     let expr5_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
9028     let expr6_0 = constructor_shl(ctx, expr4_0, expr1_0, &expr5_0)?;
9029     let expr7_0: Type = I64;
9030     let expr8_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
9031     let expr9_0 = constructor_shl(ctx, expr7_0, expr3_0, &expr8_0)?;
9032     let expr10_0: Type = I64;
9033     let expr11_0: Type = I64;
9034     let expr12_0: Type = I64;
9035     let expr13_0: u64 = 64;
9036     let expr14_0 = constructor_imm(ctx, expr12_0, expr13_0)?;
9037     let expr15_0 = C::gpr_new(ctx, expr14_0);
9038     let expr16_0 = C::gpr_to_gpr_mem_imm(ctx, pattern1_0);
9039     let expr17_0 = constructor_sub(ctx, expr11_0, expr15_0, &expr16_0)?;
9040     let expr18_0 = C::gpr_to_imm8_gpr(ctx, expr17_0);
9041     let expr19_0 = constructor_shr(ctx, expr10_0, expr1_0, &expr18_0)?;
9042     let expr20_0: Type = I64;
9043     let expr21_0: u64 = 0;
9044     let expr22_0 = constructor_imm(ctx, expr20_0, expr21_0)?;
9045     let expr23_0 = C::gpr_new(ctx, expr22_0);
9046     let expr24_0 = OperandSize::Size64;
9047     let expr25_0: u32 = 127;
9048     let expr26_0 = RegMemImm::Imm { simm32: expr25_0 };
9049     let expr27_0 = C::gpr_mem_imm_new(ctx, &expr26_0);
9050     let expr28_0 = constructor_test(ctx, &expr24_0, &expr27_0, pattern1_0)?;
9051     let expr29_0: Type = I64;
9052     let expr30_0 = CC::Z;
9053     let expr31_0 = C::gpr_to_gpr_mem(ctx, expr23_0);
9054     let expr32_0 = constructor_cmove(ctx, expr29_0, &expr30_0, &expr31_0, expr19_0)?;
9055     let expr33_0 = constructor_with_flags_reg(ctx, &expr28_0, &expr32_0)?;
9056     let expr34_0 = C::gpr_new(ctx, expr33_0);
9057     let expr35_0: Type = I64;
9058     let expr36_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
9059     let expr37_0 = constructor_or(ctx, expr35_0, expr34_0, &expr36_0)?;
9060     let expr38_0 = OperandSize::Size64;
9061     let expr39_0: u32 = 64;
9062     let expr40_0 = RegMemImm::Imm { simm32: expr39_0 };
9063     let expr41_0 = C::gpr_mem_imm_new(ctx, &expr40_0);
9064     let expr42_0 = constructor_test(ctx, &expr38_0, &expr41_0, pattern1_0)?;
9065     let expr43_0: Type = I64;
9066     let expr44_0 = CC::Z;
9067     let expr45_0 = C::gpr_to_gpr_mem(ctx, expr6_0);
9068     let expr46_0 = constructor_cmove(ctx, expr43_0, &expr44_0, &expr45_0, expr23_0)?;
9069     let expr47_0: Type = I64;
9070     let expr48_0 = CC::Z;
9071     let expr49_0 = C::gpr_to_gpr_mem(ctx, expr37_0);
9072     let expr50_0 = constructor_cmove(ctx, expr47_0, &expr48_0, &expr49_0, expr6_0)?;
9073     let expr51_0 = constructor_consumes_flags_concat(ctx, &expr46_0, &expr50_0)?;
9074     let expr52_0 = constructor_with_flags(ctx, &expr42_0, &expr51_0)?;
9075     return Some(expr52_0);
9076 }
9077 
9078 // Generated as internal constructor for term ishl_i8x16_mask.
9079 pub fn constructor_ishl_i8x16_mask<C: Context>(
9080     ctx: &mut C,
9081     arg0: &RegMemImm,
9082 ) -> Option<SyntheticAmode> {
9083     let pattern0_0 = arg0;
9084     match pattern0_0 {
9085         &RegMemImm::Imm { simm32: pattern1_0 } => {
9086             // Rule at src/isa/x64/lower.isle line 552.
9087             let expr0_0 = C::ishl_i8x16_mask_for_const(ctx, pattern1_0);
9088             return Some(expr0_0);
9089         }
9090         &RegMemImm::Reg { reg: pattern1_0 } => {
9091             // Rule at src/isa/x64/lower.isle line 561.
9092             let expr0_0 = C::ishl_i8x16_mask_table(ctx);
9093             let expr1_0 = constructor_lea(ctx, &expr0_0)?;
9094             let expr2_0: Type = I64;
9095             let expr3_0 = C::gpr_new(ctx, pattern1_0);
9096             let expr4_0: u8 = 4;
9097             let expr5_0 = C::imm8_to_imm8_gpr(ctx, expr4_0);
9098             let expr6_0 = constructor_shl(ctx, expr2_0, expr3_0, &expr5_0)?;
9099             let expr7_0: u32 = 0;
9100             let expr8_0: u8 = 0;
9101             let expr9_0 = C::amode_imm_reg_reg_shift(ctx, expr7_0, expr1_0, expr6_0, expr8_0);
9102             let expr10_0 = C::amode_to_synthetic_amode(ctx, &expr9_0);
9103             return Some(expr10_0);
9104         }
9105         &RegMemImm::Mem {
9106             addr: ref pattern1_0,
9107         } => {
9108             // Rule at src/isa/x64/lower.isle line 571.
9109             let expr0_0: Type = I64;
9110             let expr1_0 = ExtKind::None;
9111             let expr2_0 = constructor_x64_load(ctx, expr0_0, pattern1_0, &expr1_0)?;
9112             let expr3_0 = RegMemImm::Reg { reg: expr2_0 };
9113             let expr4_0 = constructor_ishl_i8x16_mask(ctx, &expr3_0)?;
9114             return Some(expr4_0);
9115         }
9116         _ => {}
9117     }
9118     return None;
9119 }
9120 
9121 // Generated as internal constructor for term shr_i128.
9122 pub fn constructor_shr_i128<C: Context>(
9123     ctx: &mut C,
9124     arg0: ValueRegs,
9125     arg1: Gpr,
9126 ) -> Option<ValueRegs> {
9127     let pattern0_0 = arg0;
9128     let pattern1_0 = arg1;
9129     // Rule at src/isa/x64/lower.isle line 596.
9130     let expr0_0: usize = 0;
9131     let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?;
9132     let expr2_0: usize = 1;
9133     let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?;
9134     let expr4_0: Type = I64;
9135     let expr5_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
9136     let expr6_0 = constructor_shr(ctx, expr4_0, expr1_0, &expr5_0)?;
9137     let expr7_0: Type = I64;
9138     let expr8_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
9139     let expr9_0 = constructor_shr(ctx, expr7_0, expr3_0, &expr8_0)?;
9140     let expr10_0: Type = I64;
9141     let expr11_0: Type = I64;
9142     let expr12_0: Type = I64;
9143     let expr13_0: u64 = 64;
9144     let expr14_0 = constructor_imm(ctx, expr12_0, expr13_0)?;
9145     let expr15_0 = C::gpr_new(ctx, expr14_0);
9146     let expr16_0 = C::gpr_to_gpr_mem_imm(ctx, pattern1_0);
9147     let expr17_0 = constructor_sub(ctx, expr11_0, expr15_0, &expr16_0)?;
9148     let expr18_0 = C::gpr_to_imm8_gpr(ctx, expr17_0);
9149     let expr19_0 = constructor_shl(ctx, expr10_0, expr3_0, &expr18_0)?;
9150     let expr20_0 = OperandSize::Size64;
9151     let expr21_0: u32 = 127;
9152     let expr22_0 = RegMemImm::Imm { simm32: expr21_0 };
9153     let expr23_0 = C::gpr_mem_imm_new(ctx, &expr22_0);
9154     let expr24_0 = constructor_test(ctx, &expr20_0, &expr23_0, pattern1_0)?;
9155     let expr25_0: Type = I64;
9156     let expr26_0 = CC::Z;
9157     let expr27_0: Type = I64;
9158     let expr28_0: u64 = 0;
9159     let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0)?;
9160     let expr30_0 = C::reg_to_gpr_mem(ctx, expr29_0);
9161     let expr31_0 = constructor_cmove(ctx, expr25_0, &expr26_0, &expr30_0, expr19_0)?;
9162     let expr32_0 = constructor_with_flags_reg(ctx, &expr24_0, &expr31_0)?;
9163     let expr33_0 = C::gpr_new(ctx, expr32_0);
9164     let expr34_0: Type = I64;
9165     let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr6_0);
9166     let expr36_0 = constructor_or(ctx, expr34_0, expr33_0, &expr35_0)?;
9167     let expr37_0 = OperandSize::Size64;
9168     let expr38_0: u32 = 64;
9169     let expr39_0 = RegMemImm::Imm { simm32: expr38_0 };
9170     let expr40_0 = C::gpr_mem_imm_new(ctx, &expr39_0);
9171     let expr41_0 = constructor_test(ctx, &expr37_0, &expr40_0, pattern1_0)?;
9172     let expr42_0: Type = I64;
9173     let expr43_0 = CC::Z;
9174     let expr44_0 = C::gpr_to_gpr_mem(ctx, expr36_0);
9175     let expr45_0 = constructor_cmove(ctx, expr42_0, &expr43_0, &expr44_0, expr9_0)?;
9176     let expr46_0: Type = I64;
9177     let expr47_0 = CC::Z;
9178     let expr48_0 = C::gpr_to_gpr_mem(ctx, expr9_0);
9179     let expr49_0: Type = I64;
9180     let expr50_0: u64 = 0;
9181     let expr51_0 = constructor_imm(ctx, expr49_0, expr50_0)?;
9182     let expr52_0 = C::gpr_new(ctx, expr51_0);
9183     let expr53_0 = constructor_cmove(ctx, expr46_0, &expr47_0, &expr48_0, expr52_0)?;
9184     let expr54_0 = constructor_consumes_flags_concat(ctx, &expr45_0, &expr53_0)?;
9185     let expr55_0 = constructor_with_flags(ctx, &expr41_0, &expr54_0)?;
9186     return Some(expr55_0);
9187 }
9188 
9189 // Generated as internal constructor for term ushr_i8x16_mask.
9190 pub fn constructor_ushr_i8x16_mask<C: Context>(
9191     ctx: &mut C,
9192     arg0: &RegMemImm,
9193 ) -> Option<SyntheticAmode> {
9194     let pattern0_0 = arg0;
9195     match pattern0_0 {
9196         &RegMemImm::Imm { simm32: pattern1_0 } => {
9197             // Rule at src/isa/x64/lower.isle line 653.
9198             let expr0_0 = C::ushr_i8x16_mask_for_const(ctx, pattern1_0);
9199             return Some(expr0_0);
9200         }
9201         &RegMemImm::Reg { reg: pattern1_0 } => {
9202             // Rule at src/isa/x64/lower.isle line 662.
9203             let expr0_0 = C::ushr_i8x16_mask_table(ctx);
9204             let expr1_0 = constructor_lea(ctx, &expr0_0)?;
9205             let expr2_0: Type = I64;
9206             let expr3_0 = C::gpr_new(ctx, pattern1_0);
9207             let expr4_0: u8 = 4;
9208             let expr5_0 = C::imm8_to_imm8_gpr(ctx, expr4_0);
9209             let expr6_0 = constructor_shl(ctx, expr2_0, expr3_0, &expr5_0)?;
9210             let expr7_0: u32 = 0;
9211             let expr8_0: u8 = 0;
9212             let expr9_0 = C::amode_imm_reg_reg_shift(ctx, expr7_0, expr1_0, expr6_0, expr8_0);
9213             let expr10_0 = C::amode_to_synthetic_amode(ctx, &expr9_0);
9214             return Some(expr10_0);
9215         }
9216         &RegMemImm::Mem {
9217             addr: ref pattern1_0,
9218         } => {
9219             // Rule at src/isa/x64/lower.isle line 673.
9220             let expr0_0: Type = I64;
9221             let expr1_0 = ExtKind::None;
9222             let expr2_0 = constructor_x64_load(ctx, expr0_0, pattern1_0, &expr1_0)?;
9223             let expr3_0 = RegMemImm::Reg { reg: expr2_0 };
9224             let expr4_0 = constructor_ushr_i8x16_mask(ctx, &expr3_0)?;
9225             return Some(expr4_0);
9226         }
9227         _ => {}
9228     }
9229     return None;
9230 }
9231 
9232 // Generated as internal constructor for term sar_i128.
9233 pub fn constructor_sar_i128<C: Context>(
9234     ctx: &mut C,
9235     arg0: ValueRegs,
9236     arg1: Gpr,
9237 ) -> Option<ValueRegs> {
9238     let pattern0_0 = arg0;
9239     let pattern1_0 = arg1;
9240     // Rule at src/isa/x64/lower.isle line 698.
9241     let expr0_0: usize = 0;
9242     let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?;
9243     let expr2_0: usize = 1;
9244     let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?;
9245     let expr4_0: Type = I64;
9246     let expr5_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
9247     let expr6_0 = constructor_shr(ctx, expr4_0, expr1_0, &expr5_0)?;
9248     let expr7_0: Type = I64;
9249     let expr8_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
9250     let expr9_0 = constructor_sar(ctx, expr7_0, expr3_0, &expr8_0)?;
9251     let expr10_0: Type = I64;
9252     let expr11_0: Type = I64;
9253     let expr12_0: Type = I64;
9254     let expr13_0: u64 = 64;
9255     let expr14_0 = constructor_imm(ctx, expr12_0, expr13_0)?;
9256     let expr15_0 = C::gpr_new(ctx, expr14_0);
9257     let expr16_0 = C::gpr_to_gpr_mem_imm(ctx, pattern1_0);
9258     let expr17_0 = constructor_sub(ctx, expr11_0, expr15_0, &expr16_0)?;
9259     let expr18_0 = C::gpr_to_imm8_gpr(ctx, expr17_0);
9260     let expr19_0 = constructor_shl(ctx, expr10_0, expr3_0, &expr18_0)?;
9261     let expr20_0 = OperandSize::Size64;
9262     let expr21_0: u32 = 127;
9263     let expr22_0 = RegMemImm::Imm { simm32: expr21_0 };
9264     let expr23_0 = C::gpr_mem_imm_new(ctx, &expr22_0);
9265     let expr24_0 = constructor_test(ctx, &expr20_0, &expr23_0, pattern1_0)?;
9266     let expr25_0: Type = I64;
9267     let expr26_0 = CC::Z;
9268     let expr27_0: Type = I64;
9269     let expr28_0: u64 = 0;
9270     let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0)?;
9271     let expr30_0 = C::reg_to_gpr_mem(ctx, expr29_0);
9272     let expr31_0 = constructor_cmove(ctx, expr25_0, &expr26_0, &expr30_0, expr19_0)?;
9273     let expr32_0 = constructor_with_flags_reg(ctx, &expr24_0, &expr31_0)?;
9274     let expr33_0 = C::gpr_new(ctx, expr32_0);
9275     let expr34_0: Type = I64;
9276     let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr33_0);
9277     let expr36_0 = constructor_or(ctx, expr34_0, expr6_0, &expr35_0)?;
9278     let expr37_0: Type = I64;
9279     let expr38_0: u8 = 63;
9280     let expr39_0 = C::imm8_to_imm8_gpr(ctx, expr38_0);
9281     let expr40_0 = constructor_sar(ctx, expr37_0, expr3_0, &expr39_0)?;
9282     let expr41_0 = OperandSize::Size64;
9283     let expr42_0: u32 = 64;
9284     let expr43_0 = RegMemImm::Imm { simm32: expr42_0 };
9285     let expr44_0 = C::gpr_mem_imm_new(ctx, &expr43_0);
9286     let expr45_0 = constructor_test(ctx, &expr41_0, &expr44_0, pattern1_0)?;
9287     let expr46_0: Type = I64;
9288     let expr47_0 = CC::Z;
9289     let expr48_0 = C::gpr_to_gpr_mem(ctx, expr36_0);
9290     let expr49_0 = constructor_cmove(ctx, expr46_0, &expr47_0, &expr48_0, expr9_0)?;
9291     let expr50_0: Type = I64;
9292     let expr51_0 = CC::Z;
9293     let expr52_0 = C::gpr_to_gpr_mem(ctx, expr9_0);
9294     let expr53_0 = constructor_cmove(ctx, expr50_0, &expr51_0, &expr52_0, expr40_0)?;
9295     let expr54_0 = constructor_consumes_flags_concat(ctx, &expr49_0, &expr53_0)?;
9296     let expr55_0 = constructor_with_flags(ctx, &expr45_0, &expr54_0)?;
9297     return Some(expr55_0);
9298 }
9299 
9300 // Generated as internal constructor for term sshr_i8x16_bigger_shift.
9301 pub fn constructor_sshr_i8x16_bigger_shift<C: Context>(
9302     ctx: &mut C,
9303     arg0: Type,
9304     arg1: &RegMemImm,
9305 ) -> Option<XmmMemImm> {
9306     let pattern0_0 = arg0;
9307     let pattern1_0 = arg1;
9308     match pattern1_0 {
9309         &RegMemImm::Imm { simm32: pattern2_0 } => {
9310             // Rule at src/isa/x64/lower.isle line 762.
9311             let expr0_0: u32 = 8;
9312             let expr1_0 = C::u32_add(ctx, pattern2_0, expr0_0);
9313             let expr2_0 = RegMemImm::Imm { simm32: expr1_0 };
9314             let expr3_0 = C::xmm_mem_imm_new(ctx, &expr2_0);
9315             return Some(expr3_0);
9316         }
9317         &RegMemImm::Reg { reg: pattern2_0 } => {
9318             // Rule at src/isa/x64/lower.isle line 764.
9319             let expr0_0 = C::gpr_new(ctx, pattern2_0);
9320             let expr1_0: u32 = 8;
9321             let expr2_0 = RegMemImm::Imm { simm32: expr1_0 };
9322             let expr3_0 = C::gpr_mem_imm_new(ctx, &expr2_0);
9323             let expr4_0 = constructor_add(ctx, pattern0_0, expr0_0, &expr3_0)?;
9324             let expr5_0 = C::gpr_to_reg(ctx, expr4_0);
9325             let expr6_0 = RegMemImm::Reg { reg: expr5_0 };
9326             let expr7_0 = constructor_mov_rmi_to_xmm(ctx, &expr6_0)?;
9327             return Some(expr7_0);
9328         }
9329         &RegMemImm::Mem {
9330             addr: ref pattern2_0,
9331         } => {
9332             // Rule at src/isa/x64/lower.isle line 768.
9333             let expr0_0: u64 = 8;
9334             let expr1_0 = constructor_imm(ctx, pattern0_0, expr0_0)?;
9335             let expr2_0 = C::gpr_new(ctx, expr1_0);
9336             let expr3_0 = C::gpr_mem_imm_new(ctx, pattern1_0);
9337             let expr4_0 = constructor_add(ctx, pattern0_0, expr2_0, &expr3_0)?;
9338             let expr5_0 = C::gpr_to_reg(ctx, expr4_0);
9339             let expr6_0 = RegMemImm::Reg { reg: expr5_0 };
9340             let expr7_0 = constructor_mov_rmi_to_xmm(ctx, &expr6_0)?;
9341             return Some(expr7_0);
9342         }
9343         _ => {}
9344     }
9345     return None;
9346 }
9347 
9348 // Generated as internal constructor for term sse_and_not.
9349 pub fn constructor_sse_and_not<C: Context>(
9350     ctx: &mut C,
9351     arg0: Type,
9352     arg1: Xmm,
9353     arg2: &XmmMem,
9354 ) -> Option<Xmm> {
9355     let pattern0_0 = arg0;
9356     if pattern0_0 == F32X4 {
9357         let pattern2_0 = arg1;
9358         let pattern3_0 = arg2;
9359         // Rule at src/isa/x64/lower.isle line 1194.
9360         let expr0_0 = constructor_andnps(ctx, pattern2_0, pattern3_0)?;
9361         return Some(expr0_0);
9362     }
9363     if pattern0_0 == F64X2 {
9364         let pattern2_0 = arg1;
9365         let pattern3_0 = arg2;
9366         // Rule at src/isa/x64/lower.isle line 1195.
9367         let expr0_0 = constructor_andnpd(ctx, pattern2_0, pattern3_0)?;
9368         return Some(expr0_0);
9369     }
9370     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
9371         let pattern2_0 = arg1;
9372         let pattern3_0 = arg2;
9373         // Rule at src/isa/x64/lower.isle line 1196.
9374         let expr0_0 = constructor_pandn(ctx, pattern2_0, pattern3_0)?;
9375         return Some(expr0_0);
9376     }
9377     return None;
9378 }
9379 
9380 // Generated as internal constructor for term i128_not.
9381 pub fn constructor_i128_not<C: Context>(ctx: &mut C, arg0: Value) -> Option<ValueRegs> {
9382     let pattern0_0 = arg0;
9383     // Rule at src/isa/x64/lower.isle line 1259.
9384     let expr0_0 = C::put_in_regs(ctx, pattern0_0);
9385     let expr1_0: usize = 0;
9386     let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
9387     let expr3_0: usize = 1;
9388     let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
9389     let expr5_0: Type = I64;
9390     let expr6_0 = constructor_not(ctx, expr5_0, expr2_0)?;
9391     let expr7_0: Type = I64;
9392     let expr8_0 = constructor_not(ctx, expr7_0, expr4_0)?;
9393     let expr9_0 = constructor_value_gprs(ctx, expr6_0, expr8_0)?;
9394     return Some(expr9_0);
9395 }
9396 
9397 // Generated as internal constructor for term vec_insert_lane.
9398 pub fn constructor_vec_insert_lane<C: Context>(
9399     ctx: &mut C,
9400     arg0: Type,
9401     arg1: Xmm,
9402     arg2: &RegMem,
9403     arg3: u8,
9404 ) -> Option<Xmm> {
9405     let pattern0_0 = arg0;
9406     if pattern0_0 == I8X16 {
9407         let pattern2_0 = arg1;
9408         let pattern3_0 = arg2;
9409         let pattern4_0 = arg3;
9410         // Rule at src/isa/x64/lower.isle line 1313.
9411         let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0);
9412         let expr1_0 = constructor_pinsrb(ctx, pattern2_0, &expr0_0, pattern4_0)?;
9413         return Some(expr1_0);
9414     }
9415     if pattern0_0 == I16X8 {
9416         let pattern2_0 = arg1;
9417         let pattern3_0 = arg2;
9418         let pattern4_0 = arg3;
9419         // Rule at src/isa/x64/lower.isle line 1317.
9420         let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0);
9421         let expr1_0 = constructor_pinsrw(ctx, pattern2_0, &expr0_0, pattern4_0)?;
9422         return Some(expr1_0);
9423     }
9424     if pattern0_0 == I32X4 {
9425         let pattern2_0 = arg1;
9426         let pattern3_0 = arg2;
9427         let pattern4_0 = arg3;
9428         // Rule at src/isa/x64/lower.isle line 1321.
9429         let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0);
9430         let expr1_0 = OperandSize::Size32;
9431         let expr2_0 = constructor_pinsrd(ctx, pattern2_0, &expr0_0, pattern4_0, &expr1_0)?;
9432         return Some(expr2_0);
9433     }
9434     if pattern0_0 == I64X2 {
9435         let pattern2_0 = arg1;
9436         let pattern3_0 = arg2;
9437         let pattern4_0 = arg3;
9438         // Rule at src/isa/x64/lower.isle line 1325.
9439         let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0);
9440         let expr1_0 = OperandSize::Size64;
9441         let expr2_0 = constructor_pinsrd(ctx, pattern2_0, &expr0_0, pattern4_0, &expr1_0)?;
9442         return Some(expr2_0);
9443     }
9444     if pattern0_0 == F32X4 {
9445         let pattern2_0 = arg1;
9446         let pattern3_0 = arg2;
9447         let pattern4_0 = arg3;
9448         // Rule at src/isa/x64/lower.isle line 1329.
9449         let expr0_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0);
9450         let expr1_0 = C::sse_insertps_lane_imm(ctx, pattern4_0);
9451         let expr2_0 = constructor_insertps(ctx, pattern2_0, &expr0_0, expr1_0)?;
9452         return Some(expr2_0);
9453     }
9454     if pattern0_0 == F64X2 {
9455         let pattern2_0 = arg1;
9456         let pattern3_0 = arg2;
9457         if let &RegMem::Reg { reg: pattern4_0 } = pattern3_0 {
9458             let pattern5_0 = arg3;
9459             if pattern5_0 == 0 {
9460                 // Rule at src/isa/x64/lower.isle line 1351.
9461                 let expr0_0 = constructor_reg_to_xmm_mem(ctx, pattern4_0)?;
9462                 let expr1_0 = constructor_movsd(ctx, pattern2_0, &expr0_0)?;
9463                 return Some(expr1_0);
9464             }
9465         }
9466         let pattern4_0 = arg3;
9467         if pattern4_0 == 0 {
9468             // Rule at src/isa/x64/lower.isle line 1353.
9469             let expr0_0 = SseOpcode::Movsd;
9470             let expr1_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0);
9471             let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?;
9472             let expr3_0 = C::xmm_to_xmm_mem(ctx, expr2_0);
9473             let expr4_0 = constructor_movsd(ctx, pattern2_0, &expr3_0)?;
9474             return Some(expr4_0);
9475         }
9476         if pattern4_0 == 1 {
9477             // Rule at src/isa/x64/lower.isle line 1362.
9478             let expr0_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0);
9479             let expr1_0 = constructor_movlhps(ctx, pattern2_0, &expr0_0)?;
9480             return Some(expr1_0);
9481         }
9482     }
9483     return None;
9484 }
9485 
9486 // Generated as internal constructor for term cmp_and_choose.
9487 pub fn constructor_cmp_and_choose<C: Context>(
9488     ctx: &mut C,
9489     arg0: Type,
9490     arg1: &CC,
9491     arg2: Value,
9492     arg3: Value,
9493 ) -> Option<ValueRegs> {
9494     let pattern0_0 = arg0;
9495     if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) {
9496         let pattern2_0 = arg1;
9497         let pattern3_0 = arg2;
9498         let pattern4_0 = arg3;
9499         // Rule at src/isa/x64/lower.isle line 1370.
9500         let expr0_0 = constructor_put_in_gpr(ctx, pattern3_0)?;
9501         let expr1_0 = constructor_put_in_gpr(ctx, pattern4_0)?;
9502         let expr2_0 = C::raw_operand_size_of_type(ctx, pattern1_0);
9503         let expr3_0 = C::gpr_to_gpr_mem_imm(ctx, expr0_0);
9504         let expr4_0 = constructor_cmp(ctx, &expr2_0, &expr3_0, expr1_0)?;
9505         let expr5_0 = C::gpr_to_gpr_mem(ctx, expr1_0);
9506         let expr6_0 = constructor_cmove(ctx, pattern1_0, pattern2_0, &expr5_0, expr0_0)?;
9507         let expr7_0 = constructor_with_flags_reg(ctx, &expr4_0, &expr6_0)?;
9508         let expr8_0 = C::value_reg(ctx, expr7_0);
9509         return Some(expr8_0);
9510     }
9511     return None;
9512 }
9513 
9514 // Generated as internal constructor for term do_clz.
9515 pub fn constructor_do_clz<C: Context>(
9516     ctx: &mut C,
9517     arg0: Type,
9518     arg1: Type,
9519     arg2: Gpr,
9520 ) -> Option<Gpr> {
9521     let pattern0_0 = arg0;
9522     let pattern1_0 = arg1;
9523     let pattern2_0 = arg2;
9524     // Rule at src/isa/x64/lower.isle line 1669.
9525     let expr0_0: Type = I64;
9526     let expr1_0: i64 = -1;
9527     let expr2_0 = constructor_imm_i64(ctx, expr0_0, expr1_0)?;
9528     let expr3_0 = C::gpr_new(ctx, expr2_0);
9529     let expr4_0 = constructor_bsr_or_else(ctx, pattern0_0, pattern2_0, expr3_0)?;
9530     let expr5_0 = C::gpr_to_reg(ctx, expr4_0);
9531     let expr6_0 = C::ty_bits_u64(ctx, pattern1_0);
9532     let expr7_0: u64 = 1;
9533     let expr8_0 = C::u64_sub(ctx, expr6_0, expr7_0);
9534     let expr9_0 = constructor_imm(ctx, pattern0_0, expr8_0)?;
9535     let expr10_0 = C::gpr_new(ctx, expr9_0);
9536     let expr11_0 = constructor_reg_to_gpr_mem_imm(ctx, expr5_0)?;
9537     let expr12_0 = constructor_sub(ctx, pattern0_0, expr10_0, &expr11_0)?;
9538     return Some(expr12_0);
9539 }
9540 
9541 // Generated as internal constructor for term do_ctz.
9542 pub fn constructor_do_ctz<C: Context>(
9543     ctx: &mut C,
9544     arg0: Type,
9545     arg1: Type,
9546     arg2: Gpr,
9547 ) -> Option<Gpr> {
9548     let pattern0_0 = arg0;
9549     let pattern1_0 = arg1;
9550     let pattern2_0 = arg2;
9551     // Rule at src/isa/x64/lower.isle line 1710.
9552     let expr0_0: Type = I64;
9553     let expr1_0 = C::ty_bits_u64(ctx, pattern1_0);
9554     let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
9555     let expr3_0 = C::gpr_new(ctx, expr2_0);
9556     let expr4_0 = constructor_bsf_or_else(ctx, pattern0_0, pattern2_0, expr3_0)?;
9557     return Some(expr4_0);
9558 }
9559 
9560 // Generated as internal constructor for term do_popcnt.
9561 pub fn constructor_do_popcnt<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
9562     let pattern0_0 = arg0;
9563     if pattern0_0 == I32 {
9564         let pattern2_0 = arg1;
9565         // Rule at src/isa/x64/lower.isle line 1801.
9566         let expr0_0: Type = I32;
9567         let expr1_0: u8 = 1;
9568         let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 };
9569         let expr3_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr2_0);
9570         let expr4_0 = constructor_shr(ctx, expr0_0, pattern2_0, &expr3_0)?;
9571         let expr5_0: Type = I32;
9572         let expr6_0: u64 = 2004318071;
9573         let expr7_0 = constructor_imm(ctx, expr5_0, expr6_0)?;
9574         let expr8_0 = C::gpr_new(ctx, expr7_0);
9575         let expr9_0: Type = I32;
9576         let expr10_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0);
9577         let expr11_0 = constructor_x64_and(ctx, expr9_0, expr4_0, &expr10_0)?;
9578         let expr12_0: Type = I32;
9579         let expr13_0 = C::gpr_to_gpr_mem_imm(ctx, expr11_0);
9580         let expr14_0 = constructor_sub(ctx, expr12_0, pattern2_0, &expr13_0)?;
9581         let expr15_0: Type = I32;
9582         let expr16_0: u8 = 1;
9583         let expr17_0 = Imm8Reg::Imm8 { imm: expr16_0 };
9584         let expr18_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr17_0);
9585         let expr19_0 = constructor_shr(ctx, expr15_0, expr11_0, &expr18_0)?;
9586         let expr20_0: Type = I32;
9587         let expr21_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0);
9588         let expr22_0 = constructor_x64_and(ctx, expr20_0, expr19_0, &expr21_0)?;
9589         let expr23_0: Type = I32;
9590         let expr24_0 = C::gpr_to_gpr_mem_imm(ctx, expr22_0);
9591         let expr25_0 = constructor_sub(ctx, expr23_0, expr14_0, &expr24_0)?;
9592         let expr26_0: Type = I32;
9593         let expr27_0: u8 = 1;
9594         let expr28_0 = Imm8Reg::Imm8 { imm: expr27_0 };
9595         let expr29_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr28_0);
9596         let expr30_0 = constructor_shr(ctx, expr26_0, expr22_0, &expr29_0)?;
9597         let expr31_0: Type = I32;
9598         let expr32_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0);
9599         let expr33_0 = constructor_x64_and(ctx, expr31_0, expr30_0, &expr32_0)?;
9600         let expr34_0: Type = I32;
9601         let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr33_0);
9602         let expr36_0 = constructor_sub(ctx, expr34_0, expr25_0, &expr35_0)?;
9603         let expr37_0: Type = I32;
9604         let expr38_0: Type = I32;
9605         let expr39_0: u8 = 4;
9606         let expr40_0 = Imm8Reg::Imm8 { imm: expr39_0 };
9607         let expr41_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr40_0);
9608         let expr42_0 = constructor_shr(ctx, expr38_0, expr36_0, &expr41_0)?;
9609         let expr43_0 = C::gpr_to_gpr_mem_imm(ctx, expr36_0);
9610         let expr44_0 = constructor_add(ctx, expr37_0, expr42_0, &expr43_0)?;
9611         let expr45_0: Type = I32;
9612         let expr46_0: u32 = 252645135;
9613         let expr47_0 = RegMemImm::Imm { simm32: expr46_0 };
9614         let expr48_0 = C::gpr_mem_imm_new(ctx, &expr47_0);
9615         let expr49_0 = constructor_x64_and(ctx, expr45_0, expr44_0, &expr48_0)?;
9616         let expr50_0: Type = I32;
9617         let expr51_0: u32 = 16843009;
9618         let expr52_0 = RegMemImm::Imm { simm32: expr51_0 };
9619         let expr53_0 = C::gpr_mem_imm_new(ctx, &expr52_0);
9620         let expr54_0 = constructor_mul(ctx, expr50_0, expr49_0, &expr53_0)?;
9621         let expr55_0: Type = I32;
9622         let expr56_0: u8 = 24;
9623         let expr57_0 = Imm8Reg::Imm8 { imm: expr56_0 };
9624         let expr58_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr57_0);
9625         let expr59_0 = constructor_shr(ctx, expr55_0, expr54_0, &expr58_0)?;
9626         return Some(expr59_0);
9627     }
9628     if pattern0_0 == I64 {
9629         let pattern2_0 = arg1;
9630         // Rule at src/isa/x64/lower.isle line 1758.
9631         let expr0_0: Type = I64;
9632         let expr1_0: u8 = 1;
9633         let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 };
9634         let expr3_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr2_0);
9635         let expr4_0 = constructor_shr(ctx, expr0_0, pattern2_0, &expr3_0)?;
9636         let expr5_0: Type = I64;
9637         let expr6_0: u64 = 8608480567731124087;
9638         let expr7_0 = constructor_imm(ctx, expr5_0, expr6_0)?;
9639         let expr8_0 = C::gpr_new(ctx, expr7_0);
9640         let expr9_0: Type = I64;
9641         let expr10_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0);
9642         let expr11_0 = constructor_x64_and(ctx, expr9_0, expr4_0, &expr10_0)?;
9643         let expr12_0: Type = I64;
9644         let expr13_0 = C::gpr_to_gpr_mem_imm(ctx, expr11_0);
9645         let expr14_0 = constructor_sub(ctx, expr12_0, pattern2_0, &expr13_0)?;
9646         let expr15_0: Type = I64;
9647         let expr16_0: u8 = 1;
9648         let expr17_0 = Imm8Reg::Imm8 { imm: expr16_0 };
9649         let expr18_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr17_0);
9650         let expr19_0 = constructor_shr(ctx, expr15_0, expr11_0, &expr18_0)?;
9651         let expr20_0: Type = I64;
9652         let expr21_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0);
9653         let expr22_0 = constructor_x64_and(ctx, expr20_0, expr19_0, &expr21_0)?;
9654         let expr23_0: Type = I64;
9655         let expr24_0 = C::gpr_to_gpr_mem_imm(ctx, expr22_0);
9656         let expr25_0 = constructor_sub(ctx, expr23_0, expr14_0, &expr24_0)?;
9657         let expr26_0: Type = I64;
9658         let expr27_0: u8 = 1;
9659         let expr28_0 = Imm8Reg::Imm8 { imm: expr27_0 };
9660         let expr29_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr28_0);
9661         let expr30_0 = constructor_shr(ctx, expr26_0, expr22_0, &expr29_0)?;
9662         let expr31_0: Type = I64;
9663         let expr32_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0);
9664         let expr33_0 = constructor_x64_and(ctx, expr31_0, expr30_0, &expr32_0)?;
9665         let expr34_0: Type = I64;
9666         let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr33_0);
9667         let expr36_0 = constructor_sub(ctx, expr34_0, expr25_0, &expr35_0)?;
9668         let expr37_0: Type = I64;
9669         let expr38_0: Type = I64;
9670         let expr39_0: u8 = 4;
9671         let expr40_0 = Imm8Reg::Imm8 { imm: expr39_0 };
9672         let expr41_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr40_0);
9673         let expr42_0 = constructor_shr(ctx, expr38_0, expr36_0, &expr41_0)?;
9674         let expr43_0 = C::gpr_to_gpr_mem_imm(ctx, expr36_0);
9675         let expr44_0 = constructor_add(ctx, expr37_0, expr42_0, &expr43_0)?;
9676         let expr45_0: Type = I64;
9677         let expr46_0: u64 = 1085102592571150095;
9678         let expr47_0 = constructor_imm(ctx, expr45_0, expr46_0)?;
9679         let expr48_0 = C::gpr_new(ctx, expr47_0);
9680         let expr49_0: Type = I64;
9681         let expr50_0 = C::gpr_to_gpr_mem_imm(ctx, expr48_0);
9682         let expr51_0 = constructor_x64_and(ctx, expr49_0, expr44_0, &expr50_0)?;
9683         let expr52_0: Type = I64;
9684         let expr53_0: u64 = 72340172838076673;
9685         let expr54_0 = constructor_imm(ctx, expr52_0, expr53_0)?;
9686         let expr55_0 = C::gpr_new(ctx, expr54_0);
9687         let expr56_0: Type = I64;
9688         let expr57_0 = C::gpr_to_gpr_mem_imm(ctx, expr55_0);
9689         let expr58_0 = constructor_mul(ctx, expr56_0, expr51_0, &expr57_0)?;
9690         let expr59_0: Type = I64;
9691         let expr60_0: u8 = 56;
9692         let expr61_0 = Imm8Reg::Imm8 { imm: expr60_0 };
9693         let expr62_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr61_0);
9694         let expr63_0 = constructor_shr(ctx, expr59_0, expr58_0, &expr62_0)?;
9695         return Some(expr63_0);
9696     }
9697     return None;
9698 }
9699 
9700 // Generated as internal constructor for term do_bitrev8.
9701 pub fn constructor_do_bitrev8<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
9702     let pattern0_0 = arg0;
9703     let pattern1_0 = arg1;
9704     // Rule at src/isa/x64/lower.isle line 1890.
9705     let expr0_0 = C::ty_mask(ctx, pattern0_0);
9706     let expr1_0: u64 = 6148914691236517205;
9707     let expr2_0 = C::u64_and(ctx, expr0_0, expr1_0);
9708     let expr3_0 = constructor_imm(ctx, pattern0_0, expr2_0)?;
9709     let expr4_0 = C::gpr_new(ctx, expr3_0);
9710     let expr5_0 = C::gpr_to_gpr_mem_imm(ctx, expr4_0);
9711     let expr6_0 = constructor_x64_and(ctx, pattern0_0, pattern1_0, &expr5_0)?;
9712     let expr7_0: u8 = 1;
9713     let expr8_0 = Imm8Reg::Imm8 { imm: expr7_0 };
9714     let expr9_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr8_0);
9715     let expr10_0 = constructor_shr(ctx, pattern0_0, pattern1_0, &expr9_0)?;
9716     let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr4_0);
9717     let expr12_0 = constructor_x64_and(ctx, pattern0_0, expr10_0, &expr11_0)?;
9718     let expr13_0: u8 = 1;
9719     let expr14_0 = Imm8Reg::Imm8 { imm: expr13_0 };
9720     let expr15_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr14_0);
9721     let expr16_0 = constructor_shl(ctx, pattern0_0, expr6_0, &expr15_0)?;
9722     let expr17_0 = C::gpr_to_gpr_mem_imm(ctx, expr12_0);
9723     let expr18_0 = constructor_or(ctx, pattern0_0, expr16_0, &expr17_0)?;
9724     let expr19_0: u64 = 3689348814741910323;
9725     let expr20_0 = C::u64_and(ctx, expr0_0, expr19_0);
9726     let expr21_0 = constructor_imm(ctx, pattern0_0, expr20_0)?;
9727     let expr22_0 = C::gpr_new(ctx, expr21_0);
9728     let expr23_0 = C::gpr_to_gpr_mem_imm(ctx, expr22_0);
9729     let expr24_0 = constructor_x64_and(ctx, pattern0_0, expr18_0, &expr23_0)?;
9730     let expr25_0: u8 = 2;
9731     let expr26_0 = Imm8Reg::Imm8 { imm: expr25_0 };
9732     let expr27_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr26_0);
9733     let expr28_0 = constructor_shr(ctx, pattern0_0, expr18_0, &expr27_0)?;
9734     let expr29_0 = C::gpr_to_gpr_mem_imm(ctx, expr22_0);
9735     let expr30_0 = constructor_x64_and(ctx, pattern0_0, expr28_0, &expr29_0)?;
9736     let expr31_0: u8 = 2;
9737     let expr32_0 = Imm8Reg::Imm8 { imm: expr31_0 };
9738     let expr33_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr32_0);
9739     let expr34_0 = constructor_shl(ctx, pattern0_0, expr24_0, &expr33_0)?;
9740     let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr30_0);
9741     let expr36_0 = constructor_or(ctx, pattern0_0, expr34_0, &expr35_0)?;
9742     let expr37_0: u64 = 1085102592571150095;
9743     let expr38_0 = C::u64_and(ctx, expr0_0, expr37_0);
9744     let expr39_0 = constructor_imm(ctx, pattern0_0, expr38_0)?;
9745     let expr40_0 = C::gpr_new(ctx, expr39_0);
9746     let expr41_0 = C::gpr_to_gpr_mem_imm(ctx, expr40_0);
9747     let expr42_0 = constructor_x64_and(ctx, pattern0_0, expr36_0, &expr41_0)?;
9748     let expr43_0: u8 = 4;
9749     let expr44_0 = Imm8Reg::Imm8 { imm: expr43_0 };
9750     let expr45_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr44_0);
9751     let expr46_0 = constructor_shr(ctx, pattern0_0, expr36_0, &expr45_0)?;
9752     let expr47_0 = C::gpr_to_gpr_mem_imm(ctx, expr40_0);
9753     let expr48_0 = constructor_x64_and(ctx, pattern0_0, expr46_0, &expr47_0)?;
9754     let expr49_0: u8 = 4;
9755     let expr50_0 = Imm8Reg::Imm8 { imm: expr49_0 };
9756     let expr51_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr50_0);
9757     let expr52_0 = constructor_shl(ctx, pattern0_0, expr42_0, &expr51_0)?;
9758     let expr53_0 = C::gpr_to_gpr_mem_imm(ctx, expr48_0);
9759     let expr54_0 = constructor_or(ctx, pattern0_0, expr52_0, &expr53_0)?;
9760     return Some(expr54_0);
9761 }
9762 
9763 // Generated as internal constructor for term do_bitrev16.
9764 pub fn constructor_do_bitrev16<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
9765     let pattern0_0 = arg0;
9766     let pattern1_0 = arg1;
9767     // Rule at src/isa/x64/lower.isle line 1913.
9768     let expr0_0 = constructor_do_bitrev8(ctx, pattern0_0, pattern1_0)?;
9769     let expr1_0 = C::ty_mask(ctx, pattern0_0);
9770     let expr2_0: u64 = 71777214294589695;
9771     let expr3_0 = C::u64_and(ctx, expr1_0, expr2_0);
9772     let expr4_0 = constructor_imm(ctx, pattern0_0, expr3_0)?;
9773     let expr5_0 = C::gpr_new(ctx, expr4_0);
9774     let expr6_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
9775     let expr7_0 = constructor_x64_and(ctx, pattern0_0, expr0_0, &expr6_0)?;
9776     let expr8_0: u8 = 8;
9777     let expr9_0 = Imm8Reg::Imm8 { imm: expr8_0 };
9778     let expr10_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr9_0);
9779     let expr11_0 = constructor_shr(ctx, pattern0_0, expr0_0, &expr10_0)?;
9780     let expr12_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
9781     let expr13_0 = constructor_x64_and(ctx, pattern0_0, expr11_0, &expr12_0)?;
9782     let expr14_0: u8 = 8;
9783     let expr15_0 = Imm8Reg::Imm8 { imm: expr14_0 };
9784     let expr16_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr15_0);
9785     let expr17_0 = constructor_shl(ctx, pattern0_0, expr7_0, &expr16_0)?;
9786     let expr18_0 = C::gpr_to_gpr_mem_imm(ctx, expr13_0);
9787     let expr19_0 = constructor_or(ctx, pattern0_0, expr17_0, &expr18_0)?;
9788     return Some(expr19_0);
9789 }
9790 
9791 // Generated as internal constructor for term do_bitrev32.
9792 pub fn constructor_do_bitrev32<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
9793     let pattern0_0 = arg0;
9794     let pattern1_0 = arg1;
9795     // Rule at src/isa/x64/lower.isle line 1925.
9796     let expr0_0 = constructor_do_bitrev16(ctx, pattern0_0, pattern1_0)?;
9797     let expr1_0 = C::ty_mask(ctx, pattern0_0);
9798     let expr2_0: u64 = 281470681808895;
9799     let expr3_0 = C::u64_and(ctx, expr1_0, expr2_0);
9800     let expr4_0 = constructor_imm(ctx, pattern0_0, expr3_0)?;
9801     let expr5_0 = C::gpr_new(ctx, expr4_0);
9802     let expr6_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
9803     let expr7_0 = constructor_x64_and(ctx, pattern0_0, expr0_0, &expr6_0)?;
9804     let expr8_0: u8 = 16;
9805     let expr9_0 = Imm8Reg::Imm8 { imm: expr8_0 };
9806     let expr10_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr9_0);
9807     let expr11_0 = constructor_shr(ctx, pattern0_0, expr0_0, &expr10_0)?;
9808     let expr12_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
9809     let expr13_0 = constructor_x64_and(ctx, pattern0_0, expr11_0, &expr12_0)?;
9810     let expr14_0: u8 = 16;
9811     let expr15_0 = Imm8Reg::Imm8 { imm: expr14_0 };
9812     let expr16_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr15_0);
9813     let expr17_0 = constructor_shl(ctx, pattern0_0, expr7_0, &expr16_0)?;
9814     let expr18_0 = C::gpr_to_gpr_mem_imm(ctx, expr13_0);
9815     let expr19_0 = constructor_or(ctx, pattern0_0, expr17_0, &expr18_0)?;
9816     return Some(expr19_0);
9817 }
9818 
9819 // Generated as internal constructor for term do_bitrev64.
9820 pub fn constructor_do_bitrev64<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
9821     let pattern0_0 = arg0;
9822     if pattern0_0 == I64 {
9823         let pattern2_0 = arg1;
9824         // Rule at src/isa/x64/lower.isle line 1937.
9825         let expr0_0 = constructor_do_bitrev32(ctx, pattern0_0, pattern2_0)?;
9826         let expr1_0: u64 = 4294967295;
9827         let expr2_0 = constructor_imm(ctx, pattern0_0, expr1_0)?;
9828         let expr3_0 = C::gpr_new(ctx, expr2_0);
9829         let expr4_0 = C::gpr_to_gpr_mem_imm(ctx, expr3_0);
9830         let expr5_0 = constructor_x64_and(ctx, pattern0_0, expr0_0, &expr4_0)?;
9831         let expr6_0: u8 = 32;
9832         let expr7_0 = Imm8Reg::Imm8 { imm: expr6_0 };
9833         let expr8_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr7_0);
9834         let expr9_0 = constructor_shr(ctx, pattern0_0, expr0_0, &expr8_0)?;
9835         let expr10_0: u8 = 32;
9836         let expr11_0 = Imm8Reg::Imm8 { imm: expr10_0 };
9837         let expr12_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr11_0);
9838         let expr13_0 = constructor_shl(ctx, pattern0_0, expr5_0, &expr12_0)?;
9839         let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
9840         let expr15_0 = constructor_or(ctx, pattern0_0, expr13_0, &expr14_0)?;
9841         return Some(expr15_0);
9842     }
9843     return None;
9844 }
9845 
9846 // Generated as internal constructor for term generic_sextend.
9847 pub fn constructor_generic_sextend<C: Context>(
9848     ctx: &mut C,
9849     arg0: Value,
9850     arg1: Type,
9851     arg2: Type,
9852 ) -> Option<InstOutput> {
9853     let pattern0_0 = arg0;
9854     let pattern1_0 = arg1;
9855     if let Some(pattern2_0) = C::fits_in_32(ctx, pattern1_0) {
9856         let pattern3_0 = arg2;
9857         if let Some(pattern4_0) = C::fits_in_32(ctx, pattern3_0) {
9858             // Rule at src/isa/x64/lower.isle line 2057.
9859             let expr0_0: Type = I32;
9860             let expr1_0 = ExtendKind::Sign;
9861             let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?;
9862             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
9863             return Some(expr3_0);
9864         }
9865         if let Some(pattern4_0) = C::ty_int_bool_64(ctx, pattern3_0) {
9866             // Rule at src/isa/x64/lower.isle line 2053.
9867             let expr0_0: Type = I64;
9868             let expr1_0 = ExtendKind::Sign;
9869             let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?;
9870             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
9871             return Some(expr3_0);
9872         }
9873         if let Some(pattern4_0) = C::ty_int_bool_128(ctx, pattern3_0) {
9874             // Rule at src/isa/x64/lower.isle line 2047.
9875             let expr0_0: Type = I64;
9876             let expr1_0 = ExtendKind::Sign;
9877             let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?;
9878             let expr3_0 = constructor_spread_sign_bit(ctx, expr2_0)?;
9879             let expr4_0 = C::gpr_to_reg(ctx, expr2_0);
9880             let expr5_0 = C::gpr_to_reg(ctx, expr3_0);
9881             let expr6_0 = C::value_regs(ctx, expr4_0, expr5_0);
9882             let expr7_0 = C::output(ctx, expr6_0);
9883             return Some(expr7_0);
9884         }
9885     }
9886     if let Some(pattern2_0) = C::ty_int_bool_64(ctx, pattern1_0) {
9887         let pattern3_0 = arg2;
9888         if let Some(pattern4_0) = C::ty_int_bool_128(ctx, pattern3_0) {
9889             // Rule at src/isa/x64/lower.isle line 2043.
9890             let expr0_0 = C::put_in_reg(ctx, pattern0_0);
9891             let expr1_0 = constructor_put_in_gpr(ctx, pattern0_0)?;
9892             let expr2_0 = constructor_spread_sign_bit(ctx, expr1_0)?;
9893             let expr3_0 = C::gpr_to_reg(ctx, expr2_0);
9894             let expr4_0 = C::value_regs(ctx, expr0_0, expr3_0);
9895             let expr5_0 = C::output(ctx, expr4_0);
9896             return Some(expr5_0);
9897         }
9898     }
9899     let pattern2_0 = arg2;
9900     if pattern2_0 == pattern1_0 {
9901         // Rule at src/isa/x64/lower.isle line 2033.
9902         let expr0_0 = constructor_output_value(ctx, pattern0_0)?;
9903         return Some(expr0_0);
9904     }
9905     return None;
9906 }
9907 
9908 // Generated as internal constructor for term spread_sign_bit.
9909 pub fn constructor_spread_sign_bit<C: Context>(ctx: &mut C, arg0: Gpr) -> Option<Gpr> {
9910     let pattern0_0 = arg0;
9911     // Rule at src/isa/x64/lower.isle line 2039.
9912     let expr0_0: Type = I64;
9913     let expr1_0: u8 = 63;
9914     let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 };
9915     let expr3_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr2_0);
9916     let expr4_0 = constructor_sar(ctx, expr0_0, pattern0_0, &expr3_0)?;
9917     return Some(expr4_0);
9918 }
9919