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