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, unused_mut)]
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 s32_add_fallible(&mut self, arg0: u32, arg1: u32) -> Option<u32>;
25     fn u32_nonnegative(&mut self, arg0: u32) -> Option<u32>;
26     fn offset32(&mut self, arg0: Offset32) -> Option<u32>;
27     fn u32_lteq(&mut self, arg0: u32, arg1: u32) -> Option<Unit>;
28     fn simm32(&mut self, arg0: Imm64) -> Option<u32>;
29     fn uimm8(&mut self, arg0: Imm64) -> Option<u8>;
30     fn u8_and(&mut self, arg0: u8, arg1: u8) -> u8;
31     fn value_reg(&mut self, arg0: Reg) -> ValueRegs;
32     fn value_regs(&mut self, arg0: Reg, arg1: Reg) -> ValueRegs;
33     fn value_regs_invalid(&mut self) -> ValueRegs;
34     fn output_none(&mut self) -> InstOutput;
35     fn output(&mut self, arg0: ValueRegs) -> InstOutput;
36     fn output_pair(&mut self, arg0: ValueRegs, arg1: ValueRegs) -> InstOutput;
37     fn output_builder_new(&mut self) -> InstOutputBuilder;
38     fn output_builder_push(&mut self, arg0: &InstOutputBuilder, arg1: ValueRegs) -> Unit;
39     fn output_builder_finish(&mut self, arg0: &InstOutputBuilder) -> InstOutput;
40     fn temp_writable_reg(&mut self, arg0: Type) -> WritableReg;
41     fn invalid_reg_etor(&mut self, arg0: Reg) -> Option<()>;
42     fn invalid_reg(&mut self) -> Reg;
43     fn valid_reg(&mut self, arg0: Reg) -> Option<()>;
44     fn put_in_reg(&mut self, arg0: Value) -> Reg;
45     fn put_in_regs(&mut self, arg0: Value) -> ValueRegs;
46     fn ensure_in_vreg(&mut self, arg0: Reg, arg1: Type) -> Reg;
47     fn value_regs_get(&mut self, arg0: ValueRegs, arg1: usize) -> Reg;
48     fn u8_as_u32(&mut self, arg0: u8) -> Option<u32>;
49     fn u8_as_u64(&mut self, arg0: u8) -> Option<u64>;
50     fn u16_as_u64(&mut self, arg0: u16) -> Option<u64>;
51     fn u32_as_u64(&mut self, arg0: u32) -> Option<u64>;
52     fn i64_as_u64(&mut self, arg0: i64) -> Option<u64>;
53     fn u64_add(&mut self, arg0: u64, arg1: u64) -> Option<u64>;
54     fn u64_sub(&mut self, arg0: u64, arg1: u64) -> Option<u64>;
55     fn u64_and(&mut self, arg0: u64, arg1: u64) -> Option<u64>;
56     fn ty_bits(&mut self, arg0: Type) -> Option<u8>;
57     fn ty_bits_u16(&mut self, arg0: Type) -> u16;
58     fn ty_bits_u64(&mut self, arg0: Type) -> u64;
59     fn ty_mask(&mut self, arg0: Type) -> u64;
60     fn ty_bytes(&mut self, arg0: Type) -> u16;
61     fn lane_type(&mut self, arg0: Type) -> Type;
62     fn fits_in_16(&mut self, arg0: Type) -> Option<Type>;
63     fn fits_in_32(&mut self, arg0: Type) -> Option<Type>;
64     fn fits_in_64(&mut self, arg0: Type) -> Option<Type>;
65     fn ty_32_or_64(&mut self, arg0: Type) -> Option<Type>;
66     fn ty_8_or_16(&mut self, arg0: Type) -> Option<Type>;
67     fn ty_int_bool_64(&mut self, arg0: Type) -> Option<Type>;
68     fn ty_int_bool_ref_64(&mut self, arg0: Type) -> Option<Type>;
69     fn ty_int_bool_128(&mut self, arg0: Type) -> Option<Type>;
70     fn ty_scalar_float(&mut self, arg0: Type) -> Option<Type>;
71     fn ty_vec128(&mut self, arg0: Type) -> Option<Type>;
72     fn ty_vec128_int(&mut self, arg0: Type) -> Option<Type>;
73     fn not_i64x2(&mut self, arg0: Type) -> Option<()>;
74     fn value_list_slice(&mut self, arg0: ValueList) -> ValueSlice;
75     fn value_slice_empty(&mut self, arg0: ValueSlice) -> Option<()>;
76     fn value_slice_unwrap(&mut self, arg0: ValueSlice) -> Option<(Value, ValueSlice)>;
77     fn value_slice_len(&mut self, arg0: ValueSlice) -> usize;
78     fn value_slice_get(&mut self, arg0: ValueSlice, arg1: usize) -> Value;
79     fn writable_reg_to_reg(&mut self, arg0: WritableReg) -> Reg;
80     fn u8_from_uimm8(&mut self, arg0: Uimm8) -> u8;
81     fn u64_from_imm64(&mut self, arg0: Imm64) -> u64;
82     fn nonzero_u64_from_imm64(&mut self, arg0: Imm64) -> Option<u64>;
83     fn u64_from_ieee32(&mut self, arg0: Ieee32) -> u64;
84     fn u64_from_ieee64(&mut self, arg0: Ieee64) -> u64;
85     fn inst_results(&mut self, arg0: Inst) -> ValueSlice;
86     fn first_result(&mut self, arg0: Inst) -> Option<Value>;
87     fn inst_data(&mut self, arg0: Inst) -> InstructionData;
88     fn value_type(&mut self, arg0: Value) -> Type;
89     fn multi_lane(&mut self, arg0: Type) -> Option<(u8, u16)>;
90     fn def_inst(&mut self, arg0: Value) -> Option<Inst>;
91     fn offset32_to_u32(&mut self, arg0: Offset32) -> u32;
92     fn emit(&mut self, arg0: &MInst) -> Unit;
93     fn emit_u64_le_const(&mut self, arg0: u64) -> VCodeConstant;
94     fn trap_code_division_by_zero(&mut self) -> TrapCode;
95     fn trap_code_integer_overflow(&mut self) -> TrapCode;
96     fn trap_code_bad_conversion_to_integer(&mut self) -> TrapCode;
97     fn avoid_div_traps(&mut self, arg0: Type) -> Option<()>;
98     fn func_ref_data(&mut self, arg0: FuncRef) -> (SigRef, ExternalName, RelocDistance);
99     fn symbol_value_data(
100         &mut self,
101         arg0: GlobalValue,
102     ) -> Option<(ExternalName, RelocDistance, i64)>;
103     fn reloc_distance_near(&mut self, arg0: RelocDistance) -> Option<()>;
104     fn operand_size_of_type_32_64(&mut self, arg0: Type) -> OperandSize;
105     fn raw_operand_size_of_type(&mut self, arg0: Type) -> OperandSize;
106     fn put_in_reg_mem_imm(&mut self, arg0: Value) -> RegMemImm;
107     fn put_in_reg_mem(&mut self, arg0: Value) -> RegMem;
108     fn synthetic_amode_to_reg_mem(&mut self, arg0: &SyntheticAmode) -> RegMem;
109     fn amode_to_synthetic_amode(&mut self, arg0: &Amode) -> SyntheticAmode;
110     fn amode_with_flags(&mut self, arg0: &Amode, arg1: MemFlags) -> Amode;
111     fn amode_imm_reg(&mut self, arg0: u32, arg1: Gpr) -> Amode;
112     fn amode_imm_reg_reg_shift(&mut self, arg0: u32, arg1: Gpr, arg2: Gpr, arg3: u8) -> Amode;
113     fn sum_extend_fits_in_32_bits(
114         &mut self,
115         arg0: Type,
116         arg1: Imm64,
117         arg2: Offset32,
118     ) -> Option<u32>;
119     fn amode_offset(&mut self, arg0: &Amode, arg1: u32) -> Amode;
120     fn put_masked_in_imm8_gpr(&mut self, arg0: Value, arg1: Type) -> Imm8Gpr;
121     fn intcc_to_cc(&mut self, arg0: &IntCC) -> CC;
122     fn encode_fcmp_imm(&mut self, arg0: &FcmpImm) -> u8;
123     fn imm8_reg_to_imm8_gpr(&mut self, arg0: &Imm8Reg) -> Imm8Gpr;
124     fn writable_gpr_to_reg(&mut self, arg0: WritableGpr) -> WritableReg;
125     fn writable_xmm_to_reg(&mut self, arg0: WritableXmm) -> WritableReg;
126     fn writable_reg_to_xmm(&mut self, arg0: WritableReg) -> WritableXmm;
127     fn writable_xmm_to_xmm(&mut self, arg0: WritableXmm) -> Xmm;
128     fn writable_gpr_to_gpr(&mut self, arg0: WritableGpr) -> Gpr;
129     fn gpr_to_reg(&mut self, arg0: Gpr) -> Reg;
130     fn gpr_to_gpr_mem(&mut self, arg0: Gpr) -> GprMem;
131     fn gpr_to_gpr_mem_imm(&mut self, arg0: Gpr) -> GprMemImm;
132     fn xmm_to_reg(&mut self, arg0: Xmm) -> Reg;
133     fn xmm_to_xmm_mem_imm(&mut self, arg0: Xmm) -> XmmMemImm;
134     fn temp_writable_gpr(&mut self) -> WritableGpr;
135     fn temp_writable_xmm(&mut self) -> WritableXmm;
136     fn reg_mem_to_xmm_mem(&mut self, arg0: &RegMem) -> XmmMem;
137     fn gpr_mem_imm_new(&mut self, arg0: &RegMemImm) -> GprMemImm;
138     fn xmm_mem_imm_new(&mut self, arg0: &RegMemImm) -> XmmMemImm;
139     fn xmm_to_xmm_mem(&mut self, arg0: Xmm) -> XmmMem;
140     fn xmm_mem_to_reg_mem(&mut self, arg0: &XmmMem) -> RegMem;
141     fn gpr_mem_to_reg_mem(&mut self, arg0: &GprMem) -> RegMem;
142     fn xmm_new(&mut self, arg0: Reg) -> Xmm;
143     fn gpr_new(&mut self, arg0: Reg) -> Gpr;
144     fn reg_mem_to_gpr_mem(&mut self, arg0: &RegMem) -> GprMem;
145     fn reg_to_gpr_mem(&mut self, arg0: Reg) -> GprMem;
146     fn gpr_to_imm8_gpr(&mut self, arg0: Gpr) -> Imm8Gpr;
147     fn imm8_to_imm8_gpr(&mut self, arg0: u8) -> Imm8Gpr;
148     fn xmm0(&mut self) -> WritableXmm;
149     fn is_xmm_type(&mut self, arg0: Type) -> Option<Type>;
150     fn is_gpr_type(&mut self, arg0: Type) -> Option<Type>;
151     fn is_single_register_type(&mut self, arg0: Type) -> Option<Type>;
152     fn avx512vl_enabled(&mut self, arg0: Type) -> Option<()>;
153     fn avx512dq_enabled(&mut self, arg0: Type) -> Option<()>;
154     fn avx512f_enabled(&mut self, arg0: Type) -> Option<()>;
155     fn avx512bitalg_enabled(&mut self, arg0: Type) -> Option<()>;
156     fn use_lzcnt(&mut self, arg0: Type) -> Option<()>;
157     fn use_bmi1(&mut self, arg0: Type) -> Option<()>;
158     fn use_popcnt(&mut self, arg0: Type) -> Option<()>;
159     fn imm8_from_value(&mut self, arg0: Value) -> Option<Imm8Reg>;
160     fn const_to_type_masked_imm8(&mut self, arg0: u64, arg1: Type) -> Imm8Gpr;
161     fn simm32_from_value(&mut self, arg0: Value) -> Option<GprMemImm>;
162     fn simm32_from_imm64(&mut self, arg0: Imm64) -> Option<GprMemImm>;
163     fn sinkable_load(&mut self, arg0: Value) -> Option<SinkableLoad>;
164     fn sink_load(&mut self, arg0: &SinkableLoad) -> RegMemImm;
165     fn ext_mode(&mut self, arg0: u16, arg1: u16) -> ExtMode;
166     fn nonzero_u64_fits_in_u32(&mut self, arg0: u64) -> Option<u64>;
167     fn ishl_i8x16_mask_for_const(&mut self, arg0: u32) -> SyntheticAmode;
168     fn ishl_i8x16_mask_table(&mut self) -> SyntheticAmode;
169     fn ushr_i8x16_mask_for_const(&mut self, arg0: u32) -> SyntheticAmode;
170     fn ushr_i8x16_mask_table(&mut self) -> SyntheticAmode;
171     fn sse_insertps_lane_imm(&mut self, arg0: u8) -> u8;
172     fn popcount_4bit_table(&mut self) -> VCodeConstant;
173     fn popcount_low_mask(&mut self) -> VCodeConstant;
174 }
175 
176 /// Internal type SideEffectNoResult: defined at src/prelude.isle line 457.
177 #[derive(Clone, Debug)]
178 pub enum SideEffectNoResult {
179     Inst { inst: MInst },
180     Inst2 { inst1: MInst, inst2: MInst },
181 }
182 
183 /// Internal type ProducesFlags: defined at src/prelude.isle line 484.
184 #[derive(Clone, Debug)]
185 pub enum ProducesFlags {
186     ProducesFlagsSideEffect { inst: MInst },
187     ProducesFlagsReturnsReg { inst: MInst, result: Reg },
188     ProducesFlagsReturnsResultWithConsumer { inst: MInst, result: Reg },
189 }
190 
191 /// Internal type ConsumesFlags: defined at src/prelude.isle line 495.
192 #[derive(Clone, Debug)]
193 pub enum ConsumesFlags {
194     ConsumesFlagsReturnsResultWithProducer {
195         inst: MInst,
196         result: Reg,
197     },
198     ConsumesFlagsReturnsReg {
199         inst: MInst,
200         result: Reg,
201     },
202     ConsumesFlagsTwiceReturnsValueRegs {
203         inst1: MInst,
204         inst2: MInst,
205         result: ValueRegs,
206     },
207     ConsumesFlagsFourTimesReturnsValueRegs {
208         inst1: MInst,
209         inst2: MInst,
210         inst3: MInst,
211         inst4: MInst,
212         result: ValueRegs,
213     },
214 }
215 
216 /// Internal type MInst: defined at src/isa/x64/inst.isle line 8.
217 #[derive(Clone)]
218 pub enum MInst {
219     Nop {
220         len: u8,
221     },
222     AluRmiR {
223         size: OperandSize,
224         op: AluRmiROpcode,
225         src1: Gpr,
226         src2: GprMemImm,
227         dst: WritableGpr,
228     },
229     AluRM {
230         size: OperandSize,
231         op: AluRmiROpcode,
232         src1_dst: SyntheticAmode,
233         src2: Gpr,
234     },
235     UnaryRmR {
236         size: OperandSize,
237         op: UnaryRmROpcode,
238         src: GprMem,
239         dst: WritableGpr,
240     },
241     Not {
242         size: OperandSize,
243         src: Gpr,
244         dst: WritableGpr,
245     },
246     Neg {
247         size: OperandSize,
248         src: Gpr,
249         dst: WritableGpr,
250     },
251     Div {
252         size: OperandSize,
253         signed: bool,
254         divisor: GprMem,
255         dividend_lo: Gpr,
256         dividend_hi: Gpr,
257         dst_quotient: WritableGpr,
258         dst_remainder: WritableGpr,
259     },
260     MulHi {
261         size: OperandSize,
262         signed: bool,
263         src1: Gpr,
264         src2: GprMem,
265         dst_lo: WritableGpr,
266         dst_hi: WritableGpr,
267     },
268     CheckedDivOrRemSeq {
269         kind: DivOrRemKind,
270         size: OperandSize,
271         dividend_lo: Gpr,
272         dividend_hi: Gpr,
273         divisor: WritableGpr,
274         dst_quotient: WritableGpr,
275         dst_remainder: WritableGpr,
276         tmp: OptionWritableGpr,
277     },
278     SignExtendData {
279         size: OperandSize,
280         src: Gpr,
281         dst: WritableGpr,
282     },
283     Imm {
284         dst_size: OperandSize,
285         simm64: u64,
286         dst: WritableGpr,
287     },
288     MovRR {
289         size: OperandSize,
290         src: Gpr,
291         dst: WritableGpr,
292     },
293     MovzxRmR {
294         ext_mode: ExtMode,
295         src: GprMem,
296         dst: WritableGpr,
297     },
298     Mov64MR {
299         src: SyntheticAmode,
300         dst: WritableGpr,
301     },
302     LoadEffectiveAddress {
303         addr: SyntheticAmode,
304         dst: WritableGpr,
305     },
306     MovsxRmR {
307         ext_mode: ExtMode,
308         src: GprMem,
309         dst: WritableGpr,
310     },
311     MovRM {
312         size: OperandSize,
313         src: Gpr,
314         dst: SyntheticAmode,
315     },
316     ShiftR {
317         size: OperandSize,
318         kind: ShiftKind,
319         src: Gpr,
320         num_bits: Imm8Gpr,
321         dst: WritableGpr,
322     },
323     XmmRmiReg {
324         opcode: SseOpcode,
325         src1: Xmm,
326         src2: XmmMemImm,
327         dst: WritableXmm,
328     },
329     CmpRmiR {
330         size: OperandSize,
331         opcode: CmpOpcode,
332         src: GprMemImm,
333         dst: Gpr,
334     },
335     Setcc {
336         cc: CC,
337         dst: WritableGpr,
338     },
339     Cmove {
340         size: OperandSize,
341         cc: CC,
342         consequent: GprMem,
343         alternative: Gpr,
344         dst: WritableGpr,
345     },
346     XmmCmove {
347         size: OperandSize,
348         cc: CC,
349         consequent: XmmMem,
350         alternative: Xmm,
351         dst: WritableXmm,
352     },
353     Push64 {
354         src: GprMemImm,
355     },
356     Pop64 {
357         dst: WritableGpr,
358     },
359     XmmRmR {
360         op: SseOpcode,
361         src1: Xmm,
362         src2: XmmMem,
363         dst: WritableXmm,
364     },
365     XmmRmREvex {
366         op: Avx512Opcode,
367         src1: XmmMem,
368         src2: Xmm,
369         dst: WritableXmm,
370     },
371     XmmUnaryRmR {
372         op: SseOpcode,
373         src: XmmMem,
374         dst: WritableXmm,
375     },
376     XmmUnaryRmREvex {
377         op: Avx512Opcode,
378         src: XmmMem,
379         dst: WritableXmm,
380     },
381     XmmMovRM {
382         op: SseOpcode,
383         src: Reg,
384         dst: SyntheticAmode,
385     },
386     XmmLoadConst {
387         src: VCodeConstant,
388         dst: WritableReg,
389         ty: Type,
390     },
391     XmmToGpr {
392         op: SseOpcode,
393         src: Xmm,
394         dst: WritableGpr,
395         dst_size: OperandSize,
396     },
397     GprToXmm {
398         op: SseOpcode,
399         src: GprMem,
400         dst: WritableXmm,
401         src_size: OperandSize,
402     },
403     CvtUint64ToFloatSeq {
404         dst_size: OperandSize,
405         src: WritableGpr,
406         dst: WritableXmm,
407         tmp_gpr1: WritableGpr,
408         tmp_gpr2: WritableGpr,
409     },
410     CvtFloatToSintSeq {
411         dst_size: OperandSize,
412         src_size: OperandSize,
413         is_saturating: bool,
414         src: WritableXmm,
415         dst: WritableGpr,
416         tmp_gpr: WritableGpr,
417         tmp_xmm: WritableXmm,
418     },
419     CvtFloatToUintSeq {
420         dst_size: OperandSize,
421         src_size: OperandSize,
422         is_saturating: bool,
423         src: WritableXmm,
424         dst: WritableGpr,
425         tmp_gpr: WritableGpr,
426         tmp_xmm: WritableXmm,
427     },
428     XmmMinMaxSeq {
429         size: OperandSize,
430         is_min: bool,
431         lhs: Xmm,
432         rhs: Xmm,
433         dst: WritableXmm,
434     },
435     XmmCmpRmR {
436         op: SseOpcode,
437         src: XmmMem,
438         dst: Xmm,
439     },
440     XmmRmRImm {
441         op: SseOpcode,
442         src1: Reg,
443         src2: RegMem,
444         dst: WritableReg,
445         imm: u8,
446         size: OperandSize,
447     },
448     CallKnown {
449         dest: ExternalName,
450         uses: VecReg,
451         defs: VecWritableReg,
452         opcode: Opcode,
453     },
454     CallUnknown {
455         dest: RegMem,
456         uses: VecReg,
457         defs: VecWritableReg,
458         opcode: Opcode,
459     },
460     Ret {
461         rets: VecReg,
462     },
463     EpiloguePlaceholder,
464     JmpKnown {
465         dst: MachLabel,
466     },
467     JmpIf {
468         cc: CC,
469         taken: MachLabel,
470     },
471     JmpCond {
472         cc: CC,
473         taken: MachLabel,
474         not_taken: MachLabel,
475     },
476     JmpTableSeq {
477         idx: Reg,
478         tmp1: WritableReg,
479         tmp2: WritableReg,
480         default_target: MachLabel,
481         targets: VecMachLabel,
482         targets_for_term: VecMachLabel,
483     },
484     JmpUnknown {
485         target: RegMem,
486     },
487     TrapIf {
488         cc: CC,
489         trap_code: TrapCode,
490     },
491     Hlt,
492     Ud2 {
493         trap_code: TrapCode,
494     },
495     LoadExtName {
496         dst: WritableReg,
497         name: BoxExternalName,
498         offset: i64,
499     },
500     LockCmpxchg {
501         ty: Type,
502         replacement: Reg,
503         expected: Reg,
504         mem: SyntheticAmode,
505         dst_old: WritableReg,
506     },
507     AtomicRmwSeq {
508         ty: Type,
509         op: AtomicRmwOp,
510         address: Reg,
511         operand: Reg,
512         temp: WritableReg,
513         dst_old: WritableReg,
514     },
515     Fence {
516         kind: FenceKind,
517     },
518     VirtualSPOffsetAdj {
519         offset: i64,
520     },
521     XmmUninitializedValue {
522         dst: WritableXmm,
523     },
524     ElfTlsGetAddr {
525         symbol: ExternalName,
526     },
527     MachOTlsGetAddr {
528         symbol: ExternalName,
529     },
530     Unwind {
531         inst: UnwindInst,
532     },
533     DummyUse {
534         reg: Reg,
535     },
536 }
537 
538 /// Internal type Amode: defined at src/isa/x64/inst.isle line 768.
539 #[derive(Clone, Debug)]
540 pub enum Amode {
541     ImmReg {
542         simm32: u32,
543         base: Reg,
544         flags: MemFlags,
545     },
546     ImmRegRegShift {
547         simm32: u32,
548         base: Gpr,
549         index: Gpr,
550         shift: u8,
551         flags: MemFlags,
552     },
553     RipRelative {
554         target: MachLabel,
555     },
556 }
557 
558 /// Internal type ExtendKind: defined at src/isa/x64/inst.isle line 1352.
559 #[derive(Copy, Clone, PartialEq, Eq, Debug)]
560 pub enum ExtendKind {
561     Sign,
562     Zero,
563 }
564 
565 // Generated as internal constructor for term output_reg.
566 pub fn constructor_output_reg<C: Context>(ctx: &mut C, arg0: Reg) -> Option<InstOutput> {
567     let pattern0_0 = arg0;
568     // Rule at src/prelude.isle line 113.
569     let expr0_0 = C::value_reg(ctx, pattern0_0);
570     let expr1_0 = C::output(ctx, expr0_0);
571     return Some(expr1_0);
572 }
573 
574 // Generated as internal constructor for term output_value.
575 pub fn constructor_output_value<C: Context>(ctx: &mut C, arg0: Value) -> Option<InstOutput> {
576     let pattern0_0 = arg0;
577     // Rule at src/prelude.isle line 117.
578     let expr0_0 = C::put_in_regs(ctx, pattern0_0);
579     let expr1_0 = C::output(ctx, expr0_0);
580     return Some(expr1_0);
581 }
582 
583 // Generated as internal constructor for term temp_reg.
584 pub fn constructor_temp_reg<C: Context>(ctx: &mut C, arg0: Type) -> Option<Reg> {
585     let pattern0_0 = arg0;
586     // Rule at src/prelude.isle line 137.
587     let expr0_0 = C::temp_writable_reg(ctx, pattern0_0);
588     let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0);
589     return Some(expr1_0);
590 }
591 
592 // Generated as internal constructor for term lo_reg.
593 pub fn constructor_lo_reg<C: Context>(ctx: &mut C, arg0: Value) -> Option<Reg> {
594     let pattern0_0 = arg0;
595     // Rule at src/prelude.isle line 182.
596     let expr0_0 = C::put_in_regs(ctx, pattern0_0);
597     let expr1_0: usize = 0;
598     let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0);
599     return Some(expr2_0);
600 }
601 
602 // Generated as internal constructor for term side_effect.
603 pub fn constructor_side_effect<C: Context>(
604     ctx: &mut C,
605     arg0: &SideEffectNoResult,
606 ) -> Option<InstOutput> {
607     let pattern0_0 = arg0;
608     match pattern0_0 {
609         &SideEffectNoResult::Inst {
610             inst: ref pattern1_0,
611         } => {
612             // Rule at src/prelude.isle line 465.
613             let expr0_0 = C::emit(ctx, pattern1_0);
614             let expr1_0 = C::output_none(ctx);
615             return Some(expr1_0);
616         }
617         &SideEffectNoResult::Inst2 {
618             inst1: ref pattern1_0,
619             inst2: ref pattern1_1,
620         } => {
621             // Rule at src/prelude.isle line 468.
622             let expr0_0 = C::emit(ctx, pattern1_0);
623             let expr1_0 = C::emit(ctx, pattern1_1);
624             let expr2_0 = C::output_none(ctx);
625             return Some(expr2_0);
626         }
627         _ => {}
628     }
629     return None;
630 }
631 
632 // Generated as internal constructor for term side_effect_concat.
633 pub fn constructor_side_effect_concat<C: Context>(
634     ctx: &mut C,
635     arg0: &SideEffectNoResult,
636     arg1: &SideEffectNoResult,
637 ) -> Option<SideEffectNoResult> {
638     let pattern0_0 = arg0;
639     if let &SideEffectNoResult::Inst {
640         inst: ref pattern1_0,
641     } = pattern0_0
642     {
643         let pattern2_0 = arg1;
644         if let &SideEffectNoResult::Inst {
645             inst: ref pattern3_0,
646         } = pattern2_0
647         {
648             // Rule at src/prelude.isle line 474.
649             let expr0_0 = SideEffectNoResult::Inst2 {
650                 inst1: pattern1_0.clone(),
651                 inst2: pattern3_0.clone(),
652             };
653             return Some(expr0_0);
654         }
655     }
656     return None;
657 }
658 
659 // Generated as internal constructor for term produces_flags_get_reg.
660 pub fn constructor_produces_flags_get_reg<C: Context>(
661     ctx: &mut C,
662     arg0: &ProducesFlags,
663 ) -> Option<Reg> {
664     let pattern0_0 = arg0;
665     if let &ProducesFlags::ProducesFlagsReturnsReg {
666         inst: ref pattern1_0,
667         result: pattern1_1,
668     } = pattern0_0
669     {
670         // Rule at src/prelude.isle line 511.
671         return Some(pattern1_1);
672     }
673     return None;
674 }
675 
676 // Generated as internal constructor for term produces_flags_ignore.
677 pub fn constructor_produces_flags_ignore<C: Context>(
678     ctx: &mut C,
679     arg0: &ProducesFlags,
680 ) -> Option<ProducesFlags> {
681     let pattern0_0 = arg0;
682     match pattern0_0 {
683         &ProducesFlags::ProducesFlagsReturnsReg {
684             inst: ref pattern1_0,
685             result: pattern1_1,
686         } => {
687             // Rule at src/prelude.isle line 516.
688             let expr0_0 = ProducesFlags::ProducesFlagsSideEffect {
689                 inst: pattern1_0.clone(),
690             };
691             return Some(expr0_0);
692         }
693         &ProducesFlags::ProducesFlagsReturnsResultWithConsumer {
694             inst: ref pattern1_0,
695             result: pattern1_1,
696         } => {
697             // Rule at src/prelude.isle line 518.
698             let expr0_0 = ProducesFlags::ProducesFlagsSideEffect {
699                 inst: pattern1_0.clone(),
700             };
701             return Some(expr0_0);
702         }
703         _ => {}
704     }
705     return None;
706 }
707 
708 // Generated as internal constructor for term consumes_flags_concat.
709 pub fn constructor_consumes_flags_concat<C: Context>(
710     ctx: &mut C,
711     arg0: &ConsumesFlags,
712     arg1: &ConsumesFlags,
713 ) -> Option<ConsumesFlags> {
714     let pattern0_0 = arg0;
715     if let &ConsumesFlags::ConsumesFlagsReturnsReg {
716         inst: ref pattern1_0,
717         result: pattern1_1,
718     } = pattern0_0
719     {
720         let pattern2_0 = arg1;
721         if let &ConsumesFlags::ConsumesFlagsReturnsReg {
722             inst: ref pattern3_0,
723             result: pattern3_1,
724         } = pattern2_0
725         {
726             // Rule at src/prelude.isle line 525.
727             let expr0_0 = C::value_regs(ctx, pattern1_1, pattern3_1);
728             let expr1_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs {
729                 inst1: pattern1_0.clone(),
730                 inst2: pattern3_0.clone(),
731                 result: expr0_0,
732             };
733             return Some(expr1_0);
734         }
735     }
736     return None;
737 }
738 
739 // Generated as internal constructor for term with_flags.
740 pub fn constructor_with_flags<C: Context>(
741     ctx: &mut C,
742     arg0: &ProducesFlags,
743     arg1: &ConsumesFlags,
744 ) -> Option<ValueRegs> {
745     let pattern0_0 = arg0;
746     match pattern0_0 {
747         &ProducesFlags::ProducesFlagsSideEffect {
748             inst: ref pattern1_0,
749         } => {
750             let pattern2_0 = arg1;
751             match pattern2_0 {
752                 &ConsumesFlags::ConsumesFlagsReturnsReg {
753                     inst: ref pattern3_0,
754                     result: pattern3_1,
755                 } => {
756                     // Rule at src/prelude.isle line 550.
757                     let expr0_0 = C::emit(ctx, pattern1_0);
758                     let expr1_0 = C::emit(ctx, pattern3_0);
759                     let expr2_0 = C::value_reg(ctx, pattern3_1);
760                     return Some(expr2_0);
761                 }
762                 &ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs {
763                     inst1: ref pattern3_0,
764                     inst2: ref pattern3_1,
765                     result: pattern3_2,
766                 } => {
767                     // Rule at src/prelude.isle line 556.
768                     let expr0_0 = C::emit(ctx, pattern1_0);
769                     let expr1_0 = C::emit(ctx, pattern3_0);
770                     let expr2_0 = C::emit(ctx, pattern3_1);
771                     return Some(pattern3_2);
772                 }
773                 &ConsumesFlags::ConsumesFlagsFourTimesReturnsValueRegs {
774                     inst1: ref pattern3_0,
775                     inst2: ref pattern3_1,
776                     inst3: ref pattern3_2,
777                     inst4: ref pattern3_3,
778                     result: pattern3_4,
779                 } => {
780                     // Rule at src/prelude.isle line 568.
781                     let expr0_0 = C::emit(ctx, pattern1_0);
782                     let expr1_0 = C::emit(ctx, pattern3_0);
783                     let expr2_0 = C::emit(ctx, pattern3_1);
784                     let expr3_0 = C::emit(ctx, pattern3_2);
785                     let expr4_0 = C::emit(ctx, pattern3_3);
786                     return Some(pattern3_4);
787                 }
788                 _ => {}
789             }
790         }
791         &ProducesFlags::ProducesFlagsReturnsResultWithConsumer {
792             inst: ref pattern1_0,
793             result: pattern1_1,
794         } => {
795             let pattern2_0 = arg1;
796             if let &ConsumesFlags::ConsumesFlagsReturnsResultWithProducer {
797                 inst: ref pattern3_0,
798                 result: pattern3_1,
799             } = pattern2_0
800             {
801                 // Rule at src/prelude.isle line 544.
802                 let expr0_0 = C::emit(ctx, pattern1_0);
803                 let expr1_0 = C::emit(ctx, pattern3_0);
804                 let expr2_0 = C::value_regs(ctx, pattern1_1, pattern3_1);
805                 return Some(expr2_0);
806             }
807         }
808         _ => {}
809     }
810     return None;
811 }
812 
813 // Generated as internal constructor for term with_flags_reg.
814 pub fn constructor_with_flags_reg<C: Context>(
815     ctx: &mut C,
816     arg0: &ProducesFlags,
817     arg1: &ConsumesFlags,
818 ) -> Option<Reg> {
819     let pattern0_0 = arg0;
820     let pattern1_0 = arg1;
821     // Rule at src/prelude.isle line 585.
822     let expr0_0 = constructor_with_flags(ctx, pattern0_0, pattern1_0)?;
823     let expr1_0: usize = 0;
824     let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0);
825     return Some(expr2_0);
826 }
827 
828 // Generated as internal constructor for term operand_size_bits.
829 pub fn constructor_operand_size_bits<C: Context>(ctx: &mut C, arg0: &OperandSize) -> Option<u16> {
830     let pattern0_0 = arg0;
831     match pattern0_0 {
832         &OperandSize::Size8 => {
833             // Rule at src/isa/x64/inst.isle line 515.
834             let expr0_0: u16 = 8;
835             return Some(expr0_0);
836         }
837         &OperandSize::Size16 => {
838             // Rule at src/isa/x64/inst.isle line 516.
839             let expr0_0: u16 = 16;
840             return Some(expr0_0);
841         }
842         &OperandSize::Size32 => {
843             // Rule at src/isa/x64/inst.isle line 517.
844             let expr0_0: u16 = 32;
845             return Some(expr0_0);
846         }
847         &OperandSize::Size64 => {
848             // Rule at src/isa/x64/inst.isle line 518.
849             let expr0_0: u16 = 64;
850             return Some(expr0_0);
851         }
852         _ => {}
853     }
854     return None;
855 }
856 
857 // Generated as internal constructor for term amode_imm_reg_flags.
858 pub fn constructor_amode_imm_reg_flags<C: Context>(
859     ctx: &mut C,
860     arg0: u32,
861     arg1: Gpr,
862     arg2: MemFlags,
863 ) -> Option<Amode> {
864     let pattern0_0 = arg0;
865     let pattern1_0 = arg1;
866     let pattern2_0 = arg2;
867     // Rule at src/isa/x64/inst.isle line 796.
868     let expr0_0 = C::amode_imm_reg(ctx, pattern0_0, pattern1_0);
869     let expr1_0 = C::amode_with_flags(ctx, &expr0_0, pattern2_0);
870     return Some(expr1_0);
871 }
872 
873 // Generated as internal constructor for term amode_imm_reg_reg_shift_flags.
874 pub fn constructor_amode_imm_reg_reg_shift_flags<C: Context>(
875     ctx: &mut C,
876     arg0: u32,
877     arg1: Gpr,
878     arg2: Gpr,
879     arg3: u8,
880     arg4: MemFlags,
881 ) -> Option<Amode> {
882     let pattern0_0 = arg0;
883     let pattern1_0 = arg1;
884     let pattern2_0 = arg2;
885     let pattern3_0 = arg3;
886     let pattern4_0 = arg4;
887     // Rule at src/isa/x64/inst.isle line 803.
888     let expr0_0 = C::amode_imm_reg_reg_shift(ctx, pattern0_0, pattern1_0, pattern2_0, pattern3_0);
889     let expr1_0 = C::amode_with_flags(ctx, &expr0_0, pattern4_0);
890     return Some(expr1_0);
891 }
892 
893 // Generated as internal constructor for term to_amode.
894 pub fn constructor_to_amode<C: Context>(
895     ctx: &mut C,
896     arg0: MemFlags,
897     arg1: Value,
898     arg2: Offset32,
899 ) -> Option<Amode> {
900     let pattern0_0 = arg0;
901     let pattern1_0 = arg1;
902     let pattern2_0 = arg2;
903     // Rule at src/isa/x64/inst.isle line 983.
904     let expr0_0 = constructor_amode_initial(ctx, pattern0_0, pattern2_0)?;
905     let expr1_0 = constructor_amode_add(ctx, &expr0_0, pattern1_0)?;
906     return Some(expr1_0);
907 }
908 
909 // Generated as internal constructor for term amode_initial.
910 pub fn constructor_amode_initial<C: Context>(
911     ctx: &mut C,
912     arg0: MemFlags,
913     arg1: Offset32,
914 ) -> Option<Amode> {
915     let pattern0_0 = arg0;
916     let pattern1_0 = arg1;
917     if let Some(pattern2_0) = C::offset32(ctx, pattern1_0) {
918         // Rule at src/isa/x64/inst.isle line 873.
919         let expr0_0 = C::invalid_reg(ctx);
920         let expr1_0 = Amode::ImmReg {
921             simm32: pattern2_0,
922             base: expr0_0,
923             flags: pattern0_0,
924         };
925         return Some(expr1_0);
926     }
927     return None;
928 }
929 
930 // Generated as internal constructor for term amode_add.
931 pub fn constructor_amode_add<C: Context>(ctx: &mut C, arg0: &Amode, arg1: Value) -> Option<Amode> {
932     let pattern0_0 = arg0;
933     match pattern0_0 {
934         &Amode::ImmReg {
935             simm32: pattern1_0,
936             base: pattern1_1,
937             flags: pattern1_2,
938         } => {
939             let pattern2_0 = arg1;
940             if let Some(pattern3_0) = C::def_inst(ctx, pattern2_0) {
941                 let pattern4_0 = C::inst_data(ctx, pattern3_0);
942                 match &pattern4_0 {
943                     &InstructionData::UnaryImm {
944                         opcode: ref pattern5_0,
945                         imm: pattern5_1,
946                     } => {
947                         if let &Opcode::Iconst = pattern5_0 {
948                             if let Some(pattern7_0) = C::simm32(ctx, pattern5_1) {
949                                 let mut closure8 = || {
950                                     let expr0_0 = C::s32_add_fallible(ctx, pattern1_0, pattern7_0)?;
951                                     return Some(expr0_0);
952                                 };
953                                 if let Some(pattern8_0) = closure8() {
954                                     // Rule at src/isa/x64/inst.isle line 941.
955                                     let expr0_0 = Amode::ImmReg {
956                                         simm32: pattern8_0,
957                                         base: pattern1_1,
958                                         flags: pattern1_2,
959                                     };
960                                     return Some(expr0_0);
961                                 }
962                             }
963                         }
964                     }
965                     &InstructionData::Unary {
966                         opcode: ref pattern5_0,
967                         arg: pattern5_1,
968                     } => {
969                         match pattern5_0 {
970                             &Opcode::Uextend => {
971                                 if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) {
972                                     let pattern8_0 = C::inst_data(ctx, pattern7_0);
973                                     if let &InstructionData::UnaryImm {
974                                         opcode: ref pattern9_0,
975                                         imm: pattern9_1,
976                                     } = &pattern8_0
977                                     {
978                                         if let &Opcode::Iconst = pattern9_0 {
979                                             if let Some(pattern11_0) = C::simm32(ctx, pattern9_1) {
980                                                 if let Some(pattern12_0) =
981                                                     C::u32_nonnegative(ctx, pattern11_0)
982                                                 {
983                                                     let mut closure13 = || {
984                                                         let expr0_0 = C::s32_add_fallible(
985                                                             ctx,
986                                                             pattern1_0,
987                                                             pattern12_0,
988                                                         )?;
989                                                         return Some(expr0_0);
990                                                     };
991                                                     if let Some(pattern13_0) = closure13() {
992                                                         // Rule at src/isa/x64/inst.isle line 954.
993                                                         let expr0_0 = Amode::ImmReg {
994                                                             simm32: pattern13_0,
995                                                             base: pattern1_1,
996                                                             flags: pattern1_2,
997                                                         };
998                                                         return Some(expr0_0);
999                                                     }
1000                                                 }
1001                                             }
1002                                         }
1003                                     }
1004                                 }
1005                             }
1006                             &Opcode::Sextend => {
1007                                 if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) {
1008                                     let pattern8_0 = C::inst_data(ctx, pattern7_0);
1009                                     if let &InstructionData::UnaryImm {
1010                                         opcode: ref pattern9_0,
1011                                         imm: pattern9_1,
1012                                     } = &pattern8_0
1013                                     {
1014                                         if let &Opcode::Iconst = pattern9_0 {
1015                                             if let Some(pattern11_0) = C::simm32(ctx, pattern9_1) {
1016                                                 let mut closure12 = || {
1017                                                     let expr0_0 = C::s32_add_fallible(
1018                                                         ctx,
1019                                                         pattern1_0,
1020                                                         pattern11_0,
1021                                                     )?;
1022                                                     return Some(expr0_0);
1023                                                 };
1024                                                 if let Some(pattern12_0) = closure12() {
1025                                                     // Rule at src/isa/x64/inst.isle line 964.
1026                                                     let expr0_0 = Amode::ImmReg {
1027                                                         simm32: pattern12_0,
1028                                                         base: pattern1_1,
1029                                                         flags: pattern1_2,
1030                                                     };
1031                                                     return Some(expr0_0);
1032                                                 }
1033                                             }
1034                                         }
1035                                     }
1036                                 }
1037                             }
1038                             _ => {}
1039                         }
1040                     }
1041                     _ => {}
1042                 }
1043             }
1044         }
1045         &Amode::ImmRegRegShift {
1046             simm32: pattern1_0,
1047             base: pattern1_1,
1048             index: pattern1_2,
1049             shift: pattern1_3,
1050             flags: pattern1_4,
1051         } => {
1052             let pattern2_0 = arg1;
1053             if let Some(pattern3_0) = C::def_inst(ctx, pattern2_0) {
1054                 let pattern4_0 = C::inst_data(ctx, pattern3_0);
1055                 match &pattern4_0 {
1056                     &InstructionData::UnaryImm {
1057                         opcode: ref pattern5_0,
1058                         imm: pattern5_1,
1059                     } => {
1060                         if let &Opcode::Iconst = pattern5_0 {
1061                             if let Some(pattern7_0) = C::simm32(ctx, pattern5_1) {
1062                                 let mut closure8 = || {
1063                                     let expr0_0 = C::s32_add_fallible(ctx, pattern1_0, pattern7_0)?;
1064                                     return Some(expr0_0);
1065                                 };
1066                                 if let Some(pattern8_0) = closure8() {
1067                                     // Rule at src/isa/x64/inst.isle line 945.
1068                                     let expr0_0 = Amode::ImmRegRegShift {
1069                                         simm32: pattern8_0,
1070                                         base: pattern1_1,
1071                                         index: pattern1_2,
1072                                         shift: pattern1_3,
1073                                         flags: pattern1_4,
1074                                     };
1075                                     return Some(expr0_0);
1076                                 }
1077                             }
1078                         }
1079                     }
1080                     &InstructionData::Unary {
1081                         opcode: ref pattern5_0,
1082                         arg: pattern5_1,
1083                     } => {
1084                         match pattern5_0 {
1085                             &Opcode::Uextend => {
1086                                 if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) {
1087                                     let pattern8_0 = C::inst_data(ctx, pattern7_0);
1088                                     if let &InstructionData::UnaryImm {
1089                                         opcode: ref pattern9_0,
1090                                         imm: pattern9_1,
1091                                     } = &pattern8_0
1092                                     {
1093                                         if let &Opcode::Iconst = pattern9_0 {
1094                                             if let Some(pattern11_0) = C::simm32(ctx, pattern9_1) {
1095                                                 if let Some(pattern12_0) =
1096                                                     C::u32_nonnegative(ctx, pattern11_0)
1097                                                 {
1098                                                     let mut closure13 = || {
1099                                                         let expr0_0 = C::s32_add_fallible(
1100                                                             ctx,
1101                                                             pattern1_0,
1102                                                             pattern12_0,
1103                                                         )?;
1104                                                         return Some(expr0_0);
1105                                                     };
1106                                                     if let Some(pattern13_0) = closure13() {
1107                                                         // Rule at src/isa/x64/inst.isle line 958.
1108                                                         let expr0_0 = Amode::ImmRegRegShift {
1109                                                             simm32: pattern13_0,
1110                                                             base: pattern1_1,
1111                                                             index: pattern1_2,
1112                                                             shift: pattern1_3,
1113                                                             flags: pattern1_4,
1114                                                         };
1115                                                         return Some(expr0_0);
1116                                                     }
1117                                                 }
1118                                             }
1119                                         }
1120                                     }
1121                                 }
1122                             }
1123                             &Opcode::Sextend => {
1124                                 if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) {
1125                                     let pattern8_0 = C::inst_data(ctx, pattern7_0);
1126                                     if let &InstructionData::UnaryImm {
1127                                         opcode: ref pattern9_0,
1128                                         imm: pattern9_1,
1129                                     } = &pattern8_0
1130                                     {
1131                                         if let &Opcode::Iconst = pattern9_0 {
1132                                             if let Some(pattern11_0) = C::simm32(ctx, pattern9_1) {
1133                                                 let mut closure12 = || {
1134                                                     let expr0_0 = C::s32_add_fallible(
1135                                                         ctx,
1136                                                         pattern1_0,
1137                                                         pattern11_0,
1138                                                     )?;
1139                                                     return Some(expr0_0);
1140                                                 };
1141                                                 if let Some(pattern12_0) = closure12() {
1142                                                     // Rule at src/isa/x64/inst.isle line 968.
1143                                                     let expr0_0 = Amode::ImmRegRegShift {
1144                                                         simm32: pattern12_0,
1145                                                         base: pattern1_1,
1146                                                         index: pattern1_2,
1147                                                         shift: pattern1_3,
1148                                                         flags: pattern1_4,
1149                                                     };
1150                                                     return Some(expr0_0);
1151                                                 }
1152                                             }
1153                                         }
1154                                     }
1155                                 }
1156                             }
1157                             _ => {}
1158                         }
1159                     }
1160                     _ => {}
1161                 }
1162             }
1163         }
1164         _ => {}
1165     }
1166     let pattern0_0 = arg0;
1167     if let &Amode::ImmReg {
1168         simm32: pattern1_0,
1169         base: pattern1_1,
1170         flags: pattern1_2,
1171     } = pattern0_0
1172     {
1173         let pattern2_0 = arg1;
1174         if let Some(pattern3_0) = C::def_inst(ctx, pattern2_0) {
1175             let pattern4_0 = C::inst_data(ctx, pattern3_0);
1176             match &pattern4_0 {
1177                 &InstructionData::Binary {
1178                     opcode: ref pattern5_0,
1179                     args: ref pattern5_1,
1180                 } => {
1181                     if let &Opcode::Ishl = pattern5_0 {
1182                         let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
1183                         if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) {
1184                             let pattern9_0 = C::inst_data(ctx, pattern8_0);
1185                             if let &InstructionData::UnaryImm {
1186                                 opcode: ref pattern10_0,
1187                                 imm: pattern10_1,
1188                             } = &pattern9_0
1189                             {
1190                                 if let &Opcode::Iconst = pattern10_0 {
1191                                     if let Some(pattern12_0) = C::uimm8(ctx, pattern10_1) {
1192                                         let mut closure13 = || {
1193                                             return Some(pattern1_1);
1194                                         };
1195                                         if let Some(pattern13_0) = closure13() {
1196                                             if let Some(()) = C::valid_reg(ctx, pattern13_0) {
1197                                                 let mut closure15 = || {
1198                                                     let expr0_0 = C::u8_as_u32(ctx, pattern12_0)?;
1199                                                     let expr1_0: u32 = 3;
1200                                                     let expr2_0 =
1201                                                         C::u32_lteq(ctx, expr0_0, expr1_0)?;
1202                                                     return Some(expr2_0);
1203                                                 };
1204                                                 if let Some(pattern15_0) = closure15() {
1205                                                     // Rule at src/isa/x64/inst.isle line 912.
1206                                                     let expr0_0 = C::gpr_new(ctx, pattern1_1);
1207                                                     let expr1_0 =
1208                                                         constructor_put_in_gpr(ctx, pattern7_0)?;
1209                                                     let expr2_0 = Amode::ImmRegRegShift {
1210                                                         simm32: pattern1_0,
1211                                                         base: expr0_0,
1212                                                         index: expr1_0,
1213                                                         shift: pattern12_0,
1214                                                         flags: pattern1_2,
1215                                                     };
1216                                                     return Some(expr2_0);
1217                                                 }
1218                                             }
1219                                         }
1220                                     }
1221                                 }
1222                             }
1223                         }
1224                     }
1225                 }
1226                 &InstructionData::Unary {
1227                     opcode: ref pattern5_0,
1228                     arg: pattern5_1,
1229                 } => {
1230                     if let &Opcode::Uextend = pattern5_0 {
1231                         if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) {
1232                             let pattern8_0 = C::inst_data(ctx, pattern7_0);
1233                             if let &InstructionData::Binary {
1234                                 opcode: ref pattern9_0,
1235                                 args: ref pattern9_1,
1236                             } = &pattern8_0
1237                             {
1238                                 if let &Opcode::Ishl = pattern9_0 {
1239                                     let (pattern11_0, pattern11_1) =
1240                                         C::unpack_value_array_2(ctx, pattern9_1);
1241                                     if let Some(pattern12_0) = C::def_inst(ctx, pattern11_0) {
1242                                         let pattern13_0 = C::inst_data(ctx, pattern12_0);
1243                                         if let &InstructionData::Binary {
1244                                             opcode: ref pattern14_0,
1245                                             args: ref pattern14_1,
1246                                         } = &pattern13_0
1247                                         {
1248                                             if let &Opcode::Iadd = pattern14_0 {
1249                                                 let (pattern16_0, pattern16_1) =
1250                                                     C::unpack_value_array_2(ctx, pattern14_1);
1251                                                 if let Some(pattern17_0) =
1252                                                     C::def_inst(ctx, pattern11_1)
1253                                                 {
1254                                                     let pattern18_0 =
1255                                                         C::inst_data(ctx, pattern17_0);
1256                                                     if let &InstructionData::UnaryImm {
1257                                                         opcode: ref pattern19_0,
1258                                                         imm: pattern19_1,
1259                                                     } = &pattern18_0
1260                                                     {
1261                                                         if let &Opcode::Iconst = pattern19_0 {
1262                                                             if let Some(pattern21_0) =
1263                                                                 C::uimm8(ctx, pattern19_1)
1264                                                             {
1265                                                                 let mut closure22 = || {
1266                                                                     return Some(pattern1_1);
1267                                                                 };
1268                                                                 if let Some(pattern22_0) =
1269                                                                     closure22()
1270                                                                 {
1271                                                                     if let Some(()) = C::valid_reg(
1272                                                                         ctx,
1273                                                                         pattern22_0,
1274                                                                     ) {
1275                                                                         let mut closure24 = || {
1276                                                                             let expr0_0 =
1277                                                                                 C::u8_as_u32(
1278                                                                                     ctx,
1279                                                                                     pattern21_0,
1280                                                                                 )?;
1281                                                                             let expr1_0: u32 = 3;
1282                                                                             let expr2_0 =
1283                                                                                 C::u32_lteq(
1284                                                                                     ctx, expr0_0,
1285                                                                                     expr1_0,
1286                                                                                 )?;
1287                                                                             return Some(expr2_0);
1288                                                                         };
1289                                                                         if let Some(pattern24_0) =
1290                                                                             closure24()
1291                                                                         {
1292                                                                             // Rule at src/isa/x64/inst.isle line 927.
1293                                                                             let expr0_0 =
1294                                                                                 C::gpr_new(
1295                                                                                     ctx, pattern1_1,
1296                                                                                 );
1297                                                                             let expr1_0 = constructor_put_in_gpr(ctx, pattern11_0)?;
1298                                                                             let expr2_0 = Amode::ImmRegRegShift {
1299                                                                                 simm32: pattern1_0,
1300                                                                                 base: expr0_0,
1301                                                                                 index: expr1_0,
1302                                                                                 shift: pattern21_0,
1303                                                                                 flags: pattern1_2,
1304                                                                             };
1305                                                                             return Some(expr2_0);
1306                                                                         }
1307                                                                     }
1308                                                                 }
1309                                                             }
1310                                                         }
1311                                                     }
1312                                                 }
1313                                             }
1314                                         }
1315                                     }
1316                                     if let Some(pattern12_0) = C::def_inst(ctx, pattern11_1) {
1317                                         let pattern13_0 = C::inst_data(ctx, pattern12_0);
1318                                         if let &InstructionData::UnaryImm {
1319                                             opcode: ref pattern14_0,
1320                                             imm: pattern14_1,
1321                                         } = &pattern13_0
1322                                         {
1323                                             if let &Opcode::Iconst = pattern14_0 {
1324                                                 if let Some(pattern16_0) =
1325                                                     C::uimm8(ctx, pattern14_1)
1326                                                 {
1327                                                     let mut closure17 = || {
1328                                                         return Some(pattern1_1);
1329                                                     };
1330                                                     if let Some(pattern17_0) = closure17() {
1331                                                         if let Some(()) =
1332                                                             C::valid_reg(ctx, pattern17_0)
1333                                                         {
1334                                                             let mut closure19 = || {
1335                                                                 let expr0_0 =
1336                                                                     C::u8_as_u32(ctx, pattern16_0)?;
1337                                                                 let expr1_0: u32 = 3;
1338                                                                 let expr2_0 = C::u32_lteq(
1339                                                                     ctx, expr0_0, expr1_0,
1340                                                                 )?;
1341                                                                 return Some(expr2_0);
1342                                                             };
1343                                                             if let Some(pattern19_0) = closure19() {
1344                                                                 // Rule at src/isa/x64/inst.isle line 916.
1345                                                                 let expr0_0 =
1346                                                                     C::gpr_new(ctx, pattern1_1);
1347                                                                 let expr1_0: Type = I64;
1348                                                                 let expr2_0 = ExtendKind::Zero;
1349                                                                 let expr3_0 =
1350                                                                     constructor_extend_to_gpr(
1351                                                                         ctx,
1352                                                                         pattern11_0,
1353                                                                         expr1_0,
1354                                                                         &expr2_0,
1355                                                                     )?;
1356                                                                 let expr4_0 =
1357                                                                     Amode::ImmRegRegShift {
1358                                                                         simm32: pattern1_0,
1359                                                                         base: expr0_0,
1360                                                                         index: expr3_0,
1361                                                                         shift: pattern16_0,
1362                                                                         flags: pattern1_2,
1363                                                                     };
1364                                                                 return Some(expr4_0);
1365                                                             }
1366                                                         }
1367                                                     }
1368                                                 }
1369                                             }
1370                                         }
1371                                     }
1372                                 }
1373                             }
1374                         }
1375                     }
1376                 }
1377                 _ => {}
1378             }
1379         }
1380     }
1381     let pattern1_0 = arg1;
1382     if let Some(pattern2_0) = C::def_inst(ctx, pattern1_0) {
1383         let pattern3_0 = C::inst_data(ctx, pattern2_0);
1384         if let &InstructionData::Binary {
1385             opcode: ref pattern4_0,
1386             args: ref pattern4_1,
1387         } = &pattern3_0
1388         {
1389             if let &Opcode::Iadd = pattern4_0 {
1390                 let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1);
1391                 // Rule at src/isa/x64/inst.isle line 887.
1392                 let expr0_0 = constructor_amode_add(ctx, pattern0_0, pattern6_0)?;
1393                 let expr1_0 = constructor_amode_add(ctx, &expr0_0, pattern6_1)?;
1394                 return Some(expr1_0);
1395             }
1396         }
1397     }
1398     let pattern0_0 = arg0;
1399     match pattern0_0 {
1400         &Amode::ImmReg {
1401             simm32: pattern1_0,
1402             base: pattern1_1,
1403             flags: pattern1_2,
1404         } => {
1405             if let Some(()) = C::invalid_reg_etor(ctx, pattern1_1) {
1406                 let pattern3_0 = arg1;
1407                 // Rule at src/isa/x64/inst.isle line 896.
1408                 let expr0_0 = C::put_in_reg(ctx, pattern3_0);
1409                 let expr1_0 = Amode::ImmReg {
1410                     simm32: pattern1_0,
1411                     base: expr0_0,
1412                     flags: pattern1_2,
1413                 };
1414                 return Some(expr1_0);
1415             }
1416             let pattern2_0 = arg1;
1417             let mut closure3 = || {
1418                 return Some(pattern1_1);
1419             };
1420             if let Some(pattern3_0) = closure3() {
1421                 if let Some(()) = C::valid_reg(ctx, pattern3_0) {
1422                     // Rule at src/isa/x64/inst.isle line 902.
1423                     let expr0_0 = C::gpr_new(ctx, pattern1_1);
1424                     let expr1_0 = constructor_put_in_gpr(ctx, pattern2_0)?;
1425                     let expr2_0: u8 = 0;
1426                     let expr3_0 = Amode::ImmRegRegShift {
1427                         simm32: pattern1_0,
1428                         base: expr0_0,
1429                         index: expr1_0,
1430                         shift: expr2_0,
1431                         flags: pattern1_2,
1432                     };
1433                     return Some(expr3_0);
1434                 }
1435             }
1436         }
1437         &Amode::ImmRegRegShift {
1438             simm32: pattern1_0,
1439             base: pattern1_1,
1440             index: pattern1_2,
1441             shift: pattern1_3,
1442             flags: pattern1_4,
1443         } => {
1444             let pattern2_0 = arg1;
1445             // Rule at src/isa/x64/inst.isle line 978.
1446             let expr0_0: Type = I64;
1447             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern2_0)?;
1448             let expr2_0 = constructor_x64_add(ctx, expr0_0, pattern1_1, &expr1_0)?;
1449             let expr3_0 = Amode::ImmRegRegShift {
1450                 simm32: pattern1_0,
1451                 base: expr2_0,
1452                 index: pattern1_2,
1453                 shift: pattern1_3,
1454                 flags: pattern1_4,
1455             };
1456             return Some(expr3_0);
1457         }
1458         _ => {}
1459     }
1460     return None;
1461 }
1462 
1463 // Generated as internal constructor for term reg_to_gpr_mem_imm.
1464 pub fn constructor_reg_to_gpr_mem_imm<C: Context>(ctx: &mut C, arg0: Reg) -> Option<GprMemImm> {
1465     let pattern0_0 = arg0;
1466     // Rule at src/isa/x64/inst.isle line 1182.
1467     let expr0_0 = C::gpr_new(ctx, pattern0_0);
1468     let expr1_0 = C::gpr_to_gpr_mem_imm(ctx, expr0_0);
1469     return Some(expr1_0);
1470 }
1471 
1472 // Generated as internal constructor for term put_in_gpr.
1473 pub fn constructor_put_in_gpr<C: Context>(ctx: &mut C, arg0: Value) -> Option<Gpr> {
1474     let pattern0_0 = arg0;
1475     // Rule at src/isa/x64/inst.isle line 1189.
1476     let expr0_0 = C::put_in_reg(ctx, pattern0_0);
1477     let expr1_0 = C::gpr_new(ctx, expr0_0);
1478     return Some(expr1_0);
1479 }
1480 
1481 // Generated as internal constructor for term put_in_gpr_mem.
1482 pub fn constructor_put_in_gpr_mem<C: Context>(ctx: &mut C, arg0: Value) -> Option<GprMem> {
1483     let pattern0_0 = arg0;
1484     // Rule at src/isa/x64/inst.isle line 1196.
1485     let expr0_0 = C::put_in_reg_mem(ctx, pattern0_0);
1486     let expr1_0 = C::reg_mem_to_gpr_mem(ctx, &expr0_0);
1487     return Some(expr1_0);
1488 }
1489 
1490 // Generated as internal constructor for term put_in_gpr_mem_imm.
1491 pub fn constructor_put_in_gpr_mem_imm<C: Context>(ctx: &mut C, arg0: Value) -> Option<GprMemImm> {
1492     let pattern0_0 = arg0;
1493     // Rule at src/isa/x64/inst.isle line 1203.
1494     let expr0_0 = C::put_in_reg_mem_imm(ctx, pattern0_0);
1495     let expr1_0 = C::gpr_mem_imm_new(ctx, &expr0_0);
1496     return Some(expr1_0);
1497 }
1498 
1499 // Generated as internal constructor for term put_in_xmm.
1500 pub fn constructor_put_in_xmm<C: Context>(ctx: &mut C, arg0: Value) -> Option<Xmm> {
1501     let pattern0_0 = arg0;
1502     // Rule at src/isa/x64/inst.isle line 1210.
1503     let expr0_0 = C::put_in_reg(ctx, pattern0_0);
1504     let expr1_0 = C::xmm_new(ctx, expr0_0);
1505     return Some(expr1_0);
1506 }
1507 
1508 // Generated as internal constructor for term put_in_xmm_mem.
1509 pub fn constructor_put_in_xmm_mem<C: Context>(ctx: &mut C, arg0: Value) -> Option<XmmMem> {
1510     let pattern0_0 = arg0;
1511     // Rule at src/isa/x64/inst.isle line 1217.
1512     let expr0_0 = C::put_in_reg_mem(ctx, pattern0_0);
1513     let expr1_0 = C::reg_mem_to_xmm_mem(ctx, &expr0_0);
1514     return Some(expr1_0);
1515 }
1516 
1517 // Generated as internal constructor for term put_in_xmm_mem_imm.
1518 pub fn constructor_put_in_xmm_mem_imm<C: Context>(ctx: &mut C, arg0: Value) -> Option<XmmMemImm> {
1519     let pattern0_0 = arg0;
1520     // Rule at src/isa/x64/inst.isle line 1224.
1521     let expr0_0 = C::put_in_reg_mem_imm(ctx, pattern0_0);
1522     let expr1_0 = C::xmm_mem_imm_new(ctx, &expr0_0);
1523     return Some(expr1_0);
1524 }
1525 
1526 // Generated as internal constructor for term output_gpr.
1527 pub fn constructor_output_gpr<C: Context>(ctx: &mut C, arg0: Gpr) -> Option<InstOutput> {
1528     let pattern0_0 = arg0;
1529     // Rule at src/isa/x64/inst.isle line 1229.
1530     let expr0_0 = C::gpr_to_reg(ctx, pattern0_0);
1531     let expr1_0 = constructor_output_reg(ctx, expr0_0)?;
1532     return Some(expr1_0);
1533 }
1534 
1535 // Generated as internal constructor for term value_gprs.
1536 pub fn constructor_value_gprs<C: Context>(ctx: &mut C, arg0: Gpr, arg1: Gpr) -> Option<ValueRegs> {
1537     let pattern0_0 = arg0;
1538     let pattern1_0 = arg1;
1539     // Rule at src/isa/x64/inst.isle line 1234.
1540     let expr0_0 = C::gpr_to_reg(ctx, pattern0_0);
1541     let expr1_0 = C::gpr_to_reg(ctx, pattern1_0);
1542     let expr2_0 = C::value_regs(ctx, expr0_0, expr1_0);
1543     return Some(expr2_0);
1544 }
1545 
1546 // Generated as internal constructor for term output_xmm.
1547 pub fn constructor_output_xmm<C: Context>(ctx: &mut C, arg0: Xmm) -> Option<InstOutput> {
1548     let pattern0_0 = arg0;
1549     // Rule at src/isa/x64/inst.isle line 1239.
1550     let expr0_0 = C::xmm_to_reg(ctx, pattern0_0);
1551     let expr1_0 = constructor_output_reg(ctx, expr0_0)?;
1552     return Some(expr1_0);
1553 }
1554 
1555 // Generated as internal constructor for term value_regs_get_gpr.
1556 pub fn constructor_value_regs_get_gpr<C: Context>(
1557     ctx: &mut C,
1558     arg0: ValueRegs,
1559     arg1: usize,
1560 ) -> Option<Gpr> {
1561     let pattern0_0 = arg0;
1562     let pattern1_0 = arg1;
1563     // Rule at src/isa/x64/inst.isle line 1246.
1564     let expr0_0 = C::value_regs_get(ctx, pattern0_0, pattern1_0);
1565     let expr1_0 = C::gpr_new(ctx, expr0_0);
1566     return Some(expr1_0);
1567 }
1568 
1569 // Generated as internal constructor for term lo_gpr.
1570 pub fn constructor_lo_gpr<C: Context>(ctx: &mut C, arg0: Value) -> Option<Gpr> {
1571     let pattern0_0 = arg0;
1572     // Rule at src/isa/x64/inst.isle line 1259.
1573     let expr0_0 = constructor_lo_reg(ctx, pattern0_0)?;
1574     let expr1_0 = C::gpr_new(ctx, expr0_0);
1575     return Some(expr1_0);
1576 }
1577 
1578 // Generated as internal constructor for term sink_load_to_gpr_mem_imm.
1579 pub fn constructor_sink_load_to_gpr_mem_imm<C: Context>(
1580     ctx: &mut C,
1581     arg0: &SinkableLoad,
1582 ) -> Option<GprMemImm> {
1583     let pattern0_0 = arg0;
1584     // Rule at src/isa/x64/inst.isle line 1342.
1585     let expr0_0 = C::sink_load(ctx, pattern0_0);
1586     let expr1_0 = C::gpr_mem_imm_new(ctx, &expr0_0);
1587     return Some(expr1_0);
1588 }
1589 
1590 // Generated as internal constructor for term extend_to_gpr.
1591 pub fn constructor_extend_to_gpr<C: Context>(
1592     ctx: &mut C,
1593     arg0: Value,
1594     arg1: Type,
1595     arg2: &ExtendKind,
1596 ) -> Option<Gpr> {
1597     let pattern0_0 = arg0;
1598     let pattern1_0 = C::value_type(ctx, pattern0_0);
1599     let pattern2_0 = arg1;
1600     if pattern2_0 == pattern1_0 {
1601         let pattern4_0 = arg2;
1602         // Rule at src/isa/x64/inst.isle line 1364.
1603         let expr0_0 = constructor_put_in_gpr(ctx, pattern0_0)?;
1604         return Some(expr0_0);
1605     }
1606     let pattern3_0 = arg2;
1607     // Rule at src/isa/x64/inst.isle line 1367.
1608     let expr0_0 = C::ty_bits_u16(ctx, pattern1_0);
1609     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern2_0);
1610     let expr2_0 = constructor_operand_size_bits(ctx, &expr1_0)?;
1611     let expr3_0 = C::ext_mode(ctx, expr0_0, expr2_0);
1612     let expr4_0 = constructor_put_in_gpr_mem(ctx, pattern0_0)?;
1613     let expr5_0 = constructor_extend(ctx, pattern3_0, pattern2_0, &expr3_0, &expr4_0)?;
1614     return Some(expr5_0);
1615 }
1616 
1617 // Generated as internal constructor for term extend.
1618 pub fn constructor_extend<C: Context>(
1619     ctx: &mut C,
1620     arg0: &ExtendKind,
1621     arg1: Type,
1622     arg2: &ExtMode,
1623     arg3: &GprMem,
1624 ) -> Option<Gpr> {
1625     let pattern0_0 = arg0;
1626     match pattern0_0 {
1627         &ExtendKind::Sign => {
1628             let pattern2_0 = arg1;
1629             let pattern3_0 = arg2;
1630             let pattern4_0 = arg3;
1631             // Rule at src/isa/x64/inst.isle line 1387.
1632             let expr0_0 = constructor_x64_movsx(ctx, pattern3_0, pattern4_0)?;
1633             return Some(expr0_0);
1634         }
1635         &ExtendKind::Zero => {
1636             let pattern2_0 = arg1;
1637             let pattern3_0 = arg2;
1638             let pattern4_0 = arg3;
1639             // Rule at src/isa/x64/inst.isle line 1383.
1640             let expr0_0 = constructor_x64_movzx(ctx, pattern3_0, pattern4_0)?;
1641             return Some(expr0_0);
1642         }
1643         _ => {}
1644     }
1645     return None;
1646 }
1647 
1648 // Generated as internal constructor for term sse_xor_op.
1649 pub fn constructor_sse_xor_op<C: Context>(ctx: &mut C, arg0: Type) -> Option<SseOpcode> {
1650     let pattern0_0 = arg0;
1651     if pattern0_0 == F32X4 {
1652         // Rule at src/isa/x64/inst.isle line 1394.
1653         let expr0_0 = SseOpcode::Xorps;
1654         return Some(expr0_0);
1655     }
1656     if pattern0_0 == F64X2 {
1657         // Rule at src/isa/x64/inst.isle line 1395.
1658         let expr0_0 = SseOpcode::Xorpd;
1659         return Some(expr0_0);
1660     }
1661     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
1662         // Rule at src/isa/x64/inst.isle line 1396.
1663         let expr0_0 = SseOpcode::Pxor;
1664         return Some(expr0_0);
1665     }
1666     return None;
1667 }
1668 
1669 // Generated as internal constructor for term sse_xor.
1670 pub fn constructor_sse_xor<C: Context>(
1671     ctx: &mut C,
1672     arg0: Type,
1673     arg1: Xmm,
1674     arg2: &XmmMem,
1675 ) -> Option<Xmm> {
1676     let pattern0_0 = arg0;
1677     let pattern1_0 = arg1;
1678     let pattern2_0 = arg2;
1679     // Rule at src/isa/x64/inst.isle line 1400.
1680     let expr0_0 = constructor_sse_xor_op(ctx, pattern0_0)?;
1681     let expr1_0 = constructor_xmm_rm_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
1682     return Some(expr1_0);
1683 }
1684 
1685 // Generated as internal constructor for term sse_cmp_op.
1686 pub fn constructor_sse_cmp_op<C: Context>(ctx: &mut C, arg0: Type) -> Option<SseOpcode> {
1687     let pattern0_0 = arg0;
1688     if pattern0_0 == F32X4 {
1689         // Rule at src/isa/x64/inst.isle line 1409.
1690         let expr0_0 = SseOpcode::Cmpps;
1691         return Some(expr0_0);
1692     }
1693     if pattern0_0 == F64X2 {
1694         // Rule at src/isa/x64/inst.isle line 1410.
1695         let expr0_0 = SseOpcode::Cmppd;
1696         return Some(expr0_0);
1697     }
1698     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
1699         if pattern1_0 == 8 {
1700             if pattern1_1 == 16 {
1701                 // Rule at src/isa/x64/inst.isle line 1405.
1702                 let expr0_0 = SseOpcode::Pcmpeqb;
1703                 return Some(expr0_0);
1704             }
1705         }
1706         if pattern1_0 == 16 {
1707             if pattern1_1 == 8 {
1708                 // Rule at src/isa/x64/inst.isle line 1406.
1709                 let expr0_0 = SseOpcode::Pcmpeqw;
1710                 return Some(expr0_0);
1711             }
1712         }
1713         if pattern1_0 == 32 {
1714             if pattern1_1 == 4 {
1715                 // Rule at src/isa/x64/inst.isle line 1407.
1716                 let expr0_0 = SseOpcode::Pcmpeqd;
1717                 return Some(expr0_0);
1718             }
1719         }
1720         if pattern1_0 == 64 {
1721             if pattern1_1 == 2 {
1722                 // Rule at src/isa/x64/inst.isle line 1408.
1723                 let expr0_0 = SseOpcode::Pcmpeqq;
1724                 return Some(expr0_0);
1725             }
1726         }
1727     }
1728     return None;
1729 }
1730 
1731 // Generated as internal constructor for term vector_all_ones.
1732 pub fn constructor_vector_all_ones<C: Context>(ctx: &mut C, arg0: Type) -> Option<Xmm> {
1733     let pattern0_0 = arg0;
1734     // Rule at src/isa/x64/inst.isle line 1424.
1735     let expr0_0 = C::temp_writable_xmm(ctx);
1736     let expr1_0: Type = I32X4;
1737     let expr2_0 = constructor_sse_cmp_op(ctx, expr1_0)?;
1738     let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
1739     let expr4_0 = constructor_writable_xmm_to_xmm_mem(ctx, expr0_0)?;
1740     let expr5_0 = MInst::XmmRmR {
1741         op: expr2_0,
1742         src1: expr3_0,
1743         src2: expr4_0,
1744         dst: expr0_0,
1745     };
1746     let expr6_0 = C::emit(ctx, &expr5_0);
1747     let expr7_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
1748     return Some(expr7_0);
1749 }
1750 
1751 // Generated as internal constructor for term make_i64x2_from_lanes.
1752 pub fn constructor_make_i64x2_from_lanes<C: Context>(
1753     ctx: &mut C,
1754     arg0: &GprMem,
1755     arg1: &GprMem,
1756 ) -> Option<Xmm> {
1757     let pattern0_0 = arg0;
1758     let pattern1_0 = arg1;
1759     // Rule at src/isa/x64/inst.isle line 1434.
1760     let expr0_0 = C::temp_writable_xmm(ctx);
1761     let expr1_0 = C::writable_xmm_to_reg(ctx, expr0_0);
1762     let expr2_0 = MInst::XmmUninitializedValue { dst: expr0_0 };
1763     let expr3_0 = C::emit(ctx, &expr2_0);
1764     let expr4_0 = SseOpcode::Pinsrd;
1765     let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0);
1766     let expr6_0 = C::gpr_mem_to_reg_mem(ctx, pattern0_0);
1767     let expr7_0: u8 = 0;
1768     let expr8_0 = OperandSize::Size64;
1769     let expr9_0 = MInst::XmmRmRImm {
1770         op: expr4_0,
1771         src1: expr5_0,
1772         src2: expr6_0,
1773         dst: expr1_0,
1774         imm: expr7_0,
1775         size: expr8_0,
1776     };
1777     let expr10_0 = C::emit(ctx, &expr9_0);
1778     let expr11_0 = SseOpcode::Pinsrd;
1779     let expr12_0 = C::writable_reg_to_reg(ctx, expr1_0);
1780     let expr13_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0);
1781     let expr14_0: u8 = 1;
1782     let expr15_0 = OperandSize::Size64;
1783     let expr16_0 = MInst::XmmRmRImm {
1784         op: expr11_0,
1785         src1: expr12_0,
1786         src2: expr13_0,
1787         dst: expr1_0,
1788         imm: expr14_0,
1789         size: expr15_0,
1790     };
1791     let expr17_0 = C::emit(ctx, &expr16_0);
1792     let expr18_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
1793     return Some(expr18_0);
1794 }
1795 
1796 // Generated as internal constructor for term mov_rmi_to_xmm.
1797 pub fn constructor_mov_rmi_to_xmm<C: Context>(ctx: &mut C, arg0: &RegMemImm) -> Option<XmmMemImm> {
1798     let pattern0_0 = arg0;
1799     match pattern0_0 {
1800         &RegMemImm::Imm { simm32: pattern1_0 } => {
1801             // Rule at src/isa/x64/inst.isle line 1455.
1802             let expr0_0 = C::xmm_mem_imm_new(ctx, pattern0_0);
1803             return Some(expr0_0);
1804         }
1805         &RegMemImm::Reg { reg: pattern1_0 } => {
1806             // Rule at src/isa/x64/inst.isle line 1456.
1807             let expr0_0 = SseOpcode::Movd;
1808             let expr1_0 = C::reg_to_gpr_mem(ctx, pattern1_0);
1809             let expr2_0 = OperandSize::Size32;
1810             let expr3_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr1_0, &expr2_0)?;
1811             let expr4_0 = C::xmm_to_xmm_mem_imm(ctx, expr3_0);
1812             return Some(expr4_0);
1813         }
1814         &RegMemImm::Mem {
1815             addr: ref pattern1_0,
1816         } => {
1817             // Rule at src/isa/x64/inst.isle line 1454.
1818             let expr0_0 = C::xmm_mem_imm_new(ctx, pattern0_0);
1819             return Some(expr0_0);
1820         }
1821         _ => {}
1822     }
1823     return None;
1824 }
1825 
1826 // Generated as internal constructor for term x64_load.
1827 pub fn constructor_x64_load<C: Context>(
1828     ctx: &mut C,
1829     arg0: Type,
1830     arg1: &SyntheticAmode,
1831     arg2: &ExtKind,
1832 ) -> Option<Reg> {
1833     let pattern0_0 = arg0;
1834     if pattern0_0 == I64 {
1835         let pattern2_0 = arg1;
1836         let pattern3_0 = arg2;
1837         // Rule at src/isa/x64/inst.isle line 1470.
1838         let expr0_0 = C::temp_writable_gpr(ctx);
1839         let expr1_0 = MInst::Mov64MR {
1840             src: pattern2_0.clone(),
1841             dst: expr0_0,
1842         };
1843         let expr2_0 = C::emit(ctx, &expr1_0);
1844         let expr3_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
1845         return Some(expr3_0);
1846     }
1847     if pattern0_0 == F32 {
1848         let pattern2_0 = arg1;
1849         let pattern3_0 = arg2;
1850         // Rule at src/isa/x64/inst.isle line 1475.
1851         let expr0_0 = SseOpcode::Movss;
1852         let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0)?;
1853         let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?;
1854         let expr3_0 = C::xmm_to_reg(ctx, expr2_0);
1855         return Some(expr3_0);
1856     }
1857     if pattern0_0 == F64 {
1858         let pattern2_0 = arg1;
1859         let pattern3_0 = arg2;
1860         // Rule at src/isa/x64/inst.isle line 1479.
1861         let expr0_0 = SseOpcode::Movsd;
1862         let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0)?;
1863         let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?;
1864         let expr3_0 = C::xmm_to_reg(ctx, expr2_0);
1865         return Some(expr3_0);
1866     }
1867     if pattern0_0 == F32X4 {
1868         let pattern2_0 = arg1;
1869         let pattern3_0 = arg2;
1870         // Rule at src/isa/x64/inst.isle line 1483.
1871         let expr0_0 = SseOpcode::Movups;
1872         let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0)?;
1873         let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?;
1874         let expr3_0 = C::xmm_to_reg(ctx, expr2_0);
1875         return Some(expr3_0);
1876     }
1877     if pattern0_0 == F64X2 {
1878         let pattern2_0 = arg1;
1879         let pattern3_0 = arg2;
1880         // Rule at src/isa/x64/inst.isle line 1487.
1881         let expr0_0 = SseOpcode::Movupd;
1882         let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0)?;
1883         let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?;
1884         let expr3_0 = C::xmm_to_reg(ctx, expr2_0);
1885         return Some(expr3_0);
1886     }
1887     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
1888         let pattern2_0 = arg1;
1889         let pattern3_0 = arg2;
1890         // Rule at src/isa/x64/inst.isle line 1491.
1891         let expr0_0 = SseOpcode::Movdqu;
1892         let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0)?;
1893         let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?;
1894         let expr3_0 = C::xmm_to_reg(ctx, expr2_0);
1895         return Some(expr3_0);
1896     }
1897     if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) {
1898         let pattern2_0 = arg1;
1899         let pattern3_0 = arg2;
1900         if let &ExtKind::SignExtend = pattern3_0 {
1901             // Rule at src/isa/x64/inst.isle line 1466.
1902             let expr0_0 = C::ty_bytes(ctx, pattern1_0);
1903             let expr1_0: u16 = 8;
1904             let expr2_0 = C::ext_mode(ctx, expr0_0, expr1_0);
1905             let expr3_0 = constructor_synthetic_amode_to_gpr_mem(ctx, pattern2_0)?;
1906             let expr4_0 = constructor_x64_movsx(ctx, &expr2_0, &expr3_0)?;
1907             let expr5_0 = C::gpr_to_reg(ctx, expr4_0);
1908             return Some(expr5_0);
1909         }
1910     }
1911     return None;
1912 }
1913 
1914 // Generated as internal constructor for term x64_mov.
1915 pub fn constructor_x64_mov<C: Context>(ctx: &mut C, arg0: &Amode) -> Option<Reg> {
1916     let pattern0_0 = arg0;
1917     // Rule at src/isa/x64/inst.isle line 1496.
1918     let expr0_0 = C::temp_writable_gpr(ctx);
1919     let expr1_0 = C::amode_to_synthetic_amode(ctx, pattern0_0);
1920     let expr2_0 = MInst::Mov64MR {
1921         src: expr1_0,
1922         dst: expr0_0,
1923     };
1924     let expr3_0 = C::emit(ctx, &expr2_0);
1925     let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
1926     return Some(expr4_0);
1927 }
1928 
1929 // Generated as internal constructor for term x64_movzx.
1930 pub fn constructor_x64_movzx<C: Context>(
1931     ctx: &mut C,
1932     arg0: &ExtMode,
1933     arg1: &GprMem,
1934 ) -> Option<Gpr> {
1935     let pattern0_0 = arg0;
1936     let pattern1_0 = arg1;
1937     // Rule at src/isa/x64/inst.isle line 1502.
1938     let expr0_0 = C::temp_writable_gpr(ctx);
1939     let expr1_0 = MInst::MovzxRmR {
1940         ext_mode: pattern0_0.clone(),
1941         src: pattern1_0.clone(),
1942         dst: expr0_0,
1943     };
1944     let expr2_0 = C::emit(ctx, &expr1_0);
1945     let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
1946     return Some(expr3_0);
1947 }
1948 
1949 // Generated as internal constructor for term x64_movsx.
1950 pub fn constructor_x64_movsx<C: Context>(
1951     ctx: &mut C,
1952     arg0: &ExtMode,
1953     arg1: &GprMem,
1954 ) -> Option<Gpr> {
1955     let pattern0_0 = arg0;
1956     let pattern1_0 = arg1;
1957     // Rule at src/isa/x64/inst.isle line 1508.
1958     let expr0_0 = C::temp_writable_gpr(ctx);
1959     let expr1_0 = MInst::MovsxRmR {
1960         ext_mode: pattern0_0.clone(),
1961         src: pattern1_0.clone(),
1962         dst: expr0_0,
1963     };
1964     let expr2_0 = C::emit(ctx, &expr1_0);
1965     let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
1966     return Some(expr3_0);
1967 }
1968 
1969 // Generated as internal constructor for term x64_movss_load.
1970 pub fn constructor_x64_movss_load<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
1971     let pattern0_0 = arg0;
1972     // Rule at src/isa/x64/inst.isle line 1514.
1973     let expr0_0 = SseOpcode::Movss;
1974     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
1975     return Some(expr1_0);
1976 }
1977 
1978 // Generated as internal constructor for term x64_movsd_load.
1979 pub fn constructor_x64_movsd_load<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
1980     let pattern0_0 = arg0;
1981     // Rule at src/isa/x64/inst.isle line 1518.
1982     let expr0_0 = SseOpcode::Movsd;
1983     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
1984     return Some(expr1_0);
1985 }
1986 
1987 // Generated as internal constructor for term x64_movups.
1988 pub fn constructor_x64_movups<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
1989     let pattern0_0 = arg0;
1990     // Rule at src/isa/x64/inst.isle line 1522.
1991     let expr0_0 = SseOpcode::Movups;
1992     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
1993     return Some(expr1_0);
1994 }
1995 
1996 // Generated as internal constructor for term x64_movupd.
1997 pub fn constructor_x64_movupd<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
1998     let pattern0_0 = arg0;
1999     // Rule at src/isa/x64/inst.isle line 1526.
2000     let expr0_0 = SseOpcode::Movupd;
2001     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
2002     return Some(expr1_0);
2003 }
2004 
2005 // Generated as internal constructor for term x64_movdqu.
2006 pub fn constructor_x64_movdqu<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
2007     let pattern0_0 = arg0;
2008     // Rule at src/isa/x64/inst.isle line 1530.
2009     let expr0_0 = SseOpcode::Movdqu;
2010     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
2011     return Some(expr1_0);
2012 }
2013 
2014 // Generated as internal constructor for term x64_pmovsxbw.
2015 pub fn constructor_x64_pmovsxbw<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
2016     let pattern0_0 = arg0;
2017     // Rule at src/isa/x64/inst.isle line 1534.
2018     let expr0_0 = SseOpcode::Pmovsxbw;
2019     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
2020     return Some(expr1_0);
2021 }
2022 
2023 // Generated as internal constructor for term x64_pmovzxbw.
2024 pub fn constructor_x64_pmovzxbw<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
2025     let pattern0_0 = arg0;
2026     // Rule at src/isa/x64/inst.isle line 1538.
2027     let expr0_0 = SseOpcode::Pmovzxbw;
2028     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
2029     return Some(expr1_0);
2030 }
2031 
2032 // Generated as internal constructor for term x64_pmovsxwd.
2033 pub fn constructor_x64_pmovsxwd<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
2034     let pattern0_0 = arg0;
2035     // Rule at src/isa/x64/inst.isle line 1542.
2036     let expr0_0 = SseOpcode::Pmovsxwd;
2037     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
2038     return Some(expr1_0);
2039 }
2040 
2041 // Generated as internal constructor for term x64_pmovzxwd.
2042 pub fn constructor_x64_pmovzxwd<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
2043     let pattern0_0 = arg0;
2044     // Rule at src/isa/x64/inst.isle line 1546.
2045     let expr0_0 = SseOpcode::Pmovzxwd;
2046     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
2047     return Some(expr1_0);
2048 }
2049 
2050 // Generated as internal constructor for term x64_pmovsxdq.
2051 pub fn constructor_x64_pmovsxdq<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
2052     let pattern0_0 = arg0;
2053     // Rule at src/isa/x64/inst.isle line 1550.
2054     let expr0_0 = SseOpcode::Pmovsxdq;
2055     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
2056     return Some(expr1_0);
2057 }
2058 
2059 // Generated as internal constructor for term x64_pmovzxdq.
2060 pub fn constructor_x64_pmovzxdq<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
2061     let pattern0_0 = arg0;
2062     // Rule at src/isa/x64/inst.isle line 1554.
2063     let expr0_0 = SseOpcode::Pmovzxdq;
2064     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
2065     return Some(expr1_0);
2066 }
2067 
2068 // Generated as internal constructor for term x64_movrm.
2069 pub fn constructor_x64_movrm<C: Context>(
2070     ctx: &mut C,
2071     arg0: Type,
2072     arg1: &SyntheticAmode,
2073     arg2: Gpr,
2074 ) -> Option<SideEffectNoResult> {
2075     let pattern0_0 = arg0;
2076     let pattern1_0 = arg1;
2077     let pattern2_0 = arg2;
2078     // Rule at src/isa/x64/inst.isle line 1558.
2079     let expr0_0 = C::raw_operand_size_of_type(ctx, pattern0_0);
2080     let expr1_0 = MInst::MovRM {
2081         size: expr0_0,
2082         src: pattern2_0,
2083         dst: pattern1_0.clone(),
2084     };
2085     let expr2_0 = SideEffectNoResult::Inst { inst: expr1_0 };
2086     return Some(expr2_0);
2087 }
2088 
2089 // Generated as internal constructor for term x64_xmm_movrm.
2090 pub fn constructor_x64_xmm_movrm<C: Context>(
2091     ctx: &mut C,
2092     arg0: &SseOpcode,
2093     arg1: &SyntheticAmode,
2094     arg2: Xmm,
2095 ) -> Option<SideEffectNoResult> {
2096     let pattern0_0 = arg0;
2097     let pattern1_0 = arg1;
2098     let pattern2_0 = arg2;
2099     // Rule at src/isa/x64/inst.isle line 1563.
2100     let expr0_0 = C::xmm_to_reg(ctx, pattern2_0);
2101     let expr1_0 = MInst::XmmMovRM {
2102         op: pattern0_0.clone(),
2103         src: expr0_0,
2104         dst: pattern1_0.clone(),
2105     };
2106     let expr2_0 = SideEffectNoResult::Inst { inst: expr1_0 };
2107     return Some(expr2_0);
2108 }
2109 
2110 // Generated as internal constructor for term x64_xmm_load_const.
2111 pub fn constructor_x64_xmm_load_const<C: Context>(
2112     ctx: &mut C,
2113     arg0: Type,
2114     arg1: VCodeConstant,
2115 ) -> Option<Xmm> {
2116     let pattern0_0 = arg0;
2117     let pattern1_0 = arg1;
2118     // Rule at src/isa/x64/inst.isle line 1568.
2119     let expr0_0 = C::temp_writable_xmm(ctx);
2120     let expr1_0 = C::writable_xmm_to_reg(ctx, expr0_0);
2121     let expr2_0 = MInst::XmmLoadConst {
2122         src: pattern1_0,
2123         dst: expr1_0,
2124         ty: pattern0_0,
2125     };
2126     let expr3_0 = C::emit(ctx, &expr2_0);
2127     let expr4_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
2128     return Some(expr4_0);
2129 }
2130 
2131 // Generated as internal constructor for term alu_rmi_r.
2132 pub fn constructor_alu_rmi_r<C: Context>(
2133     ctx: &mut C,
2134     arg0: Type,
2135     arg1: &AluRmiROpcode,
2136     arg2: Gpr,
2137     arg3: &GprMemImm,
2138 ) -> Option<Gpr> {
2139     let pattern0_0 = arg0;
2140     let pattern1_0 = arg1;
2141     let pattern2_0 = arg2;
2142     let pattern3_0 = arg3;
2143     // Rule at src/isa/x64/inst.isle line 1581.
2144     let expr0_0 = C::temp_writable_gpr(ctx);
2145     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
2146     let expr2_0 = MInst::AluRmiR {
2147         size: expr1_0,
2148         op: pattern1_0.clone(),
2149         src1: pattern2_0,
2150         src2: pattern3_0.clone(),
2151         dst: expr0_0,
2152     };
2153     let expr3_0 = C::emit(ctx, &expr2_0);
2154     let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
2155     return Some(expr4_0);
2156 }
2157 
2158 // Generated as internal constructor for term x64_add.
2159 pub fn constructor_x64_add<C: Context>(
2160     ctx: &mut C,
2161     arg0: Type,
2162     arg1: Gpr,
2163     arg2: &GprMemImm,
2164 ) -> Option<Gpr> {
2165     let pattern0_0 = arg0;
2166     let pattern1_0 = arg1;
2167     let pattern2_0 = arg2;
2168     // Rule at src/isa/x64/inst.isle line 1589.
2169     let expr0_0 = AluRmiROpcode::Add;
2170     let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
2171     return Some(expr1_0);
2172 }
2173 
2174 // Generated as internal constructor for term x64_add_with_flags_paired.
2175 pub fn constructor_x64_add_with_flags_paired<C: Context>(
2176     ctx: &mut C,
2177     arg0: Type,
2178     arg1: Gpr,
2179     arg2: &GprMemImm,
2180 ) -> Option<ProducesFlags> {
2181     let pattern0_0 = arg0;
2182     let pattern1_0 = arg1;
2183     let pattern2_0 = arg2;
2184     // Rule at src/isa/x64/inst.isle line 1597.
2185     let expr0_0 = C::temp_writable_gpr(ctx);
2186     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
2187     let expr2_0 = AluRmiROpcode::Add;
2188     let expr3_0 = MInst::AluRmiR {
2189         size: expr1_0,
2190         op: expr2_0,
2191         src1: pattern1_0,
2192         src2: pattern2_0.clone(),
2193         dst: expr0_0,
2194     };
2195     let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
2196     let expr5_0 = ProducesFlags::ProducesFlagsReturnsResultWithConsumer {
2197         inst: expr3_0,
2198         result: expr4_0,
2199     };
2200     return Some(expr5_0);
2201 }
2202 
2203 // Generated as internal constructor for term x64_adc_paired.
2204 pub fn constructor_x64_adc_paired<C: Context>(
2205     ctx: &mut C,
2206     arg0: Type,
2207     arg1: Gpr,
2208     arg2: &GprMemImm,
2209 ) -> Option<ConsumesFlags> {
2210     let pattern0_0 = arg0;
2211     let pattern1_0 = arg1;
2212     let pattern2_0 = arg2;
2213     // Rule at src/isa/x64/inst.isle line 1609.
2214     let expr0_0 = C::temp_writable_gpr(ctx);
2215     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
2216     let expr2_0 = AluRmiROpcode::Adc;
2217     let expr3_0 = MInst::AluRmiR {
2218         size: expr1_0,
2219         op: expr2_0,
2220         src1: pattern1_0,
2221         src2: pattern2_0.clone(),
2222         dst: expr0_0,
2223     };
2224     let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
2225     let expr5_0 = ConsumesFlags::ConsumesFlagsReturnsResultWithProducer {
2226         inst: expr3_0,
2227         result: expr4_0,
2228     };
2229     return Some(expr5_0);
2230 }
2231 
2232 // Generated as internal constructor for term x64_sub.
2233 pub fn constructor_x64_sub<C: Context>(
2234     ctx: &mut C,
2235     arg0: Type,
2236     arg1: Gpr,
2237     arg2: &GprMemImm,
2238 ) -> Option<Gpr> {
2239     let pattern0_0 = arg0;
2240     let pattern1_0 = arg1;
2241     let pattern2_0 = arg2;
2242     // Rule at src/isa/x64/inst.isle line 1621.
2243     let expr0_0 = AluRmiROpcode::Sub;
2244     let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
2245     return Some(expr1_0);
2246 }
2247 
2248 // Generated as internal constructor for term x64_sub_with_flags_paired.
2249 pub fn constructor_x64_sub_with_flags_paired<C: Context>(
2250     ctx: &mut C,
2251     arg0: Type,
2252     arg1: Gpr,
2253     arg2: &GprMemImm,
2254 ) -> Option<ProducesFlags> {
2255     let pattern0_0 = arg0;
2256     let pattern1_0 = arg1;
2257     let pattern2_0 = arg2;
2258     // Rule at src/isa/x64/inst.isle line 1629.
2259     let expr0_0 = C::temp_writable_gpr(ctx);
2260     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
2261     let expr2_0 = AluRmiROpcode::Sub;
2262     let expr3_0 = MInst::AluRmiR {
2263         size: expr1_0,
2264         op: expr2_0,
2265         src1: pattern1_0,
2266         src2: pattern2_0.clone(),
2267         dst: expr0_0,
2268     };
2269     let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
2270     let expr5_0 = ProducesFlags::ProducesFlagsReturnsResultWithConsumer {
2271         inst: expr3_0,
2272         result: expr4_0,
2273     };
2274     return Some(expr5_0);
2275 }
2276 
2277 // Generated as internal constructor for term x64_sbb_paired.
2278 pub fn constructor_x64_sbb_paired<C: Context>(
2279     ctx: &mut C,
2280     arg0: Type,
2281     arg1: Gpr,
2282     arg2: &GprMemImm,
2283 ) -> Option<ConsumesFlags> {
2284     let pattern0_0 = arg0;
2285     let pattern1_0 = arg1;
2286     let pattern2_0 = arg2;
2287     // Rule at src/isa/x64/inst.isle line 1641.
2288     let expr0_0 = C::temp_writable_gpr(ctx);
2289     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
2290     let expr2_0 = AluRmiROpcode::Sbb;
2291     let expr3_0 = MInst::AluRmiR {
2292         size: expr1_0,
2293         op: expr2_0,
2294         src1: pattern1_0,
2295         src2: pattern2_0.clone(),
2296         dst: expr0_0,
2297     };
2298     let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
2299     let expr5_0 = ConsumesFlags::ConsumesFlagsReturnsResultWithProducer {
2300         inst: expr3_0,
2301         result: expr4_0,
2302     };
2303     return Some(expr5_0);
2304 }
2305 
2306 // Generated as internal constructor for term x64_mul.
2307 pub fn constructor_x64_mul<C: Context>(
2308     ctx: &mut C,
2309     arg0: Type,
2310     arg1: Gpr,
2311     arg2: &GprMemImm,
2312 ) -> Option<Gpr> {
2313     let pattern0_0 = arg0;
2314     let pattern1_0 = arg1;
2315     let pattern2_0 = arg2;
2316     // Rule at src/isa/x64/inst.isle line 1653.
2317     let expr0_0 = AluRmiROpcode::Mul;
2318     let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
2319     return Some(expr1_0);
2320 }
2321 
2322 // Generated as internal constructor for term x64_and.
2323 pub fn constructor_x64_and<C: Context>(
2324     ctx: &mut C,
2325     arg0: Type,
2326     arg1: Gpr,
2327     arg2: &GprMemImm,
2328 ) -> Option<Gpr> {
2329     let pattern0_0 = arg0;
2330     let pattern1_0 = arg1;
2331     let pattern2_0 = arg2;
2332     // Rule at src/isa/x64/inst.isle line 1661.
2333     let expr0_0 = AluRmiROpcode::And;
2334     let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
2335     return Some(expr1_0);
2336 }
2337 
2338 // Generated as internal constructor for term x64_and_with_flags_paired.
2339 pub fn constructor_x64_and_with_flags_paired<C: Context>(
2340     ctx: &mut C,
2341     arg0: Type,
2342     arg1: Gpr,
2343     arg2: &GprMemImm,
2344 ) -> Option<ProducesFlags> {
2345     let pattern0_0 = arg0;
2346     let pattern1_0 = arg1;
2347     let pattern2_0 = arg2;
2348     // Rule at src/isa/x64/inst.isle line 1668.
2349     let expr0_0 = C::temp_writable_gpr(ctx);
2350     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
2351     let expr2_0 = AluRmiROpcode::And;
2352     let expr3_0 = MInst::AluRmiR {
2353         size: expr1_0,
2354         op: expr2_0,
2355         src1: pattern1_0,
2356         src2: pattern2_0.clone(),
2357         dst: expr0_0,
2358     };
2359     let expr4_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr3_0 };
2360     return Some(expr4_0);
2361 }
2362 
2363 // Generated as internal constructor for term x64_or.
2364 pub fn constructor_x64_or<C: Context>(
2365     ctx: &mut C,
2366     arg0: Type,
2367     arg1: Gpr,
2368     arg2: &GprMemImm,
2369 ) -> Option<Gpr> {
2370     let pattern0_0 = arg0;
2371     let pattern1_0 = arg1;
2372     let pattern2_0 = arg2;
2373     // Rule at src/isa/x64/inst.isle line 1679.
2374     let expr0_0 = AluRmiROpcode::Or;
2375     let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
2376     return Some(expr1_0);
2377 }
2378 
2379 // Generated as internal constructor for term x64_xor.
2380 pub fn constructor_x64_xor<C: Context>(
2381     ctx: &mut C,
2382     arg0: Type,
2383     arg1: Gpr,
2384     arg2: &GprMemImm,
2385 ) -> Option<Gpr> {
2386     let pattern0_0 = arg0;
2387     let pattern1_0 = arg1;
2388     let pattern2_0 = arg2;
2389     // Rule at src/isa/x64/inst.isle line 1687.
2390     let expr0_0 = AluRmiROpcode::Xor;
2391     let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
2392     return Some(expr1_0);
2393 }
2394 
2395 // Generated as internal constructor for term imm.
2396 pub fn constructor_imm<C: Context>(ctx: &mut C, arg0: Type, arg1: u64) -> Option<Reg> {
2397     let pattern0_0 = arg0;
2398     if pattern0_0 == I64 {
2399         let pattern2_0 = arg1;
2400         if let Some(pattern3_0) = C::nonzero_u64_fits_in_u32(ctx, pattern2_0) {
2401             // Rule at src/isa/x64/inst.isle line 1727.
2402             let expr0_0 = C::temp_writable_gpr(ctx);
2403             let expr1_0 = OperandSize::Size32;
2404             let expr2_0 = MInst::Imm {
2405                 dst_size: expr1_0,
2406                 simm64: pattern3_0,
2407                 dst: expr0_0,
2408             };
2409             let expr3_0 = C::emit(ctx, &expr2_0);
2410             let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
2411             return Some(expr4_0);
2412         }
2413     }
2414     if pattern0_0 == F32 {
2415         let pattern2_0 = arg1;
2416         if pattern2_0 == 0 {
2417             // Rule at src/isa/x64/inst.isle line 1756.
2418             let expr0_0 = C::temp_writable_xmm(ctx);
2419             let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
2420             let expr2_0 = SseOpcode::Xorps;
2421             let expr3_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
2422             let expr4_0 = MInst::XmmRmR {
2423                 op: expr2_0,
2424                 src1: expr1_0,
2425                 src2: expr3_0,
2426                 dst: expr0_0,
2427             };
2428             let expr5_0 = C::emit(ctx, &expr4_0);
2429             let expr6_0 = C::xmm_to_reg(ctx, expr1_0);
2430             return Some(expr6_0);
2431         }
2432         // Rule at src/isa/x64/inst.isle line 1704.
2433         let expr0_0 = SseOpcode::Movd;
2434         let expr1_0: Type = I32;
2435         let expr2_0 = constructor_imm(ctx, expr1_0, pattern2_0)?;
2436         let expr3_0 = C::reg_to_gpr_mem(ctx, expr2_0);
2437         let expr4_0 = OperandSize::Size32;
2438         let expr5_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr3_0, &expr4_0)?;
2439         let expr6_0 = C::xmm_to_reg(ctx, expr5_0);
2440         return Some(expr6_0);
2441     }
2442     if pattern0_0 == F64 {
2443         let pattern2_0 = arg1;
2444         if pattern2_0 == 0 {
2445             // Rule at src/isa/x64/inst.isle line 1768.
2446             let expr0_0 = C::temp_writable_xmm(ctx);
2447             let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
2448             let expr2_0 = SseOpcode::Xorpd;
2449             let expr3_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
2450             let expr4_0 = MInst::XmmRmR {
2451                 op: expr2_0,
2452                 src1: expr1_0,
2453                 src2: expr3_0,
2454                 dst: expr0_0,
2455             };
2456             let expr5_0 = C::emit(ctx, &expr4_0);
2457             let expr6_0 = C::xmm_to_reg(ctx, expr1_0);
2458             return Some(expr6_0);
2459         }
2460         // Rule at src/isa/x64/inst.isle line 1710.
2461         let expr0_0 = SseOpcode::Movq;
2462         let expr1_0: Type = I64;
2463         let expr2_0 = constructor_imm(ctx, expr1_0, pattern2_0)?;
2464         let expr3_0 = C::reg_to_gpr_mem(ctx, expr2_0);
2465         let expr4_0 = OperandSize::Size64;
2466         let expr5_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr3_0, &expr4_0)?;
2467         let expr6_0 = C::xmm_to_reg(ctx, expr5_0);
2468         return Some(expr6_0);
2469     }
2470     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
2471         let pattern2_0 = arg1;
2472         if pattern2_0 == 0 {
2473             // Rule at src/isa/x64/inst.isle line 1746.
2474             let expr0_0 = C::temp_writable_xmm(ctx);
2475             let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
2476             let expr2_0 = constructor_sse_xor_op(ctx, pattern0_0)?;
2477             let expr3_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
2478             let expr4_0 = MInst::XmmRmR {
2479                 op: expr2_0,
2480                 src1: expr1_0,
2481                 src2: expr3_0,
2482                 dst: expr0_0,
2483             };
2484             let expr5_0 = C::emit(ctx, &expr4_0);
2485             let expr6_0 = C::xmm_to_reg(ctx, expr1_0);
2486             return Some(expr6_0);
2487         }
2488     }
2489     if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) {
2490         let pattern2_0 = arg1;
2491         if pattern2_0 == 0 {
2492             // Rule at src/isa/x64/inst.isle line 1733.
2493             let expr0_0 = C::temp_writable_gpr(ctx);
2494             let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
2495             let expr2_0 = C::operand_size_of_type_32_64(ctx, pattern1_0);
2496             let expr3_0 = AluRmiROpcode::Xor;
2497             let expr4_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0);
2498             let expr5_0 = MInst::AluRmiR {
2499                 size: expr2_0,
2500                 op: expr3_0,
2501                 src1: expr1_0,
2502                 src2: expr4_0,
2503                 dst: expr0_0,
2504             };
2505             let expr6_0 = C::emit(ctx, &expr5_0);
2506             let expr7_0 = C::gpr_to_reg(ctx, expr1_0);
2507             return Some(expr7_0);
2508         }
2509         // Rule at src/isa/x64/inst.isle line 1697.
2510         let expr0_0 = C::temp_writable_gpr(ctx);
2511         let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern1_0);
2512         let expr2_0 = MInst::Imm {
2513             dst_size: expr1_0,
2514             simm64: pattern2_0,
2515             dst: expr0_0,
2516         };
2517         let expr3_0 = C::emit(ctx, &expr2_0);
2518         let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
2519         return Some(expr4_0);
2520     }
2521     return None;
2522 }
2523 
2524 // Generated as internal constructor for term imm_i64.
2525 pub fn constructor_imm_i64<C: Context>(ctx: &mut C, arg0: Type, arg1: i64) -> Option<Reg> {
2526     let pattern0_0 = arg0;
2527     let pattern1_0 = arg1;
2528     // Rule at src/isa/x64/inst.isle line 1719.
2529     let expr0_0 = C::i64_as_u64(ctx, pattern1_0)?;
2530     let expr1_0 = constructor_imm(ctx, pattern0_0, expr0_0)?;
2531     return Some(expr1_0);
2532 }
2533 
2534 // Generated as internal constructor for term shift_r.
2535 pub fn constructor_shift_r<C: Context>(
2536     ctx: &mut C,
2537     arg0: Type,
2538     arg1: &ShiftKind,
2539     arg2: Gpr,
2540     arg3: &Imm8Gpr,
2541 ) -> Option<Gpr> {
2542     let pattern0_0 = arg0;
2543     let pattern1_0 = arg1;
2544     let pattern2_0 = arg2;
2545     let pattern3_0 = arg3;
2546     // Rule at src/isa/x64/inst.isle line 1781.
2547     let expr0_0 = C::temp_writable_gpr(ctx);
2548     let expr1_0 = C::raw_operand_size_of_type(ctx, pattern0_0);
2549     let expr2_0 = MInst::ShiftR {
2550         size: expr1_0,
2551         kind: pattern1_0.clone(),
2552         src: pattern2_0,
2553         num_bits: pattern3_0.clone(),
2554         dst: expr0_0,
2555     };
2556     let expr3_0 = C::emit(ctx, &expr2_0);
2557     let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
2558     return Some(expr4_0);
2559 }
2560 
2561 // Generated as internal constructor for term x64_rotl.
2562 pub fn constructor_x64_rotl<C: Context>(
2563     ctx: &mut C,
2564     arg0: Type,
2565     arg1: Gpr,
2566     arg2: &Imm8Gpr,
2567 ) -> Option<Gpr> {
2568     let pattern0_0 = arg0;
2569     let pattern1_0 = arg1;
2570     let pattern2_0 = arg2;
2571     // Rule at src/isa/x64/inst.isle line 1791.
2572     let expr0_0 = ShiftKind::RotateLeft;
2573     let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
2574     return Some(expr1_0);
2575 }
2576 
2577 // Generated as internal constructor for term x64_rotr.
2578 pub fn constructor_x64_rotr<C: Context>(
2579     ctx: &mut C,
2580     arg0: Type,
2581     arg1: Gpr,
2582     arg2: &Imm8Gpr,
2583 ) -> Option<Gpr> {
2584     let pattern0_0 = arg0;
2585     let pattern1_0 = arg1;
2586     let pattern2_0 = arg2;
2587     // Rule at src/isa/x64/inst.isle line 1796.
2588     let expr0_0 = ShiftKind::RotateRight;
2589     let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
2590     return Some(expr1_0);
2591 }
2592 
2593 // Generated as internal constructor for term x64_shl.
2594 pub fn constructor_x64_shl<C: Context>(
2595     ctx: &mut C,
2596     arg0: Type,
2597     arg1: Gpr,
2598     arg2: &Imm8Gpr,
2599 ) -> Option<Gpr> {
2600     let pattern0_0 = arg0;
2601     let pattern1_0 = arg1;
2602     let pattern2_0 = arg2;
2603     // Rule at src/isa/x64/inst.isle line 1801.
2604     let expr0_0 = ShiftKind::ShiftLeft;
2605     let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
2606     return Some(expr1_0);
2607 }
2608 
2609 // Generated as internal constructor for term x64_shr.
2610 pub fn constructor_x64_shr<C: Context>(
2611     ctx: &mut C,
2612     arg0: Type,
2613     arg1: Gpr,
2614     arg2: &Imm8Gpr,
2615 ) -> Option<Gpr> {
2616     let pattern0_0 = arg0;
2617     let pattern1_0 = arg1;
2618     let pattern2_0 = arg2;
2619     // Rule at src/isa/x64/inst.isle line 1806.
2620     let expr0_0 = ShiftKind::ShiftRightLogical;
2621     let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
2622     return Some(expr1_0);
2623 }
2624 
2625 // Generated as internal constructor for term x64_sar.
2626 pub fn constructor_x64_sar<C: Context>(
2627     ctx: &mut C,
2628     arg0: Type,
2629     arg1: Gpr,
2630     arg2: &Imm8Gpr,
2631 ) -> Option<Gpr> {
2632     let pattern0_0 = arg0;
2633     let pattern1_0 = arg1;
2634     let pattern2_0 = arg2;
2635     // Rule at src/isa/x64/inst.isle line 1811.
2636     let expr0_0 = ShiftKind::ShiftRightArithmetic;
2637     let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
2638     return Some(expr1_0);
2639 }
2640 
2641 // Generated as internal constructor for term cmp_rmi_r.
2642 pub fn constructor_cmp_rmi_r<C: Context>(
2643     ctx: &mut C,
2644     arg0: &OperandSize,
2645     arg1: &CmpOpcode,
2646     arg2: &GprMemImm,
2647     arg3: Gpr,
2648 ) -> Option<ProducesFlags> {
2649     let pattern0_0 = arg0;
2650     let pattern1_0 = arg1;
2651     let pattern2_0 = arg2;
2652     let pattern3_0 = arg3;
2653     // Rule at src/isa/x64/inst.isle line 1816.
2654     let expr0_0 = MInst::CmpRmiR {
2655         size: pattern0_0.clone(),
2656         opcode: pattern1_0.clone(),
2657         src: pattern2_0.clone(),
2658         dst: pattern3_0,
2659     };
2660     let expr1_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr0_0 };
2661     return Some(expr1_0);
2662 }
2663 
2664 // Generated as internal constructor for term x64_cmp.
2665 pub fn constructor_x64_cmp<C: Context>(
2666     ctx: &mut C,
2667     arg0: &OperandSize,
2668     arg1: &GprMemImm,
2669     arg2: Gpr,
2670 ) -> Option<ProducesFlags> {
2671     let pattern0_0 = arg0;
2672     let pattern1_0 = arg1;
2673     let pattern2_0 = arg2;
2674     // Rule at src/isa/x64/inst.isle line 1825.
2675     let expr0_0 = CmpOpcode::Cmp;
2676     let expr1_0 = constructor_cmp_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
2677     return Some(expr1_0);
2678 }
2679 
2680 // Generated as internal constructor for term x64_cmp_imm.
2681 pub fn constructor_x64_cmp_imm<C: Context>(
2682     ctx: &mut C,
2683     arg0: &OperandSize,
2684     arg1: u32,
2685     arg2: Gpr,
2686 ) -> Option<ProducesFlags> {
2687     let pattern0_0 = arg0;
2688     let pattern1_0 = arg1;
2689     let pattern2_0 = arg2;
2690     // Rule at src/isa/x64/inst.isle line 1830.
2691     let expr0_0 = CmpOpcode::Cmp;
2692     let expr1_0 = RegMemImm::Imm { simm32: pattern1_0 };
2693     let expr2_0 = C::gpr_mem_imm_new(ctx, &expr1_0);
2694     let expr3_0 = constructor_cmp_rmi_r(ctx, pattern0_0, &expr0_0, &expr2_0, pattern2_0)?;
2695     return Some(expr3_0);
2696 }
2697 
2698 // Generated as internal constructor for term xmm_cmp_rm_r.
2699 pub fn constructor_xmm_cmp_rm_r<C: Context>(
2700     ctx: &mut C,
2701     arg0: &SseOpcode,
2702     arg1: &XmmMem,
2703     arg2: Xmm,
2704 ) -> Option<ProducesFlags> {
2705     let pattern0_0 = arg0;
2706     let pattern1_0 = arg1;
2707     let pattern2_0 = arg2;
2708     // Rule at src/isa/x64/inst.isle line 1835.
2709     let expr0_0 = MInst::XmmCmpRmR {
2710         op: pattern0_0.clone(),
2711         src: pattern1_0.clone(),
2712         dst: pattern2_0,
2713     };
2714     let expr1_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr0_0 };
2715     return Some(expr1_0);
2716 }
2717 
2718 // Generated as internal constructor for term x64_ucomis.
2719 pub fn constructor_x64_ucomis<C: Context>(
2720     ctx: &mut C,
2721     arg0: Value,
2722     arg1: Value,
2723 ) -> Option<ProducesFlags> {
2724     let pattern0_0 = arg0;
2725     let pattern1_0 = C::value_type(ctx, pattern0_0);
2726     if pattern1_0 == F32 {
2727         let pattern3_0 = arg1;
2728         // Rule at src/isa/x64/inst.isle line 1841.
2729         let expr0_0 = SseOpcode::Ucomiss;
2730         let expr1_0 = constructor_put_in_xmm(ctx, pattern0_0)?;
2731         let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
2732         let expr3_0 = constructor_put_in_xmm(ctx, pattern3_0)?;
2733         let expr4_0 = constructor_xmm_cmp_rm_r(ctx, &expr0_0, &expr2_0, expr3_0)?;
2734         return Some(expr4_0);
2735     }
2736     if pattern1_0 == F64 {
2737         let pattern3_0 = arg1;
2738         // Rule at src/isa/x64/inst.isle line 1845.
2739         let expr0_0 = SseOpcode::Ucomisd;
2740         let expr1_0 = constructor_put_in_xmm(ctx, pattern0_0)?;
2741         let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
2742         let expr3_0 = constructor_put_in_xmm(ctx, pattern3_0)?;
2743         let expr4_0 = constructor_xmm_cmp_rm_r(ctx, &expr0_0, &expr2_0, expr3_0)?;
2744         return Some(expr4_0);
2745     }
2746     return None;
2747 }
2748 
2749 // Generated as internal constructor for term x64_test.
2750 pub fn constructor_x64_test<C: Context>(
2751     ctx: &mut C,
2752     arg0: &OperandSize,
2753     arg1: &GprMemImm,
2754     arg2: Gpr,
2755 ) -> Option<ProducesFlags> {
2756     let pattern0_0 = arg0;
2757     let pattern1_0 = arg1;
2758     let pattern2_0 = arg2;
2759     // Rule at src/isa/x64/inst.isle line 1850.
2760     let expr0_0 = CmpOpcode::Test;
2761     let expr1_0 = constructor_cmp_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
2762     return Some(expr1_0);
2763 }
2764 
2765 // Generated as internal constructor for term cmove.
2766 pub fn constructor_cmove<C: Context>(
2767     ctx: &mut C,
2768     arg0: Type,
2769     arg1: &CC,
2770     arg2: &GprMem,
2771     arg3: Gpr,
2772 ) -> Option<ConsumesFlags> {
2773     let pattern0_0 = arg0;
2774     let pattern1_0 = arg1;
2775     let pattern2_0 = arg2;
2776     let pattern3_0 = arg3;
2777     // Rule at src/isa/x64/inst.isle line 1857.
2778     let expr0_0 = C::temp_writable_gpr(ctx);
2779     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
2780     let expr2_0 = MInst::Cmove {
2781         size: expr1_0,
2782         cc: pattern1_0.clone(),
2783         consequent: pattern2_0.clone(),
2784         alternative: pattern3_0,
2785         dst: expr0_0,
2786     };
2787     let expr3_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
2788     let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsReg {
2789         inst: expr2_0,
2790         result: expr3_0,
2791     };
2792     return Some(expr4_0);
2793 }
2794 
2795 // Generated as internal constructor for term cmove_xmm.
2796 pub fn constructor_cmove_xmm<C: Context>(
2797     ctx: &mut C,
2798     arg0: Type,
2799     arg1: &CC,
2800     arg2: &XmmMem,
2801     arg3: Xmm,
2802 ) -> Option<ConsumesFlags> {
2803     let pattern0_0 = arg0;
2804     let pattern1_0 = arg1;
2805     let pattern2_0 = arg2;
2806     let pattern3_0 = arg3;
2807     // Rule at src/isa/x64/inst.isle line 1865.
2808     let expr0_0 = C::temp_writable_xmm(ctx);
2809     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
2810     let expr2_0 = MInst::XmmCmove {
2811         size: expr1_0,
2812         cc: pattern1_0.clone(),
2813         consequent: pattern2_0.clone(),
2814         alternative: pattern3_0,
2815         dst: expr0_0,
2816     };
2817     let expr3_0 = constructor_writable_xmm_to_r_reg(ctx, expr0_0)?;
2818     let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsReg {
2819         inst: expr2_0,
2820         result: expr3_0,
2821     };
2822     return Some(expr4_0);
2823 }
2824 
2825 // Generated as internal constructor for term cmove_from_values.
2826 pub fn constructor_cmove_from_values<C: Context>(
2827     ctx: &mut C,
2828     arg0: Type,
2829     arg1: &CC,
2830     arg2: Value,
2831     arg3: Value,
2832 ) -> Option<ConsumesFlags> {
2833     let pattern0_0 = arg0;
2834     if pattern0_0 == I128 {
2835         let pattern2_0 = arg1;
2836         let pattern3_0 = arg2;
2837         let pattern4_0 = arg3;
2838         // Rule at src/isa/x64/inst.isle line 1876.
2839         let expr0_0 = C::put_in_regs(ctx, pattern3_0);
2840         let expr1_0 = C::put_in_regs(ctx, pattern4_0);
2841         let expr2_0 = C::temp_writable_gpr(ctx);
2842         let expr3_0 = C::temp_writable_gpr(ctx);
2843         let expr4_0 = OperandSize::Size64;
2844         let expr5_0: usize = 0;
2845         let expr6_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr5_0)?;
2846         let expr7_0 = C::gpr_to_gpr_mem(ctx, expr6_0);
2847         let expr8_0: usize = 0;
2848         let expr9_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr8_0)?;
2849         let expr10_0 = MInst::Cmove {
2850             size: expr4_0,
2851             cc: pattern2_0.clone(),
2852             consequent: expr7_0,
2853             alternative: expr9_0,
2854             dst: expr2_0,
2855         };
2856         let expr11_0: usize = 1;
2857         let expr12_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr11_0)?;
2858         let expr13_0 = C::gpr_to_gpr_mem(ctx, expr12_0);
2859         let expr14_0: usize = 1;
2860         let expr15_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr14_0)?;
2861         let expr16_0 = MInst::Cmove {
2862             size: expr4_0,
2863             cc: pattern2_0.clone(),
2864             consequent: expr13_0,
2865             alternative: expr15_0,
2866             dst: expr3_0,
2867         };
2868         let expr17_0 = constructor_writable_gpr_to_r_reg(ctx, expr2_0)?;
2869         let expr18_0 = constructor_writable_gpr_to_r_reg(ctx, expr3_0)?;
2870         let expr19_0 = C::value_regs(ctx, expr17_0, expr18_0);
2871         let expr20_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs {
2872             inst1: expr10_0,
2873             inst2: expr16_0,
2874             result: expr19_0,
2875         };
2876         return Some(expr20_0);
2877     }
2878     if let Some(pattern1_0) = C::is_xmm_type(ctx, pattern0_0) {
2879         if let Some(pattern2_0) = C::is_single_register_type(ctx, pattern1_0) {
2880             let pattern3_0 = arg1;
2881             let pattern4_0 = arg2;
2882             let pattern5_0 = arg3;
2883             // Rule at src/isa/x64/inst.isle line 1900.
2884             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?;
2885             let expr1_0 = constructor_put_in_xmm(ctx, pattern5_0)?;
2886             let expr2_0 = constructor_cmove_xmm(ctx, pattern2_0, pattern3_0, &expr0_0, expr1_0)?;
2887             return Some(expr2_0);
2888         }
2889     }
2890     if let Some(pattern1_0) = C::is_gpr_type(ctx, pattern0_0) {
2891         if let Some(pattern2_0) = C::is_single_register_type(ctx, pattern1_0) {
2892             let pattern3_0 = arg1;
2893             let pattern4_0 = arg2;
2894             let pattern5_0 = arg3;
2895             // Rule at src/isa/x64/inst.isle line 1897.
2896             let expr0_0 = constructor_put_in_gpr_mem(ctx, pattern4_0)?;
2897             let expr1_0 = constructor_put_in_gpr(ctx, pattern5_0)?;
2898             let expr2_0 = constructor_cmove(ctx, pattern2_0, pattern3_0, &expr0_0, expr1_0)?;
2899             return Some(expr2_0);
2900         }
2901     }
2902     return None;
2903 }
2904 
2905 // Generated as internal constructor for term cmove_or.
2906 pub fn constructor_cmove_or<C: Context>(
2907     ctx: &mut C,
2908     arg0: Type,
2909     arg1: &CC,
2910     arg2: &CC,
2911     arg3: &GprMem,
2912     arg4: Gpr,
2913 ) -> Option<ConsumesFlags> {
2914     let pattern0_0 = arg0;
2915     let pattern1_0 = arg1;
2916     let pattern2_0 = arg2;
2917     let pattern3_0 = arg3;
2918     let pattern4_0 = arg4;
2919     // Rule at src/isa/x64/inst.isle line 1907.
2920     let expr0_0 = C::temp_writable_gpr(ctx);
2921     let expr1_0 = C::temp_writable_gpr(ctx);
2922     let expr2_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
2923     let expr3_0 = MInst::Cmove {
2924         size: expr2_0,
2925         cc: pattern1_0.clone(),
2926         consequent: pattern3_0.clone(),
2927         alternative: pattern4_0,
2928         dst: expr1_0,
2929     };
2930     let expr4_0 = C::writable_gpr_to_gpr(ctx, expr1_0);
2931     let expr5_0 = MInst::Cmove {
2932         size: expr2_0,
2933         cc: pattern2_0.clone(),
2934         consequent: pattern3_0.clone(),
2935         alternative: expr4_0,
2936         dst: expr0_0,
2937     };
2938     let expr6_0 = constructor_writable_gpr_to_value_regs(ctx, expr0_0)?;
2939     let expr7_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs {
2940         inst1: expr3_0,
2941         inst2: expr5_0,
2942         result: expr6_0,
2943     };
2944     return Some(expr7_0);
2945 }
2946 
2947 // Generated as internal constructor for term cmove_or_xmm.
2948 pub fn constructor_cmove_or_xmm<C: Context>(
2949     ctx: &mut C,
2950     arg0: Type,
2951     arg1: &CC,
2952     arg2: &CC,
2953     arg3: &XmmMem,
2954     arg4: Xmm,
2955 ) -> Option<ConsumesFlags> {
2956     let pattern0_0 = arg0;
2957     let pattern1_0 = arg1;
2958     let pattern2_0 = arg2;
2959     let pattern3_0 = arg3;
2960     let pattern4_0 = arg4;
2961     // Rule at src/isa/x64/inst.isle line 1919.
2962     let expr0_0 = C::temp_writable_xmm(ctx);
2963     let expr1_0 = C::temp_writable_xmm(ctx);
2964     let expr2_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
2965     let expr3_0 = MInst::XmmCmove {
2966         size: expr2_0,
2967         cc: pattern1_0.clone(),
2968         consequent: pattern3_0.clone(),
2969         alternative: pattern4_0,
2970         dst: expr1_0,
2971     };
2972     let expr4_0 = C::writable_xmm_to_xmm(ctx, expr1_0);
2973     let expr5_0 = MInst::XmmCmove {
2974         size: expr2_0,
2975         cc: pattern2_0.clone(),
2976         consequent: pattern3_0.clone(),
2977         alternative: expr4_0,
2978         dst: expr0_0,
2979     };
2980     let expr6_0 = constructor_writable_xmm_to_value_regs(ctx, expr0_0)?;
2981     let expr7_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs {
2982         inst1: expr3_0,
2983         inst2: expr5_0,
2984         result: expr6_0,
2985     };
2986     return Some(expr7_0);
2987 }
2988 
2989 // Generated as internal constructor for term cmove_or_from_values.
2990 pub fn constructor_cmove_or_from_values<C: Context>(
2991     ctx: &mut C,
2992     arg0: Type,
2993     arg1: &CC,
2994     arg2: &CC,
2995     arg3: Value,
2996     arg4: Value,
2997 ) -> Option<ConsumesFlags> {
2998     let pattern0_0 = arg0;
2999     if pattern0_0 == I128 {
3000         let pattern2_0 = arg1;
3001         let pattern3_0 = arg2;
3002         let pattern4_0 = arg3;
3003         let pattern5_0 = arg4;
3004         // Rule at src/isa/x64/inst.isle line 1934.
3005         let expr0_0 = C::put_in_regs(ctx, pattern4_0);
3006         let expr1_0 = C::put_in_regs(ctx, pattern5_0);
3007         let expr2_0 = C::temp_writable_gpr(ctx);
3008         let expr3_0 = C::temp_writable_gpr(ctx);
3009         let expr4_0 = C::temp_writable_gpr(ctx);
3010         let expr5_0 = C::temp_writable_gpr(ctx);
3011         let expr6_0 = OperandSize::Size64;
3012         let expr7_0: usize = 0;
3013         let expr8_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr7_0)?;
3014         let expr9_0 = C::gpr_to_gpr_mem(ctx, expr8_0);
3015         let expr10_0: usize = 0;
3016         let expr11_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr10_0)?;
3017         let expr12_0 = MInst::Cmove {
3018             size: expr6_0,
3019             cc: pattern2_0.clone(),
3020             consequent: expr9_0,
3021             alternative: expr11_0,
3022             dst: expr4_0,
3023         };
3024         let expr13_0: usize = 0;
3025         let expr14_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr13_0)?;
3026         let expr15_0 = C::gpr_to_gpr_mem(ctx, expr14_0);
3027         let expr16_0 = C::writable_gpr_to_gpr(ctx, expr4_0);
3028         let expr17_0 = MInst::Cmove {
3029             size: expr6_0,
3030             cc: pattern3_0.clone(),
3031             consequent: expr15_0,
3032             alternative: expr16_0,
3033             dst: expr2_0,
3034         };
3035         let expr18_0: usize = 1;
3036         let expr19_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr18_0)?;
3037         let expr20_0 = C::gpr_to_gpr_mem(ctx, expr19_0);
3038         let expr21_0: usize = 1;
3039         let expr22_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr21_0)?;
3040         let expr23_0 = MInst::Cmove {
3041             size: expr6_0,
3042             cc: pattern2_0.clone(),
3043             consequent: expr20_0,
3044             alternative: expr22_0,
3045             dst: expr5_0,
3046         };
3047         let expr24_0: usize = 1;
3048         let expr25_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr24_0)?;
3049         let expr26_0 = C::gpr_to_gpr_mem(ctx, expr25_0);
3050         let expr27_0 = C::writable_gpr_to_gpr(ctx, expr5_0);
3051         let expr28_0 = MInst::Cmove {
3052             size: expr6_0,
3053             cc: pattern3_0.clone(),
3054             consequent: expr26_0,
3055             alternative: expr27_0,
3056             dst: expr3_0,
3057         };
3058         let expr29_0 = constructor_writable_gpr_to_r_reg(ctx, expr2_0)?;
3059         let expr30_0 = constructor_writable_gpr_to_r_reg(ctx, expr3_0)?;
3060         let expr31_0 = C::value_regs(ctx, expr29_0, expr30_0);
3061         let expr32_0 = ConsumesFlags::ConsumesFlagsFourTimesReturnsValueRegs {
3062             inst1: expr12_0,
3063             inst2: expr17_0,
3064             inst3: expr23_0,
3065             inst4: expr28_0,
3066             result: expr31_0,
3067         };
3068         return Some(expr32_0);
3069     }
3070     if let Some(pattern1_0) = C::is_xmm_type(ctx, pattern0_0) {
3071         if let Some(pattern2_0) = C::is_single_register_type(ctx, pattern1_0) {
3072             let pattern3_0 = arg1;
3073             let pattern4_0 = arg2;
3074             let pattern5_0 = arg3;
3075             let pattern6_0 = arg4;
3076             // Rule at src/isa/x64/inst.isle line 1956.
3077             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_0)?;
3078             let expr1_0 = constructor_put_in_xmm(ctx, pattern6_0)?;
3079             let expr2_0 = constructor_cmove_or_xmm(
3080                 ctx, pattern2_0, pattern3_0, pattern4_0, &expr0_0, expr1_0,
3081             )?;
3082             return Some(expr2_0);
3083         }
3084     }
3085     if let Some(pattern1_0) = C::is_gpr_type(ctx, pattern0_0) {
3086         if let Some(pattern2_0) = C::is_single_register_type(ctx, pattern1_0) {
3087             let pattern3_0 = arg1;
3088             let pattern4_0 = arg2;
3089             let pattern5_0 = arg3;
3090             let pattern6_0 = arg4;
3091             // Rule at src/isa/x64/inst.isle line 1953.
3092             let expr0_0 = constructor_put_in_gpr_mem(ctx, pattern5_0)?;
3093             let expr1_0 = constructor_put_in_gpr(ctx, pattern6_0)?;
3094             let expr2_0 =
3095                 constructor_cmove_or(ctx, pattern2_0, pattern3_0, pattern4_0, &expr0_0, expr1_0)?;
3096             return Some(expr2_0);
3097         }
3098     }
3099     return None;
3100 }
3101 
3102 // Generated as internal constructor for term x64_setcc.
3103 pub fn constructor_x64_setcc<C: Context>(ctx: &mut C, arg0: &CC) -> Option<ConsumesFlags> {
3104     let pattern0_0 = arg0;
3105     // Rule at src/isa/x64/inst.isle line 1961.
3106     let expr0_0 = C::temp_writable_gpr(ctx);
3107     let expr1_0 = MInst::Setcc {
3108         cc: pattern0_0.clone(),
3109         dst: expr0_0,
3110     };
3111     let expr2_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
3112     let expr3_0 = ConsumesFlags::ConsumesFlagsReturnsReg {
3113         inst: expr1_0,
3114         result: expr2_0,
3115     };
3116     return Some(expr3_0);
3117 }
3118 
3119 // Generated as internal constructor for term xmm_rm_r.
3120 pub fn constructor_xmm_rm_r<C: Context>(
3121     ctx: &mut C,
3122     arg0: Type,
3123     arg1: &SseOpcode,
3124     arg2: Xmm,
3125     arg3: &XmmMem,
3126 ) -> Option<Xmm> {
3127     let pattern0_0 = arg0;
3128     let pattern1_0 = arg1;
3129     let pattern2_0 = arg2;
3130     let pattern3_0 = arg3;
3131     // Rule at src/isa/x64/inst.isle line 1969.
3132     let expr0_0 = C::temp_writable_xmm(ctx);
3133     let expr1_0 = MInst::XmmRmR {
3134         op: pattern1_0.clone(),
3135         src1: pattern2_0,
3136         src2: pattern3_0.clone(),
3137         dst: expr0_0,
3138     };
3139     let expr2_0 = C::emit(ctx, &expr1_0);
3140     let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
3141     return Some(expr3_0);
3142 }
3143 
3144 // Generated as internal constructor for term x64_paddb.
3145 pub fn constructor_x64_paddb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3146     let pattern0_0 = arg0;
3147     let pattern1_0 = arg1;
3148     // Rule at src/isa/x64/inst.isle line 1976.
3149     let expr0_0: Type = I8X16;
3150     let expr1_0 = SseOpcode::Paddb;
3151     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3152     return Some(expr2_0);
3153 }
3154 
3155 // Generated as internal constructor for term x64_paddw.
3156 pub fn constructor_x64_paddw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3157     let pattern0_0 = arg0;
3158     let pattern1_0 = arg1;
3159     // Rule at src/isa/x64/inst.isle line 1981.
3160     let expr0_0: Type = I16X8;
3161     let expr1_0 = SseOpcode::Paddw;
3162     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3163     return Some(expr2_0);
3164 }
3165 
3166 // Generated as internal constructor for term x64_paddd.
3167 pub fn constructor_x64_paddd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3168     let pattern0_0 = arg0;
3169     let pattern1_0 = arg1;
3170     // Rule at src/isa/x64/inst.isle line 1986.
3171     let expr0_0: Type = I32X4;
3172     let expr1_0 = SseOpcode::Paddd;
3173     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3174     return Some(expr2_0);
3175 }
3176 
3177 // Generated as internal constructor for term x64_paddq.
3178 pub fn constructor_x64_paddq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3179     let pattern0_0 = arg0;
3180     let pattern1_0 = arg1;
3181     // Rule at src/isa/x64/inst.isle line 1991.
3182     let expr0_0: Type = I64X2;
3183     let expr1_0 = SseOpcode::Paddq;
3184     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3185     return Some(expr2_0);
3186 }
3187 
3188 // Generated as internal constructor for term x64_paddsb.
3189 pub fn constructor_x64_paddsb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3190     let pattern0_0 = arg0;
3191     let pattern1_0 = arg1;
3192     // Rule at src/isa/x64/inst.isle line 1996.
3193     let expr0_0: Type = I8X16;
3194     let expr1_0 = SseOpcode::Paddsb;
3195     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3196     return Some(expr2_0);
3197 }
3198 
3199 // Generated as internal constructor for term x64_paddsw.
3200 pub fn constructor_x64_paddsw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3201     let pattern0_0 = arg0;
3202     let pattern1_0 = arg1;
3203     // Rule at src/isa/x64/inst.isle line 2001.
3204     let expr0_0: Type = I16X8;
3205     let expr1_0 = SseOpcode::Paddsw;
3206     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3207     return Some(expr2_0);
3208 }
3209 
3210 // Generated as internal constructor for term x64_paddusb.
3211 pub fn constructor_x64_paddusb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3212     let pattern0_0 = arg0;
3213     let pattern1_0 = arg1;
3214     // Rule at src/isa/x64/inst.isle line 2006.
3215     let expr0_0: Type = I8X16;
3216     let expr1_0 = SseOpcode::Paddusb;
3217     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3218     return Some(expr2_0);
3219 }
3220 
3221 // Generated as internal constructor for term x64_paddusw.
3222 pub fn constructor_x64_paddusw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3223     let pattern0_0 = arg0;
3224     let pattern1_0 = arg1;
3225     // Rule at src/isa/x64/inst.isle line 2011.
3226     let expr0_0: Type = I16X8;
3227     let expr1_0 = SseOpcode::Paddusw;
3228     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3229     return Some(expr2_0);
3230 }
3231 
3232 // Generated as internal constructor for term x64_psubb.
3233 pub fn constructor_x64_psubb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3234     let pattern0_0 = arg0;
3235     let pattern1_0 = arg1;
3236     // Rule at src/isa/x64/inst.isle line 2016.
3237     let expr0_0: Type = I8X16;
3238     let expr1_0 = SseOpcode::Psubb;
3239     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3240     return Some(expr2_0);
3241 }
3242 
3243 // Generated as internal constructor for term x64_psubw.
3244 pub fn constructor_x64_psubw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3245     let pattern0_0 = arg0;
3246     let pattern1_0 = arg1;
3247     // Rule at src/isa/x64/inst.isle line 2021.
3248     let expr0_0: Type = I16X8;
3249     let expr1_0 = SseOpcode::Psubw;
3250     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3251     return Some(expr2_0);
3252 }
3253 
3254 // Generated as internal constructor for term x64_psubd.
3255 pub fn constructor_x64_psubd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3256     let pattern0_0 = arg0;
3257     let pattern1_0 = arg1;
3258     // Rule at src/isa/x64/inst.isle line 2026.
3259     let expr0_0: Type = I32X4;
3260     let expr1_0 = SseOpcode::Psubd;
3261     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3262     return Some(expr2_0);
3263 }
3264 
3265 // Generated as internal constructor for term x64_psubq.
3266 pub fn constructor_x64_psubq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3267     let pattern0_0 = arg0;
3268     let pattern1_0 = arg1;
3269     // Rule at src/isa/x64/inst.isle line 2031.
3270     let expr0_0: Type = I64X2;
3271     let expr1_0 = SseOpcode::Psubq;
3272     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3273     return Some(expr2_0);
3274 }
3275 
3276 // Generated as internal constructor for term x64_psubsb.
3277 pub fn constructor_x64_psubsb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3278     let pattern0_0 = arg0;
3279     let pattern1_0 = arg1;
3280     // Rule at src/isa/x64/inst.isle line 2036.
3281     let expr0_0: Type = I8X16;
3282     let expr1_0 = SseOpcode::Psubsb;
3283     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3284     return Some(expr2_0);
3285 }
3286 
3287 // Generated as internal constructor for term x64_psubsw.
3288 pub fn constructor_x64_psubsw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3289     let pattern0_0 = arg0;
3290     let pattern1_0 = arg1;
3291     // Rule at src/isa/x64/inst.isle line 2041.
3292     let expr0_0: Type = I16X8;
3293     let expr1_0 = SseOpcode::Psubsw;
3294     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3295     return Some(expr2_0);
3296 }
3297 
3298 // Generated as internal constructor for term x64_psubusb.
3299 pub fn constructor_x64_psubusb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3300     let pattern0_0 = arg0;
3301     let pattern1_0 = arg1;
3302     // Rule at src/isa/x64/inst.isle line 2046.
3303     let expr0_0: Type = I8X16;
3304     let expr1_0 = SseOpcode::Psubusb;
3305     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3306     return Some(expr2_0);
3307 }
3308 
3309 // Generated as internal constructor for term x64_psubusw.
3310 pub fn constructor_x64_psubusw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3311     let pattern0_0 = arg0;
3312     let pattern1_0 = arg1;
3313     // Rule at src/isa/x64/inst.isle line 2051.
3314     let expr0_0: Type = I16X8;
3315     let expr1_0 = SseOpcode::Psubusw;
3316     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3317     return Some(expr2_0);
3318 }
3319 
3320 // Generated as internal constructor for term x64_pavgb.
3321 pub fn constructor_x64_pavgb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3322     let pattern0_0 = arg0;
3323     let pattern1_0 = arg1;
3324     // Rule at src/isa/x64/inst.isle line 2056.
3325     let expr0_0: Type = I8X16;
3326     let expr1_0 = SseOpcode::Pavgb;
3327     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3328     return Some(expr2_0);
3329 }
3330 
3331 // Generated as internal constructor for term x64_pavgw.
3332 pub fn constructor_x64_pavgw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3333     let pattern0_0 = arg0;
3334     let pattern1_0 = arg1;
3335     // Rule at src/isa/x64/inst.isle line 2061.
3336     let expr0_0: Type = I16X8;
3337     let expr1_0 = SseOpcode::Pavgw;
3338     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3339     return Some(expr2_0);
3340 }
3341 
3342 // Generated as internal constructor for term x64_pand.
3343 pub fn constructor_x64_pand<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3344     let pattern0_0 = arg0;
3345     let pattern1_0 = arg1;
3346     // Rule at src/isa/x64/inst.isle line 2066.
3347     let expr0_0: Type = F32X4;
3348     let expr1_0 = SseOpcode::Pand;
3349     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3350     return Some(expr2_0);
3351 }
3352 
3353 // Generated as internal constructor for term x64_andps.
3354 pub fn constructor_x64_andps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3355     let pattern0_0 = arg0;
3356     let pattern1_0 = arg1;
3357     // Rule at src/isa/x64/inst.isle line 2071.
3358     let expr0_0: Type = F32X4;
3359     let expr1_0 = SseOpcode::Andps;
3360     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3361     return Some(expr2_0);
3362 }
3363 
3364 // Generated as internal constructor for term x64_andpd.
3365 pub fn constructor_x64_andpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3366     let pattern0_0 = arg0;
3367     let pattern1_0 = arg1;
3368     // Rule at src/isa/x64/inst.isle line 2076.
3369     let expr0_0: Type = F64X2;
3370     let expr1_0 = SseOpcode::Andpd;
3371     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3372     return Some(expr2_0);
3373 }
3374 
3375 // Generated as internal constructor for term x64_por.
3376 pub fn constructor_x64_por<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3377     let pattern0_0 = arg0;
3378     let pattern1_0 = arg1;
3379     // Rule at src/isa/x64/inst.isle line 2081.
3380     let expr0_0: Type = F32X4;
3381     let expr1_0 = SseOpcode::Por;
3382     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3383     return Some(expr2_0);
3384 }
3385 
3386 // Generated as internal constructor for term x64_orps.
3387 pub fn constructor_x64_orps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3388     let pattern0_0 = arg0;
3389     let pattern1_0 = arg1;
3390     // Rule at src/isa/x64/inst.isle line 2086.
3391     let expr0_0: Type = F32X4;
3392     let expr1_0 = SseOpcode::Orps;
3393     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3394     return Some(expr2_0);
3395 }
3396 
3397 // Generated as internal constructor for term x64_orpd.
3398 pub fn constructor_x64_orpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3399     let pattern0_0 = arg0;
3400     let pattern1_0 = arg1;
3401     // Rule at src/isa/x64/inst.isle line 2091.
3402     let expr0_0: Type = F64X2;
3403     let expr1_0 = SseOpcode::Orpd;
3404     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3405     return Some(expr2_0);
3406 }
3407 
3408 // Generated as internal constructor for term x64_pxor.
3409 pub fn constructor_x64_pxor<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3410     let pattern0_0 = arg0;
3411     let pattern1_0 = arg1;
3412     // Rule at src/isa/x64/inst.isle line 2096.
3413     let expr0_0: Type = I8X16;
3414     let expr1_0 = SseOpcode::Pxor;
3415     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3416     return Some(expr2_0);
3417 }
3418 
3419 // Generated as internal constructor for term x64_xorps.
3420 pub fn constructor_x64_xorps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3421     let pattern0_0 = arg0;
3422     let pattern1_0 = arg1;
3423     // Rule at src/isa/x64/inst.isle line 2101.
3424     let expr0_0: Type = F32X4;
3425     let expr1_0 = SseOpcode::Xorps;
3426     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3427     return Some(expr2_0);
3428 }
3429 
3430 // Generated as internal constructor for term x64_xorpd.
3431 pub fn constructor_x64_xorpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3432     let pattern0_0 = arg0;
3433     let pattern1_0 = arg1;
3434     // Rule at src/isa/x64/inst.isle line 2106.
3435     let expr0_0: Type = F64X2;
3436     let expr1_0 = SseOpcode::Xorpd;
3437     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3438     return Some(expr2_0);
3439 }
3440 
3441 // Generated as internal constructor for term x64_pmullw.
3442 pub fn constructor_x64_pmullw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3443     let pattern0_0 = arg0;
3444     let pattern1_0 = arg1;
3445     // Rule at src/isa/x64/inst.isle line 2111.
3446     let expr0_0: Type = I16X8;
3447     let expr1_0 = SseOpcode::Pmullw;
3448     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3449     return Some(expr2_0);
3450 }
3451 
3452 // Generated as internal constructor for term x64_pmulld.
3453 pub fn constructor_x64_pmulld<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3454     let pattern0_0 = arg0;
3455     let pattern1_0 = arg1;
3456     // Rule at src/isa/x64/inst.isle line 2116.
3457     let expr0_0: Type = I16X8;
3458     let expr1_0 = SseOpcode::Pmulld;
3459     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3460     return Some(expr2_0);
3461 }
3462 
3463 // Generated as internal constructor for term x64_pmulhw.
3464 pub fn constructor_x64_pmulhw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3465     let pattern0_0 = arg0;
3466     let pattern1_0 = arg1;
3467     // Rule at src/isa/x64/inst.isle line 2121.
3468     let expr0_0: Type = I16X8;
3469     let expr1_0 = SseOpcode::Pmulhw;
3470     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3471     return Some(expr2_0);
3472 }
3473 
3474 // Generated as internal constructor for term x64_pmulhuw.
3475 pub fn constructor_x64_pmulhuw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3476     let pattern0_0 = arg0;
3477     let pattern1_0 = arg1;
3478     // Rule at src/isa/x64/inst.isle line 2126.
3479     let expr0_0: Type = I16X8;
3480     let expr1_0 = SseOpcode::Pmulhuw;
3481     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3482     return Some(expr2_0);
3483 }
3484 
3485 // Generated as internal constructor for term x64_pmuldq.
3486 pub fn constructor_x64_pmuldq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3487     let pattern0_0 = arg0;
3488     let pattern1_0 = arg1;
3489     // Rule at src/isa/x64/inst.isle line 2131.
3490     let expr0_0: Type = I16X8;
3491     let expr1_0 = SseOpcode::Pmuldq;
3492     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3493     return Some(expr2_0);
3494 }
3495 
3496 // Generated as internal constructor for term x64_pmuludq.
3497 pub fn constructor_x64_pmuludq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3498     let pattern0_0 = arg0;
3499     let pattern1_0 = arg1;
3500     // Rule at src/isa/x64/inst.isle line 2136.
3501     let expr0_0: Type = I64X2;
3502     let expr1_0 = SseOpcode::Pmuludq;
3503     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3504     return Some(expr2_0);
3505 }
3506 
3507 // Generated as internal constructor for term x64_punpckhwd.
3508 pub fn constructor_x64_punpckhwd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3509     let pattern0_0 = arg0;
3510     let pattern1_0 = arg1;
3511     // Rule at src/isa/x64/inst.isle line 2141.
3512     let expr0_0: Type = I16X8;
3513     let expr1_0 = SseOpcode::Punpckhwd;
3514     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3515     return Some(expr2_0);
3516 }
3517 
3518 // Generated as internal constructor for term x64_punpcklwd.
3519 pub fn constructor_x64_punpcklwd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3520     let pattern0_0 = arg0;
3521     let pattern1_0 = arg1;
3522     // Rule at src/isa/x64/inst.isle line 2146.
3523     let expr0_0: Type = I16X8;
3524     let expr1_0 = SseOpcode::Punpcklwd;
3525     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3526     return Some(expr2_0);
3527 }
3528 
3529 // Generated as internal constructor for term x64_andnps.
3530 pub fn constructor_x64_andnps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3531     let pattern0_0 = arg0;
3532     let pattern1_0 = arg1;
3533     // Rule at src/isa/x64/inst.isle line 2151.
3534     let expr0_0: Type = F32X4;
3535     let expr1_0 = SseOpcode::Andnps;
3536     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3537     return Some(expr2_0);
3538 }
3539 
3540 // Generated as internal constructor for term x64_andnpd.
3541 pub fn constructor_x64_andnpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3542     let pattern0_0 = arg0;
3543     let pattern1_0 = arg1;
3544     // Rule at src/isa/x64/inst.isle line 2156.
3545     let expr0_0: Type = F64X2;
3546     let expr1_0 = SseOpcode::Andnpd;
3547     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3548     return Some(expr2_0);
3549 }
3550 
3551 // Generated as internal constructor for term x64_pandn.
3552 pub fn constructor_x64_pandn<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3553     let pattern0_0 = arg0;
3554     let pattern1_0 = arg1;
3555     // Rule at src/isa/x64/inst.isle line 2161.
3556     let expr0_0: Type = F64X2;
3557     let expr1_0 = SseOpcode::Pandn;
3558     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3559     return Some(expr2_0);
3560 }
3561 
3562 // Generated as internal constructor for term x64_addss.
3563 pub fn constructor_x64_addss<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3564     let pattern0_0 = arg0;
3565     let pattern1_0 = arg1;
3566     // Rule at src/isa/x64/inst.isle line 2166.
3567     let expr0_0: Type = F32;
3568     let expr1_0 = SseOpcode::Addss;
3569     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3570     return Some(expr2_0);
3571 }
3572 
3573 // Generated as internal constructor for term x64_addsd.
3574 pub fn constructor_x64_addsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3575     let pattern0_0 = arg0;
3576     let pattern1_0 = arg1;
3577     // Rule at src/isa/x64/inst.isle line 2171.
3578     let expr0_0: Type = F64;
3579     let expr1_0 = SseOpcode::Addsd;
3580     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3581     return Some(expr2_0);
3582 }
3583 
3584 // Generated as internal constructor for term x64_addps.
3585 pub fn constructor_x64_addps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3586     let pattern0_0 = arg0;
3587     let pattern1_0 = arg1;
3588     // Rule at src/isa/x64/inst.isle line 2176.
3589     let expr0_0: Type = F32;
3590     let expr1_0 = SseOpcode::Addps;
3591     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3592     return Some(expr2_0);
3593 }
3594 
3595 // Generated as internal constructor for term x64_addpd.
3596 pub fn constructor_x64_addpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3597     let pattern0_0 = arg0;
3598     let pattern1_0 = arg1;
3599     // Rule at src/isa/x64/inst.isle line 2181.
3600     let expr0_0: Type = F32;
3601     let expr1_0 = SseOpcode::Addpd;
3602     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3603     return Some(expr2_0);
3604 }
3605 
3606 // Generated as internal constructor for term x64_subss.
3607 pub fn constructor_x64_subss<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3608     let pattern0_0 = arg0;
3609     let pattern1_0 = arg1;
3610     // Rule at src/isa/x64/inst.isle line 2186.
3611     let expr0_0: Type = F32;
3612     let expr1_0 = SseOpcode::Subss;
3613     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3614     return Some(expr2_0);
3615 }
3616 
3617 // Generated as internal constructor for term x64_subsd.
3618 pub fn constructor_x64_subsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3619     let pattern0_0 = arg0;
3620     let pattern1_0 = arg1;
3621     // Rule at src/isa/x64/inst.isle line 2191.
3622     let expr0_0: Type = F64;
3623     let expr1_0 = SseOpcode::Subsd;
3624     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3625     return Some(expr2_0);
3626 }
3627 
3628 // Generated as internal constructor for term x64_subps.
3629 pub fn constructor_x64_subps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3630     let pattern0_0 = arg0;
3631     let pattern1_0 = arg1;
3632     // Rule at src/isa/x64/inst.isle line 2196.
3633     let expr0_0: Type = F32;
3634     let expr1_0 = SseOpcode::Subps;
3635     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3636     return Some(expr2_0);
3637 }
3638 
3639 // Generated as internal constructor for term x64_subpd.
3640 pub fn constructor_x64_subpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3641     let pattern0_0 = arg0;
3642     let pattern1_0 = arg1;
3643     // Rule at src/isa/x64/inst.isle line 2201.
3644     let expr0_0: Type = F32;
3645     let expr1_0 = SseOpcode::Subpd;
3646     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3647     return Some(expr2_0);
3648 }
3649 
3650 // Generated as internal constructor for term x64_mulss.
3651 pub fn constructor_x64_mulss<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3652     let pattern0_0 = arg0;
3653     let pattern1_0 = arg1;
3654     // Rule at src/isa/x64/inst.isle line 2206.
3655     let expr0_0: Type = F32;
3656     let expr1_0 = SseOpcode::Mulss;
3657     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3658     return Some(expr2_0);
3659 }
3660 
3661 // Generated as internal constructor for term x64_mulsd.
3662 pub fn constructor_x64_mulsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3663     let pattern0_0 = arg0;
3664     let pattern1_0 = arg1;
3665     // Rule at src/isa/x64/inst.isle line 2211.
3666     let expr0_0: Type = F64;
3667     let expr1_0 = SseOpcode::Mulsd;
3668     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3669     return Some(expr2_0);
3670 }
3671 
3672 // Generated as internal constructor for term x64_mulps.
3673 pub fn constructor_x64_mulps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3674     let pattern0_0 = arg0;
3675     let pattern1_0 = arg1;
3676     // Rule at src/isa/x64/inst.isle line 2216.
3677     let expr0_0: Type = F32;
3678     let expr1_0 = SseOpcode::Mulps;
3679     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3680     return Some(expr2_0);
3681 }
3682 
3683 // Generated as internal constructor for term x64_mulpd.
3684 pub fn constructor_x64_mulpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3685     let pattern0_0 = arg0;
3686     let pattern1_0 = arg1;
3687     // Rule at src/isa/x64/inst.isle line 2221.
3688     let expr0_0: Type = F32;
3689     let expr1_0 = SseOpcode::Mulpd;
3690     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3691     return Some(expr2_0);
3692 }
3693 
3694 // Generated as internal constructor for term x64_divss.
3695 pub fn constructor_x64_divss<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3696     let pattern0_0 = arg0;
3697     let pattern1_0 = arg1;
3698     // Rule at src/isa/x64/inst.isle line 2226.
3699     let expr0_0: Type = F32;
3700     let expr1_0 = SseOpcode::Divss;
3701     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3702     return Some(expr2_0);
3703 }
3704 
3705 // Generated as internal constructor for term x64_divsd.
3706 pub fn constructor_x64_divsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3707     let pattern0_0 = arg0;
3708     let pattern1_0 = arg1;
3709     // Rule at src/isa/x64/inst.isle line 2231.
3710     let expr0_0: Type = F64;
3711     let expr1_0 = SseOpcode::Divsd;
3712     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3713     return Some(expr2_0);
3714 }
3715 
3716 // Generated as internal constructor for term x64_divps.
3717 pub fn constructor_x64_divps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3718     let pattern0_0 = arg0;
3719     let pattern1_0 = arg1;
3720     // Rule at src/isa/x64/inst.isle line 2236.
3721     let expr0_0: Type = F32;
3722     let expr1_0 = SseOpcode::Divps;
3723     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3724     return Some(expr2_0);
3725 }
3726 
3727 // Generated as internal constructor for term x64_divpd.
3728 pub fn constructor_x64_divpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3729     let pattern0_0 = arg0;
3730     let pattern1_0 = arg1;
3731     // Rule at src/isa/x64/inst.isle line 2241.
3732     let expr0_0: Type = F32;
3733     let expr1_0 = SseOpcode::Divpd;
3734     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3735     return Some(expr2_0);
3736 }
3737 
3738 // Generated as internal constructor for term sse_blend_op.
3739 pub fn constructor_sse_blend_op<C: Context>(ctx: &mut C, arg0: Type) -> Option<SseOpcode> {
3740     let pattern0_0 = arg0;
3741     if pattern0_0 == F32X4 {
3742         // Rule at src/isa/x64/inst.isle line 2245.
3743         let expr0_0 = SseOpcode::Blendvps;
3744         return Some(expr0_0);
3745     }
3746     if pattern0_0 == F64X2 {
3747         // Rule at src/isa/x64/inst.isle line 2246.
3748         let expr0_0 = SseOpcode::Blendvpd;
3749         return Some(expr0_0);
3750     }
3751     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
3752         // Rule at src/isa/x64/inst.isle line 2247.
3753         let expr0_0 = SseOpcode::Pblendvb;
3754         return Some(expr0_0);
3755     }
3756     return None;
3757 }
3758 
3759 // Generated as internal constructor for term sse_mov_op.
3760 pub fn constructor_sse_mov_op<C: Context>(ctx: &mut C, arg0: Type) -> Option<SseOpcode> {
3761     let pattern0_0 = arg0;
3762     if pattern0_0 == F32X4 {
3763         // Rule at src/isa/x64/inst.isle line 2250.
3764         let expr0_0 = SseOpcode::Movaps;
3765         return Some(expr0_0);
3766     }
3767     if pattern0_0 == F64X2 {
3768         // Rule at src/isa/x64/inst.isle line 2251.
3769         let expr0_0 = SseOpcode::Movapd;
3770         return Some(expr0_0);
3771     }
3772     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
3773         // Rule at src/isa/x64/inst.isle line 2252.
3774         let expr0_0 = SseOpcode::Movdqa;
3775         return Some(expr0_0);
3776     }
3777     return None;
3778 }
3779 
3780 // Generated as internal constructor for term x64_blend.
3781 pub fn constructor_x64_blend<C: Context>(
3782     ctx: &mut C,
3783     arg0: Type,
3784     arg1: &XmmMem,
3785     arg2: &XmmMem,
3786     arg3: Xmm,
3787 ) -> Option<Xmm> {
3788     let pattern0_0 = arg0;
3789     let pattern1_0 = arg1;
3790     let pattern2_0 = arg2;
3791     let pattern3_0 = arg3;
3792     // Rule at src/isa/x64/inst.isle line 2256.
3793     let expr0_0 = C::xmm0(ctx);
3794     let expr1_0 = constructor_sse_mov_op(ctx, pattern0_0)?;
3795     let expr2_0 = MInst::XmmUnaryRmR {
3796         op: expr1_0,
3797         src: pattern1_0.clone(),
3798         dst: expr0_0,
3799     };
3800     let expr3_0 = C::emit(ctx, &expr2_0);
3801     let expr4_0 = constructor_sse_blend_op(ctx, pattern0_0)?;
3802     let expr5_0 = constructor_xmm_rm_r(ctx, pattern0_0, &expr4_0, pattern3_0, pattern2_0)?;
3803     return Some(expr5_0);
3804 }
3805 
3806 // Generated as internal constructor for term x64_blendvpd.
3807 pub fn constructor_x64_blendvpd<C: Context>(
3808     ctx: &mut C,
3809     arg0: Xmm,
3810     arg1: &XmmMem,
3811     arg2: Xmm,
3812 ) -> Option<Xmm> {
3813     let pattern0_0 = arg0;
3814     let pattern1_0 = arg1;
3815     let pattern2_0 = arg2;
3816     // Rule at src/isa/x64/inst.isle line 2270.
3817     let expr0_0 = C::xmm0(ctx);
3818     let expr1_0 = SseOpcode::Movapd;
3819     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern2_0);
3820     let expr3_0 = MInst::XmmUnaryRmR {
3821         op: expr1_0,
3822         src: expr2_0,
3823         dst: expr0_0,
3824     };
3825     let expr4_0 = C::emit(ctx, &expr3_0);
3826     let expr5_0: Type = F64X2;
3827     let expr6_0 = SseOpcode::Blendvpd;
3828     let expr7_0 = constructor_xmm_rm_r(ctx, expr5_0, &expr6_0, pattern0_0, pattern1_0)?;
3829     return Some(expr7_0);
3830 }
3831 
3832 // Generated as internal constructor for term x64_movsd_regmove.
3833 pub fn constructor_x64_movsd_regmove<C: Context>(
3834     ctx: &mut C,
3835     arg0: Xmm,
3836     arg1: &XmmMem,
3837 ) -> Option<Xmm> {
3838     let pattern0_0 = arg0;
3839     let pattern1_0 = arg1;
3840     // Rule at src/isa/x64/inst.isle line 2284.
3841     let expr0_0: Type = I8X16;
3842     let expr1_0 = SseOpcode::Movsd;
3843     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3844     return Some(expr2_0);
3845 }
3846 
3847 // Generated as internal constructor for term x64_movlhps.
3848 pub fn constructor_x64_movlhps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3849     let pattern0_0 = arg0;
3850     let pattern1_0 = arg1;
3851     // Rule at src/isa/x64/inst.isle line 2289.
3852     let expr0_0: Type = I8X16;
3853     let expr1_0 = SseOpcode::Movlhps;
3854     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3855     return Some(expr2_0);
3856 }
3857 
3858 // Generated as internal constructor for term x64_pmaxs.
3859 pub fn constructor_x64_pmaxs<C: Context>(
3860     ctx: &mut C,
3861     arg0: Type,
3862     arg1: Xmm,
3863     arg2: &XmmMem,
3864 ) -> Option<Xmm> {
3865     let pattern0_0 = arg0;
3866     if pattern0_0 == I8X16 {
3867         let pattern2_0 = arg1;
3868         let pattern3_0 = arg2;
3869         // Rule at src/isa/x64/inst.isle line 2294.
3870         let expr0_0 = constructor_x64_pmaxsb(ctx, pattern2_0, pattern3_0)?;
3871         return Some(expr0_0);
3872     }
3873     if pattern0_0 == I16X8 {
3874         let pattern2_0 = arg1;
3875         let pattern3_0 = arg2;
3876         // Rule at src/isa/x64/inst.isle line 2295.
3877         let expr0_0 = constructor_x64_pmaxsw(ctx, pattern2_0, pattern3_0)?;
3878         return Some(expr0_0);
3879     }
3880     if pattern0_0 == I32X4 {
3881         let pattern2_0 = arg1;
3882         let pattern3_0 = arg2;
3883         // Rule at src/isa/x64/inst.isle line 2296.
3884         let expr0_0 = constructor_x64_pmaxsd(ctx, pattern2_0, pattern3_0)?;
3885         return Some(expr0_0);
3886     }
3887     return None;
3888 }
3889 
3890 // Generated as internal constructor for term x64_pmaxsb.
3891 pub fn constructor_x64_pmaxsb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3892     let pattern0_0 = arg0;
3893     let pattern1_0 = arg1;
3894     // Rule at src/isa/x64/inst.isle line 2299.
3895     let expr0_0: Type = I8X16;
3896     let expr1_0 = SseOpcode::Pmaxsb;
3897     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3898     return Some(expr2_0);
3899 }
3900 
3901 // Generated as internal constructor for term x64_pmaxsw.
3902 pub fn constructor_x64_pmaxsw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3903     let pattern0_0 = arg0;
3904     let pattern1_0 = arg1;
3905     // Rule at src/isa/x64/inst.isle line 2301.
3906     let expr0_0: Type = I8X16;
3907     let expr1_0 = SseOpcode::Pmaxsw;
3908     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3909     return Some(expr2_0);
3910 }
3911 
3912 // Generated as internal constructor for term x64_pmaxsd.
3913 pub fn constructor_x64_pmaxsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3914     let pattern0_0 = arg0;
3915     let pattern1_0 = arg1;
3916     // Rule at src/isa/x64/inst.isle line 2303.
3917     let expr0_0: Type = I8X16;
3918     let expr1_0 = SseOpcode::Pmaxsd;
3919     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3920     return Some(expr2_0);
3921 }
3922 
3923 // Generated as internal constructor for term x64_pmins.
3924 pub fn constructor_x64_pmins<C: Context>(
3925     ctx: &mut C,
3926     arg0: Type,
3927     arg1: Xmm,
3928     arg2: &XmmMem,
3929 ) -> Option<Xmm> {
3930     let pattern0_0 = arg0;
3931     if pattern0_0 == I8X16 {
3932         let pattern2_0 = arg1;
3933         let pattern3_0 = arg2;
3934         // Rule at src/isa/x64/inst.isle line 2307.
3935         let expr0_0 = constructor_x64_pminsb(ctx, pattern2_0, pattern3_0)?;
3936         return Some(expr0_0);
3937     }
3938     if pattern0_0 == I16X8 {
3939         let pattern2_0 = arg1;
3940         let pattern3_0 = arg2;
3941         // Rule at src/isa/x64/inst.isle line 2308.
3942         let expr0_0 = constructor_x64_pminsw(ctx, pattern2_0, pattern3_0)?;
3943         return Some(expr0_0);
3944     }
3945     if pattern0_0 == I32X4 {
3946         let pattern2_0 = arg1;
3947         let pattern3_0 = arg2;
3948         // Rule at src/isa/x64/inst.isle line 2309.
3949         let expr0_0 = constructor_x64_pminsd(ctx, pattern2_0, pattern3_0)?;
3950         return Some(expr0_0);
3951     }
3952     return None;
3953 }
3954 
3955 // Generated as internal constructor for term x64_pminsb.
3956 pub fn constructor_x64_pminsb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3957     let pattern0_0 = arg0;
3958     let pattern1_0 = arg1;
3959     // Rule at src/isa/x64/inst.isle line 2312.
3960     let expr0_0: Type = I8X16;
3961     let expr1_0 = SseOpcode::Pminsb;
3962     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3963     return Some(expr2_0);
3964 }
3965 
3966 // Generated as internal constructor for term x64_pminsw.
3967 pub fn constructor_x64_pminsw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3968     let pattern0_0 = arg0;
3969     let pattern1_0 = arg1;
3970     // Rule at src/isa/x64/inst.isle line 2314.
3971     let expr0_0: Type = I16X8;
3972     let expr1_0 = SseOpcode::Pminsw;
3973     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3974     return Some(expr2_0);
3975 }
3976 
3977 // Generated as internal constructor for term x64_pminsd.
3978 pub fn constructor_x64_pminsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
3979     let pattern0_0 = arg0;
3980     let pattern1_0 = arg1;
3981     // Rule at src/isa/x64/inst.isle line 2316.
3982     let expr0_0: Type = I32X4;
3983     let expr1_0 = SseOpcode::Pminsd;
3984     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
3985     return Some(expr2_0);
3986 }
3987 
3988 // Generated as internal constructor for term x64_pmaxu.
3989 pub fn constructor_x64_pmaxu<C: Context>(
3990     ctx: &mut C,
3991     arg0: Type,
3992     arg1: Xmm,
3993     arg2: &XmmMem,
3994 ) -> Option<Xmm> {
3995     let pattern0_0 = arg0;
3996     if pattern0_0 == I8X16 {
3997         let pattern2_0 = arg1;
3998         let pattern3_0 = arg2;
3999         // Rule at src/isa/x64/inst.isle line 2320.
4000         let expr0_0 = constructor_x64_pmaxub(ctx, pattern2_0, pattern3_0)?;
4001         return Some(expr0_0);
4002     }
4003     if pattern0_0 == I16X8 {
4004         let pattern2_0 = arg1;
4005         let pattern3_0 = arg2;
4006         // Rule at src/isa/x64/inst.isle line 2321.
4007         let expr0_0 = constructor_x64_pmaxuw(ctx, pattern2_0, pattern3_0)?;
4008         return Some(expr0_0);
4009     }
4010     if pattern0_0 == I32X4 {
4011         let pattern2_0 = arg1;
4012         let pattern3_0 = arg2;
4013         // Rule at src/isa/x64/inst.isle line 2322.
4014         let expr0_0 = constructor_x64_pmaxud(ctx, pattern2_0, pattern3_0)?;
4015         return Some(expr0_0);
4016     }
4017     return None;
4018 }
4019 
4020 // Generated as internal constructor for term x64_pmaxub.
4021 pub fn constructor_x64_pmaxub<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
4022     let pattern0_0 = arg0;
4023     let pattern1_0 = arg1;
4024     // Rule at src/isa/x64/inst.isle line 2325.
4025     let expr0_0: Type = I8X16;
4026     let expr1_0 = SseOpcode::Pmaxub;
4027     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
4028     return Some(expr2_0);
4029 }
4030 
4031 // Generated as internal constructor for term x64_pmaxuw.
4032 pub fn constructor_x64_pmaxuw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
4033     let pattern0_0 = arg0;
4034     let pattern1_0 = arg1;
4035     // Rule at src/isa/x64/inst.isle line 2327.
4036     let expr0_0: Type = I8X16;
4037     let expr1_0 = SseOpcode::Pmaxuw;
4038     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
4039     return Some(expr2_0);
4040 }
4041 
4042 // Generated as internal constructor for term x64_pmaxud.
4043 pub fn constructor_x64_pmaxud<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
4044     let pattern0_0 = arg0;
4045     let pattern1_0 = arg1;
4046     // Rule at src/isa/x64/inst.isle line 2329.
4047     let expr0_0: Type = I8X16;
4048     let expr1_0 = SseOpcode::Pmaxud;
4049     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
4050     return Some(expr2_0);
4051 }
4052 
4053 // Generated as internal constructor for term x64_pminu.
4054 pub fn constructor_x64_pminu<C: Context>(
4055     ctx: &mut C,
4056     arg0: Type,
4057     arg1: Xmm,
4058     arg2: &XmmMem,
4059 ) -> Option<Xmm> {
4060     let pattern0_0 = arg0;
4061     if pattern0_0 == I8X16 {
4062         let pattern2_0 = arg1;
4063         let pattern3_0 = arg2;
4064         // Rule at src/isa/x64/inst.isle line 2333.
4065         let expr0_0 = constructor_x64_pminub(ctx, pattern2_0, pattern3_0)?;
4066         return Some(expr0_0);
4067     }
4068     if pattern0_0 == I16X8 {
4069         let pattern2_0 = arg1;
4070         let pattern3_0 = arg2;
4071         // Rule at src/isa/x64/inst.isle line 2334.
4072         let expr0_0 = constructor_x64_pminuw(ctx, pattern2_0, pattern3_0)?;
4073         return Some(expr0_0);
4074     }
4075     if pattern0_0 == I32X4 {
4076         let pattern2_0 = arg1;
4077         let pattern3_0 = arg2;
4078         // Rule at src/isa/x64/inst.isle line 2335.
4079         let expr0_0 = constructor_x64_pminud(ctx, pattern2_0, pattern3_0)?;
4080         return Some(expr0_0);
4081     }
4082     return None;
4083 }
4084 
4085 // Generated as internal constructor for term x64_pminub.
4086 pub fn constructor_x64_pminub<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
4087     let pattern0_0 = arg0;
4088     let pattern1_0 = arg1;
4089     // Rule at src/isa/x64/inst.isle line 2338.
4090     let expr0_0: Type = I8X16;
4091     let expr1_0 = SseOpcode::Pminub;
4092     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
4093     return Some(expr2_0);
4094 }
4095 
4096 // Generated as internal constructor for term x64_pminuw.
4097 pub fn constructor_x64_pminuw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
4098     let pattern0_0 = arg0;
4099     let pattern1_0 = arg1;
4100     // Rule at src/isa/x64/inst.isle line 2340.
4101     let expr0_0: Type = I8X16;
4102     let expr1_0 = SseOpcode::Pminuw;
4103     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
4104     return Some(expr2_0);
4105 }
4106 
4107 // Generated as internal constructor for term x64_pminud.
4108 pub fn constructor_x64_pminud<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
4109     let pattern0_0 = arg0;
4110     let pattern1_0 = arg1;
4111     // Rule at src/isa/x64/inst.isle line 2342.
4112     let expr0_0: Type = I8X16;
4113     let expr1_0 = SseOpcode::Pminud;
4114     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
4115     return Some(expr2_0);
4116 }
4117 
4118 // Generated as internal constructor for term x64_punpcklbw.
4119 pub fn constructor_x64_punpcklbw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
4120     let pattern0_0 = arg0;
4121     let pattern1_0 = arg1;
4122     // Rule at src/isa/x64/inst.isle line 2346.
4123     let expr0_0: Type = I8X16;
4124     let expr1_0 = SseOpcode::Punpcklbw;
4125     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
4126     return Some(expr2_0);
4127 }
4128 
4129 // Generated as internal constructor for term x64_punpckhbw.
4130 pub fn constructor_x64_punpckhbw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
4131     let pattern0_0 = arg0;
4132     let pattern1_0 = arg1;
4133     // Rule at src/isa/x64/inst.isle line 2351.
4134     let expr0_0: Type = I8X16;
4135     let expr1_0 = SseOpcode::Punpckhbw;
4136     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
4137     return Some(expr2_0);
4138 }
4139 
4140 // Generated as internal constructor for term x64_packsswb.
4141 pub fn constructor_x64_packsswb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
4142     let pattern0_0 = arg0;
4143     let pattern1_0 = arg1;
4144     // Rule at src/isa/x64/inst.isle line 2356.
4145     let expr0_0: Type = I8X16;
4146     let expr1_0 = SseOpcode::Packsswb;
4147     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
4148     return Some(expr2_0);
4149 }
4150 
4151 // Generated as internal constructor for term xmm_rm_r_imm.
4152 pub fn constructor_xmm_rm_r_imm<C: Context>(
4153     ctx: &mut C,
4154     arg0: &SseOpcode,
4155     arg1: Reg,
4156     arg2: &RegMem,
4157     arg3: u8,
4158     arg4: &OperandSize,
4159 ) -> Option<Xmm> {
4160     let pattern0_0 = arg0;
4161     let pattern1_0 = arg1;
4162     let pattern2_0 = arg2;
4163     let pattern3_0 = arg3;
4164     let pattern4_0 = arg4;
4165     // Rule at src/isa/x64/inst.isle line 2361.
4166     let expr0_0 = C::temp_writable_xmm(ctx);
4167     let expr1_0 = C::writable_xmm_to_reg(ctx, expr0_0);
4168     let expr2_0 = MInst::XmmRmRImm {
4169         op: pattern0_0.clone(),
4170         src1: pattern1_0,
4171         src2: pattern2_0.clone(),
4172         dst: expr1_0,
4173         imm: pattern3_0,
4174         size: pattern4_0.clone(),
4175     };
4176     let expr3_0 = C::emit(ctx, &expr2_0);
4177     let expr4_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4178     return Some(expr4_0);
4179 }
4180 
4181 // Generated as internal constructor for term x64_palignr.
4182 pub fn constructor_x64_palignr<C: Context>(
4183     ctx: &mut C,
4184     arg0: Xmm,
4185     arg1: &XmmMem,
4186     arg2: u8,
4187     arg3: &OperandSize,
4188 ) -> Option<Xmm> {
4189     let pattern0_0 = arg0;
4190     let pattern1_0 = arg1;
4191     let pattern2_0 = arg2;
4192     let pattern3_0 = arg3;
4193     // Rule at src/isa/x64/inst.isle line 2373.
4194     let expr0_0 = SseOpcode::Palignr;
4195     let expr1_0 = C::xmm_to_reg(ctx, pattern0_0);
4196     let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0);
4197     let expr3_0 =
4198         constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, pattern3_0)?;
4199     return Some(expr3_0);
4200 }
4201 
4202 // Generated as internal constructor for term x64_cmpp.
4203 pub fn constructor_x64_cmpp<C: Context>(
4204     ctx: &mut C,
4205     arg0: Type,
4206     arg1: Xmm,
4207     arg2: &XmmMem,
4208     arg3: &FcmpImm,
4209 ) -> Option<Xmm> {
4210     let pattern0_0 = arg0;
4211     if pattern0_0 == F32X4 {
4212         let pattern2_0 = arg1;
4213         let pattern3_0 = arg2;
4214         let pattern4_0 = arg3;
4215         // Rule at src/isa/x64/inst.isle line 2382.
4216         let expr0_0 = constructor_x64_cmpps(ctx, pattern2_0, pattern3_0, pattern4_0)?;
4217         return Some(expr0_0);
4218     }
4219     if pattern0_0 == F64X2 {
4220         let pattern2_0 = arg1;
4221         let pattern3_0 = arg2;
4222         let pattern4_0 = arg3;
4223         // Rule at src/isa/x64/inst.isle line 2383.
4224         let expr0_0 = constructor_x64_cmppd(ctx, pattern2_0, pattern3_0, pattern4_0)?;
4225         return Some(expr0_0);
4226     }
4227     return None;
4228 }
4229 
4230 // Generated as internal constructor for term x64_cmpps.
4231 pub fn constructor_x64_cmpps<C: Context>(
4232     ctx: &mut C,
4233     arg0: Xmm,
4234     arg1: &XmmMem,
4235     arg2: &FcmpImm,
4236 ) -> Option<Xmm> {
4237     let pattern0_0 = arg0;
4238     let pattern1_0 = arg1;
4239     let pattern2_0 = arg2;
4240     // Rule at src/isa/x64/inst.isle line 2386.
4241     let expr0_0 = SseOpcode::Cmpps;
4242     let expr1_0 = C::xmm_to_reg(ctx, pattern0_0);
4243     let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0);
4244     let expr3_0 = C::encode_fcmp_imm(ctx, pattern2_0);
4245     let expr4_0 = OperandSize::Size32;
4246     let expr5_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, expr3_0, &expr4_0)?;
4247     return Some(expr5_0);
4248 }
4249 
4250 // Generated as internal constructor for term x64_cmppd.
4251 pub fn constructor_x64_cmppd<C: Context>(
4252     ctx: &mut C,
4253     arg0: Xmm,
4254     arg1: &XmmMem,
4255     arg2: &FcmpImm,
4256 ) -> Option<Xmm> {
4257     let pattern0_0 = arg0;
4258     let pattern1_0 = arg1;
4259     let pattern2_0 = arg2;
4260     // Rule at src/isa/x64/inst.isle line 2397.
4261     let expr0_0 = SseOpcode::Cmppd;
4262     let expr1_0 = C::xmm_to_reg(ctx, pattern0_0);
4263     let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0);
4264     let expr3_0 = C::encode_fcmp_imm(ctx, pattern2_0);
4265     let expr4_0 = OperandSize::Size32;
4266     let expr5_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, expr3_0, &expr4_0)?;
4267     return Some(expr5_0);
4268 }
4269 
4270 // Generated as internal constructor for term x64_pinsrb.
4271 pub fn constructor_x64_pinsrb<C: Context>(
4272     ctx: &mut C,
4273     arg0: Xmm,
4274     arg1: &GprMem,
4275     arg2: u8,
4276 ) -> Option<Xmm> {
4277     let pattern0_0 = arg0;
4278     let pattern1_0 = arg1;
4279     let pattern2_0 = arg2;
4280     // Rule at src/isa/x64/inst.isle line 2406.
4281     let expr0_0 = SseOpcode::Pinsrb;
4282     let expr1_0 = C::xmm_to_reg(ctx, pattern0_0);
4283     let expr2_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0);
4284     let expr3_0 = OperandSize::Size32;
4285     let expr4_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, &expr3_0)?;
4286     return Some(expr4_0);
4287 }
4288 
4289 // Generated as internal constructor for term x64_pinsrw.
4290 pub fn constructor_x64_pinsrw<C: Context>(
4291     ctx: &mut C,
4292     arg0: Xmm,
4293     arg1: &GprMem,
4294     arg2: u8,
4295 ) -> Option<Xmm> {
4296     let pattern0_0 = arg0;
4297     let pattern1_0 = arg1;
4298     let pattern2_0 = arg2;
4299     // Rule at src/isa/x64/inst.isle line 2415.
4300     let expr0_0 = SseOpcode::Pinsrw;
4301     let expr1_0 = C::xmm_to_reg(ctx, pattern0_0);
4302     let expr2_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0);
4303     let expr3_0 = OperandSize::Size32;
4304     let expr4_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, &expr3_0)?;
4305     return Some(expr4_0);
4306 }
4307 
4308 // Generated as internal constructor for term x64_pinsrd.
4309 pub fn constructor_x64_pinsrd<C: Context>(
4310     ctx: &mut C,
4311     arg0: Xmm,
4312     arg1: &GprMem,
4313     arg2: u8,
4314     arg3: &OperandSize,
4315 ) -> Option<Xmm> {
4316     let pattern0_0 = arg0;
4317     let pattern1_0 = arg1;
4318     let pattern2_0 = arg2;
4319     let pattern3_0 = arg3;
4320     // Rule at src/isa/x64/inst.isle line 2424.
4321     let expr0_0 = SseOpcode::Pinsrd;
4322     let expr1_0 = C::xmm_to_reg(ctx, pattern0_0);
4323     let expr2_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0);
4324     let expr3_0 =
4325         constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, pattern3_0)?;
4326     return Some(expr3_0);
4327 }
4328 
4329 // Generated as internal constructor for term x64_pmaddwd.
4330 pub fn constructor_x64_pmaddwd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
4331     let pattern0_0 = arg0;
4332     let pattern1_0 = arg1;
4333     // Rule at src/isa/x64/inst.isle line 2433.
4334     let expr0_0 = C::temp_writable_xmm(ctx);
4335     let expr1_0 = SseOpcode::Pmaddwd;
4336     let expr2_0 = MInst::XmmRmR {
4337         op: expr1_0,
4338         src1: pattern0_0,
4339         src2: pattern1_0.clone(),
4340         dst: expr0_0,
4341     };
4342     let expr3_0 = C::emit(ctx, &expr2_0);
4343     let expr4_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4344     return Some(expr4_0);
4345 }
4346 
4347 // Generated as internal constructor for term x64_insertps.
4348 pub fn constructor_x64_insertps<C: Context>(
4349     ctx: &mut C,
4350     arg0: Xmm,
4351     arg1: &XmmMem,
4352     arg2: u8,
4353 ) -> Option<Xmm> {
4354     let pattern0_0 = arg0;
4355     let pattern1_0 = arg1;
4356     let pattern2_0 = arg2;
4357     // Rule at src/isa/x64/inst.isle line 2443.
4358     let expr0_0 = SseOpcode::Insertps;
4359     let expr1_0 = C::xmm_to_reg(ctx, pattern0_0);
4360     let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0);
4361     let expr3_0 = OperandSize::Size32;
4362     let expr4_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, &expr3_0)?;
4363     return Some(expr4_0);
4364 }
4365 
4366 // Generated as internal constructor for term x64_pshufd.
4367 pub fn constructor_x64_pshufd<C: Context>(
4368     ctx: &mut C,
4369     arg0: &XmmMem,
4370     arg1: u8,
4371     arg2: &OperandSize,
4372 ) -> Option<Xmm> {
4373     let pattern0_0 = arg0;
4374     let pattern1_0 = arg1;
4375     let pattern2_0 = arg2;
4376     // Rule at src/isa/x64/inst.isle line 2452.
4377     let expr0_0 = C::temp_writable_xmm(ctx);
4378     let expr1_0 = SseOpcode::Pshufd;
4379     let expr2_0 = constructor_writable_xmm_to_r_reg(ctx, expr0_0)?;
4380     let expr3_0 = C::xmm_mem_to_reg_mem(ctx, pattern0_0);
4381     let expr4_0 = C::writable_xmm_to_reg(ctx, expr0_0);
4382     let expr5_0 = MInst::XmmRmRImm {
4383         op: expr1_0,
4384         src1: expr2_0,
4385         src2: expr3_0,
4386         dst: expr4_0,
4387         imm: pattern1_0,
4388         size: pattern2_0.clone(),
4389     };
4390     let expr6_0 = C::emit(ctx, &expr5_0);
4391     let expr7_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4392     return Some(expr7_0);
4393 }
4394 
4395 // Generated as internal constructor for term x64_pshufb.
4396 pub fn constructor_x64_pshufb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
4397     let pattern0_0 = arg0;
4398     let pattern1_0 = arg1;
4399     // Rule at src/isa/x64/inst.isle line 2464.
4400     let expr0_0 = C::temp_writable_xmm(ctx);
4401     let expr1_0 = SseOpcode::Pshufb;
4402     let expr2_0 = MInst::XmmRmR {
4403         op: expr1_0,
4404         src1: pattern0_0,
4405         src2: pattern1_0.clone(),
4406         dst: expr0_0,
4407     };
4408     let expr3_0 = C::emit(ctx, &expr2_0);
4409     let expr4_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4410     return Some(expr4_0);
4411 }
4412 
4413 // Generated as internal constructor for term xmm_unary_rm_r.
4414 pub fn constructor_xmm_unary_rm_r<C: Context>(
4415     ctx: &mut C,
4416     arg0: &SseOpcode,
4417     arg1: &XmmMem,
4418 ) -> Option<Xmm> {
4419     let pattern0_0 = arg0;
4420     let pattern1_0 = arg1;
4421     // Rule at src/isa/x64/inst.isle line 2474.
4422     let expr0_0 = C::temp_writable_xmm(ctx);
4423     let expr1_0 = MInst::XmmUnaryRmR {
4424         op: pattern0_0.clone(),
4425         src: pattern1_0.clone(),
4426         dst: expr0_0,
4427     };
4428     let expr2_0 = C::emit(ctx, &expr1_0);
4429     let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4430     return Some(expr3_0);
4431 }
4432 
4433 // Generated as internal constructor for term x64_pabsb.
4434 pub fn constructor_x64_pabsb<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
4435     let pattern0_0 = arg0;
4436     // Rule at src/isa/x64/inst.isle line 2481.
4437     let expr0_0 = SseOpcode::Pabsb;
4438     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
4439     return Some(expr1_0);
4440 }
4441 
4442 // Generated as internal constructor for term x64_pabsw.
4443 pub fn constructor_x64_pabsw<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
4444     let pattern0_0 = arg0;
4445     // Rule at src/isa/x64/inst.isle line 2486.
4446     let expr0_0 = SseOpcode::Pabsw;
4447     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
4448     return Some(expr1_0);
4449 }
4450 
4451 // Generated as internal constructor for term x64_pabsd.
4452 pub fn constructor_x64_pabsd<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
4453     let pattern0_0 = arg0;
4454     // Rule at src/isa/x64/inst.isle line 2491.
4455     let expr0_0 = SseOpcode::Pabsd;
4456     let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?;
4457     return Some(expr1_0);
4458 }
4459 
4460 // Generated as internal constructor for term xmm_unary_rm_r_evex.
4461 pub fn constructor_xmm_unary_rm_r_evex<C: Context>(
4462     ctx: &mut C,
4463     arg0: &Avx512Opcode,
4464     arg1: &XmmMem,
4465 ) -> Option<Xmm> {
4466     let pattern0_0 = arg0;
4467     let pattern1_0 = arg1;
4468     // Rule at src/isa/x64/inst.isle line 2496.
4469     let expr0_0 = C::temp_writable_xmm(ctx);
4470     let expr1_0 = MInst::XmmUnaryRmREvex {
4471         op: pattern0_0.clone(),
4472         src: pattern1_0.clone(),
4473         dst: expr0_0,
4474     };
4475     let expr2_0 = C::emit(ctx, &expr1_0);
4476     let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4477     return Some(expr3_0);
4478 }
4479 
4480 // Generated as internal constructor for term x64_vpabsq.
4481 pub fn constructor_x64_vpabsq<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
4482     let pattern0_0 = arg0;
4483     // Rule at src/isa/x64/inst.isle line 2503.
4484     let expr0_0 = Avx512Opcode::Vpabsq;
4485     let expr1_0 = constructor_xmm_unary_rm_r_evex(ctx, &expr0_0, pattern0_0)?;
4486     return Some(expr1_0);
4487 }
4488 
4489 // Generated as internal constructor for term x64_vpopcntb.
4490 pub fn constructor_x64_vpopcntb<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> {
4491     let pattern0_0 = arg0;
4492     // Rule at src/isa/x64/inst.isle line 2508.
4493     let expr0_0 = Avx512Opcode::Vpopcntb;
4494     let expr1_0 = constructor_xmm_unary_rm_r_evex(ctx, &expr0_0, pattern0_0)?;
4495     return Some(expr1_0);
4496 }
4497 
4498 // Generated as internal constructor for term xmm_rm_r_evex.
4499 pub fn constructor_xmm_rm_r_evex<C: Context>(
4500     ctx: &mut C,
4501     arg0: &Avx512Opcode,
4502     arg1: &XmmMem,
4503     arg2: Xmm,
4504 ) -> Option<Xmm> {
4505     let pattern0_0 = arg0;
4506     let pattern1_0 = arg1;
4507     let pattern2_0 = arg2;
4508     // Rule at src/isa/x64/inst.isle line 2513.
4509     let expr0_0 = C::temp_writable_xmm(ctx);
4510     let expr1_0 = MInst::XmmRmREvex {
4511         op: pattern0_0.clone(),
4512         src1: pattern1_0.clone(),
4513         src2: pattern2_0,
4514         dst: expr0_0,
4515     };
4516     let expr2_0 = C::emit(ctx, &expr1_0);
4517     let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4518     return Some(expr3_0);
4519 }
4520 
4521 // Generated as internal constructor for term x64_vpmullq.
4522 pub fn constructor_x64_vpmullq<C: Context>(ctx: &mut C, arg0: &XmmMem, arg1: Xmm) -> Option<Xmm> {
4523     let pattern0_0 = arg0;
4524     let pattern1_0 = arg1;
4525     // Rule at src/isa/x64/inst.isle line 2525.
4526     let expr0_0 = Avx512Opcode::Vpmullq;
4527     let expr1_0 = constructor_xmm_rm_r_evex(ctx, &expr0_0, pattern0_0, pattern1_0)?;
4528     return Some(expr1_0);
4529 }
4530 
4531 // Generated as internal constructor for term mul_hi.
4532 pub fn constructor_mul_hi<C: Context>(
4533     ctx: &mut C,
4534     arg0: Type,
4535     arg1: bool,
4536     arg2: Gpr,
4537     arg3: &GprMem,
4538 ) -> Option<ValueRegs> {
4539     let pattern0_0 = arg0;
4540     let pattern1_0 = arg1;
4541     let pattern2_0 = arg2;
4542     let pattern3_0 = arg3;
4543     // Rule at src/isa/x64/inst.isle line 2534.
4544     let expr0_0 = C::temp_writable_gpr(ctx);
4545     let expr1_0 = C::temp_writable_gpr(ctx);
4546     let expr2_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
4547     let expr3_0 = MInst::MulHi {
4548         size: expr2_0,
4549         signed: pattern1_0,
4550         src1: pattern2_0,
4551         src2: pattern3_0.clone(),
4552         dst_lo: expr0_0,
4553         dst_hi: expr1_0,
4554     };
4555     let expr4_0 = C::emit(ctx, &expr3_0);
4556     let expr5_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
4557     let expr6_0 = C::writable_gpr_to_gpr(ctx, expr1_0);
4558     let expr7_0 = constructor_value_gprs(ctx, expr5_0, expr6_0)?;
4559     return Some(expr7_0);
4560 }
4561 
4562 // Generated as internal constructor for term mulhi_u.
4563 pub fn constructor_mulhi_u<C: Context>(
4564     ctx: &mut C,
4565     arg0: Type,
4566     arg1: Gpr,
4567     arg2: &GprMem,
4568 ) -> Option<ValueRegs> {
4569     let pattern0_0 = arg0;
4570     let pattern1_0 = arg1;
4571     let pattern2_0 = arg2;
4572     // Rule at src/isa/x64/inst.isle line 2549.
4573     let expr0_0: bool = false;
4574     let expr1_0 = constructor_mul_hi(ctx, pattern0_0, expr0_0, pattern1_0, pattern2_0)?;
4575     return Some(expr1_0);
4576 }
4577 
4578 // Generated as internal constructor for term xmm_rmi_xmm.
4579 pub fn constructor_xmm_rmi_xmm<C: Context>(
4580     ctx: &mut C,
4581     arg0: &SseOpcode,
4582     arg1: Xmm,
4583     arg2: &XmmMemImm,
4584 ) -> Option<Xmm> {
4585     let pattern0_0 = arg0;
4586     let pattern1_0 = arg1;
4587     let pattern2_0 = arg2;
4588     // Rule at src/isa/x64/inst.isle line 2554.
4589     let expr0_0 = C::temp_writable_xmm(ctx);
4590     let expr1_0 = MInst::XmmRmiReg {
4591         opcode: pattern0_0.clone(),
4592         src1: pattern1_0,
4593         src2: pattern2_0.clone(),
4594         dst: expr0_0,
4595     };
4596     let expr2_0 = C::emit(ctx, &expr1_0);
4597     let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4598     return Some(expr3_0);
4599 }
4600 
4601 // Generated as internal constructor for term x64_psllw.
4602 pub fn constructor_x64_psllw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
4603     let pattern0_0 = arg0;
4604     let pattern1_0 = arg1;
4605     // Rule at src/isa/x64/inst.isle line 2564.
4606     let expr0_0 = SseOpcode::Psllw;
4607     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
4608     return Some(expr1_0);
4609 }
4610 
4611 // Generated as internal constructor for term x64_pslld.
4612 pub fn constructor_x64_pslld<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
4613     let pattern0_0 = arg0;
4614     let pattern1_0 = arg1;
4615     // Rule at src/isa/x64/inst.isle line 2569.
4616     let expr0_0 = SseOpcode::Pslld;
4617     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
4618     return Some(expr1_0);
4619 }
4620 
4621 // Generated as internal constructor for term x64_psllq.
4622 pub fn constructor_x64_psllq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
4623     let pattern0_0 = arg0;
4624     let pattern1_0 = arg1;
4625     // Rule at src/isa/x64/inst.isle line 2574.
4626     let expr0_0 = SseOpcode::Psllq;
4627     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
4628     return Some(expr1_0);
4629 }
4630 
4631 // Generated as internal constructor for term x64_psrlw.
4632 pub fn constructor_x64_psrlw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
4633     let pattern0_0 = arg0;
4634     let pattern1_0 = arg1;
4635     // Rule at src/isa/x64/inst.isle line 2579.
4636     let expr0_0 = SseOpcode::Psrlw;
4637     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
4638     return Some(expr1_0);
4639 }
4640 
4641 // Generated as internal constructor for term x64_psrld.
4642 pub fn constructor_x64_psrld<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
4643     let pattern0_0 = arg0;
4644     let pattern1_0 = arg1;
4645     // Rule at src/isa/x64/inst.isle line 2584.
4646     let expr0_0 = SseOpcode::Psrld;
4647     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
4648     return Some(expr1_0);
4649 }
4650 
4651 // Generated as internal constructor for term x64_psrlq.
4652 pub fn constructor_x64_psrlq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
4653     let pattern0_0 = arg0;
4654     let pattern1_0 = arg1;
4655     // Rule at src/isa/x64/inst.isle line 2589.
4656     let expr0_0 = SseOpcode::Psrlq;
4657     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
4658     return Some(expr1_0);
4659 }
4660 
4661 // Generated as internal constructor for term x64_psraw.
4662 pub fn constructor_x64_psraw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
4663     let pattern0_0 = arg0;
4664     let pattern1_0 = arg1;
4665     // Rule at src/isa/x64/inst.isle line 2594.
4666     let expr0_0 = SseOpcode::Psraw;
4667     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
4668     return Some(expr1_0);
4669 }
4670 
4671 // Generated as internal constructor for term x64_psrad.
4672 pub fn constructor_x64_psrad<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> {
4673     let pattern0_0 = arg0;
4674     let pattern1_0 = arg1;
4675     // Rule at src/isa/x64/inst.isle line 2599.
4676     let expr0_0 = SseOpcode::Psrad;
4677     let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?;
4678     return Some(expr1_0);
4679 }
4680 
4681 // Generated as internal constructor for term x64_pextrd.
4682 pub fn constructor_x64_pextrd<C: Context>(
4683     ctx: &mut C,
4684     arg0: Type,
4685     arg1: Xmm,
4686     arg2: u8,
4687 ) -> Option<Gpr> {
4688     let pattern0_0 = arg0;
4689     let pattern1_0 = arg1;
4690     let pattern2_0 = arg2;
4691     // Rule at src/isa/x64/inst.isle line 2604.
4692     let expr0_0 = C::temp_writable_gpr(ctx);
4693     let expr1_0 = SseOpcode::Pextrd;
4694     let expr2_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
4695     let expr3_0 = C::xmm_to_reg(ctx, pattern1_0);
4696     let expr4_0 = constructor_xmm_to_reg_mem(ctx, expr3_0)?;
4697     let expr5_0 = C::xmm_mem_to_reg_mem(ctx, &expr4_0);
4698     let expr6_0 = C::writable_gpr_to_reg(ctx, expr0_0);
4699     let expr7_0 = C::lane_type(ctx, pattern0_0);
4700     let expr8_0 = C::operand_size_of_type_32_64(ctx, expr7_0);
4701     let expr9_0 = MInst::XmmRmRImm {
4702         op: expr1_0,
4703         src1: expr2_0,
4704         src2: expr5_0,
4705         dst: expr6_0,
4706         imm: pattern2_0,
4707         size: expr8_0,
4708     };
4709     let expr10_0 = C::emit(ctx, &expr9_0);
4710     let expr11_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
4711     return Some(expr11_0);
4712 }
4713 
4714 // Generated as internal constructor for term gpr_to_xmm.
4715 pub fn constructor_gpr_to_xmm<C: Context>(
4716     ctx: &mut C,
4717     arg0: &SseOpcode,
4718     arg1: &GprMem,
4719     arg2: &OperandSize,
4720 ) -> Option<Xmm> {
4721     let pattern0_0 = arg0;
4722     let pattern1_0 = arg1;
4723     let pattern2_0 = arg2;
4724     // Rule at src/isa/x64/inst.isle line 2616.
4725     let expr0_0 = C::temp_writable_xmm(ctx);
4726     let expr1_0 = MInst::GprToXmm {
4727         op: pattern0_0.clone(),
4728         src: pattern1_0.clone(),
4729         dst: expr0_0,
4730         src_size: pattern2_0.clone(),
4731     };
4732     let expr2_0 = C::emit(ctx, &expr1_0);
4733     let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4734     return Some(expr3_0);
4735 }
4736 
4737 // Generated as internal constructor for term x64_not.
4738 pub fn constructor_x64_not<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
4739     let pattern0_0 = arg0;
4740     let pattern1_0 = arg1;
4741     // Rule at src/isa/x64/inst.isle line 2623.
4742     let expr0_0 = C::temp_writable_gpr(ctx);
4743     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
4744     let expr2_0 = MInst::Not {
4745         size: expr1_0,
4746         src: pattern1_0,
4747         dst: expr0_0,
4748     };
4749     let expr3_0 = C::emit(ctx, &expr2_0);
4750     let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
4751     return Some(expr4_0);
4752 }
4753 
4754 // Generated as internal constructor for term x64_neg.
4755 pub fn constructor_x64_neg<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
4756     let pattern0_0 = arg0;
4757     let pattern1_0 = arg1;
4758     // Rule at src/isa/x64/inst.isle line 2631.
4759     let expr0_0 = C::temp_writable_gpr(ctx);
4760     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
4761     let expr2_0 = MInst::Neg {
4762         size: expr1_0,
4763         src: pattern1_0,
4764         dst: expr0_0,
4765     };
4766     let expr3_0 = C::emit(ctx, &expr2_0);
4767     let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
4768     return Some(expr4_0);
4769 }
4770 
4771 // Generated as internal constructor for term x64_lea.
4772 pub fn constructor_x64_lea<C: Context>(ctx: &mut C, arg0: &SyntheticAmode) -> Option<Gpr> {
4773     let pattern0_0 = arg0;
4774     // Rule at src/isa/x64/inst.isle line 2638.
4775     let expr0_0 = C::temp_writable_gpr(ctx);
4776     let expr1_0 = MInst::LoadEffectiveAddress {
4777         addr: pattern0_0.clone(),
4778         dst: expr0_0,
4779     };
4780     let expr2_0 = C::emit(ctx, &expr1_0);
4781     let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
4782     return Some(expr3_0);
4783 }
4784 
4785 // Generated as internal constructor for term x64_ud2.
4786 pub fn constructor_x64_ud2<C: Context>(ctx: &mut C, arg0: &TrapCode) -> Option<SideEffectNoResult> {
4787     let pattern0_0 = arg0;
4788     // Rule at src/isa/x64/inst.isle line 2645.
4789     let expr0_0 = MInst::Ud2 {
4790         trap_code: pattern0_0.clone(),
4791     };
4792     let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 };
4793     return Some(expr1_0);
4794 }
4795 
4796 // Generated as internal constructor for term x64_hlt.
4797 pub fn constructor_x64_hlt<C: Context>(ctx: &mut C) -> Option<SideEffectNoResult> {
4798     // Rule at src/isa/x64/inst.isle line 2650.
4799     let expr0_0 = MInst::Hlt;
4800     let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 };
4801     return Some(expr1_0);
4802 }
4803 
4804 // Generated as internal constructor for term x64_lzcnt.
4805 pub fn constructor_x64_lzcnt<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
4806     let pattern0_0 = arg0;
4807     let pattern1_0 = arg1;
4808     // Rule at src/isa/x64/inst.isle line 2655.
4809     let expr0_0 = C::temp_writable_gpr(ctx);
4810     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
4811     let expr2_0 = UnaryRmROpcode::Lzcnt;
4812     let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0);
4813     let expr4_0 = MInst::UnaryRmR {
4814         size: expr1_0,
4815         op: expr2_0,
4816         src: expr3_0,
4817         dst: expr0_0,
4818     };
4819     let expr5_0 = C::emit(ctx, &expr4_0);
4820     let expr6_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
4821     return Some(expr6_0);
4822 }
4823 
4824 // Generated as internal constructor for term x64_tzcnt.
4825 pub fn constructor_x64_tzcnt<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
4826     let pattern0_0 = arg0;
4827     let pattern1_0 = arg1;
4828     // Rule at src/isa/x64/inst.isle line 2663.
4829     let expr0_0 = C::temp_writable_gpr(ctx);
4830     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
4831     let expr2_0 = UnaryRmROpcode::Tzcnt;
4832     let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0);
4833     let expr4_0 = MInst::UnaryRmR {
4834         size: expr1_0,
4835         op: expr2_0,
4836         src: expr3_0,
4837         dst: expr0_0,
4838     };
4839     let expr5_0 = C::emit(ctx, &expr4_0);
4840     let expr6_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
4841     return Some(expr6_0);
4842 }
4843 
4844 // Generated as internal constructor for term x64_bsr.
4845 pub fn constructor_x64_bsr<C: Context>(
4846     ctx: &mut C,
4847     arg0: Type,
4848     arg1: Gpr,
4849 ) -> Option<ProducesFlags> {
4850     let pattern0_0 = arg0;
4851     let pattern1_0 = arg1;
4852     // Rule at src/isa/x64/inst.isle line 2671.
4853     let expr0_0 = C::temp_writable_gpr(ctx);
4854     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
4855     let expr2_0 = UnaryRmROpcode::Bsr;
4856     let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0);
4857     let expr4_0 = MInst::UnaryRmR {
4858         size: expr1_0,
4859         op: expr2_0,
4860         src: expr3_0,
4861         dst: expr0_0,
4862     };
4863     let expr5_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
4864     let expr6_0 = ProducesFlags::ProducesFlagsReturnsReg {
4865         inst: expr4_0,
4866         result: expr5_0,
4867     };
4868     return Some(expr6_0);
4869 }
4870 
4871 // Generated as internal constructor for term bsr_or_else.
4872 pub fn constructor_bsr_or_else<C: Context>(
4873     ctx: &mut C,
4874     arg0: Type,
4875     arg1: Gpr,
4876     arg2: Gpr,
4877 ) -> Option<Gpr> {
4878     let pattern0_0 = arg0;
4879     let pattern1_0 = arg1;
4880     let pattern2_0 = arg2;
4881     // Rule at src/isa/x64/inst.isle line 2680.
4882     let expr0_0 = constructor_x64_bsr(ctx, pattern0_0, pattern1_0)?;
4883     let expr1_0 = constructor_produces_flags_get_reg(ctx, &expr0_0)?;
4884     let expr2_0 = C::gpr_new(ctx, expr1_0);
4885     let expr3_0 = CC::Z;
4886     let expr4_0 = C::gpr_to_gpr_mem(ctx, pattern2_0);
4887     let expr5_0 = constructor_cmove(ctx, pattern0_0, &expr3_0, &expr4_0, expr2_0)?;
4888     let expr6_0 = constructor_produces_flags_ignore(ctx, &expr0_0)?;
4889     let expr7_0 = constructor_with_flags_reg(ctx, &expr6_0, &expr5_0)?;
4890     let expr8_0 = C::gpr_new(ctx, expr7_0);
4891     return Some(expr8_0);
4892 }
4893 
4894 // Generated as internal constructor for term x64_bsf.
4895 pub fn constructor_x64_bsf<C: Context>(
4896     ctx: &mut C,
4897     arg0: Type,
4898     arg1: Gpr,
4899 ) -> Option<ProducesFlags> {
4900     let pattern0_0 = arg0;
4901     let pattern1_0 = arg1;
4902     // Rule at src/isa/x64/inst.isle line 2691.
4903     let expr0_0 = C::temp_writable_gpr(ctx);
4904     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
4905     let expr2_0 = UnaryRmROpcode::Bsf;
4906     let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0);
4907     let expr4_0 = MInst::UnaryRmR {
4908         size: expr1_0,
4909         op: expr2_0,
4910         src: expr3_0,
4911         dst: expr0_0,
4912     };
4913     let expr5_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?;
4914     let expr6_0 = ProducesFlags::ProducesFlagsReturnsReg {
4915         inst: expr4_0,
4916         result: expr5_0,
4917     };
4918     return Some(expr6_0);
4919 }
4920 
4921 // Generated as internal constructor for term bsf_or_else.
4922 pub fn constructor_bsf_or_else<C: Context>(
4923     ctx: &mut C,
4924     arg0: Type,
4925     arg1: Gpr,
4926     arg2: Gpr,
4927 ) -> Option<Gpr> {
4928     let pattern0_0 = arg0;
4929     let pattern1_0 = arg1;
4930     let pattern2_0 = arg2;
4931     // Rule at src/isa/x64/inst.isle line 2700.
4932     let expr0_0 = constructor_x64_bsf(ctx, pattern0_0, pattern1_0)?;
4933     let expr1_0 = constructor_produces_flags_get_reg(ctx, &expr0_0)?;
4934     let expr2_0 = C::gpr_new(ctx, expr1_0);
4935     let expr3_0 = CC::Z;
4936     let expr4_0 = C::gpr_to_gpr_mem(ctx, pattern2_0);
4937     let expr5_0 = constructor_cmove(ctx, pattern0_0, &expr3_0, &expr4_0, expr2_0)?;
4938     let expr6_0 = constructor_produces_flags_ignore(ctx, &expr0_0)?;
4939     let expr7_0 = constructor_with_flags_reg(ctx, &expr6_0, &expr5_0)?;
4940     let expr8_0 = C::gpr_new(ctx, expr7_0);
4941     return Some(expr8_0);
4942 }
4943 
4944 // Generated as internal constructor for term x64_popcnt.
4945 pub fn constructor_x64_popcnt<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
4946     let pattern0_0 = arg0;
4947     let pattern1_0 = arg1;
4948     // Rule at src/isa/x64/inst.isle line 2711.
4949     let expr0_0 = C::temp_writable_gpr(ctx);
4950     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
4951     let expr2_0 = UnaryRmROpcode::Popcnt;
4952     let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0);
4953     let expr4_0 = MInst::UnaryRmR {
4954         size: expr1_0,
4955         op: expr2_0,
4956         src: expr3_0,
4957         dst: expr0_0,
4958     };
4959     let expr5_0 = C::emit(ctx, &expr4_0);
4960     let expr6_0 = C::writable_gpr_to_gpr(ctx, expr0_0);
4961     return Some(expr6_0);
4962 }
4963 
4964 // Generated as internal constructor for term xmm_min_max_seq.
4965 pub fn constructor_xmm_min_max_seq<C: Context>(
4966     ctx: &mut C,
4967     arg0: Type,
4968     arg1: bool,
4969     arg2: Xmm,
4970     arg3: Xmm,
4971 ) -> Option<Xmm> {
4972     let pattern0_0 = arg0;
4973     let pattern1_0 = arg1;
4974     let pattern2_0 = arg2;
4975     let pattern3_0 = arg3;
4976     // Rule at src/isa/x64/inst.isle line 2719.
4977     let expr0_0 = C::temp_writable_xmm(ctx);
4978     let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
4979     let expr2_0 = MInst::XmmMinMaxSeq {
4980         size: expr1_0,
4981         is_min: pattern1_0,
4982         lhs: pattern2_0,
4983         rhs: pattern3_0,
4984         dst: expr0_0,
4985     };
4986     let expr3_0 = C::emit(ctx, &expr2_0);
4987     let expr4_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
4988     return Some(expr4_0);
4989 }
4990 
4991 // Generated as internal constructor for term x64_minss.
4992 pub fn constructor_x64_minss<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
4993     let pattern0_0 = arg0;
4994     let pattern1_0 = arg1;
4995     // Rule at src/isa/x64/inst.isle line 2727.
4996     let expr0_0 = C::temp_writable_xmm(ctx);
4997     let expr1_0 = SseOpcode::Minss;
4998     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
4999     let expr3_0 = MInst::XmmRmR {
5000         op: expr1_0,
5001         src1: pattern0_0,
5002         src2: expr2_0,
5003         dst: expr0_0,
5004     };
5005     let expr4_0 = C::emit(ctx, &expr3_0);
5006     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
5007     return Some(expr5_0);
5008 }
5009 
5010 // Generated as internal constructor for term x64_minsd.
5011 pub fn constructor_x64_minsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
5012     let pattern0_0 = arg0;
5013     let pattern1_0 = arg1;
5014     // Rule at src/isa/x64/inst.isle line 2734.
5015     let expr0_0 = C::temp_writable_xmm(ctx);
5016     let expr1_0 = SseOpcode::Minsd;
5017     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
5018     let expr3_0 = MInst::XmmRmR {
5019         op: expr1_0,
5020         src1: pattern0_0,
5021         src2: expr2_0,
5022         dst: expr0_0,
5023     };
5024     let expr4_0 = C::emit(ctx, &expr3_0);
5025     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
5026     return Some(expr5_0);
5027 }
5028 
5029 // Generated as internal constructor for term x64_minps.
5030 pub fn constructor_x64_minps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
5031     let pattern0_0 = arg0;
5032     let pattern1_0 = arg1;
5033     // Rule at src/isa/x64/inst.isle line 2742.
5034     let expr0_0 = C::temp_writable_xmm(ctx);
5035     let expr1_0 = SseOpcode::Minps;
5036     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
5037     let expr3_0 = MInst::XmmRmR {
5038         op: expr1_0,
5039         src1: pattern0_0,
5040         src2: expr2_0,
5041         dst: expr0_0,
5042     };
5043     let expr4_0 = C::emit(ctx, &expr3_0);
5044     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
5045     return Some(expr5_0);
5046 }
5047 
5048 // Generated as internal constructor for term x64_minpd.
5049 pub fn constructor_x64_minpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
5050     let pattern0_0 = arg0;
5051     let pattern1_0 = arg1;
5052     // Rule at src/isa/x64/inst.isle line 2749.
5053     let expr0_0 = C::temp_writable_xmm(ctx);
5054     let expr1_0 = SseOpcode::Minpd;
5055     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
5056     let expr3_0 = MInst::XmmRmR {
5057         op: expr1_0,
5058         src1: pattern0_0,
5059         src2: expr2_0,
5060         dst: expr0_0,
5061     };
5062     let expr4_0 = C::emit(ctx, &expr3_0);
5063     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
5064     return Some(expr5_0);
5065 }
5066 
5067 // Generated as internal constructor for term x64_maxss.
5068 pub fn constructor_x64_maxss<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
5069     let pattern0_0 = arg0;
5070     let pattern1_0 = arg1;
5071     // Rule at src/isa/x64/inst.isle line 2756.
5072     let expr0_0 = C::temp_writable_xmm(ctx);
5073     let expr1_0 = SseOpcode::Maxss;
5074     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
5075     let expr3_0 = MInst::XmmRmR {
5076         op: expr1_0,
5077         src1: pattern0_0,
5078         src2: expr2_0,
5079         dst: expr0_0,
5080     };
5081     let expr4_0 = C::emit(ctx, &expr3_0);
5082     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
5083     return Some(expr5_0);
5084 }
5085 
5086 // Generated as internal constructor for term x64_maxsd.
5087 pub fn constructor_x64_maxsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
5088     let pattern0_0 = arg0;
5089     let pattern1_0 = arg1;
5090     // Rule at src/isa/x64/inst.isle line 2763.
5091     let expr0_0 = C::temp_writable_xmm(ctx);
5092     let expr1_0 = SseOpcode::Maxsd;
5093     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
5094     let expr3_0 = MInst::XmmRmR {
5095         op: expr1_0,
5096         src1: pattern0_0,
5097         src2: expr2_0,
5098         dst: expr0_0,
5099     };
5100     let expr4_0 = C::emit(ctx, &expr3_0);
5101     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
5102     return Some(expr5_0);
5103 }
5104 
5105 // Generated as internal constructor for term x64_maxps.
5106 pub fn constructor_x64_maxps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
5107     let pattern0_0 = arg0;
5108     let pattern1_0 = arg1;
5109     // Rule at src/isa/x64/inst.isle line 2770.
5110     let expr0_0 = C::temp_writable_xmm(ctx);
5111     let expr1_0 = SseOpcode::Maxps;
5112     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
5113     let expr3_0 = MInst::XmmRmR {
5114         op: expr1_0,
5115         src1: pattern0_0,
5116         src2: expr2_0,
5117         dst: expr0_0,
5118     };
5119     let expr4_0 = C::emit(ctx, &expr3_0);
5120     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
5121     return Some(expr5_0);
5122 }
5123 
5124 // Generated as internal constructor for term x64_maxpd.
5125 pub fn constructor_x64_maxpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> {
5126     let pattern0_0 = arg0;
5127     let pattern1_0 = arg1;
5128     // Rule at src/isa/x64/inst.isle line 2777.
5129     let expr0_0 = C::temp_writable_xmm(ctx);
5130     let expr1_0 = SseOpcode::Maxpd;
5131     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0);
5132     let expr3_0 = MInst::XmmRmR {
5133         op: expr1_0,
5134         src1: pattern0_0,
5135         src2: expr2_0,
5136         dst: expr0_0,
5137     };
5138     let expr4_0 = C::emit(ctx, &expr3_0);
5139     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
5140     return Some(expr5_0);
5141 }
5142 
5143 // Generated as internal constructor for term x64_sqrtss.
5144 pub fn constructor_x64_sqrtss<C: Context>(ctx: &mut C, arg0: Xmm) -> Option<Xmm> {
5145     let pattern0_0 = arg0;
5146     // Rule at src/isa/x64/inst.isle line 2785.
5147     let expr0_0 = C::temp_writable_xmm(ctx);
5148     let expr1_0 = SseOpcode::Sqrtss;
5149     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern0_0);
5150     let expr3_0 = MInst::XmmUnaryRmR {
5151         op: expr1_0,
5152         src: expr2_0,
5153         dst: expr0_0,
5154     };
5155     let expr4_0 = C::emit(ctx, &expr3_0);
5156     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
5157     return Some(expr5_0);
5158 }
5159 
5160 // Generated as internal constructor for term x64_sqrtsd.
5161 pub fn constructor_x64_sqrtsd<C: Context>(ctx: &mut C, arg0: Xmm) -> Option<Xmm> {
5162     let pattern0_0 = arg0;
5163     // Rule at src/isa/x64/inst.isle line 2792.
5164     let expr0_0 = C::temp_writable_xmm(ctx);
5165     let expr1_0 = SseOpcode::Sqrtsd;
5166     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern0_0);
5167     let expr3_0 = MInst::XmmUnaryRmR {
5168         op: expr1_0,
5169         src: expr2_0,
5170         dst: expr0_0,
5171     };
5172     let expr4_0 = C::emit(ctx, &expr3_0);
5173     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
5174     return Some(expr5_0);
5175 }
5176 
5177 // Generated as internal constructor for term x64_sqrtps.
5178 pub fn constructor_x64_sqrtps<C: Context>(ctx: &mut C, arg0: Xmm) -> Option<Xmm> {
5179     let pattern0_0 = arg0;
5180     // Rule at src/isa/x64/inst.isle line 2799.
5181     let expr0_0 = C::temp_writable_xmm(ctx);
5182     let expr1_0 = SseOpcode::Sqrtps;
5183     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern0_0);
5184     let expr3_0 = MInst::XmmUnaryRmR {
5185         op: expr1_0,
5186         src: expr2_0,
5187         dst: expr0_0,
5188     };
5189     let expr4_0 = C::emit(ctx, &expr3_0);
5190     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
5191     return Some(expr5_0);
5192 }
5193 
5194 // Generated as internal constructor for term x64_sqrtpd.
5195 pub fn constructor_x64_sqrtpd<C: Context>(ctx: &mut C, arg0: Xmm) -> Option<Xmm> {
5196     let pattern0_0 = arg0;
5197     // Rule at src/isa/x64/inst.isle line 2806.
5198     let expr0_0 = C::temp_writable_xmm(ctx);
5199     let expr1_0 = SseOpcode::Sqrtpd;
5200     let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern0_0);
5201     let expr3_0 = MInst::XmmUnaryRmR {
5202         op: expr1_0,
5203         src: expr2_0,
5204         dst: expr0_0,
5205     };
5206     let expr4_0 = C::emit(ctx, &expr3_0);
5207     let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0);
5208     return Some(expr5_0);
5209 }
5210 
5211 // Generated as internal constructor for term x64_pcmpeq.
5212 pub fn constructor_x64_pcmpeq<C: Context>(
5213     ctx: &mut C,
5214     arg0: Type,
5215     arg1: Xmm,
5216     arg2: &XmmMem,
5217 ) -> Option<Xmm> {
5218     let pattern0_0 = arg0;
5219     if pattern0_0 == I8X16 {
5220         let pattern2_0 = arg1;
5221         let pattern3_0 = arg2;
5222         // Rule at src/isa/x64/inst.isle line 2813.
5223         let expr0_0 = constructor_x64_pcmpeqb(ctx, pattern2_0, pattern3_0)?;
5224         return Some(expr0_0);
5225     }
5226     if pattern0_0 == I16X8 {
5227         let pattern2_0 = arg1;
5228         let pattern3_0 = arg2;
5229         // Rule at src/isa/x64/inst.isle line 2814.
5230         let expr0_0 = constructor_x64_pcmpeqw(ctx, pattern2_0, pattern3_0)?;
5231         return Some(expr0_0);
5232     }
5233     if pattern0_0 == I32X4 {
5234         let pattern2_0 = arg1;
5235         let pattern3_0 = arg2;
5236         // Rule at src/isa/x64/inst.isle line 2815.
5237         let expr0_0 = constructor_x64_pcmpeqd(ctx, pattern2_0, pattern3_0)?;
5238         return Some(expr0_0);
5239     }
5240     if pattern0_0 == I64X2 {
5241         let pattern2_0 = arg1;
5242         let pattern3_0 = arg2;
5243         // Rule at src/isa/x64/inst.isle line 2816.
5244         let expr0_0 = constructor_x64_pcmpeqq(ctx, pattern2_0, pattern3_0)?;
5245         return Some(expr0_0);
5246     }
5247     return None;
5248 }
5249 
5250 // Generated as internal constructor for term x64_pcmpeqb.
5251 pub fn constructor_x64_pcmpeqb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
5252     let pattern0_0 = arg0;
5253     let pattern1_0 = arg1;
5254     // Rule at src/isa/x64/inst.isle line 2819.
5255     let expr0_0: Type = I8X16;
5256     let expr1_0 = SseOpcode::Pcmpeqb;
5257     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
5258     return Some(expr2_0);
5259 }
5260 
5261 // Generated as internal constructor for term x64_pcmpeqw.
5262 pub fn constructor_x64_pcmpeqw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
5263     let pattern0_0 = arg0;
5264     let pattern1_0 = arg1;
5265     // Rule at src/isa/x64/inst.isle line 2821.
5266     let expr0_0: Type = I16X8;
5267     let expr1_0 = SseOpcode::Pcmpeqw;
5268     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
5269     return Some(expr2_0);
5270 }
5271 
5272 // Generated as internal constructor for term x64_pcmpeqd.
5273 pub fn constructor_x64_pcmpeqd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
5274     let pattern0_0 = arg0;
5275     let pattern1_0 = arg1;
5276     // Rule at src/isa/x64/inst.isle line 2823.
5277     let expr0_0: Type = I32X4;
5278     let expr1_0 = SseOpcode::Pcmpeqd;
5279     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
5280     return Some(expr2_0);
5281 }
5282 
5283 // Generated as internal constructor for term x64_pcmpeqq.
5284 pub fn constructor_x64_pcmpeqq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
5285     let pattern0_0 = arg0;
5286     let pattern1_0 = arg1;
5287     // Rule at src/isa/x64/inst.isle line 2825.
5288     let expr0_0: Type = I64X2;
5289     let expr1_0 = SseOpcode::Pcmpeqq;
5290     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
5291     return Some(expr2_0);
5292 }
5293 
5294 // Generated as internal constructor for term x64_pcmpgt.
5295 pub fn constructor_x64_pcmpgt<C: Context>(
5296     ctx: &mut C,
5297     arg0: Type,
5298     arg1: Xmm,
5299     arg2: &XmmMem,
5300 ) -> Option<Xmm> {
5301     let pattern0_0 = arg0;
5302     if pattern0_0 == I8X16 {
5303         let pattern2_0 = arg1;
5304         let pattern3_0 = arg2;
5305         // Rule at src/isa/x64/inst.isle line 2829.
5306         let expr0_0 = constructor_x64_pcmpgtb(ctx, pattern2_0, pattern3_0)?;
5307         return Some(expr0_0);
5308     }
5309     if pattern0_0 == I16X8 {
5310         let pattern2_0 = arg1;
5311         let pattern3_0 = arg2;
5312         // Rule at src/isa/x64/inst.isle line 2830.
5313         let expr0_0 = constructor_x64_pcmpgtw(ctx, pattern2_0, pattern3_0)?;
5314         return Some(expr0_0);
5315     }
5316     if pattern0_0 == I32X4 {
5317         let pattern2_0 = arg1;
5318         let pattern3_0 = arg2;
5319         // Rule at src/isa/x64/inst.isle line 2831.
5320         let expr0_0 = constructor_x64_pcmpgtd(ctx, pattern2_0, pattern3_0)?;
5321         return Some(expr0_0);
5322     }
5323     if pattern0_0 == I64X2 {
5324         let pattern2_0 = arg1;
5325         let pattern3_0 = arg2;
5326         // Rule at src/isa/x64/inst.isle line 2832.
5327         let expr0_0 = constructor_x64_pcmpgtq(ctx, pattern2_0, pattern3_0)?;
5328         return Some(expr0_0);
5329     }
5330     return None;
5331 }
5332 
5333 // Generated as internal constructor for term x64_pcmpgtb.
5334 pub fn constructor_x64_pcmpgtb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
5335     let pattern0_0 = arg0;
5336     let pattern1_0 = arg1;
5337     // Rule at src/isa/x64/inst.isle line 2835.
5338     let expr0_0: Type = I8X16;
5339     let expr1_0 = SseOpcode::Pcmpgtb;
5340     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
5341     return Some(expr2_0);
5342 }
5343 
5344 // Generated as internal constructor for term x64_pcmpgtw.
5345 pub fn constructor_x64_pcmpgtw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
5346     let pattern0_0 = arg0;
5347     let pattern1_0 = arg1;
5348     // Rule at src/isa/x64/inst.isle line 2837.
5349     let expr0_0: Type = I16X8;
5350     let expr1_0 = SseOpcode::Pcmpgtw;
5351     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
5352     return Some(expr2_0);
5353 }
5354 
5355 // Generated as internal constructor for term x64_pcmpgtd.
5356 pub fn constructor_x64_pcmpgtd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
5357     let pattern0_0 = arg0;
5358     let pattern1_0 = arg1;
5359     // Rule at src/isa/x64/inst.isle line 2839.
5360     let expr0_0: Type = I32X4;
5361     let expr1_0 = SseOpcode::Pcmpgtd;
5362     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
5363     return Some(expr2_0);
5364 }
5365 
5366 // Generated as internal constructor for term x64_pcmpgtq.
5367 pub fn constructor_x64_pcmpgtq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> {
5368     let pattern0_0 = arg0;
5369     let pattern1_0 = arg1;
5370     // Rule at src/isa/x64/inst.isle line 2841.
5371     let expr0_0: Type = I64X2;
5372     let expr1_0 = SseOpcode::Pcmpgtq;
5373     let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?;
5374     return Some(expr2_0);
5375 }
5376 
5377 // Generated as internal constructor for term alu_rm.
5378 pub fn constructor_alu_rm<C: Context>(
5379     ctx: &mut C,
5380     arg0: Type,
5381     arg1: &AluRmiROpcode,
5382     arg2: &Amode,
5383     arg3: Gpr,
5384 ) -> Option<SideEffectNoResult> {
5385     let pattern0_0 = arg0;
5386     let pattern1_0 = arg1;
5387     let pattern2_0 = arg2;
5388     let pattern3_0 = arg3;
5389     // Rule at src/isa/x64/inst.isle line 2845.
5390     let expr0_0 = C::operand_size_of_type_32_64(ctx, pattern0_0);
5391     let expr1_0 = C::amode_to_synthetic_amode(ctx, pattern2_0);
5392     let expr2_0 = MInst::AluRM {
5393         size: expr0_0,
5394         op: pattern1_0.clone(),
5395         src1_dst: expr1_0,
5396         src2: pattern3_0,
5397     };
5398     let expr3_0 = SideEffectNoResult::Inst { inst: expr2_0 };
5399     return Some(expr3_0);
5400 }
5401 
5402 // Generated as internal constructor for term x64_add_mem.
5403 pub fn constructor_x64_add_mem<C: Context>(
5404     ctx: &mut C,
5405     arg0: Type,
5406     arg1: &Amode,
5407     arg2: Gpr,
5408 ) -> Option<SideEffectNoResult> {
5409     let pattern0_0 = arg0;
5410     let pattern1_0 = arg1;
5411     let pattern2_0 = arg2;
5412     // Rule at src/isa/x64/inst.isle line 2850.
5413     let expr0_0 = AluRmiROpcode::Add;
5414     let expr1_0 = constructor_alu_rm(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
5415     return Some(expr1_0);
5416 }
5417 
5418 // Generated as internal constructor for term x64_sub_mem.
5419 pub fn constructor_x64_sub_mem<C: Context>(
5420     ctx: &mut C,
5421     arg0: Type,
5422     arg1: &Amode,
5423     arg2: Gpr,
5424 ) -> Option<SideEffectNoResult> {
5425     let pattern0_0 = arg0;
5426     let pattern1_0 = arg1;
5427     let pattern2_0 = arg2;
5428     // Rule at src/isa/x64/inst.isle line 2854.
5429     let expr0_0 = AluRmiROpcode::Sub;
5430     let expr1_0 = constructor_alu_rm(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
5431     return Some(expr1_0);
5432 }
5433 
5434 // Generated as internal constructor for term x64_and_mem.
5435 pub fn constructor_x64_and_mem<C: Context>(
5436     ctx: &mut C,
5437     arg0: Type,
5438     arg1: &Amode,
5439     arg2: Gpr,
5440 ) -> Option<SideEffectNoResult> {
5441     let pattern0_0 = arg0;
5442     let pattern1_0 = arg1;
5443     let pattern2_0 = arg2;
5444     // Rule at src/isa/x64/inst.isle line 2858.
5445     let expr0_0 = AluRmiROpcode::And;
5446     let expr1_0 = constructor_alu_rm(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
5447     return Some(expr1_0);
5448 }
5449 
5450 // Generated as internal constructor for term x64_or_mem.
5451 pub fn constructor_x64_or_mem<C: Context>(
5452     ctx: &mut C,
5453     arg0: Type,
5454     arg1: &Amode,
5455     arg2: Gpr,
5456 ) -> Option<SideEffectNoResult> {
5457     let pattern0_0 = arg0;
5458     let pattern1_0 = arg1;
5459     let pattern2_0 = arg2;
5460     // Rule at src/isa/x64/inst.isle line 2862.
5461     let expr0_0 = AluRmiROpcode::Or;
5462     let expr1_0 = constructor_alu_rm(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
5463     return Some(expr1_0);
5464 }
5465 
5466 // Generated as internal constructor for term x64_xor_mem.
5467 pub fn constructor_x64_xor_mem<C: Context>(
5468     ctx: &mut C,
5469     arg0: Type,
5470     arg1: &Amode,
5471     arg2: Gpr,
5472 ) -> Option<SideEffectNoResult> {
5473     let pattern0_0 = arg0;
5474     let pattern1_0 = arg1;
5475     let pattern2_0 = arg2;
5476     // Rule at src/isa/x64/inst.isle line 2866.
5477     let expr0_0 = AluRmiROpcode::Xor;
5478     let expr1_0 = constructor_alu_rm(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?;
5479     return Some(expr1_0);
5480 }
5481 
5482 // Generated as internal constructor for term reg_to_xmm_mem.
5483 pub fn constructor_reg_to_xmm_mem<C: Context>(ctx: &mut C, arg0: Reg) -> Option<XmmMem> {
5484     let pattern0_0 = arg0;
5485     // Rule at src/isa/x64/inst.isle line 2923.
5486     let expr0_0 = C::xmm_new(ctx, pattern0_0);
5487     let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
5488     return Some(expr1_0);
5489 }
5490 
5491 // Generated as internal constructor for term xmm_to_reg_mem.
5492 pub fn constructor_xmm_to_reg_mem<C: Context>(ctx: &mut C, arg0: Reg) -> Option<XmmMem> {
5493     let pattern0_0 = arg0;
5494     // Rule at src/isa/x64/inst.isle line 2926.
5495     let expr0_0 = C::xmm_new(ctx, pattern0_0);
5496     let expr1_0 = C::xmm_to_reg(ctx, expr0_0);
5497     let expr2_0 = RegMem::Reg { reg: expr1_0 };
5498     let expr3_0 = C::reg_mem_to_xmm_mem(ctx, &expr2_0);
5499     return Some(expr3_0);
5500 }
5501 
5502 // Generated as internal constructor for term writable_gpr_to_r_reg.
5503 pub fn constructor_writable_gpr_to_r_reg<C: Context>(
5504     ctx: &mut C,
5505     arg0: WritableGpr,
5506 ) -> Option<Reg> {
5507     let pattern0_0 = arg0;
5508     // Rule at src/isa/x64/inst.isle line 2930.
5509     let expr0_0 = C::writable_gpr_to_reg(ctx, pattern0_0);
5510     let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0);
5511     return Some(expr1_0);
5512 }
5513 
5514 // Generated as internal constructor for term writable_gpr_to_gpr_mem.
5515 pub fn constructor_writable_gpr_to_gpr_mem<C: Context>(
5516     ctx: &mut C,
5517     arg0: WritableGpr,
5518 ) -> Option<GprMem> {
5519     let pattern0_0 = arg0;
5520     // Rule at src/isa/x64/inst.isle line 2933.
5521     let expr0_0 = C::writable_gpr_to_gpr(ctx, pattern0_0);
5522     let expr1_0 = C::gpr_to_gpr_mem(ctx, expr0_0);
5523     return Some(expr1_0);
5524 }
5525 
5526 // Generated as internal constructor for term writable_gpr_to_value_regs.
5527 pub fn constructor_writable_gpr_to_value_regs<C: Context>(
5528     ctx: &mut C,
5529     arg0: WritableGpr,
5530 ) -> Option<ValueRegs> {
5531     let pattern0_0 = arg0;
5532     // Rule at src/isa/x64/inst.isle line 2936.
5533     let expr0_0 = constructor_writable_gpr_to_r_reg(ctx, pattern0_0)?;
5534     let expr1_0 = C::value_reg(ctx, expr0_0);
5535     return Some(expr1_0);
5536 }
5537 
5538 // Generated as internal constructor for term writable_xmm_to_r_reg.
5539 pub fn constructor_writable_xmm_to_r_reg<C: Context>(
5540     ctx: &mut C,
5541     arg0: WritableXmm,
5542 ) -> Option<Reg> {
5543     let pattern0_0 = arg0;
5544     // Rule at src/isa/x64/inst.isle line 2939.
5545     let expr0_0 = C::writable_xmm_to_reg(ctx, pattern0_0);
5546     let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0);
5547     return Some(expr1_0);
5548 }
5549 
5550 // Generated as internal constructor for term writable_xmm_to_xmm_mem.
5551 pub fn constructor_writable_xmm_to_xmm_mem<C: Context>(
5552     ctx: &mut C,
5553     arg0: WritableXmm,
5554 ) -> Option<XmmMem> {
5555     let pattern0_0 = arg0;
5556     // Rule at src/isa/x64/inst.isle line 2942.
5557     let expr0_0 = C::writable_xmm_to_xmm(ctx, pattern0_0);
5558     let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
5559     return Some(expr1_0);
5560 }
5561 
5562 // Generated as internal constructor for term writable_xmm_to_value_regs.
5563 pub fn constructor_writable_xmm_to_value_regs<C: Context>(
5564     ctx: &mut C,
5565     arg0: WritableXmm,
5566 ) -> Option<ValueRegs> {
5567     let pattern0_0 = arg0;
5568     // Rule at src/isa/x64/inst.isle line 2945.
5569     let expr0_0 = constructor_writable_xmm_to_r_reg(ctx, pattern0_0)?;
5570     let expr1_0 = C::value_reg(ctx, expr0_0);
5571     return Some(expr1_0);
5572 }
5573 
5574 // Generated as internal constructor for term synthetic_amode_to_gpr_mem.
5575 pub fn constructor_synthetic_amode_to_gpr_mem<C: Context>(
5576     ctx: &mut C,
5577     arg0: &SyntheticAmode,
5578 ) -> Option<GprMem> {
5579     let pattern0_0 = arg0;
5580     // Rule at src/isa/x64/inst.isle line 2952.
5581     let expr0_0 = C::synthetic_amode_to_reg_mem(ctx, pattern0_0);
5582     let expr1_0 = C::reg_mem_to_gpr_mem(ctx, &expr0_0);
5583     return Some(expr1_0);
5584 }
5585 
5586 // Generated as internal constructor for term amode_to_gpr_mem.
5587 pub fn constructor_amode_to_gpr_mem<C: Context>(ctx: &mut C, arg0: &Amode) -> Option<GprMem> {
5588     let pattern0_0 = arg0;
5589     // Rule at src/isa/x64/inst.isle line 2950.
5590     let expr0_0 = C::amode_to_synthetic_amode(ctx, pattern0_0);
5591     let expr1_0 = constructor_synthetic_amode_to_gpr_mem(ctx, &expr0_0)?;
5592     return Some(expr1_0);
5593 }
5594 
5595 // Generated as internal constructor for term amode_to_xmm_mem.
5596 pub fn constructor_amode_to_xmm_mem<C: Context>(ctx: &mut C, arg0: &Amode) -> Option<XmmMem> {
5597     let pattern0_0 = arg0;
5598     // Rule at src/isa/x64/inst.isle line 2955.
5599     let expr0_0 = C::amode_to_synthetic_amode(ctx, pattern0_0);
5600     let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, &expr0_0)?;
5601     return Some(expr1_0);
5602 }
5603 
5604 // Generated as internal constructor for term synthetic_amode_to_xmm_mem.
5605 pub fn constructor_synthetic_amode_to_xmm_mem<C: Context>(
5606     ctx: &mut C,
5607     arg0: &SyntheticAmode,
5608 ) -> Option<XmmMem> {
5609     let pattern0_0 = arg0;
5610     // Rule at src/isa/x64/inst.isle line 2958.
5611     let expr0_0 = C::synthetic_amode_to_reg_mem(ctx, pattern0_0);
5612     let expr1_0 = C::reg_mem_to_xmm_mem(ctx, &expr0_0);
5613     return Some(expr1_0);
5614 }
5615 
5616 // Generated as internal constructor for term lower.
5617 pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutput> {
5618     let pattern0_0 = arg0;
5619     if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) {
5620         let pattern2_0 = C::value_type(ctx, pattern1_0);
5621         if pattern2_0 == I128 {
5622             if let Some(()) = C::use_popcnt(ctx, pattern2_0) {
5623                 let pattern5_0 = C::inst_data(ctx, pattern0_0);
5624                 if let &InstructionData::Unary {
5625                     opcode: ref pattern6_0,
5626                     arg: pattern6_1,
5627                 } = &pattern5_0
5628                 {
5629                     if let &Opcode::Popcnt = pattern6_0 {
5630                         // Rule at src/isa/x64/lower.isle line 1876.
5631                         let expr0_0: Type = I64;
5632                         let expr1_0 = C::put_in_regs(ctx, pattern6_1);
5633                         let expr2_0: usize = 0;
5634                         let expr3_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr2_0)?;
5635                         let expr4_0 = constructor_x64_popcnt(ctx, expr0_0, expr3_0)?;
5636                         let expr5_0: Type = I64;
5637                         let expr6_0 = C::put_in_regs(ctx, pattern6_1);
5638                         let expr7_0: usize = 1;
5639                         let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0)?;
5640                         let expr9_0 = constructor_x64_popcnt(ctx, expr5_0, expr8_0)?;
5641                         let expr10_0: Type = I64;
5642                         let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
5643                         let expr12_0 = constructor_x64_add(ctx, expr10_0, expr4_0, &expr11_0)?;
5644                         let expr13_0 = C::gpr_to_reg(ctx, expr12_0);
5645                         let expr14_0: Type = I64;
5646                         let expr15_0: u64 = 0;
5647                         let expr16_0 = constructor_imm(ctx, expr14_0, expr15_0)?;
5648                         let expr17_0 = C::value_regs(ctx, expr13_0, expr16_0);
5649                         let expr18_0 = C::output(ctx, expr17_0);
5650                         return Some(expr18_0);
5651                     }
5652                 }
5653             }
5654         }
5655         if pattern2_0 == I8X16 {
5656             if let Some(()) = C::avx512vl_enabled(ctx, pattern2_0) {
5657                 if let Some(()) = C::avx512bitalg_enabled(ctx, pattern2_0) {
5658                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
5659                     if let &InstructionData::Unary {
5660                         opcode: ref pattern7_0,
5661                         arg: pattern7_1,
5662                     } = &pattern6_0
5663                     {
5664                         if let &Opcode::Popcnt = pattern7_0 {
5665                             // Rule at src/isa/x64/lower.isle line 1968.
5666                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
5667                             let expr1_0 = constructor_x64_vpopcntb(ctx, &expr0_0)?;
5668                             let expr2_0 = constructor_output_xmm(ctx, expr1_0)?;
5669                             return Some(expr2_0);
5670                         }
5671                     }
5672                 }
5673             }
5674         }
5675         if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) {
5676             if let Some(()) = C::use_lzcnt(ctx, pattern2_0) {
5677                 let pattern5_0 = C::inst_data(ctx, pattern0_0);
5678                 if let &InstructionData::Unary {
5679                     opcode: ref pattern6_0,
5680                     arg: pattern6_1,
5681                 } = &pattern5_0
5682                 {
5683                     if let &Opcode::Clz = pattern6_0 {
5684                         // Rule at src/isa/x64/lower.isle line 1784.
5685                         let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1)?;
5686                         let expr1_0 = constructor_x64_lzcnt(ctx, pattern3_0, expr0_0)?;
5687                         let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
5688                         return Some(expr2_0);
5689                     }
5690                 }
5691             }
5692             if let Some(()) = C::use_bmi1(ctx, pattern2_0) {
5693                 let pattern5_0 = C::inst_data(ctx, pattern0_0);
5694                 if let &InstructionData::Unary {
5695                     opcode: ref pattern6_0,
5696                     arg: pattern6_1,
5697                 } = &pattern5_0
5698                 {
5699                     if let &Opcode::Ctz = pattern6_0 {
5700                         // Rule at src/isa/x64/lower.isle line 1826.
5701                         let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1)?;
5702                         let expr1_0 = constructor_x64_tzcnt(ctx, pattern3_0, expr0_0)?;
5703                         let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
5704                         return Some(expr2_0);
5705                     }
5706                 }
5707             }
5708             if let Some(()) = C::use_popcnt(ctx, pattern2_0) {
5709                 let pattern5_0 = C::inst_data(ctx, pattern0_0);
5710                 if let &InstructionData::Unary {
5711                     opcode: ref pattern6_0,
5712                     arg: pattern6_1,
5713                 } = &pattern5_0
5714                 {
5715                     if let &Opcode::Popcnt = pattern6_0 {
5716                         // Rule at src/isa/x64/lower.isle line 1862.
5717                         let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1)?;
5718                         let expr1_0 = constructor_x64_popcnt(ctx, pattern3_0, expr0_0)?;
5719                         let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
5720                         return Some(expr2_0);
5721                     }
5722                 }
5723             }
5724         }
5725         if let Some(pattern3_0) = C::ty_8_or_16(ctx, pattern2_0) {
5726             if let Some(()) = C::use_popcnt(ctx, pattern2_0) {
5727                 let pattern5_0 = C::inst_data(ctx, pattern0_0);
5728                 if let &InstructionData::Unary {
5729                     opcode: ref pattern6_0,
5730                     arg: pattern6_1,
5731                 } = &pattern5_0
5732                 {
5733                     if let &Opcode::Popcnt = pattern6_0 {
5734                         // Rule at src/isa/x64/lower.isle line 1869.
5735                         let expr0_0: Type = I32;
5736                         let expr1_0: Type = I32;
5737                         let expr2_0 = ExtendKind::Zero;
5738                         let expr3_0 =
5739                             constructor_extend_to_gpr(ctx, pattern6_1, expr1_0, &expr2_0)?;
5740                         let expr4_0 = constructor_x64_popcnt(ctx, expr0_0, expr3_0)?;
5741                         let expr5_0 = constructor_output_gpr(ctx, expr4_0)?;
5742                         return Some(expr5_0);
5743                     }
5744                 }
5745             }
5746         }
5747     }
5748     let pattern0_0 = arg0;
5749     let pattern1_0 = C::inst_data(ctx, pattern0_0);
5750     match &pattern1_0 {
5751         &InstructionData::NullAry {
5752             opcode: ref pattern2_0,
5753         } => {
5754             if let &Opcode::Debugtrap = pattern2_0 {
5755                 // Rule at src/isa/x64/lower.isle line 2254.
5756                 let expr0_0 = constructor_x64_hlt(ctx)?;
5757                 let expr1_0 = constructor_side_effect(ctx, &expr0_0)?;
5758                 return Some(expr1_0);
5759             }
5760         }
5761         &InstructionData::UnaryIeee32 {
5762             opcode: ref pattern2_0,
5763             imm: pattern2_1,
5764         } => {
5765             if let &Opcode::F32const = pattern2_0 {
5766                 let pattern4_0 = C::u64_from_ieee32(ctx, pattern2_1);
5767                 // Rule at src/isa/x64/lower.isle line 46.
5768                 let expr0_0: Type = F32;
5769                 let expr1_0 = constructor_imm(ctx, expr0_0, pattern4_0)?;
5770                 let expr2_0 = constructor_output_reg(ctx, expr1_0)?;
5771                 return Some(expr2_0);
5772             }
5773         }
5774         &InstructionData::UnaryIeee64 {
5775             opcode: ref pattern2_0,
5776             imm: pattern2_1,
5777         } => {
5778             if let &Opcode::F64const = pattern2_0 {
5779                 let pattern4_0 = C::u64_from_ieee64(ctx, pattern2_1);
5780                 // Rule at src/isa/x64/lower.isle line 51.
5781                 let expr0_0: Type = F64;
5782                 let expr1_0 = constructor_imm(ctx, expr0_0, pattern4_0)?;
5783                 let expr2_0 = constructor_output_reg(ctx, expr1_0)?;
5784                 return Some(expr2_0);
5785             }
5786         }
5787         &InstructionData::Trap {
5788             opcode: ref pattern2_0,
5789             code: ref pattern2_1,
5790         } => {
5791             match pattern2_0 {
5792                 &Opcode::Trap => {
5793                     // Rule at src/isa/x64/lower.isle line 1438.
5794                     let expr0_0 = constructor_x64_ud2(ctx, pattern2_1)?;
5795                     let expr1_0 = constructor_side_effect(ctx, &expr0_0)?;
5796                     return Some(expr1_0);
5797                 }
5798                 &Opcode::ResumableTrap => {
5799                     // Rule at src/isa/x64/lower.isle line 1443.
5800                     let expr0_0 = constructor_x64_ud2(ctx, pattern2_1)?;
5801                     let expr1_0 = constructor_side_effect(ctx, &expr0_0)?;
5802                     return Some(expr1_0);
5803                 }
5804                 _ => {}
5805             }
5806         }
5807         &InstructionData::Store {
5808             opcode: ref pattern2_0,
5809             args: ref pattern2_1,
5810             flags: pattern2_2,
5811             offset: pattern2_3,
5812         } => {
5813             match pattern2_0 {
5814                 &Opcode::Store => {
5815                     let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1);
5816                     if let Some(pattern5_0) = C::def_inst(ctx, pattern4_0) {
5817                         if let Some(pattern6_0) = C::first_result(ctx, pattern5_0) {
5818                             let pattern7_0 = C::value_type(ctx, pattern6_0);
5819                             if let Some(pattern8_0) = C::ty_32_or_64(ctx, pattern7_0) {
5820                                 let pattern9_0 = C::inst_data(ctx, pattern5_0);
5821                                 if let &InstructionData::Binary {
5822                                     opcode: ref pattern10_0,
5823                                     args: ref pattern10_1,
5824                                 } = &pattern9_0
5825                                 {
5826                                     match pattern10_0 {
5827                                         &Opcode::Iadd => {
5828                                             let (pattern12_0, pattern12_1) =
5829                                                 C::unpack_value_array_2(ctx, pattern10_1);
5830                                             if let Some(pattern13_0) =
5831                                                 C::sinkable_load(ctx, pattern12_0)
5832                                             {
5833                                                 if let Some(pattern14_0) =
5834                                                     C::def_inst(ctx, pattern12_0)
5835                                                 {
5836                                                     let pattern15_0 =
5837                                                         C::inst_data(ctx, pattern14_0);
5838                                                     if let &InstructionData::Load {
5839                                                         opcode: ref pattern16_0,
5840                                                         arg: pattern16_1,
5841                                                         flags: pattern16_2,
5842                                                         offset: pattern16_3,
5843                                                     } = &pattern15_0
5844                                                     {
5845                                                         if let &Opcode::Load = pattern16_0 {
5846                                                             if pattern4_1 == pattern16_1 {
5847                                                                 if pattern2_2 == pattern16_2 {
5848                                                                     if pattern2_3 == pattern16_3 {
5849                                                                         // Rule at src/isa/x64/lower.isle line 2662.
5850                                                                         let expr0_0 = C::sink_load(
5851                                                                             ctx,
5852                                                                             &pattern13_0,
5853                                                                         );
5854                                                                         let expr1_0 =
5855                                                                             constructor_to_amode(
5856                                                                                 ctx,
5857                                                                                 pattern16_2,
5858                                                                                 pattern16_1,
5859                                                                                 pattern16_3,
5860                                                                             )?;
5861                                                                         let expr2_0 =
5862                                                                             constructor_put_in_gpr(
5863                                                                                 ctx,
5864                                                                                 pattern12_1,
5865                                                                             )?;
5866                                                                         let expr3_0 = constructor_x64_add_mem(ctx, pattern8_0, &expr1_0, expr2_0)?;
5867                                                                         let expr4_0 = constructor_side_effect(ctx, &expr3_0)?;
5868                                                                         return Some(expr4_0);
5869                                                                     }
5870                                                                 }
5871                                                             }
5872                                                         }
5873                                                     }
5874                                                 }
5875                                             }
5876                                             if let Some(pattern13_0) =
5877                                                 C::sinkable_load(ctx, pattern12_1)
5878                                             {
5879                                                 if let Some(pattern14_0) =
5880                                                     C::def_inst(ctx, pattern12_1)
5881                                                 {
5882                                                     let pattern15_0 =
5883                                                         C::inst_data(ctx, pattern14_0);
5884                                                     if let &InstructionData::Load {
5885                                                         opcode: ref pattern16_0,
5886                                                         arg: pattern16_1,
5887                                                         flags: pattern16_2,
5888                                                         offset: pattern16_3,
5889                                                     } = &pattern15_0
5890                                                     {
5891                                                         if let &Opcode::Load = pattern16_0 {
5892                                                             if pattern4_1 == pattern16_1 {
5893                                                                 if pattern2_2 == pattern16_2 {
5894                                                                     if pattern2_3 == pattern16_3 {
5895                                                                         // Rule at src/isa/x64/lower.isle line 2676.
5896                                                                         let expr0_0 = C::sink_load(
5897                                                                             ctx,
5898                                                                             &pattern13_0,
5899                                                                         );
5900                                                                         let expr1_0 =
5901                                                                             constructor_to_amode(
5902                                                                                 ctx,
5903                                                                                 pattern16_2,
5904                                                                                 pattern16_1,
5905                                                                                 pattern16_3,
5906                                                                             )?;
5907                                                                         let expr2_0 =
5908                                                                             constructor_put_in_gpr(
5909                                                                                 ctx,
5910                                                                                 pattern12_0,
5911                                                                             )?;
5912                                                                         let expr3_0 = constructor_x64_add_mem(ctx, pattern8_0, &expr1_0, expr2_0)?;
5913                                                                         let expr4_0 = constructor_side_effect(ctx, &expr3_0)?;
5914                                                                         return Some(expr4_0);
5915                                                                     }
5916                                                                 }
5917                                                             }
5918                                                         }
5919                                                     }
5920                                                 }
5921                                             }
5922                                         }
5923                                         &Opcode::Isub => {
5924                                             let (pattern12_0, pattern12_1) =
5925                                                 C::unpack_value_array_2(ctx, pattern10_1);
5926                                             if let Some(pattern13_0) =
5927                                                 C::sinkable_load(ctx, pattern12_0)
5928                                             {
5929                                                 if let Some(pattern14_0) =
5930                                                     C::def_inst(ctx, pattern12_0)
5931                                                 {
5932                                                     let pattern15_0 =
5933                                                         C::inst_data(ctx, pattern14_0);
5934                                                     if let &InstructionData::Load {
5935                                                         opcode: ref pattern16_0,
5936                                                         arg: pattern16_1,
5937                                                         flags: pattern16_2,
5938                                                         offset: pattern16_3,
5939                                                     } = &pattern15_0
5940                                                     {
5941                                                         if let &Opcode::Load = pattern16_0 {
5942                                                             if pattern4_1 == pattern16_1 {
5943                                                                 if pattern2_2 == pattern16_2 {
5944                                                                     if pattern2_3 == pattern16_3 {
5945                                                                         // Rule at src/isa/x64/lower.isle line 2690.
5946                                                                         let expr0_0 = C::sink_load(
5947                                                                             ctx,
5948                                                                             &pattern13_0,
5949                                                                         );
5950                                                                         let expr1_0 =
5951                                                                             constructor_to_amode(
5952                                                                                 ctx,
5953                                                                                 pattern16_2,
5954                                                                                 pattern16_1,
5955                                                                                 pattern16_3,
5956                                                                             )?;
5957                                                                         let expr2_0 =
5958                                                                             constructor_put_in_gpr(
5959                                                                                 ctx,
5960                                                                                 pattern12_1,
5961                                                                             )?;
5962                                                                         let expr3_0 = constructor_x64_sub_mem(ctx, pattern8_0, &expr1_0, expr2_0)?;
5963                                                                         let expr4_0 = constructor_side_effect(ctx, &expr3_0)?;
5964                                                                         return Some(expr4_0);
5965                                                                     }
5966                                                                 }
5967                                                             }
5968                                                         }
5969                                                     }
5970                                                 }
5971                                             }
5972                                         }
5973                                         &Opcode::Band => {
5974                                             let (pattern12_0, pattern12_1) =
5975                                                 C::unpack_value_array_2(ctx, pattern10_1);
5976                                             if let Some(pattern13_0) =
5977                                                 C::sinkable_load(ctx, pattern12_0)
5978                                             {
5979                                                 if let Some(pattern14_0) =
5980                                                     C::def_inst(ctx, pattern12_0)
5981                                                 {
5982                                                     let pattern15_0 =
5983                                                         C::inst_data(ctx, pattern14_0);
5984                                                     if let &InstructionData::Load {
5985                                                         opcode: ref pattern16_0,
5986                                                         arg: pattern16_1,
5987                                                         flags: pattern16_2,
5988                                                         offset: pattern16_3,
5989                                                     } = &pattern15_0
5990                                                     {
5991                                                         if let &Opcode::Load = pattern16_0 {
5992                                                             if pattern4_1 == pattern16_1 {
5993                                                                 if pattern2_2 == pattern16_2 {
5994                                                                     if pattern2_3 == pattern16_3 {
5995                                                                         // Rule at src/isa/x64/lower.isle line 2704.
5996                                                                         let expr0_0 = C::sink_load(
5997                                                                             ctx,
5998                                                                             &pattern13_0,
5999                                                                         );
6000                                                                         let expr1_0 =
6001                                                                             constructor_to_amode(
6002                                                                                 ctx,
6003                                                                                 pattern16_2,
6004                                                                                 pattern16_1,
6005                                                                                 pattern16_3,
6006                                                                             )?;
6007                                                                         let expr2_0 =
6008                                                                             constructor_put_in_gpr(
6009                                                                                 ctx,
6010                                                                                 pattern12_1,
6011                                                                             )?;
6012                                                                         let expr3_0 = constructor_x64_and_mem(ctx, pattern8_0, &expr1_0, expr2_0)?;
6013                                                                         let expr4_0 = constructor_side_effect(ctx, &expr3_0)?;
6014                                                                         return Some(expr4_0);
6015                                                                     }
6016                                                                 }
6017                                                             }
6018                                                         }
6019                                                     }
6020                                                 }
6021                                             }
6022                                             if let Some(pattern13_0) =
6023                                                 C::sinkable_load(ctx, pattern12_1)
6024                                             {
6025                                                 if let Some(pattern14_0) =
6026                                                     C::def_inst(ctx, pattern12_1)
6027                                                 {
6028                                                     let pattern15_0 =
6029                                                         C::inst_data(ctx, pattern14_0);
6030                                                     if let &InstructionData::Load {
6031                                                         opcode: ref pattern16_0,
6032                                                         arg: pattern16_1,
6033                                                         flags: pattern16_2,
6034                                                         offset: pattern16_3,
6035                                                     } = &pattern15_0
6036                                                     {
6037                                                         if let &Opcode::Load = pattern16_0 {
6038                                                             if pattern4_1 == pattern16_1 {
6039                                                                 if pattern2_2 == pattern16_2 {
6040                                                                     if pattern2_3 == pattern16_3 {
6041                                                                         // Rule at src/isa/x64/lower.isle line 2718.
6042                                                                         let expr0_0 = C::sink_load(
6043                                                                             ctx,
6044                                                                             &pattern13_0,
6045                                                                         );
6046                                                                         let expr1_0 =
6047                                                                             constructor_to_amode(
6048                                                                                 ctx,
6049                                                                                 pattern16_2,
6050                                                                                 pattern16_1,
6051                                                                                 pattern16_3,
6052                                                                             )?;
6053                                                                         let expr2_0 =
6054                                                                             constructor_put_in_gpr(
6055                                                                                 ctx,
6056                                                                                 pattern12_0,
6057                                                                             )?;
6058                                                                         let expr3_0 = constructor_x64_and_mem(ctx, pattern8_0, &expr1_0, expr2_0)?;
6059                                                                         let expr4_0 = constructor_side_effect(ctx, &expr3_0)?;
6060                                                                         return Some(expr4_0);
6061                                                                     }
6062                                                                 }
6063                                                             }
6064                                                         }
6065                                                     }
6066                                                 }
6067                                             }
6068                                         }
6069                                         &Opcode::Bor => {
6070                                             let (pattern12_0, pattern12_1) =
6071                                                 C::unpack_value_array_2(ctx, pattern10_1);
6072                                             if let Some(pattern13_0) =
6073                                                 C::sinkable_load(ctx, pattern12_0)
6074                                             {
6075                                                 if let Some(pattern14_0) =
6076                                                     C::def_inst(ctx, pattern12_0)
6077                                                 {
6078                                                     let pattern15_0 =
6079                                                         C::inst_data(ctx, pattern14_0);
6080                                                     if let &InstructionData::Load {
6081                                                         opcode: ref pattern16_0,
6082                                                         arg: pattern16_1,
6083                                                         flags: pattern16_2,
6084                                                         offset: pattern16_3,
6085                                                     } = &pattern15_0
6086                                                     {
6087                                                         if let &Opcode::Load = pattern16_0 {
6088                                                             if pattern4_1 == pattern16_1 {
6089                                                                 if pattern2_2 == pattern16_2 {
6090                                                                     if pattern2_3 == pattern16_3 {
6091                                                                         // Rule at src/isa/x64/lower.isle line 2732.
6092                                                                         let expr0_0 = C::sink_load(
6093                                                                             ctx,
6094                                                                             &pattern13_0,
6095                                                                         );
6096                                                                         let expr1_0 =
6097                                                                             constructor_to_amode(
6098                                                                                 ctx,
6099                                                                                 pattern16_2,
6100                                                                                 pattern16_1,
6101                                                                                 pattern16_3,
6102                                                                             )?;
6103                                                                         let expr2_0 =
6104                                                                             constructor_put_in_gpr(
6105                                                                                 ctx,
6106                                                                                 pattern12_1,
6107                                                                             )?;
6108                                                                         let expr3_0 =
6109                                                                             constructor_x64_or_mem(
6110                                                                                 ctx, pattern8_0,
6111                                                                                 &expr1_0, expr2_0,
6112                                                                             )?;
6113                                                                         let expr4_0 = constructor_side_effect(ctx, &expr3_0)?;
6114                                                                         return Some(expr4_0);
6115                                                                     }
6116                                                                 }
6117                                                             }
6118                                                         }
6119                                                     }
6120                                                 }
6121                                             }
6122                                             if let Some(pattern13_0) =
6123                                                 C::sinkable_load(ctx, pattern12_1)
6124                                             {
6125                                                 if let Some(pattern14_0) =
6126                                                     C::def_inst(ctx, pattern12_1)
6127                                                 {
6128                                                     let pattern15_0 =
6129                                                         C::inst_data(ctx, pattern14_0);
6130                                                     if let &InstructionData::Load {
6131                                                         opcode: ref pattern16_0,
6132                                                         arg: pattern16_1,
6133                                                         flags: pattern16_2,
6134                                                         offset: pattern16_3,
6135                                                     } = &pattern15_0
6136                                                     {
6137                                                         if let &Opcode::Load = pattern16_0 {
6138                                                             if pattern4_1 == pattern16_1 {
6139                                                                 if pattern2_2 == pattern16_2 {
6140                                                                     if pattern2_3 == pattern16_3 {
6141                                                                         // Rule at src/isa/x64/lower.isle line 2746.
6142                                                                         let expr0_0 = C::sink_load(
6143                                                                             ctx,
6144                                                                             &pattern13_0,
6145                                                                         );
6146                                                                         let expr1_0 =
6147                                                                             constructor_to_amode(
6148                                                                                 ctx,
6149                                                                                 pattern16_2,
6150                                                                                 pattern16_1,
6151                                                                                 pattern16_3,
6152                                                                             )?;
6153                                                                         let expr2_0 =
6154                                                                             constructor_put_in_gpr(
6155                                                                                 ctx,
6156                                                                                 pattern12_0,
6157                                                                             )?;
6158                                                                         let expr3_0 =
6159                                                                             constructor_x64_or_mem(
6160                                                                                 ctx, pattern8_0,
6161                                                                                 &expr1_0, expr2_0,
6162                                                                             )?;
6163                                                                         let expr4_0 = constructor_side_effect(ctx, &expr3_0)?;
6164                                                                         return Some(expr4_0);
6165                                                                     }
6166                                                                 }
6167                                                             }
6168                                                         }
6169                                                     }
6170                                                 }
6171                                             }
6172                                         }
6173                                         &Opcode::Bxor => {
6174                                             let (pattern12_0, pattern12_1) =
6175                                                 C::unpack_value_array_2(ctx, pattern10_1);
6176                                             if let Some(pattern13_0) =
6177                                                 C::sinkable_load(ctx, pattern12_0)
6178                                             {
6179                                                 if let Some(pattern14_0) =
6180                                                     C::def_inst(ctx, pattern12_0)
6181                                                 {
6182                                                     let pattern15_0 =
6183                                                         C::inst_data(ctx, pattern14_0);
6184                                                     if let &InstructionData::Load {
6185                                                         opcode: ref pattern16_0,
6186                                                         arg: pattern16_1,
6187                                                         flags: pattern16_2,
6188                                                         offset: pattern16_3,
6189                                                     } = &pattern15_0
6190                                                     {
6191                                                         if let &Opcode::Load = pattern16_0 {
6192                                                             if pattern4_1 == pattern16_1 {
6193                                                                 if pattern2_2 == pattern16_2 {
6194                                                                     if pattern2_3 == pattern16_3 {
6195                                                                         // Rule at src/isa/x64/lower.isle line 2760.
6196                                                                         let expr0_0 = C::sink_load(
6197                                                                             ctx,
6198                                                                             &pattern13_0,
6199                                                                         );
6200                                                                         let expr1_0 =
6201                                                                             constructor_to_amode(
6202                                                                                 ctx,
6203                                                                                 pattern16_2,
6204                                                                                 pattern16_1,
6205                                                                                 pattern16_3,
6206                                                                             )?;
6207                                                                         let expr2_0 =
6208                                                                             constructor_put_in_gpr(
6209                                                                                 ctx,
6210                                                                                 pattern12_1,
6211                                                                             )?;
6212                                                                         let expr3_0 = constructor_x64_xor_mem(ctx, pattern8_0, &expr1_0, expr2_0)?;
6213                                                                         let expr4_0 = constructor_side_effect(ctx, &expr3_0)?;
6214                                                                         return Some(expr4_0);
6215                                                                     }
6216                                                                 }
6217                                                             }
6218                                                         }
6219                                                     }
6220                                                 }
6221                                             }
6222                                             if let Some(pattern13_0) =
6223                                                 C::sinkable_load(ctx, pattern12_1)
6224                                             {
6225                                                 if let Some(pattern14_0) =
6226                                                     C::def_inst(ctx, pattern12_1)
6227                                                 {
6228                                                     let pattern15_0 =
6229                                                         C::inst_data(ctx, pattern14_0);
6230                                                     if let &InstructionData::Load {
6231                                                         opcode: ref pattern16_0,
6232                                                         arg: pattern16_1,
6233                                                         flags: pattern16_2,
6234                                                         offset: pattern16_3,
6235                                                     } = &pattern15_0
6236                                                     {
6237                                                         if let &Opcode::Load = pattern16_0 {
6238                                                             if pattern4_1 == pattern16_1 {
6239                                                                 if pattern2_2 == pattern16_2 {
6240                                                                     if pattern2_3 == pattern16_3 {
6241                                                                         // Rule at src/isa/x64/lower.isle line 2774.
6242                                                                         let expr0_0 = C::sink_load(
6243                                                                             ctx,
6244                                                                             &pattern13_0,
6245                                                                         );
6246                                                                         let expr1_0 =
6247                                                                             constructor_to_amode(
6248                                                                                 ctx,
6249                                                                                 pattern16_2,
6250                                                                                 pattern16_1,
6251                                                                                 pattern16_3,
6252                                                                             )?;
6253                                                                         let expr2_0 =
6254                                                                             constructor_put_in_gpr(
6255                                                                                 ctx,
6256                                                                                 pattern12_0,
6257                                                                             )?;
6258                                                                         let expr3_0 = constructor_x64_xor_mem(ctx, pattern8_0, &expr1_0, expr2_0)?;
6259                                                                         let expr4_0 = constructor_side_effect(ctx, &expr3_0)?;
6260                                                                         return Some(expr4_0);
6261                                                                     }
6262                                                                 }
6263                                                             }
6264                                                         }
6265                                                     }
6266                                                 }
6267                                             }
6268                                         }
6269                                         _ => {}
6270                                     }
6271                                 }
6272                             }
6273                         }
6274                     }
6275                     let pattern5_0 = C::value_type(ctx, pattern4_0);
6276                     if pattern5_0 == F32 {
6277                         // Rule at src/isa/x64/lower.isle line 2605.
6278                         let expr0_0 = SseOpcode::Movss;
6279                         let expr1_0 =
6280                             constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3)?;
6281                         let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0);
6282                         let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6283                         let expr4_0 = constructor_x64_xmm_movrm(ctx, &expr0_0, &expr2_0, expr3_0)?;
6284                         let expr5_0 = constructor_side_effect(ctx, &expr4_0)?;
6285                         return Some(expr5_0);
6286                     }
6287                     if pattern5_0 == F64 {
6288                         // Rule at src/isa/x64/lower.isle line 2613.
6289                         let expr0_0 = SseOpcode::Movsd;
6290                         let expr1_0 =
6291                             constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3)?;
6292                         let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0);
6293                         let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6294                         let expr4_0 = constructor_x64_xmm_movrm(ctx, &expr0_0, &expr2_0, expr3_0)?;
6295                         let expr5_0 = constructor_side_effect(ctx, &expr4_0)?;
6296                         return Some(expr5_0);
6297                     }
6298                     if pattern5_0 == F32X4 {
6299                         // Rule at src/isa/x64/lower.isle line 2621.
6300                         let expr0_0 = SseOpcode::Movups;
6301                         let expr1_0 =
6302                             constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3)?;
6303                         let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0);
6304                         let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6305                         let expr4_0 = constructor_x64_xmm_movrm(ctx, &expr0_0, &expr2_0, expr3_0)?;
6306                         let expr5_0 = constructor_side_effect(ctx, &expr4_0)?;
6307                         return Some(expr5_0);
6308                     }
6309                     if pattern5_0 == F64X2 {
6310                         // Rule at src/isa/x64/lower.isle line 2629.
6311                         let expr0_0 = SseOpcode::Movupd;
6312                         let expr1_0 =
6313                             constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3)?;
6314                         let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0);
6315                         let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6316                         let expr4_0 = constructor_x64_xmm_movrm(ctx, &expr0_0, &expr2_0, expr3_0)?;
6317                         let expr5_0 = constructor_side_effect(ctx, &expr4_0)?;
6318                         return Some(expr5_0);
6319                     }
6320                     if let Some(pattern6_0) = C::ty_int_bool_128(ctx, pattern5_0) {
6321                         // Rule at src/isa/x64/lower.isle line 2645.
6322                         let expr0_0 = C::put_in_regs(ctx, pattern4_0);
6323                         let expr1_0: usize = 0;
6324                         let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
6325                         let expr3_0: usize = 1;
6326                         let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
6327                         let expr5_0 =
6328                             constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3)?;
6329                         let expr6_0: u32 = 8;
6330                         let expr7_0 = C::amode_offset(ctx, &expr5_0, expr6_0);
6331                         let expr8_0: Type = I64;
6332                         let expr9_0 = C::amode_to_synthetic_amode(ctx, &expr5_0);
6333                         let expr10_0 = constructor_x64_movrm(ctx, expr8_0, &expr9_0, expr2_0)?;
6334                         let expr11_0: Type = I64;
6335                         let expr12_0 = C::amode_to_synthetic_amode(ctx, &expr7_0);
6336                         let expr13_0 = constructor_x64_movrm(ctx, expr11_0, &expr12_0, expr4_0)?;
6337                         let expr14_0 = constructor_side_effect_concat(ctx, &expr10_0, &expr13_0)?;
6338                         let expr15_0 = constructor_side_effect(ctx, &expr14_0)?;
6339                         return Some(expr15_0);
6340                     }
6341                     if let Some(pattern6_0) = C::ty_vec128_int(ctx, pattern5_0) {
6342                         // Rule at src/isa/x64/lower.isle line 2637.
6343                         let expr0_0 = SseOpcode::Movdqu;
6344                         let expr1_0 =
6345                             constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3)?;
6346                         let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0);
6347                         let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6348                         let expr4_0 = constructor_x64_xmm_movrm(ctx, &expr0_0, &expr2_0, expr3_0)?;
6349                         let expr5_0 = constructor_side_effect(ctx, &expr4_0)?;
6350                         return Some(expr5_0);
6351                     }
6352                     if let Some(pattern6_0) = C::is_gpr_type(ctx, pattern5_0) {
6353                         // Rule at src/isa/x64/lower.isle line 2586.
6354                         let expr0_0 =
6355                             constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3)?;
6356                         let expr1_0 = C::amode_to_synthetic_amode(ctx, &expr0_0);
6357                         let expr2_0 = constructor_put_in_gpr(ctx, pattern4_0)?;
6358                         let expr3_0 = constructor_x64_movrm(ctx, pattern6_0, &expr1_0, expr2_0)?;
6359                         let expr4_0 = constructor_side_effect(ctx, &expr3_0)?;
6360                         return Some(expr4_0);
6361                     }
6362                 }
6363                 &Opcode::Istore8 => {
6364                     let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1);
6365                     // Rule at src/isa/x64/lower.isle line 2594.
6366                     let expr0_0: Type = I8;
6367                     let expr1_0 = constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3)?;
6368                     let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0);
6369                     let expr3_0 = constructor_put_in_gpr(ctx, pattern4_0)?;
6370                     let expr4_0 = constructor_x64_movrm(ctx, expr0_0, &expr2_0, expr3_0)?;
6371                     let expr5_0 = constructor_side_effect(ctx, &expr4_0)?;
6372                     return Some(expr5_0);
6373                 }
6374                 &Opcode::Istore16 => {
6375                     let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1);
6376                     // Rule at src/isa/x64/lower.isle line 2597.
6377                     let expr0_0: Type = I16;
6378                     let expr1_0 = constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3)?;
6379                     let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0);
6380                     let expr3_0 = constructor_put_in_gpr(ctx, pattern4_0)?;
6381                     let expr4_0 = constructor_x64_movrm(ctx, expr0_0, &expr2_0, expr3_0)?;
6382                     let expr5_0 = constructor_side_effect(ctx, &expr4_0)?;
6383                     return Some(expr5_0);
6384                 }
6385                 &Opcode::Istore32 => {
6386                     let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1);
6387                     // Rule at src/isa/x64/lower.isle line 2600.
6388                     let expr0_0: Type = I32;
6389                     let expr1_0 = constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3)?;
6390                     let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0);
6391                     let expr3_0 = constructor_put_in_gpr(ctx, pattern4_0)?;
6392                     let expr4_0 = constructor_x64_movrm(ctx, expr0_0, &expr2_0, expr3_0)?;
6393                     let expr5_0 = constructor_side_effect(ctx, &expr4_0)?;
6394                     return Some(expr5_0);
6395                 }
6396                 _ => {}
6397             }
6398         }
6399         &InstructionData::TernaryImm8 {
6400             opcode: ref pattern2_0,
6401             args: ref pattern2_1,
6402             imm: pattern2_2,
6403         } => {
6404             if let &Opcode::Insertlane = pattern2_0 {
6405                 let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1);
6406                 let pattern5_0 = C::value_type(ctx, pattern4_0);
6407                 let pattern6_0 = C::u8_from_uimm8(ctx, pattern2_2);
6408                 // Rule at src/isa/x64/lower.isle line 1302.
6409                 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6410                 let expr1_0 = C::put_in_reg_mem(ctx, pattern4_1);
6411                 let expr2_0 =
6412                     constructor_vec_insert_lane(ctx, pattern5_0, expr0_0, &expr1_0, pattern6_0)?;
6413                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6414                 return Some(expr3_0);
6415             }
6416         }
6417         &InstructionData::FloatCompare {
6418             opcode: ref pattern2_0,
6419             args: ref pattern2_1,
6420             cond: ref pattern2_2,
6421         } => {
6422             if let &Opcode::Fcmp = pattern2_0 {
6423                 let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1);
6424                 let pattern5_0 = C::value_type(ctx, pattern4_0);
6425                 if let Some(pattern6_0) = C::ty_scalar_float(ctx, pattern5_0) {
6426                     match pattern2_2 {
6427                         &FloatCC::Equal => {
6428                             // Rule at src/isa/x64/lower.isle line 1575.
6429                             let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?;
6430                             let expr1_0 = CC::NP;
6431                             let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?;
6432                             let expr3_0 = CC::Z;
6433                             let expr4_0 = constructor_x64_setcc(ctx, &expr3_0)?;
6434                             let expr5_0 =
6435                                 constructor_consumes_flags_concat(ctx, &expr2_0, &expr4_0)?;
6436                             let expr6_0 = constructor_with_flags(ctx, &expr0_0, &expr5_0)?;
6437                             let expr7_0: usize = 0;
6438                             let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0)?;
6439                             let expr9_0: usize = 1;
6440                             let expr10_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr9_0)?;
6441                             let expr11_0: Type = I32;
6442                             let expr12_0 = C::gpr_to_gpr_mem_imm(ctx, expr10_0);
6443                             let expr13_0 = constructor_x64_and(ctx, expr11_0, expr8_0, &expr12_0)?;
6444                             let expr14_0 = constructor_output_gpr(ctx, expr13_0)?;
6445                             return Some(expr14_0);
6446                         }
6447                         &FloatCC::GreaterThan => {
6448                             // Rule at src/isa/x64/lower.isle line 1603.
6449                             let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?;
6450                             let expr1_0 = CC::NBE;
6451                             let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?;
6452                             let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6453                             let expr4_0 = C::output(ctx, expr3_0);
6454                             return Some(expr4_0);
6455                         }
6456                         &FloatCC::GreaterThanOrEqual => {
6457                             // Rule at src/isa/x64/lower.isle line 1605.
6458                             let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?;
6459                             let expr1_0 = CC::NB;
6460                             let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?;
6461                             let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6462                             let expr4_0 = C::output(ctx, expr3_0);
6463                             return Some(expr4_0);
6464                         }
6465                         &FloatCC::LessThan => {
6466                             // Rule at src/isa/x64/lower.isle line 1615.
6467                             let expr0_0 = constructor_x64_ucomis(ctx, pattern4_0, pattern4_1)?;
6468                             let expr1_0 = CC::NBE;
6469                             let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?;
6470                             let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6471                             let expr4_0 = C::output(ctx, expr3_0);
6472                             return Some(expr4_0);
6473                         }
6474                         &FloatCC::LessThanOrEqual => {
6475                             // Rule at src/isa/x64/lower.isle line 1618.
6476                             let expr0_0 = constructor_x64_ucomis(ctx, pattern4_0, pattern4_1)?;
6477                             let expr1_0 = CC::NB;
6478                             let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?;
6479                             let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6480                             let expr4_0 = C::output(ctx, expr3_0);
6481                             return Some(expr4_0);
6482                         }
6483                         &FloatCC::NotEqual => {
6484                             // Rule at src/isa/x64/lower.isle line 1584.
6485                             let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?;
6486                             let expr1_0 = CC::P;
6487                             let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?;
6488                             let expr3_0 = CC::NZ;
6489                             let expr4_0 = constructor_x64_setcc(ctx, &expr3_0)?;
6490                             let expr5_0 =
6491                                 constructor_consumes_flags_concat(ctx, &expr2_0, &expr4_0)?;
6492                             let expr6_0 = constructor_with_flags(ctx, &expr0_0, &expr5_0)?;
6493                             let expr7_0: usize = 0;
6494                             let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0)?;
6495                             let expr9_0: usize = 1;
6496                             let expr10_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr9_0)?;
6497                             let expr11_0: Type = I32;
6498                             let expr12_0 = C::gpr_to_gpr_mem_imm(ctx, expr10_0);
6499                             let expr13_0 = constructor_x64_or(ctx, expr11_0, expr8_0, &expr12_0)?;
6500                             let expr14_0 = constructor_output_gpr(ctx, expr13_0)?;
6501                             return Some(expr14_0);
6502                         }
6503                         &FloatCC::Ordered => {
6504                             // Rule at src/isa/x64/lower.isle line 1595.
6505                             let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?;
6506                             let expr1_0 = CC::NP;
6507                             let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?;
6508                             let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6509                             let expr4_0 = C::output(ctx, expr3_0);
6510                             return Some(expr4_0);
6511                         }
6512                         &FloatCC::OrderedNotEqual => {
6513                             // Rule at src/isa/x64/lower.isle line 1599.
6514                             let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?;
6515                             let expr1_0 = CC::NZ;
6516                             let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?;
6517                             let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6518                             let expr4_0 = C::output(ctx, expr3_0);
6519                             return Some(expr4_0);
6520                         }
6521                         &FloatCC::Unordered => {
6522                             // Rule at src/isa/x64/lower.isle line 1597.
6523                             let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?;
6524                             let expr1_0 = CC::P;
6525                             let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?;
6526                             let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6527                             let expr4_0 = C::output(ctx, expr3_0);
6528                             return Some(expr4_0);
6529                         }
6530                         &FloatCC::UnorderedOrEqual => {
6531                             // Rule at src/isa/x64/lower.isle line 1601.
6532                             let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?;
6533                             let expr1_0 = CC::Z;
6534                             let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?;
6535                             let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6536                             let expr4_0 = C::output(ctx, expr3_0);
6537                             return Some(expr4_0);
6538                         }
6539                         &FloatCC::UnorderedOrGreaterThan => {
6540                             // Rule at src/isa/x64/lower.isle line 1621.
6541                             let expr0_0 = constructor_x64_ucomis(ctx, pattern4_0, pattern4_1)?;
6542                             let expr1_0 = CC::B;
6543                             let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?;
6544                             let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6545                             let expr4_0 = C::output(ctx, expr3_0);
6546                             return Some(expr4_0);
6547                         }
6548                         &FloatCC::UnorderedOrGreaterThanOrEqual => {
6549                             // Rule at src/isa/x64/lower.isle line 1624.
6550                             let expr0_0 = constructor_x64_ucomis(ctx, pattern4_0, pattern4_1)?;
6551                             let expr1_0 = CC::BE;
6552                             let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?;
6553                             let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6554                             let expr4_0 = C::output(ctx, expr3_0);
6555                             return Some(expr4_0);
6556                         }
6557                         &FloatCC::UnorderedOrLessThan => {
6558                             // Rule at src/isa/x64/lower.isle line 1607.
6559                             let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?;
6560                             let expr1_0 = CC::B;
6561                             let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?;
6562                             let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6563                             let expr4_0 = C::output(ctx, expr3_0);
6564                             return Some(expr4_0);
6565                         }
6566                         &FloatCC::UnorderedOrLessThanOrEqual => {
6567                             // Rule at src/isa/x64/lower.isle line 1609.
6568                             let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?;
6569                             let expr1_0 = CC::BE;
6570                             let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?;
6571                             let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
6572                             let expr4_0 = C::output(ctx, expr3_0);
6573                             return Some(expr4_0);
6574                         }
6575                         _ => {}
6576                     }
6577                 }
6578                 if let Some(pattern6_0) = C::ty_vec128(ctx, pattern5_0) {
6579                     match pattern2_2 {
6580                         &FloatCC::Equal => {
6581                             // Rule at src/isa/x64/lower.isle line 1632.
6582                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6583                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
6584                             let expr2_0 = FcmpImm::Equal;
6585                             let expr3_0 =
6586                                 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?;
6587                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
6588                             return Some(expr4_0);
6589                         }
6590                         &FloatCC::GreaterThan => {
6591                             // Rule at src/isa/x64/lower.isle line 1652.
6592                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1)?;
6593                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?;
6594                             let expr2_0 = FcmpImm::LessThan;
6595                             let expr3_0 =
6596                                 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?;
6597                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
6598                             return Some(expr4_0);
6599                         }
6600                         &FloatCC::GreaterThanOrEqual => {
6601                             // Rule at src/isa/x64/lower.isle line 1654.
6602                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1)?;
6603                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?;
6604                             let expr2_0 = FcmpImm::LessThanOrEqual;
6605                             let expr3_0 =
6606                                 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?;
6607                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
6608                             return Some(expr4_0);
6609                         }
6610                         &FloatCC::LessThan => {
6611                             // Rule at src/isa/x64/lower.isle line 1636.
6612                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6613                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
6614                             let expr2_0 = FcmpImm::LessThan;
6615                             let expr3_0 =
6616                                 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?;
6617                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
6618                             return Some(expr4_0);
6619                         }
6620                         &FloatCC::LessThanOrEqual => {
6621                             // Rule at src/isa/x64/lower.isle line 1638.
6622                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6623                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
6624                             let expr2_0 = FcmpImm::LessThanOrEqual;
6625                             let expr3_0 =
6626                                 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?;
6627                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
6628                             return Some(expr4_0);
6629                         }
6630                         &FloatCC::NotEqual => {
6631                             // Rule at src/isa/x64/lower.isle line 1634.
6632                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6633                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
6634                             let expr2_0 = FcmpImm::NotEqual;
6635                             let expr3_0 =
6636                                 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?;
6637                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
6638                             return Some(expr4_0);
6639                         }
6640                         &FloatCC::Ordered => {
6641                             // Rule at src/isa/x64/lower.isle line 1640.
6642                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6643                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
6644                             let expr2_0 = FcmpImm::Ordered;
6645                             let expr3_0 =
6646                                 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?;
6647                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
6648                             return Some(expr4_0);
6649                         }
6650                         &FloatCC::Unordered => {
6651                             // Rule at src/isa/x64/lower.isle line 1642.
6652                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6653                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
6654                             let expr2_0 = FcmpImm::Unordered;
6655                             let expr3_0 =
6656                                 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?;
6657                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
6658                             return Some(expr4_0);
6659                         }
6660                         &FloatCC::UnorderedOrGreaterThan => {
6661                             // Rule at src/isa/x64/lower.isle line 1644.
6662                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6663                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
6664                             let expr2_0 = FcmpImm::UnorderedOrGreaterThan;
6665                             let expr3_0 =
6666                                 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?;
6667                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
6668                             return Some(expr4_0);
6669                         }
6670                         &FloatCC::UnorderedOrGreaterThanOrEqual => {
6671                             // Rule at src/isa/x64/lower.isle line 1646.
6672                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6673                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
6674                             let expr2_0 = FcmpImm::UnorderedOrGreaterThanOrEqual;
6675                             let expr3_0 =
6676                                 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?;
6677                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
6678                             return Some(expr4_0);
6679                         }
6680                         &FloatCC::UnorderedOrLessThan => {
6681                             // Rule at src/isa/x64/lower.isle line 1656.
6682                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1)?;
6683                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?;
6684                             let expr2_0 = FcmpImm::UnorderedOrGreaterThan;
6685                             let expr3_0 =
6686                                 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?;
6687                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
6688                             return Some(expr4_0);
6689                         }
6690                         &FloatCC::UnorderedOrLessThanOrEqual => {
6691                             // Rule at src/isa/x64/lower.isle line 1658.
6692                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1)?;
6693                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?;
6694                             let expr2_0 = FcmpImm::UnorderedOrGreaterThanOrEqual;
6695                             let expr3_0 =
6696                                 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?;
6697                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
6698                             return Some(expr4_0);
6699                         }
6700                         _ => {}
6701                     }
6702                 }
6703             }
6704         }
6705         &InstructionData::IntCompare {
6706             opcode: ref pattern2_0,
6707             args: ref pattern2_1,
6708             cond: ref pattern2_2,
6709         } => {
6710             if let &Opcode::Icmp = pattern2_0 {
6711                 let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1);
6712                 let pattern5_0 = C::value_type(ctx, pattern4_0);
6713                 if pattern5_0 == I128 {
6714                     match pattern2_2 {
6715                         &IntCC::Equal => {
6716                             // Rule at src/isa/x64/lower.isle line 1526.
6717                             let expr0_0 = C::put_in_regs(ctx, pattern4_0);
6718                             let expr1_0: usize = 0;
6719                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
6720                             let expr3_0 = C::put_in_regs(ctx, pattern4_0);
6721                             let expr4_0: usize = 1;
6722                             let expr5_0 = constructor_value_regs_get_gpr(ctx, expr3_0, expr4_0)?;
6723                             let expr6_0 = C::put_in_regs(ctx, pattern4_1);
6724                             let expr7_0: usize = 0;
6725                             let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0)?;
6726                             let expr9_0 = C::put_in_regs(ctx, pattern4_1);
6727                             let expr10_0: usize = 1;
6728                             let expr11_0 = constructor_value_regs_get_gpr(ctx, expr9_0, expr10_0)?;
6729                             let expr12_0 = OperandSize::Size64;
6730                             let expr13_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0);
6731                             let expr14_0 = constructor_x64_cmp(ctx, &expr12_0, &expr13_0, expr2_0)?;
6732                             let expr15_0 = CC::Z;
6733                             let expr16_0 = constructor_x64_setcc(ctx, &expr15_0)?;
6734                             let expr17_0 = constructor_with_flags_reg(ctx, &expr14_0, &expr16_0)?;
6735                             let expr18_0 = OperandSize::Size64;
6736                             let expr19_0 = C::gpr_to_gpr_mem_imm(ctx, expr11_0);
6737                             let expr20_0 = constructor_x64_cmp(ctx, &expr18_0, &expr19_0, expr5_0)?;
6738                             let expr21_0 = CC::Z;
6739                             let expr22_0 = constructor_x64_setcc(ctx, &expr21_0)?;
6740                             let expr23_0 = constructor_with_flags_reg(ctx, &expr20_0, &expr22_0)?;
6741                             let expr24_0: Type = I64;
6742                             let expr25_0 = C::gpr_new(ctx, expr17_0);
6743                             let expr26_0 = constructor_reg_to_gpr_mem_imm(ctx, expr23_0)?;
6744                             let expr27_0 = constructor_x64_and(ctx, expr24_0, expr25_0, &expr26_0)?;
6745                             let expr28_0 = C::gpr_to_reg(ctx, expr27_0);
6746                             let expr29_0 = OperandSize::Size64;
6747                             let expr30_0: u32 = 1;
6748                             let expr31_0 = RegMemImm::Imm { simm32: expr30_0 };
6749                             let expr32_0 = C::gpr_mem_imm_new(ctx, &expr31_0);
6750                             let expr33_0 = C::gpr_new(ctx, expr28_0);
6751                             let expr34_0 =
6752                                 constructor_x64_test(ctx, &expr29_0, &expr32_0, expr33_0)?;
6753                             let expr35_0 = CC::NZ;
6754                             let expr36_0 = constructor_x64_setcc(ctx, &expr35_0)?;
6755                             let expr37_0 = constructor_with_flags(ctx, &expr34_0, &expr36_0)?;
6756                             let expr38_0 = C::output(ctx, expr37_0);
6757                             return Some(expr38_0);
6758                         }
6759                         &IntCC::NotEqual => {
6760                             // Rule at src/isa/x64/lower.isle line 1545.
6761                             let expr0_0 = C::put_in_regs(ctx, pattern4_0);
6762                             let expr1_0: usize = 0;
6763                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
6764                             let expr3_0 = C::put_in_regs(ctx, pattern4_0);
6765                             let expr4_0: usize = 1;
6766                             let expr5_0 = constructor_value_regs_get_gpr(ctx, expr3_0, expr4_0)?;
6767                             let expr6_0 = C::put_in_regs(ctx, pattern4_1);
6768                             let expr7_0: usize = 0;
6769                             let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0)?;
6770                             let expr9_0 = C::put_in_regs(ctx, pattern4_1);
6771                             let expr10_0: usize = 1;
6772                             let expr11_0 = constructor_value_regs_get_gpr(ctx, expr9_0, expr10_0)?;
6773                             let expr12_0 = OperandSize::Size64;
6774                             let expr13_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0);
6775                             let expr14_0 = constructor_x64_cmp(ctx, &expr12_0, &expr13_0, expr2_0)?;
6776                             let expr15_0 = CC::NZ;
6777                             let expr16_0 = constructor_x64_setcc(ctx, &expr15_0)?;
6778                             let expr17_0 = constructor_with_flags_reg(ctx, &expr14_0, &expr16_0)?;
6779                             let expr18_0 = OperandSize::Size64;
6780                             let expr19_0 = C::gpr_to_gpr_mem_imm(ctx, expr11_0);
6781                             let expr20_0 = constructor_x64_cmp(ctx, &expr18_0, &expr19_0, expr5_0)?;
6782                             let expr21_0 = CC::NZ;
6783                             let expr22_0 = constructor_x64_setcc(ctx, &expr21_0)?;
6784                             let expr23_0 = constructor_with_flags_reg(ctx, &expr20_0, &expr22_0)?;
6785                             let expr24_0: Type = I64;
6786                             let expr25_0 = C::gpr_new(ctx, expr17_0);
6787                             let expr26_0 = constructor_reg_to_gpr_mem_imm(ctx, expr23_0)?;
6788                             let expr27_0 = constructor_x64_or(ctx, expr24_0, expr25_0, &expr26_0)?;
6789                             let expr28_0 = C::gpr_to_reg(ctx, expr27_0);
6790                             let expr29_0 = OperandSize::Size64;
6791                             let expr30_0: u32 = 1;
6792                             let expr31_0 = RegMemImm::Imm { simm32: expr30_0 };
6793                             let expr32_0 = C::gpr_mem_imm_new(ctx, &expr31_0);
6794                             let expr33_0 = C::gpr_new(ctx, expr28_0);
6795                             let expr34_0 =
6796                                 constructor_x64_test(ctx, &expr29_0, &expr32_0, expr33_0)?;
6797                             let expr35_0 = CC::NZ;
6798                             let expr36_0 = constructor_x64_setcc(ctx, &expr35_0)?;
6799                             let expr37_0 = constructor_with_flags(ctx, &expr34_0, &expr36_0)?;
6800                             let expr38_0 = C::output(ctx, expr37_0);
6801                             return Some(expr38_0);
6802                         }
6803                         _ => {}
6804                     }
6805                 }
6806                 if pattern5_0 == I64X2 {
6807                     match pattern2_2 {
6808                         &IntCC::SignedGreaterThanOrEqual => {
6809                             // Rule at src/isa/x64/lower.isle line 1511.
6810                             let expr0_0: Type = I64X2;
6811                             let expr1_0 = constructor_put_in_xmm(ctx, pattern4_1)?;
6812                             let expr2_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?;
6813                             let expr3_0 = constructor_x64_pcmpgt(ctx, expr0_0, expr1_0, &expr2_0)?;
6814                             let expr4_0: Type = I64X2;
6815                             let expr5_0 = constructor_vector_all_ones(ctx, expr4_0)?;
6816                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
6817                             let expr7_0 = constructor_x64_pxor(ctx, expr3_0, &expr6_0)?;
6818                             let expr8_0 = constructor_output_xmm(ctx, expr7_0)?;
6819                             return Some(expr8_0);
6820                         }
6821                         &IntCC::SignedLessThanOrEqual => {
6822                             // Rule at src/isa/x64/lower.isle line 1515.
6823                             let expr0_0: Type = I64X2;
6824                             let expr1_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6825                             let expr2_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
6826                             let expr3_0 = constructor_x64_pcmpgt(ctx, expr0_0, expr1_0, &expr2_0)?;
6827                             let expr4_0: Type = I64X2;
6828                             let expr5_0 = constructor_vector_all_ones(ctx, expr4_0)?;
6829                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
6830                             let expr7_0 = constructor_x64_pxor(ctx, expr3_0, &expr6_0)?;
6831                             let expr8_0 = constructor_output_xmm(ctx, expr7_0)?;
6832                             return Some(expr8_0);
6833                         }
6834                         _ => {}
6835                     }
6836                 }
6837                 if let Some(pattern6_0) = C::fits_in_64(ctx, pattern5_0) {
6838                     // Rule at src/isa/x64/lower.isle line 1451.
6839                     let expr0_0 = C::raw_operand_size_of_type(ctx, pattern6_0);
6840                     let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern4_1)?;
6841                     let expr2_0 = constructor_put_in_gpr(ctx, pattern4_0)?;
6842                     let expr3_0 = constructor_x64_cmp(ctx, &expr0_0, &expr1_0, expr2_0)?;
6843                     let expr4_0 = C::intcc_to_cc(ctx, pattern2_2);
6844                     let expr5_0 = constructor_x64_setcc(ctx, &expr4_0)?;
6845                     let expr6_0 = constructor_with_flags(ctx, &expr3_0, &expr5_0)?;
6846                     let expr7_0 = C::output(ctx, expr6_0);
6847                     return Some(expr7_0);
6848                 }
6849                 if let Some(pattern6_0) = C::ty_vec128(ctx, pattern5_0) {
6850                     match pattern2_2 {
6851                         &IntCC::Equal => {
6852                             // Rule at src/isa/x64/lower.isle line 1460.
6853                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6854                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
6855                             let expr2_0 =
6856                                 constructor_x64_pcmpeq(ctx, pattern6_0, expr0_0, &expr1_0)?;
6857                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6858                             return Some(expr3_0);
6859                         }
6860                         &IntCC::NotEqual => {
6861                             // Rule at src/isa/x64/lower.isle line 1464.
6862                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6863                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
6864                             let expr2_0 =
6865                                 constructor_x64_pcmpeq(ctx, pattern6_0, expr0_0, &expr1_0)?;
6866                             let expr3_0 = constructor_vector_all_ones(ctx, pattern6_0)?;
6867                             let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0);
6868                             let expr5_0 = constructor_x64_pxor(ctx, expr2_0, &expr4_0)?;
6869                             let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
6870                             return Some(expr6_0);
6871                         }
6872                         &IntCC::SignedGreaterThan => {
6873                             // Rule at src/isa/x64/lower.isle line 1471.
6874                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6875                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
6876                             let expr2_0 =
6877                                 constructor_x64_pcmpgt(ctx, pattern6_0, expr0_0, &expr1_0)?;
6878                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6879                             return Some(expr3_0);
6880                         }
6881                         &IntCC::SignedGreaterThanOrEqual => {
6882                             // Rule at src/isa/x64/lower.isle line 1496.
6883                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6884                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
6885                             let expr2_0 =
6886                                 constructor_x64_pmaxs(ctx, pattern6_0, expr0_0, &expr1_0)?;
6887                             let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6888                             let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0);
6889                             let expr5_0 =
6890                                 constructor_x64_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0)?;
6891                             let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
6892                             return Some(expr6_0);
6893                         }
6894                         &IntCC::SignedLessThan => {
6895                             // Rule at src/isa/x64/lower.isle line 1473.
6896                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1)?;
6897                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?;
6898                             let expr2_0 =
6899                                 constructor_x64_pcmpgt(ctx, pattern6_0, expr0_0, &expr1_0)?;
6900                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
6901                             return Some(expr3_0);
6902                         }
6903                         &IntCC::SignedLessThanOrEqual => {
6904                             // Rule at src/isa/x64/lower.isle line 1499.
6905                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6906                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
6907                             let expr2_0 =
6908                                 constructor_x64_pmins(ctx, pattern6_0, expr0_0, &expr1_0)?;
6909                             let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6910                             let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0);
6911                             let expr5_0 =
6912                                 constructor_x64_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0)?;
6913                             let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
6914                             return Some(expr6_0);
6915                         }
6916                         &IntCC::UnsignedGreaterThan => {
6917                             // Rule at src/isa/x64/lower.isle line 1475.
6918                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6919                             let expr1_0 = constructor_put_in_xmm(ctx, pattern4_1)?;
6920                             let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
6921                             let expr3_0 =
6922                                 constructor_x64_pmaxu(ctx, pattern6_0, expr0_0, &expr2_0)?;
6923                             let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
6924                             let expr5_0 =
6925                                 constructor_x64_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0)?;
6926                             let expr6_0 = constructor_vector_all_ones(ctx, pattern6_0)?;
6927                             let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0);
6928                             let expr8_0 = constructor_x64_pxor(ctx, expr5_0, &expr7_0)?;
6929                             let expr9_0 = constructor_output_xmm(ctx, expr8_0)?;
6930                             return Some(expr9_0);
6931                         }
6932                         &IntCC::UnsignedGreaterThanOrEqual => {
6933                             // Rule at src/isa/x64/lower.isle line 1502.
6934                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6935                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
6936                             let expr2_0 =
6937                                 constructor_x64_pmaxu(ctx, pattern6_0, expr0_0, &expr1_0)?;
6938                             let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6939                             let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0);
6940                             let expr5_0 =
6941                                 constructor_x64_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0)?;
6942                             let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
6943                             return Some(expr6_0);
6944                         }
6945                         &IntCC::UnsignedLessThan => {
6946                             // Rule at src/isa/x64/lower.isle line 1485.
6947                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6948                             let expr1_0 = constructor_put_in_xmm(ctx, pattern4_1)?;
6949                             let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
6950                             let expr3_0 =
6951                                 constructor_x64_pminu(ctx, pattern6_0, expr0_0, &expr2_0)?;
6952                             let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
6953                             let expr5_0 =
6954                                 constructor_x64_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0)?;
6955                             let expr6_0 = constructor_vector_all_ones(ctx, pattern6_0)?;
6956                             let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0);
6957                             let expr8_0 = constructor_x64_pxor(ctx, expr5_0, &expr7_0)?;
6958                             let expr9_0 = constructor_output_xmm(ctx, expr8_0)?;
6959                             return Some(expr9_0);
6960                         }
6961                         &IntCC::UnsignedLessThanOrEqual => {
6962                             // Rule at src/isa/x64/lower.isle line 1505.
6963                             let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6964                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?;
6965                             let expr2_0 =
6966                                 constructor_x64_pminu(ctx, pattern6_0, expr0_0, &expr1_0)?;
6967                             let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?;
6968                             let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0);
6969                             let expr5_0 =
6970                                 constructor_x64_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0)?;
6971                             let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
6972                             return Some(expr6_0);
6973                         }
6974                         _ => {}
6975                     }
6976                 }
6977             }
6978         }
6979         &InstructionData::Unary {
6980             opcode: ref pattern2_0,
6981             arg: pattern2_1,
6982         } => {
6983             match pattern2_0 {
6984                 &Opcode::IsNull => {
6985                     let pattern4_0 = C::value_type(ctx, pattern2_1);
6986                     if pattern4_0 == R64 {
6987                         // Rule at src/isa/x64/lower.isle line 2097.
6988                         let expr0_0 = OperandSize::Size64;
6989                         let expr1_0: u32 = 0;
6990                         let expr2_0 = constructor_put_in_gpr(ctx, pattern2_1)?;
6991                         let expr3_0 = constructor_x64_cmp_imm(ctx, &expr0_0, expr1_0, expr2_0)?;
6992                         let expr4_0 = CC::Z;
6993                         let expr5_0 = constructor_x64_setcc(ctx, &expr4_0)?;
6994                         let expr6_0 = constructor_with_flags(ctx, &expr3_0, &expr5_0)?;
6995                         let expr7_0 = C::output(ctx, expr6_0);
6996                         return Some(expr7_0);
6997                     }
6998                 }
6999                 &Opcode::IsInvalid => {
7000                     let pattern4_0 = C::value_type(ctx, pattern2_1);
7001                     if pattern4_0 == R64 {
7002                         // Rule at src/isa/x64/lower.isle line 2105.
7003                         let expr0_0 = OperandSize::Size64;
7004                         let expr1_0: u32 = 4294967295;
7005                         let expr2_0 = constructor_put_in_gpr(ctx, pattern2_1)?;
7006                         let expr3_0 = constructor_x64_cmp_imm(ctx, &expr0_0, expr1_0, expr2_0)?;
7007                         let expr4_0 = CC::Z;
7008                         let expr5_0 = constructor_x64_setcc(ctx, &expr4_0)?;
7009                         let expr6_0 = constructor_with_flags(ctx, &expr3_0, &expr5_0)?;
7010                         let expr7_0 = C::output(ctx, expr6_0);
7011                         return Some(expr7_0);
7012                     }
7013                 }
7014                 _ => {}
7015             }
7016         }
7017         _ => {}
7018     }
7019     if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) {
7020         let pattern2_0 = C::value_type(ctx, pattern1_0);
7021         if pattern2_0 == B128 {
7022             let pattern4_0 = C::inst_data(ctx, pattern0_0);
7023             match &pattern4_0 {
7024                 &InstructionData::UnaryBool {
7025                     opcode: ref pattern5_0,
7026                     imm: pattern5_1,
7027                 } => {
7028                     if let &Opcode::Bconst = pattern5_0 {
7029                         if pattern5_1 == true {
7030                             // Rule at src/isa/x64/lower.isle line 39.
7031                             let expr0_0: Type = B64;
7032                             let expr1_0: u64 = 1;
7033                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
7034                             let expr3_0: Type = B64;
7035                             let expr4_0: u64 = 0;
7036                             let expr5_0 = constructor_imm(ctx, expr3_0, expr4_0)?;
7037                             let expr6_0 = C::value_regs(ctx, expr2_0, expr5_0);
7038                             let expr7_0 = C::output(ctx, expr6_0);
7039                             return Some(expr7_0);
7040                         }
7041                         if pattern5_1 == false {
7042                             // Rule at src/isa/x64/lower.isle line 34.
7043                             let expr0_0: Type = B64;
7044                             let expr1_0: u64 = 0;
7045                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
7046                             let expr3_0: Type = B64;
7047                             let expr4_0: u64 = 0;
7048                             let expr5_0 = constructor_imm(ctx, expr3_0, expr4_0)?;
7049                             let expr6_0 = C::value_regs(ctx, expr2_0, expr5_0);
7050                             let expr7_0 = C::output(ctx, expr6_0);
7051                             return Some(expr7_0);
7052                         }
7053                     }
7054                 }
7055                 &InstructionData::Binary {
7056                     opcode: ref pattern5_0,
7057                     args: ref pattern5_1,
7058                 } => {
7059                     match pattern5_0 {
7060                         &Opcode::Band => {
7061                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7062                             // Rule at src/isa/x64/lower.isle line 344.
7063                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
7064                             let expr1_0: usize = 0;
7065                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
7066                             let expr3_0: usize = 1;
7067                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
7068                             let expr5_0 = constructor_lo_gpr(ctx, pattern7_1)?;
7069                             let expr6_0: Type = I64;
7070                             let expr7_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
7071                             let expr8_0 = constructor_x64_and(ctx, expr6_0, expr2_0, &expr7_0)?;
7072                             let expr9_0 = constructor_value_gprs(ctx, expr8_0, expr4_0)?;
7073                             let expr10_0 = C::output(ctx, expr9_0);
7074                             return Some(expr10_0);
7075                         }
7076                         &Opcode::Bor => {
7077                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7078                             // Rule at src/isa/x64/lower.isle line 410.
7079                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
7080                             let expr1_0: usize = 0;
7081                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
7082                             let expr3_0: usize = 1;
7083                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
7084                             let expr5_0 = constructor_lo_gpr(ctx, pattern7_1)?;
7085                             let expr6_0: Type = I64;
7086                             let expr7_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
7087                             let expr8_0 = constructor_x64_or(ctx, expr6_0, expr2_0, &expr7_0)?;
7088                             let expr9_0 = constructor_value_gprs(ctx, expr8_0, expr4_0)?;
7089                             let expr10_0 = C::output(ctx, expr9_0);
7090                             return Some(expr10_0);
7091                         }
7092                         &Opcode::Bxor => {
7093                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7094                             // Rule at src/isa/x64/lower.isle line 468.
7095                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
7096                             let expr1_0: usize = 0;
7097                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
7098                             let expr3_0: usize = 1;
7099                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
7100                             let expr5_0 = constructor_lo_gpr(ctx, pattern7_1)?;
7101                             let expr6_0: Type = I64;
7102                             let expr7_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
7103                             let expr8_0 = constructor_x64_xor(ctx, expr6_0, expr2_0, &expr7_0)?;
7104                             let expr9_0 = constructor_value_gprs(ctx, expr8_0, expr4_0)?;
7105                             let expr10_0 = C::output(ctx, expr9_0);
7106                             return Some(expr10_0);
7107                         }
7108                         _ => {}
7109                     }
7110                 }
7111                 &InstructionData::Unary {
7112                     opcode: ref pattern5_0,
7113                     arg: pattern5_1,
7114                 } => {
7115                     if let &Opcode::Bnot = pattern5_0 {
7116                         // Rule at src/isa/x64/lower.isle line 1269.
7117                         let expr0_0 = constructor_i128_not(ctx, pattern5_1)?;
7118                         let expr1_0 = C::output(ctx, expr0_0);
7119                         return Some(expr1_0);
7120                     }
7121                 }
7122                 _ => {}
7123             }
7124         }
7125         if pattern2_0 == I8 {
7126             let pattern4_0 = C::inst_data(ctx, pattern0_0);
7127             if let &InstructionData::Unary {
7128                 opcode: ref pattern5_0,
7129                 arg: pattern5_1,
7130             } = &pattern4_0
7131             {
7132                 if let &Opcode::Bitrev = pattern5_0 {
7133                     // Rule at src/isa/x64/lower.isle line 2019.
7134                     let expr0_0: Type = I32;
7135                     let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
7136                     let expr2_0 = constructor_do_bitrev8(ctx, expr0_0, expr1_0)?;
7137                     let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7138                     return Some(expr3_0);
7139                 }
7140             }
7141         }
7142         if pattern2_0 == I16 {
7143             let pattern4_0 = C::inst_data(ctx, pattern0_0);
7144             if let &InstructionData::Unary {
7145                 opcode: ref pattern5_0,
7146                 arg: pattern5_1,
7147             } = &pattern4_0
7148             {
7149                 if let &Opcode::Bitrev = pattern5_0 {
7150                     // Rule at src/isa/x64/lower.isle line 2022.
7151                     let expr0_0: Type = I32;
7152                     let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
7153                     let expr2_0 = constructor_do_bitrev16(ctx, expr0_0, expr1_0)?;
7154                     let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7155                     return Some(expr3_0);
7156                 }
7157             }
7158         }
7159         if pattern2_0 == I32 {
7160             let pattern4_0 = C::inst_data(ctx, pattern0_0);
7161             if let &InstructionData::Unary {
7162                 opcode: ref pattern5_0,
7163                 arg: pattern5_1,
7164             } = &pattern4_0
7165             {
7166                 if let &Opcode::Bitrev = pattern5_0 {
7167                     // Rule at src/isa/x64/lower.isle line 2025.
7168                     let expr0_0: Type = I32;
7169                     let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
7170                     let expr2_0 = constructor_do_bitrev32(ctx, expr0_0, expr1_0)?;
7171                     let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7172                     return Some(expr3_0);
7173                 }
7174             }
7175         }
7176         if pattern2_0 == I64 {
7177             let pattern4_0 = C::inst_data(ctx, pattern0_0);
7178             if let &InstructionData::Unary {
7179                 opcode: ref pattern5_0,
7180                 arg: pattern5_1,
7181             } = &pattern4_0
7182             {
7183                 match pattern5_0 {
7184                     &Opcode::Bitrev => {
7185                         // Rule at src/isa/x64/lower.isle line 2028.
7186                         let expr0_0: Type = I64;
7187                         let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
7188                         let expr2_0 = constructor_do_bitrev64(ctx, expr0_0, expr1_0)?;
7189                         let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7190                         return Some(expr3_0);
7191                     }
7192                     &Opcode::Uextend => {
7193                         if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) {
7194                             if let Some(pattern8_0) = C::first_result(ctx, pattern7_0) {
7195                                 let pattern9_0 = C::value_type(ctx, pattern8_0);
7196                                 if pattern9_0 == I32 {
7197                                     let pattern11_0 = C::inst_data(ctx, pattern7_0);
7198                                     match &pattern11_0 {
7199                                         &InstructionData::Binary {
7200                                             opcode: ref pattern12_0,
7201                                             args: ref pattern12_1,
7202                                         } => {
7203                                             match pattern12_0 {
7204                                                 &Opcode::Iadd => {
7205                                                     let (pattern14_0, pattern14_1) =
7206                                                         C::unpack_value_array_2(ctx, pattern12_1);
7207                                                     // Rule at src/isa/x64/lower.isle line 2144.
7208                                                     let expr0_0 =
7209                                                         constructor_output_value(ctx, pattern5_1)?;
7210                                                     return Some(expr0_0);
7211                                                 }
7212                                                 &Opcode::Isub => {
7213                                                     let (pattern14_0, pattern14_1) =
7214                                                         C::unpack_value_array_2(ctx, pattern12_1);
7215                                                     // Rule at src/isa/x64/lower.isle line 2150.
7216                                                     let expr0_0 =
7217                                                         constructor_output_value(ctx, pattern5_1)?;
7218                                                     return Some(expr0_0);
7219                                                 }
7220                                                 &Opcode::Imul => {
7221                                                     let (pattern14_0, pattern14_1) =
7222                                                         C::unpack_value_array_2(ctx, pattern12_1);
7223                                                     // Rule at src/isa/x64/lower.isle line 2153.
7224                                                     let expr0_0 =
7225                                                         constructor_output_value(ctx, pattern5_1)?;
7226                                                     return Some(expr0_0);
7227                                                 }
7228                                                 &Opcode::IaddIfcout => {
7229                                                     let (pattern14_0, pattern14_1) =
7230                                                         C::unpack_value_array_2(ctx, pattern12_1);
7231                                                     // Rule at src/isa/x64/lower.isle line 2147.
7232                                                     let expr0_0 =
7233                                                         constructor_output_value(ctx, pattern5_1)?;
7234                                                     return Some(expr0_0);
7235                                                 }
7236                                                 &Opcode::Band => {
7237                                                     let (pattern14_0, pattern14_1) =
7238                                                         C::unpack_value_array_2(ctx, pattern12_1);
7239                                                     // Rule at src/isa/x64/lower.isle line 2156.
7240                                                     let expr0_0 =
7241                                                         constructor_output_value(ctx, pattern5_1)?;
7242                                                     return Some(expr0_0);
7243                                                 }
7244                                                 &Opcode::Bor => {
7245                                                     let (pattern14_0, pattern14_1) =
7246                                                         C::unpack_value_array_2(ctx, pattern12_1);
7247                                                     // Rule at src/isa/x64/lower.isle line 2159.
7248                                                     let expr0_0 =
7249                                                         constructor_output_value(ctx, pattern5_1)?;
7250                                                     return Some(expr0_0);
7251                                                 }
7252                                                 &Opcode::Bxor => {
7253                                                     let (pattern14_0, pattern14_1) =
7254                                                         C::unpack_value_array_2(ctx, pattern12_1);
7255                                                     // Rule at src/isa/x64/lower.isle line 2162.
7256                                                     let expr0_0 =
7257                                                         constructor_output_value(ctx, pattern5_1)?;
7258                                                     return Some(expr0_0);
7259                                                 }
7260                                                 &Opcode::Ishl => {
7261                                                     let (pattern14_0, pattern14_1) =
7262                                                         C::unpack_value_array_2(ctx, pattern12_1);
7263                                                     // Rule at src/isa/x64/lower.isle line 2165.
7264                                                     let expr0_0 =
7265                                                         constructor_output_value(ctx, pattern5_1)?;
7266                                                     return Some(expr0_0);
7267                                                 }
7268                                                 &Opcode::Ushr => {
7269                                                     let (pattern14_0, pattern14_1) =
7270                                                         C::unpack_value_array_2(ctx, pattern12_1);
7271                                                     // Rule at src/isa/x64/lower.isle line 2168.
7272                                                     let expr0_0 =
7273                                                         constructor_output_value(ctx, pattern5_1)?;
7274                                                     return Some(expr0_0);
7275                                                 }
7276                                                 _ => {}
7277                                             }
7278                                         }
7279                                         &InstructionData::Load {
7280                                             opcode: ref pattern12_0,
7281                                             arg: pattern12_1,
7282                                             flags: pattern12_2,
7283                                             offset: pattern12_3,
7284                                         } => {
7285                                             if let &Opcode::Uload32 = pattern12_0 {
7286                                                 // Rule at src/isa/x64/lower.isle line 2171.
7287                                                 let expr0_0 =
7288                                                     constructor_output_value(ctx, pattern5_1)?;
7289                                                 return Some(expr0_0);
7290                                             }
7291                                         }
7292                                         _ => {}
7293                                     }
7294                                 }
7295                             }
7296                         }
7297                         let pattern7_0 = C::value_type(ctx, pattern5_1);
7298                         if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) {
7299                             // Rule at src/isa/x64/lower.isle line 2126.
7300                             let expr0_0: Type = I64;
7301                             let expr1_0 = ExtendKind::Zero;
7302                             let expr2_0 =
7303                                 constructor_extend_to_gpr(ctx, pattern5_1, expr0_0, &expr1_0)?;
7304                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
7305                             return Some(expr3_0);
7306                         }
7307                     }
7308                     _ => {}
7309                 }
7310             }
7311         }
7312         if pattern2_0 == I128 {
7313             let pattern4_0 = C::inst_data(ctx, pattern0_0);
7314             match &pattern4_0 {
7315                 &InstructionData::UnaryImm {
7316                     opcode: ref pattern5_0,
7317                     imm: pattern5_1,
7318                 } => {
7319                     if let &Opcode::Iconst = pattern5_0 {
7320                         let pattern7_0 = C::u64_from_imm64(ctx, pattern5_1);
7321                         // Rule at src/isa/x64/lower.isle line 15.
7322                         let expr0_0: Type = I64;
7323                         let expr1_0 = constructor_imm(ctx, expr0_0, pattern7_0)?;
7324                         let expr2_0: Type = I64;
7325                         let expr3_0: u64 = 0;
7326                         let expr4_0 = constructor_imm(ctx, expr2_0, expr3_0)?;
7327                         let expr5_0 = C::value_regs(ctx, expr1_0, expr4_0);
7328                         let expr6_0 = C::output(ctx, expr5_0);
7329                         return Some(expr6_0);
7330                     }
7331                 }
7332                 &InstructionData::Binary {
7333                     opcode: ref pattern5_0,
7334                     args: ref pattern5_1,
7335                 } => {
7336                     match pattern5_0 {
7337                         &Opcode::Iadd => {
7338                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7339                             // Rule at src/isa/x64/lower.isle line 111.
7340                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
7341                             let expr1_0: usize = 0;
7342                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
7343                             let expr3_0: usize = 1;
7344                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
7345                             let expr5_0 = C::put_in_regs(ctx, pattern7_1);
7346                             let expr6_0: usize = 0;
7347                             let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?;
7348                             let expr8_0: usize = 1;
7349                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?;
7350                             let expr10_0: Type = I64;
7351                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
7352                             let expr12_0 = constructor_x64_add_with_flags_paired(
7353                                 ctx, expr10_0, expr2_0, &expr11_0,
7354                             )?;
7355                             let expr13_0: Type = I64;
7356                             let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
7357                             let expr15_0 =
7358                                 constructor_x64_adc_paired(ctx, expr13_0, expr4_0, &expr14_0)?;
7359                             let expr16_0 = constructor_with_flags(ctx, &expr12_0, &expr15_0)?;
7360                             let expr17_0 = C::output(ctx, expr16_0);
7361                             return Some(expr17_0);
7362                         }
7363                         &Opcode::Isub => {
7364                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7365                             // Rule at src/isa/x64/lower.isle line 257.
7366                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
7367                             let expr1_0: usize = 0;
7368                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
7369                             let expr3_0: usize = 1;
7370                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
7371                             let expr5_0 = C::put_in_regs(ctx, pattern7_1);
7372                             let expr6_0: usize = 0;
7373                             let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?;
7374                             let expr8_0: usize = 1;
7375                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?;
7376                             let expr10_0: Type = I64;
7377                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
7378                             let expr12_0 = constructor_x64_sub_with_flags_paired(
7379                                 ctx, expr10_0, expr2_0, &expr11_0,
7380                             )?;
7381                             let expr13_0: Type = I64;
7382                             let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
7383                             let expr15_0 =
7384                                 constructor_x64_sbb_paired(ctx, expr13_0, expr4_0, &expr14_0)?;
7385                             let expr16_0 = constructor_with_flags(ctx, &expr12_0, &expr15_0)?;
7386                             let expr17_0 = C::output(ctx, expr16_0);
7387                             return Some(expr17_0);
7388                         }
7389                         &Opcode::Imul => {
7390                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7391                             // Rule at src/isa/x64/lower.isle line 957.
7392                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
7393                             let expr1_0: usize = 0;
7394                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
7395                             let expr3_0: usize = 1;
7396                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
7397                             let expr5_0 = C::put_in_regs(ctx, pattern7_1);
7398                             let expr6_0: usize = 0;
7399                             let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?;
7400                             let expr8_0: usize = 1;
7401                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?;
7402                             let expr10_0: Type = I64;
7403                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
7404                             let expr12_0 = constructor_x64_mul(ctx, expr10_0, expr2_0, &expr11_0)?;
7405                             let expr13_0: Type = I64;
7406                             let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
7407                             let expr15_0 = constructor_x64_mul(ctx, expr13_0, expr4_0, &expr14_0)?;
7408                             let expr16_0: Type = I64;
7409                             let expr17_0 = C::gpr_to_gpr_mem_imm(ctx, expr15_0);
7410                             let expr18_0 = constructor_x64_add(ctx, expr16_0, expr12_0, &expr17_0)?;
7411                             let expr19_0: Type = I64;
7412                             let expr20_0 = C::gpr_to_gpr_mem(ctx, expr7_0);
7413                             let expr21_0 = constructor_mulhi_u(ctx, expr19_0, expr2_0, &expr20_0)?;
7414                             let expr22_0: usize = 0;
7415                             let expr23_0 = constructor_value_regs_get_gpr(ctx, expr21_0, expr22_0)?;
7416                             let expr24_0: usize = 1;
7417                             let expr25_0 = constructor_value_regs_get_gpr(ctx, expr21_0, expr24_0)?;
7418                             let expr26_0: Type = I64;
7419                             let expr27_0 = C::gpr_to_gpr_mem_imm(ctx, expr25_0);
7420                             let expr28_0 = constructor_x64_add(ctx, expr26_0, expr18_0, &expr27_0)?;
7421                             let expr29_0 = constructor_value_gprs(ctx, expr23_0, expr28_0)?;
7422                             let expr30_0 = C::output(ctx, expr29_0);
7423                             return Some(expr30_0);
7424                         }
7425                         &Opcode::Band => {
7426                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7427                             // Rule at src/isa/x64/lower.isle line 334.
7428                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
7429                             let expr1_0: usize = 0;
7430                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
7431                             let expr3_0: usize = 1;
7432                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
7433                             let expr5_0 = C::put_in_regs(ctx, pattern7_1);
7434                             let expr6_0: usize = 0;
7435                             let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?;
7436                             let expr8_0: usize = 1;
7437                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?;
7438                             let expr10_0: Type = I64;
7439                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
7440                             let expr12_0 = constructor_x64_and(ctx, expr10_0, expr2_0, &expr11_0)?;
7441                             let expr13_0: Type = I64;
7442                             let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
7443                             let expr15_0 = constructor_x64_and(ctx, expr13_0, expr4_0, &expr14_0)?;
7444                             let expr16_0 = constructor_value_gprs(ctx, expr12_0, expr15_0)?;
7445                             let expr17_0 = C::output(ctx, expr16_0);
7446                             return Some(expr17_0);
7447                         }
7448                         &Opcode::Bor => {
7449                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7450                             // Rule at src/isa/x64/lower.isle line 407.
7451                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
7452                             let expr1_0 = C::put_in_regs(ctx, pattern7_1);
7453                             let expr2_0 = constructor_or_i128(ctx, expr0_0, expr1_0)?;
7454                             let expr3_0 = C::output(ctx, expr2_0);
7455                             return Some(expr3_0);
7456                         }
7457                         &Opcode::Bxor => {
7458                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7459                             // Rule at src/isa/x64/lower.isle line 458.
7460                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
7461                             let expr1_0: usize = 0;
7462                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
7463                             let expr3_0: usize = 1;
7464                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
7465                             let expr5_0 = C::put_in_regs(ctx, pattern7_1);
7466                             let expr6_0: usize = 0;
7467                             let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?;
7468                             let expr8_0: usize = 1;
7469                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?;
7470                             let expr10_0: Type = I64;
7471                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
7472                             let expr12_0 = constructor_x64_xor(ctx, expr10_0, expr2_0, &expr11_0)?;
7473                             let expr13_0: Type = I64;
7474                             let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
7475                             let expr15_0 = constructor_x64_xor(ctx, expr13_0, expr4_0, &expr14_0)?;
7476                             let expr16_0 = constructor_value_gprs(ctx, expr12_0, expr15_0)?;
7477                             let expr17_0 = C::output(ctx, expr16_0);
7478                             return Some(expr17_0);
7479                         }
7480                         &Opcode::Rotl => {
7481                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7482                             // Rule at src/isa/x64/lower.isle line 830.
7483                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
7484                             let expr1_0 = constructor_lo_gpr(ctx, pattern7_1)?;
7485                             let expr2_0 = constructor_shl_i128(ctx, expr0_0, expr1_0)?;
7486                             let expr3_0: Type = I64;
7487                             let expr4_0: Type = I64;
7488                             let expr5_0: u64 = 128;
7489                             let expr6_0 = constructor_imm(ctx, expr4_0, expr5_0)?;
7490                             let expr7_0 = C::gpr_new(ctx, expr6_0);
7491                             let expr8_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0);
7492                             let expr9_0 = constructor_x64_sub(ctx, expr3_0, expr7_0, &expr8_0)?;
7493                             let expr10_0 = constructor_shr_i128(ctx, expr0_0, expr9_0)?;
7494                             let expr11_0 = constructor_or_i128(ctx, expr2_0, expr10_0)?;
7495                             let expr12_0 = C::output(ctx, expr11_0);
7496                             return Some(expr12_0);
7497                         }
7498                         &Opcode::Rotr => {
7499                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7500                             // Rule at src/isa/x64/lower.isle line 870.
7501                             let expr0_0 = C::put_in_regs(ctx, pattern7_0);
7502                             let expr1_0 = constructor_lo_gpr(ctx, pattern7_1)?;
7503                             let expr2_0 = constructor_shr_i128(ctx, expr0_0, expr1_0)?;
7504                             let expr3_0: Type = I64;
7505                             let expr4_0: Type = I64;
7506                             let expr5_0: u64 = 128;
7507                             let expr6_0 = constructor_imm(ctx, expr4_0, expr5_0)?;
7508                             let expr7_0 = C::gpr_new(ctx, expr6_0);
7509                             let expr8_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0);
7510                             let expr9_0 = constructor_x64_sub(ctx, expr3_0, expr7_0, &expr8_0)?;
7511                             let expr10_0 = constructor_shl_i128(ctx, expr0_0, expr9_0)?;
7512                             let expr11_0 = constructor_or_i128(ctx, expr2_0, expr10_0)?;
7513                             let expr12_0 = C::output(ctx, expr11_0);
7514                             return Some(expr12_0);
7515                         }
7516                         &Opcode::Ishl => {
7517                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7518                             // Rule at src/isa/x64/lower.isle line 522.
7519                             let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?;
7520                             let expr1_0 = C::put_in_regs(ctx, pattern7_0);
7521                             let expr2_0 = constructor_shl_i128(ctx, expr1_0, expr0_0)?;
7522                             let expr3_0 = C::output(ctx, expr2_0);
7523                             return Some(expr3_0);
7524                         }
7525                         &Opcode::Ushr => {
7526                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7527                             // Rule at src/isa/x64/lower.isle line 623.
7528                             let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?;
7529                             let expr1_0 = C::put_in_regs(ctx, pattern7_0);
7530                             let expr2_0 = constructor_shr_i128(ctx, expr1_0, expr0_0)?;
7531                             let expr3_0 = C::output(ctx, expr2_0);
7532                             return Some(expr3_0);
7533                         }
7534                         &Opcode::Sshr => {
7535                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7536                             // Rule at src/isa/x64/lower.isle line 728.
7537                             let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?;
7538                             let expr1_0 = C::put_in_regs(ctx, pattern7_0);
7539                             let expr2_0 = constructor_sar_i128(ctx, expr1_0, expr0_0)?;
7540                             let expr3_0 = C::output(ctx, expr2_0);
7541                             return Some(expr3_0);
7542                         }
7543                         _ => {}
7544                     }
7545                 }
7546                 &InstructionData::Unary {
7547                     opcode: ref pattern5_0,
7548                     arg: pattern5_1,
7549                 } => {
7550                     match pattern5_0 {
7551                         &Opcode::Bnot => {
7552                             // Rule at src/isa/x64/lower.isle line 1266.
7553                             let expr0_0 = constructor_i128_not(ctx, pattern5_1)?;
7554                             let expr1_0 = C::output(ctx, expr0_0);
7555                             return Some(expr1_0);
7556                         }
7557                         &Opcode::Bitrev => {
7558                             // Rule at src/isa/x64/lower.isle line 2031.
7559                             let expr0_0: Type = I64;
7560                             let expr1_0 = C::put_in_regs(ctx, pattern5_1);
7561                             let expr2_0: usize = 1;
7562                             let expr3_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr2_0)?;
7563                             let expr4_0 = constructor_do_bitrev64(ctx, expr0_0, expr3_0)?;
7564                             let expr5_0 = C::gpr_to_reg(ctx, expr4_0);
7565                             let expr6_0: Type = I64;
7566                             let expr7_0 = C::put_in_regs(ctx, pattern5_1);
7567                             let expr8_0: usize = 0;
7568                             let expr9_0 = constructor_value_regs_get_gpr(ctx, expr7_0, expr8_0)?;
7569                             let expr10_0 = constructor_do_bitrev64(ctx, expr6_0, expr9_0)?;
7570                             let expr11_0 = C::gpr_to_reg(ctx, expr10_0);
7571                             let expr12_0 = C::value_regs(ctx, expr5_0, expr11_0);
7572                             let expr13_0 = C::output(ctx, expr12_0);
7573                             return Some(expr13_0);
7574                         }
7575                         &Opcode::Clz => {
7576                             // Rule at src/isa/x64/lower.isle line 1801.
7577                             let expr0_0: Type = I64;
7578                             let expr1_0: Type = I64;
7579                             let expr2_0 = C::put_in_regs(ctx, pattern5_1);
7580                             let expr3_0: usize = 1;
7581                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr2_0, expr3_0)?;
7582                             let expr5_0 = constructor_do_clz(ctx, expr0_0, expr1_0, expr4_0)?;
7583                             let expr6_0: Type = I64;
7584                             let expr7_0: Type = I64;
7585                             let expr8_0: Type = I64;
7586                             let expr9_0 = C::put_in_regs(ctx, pattern5_1);
7587                             let expr10_0: usize = 0;
7588                             let expr11_0 = constructor_value_regs_get_gpr(ctx, expr9_0, expr10_0)?;
7589                             let expr12_0 = constructor_do_clz(ctx, expr7_0, expr8_0, expr11_0)?;
7590                             let expr13_0: u32 = 64;
7591                             let expr14_0 = RegMemImm::Imm { simm32: expr13_0 };
7592                             let expr15_0 = C::gpr_mem_imm_new(ctx, &expr14_0);
7593                             let expr16_0 = constructor_x64_add(ctx, expr6_0, expr12_0, &expr15_0)?;
7594                             let expr17_0 = OperandSize::Size64;
7595                             let expr18_0: u32 = 64;
7596                             let expr19_0 =
7597                                 constructor_x64_cmp_imm(ctx, &expr17_0, expr18_0, expr5_0)?;
7598                             let expr20_0: Type = I64;
7599                             let expr21_0 = CC::NZ;
7600                             let expr22_0 = C::gpr_to_gpr_mem(ctx, expr5_0);
7601                             let expr23_0 =
7602                                 constructor_cmove(ctx, expr20_0, &expr21_0, &expr22_0, expr16_0)?;
7603                             let expr24_0 = constructor_with_flags_reg(ctx, &expr19_0, &expr23_0)?;
7604                             let expr25_0 = C::gpr_new(ctx, expr24_0);
7605                             let expr26_0 = C::gpr_to_reg(ctx, expr25_0);
7606                             let expr27_0: Type = I64;
7607                             let expr28_0: u64 = 0;
7608                             let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0)?;
7609                             let expr30_0 = C::value_regs(ctx, expr26_0, expr29_0);
7610                             let expr31_0 = C::output(ctx, expr30_0);
7611                             return Some(expr31_0);
7612                         }
7613                         &Opcode::Ctz => {
7614                             // Rule at src/isa/x64/lower.isle line 1843.
7615                             let expr0_0: Type = I64;
7616                             let expr1_0: Type = I64;
7617                             let expr2_0 = C::put_in_regs(ctx, pattern5_1);
7618                             let expr3_0: usize = 0;
7619                             let expr4_0 = constructor_value_regs_get_gpr(ctx, expr2_0, expr3_0)?;
7620                             let expr5_0 = constructor_do_ctz(ctx, expr0_0, expr1_0, expr4_0)?;
7621                             let expr6_0: Type = I64;
7622                             let expr7_0: Type = I64;
7623                             let expr8_0: Type = I64;
7624                             let expr9_0 = C::put_in_regs(ctx, pattern5_1);
7625                             let expr10_0: usize = 1;
7626                             let expr11_0 = constructor_value_regs_get_gpr(ctx, expr9_0, expr10_0)?;
7627                             let expr12_0 = constructor_do_ctz(ctx, expr7_0, expr8_0, expr11_0)?;
7628                             let expr13_0: u32 = 64;
7629                             let expr14_0 = RegMemImm::Imm { simm32: expr13_0 };
7630                             let expr15_0 = C::gpr_mem_imm_new(ctx, &expr14_0);
7631                             let expr16_0 = constructor_x64_add(ctx, expr6_0, expr12_0, &expr15_0)?;
7632                             let expr17_0 = OperandSize::Size64;
7633                             let expr18_0: u32 = 64;
7634                             let expr19_0 =
7635                                 constructor_x64_cmp_imm(ctx, &expr17_0, expr18_0, expr5_0)?;
7636                             let expr20_0: Type = I64;
7637                             let expr21_0 = CC::Z;
7638                             let expr22_0 = C::gpr_to_gpr_mem(ctx, expr16_0);
7639                             let expr23_0 =
7640                                 constructor_cmove(ctx, expr20_0, &expr21_0, &expr22_0, expr5_0)?;
7641                             let expr24_0 = constructor_with_flags_reg(ctx, &expr19_0, &expr23_0)?;
7642                             let expr25_0 = C::gpr_new(ctx, expr24_0);
7643                             let expr26_0 = C::gpr_to_reg(ctx, expr25_0);
7644                             let expr27_0: Type = I64;
7645                             let expr28_0: u64 = 0;
7646                             let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0)?;
7647                             let expr30_0 = C::value_regs(ctx, expr26_0, expr29_0);
7648                             let expr31_0 = C::output(ctx, expr30_0);
7649                             return Some(expr31_0);
7650                         }
7651                         &Opcode::Popcnt => {
7652                             // Rule at src/isa/x64/lower.isle line 1895.
7653                             let expr0_0: Type = I64;
7654                             let expr1_0 = C::put_in_regs(ctx, pattern5_1);
7655                             let expr2_0: usize = 0;
7656                             let expr3_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr2_0)?;
7657                             let expr4_0 = constructor_do_popcnt(ctx, expr0_0, expr3_0)?;
7658                             let expr5_0: Type = I64;
7659                             let expr6_0 = C::put_in_regs(ctx, pattern5_1);
7660                             let expr7_0: usize = 1;
7661                             let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0)?;
7662                             let expr9_0 = constructor_do_popcnt(ctx, expr5_0, expr8_0)?;
7663                             let expr10_0: Type = I64;
7664                             let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
7665                             let expr12_0 = constructor_x64_add(ctx, expr10_0, expr4_0, &expr11_0)?;
7666                             let expr13_0 = C::gpr_to_reg(ctx, expr12_0);
7667                             let expr14_0: Type = I64;
7668                             let expr15_0: u64 = 0;
7669                             let expr16_0 = constructor_imm(ctx, expr14_0, expr15_0)?;
7670                             let expr17_0 = C::value_regs(ctx, expr13_0, expr16_0);
7671                             let expr18_0 = C::output(ctx, expr17_0);
7672                             return Some(expr18_0);
7673                         }
7674                         &Opcode::Bint => {
7675                             // Rule at src/isa/x64/lower.isle line 2246.
7676                             let expr0_0: Type = I64;
7677                             let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
7678                             let expr2_0: u32 = 1;
7679                             let expr3_0 = RegMemImm::Imm { simm32: expr2_0 };
7680                             let expr4_0 = C::gpr_mem_imm_new(ctx, &expr3_0);
7681                             let expr5_0 = constructor_x64_and(ctx, expr0_0, expr1_0, &expr4_0)?;
7682                             let expr6_0 = C::gpr_to_reg(ctx, expr5_0);
7683                             let expr7_0: Type = I64;
7684                             let expr8_0: u64 = 0;
7685                             let expr9_0 = constructor_imm(ctx, expr7_0, expr8_0)?;
7686                             let expr10_0 = C::value_regs(ctx, expr6_0, expr9_0);
7687                             let expr11_0 = C::output(ctx, expr10_0);
7688                             return Some(expr11_0);
7689                         }
7690                         &Opcode::Uextend => {
7691                             let pattern7_0 = C::value_type(ctx, pattern5_1);
7692                             if pattern7_0 == I64 {
7693                                 // Rule at src/isa/x64/lower.isle line 2118.
7694                                 let expr0_0 = C::put_in_reg(ctx, pattern5_1);
7695                                 let expr1_0: Type = I64;
7696                                 let expr2_0: u64 = 0;
7697                                 let expr3_0 = constructor_imm(ctx, expr1_0, expr2_0)?;
7698                                 let expr4_0 = C::value_regs(ctx, expr0_0, expr3_0);
7699                                 let expr5_0 = C::output(ctx, expr4_0);
7700                                 return Some(expr5_0);
7701                             }
7702                             if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) {
7703                                 // Rule at src/isa/x64/lower.isle line 2122.
7704                                 let expr0_0: Type = I64;
7705                                 let expr1_0 = ExtendKind::Zero;
7706                                 let expr2_0 =
7707                                     constructor_extend_to_gpr(ctx, pattern5_1, expr0_0, &expr1_0)?;
7708                                 let expr3_0 = C::gpr_to_reg(ctx, expr2_0);
7709                                 let expr4_0: Type = I64;
7710                                 let expr5_0: u64 = 0;
7711                                 let expr6_0 = constructor_imm(ctx, expr4_0, expr5_0)?;
7712                                 let expr7_0 = C::value_regs(ctx, expr3_0, expr6_0);
7713                                 let expr8_0 = C::output(ctx, expr7_0);
7714                                 return Some(expr8_0);
7715                             }
7716                         }
7717                         _ => {}
7718                     }
7719                 }
7720                 &InstructionData::BinaryImm64 {
7721                     opcode: ref pattern5_0,
7722                     arg: pattern5_1,
7723                     imm: pattern5_2,
7724                 } => {
7725                     if let &Opcode::IaddImm = pattern5_0 {
7726                         let pattern7_0 = C::u64_from_imm64(ctx, pattern5_2);
7727                         // Rule at src/isa/x64/lower.isle line 210.
7728                         let expr0_0 = C::put_in_regs(ctx, pattern5_1);
7729                         let expr1_0: usize = 0;
7730                         let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
7731                         let expr3_0: usize = 1;
7732                         let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
7733                         let expr5_0: Type = I64;
7734                         let expr6_0 = constructor_imm(ctx, expr5_0, pattern7_0)?;
7735                         let expr7_0 = C::gpr_new(ctx, expr6_0);
7736                         let expr8_0: Type = I64;
7737                         let expr9_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
7738                         let expr10_0 =
7739                             constructor_x64_add_with_flags_paired(ctx, expr8_0, expr2_0, &expr9_0)?;
7740                         let expr11_0: Type = I64;
7741                         let expr12_0: u32 = 0;
7742                         let expr13_0 = RegMemImm::Imm { simm32: expr12_0 };
7743                         let expr14_0 = C::gpr_mem_imm_new(ctx, &expr13_0);
7744                         let expr15_0 =
7745                             constructor_x64_adc_paired(ctx, expr11_0, expr4_0, &expr14_0)?;
7746                         let expr16_0 = constructor_with_flags(ctx, &expr10_0, &expr15_0)?;
7747                         let expr17_0 = C::output(ctx, expr16_0);
7748                         return Some(expr17_0);
7749                     }
7750                 }
7751                 _ => {}
7752             }
7753         }
7754         if pattern2_0 == F32 {
7755             let pattern4_0 = C::inst_data(ctx, pattern0_0);
7756             match &pattern4_0 {
7757                 &InstructionData::Binary {
7758                     opcode: ref pattern5_0,
7759                     args: ref pattern5_1,
7760                 } => {
7761                     match pattern5_0 {
7762                         &Opcode::Fadd => {
7763                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7764                             // Rule at src/isa/x64/lower.isle line 2269.
7765                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
7766                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
7767                             let expr2_0 = constructor_x64_addss(ctx, expr0_0, &expr1_0)?;
7768                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7769                             return Some(expr3_0);
7770                         }
7771                         &Opcode::Fsub => {
7772                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7773                             // Rule at src/isa/x64/lower.isle line 2280.
7774                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
7775                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
7776                             let expr2_0 = constructor_x64_subss(ctx, expr0_0, &expr1_0)?;
7777                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7778                             return Some(expr3_0);
7779                         }
7780                         &Opcode::Fmul => {
7781                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7782                             // Rule at src/isa/x64/lower.isle line 2291.
7783                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
7784                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
7785                             let expr2_0 = constructor_x64_mulss(ctx, expr0_0, &expr1_0)?;
7786                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7787                             return Some(expr3_0);
7788                         }
7789                         &Opcode::Fdiv => {
7790                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7791                             // Rule at src/isa/x64/lower.isle line 2302.
7792                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
7793                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
7794                             let expr2_0 = constructor_x64_divss(ctx, expr0_0, &expr1_0)?;
7795                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7796                             return Some(expr3_0);
7797                         }
7798                         &Opcode::Fmin => {
7799                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7800                             // Rule at src/isa/x64/lower.isle line 2323.
7801                             let expr0_0: Type = F32;
7802                             let expr1_0: bool = true;
7803                             let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
7804                             let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
7805                             let expr4_0 = constructor_xmm_min_max_seq(
7806                                 ctx, expr0_0, expr1_0, expr2_0, expr3_0,
7807                             )?;
7808                             let expr5_0 = constructor_output_xmm(ctx, expr4_0)?;
7809                             return Some(expr5_0);
7810                         }
7811                         &Opcode::FminPseudo => {
7812                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7813                             // Rule at src/isa/x64/lower.isle line 2492.
7814                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
7815                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
7816                             let expr2_0 = constructor_x64_minss(ctx, expr0_0, expr1_0)?;
7817                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7818                             return Some(expr3_0);
7819                         }
7820                         &Opcode::Fmax => {
7821                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7822                             // Rule at src/isa/x64/lower.isle line 2395.
7823                             let expr0_0: Type = F32;
7824                             let expr1_0: bool = false;
7825                             let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
7826                             let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
7827                             let expr4_0 = constructor_xmm_min_max_seq(
7828                                 ctx, expr0_0, expr1_0, expr2_0, expr3_0,
7829                             )?;
7830                             let expr5_0 = constructor_output_xmm(ctx, expr4_0)?;
7831                             return Some(expr5_0);
7832                         }
7833                         &Opcode::FmaxPseudo => {
7834                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7835                             // Rule at src/isa/x64/lower.isle line 2503.
7836                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
7837                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
7838                             let expr2_0 = constructor_x64_maxss(ctx, expr0_0, expr1_0)?;
7839                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7840                             return Some(expr3_0);
7841                         }
7842                         _ => {}
7843                     }
7844                 }
7845                 &InstructionData::Unary {
7846                     opcode: ref pattern5_0,
7847                     arg: pattern5_1,
7848                 } => {
7849                     if let &Opcode::Sqrt = pattern5_0 {
7850                         // Rule at src/isa/x64/lower.isle line 2312.
7851                         let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
7852                         let expr1_0 = constructor_x64_sqrtss(ctx, expr0_0)?;
7853                         let expr2_0 = constructor_output_xmm(ctx, expr1_0)?;
7854                         return Some(expr2_0);
7855                     }
7856                 }
7857                 &InstructionData::Load {
7858                     opcode: ref pattern5_0,
7859                     arg: pattern5_1,
7860                     flags: pattern5_2,
7861                     offset: pattern5_3,
7862                 } => {
7863                     if let &Opcode::Load = pattern5_0 {
7864                         // Rule at src/isa/x64/lower.isle line 2546.
7865                         let expr0_0 =
7866                             constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?;
7867                         let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?;
7868                         let expr2_0 = constructor_x64_movss_load(ctx, &expr1_0)?;
7869                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7870                         return Some(expr3_0);
7871                     }
7872                 }
7873                 _ => {}
7874             }
7875         }
7876         if pattern2_0 == F64 {
7877             let pattern4_0 = C::inst_data(ctx, pattern0_0);
7878             match &pattern4_0 {
7879                 &InstructionData::Binary {
7880                     opcode: ref pattern5_0,
7881                     args: ref pattern5_1,
7882                 } => {
7883                     match pattern5_0 {
7884                         &Opcode::Fadd => {
7885                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7886                             // Rule at src/isa/x64/lower.isle line 2271.
7887                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
7888                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
7889                             let expr2_0 = constructor_x64_addsd(ctx, expr0_0, &expr1_0)?;
7890                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7891                             return Some(expr3_0);
7892                         }
7893                         &Opcode::Fsub => {
7894                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7895                             // Rule at src/isa/x64/lower.isle line 2282.
7896                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
7897                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
7898                             let expr2_0 = constructor_x64_subsd(ctx, expr0_0, &expr1_0)?;
7899                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7900                             return Some(expr3_0);
7901                         }
7902                         &Opcode::Fmul => {
7903                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7904                             // Rule at src/isa/x64/lower.isle line 2293.
7905                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
7906                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
7907                             let expr2_0 = constructor_x64_mulsd(ctx, expr0_0, &expr1_0)?;
7908                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7909                             return Some(expr3_0);
7910                         }
7911                         &Opcode::Fdiv => {
7912                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7913                             // Rule at src/isa/x64/lower.isle line 2304.
7914                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
7915                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
7916                             let expr2_0 = constructor_x64_divsd(ctx, expr0_0, &expr1_0)?;
7917                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7918                             return Some(expr3_0);
7919                         }
7920                         &Opcode::Fmin => {
7921                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7922                             // Rule at src/isa/x64/lower.isle line 2325.
7923                             let expr0_0: Type = F64;
7924                             let expr1_0: bool = true;
7925                             let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
7926                             let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
7927                             let expr4_0 = constructor_xmm_min_max_seq(
7928                                 ctx, expr0_0, expr1_0, expr2_0, expr3_0,
7929                             )?;
7930                             let expr5_0 = constructor_output_xmm(ctx, expr4_0)?;
7931                             return Some(expr5_0);
7932                         }
7933                         &Opcode::FminPseudo => {
7934                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7935                             // Rule at src/isa/x64/lower.isle line 2494.
7936                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
7937                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
7938                             let expr2_0 = constructor_x64_minsd(ctx, expr0_0, expr1_0)?;
7939                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7940                             return Some(expr3_0);
7941                         }
7942                         &Opcode::Fmax => {
7943                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7944                             // Rule at src/isa/x64/lower.isle line 2397.
7945                             let expr0_0: Type = F64;
7946                             let expr1_0: bool = false;
7947                             let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
7948                             let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
7949                             let expr4_0 = constructor_xmm_min_max_seq(
7950                                 ctx, expr0_0, expr1_0, expr2_0, expr3_0,
7951                             )?;
7952                             let expr5_0 = constructor_output_xmm(ctx, expr4_0)?;
7953                             return Some(expr5_0);
7954                         }
7955                         &Opcode::FmaxPseudo => {
7956                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
7957                             // Rule at src/isa/x64/lower.isle line 2505.
7958                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
7959                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
7960                             let expr2_0 = constructor_x64_maxsd(ctx, expr0_0, expr1_0)?;
7961                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7962                             return Some(expr3_0);
7963                         }
7964                         _ => {}
7965                     }
7966                 }
7967                 &InstructionData::Unary {
7968                     opcode: ref pattern5_0,
7969                     arg: pattern5_1,
7970                 } => {
7971                     if let &Opcode::Sqrt = pattern5_0 {
7972                         // Rule at src/isa/x64/lower.isle line 2314.
7973                         let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
7974                         let expr1_0 = constructor_x64_sqrtsd(ctx, expr0_0)?;
7975                         let expr2_0 = constructor_output_xmm(ctx, expr1_0)?;
7976                         return Some(expr2_0);
7977                     }
7978                 }
7979                 &InstructionData::Load {
7980                     opcode: ref pattern5_0,
7981                     arg: pattern5_1,
7982                     flags: pattern5_2,
7983                     offset: pattern5_3,
7984                 } => {
7985                     if let &Opcode::Load = pattern5_0 {
7986                         // Rule at src/isa/x64/lower.isle line 2548.
7987                         let expr0_0 =
7988                             constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?;
7989                         let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?;
7990                         let expr2_0 = constructor_x64_movsd_load(ctx, &expr1_0)?;
7991                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
7992                         return Some(expr3_0);
7993                     }
7994                 }
7995                 _ => {}
7996             }
7997         }
7998         if pattern2_0 == I8X16 {
7999             let pattern4_0 = C::inst_data(ctx, pattern0_0);
8000             match &pattern4_0 {
8001                 &InstructionData::Binary {
8002                     opcode: ref pattern5_0,
8003                     args: ref pattern5_1,
8004                 } => {
8005                     match pattern5_0 {
8006                         &Opcode::Imin => {
8007                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8008                             // Rule at src/isa/x64/lower.isle line 1405.
8009                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8010                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8011                             let expr2_0 = constructor_x64_pminsb(ctx, expr0_0, &expr1_0)?;
8012                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8013                             return Some(expr3_0);
8014                         }
8015                         &Opcode::Umin => {
8016                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8017                             // Rule at src/isa/x64/lower.isle line 1427.
8018                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8019                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8020                             let expr2_0 = constructor_x64_pminub(ctx, expr0_0, &expr1_0)?;
8021                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8022                             return Some(expr3_0);
8023                         }
8024                         &Opcode::Imax => {
8025                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8026                             // Rule at src/isa/x64/lower.isle line 1394.
8027                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8028                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8029                             let expr2_0 = constructor_x64_pmaxsb(ctx, expr0_0, &expr1_0)?;
8030                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8031                             return Some(expr3_0);
8032                         }
8033                         &Opcode::Umax => {
8034                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8035                             // Rule at src/isa/x64/lower.isle line 1416.
8036                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8037                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8038                             let expr2_0 = constructor_x64_pmaxub(ctx, expr0_0, &expr1_0)?;
8039                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8040                             return Some(expr3_0);
8041                         }
8042                         &Opcode::Ishl => {
8043                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8044                             // Rule at src/isa/x64/lower.isle line 534.
8045                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8046                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
8047                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
8048                             let expr3_0 = constructor_x64_psllw(ctx, expr0_0, &expr2_0)?;
8049                             let expr4_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
8050                             let expr5_0 = constructor_ishl_i8x16_mask(ctx, &expr4_0)?;
8051                             let expr6_0: Type = I8X16;
8052                             let expr7_0 = ExtKind::None;
8053                             let expr8_0 = constructor_x64_load(ctx, expr6_0, &expr5_0, &expr7_0)?;
8054                             let expr9_0: Type = I8X16;
8055                             let expr10_0 = RegMem::Reg { reg: expr8_0 };
8056                             let expr11_0 = C::reg_mem_to_xmm_mem(ctx, &expr10_0);
8057                             let expr12_0 = constructor_sse_and(ctx, expr9_0, expr3_0, &expr11_0)?;
8058                             let expr13_0 = constructor_output_xmm(ctx, expr12_0)?;
8059                             return Some(expr13_0);
8060                         }
8061                         &Opcode::Ushr => {
8062                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8063                             // Rule at src/isa/x64/lower.isle line 633.
8064                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8065                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
8066                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
8067                             let expr3_0 = constructor_x64_psrlw(ctx, expr0_0, &expr2_0)?;
8068                             let expr4_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
8069                             let expr5_0 = constructor_ushr_i8x16_mask(ctx, &expr4_0)?;
8070                             let expr6_0: Type = I8X16;
8071                             let expr7_0 = ExtKind::None;
8072                             let expr8_0 = constructor_x64_load(ctx, expr6_0, &expr5_0, &expr7_0)?;
8073                             let expr9_0: Type = I8X16;
8074                             let expr10_0 = RegMem::Reg { reg: expr8_0 };
8075                             let expr11_0 = C::reg_mem_to_xmm_mem(ctx, &expr10_0);
8076                             let expr12_0 = constructor_sse_and(ctx, expr9_0, expr3_0, &expr11_0)?;
8077                             let expr13_0 = constructor_output_xmm(ctx, expr12_0)?;
8078                             return Some(expr13_0);
8079                         }
8080                         &Opcode::Sshr => {
8081                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8082                             let pattern8_0 = C::value_type(ctx, pattern7_1);
8083                             // Rule at src/isa/x64/lower.isle line 749.
8084                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8085                             let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
8086                             let expr2_0 = constructor_x64_punpcklbw(ctx, expr0_0, &expr1_0)?;
8087                             let expr3_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
8088                             let expr4_0 = constructor_x64_punpckhbw(ctx, expr0_0, &expr3_0)?;
8089                             let expr5_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
8090                             let expr6_0 =
8091                                 constructor_sshr_i8x16_bigger_shift(ctx, pattern8_0, &expr5_0)?;
8092                             let expr7_0 = constructor_x64_psraw(ctx, expr2_0, &expr6_0)?;
8093                             let expr8_0 = constructor_x64_psraw(ctx, expr4_0, &expr6_0)?;
8094                             let expr9_0 = C::xmm_to_xmm_mem(ctx, expr8_0);
8095                             let expr10_0 = constructor_x64_packsswb(ctx, expr7_0, &expr9_0)?;
8096                             let expr11_0 = constructor_output_xmm(ctx, expr10_0)?;
8097                             return Some(expr11_0);
8098                         }
8099                         _ => {}
8100                     }
8101                 }
8102                 &InstructionData::Unary {
8103                     opcode: ref pattern5_0,
8104                     arg: pattern5_1,
8105                 } => {
8106                     match pattern5_0 {
8107                         &Opcode::Ineg => {
8108                             // Rule at src/isa/x64/lower.isle line 889.
8109                             let expr0_0: Type = I8X16;
8110                             let expr1_0: u64 = 0;
8111                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
8112                             let expr3_0 = C::xmm_new(ctx, expr2_0);
8113                             let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
8114                             let expr5_0 = constructor_x64_psubb(ctx, expr3_0, &expr4_0)?;
8115                             let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
8116                             return Some(expr6_0);
8117                         }
8118                         &Opcode::Iabs => {
8119                             // Rule at src/isa/x64/lower.isle line 1210.
8120                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
8121                             let expr1_0 = constructor_x64_pabsb(ctx, &expr0_0)?;
8122                             let expr2_0 = constructor_output_xmm(ctx, expr1_0)?;
8123                             return Some(expr2_0);
8124                         }
8125                         &Opcode::Popcnt => {
8126                             // Rule at src/isa/x64/lower.isle line 2002.
8127                             let expr0_0 = C::popcount_4bit_table(ctx);
8128                             let expr1_0: Type = I8X16;
8129                             let expr2_0 = C::popcount_low_mask(ctx);
8130                             let expr3_0 = constructor_x64_xmm_load_const(ctx, expr1_0, expr2_0)?;
8131                             let expr4_0: Type = I8X16;
8132                             let expr5_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
8133                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr3_0);
8134                             let expr7_0 = constructor_sse_and(ctx, expr4_0, expr5_0, &expr6_0)?;
8135                             let expr8_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
8136                             let expr9_0: u32 = 4;
8137                             let expr10_0 = RegMemImm::Imm { simm32: expr9_0 };
8138                             let expr11_0 = constructor_mov_rmi_to_xmm(ctx, &expr10_0)?;
8139                             let expr12_0 = constructor_x64_psrlw(ctx, expr8_0, &expr11_0)?;
8140                             let expr13_0: Type = I8X16;
8141                             let expr14_0 = C::xmm_to_xmm_mem(ctx, expr3_0);
8142                             let expr15_0 = constructor_sse_and(ctx, expr13_0, expr12_0, &expr14_0)?;
8143                             let expr16_0: Type = I8X16;
8144                             let expr17_0 = C::popcount_4bit_table(ctx);
8145                             let expr18_0 = constructor_x64_xmm_load_const(ctx, expr16_0, expr17_0)?;
8146                             let expr19_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
8147                             let expr20_0 = constructor_x64_pshufb(ctx, expr18_0, &expr19_0)?;
8148                             let expr21_0 = C::xmm_to_xmm_mem(ctx, expr15_0);
8149                             let expr22_0 = constructor_x64_pshufb(ctx, expr18_0, &expr21_0)?;
8150                             let expr23_0 = C::xmm_to_xmm_mem(ctx, expr22_0);
8151                             let expr24_0 = constructor_x64_paddb(ctx, expr20_0, &expr23_0)?;
8152                             let expr25_0 = constructor_output_xmm(ctx, expr24_0)?;
8153                             return Some(expr25_0);
8154                         }
8155                         _ => {}
8156                     }
8157                 }
8158                 _ => {}
8159             }
8160         }
8161         if pattern2_0 == I16X8 {
8162             let pattern4_0 = C::inst_data(ctx, pattern0_0);
8163             match &pattern4_0 {
8164                 &InstructionData::Binary {
8165                     opcode: ref pattern5_0,
8166                     args: ref pattern5_1,
8167                 } => {
8168                     match pattern5_0 {
8169                         &Opcode::Imin => {
8170                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8171                             // Rule at src/isa/x64/lower.isle line 1408.
8172                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8173                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8174                             let expr2_0 = constructor_x64_pminsw(ctx, expr0_0, &expr1_0)?;
8175                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8176                             return Some(expr3_0);
8177                         }
8178                         &Opcode::Umin => {
8179                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8180                             // Rule at src/isa/x64/lower.isle line 1430.
8181                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8182                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8183                             let expr2_0 = constructor_x64_pminuw(ctx, expr0_0, &expr1_0)?;
8184                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8185                             return Some(expr3_0);
8186                         }
8187                         &Opcode::Imax => {
8188                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8189                             // Rule at src/isa/x64/lower.isle line 1397.
8190                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8191                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8192                             let expr2_0 = constructor_x64_pmaxsw(ctx, expr0_0, &expr1_0)?;
8193                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8194                             return Some(expr3_0);
8195                         }
8196                         &Opcode::Umax => {
8197                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8198                             // Rule at src/isa/x64/lower.isle line 1419.
8199                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8200                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8201                             let expr2_0 = constructor_x64_pmaxuw(ctx, expr0_0, &expr1_0)?;
8202                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8203                             return Some(expr3_0);
8204                         }
8205                         &Opcode::Ishl => {
8206                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8207                             // Rule at src/isa/x64/lower.isle line 576.
8208                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8209                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
8210                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
8211                             let expr3_0 = constructor_x64_psllw(ctx, expr0_0, &expr2_0)?;
8212                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
8213                             return Some(expr4_0);
8214                         }
8215                         &Opcode::Ushr => {
8216                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8217                             // Rule at src/isa/x64/lower.isle line 678.
8218                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8219                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
8220                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
8221                             let expr3_0 = constructor_x64_psrlw(ctx, expr0_0, &expr2_0)?;
8222                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
8223                             return Some(expr4_0);
8224                         }
8225                         &Opcode::Sshr => {
8226                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8227                             // Rule at src/isa/x64/lower.isle line 776.
8228                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8229                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
8230                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
8231                             let expr3_0 = constructor_x64_psraw(ctx, expr0_0, &expr2_0)?;
8232                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
8233                             return Some(expr4_0);
8234                         }
8235                         _ => {}
8236                     }
8237                 }
8238                 &InstructionData::Unary {
8239                     opcode: ref pattern5_0,
8240                     arg: pattern5_1,
8241                 } => {
8242                     match pattern5_0 {
8243                         &Opcode::Ineg => {
8244                             // Rule at src/isa/x64/lower.isle line 892.
8245                             let expr0_0: Type = I16X8;
8246                             let expr1_0: u64 = 0;
8247                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
8248                             let expr3_0 = C::xmm_new(ctx, expr2_0);
8249                             let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
8250                             let expr5_0 = constructor_x64_psubw(ctx, expr3_0, &expr4_0)?;
8251                             let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
8252                             return Some(expr6_0);
8253                         }
8254                         &Opcode::Iabs => {
8255                             // Rule at src/isa/x64/lower.isle line 1213.
8256                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
8257                             let expr1_0 = constructor_x64_pabsw(ctx, &expr0_0)?;
8258                             let expr2_0 = constructor_output_xmm(ctx, expr1_0)?;
8259                             return Some(expr2_0);
8260                         }
8261                         _ => {}
8262                     }
8263                 }
8264                 &InstructionData::Load {
8265                     opcode: ref pattern5_0,
8266                     arg: pattern5_1,
8267                     flags: pattern5_2,
8268                     offset: pattern5_3,
8269                 } => {
8270                     match pattern5_0 {
8271                         &Opcode::Uload8x8 => {
8272                             // Rule at src/isa/x64/lower.isle line 2570.
8273                             let expr0_0 =
8274                                 constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?;
8275                             let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?;
8276                             let expr2_0 = constructor_x64_pmovzxbw(ctx, &expr1_0)?;
8277                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8278                             return Some(expr3_0);
8279                         }
8280                         &Opcode::Sload8x8 => {
8281                             // Rule at src/isa/x64/lower.isle line 2568.
8282                             let expr0_0 =
8283                                 constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?;
8284                             let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?;
8285                             let expr2_0 = constructor_x64_pmovsxbw(ctx, &expr1_0)?;
8286                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8287                             return Some(expr3_0);
8288                         }
8289                         _ => {}
8290                     }
8291                 }
8292                 _ => {}
8293             }
8294         }
8295         if pattern2_0 == I32X4 {
8296             let pattern4_0 = C::inst_data(ctx, pattern0_0);
8297             match &pattern4_0 {
8298                 &InstructionData::Binary {
8299                     opcode: ref pattern5_0,
8300                     args: ref pattern5_1,
8301                 } => {
8302                     match pattern5_0 {
8303                         &Opcode::Imin => {
8304                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8305                             // Rule at src/isa/x64/lower.isle line 1411.
8306                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8307                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8308                             let expr2_0 = constructor_x64_pminsd(ctx, expr0_0, &expr1_0)?;
8309                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8310                             return Some(expr3_0);
8311                         }
8312                         &Opcode::Umin => {
8313                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8314                             // Rule at src/isa/x64/lower.isle line 1433.
8315                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8316                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8317                             let expr2_0 = constructor_x64_pminud(ctx, expr0_0, &expr1_0)?;
8318                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8319                             return Some(expr3_0);
8320                         }
8321                         &Opcode::Imax => {
8322                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8323                             // Rule at src/isa/x64/lower.isle line 1400.
8324                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8325                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8326                             let expr2_0 = constructor_x64_pmaxsd(ctx, expr0_0, &expr1_0)?;
8327                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8328                             return Some(expr3_0);
8329                         }
8330                         &Opcode::Umax => {
8331                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8332                             // Rule at src/isa/x64/lower.isle line 1422.
8333                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8334                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8335                             let expr2_0 = constructor_x64_pmaxud(ctx, expr0_0, &expr1_0)?;
8336                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8337                             return Some(expr3_0);
8338                         }
8339                         &Opcode::Ishl => {
8340                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8341                             // Rule at src/isa/x64/lower.isle line 579.
8342                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8343                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
8344                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
8345                             let expr3_0 = constructor_x64_pslld(ctx, expr0_0, &expr2_0)?;
8346                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
8347                             return Some(expr4_0);
8348                         }
8349                         &Opcode::Ushr => {
8350                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8351                             // Rule at src/isa/x64/lower.isle line 681.
8352                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8353                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
8354                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
8355                             let expr3_0 = constructor_x64_psrld(ctx, expr0_0, &expr2_0)?;
8356                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
8357                             return Some(expr4_0);
8358                         }
8359                         &Opcode::Sshr => {
8360                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8361                             // Rule at src/isa/x64/lower.isle line 779.
8362                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8363                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
8364                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
8365                             let expr3_0 = constructor_x64_psrad(ctx, expr0_0, &expr2_0)?;
8366                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
8367                             return Some(expr4_0);
8368                         }
8369                         &Opcode::WideningPairwiseDotProductS => {
8370                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8371                             // Rule at src/isa/x64/lower.isle line 2259.
8372                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8373                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8374                             let expr2_0 = constructor_x64_pmaddwd(ctx, expr0_0, &expr1_0)?;
8375                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8376                             return Some(expr3_0);
8377                         }
8378                         _ => {}
8379                     }
8380                 }
8381                 &InstructionData::Unary {
8382                     opcode: ref pattern5_0,
8383                     arg: pattern5_1,
8384                 } => {
8385                     match pattern5_0 {
8386                         &Opcode::Ineg => {
8387                             // Rule at src/isa/x64/lower.isle line 895.
8388                             let expr0_0: Type = I32X4;
8389                             let expr1_0: u64 = 0;
8390                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
8391                             let expr3_0 = C::xmm_new(ctx, expr2_0);
8392                             let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
8393                             let expr5_0 = constructor_x64_psubd(ctx, expr3_0, &expr4_0)?;
8394                             let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
8395                             return Some(expr6_0);
8396                         }
8397                         &Opcode::Iabs => {
8398                             // Rule at src/isa/x64/lower.isle line 1216.
8399                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
8400                             let expr1_0 = constructor_x64_pabsd(ctx, &expr0_0)?;
8401                             let expr2_0 = constructor_output_xmm(ctx, expr1_0)?;
8402                             return Some(expr2_0);
8403                         }
8404                         _ => {}
8405                     }
8406                 }
8407                 &InstructionData::Load {
8408                     opcode: ref pattern5_0,
8409                     arg: pattern5_1,
8410                     flags: pattern5_2,
8411                     offset: pattern5_3,
8412                 } => {
8413                     match pattern5_0 {
8414                         &Opcode::Uload16x4 => {
8415                             // Rule at src/isa/x64/lower.isle line 2574.
8416                             let expr0_0 =
8417                                 constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?;
8418                             let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?;
8419                             let expr2_0 = constructor_x64_pmovzxwd(ctx, &expr1_0)?;
8420                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8421                             return Some(expr3_0);
8422                         }
8423                         &Opcode::Sload16x4 => {
8424                             // Rule at src/isa/x64/lower.isle line 2572.
8425                             let expr0_0 =
8426                                 constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?;
8427                             let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?;
8428                             let expr2_0 = constructor_x64_pmovsxwd(ctx, &expr1_0)?;
8429                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8430                             return Some(expr3_0);
8431                         }
8432                         _ => {}
8433                     }
8434                 }
8435                 _ => {}
8436             }
8437         }
8438         if pattern2_0 == I64X2 {
8439             let pattern4_0 = C::inst_data(ctx, pattern0_0);
8440             match &pattern4_0 {
8441                 &InstructionData::Binary {
8442                     opcode: ref pattern5_0,
8443                     args: ref pattern5_1,
8444                 } => {
8445                     match pattern5_0 {
8446                         &Opcode::Ishl => {
8447                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8448                             // Rule at src/isa/x64/lower.isle line 582.
8449                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8450                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
8451                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
8452                             let expr3_0 = constructor_x64_psllq(ctx, expr0_0, &expr2_0)?;
8453                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
8454                             return Some(expr4_0);
8455                         }
8456                         &Opcode::Ushr => {
8457                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8458                             // Rule at src/isa/x64/lower.isle line 684.
8459                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8460                             let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1);
8461                             let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?;
8462                             let expr3_0 = constructor_x64_psrlq(ctx, expr0_0, &expr2_0)?;
8463                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
8464                             return Some(expr4_0);
8465                         }
8466                         &Opcode::Sshr => {
8467                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8468                             // Rule at src/isa/x64/lower.isle line 790.
8469                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8470                             let expr1_0: Type = I64;
8471                             let expr2_0: u8 = 0;
8472                             let expr3_0 = constructor_x64_pextrd(ctx, expr1_0, expr0_0, expr2_0)?;
8473                             let expr4_0: Type = I64;
8474                             let expr5_0: u8 = 1;
8475                             let expr6_0 = constructor_x64_pextrd(ctx, expr4_0, expr0_0, expr5_0)?;
8476                             let expr7_0: Type = I64;
8477                             let expr8_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, expr7_0);
8478                             let expr9_0: Type = I64;
8479                             let expr10_0 = constructor_x64_sar(ctx, expr9_0, expr3_0, &expr8_0)?;
8480                             let expr11_0: Type = I64;
8481                             let expr12_0 = constructor_x64_sar(ctx, expr11_0, expr6_0, &expr8_0)?;
8482                             let expr13_0 = C::gpr_to_gpr_mem(ctx, expr10_0);
8483                             let expr14_0 = C::gpr_to_gpr_mem(ctx, expr12_0);
8484                             let expr15_0 =
8485                                 constructor_make_i64x2_from_lanes(ctx, &expr13_0, &expr14_0)?;
8486                             let expr16_0 = constructor_output_xmm(ctx, expr15_0)?;
8487                             return Some(expr16_0);
8488                         }
8489                         _ => {}
8490                     }
8491                 }
8492                 &InstructionData::Unary {
8493                     opcode: ref pattern5_0,
8494                     arg: pattern5_1,
8495                 } => {
8496                     match pattern5_0 {
8497                         &Opcode::Ineg => {
8498                             // Rule at src/isa/x64/lower.isle line 898.
8499                             let expr0_0: Type = I64X2;
8500                             let expr1_0: u64 = 0;
8501                             let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
8502                             let expr3_0 = C::xmm_new(ctx, expr2_0);
8503                             let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?;
8504                             let expr5_0 = constructor_x64_psubq(ctx, expr3_0, &expr4_0)?;
8505                             let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
8506                             return Some(expr6_0);
8507                         }
8508                         &Opcode::Iabs => {
8509                             // Rule at src/isa/x64/lower.isle line 1230.
8510                             let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
8511                             let expr1_0: Type = I64X2;
8512                             let expr2_0: u64 = 0;
8513                             let expr3_0 = constructor_imm(ctx, expr1_0, expr2_0)?;
8514                             let expr4_0 = C::xmm_new(ctx, expr3_0);
8515                             let expr5_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
8516                             let expr6_0 = constructor_x64_psubq(ctx, expr4_0, &expr5_0)?;
8517                             let expr7_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
8518                             let expr8_0 =
8519                                 constructor_x64_blendvpd(ctx, expr6_0, &expr7_0, expr6_0)?;
8520                             let expr9_0 = constructor_output_xmm(ctx, expr8_0)?;
8521                             return Some(expr9_0);
8522                         }
8523                         _ => {}
8524                     }
8525                 }
8526                 &InstructionData::Load {
8527                     opcode: ref pattern5_0,
8528                     arg: pattern5_1,
8529                     flags: pattern5_2,
8530                     offset: pattern5_3,
8531                 } => {
8532                     match pattern5_0 {
8533                         &Opcode::Uload32x2 => {
8534                             // Rule at src/isa/x64/lower.isle line 2578.
8535                             let expr0_0 =
8536                                 constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?;
8537                             let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?;
8538                             let expr2_0 = constructor_x64_pmovzxdq(ctx, &expr1_0)?;
8539                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8540                             return Some(expr3_0);
8541                         }
8542                         &Opcode::Sload32x2 => {
8543                             // Rule at src/isa/x64/lower.isle line 2576.
8544                             let expr0_0 =
8545                                 constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?;
8546                             let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?;
8547                             let expr2_0 = constructor_x64_pmovsxdq(ctx, &expr1_0)?;
8548                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8549                             return Some(expr3_0);
8550                         }
8551                         _ => {}
8552                     }
8553                 }
8554                 _ => {}
8555             }
8556         }
8557         if pattern2_0 == F32X4 {
8558             let pattern4_0 = C::inst_data(ctx, pattern0_0);
8559             match &pattern4_0 {
8560                 &InstructionData::Binary {
8561                     opcode: ref pattern5_0,
8562                     args: ref pattern5_1,
8563                 } => {
8564                     match pattern5_0 {
8565                         &Opcode::Fadd => {
8566                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8567                             // Rule at src/isa/x64/lower.isle line 2273.
8568                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8569                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8570                             let expr2_0 = constructor_x64_addps(ctx, expr0_0, &expr1_0)?;
8571                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8572                             return Some(expr3_0);
8573                         }
8574                         &Opcode::Fsub => {
8575                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8576                             // Rule at src/isa/x64/lower.isle line 2284.
8577                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8578                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8579                             let expr2_0 = constructor_x64_subps(ctx, expr0_0, &expr1_0)?;
8580                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8581                             return Some(expr3_0);
8582                         }
8583                         &Opcode::Fmul => {
8584                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8585                             // Rule at src/isa/x64/lower.isle line 2295.
8586                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8587                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8588                             let expr2_0 = constructor_x64_mulps(ctx, expr0_0, &expr1_0)?;
8589                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8590                             return Some(expr3_0);
8591                         }
8592                         &Opcode::Fdiv => {
8593                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8594                             // Rule at src/isa/x64/lower.isle line 2306.
8595                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8596                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8597                             let expr2_0 = constructor_x64_divps(ctx, expr0_0, &expr1_0)?;
8598                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8599                             return Some(expr3_0);
8600                         }
8601                         &Opcode::Fmin => {
8602                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8603                             // Rule at src/isa/x64/lower.isle line 2340.
8604                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8605                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
8606                             let expr2_0 = constructor_x64_minps(ctx, expr0_0, expr1_0)?;
8607                             let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
8608                             let expr4_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8609                             let expr5_0 = constructor_x64_minps(ctx, expr3_0, expr4_0)?;
8610                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
8611                             let expr7_0 = constructor_x64_orps(ctx, expr2_0, &expr6_0)?;
8612                             let expr8_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
8613                             let expr9_0 = FcmpImm::Unordered;
8614                             let expr10_0 = constructor_x64_cmpps(ctx, expr7_0, &expr8_0, &expr9_0)?;
8615                             let expr11_0 = C::xmm_to_xmm_mem(ctx, expr10_0);
8616                             let expr12_0 = constructor_x64_orps(ctx, expr7_0, &expr11_0)?;
8617                             let expr13_0: u32 = 10;
8618                             let expr14_0 = RegMemImm::Imm { simm32: expr13_0 };
8619                             let expr15_0 = constructor_mov_rmi_to_xmm(ctx, &expr14_0)?;
8620                             let expr16_0 = constructor_x64_psrld(ctx, expr10_0, &expr15_0)?;
8621                             let expr17_0 = C::xmm_to_xmm_mem(ctx, expr12_0);
8622                             let expr18_0 = constructor_x64_andnps(ctx, expr16_0, &expr17_0)?;
8623                             let expr19_0 = constructor_output_xmm(ctx, expr18_0)?;
8624                             return Some(expr19_0);
8625                         }
8626                         &Opcode::FminPseudo => {
8627                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8628                             // Rule at src/isa/x64/lower.isle line 2496.
8629                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
8630                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8631                             let expr2_0 = constructor_x64_minps(ctx, expr0_0, expr1_0)?;
8632                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8633                             return Some(expr3_0);
8634                         }
8635                         &Opcode::Fmax => {
8636                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8637                             // Rule at src/isa/x64/lower.isle line 2403.
8638                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8639                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
8640                             let expr2_0 = constructor_x64_maxps(ctx, expr0_0, expr1_0)?;
8641                             let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
8642                             let expr4_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8643                             let expr5_0 = constructor_x64_maxps(ctx, expr3_0, expr4_0)?;
8644                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
8645                             let expr7_0 = constructor_x64_xorps(ctx, expr2_0, &expr6_0)?;
8646                             let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
8647                             let expr9_0 = constructor_x64_orps(ctx, expr2_0, &expr8_0)?;
8648                             let expr10_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
8649                             let expr11_0 = constructor_x64_subps(ctx, expr9_0, &expr10_0)?;
8650                             let expr12_0 = C::xmm_to_xmm_mem(ctx, expr9_0);
8651                             let expr13_0 = FcmpImm::Unordered;
8652                             let expr14_0 =
8653                                 constructor_x64_cmpps(ctx, expr9_0, &expr12_0, &expr13_0)?;
8654                             let expr15_0: u32 = 10;
8655                             let expr16_0 = RegMemImm::Imm { simm32: expr15_0 };
8656                             let expr17_0 = constructor_mov_rmi_to_xmm(ctx, &expr16_0)?;
8657                             let expr18_0 = constructor_x64_psrld(ctx, expr14_0, &expr17_0)?;
8658                             let expr19_0 = C::xmm_to_xmm_mem(ctx, expr11_0);
8659                             let expr20_0 = constructor_x64_andnps(ctx, expr18_0, &expr19_0)?;
8660                             let expr21_0 = constructor_output_xmm(ctx, expr20_0)?;
8661                             return Some(expr21_0);
8662                         }
8663                         &Opcode::FmaxPseudo => {
8664                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8665                             // Rule at src/isa/x64/lower.isle line 2507.
8666                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
8667                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8668                             let expr2_0 = constructor_x64_maxps(ctx, expr0_0, expr1_0)?;
8669                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8670                             return Some(expr3_0);
8671                         }
8672                         _ => {}
8673                     }
8674                 }
8675                 &InstructionData::Unary {
8676                     opcode: ref pattern5_0,
8677                     arg: pattern5_1,
8678                 } => {
8679                     match pattern5_0 {
8680                         &Opcode::Sqrt => {
8681                             // Rule at src/isa/x64/lower.isle line 2316.
8682                             let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
8683                             let expr1_0 = constructor_x64_sqrtps(ctx, expr0_0)?;
8684                             let expr2_0 = constructor_output_xmm(ctx, expr1_0)?;
8685                             return Some(expr2_0);
8686                         }
8687                         &Opcode::Fabs => {
8688                             // Rule at src/isa/x64/lower.isle line 1238.
8689                             let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
8690                             let expr1_0: Type = F32X4;
8691                             let expr2_0 = constructor_vector_all_ones(ctx, expr1_0)?;
8692                             let expr3_0: u32 = 1;
8693                             let expr4_0 = RegMemImm::Imm { simm32: expr3_0 };
8694                             let expr5_0 = constructor_mov_rmi_to_xmm(ctx, &expr4_0)?;
8695                             let expr6_0 = constructor_x64_psrld(ctx, expr2_0, &expr5_0)?;
8696                             let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0);
8697                             let expr8_0 = constructor_x64_andps(ctx, expr0_0, &expr7_0)?;
8698                             let expr9_0 = constructor_output_xmm(ctx, expr8_0)?;
8699                             return Some(expr9_0);
8700                         }
8701                         _ => {}
8702                     }
8703                 }
8704                 &InstructionData::Load {
8705                     opcode: ref pattern5_0,
8706                     arg: pattern5_1,
8707                     flags: pattern5_2,
8708                     offset: pattern5_3,
8709                 } => {
8710                     if let &Opcode::Load = pattern5_0 {
8711                         // Rule at src/isa/x64/lower.isle line 2550.
8712                         let expr0_0 =
8713                             constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?;
8714                         let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?;
8715                         let expr2_0 = constructor_x64_movups(ctx, &expr1_0)?;
8716                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8717                         return Some(expr3_0);
8718                     }
8719                 }
8720                 _ => {}
8721             }
8722         }
8723         if pattern2_0 == F64X2 {
8724             let pattern4_0 = C::inst_data(ctx, pattern0_0);
8725             match &pattern4_0 {
8726                 &InstructionData::Binary {
8727                     opcode: ref pattern5_0,
8728                     args: ref pattern5_1,
8729                 } => {
8730                     match pattern5_0 {
8731                         &Opcode::Fadd => {
8732                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8733                             // Rule at src/isa/x64/lower.isle line 2275.
8734                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8735                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8736                             let expr2_0 = constructor_x64_addpd(ctx, expr0_0, &expr1_0)?;
8737                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8738                             return Some(expr3_0);
8739                         }
8740                         &Opcode::Fsub => {
8741                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8742                             // Rule at src/isa/x64/lower.isle line 2286.
8743                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8744                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8745                             let expr2_0 = constructor_x64_subpd(ctx, expr0_0, &expr1_0)?;
8746                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8747                             return Some(expr3_0);
8748                         }
8749                         &Opcode::Fmul => {
8750                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8751                             // Rule at src/isa/x64/lower.isle line 2297.
8752                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8753                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8754                             let expr2_0 = constructor_x64_mulpd(ctx, expr0_0, &expr1_0)?;
8755                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8756                             return Some(expr3_0);
8757                         }
8758                         &Opcode::Fdiv => {
8759                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8760                             // Rule at src/isa/x64/lower.isle line 2308.
8761                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8762                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
8763                             let expr2_0 = constructor_x64_divpd(ctx, expr0_0, &expr1_0)?;
8764                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8765                             return Some(expr3_0);
8766                         }
8767                         &Opcode::Fmin => {
8768                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8769                             // Rule at src/isa/x64/lower.isle line 2383.
8770                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8771                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
8772                             let expr2_0 = constructor_x64_minpd(ctx, expr0_0, expr1_0)?;
8773                             let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
8774                             let expr4_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8775                             let expr5_0 = constructor_x64_minpd(ctx, expr3_0, expr4_0)?;
8776                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
8777                             let expr7_0 = constructor_x64_orpd(ctx, expr2_0, &expr6_0)?;
8778                             let expr8_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
8779                             let expr9_0 = FcmpImm::Unordered;
8780                             let expr10_0 = constructor_x64_cmppd(ctx, expr2_0, &expr8_0, &expr9_0)?;
8781                             let expr11_0 = C::xmm_to_xmm_mem(ctx, expr10_0);
8782                             let expr12_0 = constructor_x64_orpd(ctx, expr7_0, &expr11_0)?;
8783                             let expr13_0: u32 = 13;
8784                             let expr14_0 = RegMemImm::Imm { simm32: expr13_0 };
8785                             let expr15_0 = constructor_mov_rmi_to_xmm(ctx, &expr14_0)?;
8786                             let expr16_0 = constructor_x64_psrlq(ctx, expr10_0, &expr15_0)?;
8787                             let expr17_0 = C::xmm_to_xmm_mem(ctx, expr12_0);
8788                             let expr18_0 = constructor_x64_andnpd(ctx, expr16_0, &expr17_0)?;
8789                             let expr19_0 = constructor_output_xmm(ctx, expr18_0)?;
8790                             return Some(expr19_0);
8791                         }
8792                         &Opcode::FminPseudo => {
8793                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8794                             // Rule at src/isa/x64/lower.isle line 2498.
8795                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
8796                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8797                             let expr2_0 = constructor_x64_minpd(ctx, expr0_0, expr1_0)?;
8798                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8799                             return Some(expr3_0);
8800                         }
8801                         &Opcode::Fmax => {
8802                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8803                             // Rule at src/isa/x64/lower.isle line 2446.
8804                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8805                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
8806                             let expr2_0 = constructor_x64_maxpd(ctx, expr0_0, expr1_0)?;
8807                             let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
8808                             let expr4_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8809                             let expr5_0 = constructor_x64_maxpd(ctx, expr3_0, expr4_0)?;
8810                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
8811                             let expr7_0 = constructor_x64_xorpd(ctx, expr2_0, &expr6_0)?;
8812                             let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
8813                             let expr9_0 = constructor_x64_orpd(ctx, expr2_0, &expr8_0)?;
8814                             let expr10_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
8815                             let expr11_0 = constructor_x64_subpd(ctx, expr9_0, &expr10_0)?;
8816                             let expr12_0 = C::xmm_to_xmm_mem(ctx, expr9_0);
8817                             let expr13_0 = FcmpImm::Unordered;
8818                             let expr14_0 =
8819                                 constructor_x64_cmppd(ctx, expr9_0, &expr12_0, &expr13_0)?;
8820                             let expr15_0: u32 = 13;
8821                             let expr16_0 = RegMemImm::Imm { simm32: expr15_0 };
8822                             let expr17_0 = constructor_mov_rmi_to_xmm(ctx, &expr16_0)?;
8823                             let expr18_0 = constructor_x64_psrlq(ctx, expr14_0, &expr17_0)?;
8824                             let expr19_0 = C::xmm_to_xmm_mem(ctx, expr11_0);
8825                             let expr20_0 = constructor_x64_andnpd(ctx, expr18_0, &expr19_0)?;
8826                             let expr21_0 = constructor_output_xmm(ctx, expr20_0)?;
8827                             return Some(expr21_0);
8828                         }
8829                         &Opcode::FmaxPseudo => {
8830                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
8831                             // Rule at src/isa/x64/lower.isle line 2509.
8832                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
8833                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
8834                             let expr2_0 = constructor_x64_maxpd(ctx, expr0_0, expr1_0)?;
8835                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8836                             return Some(expr3_0);
8837                         }
8838                         _ => {}
8839                     }
8840                 }
8841                 &InstructionData::Unary {
8842                     opcode: ref pattern5_0,
8843                     arg: pattern5_1,
8844                 } => {
8845                     match pattern5_0 {
8846                         &Opcode::Sqrt => {
8847                             // Rule at src/isa/x64/lower.isle line 2318.
8848                             let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
8849                             let expr1_0 = constructor_x64_sqrtpd(ctx, expr0_0)?;
8850                             let expr2_0 = constructor_output_xmm(ctx, expr1_0)?;
8851                             return Some(expr2_0);
8852                         }
8853                         &Opcode::Fabs => {
8854                             // Rule at src/isa/x64/lower.isle line 1244.
8855                             let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
8856                             let expr1_0: Type = F64X2;
8857                             let expr2_0 = constructor_vector_all_ones(ctx, expr1_0)?;
8858                             let expr3_0: u32 = 1;
8859                             let expr4_0 = RegMemImm::Imm { simm32: expr3_0 };
8860                             let expr5_0 = constructor_mov_rmi_to_xmm(ctx, &expr4_0)?;
8861                             let expr6_0 = constructor_x64_psrlq(ctx, expr2_0, &expr5_0)?;
8862                             let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0);
8863                             let expr8_0 = constructor_x64_andpd(ctx, expr0_0, &expr7_0)?;
8864                             let expr9_0 = constructor_output_xmm(ctx, expr8_0)?;
8865                             return Some(expr9_0);
8866                         }
8867                         _ => {}
8868                     }
8869                 }
8870                 &InstructionData::Load {
8871                     opcode: ref pattern5_0,
8872                     arg: pattern5_1,
8873                     flags: pattern5_2,
8874                     offset: pattern5_3,
8875                 } => {
8876                     if let &Opcode::Load = pattern5_0 {
8877                         // Rule at src/isa/x64/lower.isle line 2552.
8878                         let expr0_0 =
8879                             constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?;
8880                         let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?;
8881                         let expr2_0 = constructor_x64_movupd(ctx, &expr1_0)?;
8882                         let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8883                         return Some(expr3_0);
8884                     }
8885                 }
8886                 _ => {}
8887             }
8888         }
8889         let pattern3_0 = C::inst_data(ctx, pattern0_0);
8890         match &pattern3_0 {
8891             &InstructionData::NullAry {
8892                 opcode: ref pattern4_0,
8893             } => {
8894                 if let &Opcode::Null = pattern4_0 {
8895                     // Rule at src/isa/x64/lower.isle line 56.
8896                     let expr0_0: u64 = 0;
8897                     let expr1_0 = constructor_imm(ctx, pattern2_0, expr0_0)?;
8898                     let expr2_0 = constructor_output_reg(ctx, expr1_0)?;
8899                     return Some(expr2_0);
8900                 }
8901             }
8902             &InstructionData::Binary {
8903                 opcode: ref pattern4_0,
8904                 args: ref pattern4_1,
8905             } => {
8906                 if let &Opcode::BandNot = pattern4_0 {
8907                     let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1);
8908                     // Rule at src/isa/x64/lower.isle line 1205.
8909                     let expr0_0 = constructor_put_in_xmm(ctx, pattern6_1)?;
8910                     let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern6_0)?;
8911                     let expr2_0 = constructor_sse_and_not(ctx, pattern2_0, expr0_0, &expr1_0)?;
8912                     let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
8913                     return Some(expr3_0);
8914                 }
8915             }
8916             &InstructionData::Ternary {
8917                 opcode: ref pattern4_0,
8918                 args: ref pattern4_1,
8919             } => {
8920                 if let &Opcode::Select = pattern4_0 {
8921                     let (pattern6_0, pattern6_1, pattern6_2) =
8922                         C::unpack_value_array_3(ctx, pattern4_1);
8923                     if let Some(pattern7_0) = C::def_inst(ctx, pattern6_0) {
8924                         let pattern8_0 = C::inst_data(ctx, pattern7_0);
8925                         match &pattern8_0 {
8926                             &InstructionData::FloatCompare {
8927                                 opcode: ref pattern9_0,
8928                                 args: ref pattern9_1,
8929                                 cond: ref pattern9_2,
8930                             } => {
8931                                 if let &Opcode::Fcmp = pattern9_0 {
8932                                     let (pattern11_0, pattern11_1) =
8933                                         C::unpack_value_array_2(ctx, pattern9_1);
8934                                     match pattern9_2 {
8935                                         &FloatCC::Equal => {
8936                                             // Rule at src/isa/x64/lower.isle line 1746.
8937                                             let expr0_0 = constructor_x64_ucomis(
8938                                                 ctx,
8939                                                 pattern11_0,
8940                                                 pattern11_1,
8941                                             )?;
8942                                             let expr1_0 = CC::NZ;
8943                                             let expr2_0 = CC::P;
8944                                             let expr3_0 = constructor_cmove_or_from_values(
8945                                                 ctx, pattern2_0, &expr1_0, &expr2_0, pattern6_2,
8946                                                 pattern6_1,
8947                                             )?;
8948                                             let expr4_0 =
8949                                                 constructor_with_flags(ctx, &expr0_0, &expr3_0)?;
8950                                             let expr5_0 = C::output(ctx, expr4_0);
8951                                             return Some(expr5_0);
8952                                         }
8953                                         &FloatCC::GreaterThan => {
8954                                             // Rule at src/isa/x64/lower.isle line 1698.
8955                                             let expr0_0 = constructor_x64_ucomis(
8956                                                 ctx,
8957                                                 pattern11_1,
8958                                                 pattern11_0,
8959                                             )?;
8960                                             let expr1_0 = CC::NBE;
8961                                             let expr2_0 = constructor_cmove_from_values(
8962                                                 ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
8963                                             )?;
8964                                             let expr3_0 =
8965                                                 constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
8966                                             let expr4_0 = C::output(ctx, expr3_0);
8967                                             return Some(expr4_0);
8968                                         }
8969                                         &FloatCC::GreaterThanOrEqual => {
8970                                             // Rule at src/isa/x64/lower.isle line 1701.
8971                                             let expr0_0 = constructor_x64_ucomis(
8972                                                 ctx,
8973                                                 pattern11_1,
8974                                                 pattern11_0,
8975                                             )?;
8976                                             let expr1_0 = CC::NB;
8977                                             let expr2_0 = constructor_cmove_from_values(
8978                                                 ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
8979                                             )?;
8980                                             let expr3_0 =
8981                                                 constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
8982                                             let expr4_0 = C::output(ctx, expr3_0);
8983                                             return Some(expr4_0);
8984                                         }
8985                                         &FloatCC::LessThan => {
8986                                             // Rule at src/isa/x64/lower.isle line 1721.
8987                                             let expr0_0 = constructor_x64_ucomis(
8988                                                 ctx,
8989                                                 pattern11_0,
8990                                                 pattern11_1,
8991                                             )?;
8992                                             let expr1_0 = CC::NBE;
8993                                             let expr2_0 = constructor_cmove_from_values(
8994                                                 ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
8995                                             )?;
8996                                             let expr3_0 =
8997                                                 constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
8998                                             let expr4_0 = C::output(ctx, expr3_0);
8999                                             return Some(expr4_0);
9000                                         }
9001                                         &FloatCC::LessThanOrEqual => {
9002                                             // Rule at src/isa/x64/lower.isle line 1724.
9003                                             let expr0_0 = constructor_x64_ucomis(
9004                                                 ctx,
9005                                                 pattern11_0,
9006                                                 pattern11_1,
9007                                             )?;
9008                                             let expr1_0 = CC::NB;
9009                                             let expr2_0 = constructor_cmove_from_values(
9010                                                 ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
9011                                             )?;
9012                                             let expr3_0 =
9013                                                 constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
9014                                             let expr4_0 = C::output(ctx, expr3_0);
9015                                             return Some(expr4_0);
9016                                         }
9017                                         &FloatCC::NotEqual => {
9018                                             // Rule at src/isa/x64/lower.isle line 1749.
9019                                             let expr0_0 = constructor_x64_ucomis(
9020                                                 ctx,
9021                                                 pattern11_0,
9022                                                 pattern11_1,
9023                                             )?;
9024                                             let expr1_0 = CC::NZ;
9025                                             let expr2_0 = CC::P;
9026                                             let expr3_0 = constructor_cmove_or_from_values(
9027                                                 ctx, pattern2_0, &expr1_0, &expr2_0, pattern6_1,
9028                                                 pattern6_2,
9029                                             )?;
9030                                             let expr4_0 =
9031                                                 constructor_with_flags(ctx, &expr0_0, &expr3_0)?;
9032                                             let expr5_0 = C::output(ctx, expr4_0);
9033                                             return Some(expr5_0);
9034                                         }
9035                                         &FloatCC::Ordered => {
9036                                             // Rule at src/isa/x64/lower.isle line 1692.
9037                                             let expr0_0 = constructor_x64_ucomis(
9038                                                 ctx,
9039                                                 pattern11_1,
9040                                                 pattern11_0,
9041                                             )?;
9042                                             let expr1_0 = CC::NP;
9043                                             let expr2_0 = constructor_cmove_from_values(
9044                                                 ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
9045                                             )?;
9046                                             let expr3_0 =
9047                                                 constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
9048                                             let expr4_0 = C::output(ctx, expr3_0);
9049                                             return Some(expr4_0);
9050                                         }
9051                                         &FloatCC::Unordered => {
9052                                             // Rule at src/isa/x64/lower.isle line 1695.
9053                                             let expr0_0 = constructor_x64_ucomis(
9054                                                 ctx,
9055                                                 pattern11_1,
9056                                                 pattern11_0,
9057                                             )?;
9058                                             let expr1_0 = CC::P;
9059                                             let expr2_0 = constructor_cmove_from_values(
9060                                                 ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
9061                                             )?;
9062                                             let expr3_0 =
9063                                                 constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
9064                                             let expr4_0 = C::output(ctx, expr3_0);
9065                                             return Some(expr4_0);
9066                                         }
9067                                         &FloatCC::UnorderedOrGreaterThan => {
9068                                             // Rule at src/isa/x64/lower.isle line 1727.
9069                                             let expr0_0 = constructor_x64_ucomis(
9070                                                 ctx,
9071                                                 pattern11_0,
9072                                                 pattern11_1,
9073                                             )?;
9074                                             let expr1_0 = CC::B;
9075                                             let expr2_0 = constructor_cmove_from_values(
9076                                                 ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
9077                                             )?;
9078                                             let expr3_0 =
9079                                                 constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
9080                                             let expr4_0 = C::output(ctx, expr3_0);
9081                                             return Some(expr4_0);
9082                                         }
9083                                         &FloatCC::UnorderedOrGreaterThanOrEqual => {
9084                                             // Rule at src/isa/x64/lower.isle line 1730.
9085                                             let expr0_0 = constructor_x64_ucomis(
9086                                                 ctx,
9087                                                 pattern11_0,
9088                                                 pattern11_1,
9089                                             )?;
9090                                             let expr1_0 = CC::BE;
9091                                             let expr2_0 = constructor_cmove_from_values(
9092                                                 ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
9093                                             )?;
9094                                             let expr3_0 =
9095                                                 constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
9096                                             let expr4_0 = C::output(ctx, expr3_0);
9097                                             return Some(expr4_0);
9098                                         }
9099                                         &FloatCC::UnorderedOrLessThan => {
9100                                             // Rule at src/isa/x64/lower.isle line 1704.
9101                                             let expr0_0 = constructor_x64_ucomis(
9102                                                 ctx,
9103                                                 pattern11_1,
9104                                                 pattern11_0,
9105                                             )?;
9106                                             let expr1_0 = CC::B;
9107                                             let expr2_0 = constructor_cmove_from_values(
9108                                                 ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
9109                                             )?;
9110                                             let expr3_0 =
9111                                                 constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
9112                                             let expr4_0 = C::output(ctx, expr3_0);
9113                                             return Some(expr4_0);
9114                                         }
9115                                         &FloatCC::UnorderedOrLessThanOrEqual => {
9116                                             // Rule at src/isa/x64/lower.isle line 1707.
9117                                             let expr0_0 = constructor_x64_ucomis(
9118                                                 ctx,
9119                                                 pattern11_1,
9120                                                 pattern11_0,
9121                                             )?;
9122                                             let expr1_0 = CC::BE;
9123                                             let expr2_0 = constructor_cmove_from_values(
9124                                                 ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2,
9125                                             )?;
9126                                             let expr3_0 =
9127                                                 constructor_with_flags(ctx, &expr0_0, &expr2_0)?;
9128                                             let expr4_0 = C::output(ctx, expr3_0);
9129                                             return Some(expr4_0);
9130                                         }
9131                                         _ => {}
9132                                     }
9133                                 }
9134                             }
9135                             &InstructionData::IntCompare {
9136                                 opcode: ref pattern9_0,
9137                                 args: ref pattern9_1,
9138                                 cond: ref pattern9_2,
9139                             } => {
9140                                 if let &Opcode::Icmp = pattern9_0 {
9141                                     let (pattern11_0, pattern11_1) =
9142                                         C::unpack_value_array_2(ctx, pattern9_1);
9143                                     let pattern12_0 = C::value_type(ctx, pattern11_0);
9144                                     if let Some(pattern13_0) = C::fits_in_64(ctx, pattern12_0) {
9145                                         // Rule at src/isa/x64/lower.isle line 1757.
9146                                         let expr0_0 = C::raw_operand_size_of_type(ctx, pattern13_0);
9147                                         let expr1_0 =
9148                                             constructor_put_in_gpr_mem_imm(ctx, pattern11_1)?;
9149                                         let expr2_0 = constructor_put_in_gpr(ctx, pattern11_0)?;
9150                                         let expr3_0 =
9151                                             constructor_x64_cmp(ctx, &expr0_0, &expr1_0, expr2_0)?;
9152                                         let expr4_0 = C::intcc_to_cc(ctx, pattern9_2);
9153                                         let expr5_0 = constructor_cmove_from_values(
9154                                             ctx, pattern2_0, &expr4_0, pattern6_1, pattern6_2,
9155                                         )?;
9156                                         let expr6_0 =
9157                                             constructor_with_flags(ctx, &expr3_0, &expr5_0)?;
9158                                         let expr7_0 = C::output(ctx, expr6_0);
9159                                         return Some(expr7_0);
9160                                     }
9161                                 }
9162                             }
9163                             _ => {}
9164                         }
9165                     }
9166                     let pattern7_0 = C::value_type(ctx, pattern6_0);
9167                     if pattern7_0 == B1 {
9168                         // Rule at src/isa/x64/lower.isle line 1764.
9169                         let expr0_0: Type = B1;
9170                         let expr1_0 = C::raw_operand_size_of_type(ctx, expr0_0);
9171                         let expr2_0 = constructor_put_in_gpr(ctx, pattern6_0)?;
9172                         let expr3_0: u32 = 1;
9173                         let expr4_0 = RegMemImm::Imm { simm32: expr3_0 };
9174                         let expr5_0 = C::gpr_mem_imm_new(ctx, &expr4_0);
9175                         let expr6_0 = constructor_x64_test(ctx, &expr1_0, &expr5_0, expr2_0)?;
9176                         let expr7_0 = CC::NZ;
9177                         let expr8_0 = constructor_cmove_from_values(
9178                             ctx, pattern2_0, &expr7_0, pattern6_1, pattern6_2,
9179                         )?;
9180                         let expr9_0 = constructor_with_flags(ctx, &expr6_0, &expr8_0)?;
9181                         let expr10_0 = C::output(ctx, expr9_0);
9182                         return Some(expr10_0);
9183                     }
9184                     if let Some(pattern8_0) = C::fits_in_64(ctx, pattern7_0) {
9185                         // Rule at src/isa/x64/lower.isle line 1771.
9186                         let expr0_0 = C::raw_operand_size_of_type(ctx, pattern8_0);
9187                         let expr1_0 = constructor_put_in_gpr(ctx, pattern6_0)?;
9188                         let expr2_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0);
9189                         let expr3_0 = constructor_x64_test(ctx, &expr0_0, &expr2_0, expr1_0)?;
9190                         let expr4_0 = CC::NZ;
9191                         let expr5_0 = constructor_cmove_from_values(
9192                             ctx, pattern2_0, &expr4_0, pattern6_1, pattern6_2,
9193                         )?;
9194                         let expr6_0 = constructor_with_flags(ctx, &expr3_0, &expr5_0)?;
9195                         let expr7_0 = C::output(ctx, expr6_0);
9196                         return Some(expr7_0);
9197                     }
9198                 }
9199             }
9200             &InstructionData::Unary {
9201                 opcode: ref pattern4_0,
9202                 arg: pattern4_1,
9203             } => {
9204                 match pattern4_0 {
9205                     &Opcode::Breduce => {
9206                         let pattern6_0 = C::value_type(ctx, pattern4_1);
9207                         if pattern6_0 == pattern2_0 {
9208                             // Rule at src/isa/x64/lower.isle line 2232.
9209                             let expr0_0 = constructor_output_value(ctx, pattern4_1)?;
9210                             return Some(expr0_0);
9211                         }
9212                     }
9213                     &Opcode::Bextend => {
9214                         let pattern6_0 = C::value_type(ctx, pattern4_1);
9215                         // Rule at src/isa/x64/lower.isle line 2213.
9216                         let expr0_0 =
9217                             constructor_generic_sextend(ctx, pattern4_1, pattern6_0, pattern2_0)?;
9218                         return Some(expr0_0);
9219                     }
9220                     &Opcode::Ireduce => {
9221                         let pattern6_0 = C::value_type(ctx, pattern4_1);
9222                         if pattern6_0 == pattern2_0 {
9223                             // Rule at src/isa/x64/lower.isle line 2221.
9224                             let expr0_0 = constructor_output_value(ctx, pattern4_1)?;
9225                             return Some(expr0_0);
9226                         }
9227                     }
9228                     &Opcode::Uextend => {
9229                         let pattern6_0 = C::value_type(ctx, pattern4_1);
9230                         if pattern6_0 == pattern2_0 {
9231                             // Rule at src/isa/x64/lower.isle line 2114.
9232                             let expr0_0 = constructor_output_value(ctx, pattern4_1)?;
9233                             return Some(expr0_0);
9234                         }
9235                     }
9236                     &Opcode::Sextend => {
9237                         let pattern6_0 = C::value_type(ctx, pattern4_1);
9238                         // Rule at src/isa/x64/lower.isle line 2207.
9239                         let expr0_0 =
9240                             constructor_generic_sextend(ctx, pattern4_1, pattern6_0, pattern2_0)?;
9241                         return Some(expr0_0);
9242                     }
9243                     _ => {}
9244                 }
9245             }
9246             _ => {}
9247         }
9248         if let Some(()) = C::avx512vl_enabled(ctx, pattern2_0) {
9249             if let Some(()) = C::avx512dq_enabled(ctx, pattern2_0) {
9250                 if let Some((pattern5_0, pattern5_1)) = C::multi_lane(ctx, pattern2_0) {
9251                     if pattern5_0 == 64 {
9252                         if pattern5_1 == 2 {
9253                             let pattern8_0 = C::inst_data(ctx, pattern0_0);
9254                             if let &InstructionData::Binary {
9255                                 opcode: ref pattern9_0,
9256                                 args: ref pattern9_1,
9257                             } = &pattern8_0
9258                             {
9259                                 if let &Opcode::Imul = pattern9_0 {
9260                                     let (pattern11_0, pattern11_1) =
9261                                         C::unpack_value_array_2(ctx, pattern9_1);
9262                                     // Rule at src/isa/x64/lower.isle line 992.
9263                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern11_0)?;
9264                                     let expr1_0 = constructor_put_in_xmm(ctx, pattern11_1)?;
9265                                     let expr2_0 = constructor_x64_vpmullq(ctx, &expr0_0, expr1_0)?;
9266                                     let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
9267                                     return Some(expr3_0);
9268                                 }
9269                             }
9270                         }
9271                     }
9272                 }
9273             }
9274             if let Some(()) = C::avx512f_enabled(ctx, pattern2_0) {
9275                 if pattern2_0 == I64X2 {
9276                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
9277                     if let &InstructionData::Unary {
9278                         opcode: ref pattern7_0,
9279                         arg: pattern7_1,
9280                     } = &pattern6_0
9281                     {
9282                         if let &Opcode::Iabs = pattern7_0 {
9283                             // Rule at src/isa/x64/lower.isle line 1220.
9284                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
9285                             let expr1_0 = constructor_x64_vpabsq(ctx, &expr0_0)?;
9286                             let expr2_0 = constructor_output_xmm(ctx, expr1_0)?;
9287                             return Some(expr2_0);
9288                         }
9289                     }
9290                 }
9291             }
9292         }
9293         if let Some((pattern3_0, pattern3_1)) = C::multi_lane(ctx, pattern2_0) {
9294             if pattern3_0 == 8 {
9295                 if pattern3_1 == 16 {
9296                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
9297                     if let &InstructionData::Binary {
9298                         opcode: ref pattern7_0,
9299                         args: ref pattern7_1,
9300                     } = &pattern6_0
9301                     {
9302                         match pattern7_0 {
9303                             &Opcode::AvgRound => {
9304                                 let (pattern9_0, pattern9_1) =
9305                                     C::unpack_value_array_2(ctx, pattern7_1);
9306                                 // Rule at src/isa/x64/lower.isle line 903.
9307                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
9308                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
9309                                 let expr2_0 = constructor_x64_pavgb(ctx, expr0_0, &expr1_0)?;
9310                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
9311                                 return Some(expr3_0);
9312                             }
9313                             &Opcode::UaddSat => {
9314                                 let (pattern9_0, pattern9_1) =
9315                                     C::unpack_value_array_2(ctx, pattern7_1);
9316                                 // Rule at src/isa/x64/lower.isle line 136.
9317                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
9318                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
9319                                 let expr2_0 = constructor_x64_paddusb(ctx, expr0_0, &expr1_0)?;
9320                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
9321                                 return Some(expr3_0);
9322                             }
9323                             &Opcode::SaddSat => {
9324                                 let (pattern9_0, pattern9_1) =
9325                                     C::unpack_value_array_2(ctx, pattern7_1);
9326                                 // Rule at src/isa/x64/lower.isle line 126.
9327                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
9328                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
9329                                 let expr2_0 = constructor_x64_paddsb(ctx, expr0_0, &expr1_0)?;
9330                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
9331                                 return Some(expr3_0);
9332                             }
9333                             &Opcode::UsubSat => {
9334                                 let (pattern9_0, pattern9_1) =
9335                                     C::unpack_value_array_2(ctx, pattern7_1);
9336                                 // Rule at src/isa/x64/lower.isle line 282.
9337                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
9338                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
9339                                 let expr2_0 = constructor_x64_psubusb(ctx, expr0_0, &expr1_0)?;
9340                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
9341                                 return Some(expr3_0);
9342                             }
9343                             &Opcode::SsubSat => {
9344                                 let (pattern9_0, pattern9_1) =
9345                                     C::unpack_value_array_2(ctx, pattern7_1);
9346                                 // Rule at src/isa/x64/lower.isle line 272.
9347                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
9348                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
9349                                 let expr2_0 = constructor_x64_psubsb(ctx, expr0_0, &expr1_0)?;
9350                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
9351                                 return Some(expr3_0);
9352                             }
9353                             &Opcode::Iadd => {
9354                                 let (pattern9_0, pattern9_1) =
9355                                     C::unpack_value_array_2(ctx, pattern7_1);
9356                                 // Rule at src/isa/x64/lower.isle line 94.
9357                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
9358                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
9359                                 let expr2_0 = constructor_x64_paddb(ctx, expr0_0, &expr1_0)?;
9360                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
9361                                 return Some(expr3_0);
9362                             }
9363                             &Opcode::Isub => {
9364                                 let (pattern9_0, pattern9_1) =
9365                                     C::unpack_value_array_2(ctx, pattern7_1);
9366                                 // Rule at src/isa/x64/lower.isle line 240.
9367                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
9368                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
9369                                 let expr2_0 = constructor_x64_psubb(ctx, expr0_0, &expr1_0)?;
9370                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
9371                                 return Some(expr3_0);
9372                             }
9373                             _ => {}
9374                         }
9375                     }
9376                 }
9377             }
9378             if pattern3_0 == 16 {
9379                 if pattern3_1 == 8 {
9380                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
9381                     if let &InstructionData::Binary {
9382                         opcode: ref pattern7_0,
9383                         args: ref pattern7_1,
9384                     } = &pattern6_0
9385                     {
9386                         match pattern7_0 {
9387                             &Opcode::AvgRound => {
9388                                 let (pattern9_0, pattern9_1) =
9389                                     C::unpack_value_array_2(ctx, pattern7_1);
9390                                 // Rule at src/isa/x64/lower.isle line 907.
9391                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
9392                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
9393                                 let expr2_0 = constructor_x64_pavgw(ctx, expr0_0, &expr1_0)?;
9394                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
9395                                 return Some(expr3_0);
9396                             }
9397                             &Opcode::UaddSat => {
9398                                 let (pattern9_0, pattern9_1) =
9399                                     C::unpack_value_array_2(ctx, pattern7_1);
9400                                 // Rule at src/isa/x64/lower.isle line 140.
9401                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
9402                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
9403                                 let expr2_0 = constructor_x64_paddusw(ctx, expr0_0, &expr1_0)?;
9404                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
9405                                 return Some(expr3_0);
9406                             }
9407                             &Opcode::SaddSat => {
9408                                 let (pattern9_0, pattern9_1) =
9409                                     C::unpack_value_array_2(ctx, pattern7_1);
9410                                 // Rule at src/isa/x64/lower.isle line 130.
9411                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
9412                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
9413                                 let expr2_0 = constructor_x64_paddsw(ctx, expr0_0, &expr1_0)?;
9414                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
9415                                 return Some(expr3_0);
9416                             }
9417                             &Opcode::UsubSat => {
9418                                 let (pattern9_0, pattern9_1) =
9419                                     C::unpack_value_array_2(ctx, pattern7_1);
9420                                 // Rule at src/isa/x64/lower.isle line 286.
9421                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
9422                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
9423                                 let expr2_0 = constructor_x64_psubusw(ctx, expr0_0, &expr1_0)?;
9424                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
9425                                 return Some(expr3_0);
9426                             }
9427                             &Opcode::SsubSat => {
9428                                 let (pattern9_0, pattern9_1) =
9429                                     C::unpack_value_array_2(ctx, pattern7_1);
9430                                 // Rule at src/isa/x64/lower.isle line 276.
9431                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
9432                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
9433                                 let expr2_0 = constructor_x64_psubsw(ctx, expr0_0, &expr1_0)?;
9434                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
9435                                 return Some(expr3_0);
9436                             }
9437                             &Opcode::Iadd => {
9438                                 let (pattern9_0, pattern9_1) =
9439                                     C::unpack_value_array_2(ctx, pattern7_1);
9440                                 // Rule at src/isa/x64/lower.isle line 98.
9441                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
9442                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
9443                                 let expr2_0 = constructor_x64_paddw(ctx, expr0_0, &expr1_0)?;
9444                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
9445                                 return Some(expr3_0);
9446                             }
9447                             &Opcode::Isub => {
9448                                 let (pattern9_0, pattern9_1) =
9449                                     C::unpack_value_array_2(ctx, pattern7_1);
9450                                 // Rule at src/isa/x64/lower.isle line 244.
9451                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
9452                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
9453                                 let expr2_0 = constructor_x64_psubw(ctx, expr0_0, &expr1_0)?;
9454                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
9455                                 return Some(expr3_0);
9456                             }
9457                             &Opcode::Imul => {
9458                                 let (pattern9_0, pattern9_1) =
9459                                     C::unpack_value_array_2(ctx, pattern7_1);
9460                                 if let Some(pattern10_0) = C::def_inst(ctx, pattern9_0) {
9461                                     let pattern11_0 = C::inst_data(ctx, pattern10_0);
9462                                     if let &InstructionData::Unary {
9463                                         opcode: ref pattern12_0,
9464                                         arg: pattern12_1,
9465                                     } = &pattern11_0
9466                                     {
9467                                         match pattern12_0 {
9468                                             &Opcode::SwidenLow => {
9469                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
9470                                                 if let Some((pattern15_0, pattern15_1)) =
9471                                                     C::multi_lane(ctx, pattern14_0)
9472                                                 {
9473                                                     if pattern15_0 == 8 {
9474                                                         if pattern15_1 == 16 {
9475                                                             if let Some(pattern18_0) =
9476                                                                 C::def_inst(ctx, pattern9_1)
9477                                                             {
9478                                                                 let pattern19_0 =
9479                                                                     C::inst_data(ctx, pattern18_0);
9480                                                                 if let &InstructionData::Unary {
9481                                                                     opcode: ref pattern20_0,
9482                                                                     arg: pattern20_1,
9483                                                                 } = &pattern19_0
9484                                                                 {
9485                                                                     if let &Opcode::SwidenLow =
9486                                                                         pattern20_0
9487                                                                     {
9488                                                                         let pattern22_0 =
9489                                                                             C::value_type(
9490                                                                                 ctx,
9491                                                                                 pattern20_1,
9492                                                                             );
9493                                                                         if let Some((
9494                                                                             pattern23_0,
9495                                                                             pattern23_1,
9496                                                                         )) = C::multi_lane(
9497                                                                             ctx,
9498                                                                             pattern22_0,
9499                                                                         ) {
9500                                                                             if pattern23_0 == 8 {
9501                                                                                 if pattern23_1 == 16
9502                                                                                 {
9503                                                                                     // Rule at src/isa/x64/lower.isle line 1080.
9504                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
9505                                                                                     let expr1_0 = constructor_x64_pmovsxbw(ctx, &expr0_0)?;
9506                                                                                     let expr2_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
9507                                                                                     let expr3_0 = constructor_x64_pmovsxbw(ctx, &expr2_0)?;
9508                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0);
9509                                                                                     let expr5_0 = constructor_x64_pmullw(ctx, expr1_0, &expr4_0)?;
9510                                                                                     let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
9511                                                                                     return Some(
9512                                                                                         expr6_0,
9513                                                                                     );
9514                                                                                 }
9515                                                                             }
9516                                                                         }
9517                                                                     }
9518                                                                 }
9519                                                             }
9520                                                         }
9521                                                     }
9522                                                 }
9523                                             }
9524                                             &Opcode::SwidenHigh => {
9525                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
9526                                                 if let Some((pattern15_0, pattern15_1)) =
9527                                                     C::multi_lane(ctx, pattern14_0)
9528                                                 {
9529                                                     if pattern15_0 == 8 {
9530                                                         if pattern15_1 == 16 {
9531                                                             if let Some(pattern18_0) =
9532                                                                 C::def_inst(ctx, pattern9_1)
9533                                                             {
9534                                                                 let pattern19_0 =
9535                                                                     C::inst_data(ctx, pattern18_0);
9536                                                                 if let &InstructionData::Unary {
9537                                                                     opcode: ref pattern20_0,
9538                                                                     arg: pattern20_1,
9539                                                                 } = &pattern19_0
9540                                                                 {
9541                                                                     if let &Opcode::SwidenHigh =
9542                                                                         pattern20_0
9543                                                                     {
9544                                                                         let pattern22_0 =
9545                                                                             C::value_type(
9546                                                                                 ctx,
9547                                                                                 pattern20_1,
9548                                                                             );
9549                                                                         if let Some((
9550                                                                             pattern23_0,
9551                                                                             pattern23_1,
9552                                                                         )) = C::multi_lane(
9553                                                                             ctx,
9554                                                                             pattern22_0,
9555                                                                         ) {
9556                                                                             if pattern23_0 == 8 {
9557                                                                                 if pattern23_1 == 16
9558                                                                                 {
9559                                                                                     // Rule at src/isa/x64/lower.isle line 1040.
9560                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
9561                                                                                     let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
9562                                                                                     let expr2_0: u8 = 8;
9563                                                                                     let expr3_0 = OperandSize::Size32;
9564                                                                                     let expr4_0 = constructor_x64_palignr(ctx, expr0_0, &expr1_0, expr2_0, &expr3_0)?;
9565                                                                                     let expr5_0 = C::xmm_to_xmm_mem(ctx, expr4_0);
9566                                                                                     let expr6_0 = constructor_x64_pmovsxbw(ctx, &expr5_0)?;
9567                                                                                     let expr7_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
9568                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
9569                                                                                     let expr9_0: u8 = 8;
9570                                                                                     let expr10_0 = OperandSize::Size32;
9571                                                                                     let expr11_0 = constructor_x64_palignr(ctx, expr7_0, &expr8_0, expr9_0, &expr10_0)?;
9572                                                                                     let expr12_0 = C::xmm_to_xmm_mem(ctx, expr11_0);
9573                                                                                     let expr13_0 = constructor_x64_pmovsxbw(ctx, &expr12_0)?;
9574                                                                                     let expr14_0 = C::xmm_to_xmm_mem(ctx, expr13_0);
9575                                                                                     let expr15_0 = constructor_x64_pmullw(ctx, expr6_0, &expr14_0)?;
9576                                                                                     let expr16_0 = constructor_output_xmm(ctx, expr15_0)?;
9577                                                                                     return Some(
9578                                                                                         expr16_0,
9579                                                                                     );
9580                                                                                 }
9581                                                                             }
9582                                                                         }
9583                                                                     }
9584                                                                 }
9585                                                             }
9586                                                         }
9587                                                     }
9588                                                 }
9589                                             }
9590                                             &Opcode::UwidenLow => {
9591                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
9592                                                 if let Some((pattern15_0, pattern15_1)) =
9593                                                     C::multi_lane(ctx, pattern14_0)
9594                                                 {
9595                                                     if pattern15_0 == 8 {
9596                                                         if pattern15_1 == 16 {
9597                                                             if let Some(pattern18_0) =
9598                                                                 C::def_inst(ctx, pattern9_1)
9599                                                             {
9600                                                                 let pattern19_0 =
9601                                                                     C::inst_data(ctx, pattern18_0);
9602                                                                 if let &InstructionData::Unary {
9603                                                                     opcode: ref pattern20_0,
9604                                                                     arg: pattern20_1,
9605                                                                 } = &pattern19_0
9606                                                                 {
9607                                                                     if let &Opcode::UwidenLow =
9608                                                                         pattern20_0
9609                                                                     {
9610                                                                         let pattern22_0 =
9611                                                                             C::value_type(
9612                                                                                 ctx,
9613                                                                                 pattern20_1,
9614                                                                             );
9615                                                                         if let Some((
9616                                                                             pattern23_0,
9617                                                                             pattern23_1,
9618                                                                         )) = C::multi_lane(
9619                                                                             ctx,
9620                                                                             pattern22_0,
9621                                                                         ) {
9622                                                                             if pattern23_0 == 8 {
9623                                                                                 if pattern23_1 == 16
9624                                                                                 {
9625                                                                                     // Rule at src/isa/x64/lower.isle line 1156.
9626                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
9627                                                                                     let expr1_0 = constructor_x64_pmovzxbw(ctx, &expr0_0)?;
9628                                                                                     let expr2_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
9629                                                                                     let expr3_0 = constructor_x64_pmovzxbw(ctx, &expr2_0)?;
9630                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0);
9631                                                                                     let expr5_0 = constructor_x64_pmullw(ctx, expr1_0, &expr4_0)?;
9632                                                                                     let expr6_0 = constructor_output_xmm(ctx, expr5_0)?;
9633                                                                                     return Some(
9634                                                                                         expr6_0,
9635                                                                                     );
9636                                                                                 }
9637                                                                             }
9638                                                                         }
9639                                                                     }
9640                                                                 }
9641                                                             }
9642                                                         }
9643                                                     }
9644                                                 }
9645                                             }
9646                                             &Opcode::UwidenHigh => {
9647                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
9648                                                 if let Some((pattern15_0, pattern15_1)) =
9649                                                     C::multi_lane(ctx, pattern14_0)
9650                                                 {
9651                                                     if pattern15_0 == 8 {
9652                                                         if pattern15_1 == 16 {
9653                                                             if let Some(pattern18_0) =
9654                                                                 C::def_inst(ctx, pattern9_1)
9655                                                             {
9656                                                                 let pattern19_0 =
9657                                                                     C::inst_data(ctx, pattern18_0);
9658                                                                 if let &InstructionData::Unary {
9659                                                                     opcode: ref pattern20_0,
9660                                                                     arg: pattern20_1,
9661                                                                 } = &pattern19_0
9662                                                                 {
9663                                                                     if let &Opcode::UwidenHigh =
9664                                                                         pattern20_0
9665                                                                     {
9666                                                                         let pattern22_0 =
9667                                                                             C::value_type(
9668                                                                                 ctx,
9669                                                                                 pattern20_1,
9670                                                                             );
9671                                                                         if let Some((
9672                                                                             pattern23_0,
9673                                                                             pattern23_1,
9674                                                                         )) = C::multi_lane(
9675                                                                             ctx,
9676                                                                             pattern22_0,
9677                                                                         ) {
9678                                                                             if pattern23_0 == 8 {
9679                                                                                 if pattern23_1 == 16
9680                                                                                 {
9681                                                                                     // Rule at src/isa/x64/lower.isle line 1116.
9682                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
9683                                                                                     let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
9684                                                                                     let expr2_0: u8 = 8;
9685                                                                                     let expr3_0 = OperandSize::Size32;
9686                                                                                     let expr4_0 = constructor_x64_palignr(ctx, expr0_0, &expr1_0, expr2_0, &expr3_0)?;
9687                                                                                     let expr5_0 = C::xmm_to_xmm_mem(ctx, expr4_0);
9688                                                                                     let expr6_0 = constructor_x64_pmovzxbw(ctx, &expr5_0)?;
9689                                                                                     let expr7_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
9690                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
9691                                                                                     let expr9_0: u8 = 8;
9692                                                                                     let expr10_0 = OperandSize::Size32;
9693                                                                                     let expr11_0 = constructor_x64_palignr(ctx, expr7_0, &expr8_0, expr9_0, &expr10_0)?;
9694                                                                                     let expr12_0 = C::xmm_to_xmm_mem(ctx, expr11_0);
9695                                                                                     let expr13_0 = constructor_x64_pmovzxbw(ctx, &expr12_0)?;
9696                                                                                     let expr14_0 = C::xmm_to_xmm_mem(ctx, expr13_0);
9697                                                                                     let expr15_0 = constructor_x64_pmullw(ctx, expr6_0, &expr14_0)?;
9698                                                                                     let expr16_0 = constructor_output_xmm(ctx, expr15_0)?;
9699                                                                                     return Some(
9700                                                                                         expr16_0,
9701                                                                                     );
9702                                                                                 }
9703                                                                             }
9704                                                                         }
9705                                                                     }
9706                                                                 }
9707                                                             }
9708                                                         }
9709                                                     }
9710                                                 }
9711                                             }
9712                                             _ => {}
9713                                         }
9714                                     }
9715                                 }
9716                                 // Rule at src/isa/x64/lower.isle line 984.
9717                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
9718                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
9719                                 let expr2_0 = constructor_x64_pmullw(ctx, expr0_0, &expr1_0)?;
9720                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
9721                                 return Some(expr3_0);
9722                             }
9723                             _ => {}
9724                         }
9725                     }
9726                 }
9727             }
9728             if pattern3_0 == 32 {
9729                 if pattern3_1 == 4 {
9730                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
9731                     if let &InstructionData::Binary {
9732                         opcode: ref pattern7_0,
9733                         args: ref pattern7_1,
9734                     } = &pattern6_0
9735                     {
9736                         match pattern7_0 {
9737                             &Opcode::Iadd => {
9738                                 let (pattern9_0, pattern9_1) =
9739                                     C::unpack_value_array_2(ctx, pattern7_1);
9740                                 // Rule at src/isa/x64/lower.isle line 102.
9741                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
9742                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
9743                                 let expr2_0 = constructor_x64_paddd(ctx, expr0_0, &expr1_0)?;
9744                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
9745                                 return Some(expr3_0);
9746                             }
9747                             &Opcode::Isub => {
9748                                 let (pattern9_0, pattern9_1) =
9749                                     C::unpack_value_array_2(ctx, pattern7_1);
9750                                 // Rule at src/isa/x64/lower.isle line 248.
9751                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
9752                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
9753                                 let expr2_0 = constructor_x64_psubd(ctx, expr0_0, &expr1_0)?;
9754                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
9755                                 return Some(expr3_0);
9756                             }
9757                             &Opcode::Imul => {
9758                                 let (pattern9_0, pattern9_1) =
9759                                     C::unpack_value_array_2(ctx, pattern7_1);
9760                                 if let Some(pattern10_0) = C::def_inst(ctx, pattern9_0) {
9761                                     let pattern11_0 = C::inst_data(ctx, pattern10_0);
9762                                     if let &InstructionData::Unary {
9763                                         opcode: ref pattern12_0,
9764                                         arg: pattern12_1,
9765                                     } = &pattern11_0
9766                                     {
9767                                         match pattern12_0 {
9768                                             &Opcode::SwidenLow => {
9769                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
9770                                                 if let Some((pattern15_0, pattern15_1)) =
9771                                                     C::multi_lane(ctx, pattern14_0)
9772                                                 {
9773                                                     if pattern15_0 == 16 {
9774                                                         if pattern15_1 == 8 {
9775                                                             if let Some(pattern18_0) =
9776                                                                 C::def_inst(ctx, pattern9_1)
9777                                                             {
9778                                                                 let pattern19_0 =
9779                                                                     C::inst_data(ctx, pattern18_0);
9780                                                                 if let &InstructionData::Unary {
9781                                                                     opcode: ref pattern20_0,
9782                                                                     arg: pattern20_1,
9783                                                                 } = &pattern19_0
9784                                                                 {
9785                                                                     if let &Opcode::SwidenLow =
9786                                                                         pattern20_0
9787                                                                     {
9788                                                                         let pattern22_0 =
9789                                                                             C::value_type(
9790                                                                                 ctx,
9791                                                                                 pattern20_1,
9792                                                                             );
9793                                                                         if let Some((
9794                                                                             pattern23_0,
9795                                                                             pattern23_1,
9796                                                                         )) = C::multi_lane(
9797                                                                             ctx,
9798                                                                             pattern22_0,
9799                                                                         ) {
9800                                                                             if pattern23_0 == 16 {
9801                                                                                 if pattern23_1 == 8
9802                                                                                 {
9803                                                                                     // Rule at src/isa/x64/lower.isle line 1090.
9804                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
9805                                                                                     let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
9806                                                                                     let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
9807                                                                                     let expr3_0 = constructor_x64_pmullw(ctx, expr0_0, &expr2_0)?;
9808                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
9809                                                                                     let expr5_0 = constructor_x64_pmulhw(ctx, expr0_0, &expr4_0)?;
9810                                                                                     let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
9811                                                                                     let expr7_0 = constructor_x64_punpcklwd(ctx, expr3_0, &expr6_0)?;
9812                                                                                     let expr8_0 = constructor_output_xmm(ctx, expr7_0)?;
9813                                                                                     return Some(
9814                                                                                         expr8_0,
9815                                                                                     );
9816                                                                                 }
9817                                                                             }
9818                                                                         }
9819                                                                     }
9820                                                                 }
9821                                                             }
9822                                                         }
9823                                                     }
9824                                                 }
9825                                             }
9826                                             &Opcode::SwidenHigh => {
9827                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
9828                                                 if let Some((pattern15_0, pattern15_1)) =
9829                                                     C::multi_lane(ctx, pattern14_0)
9830                                                 {
9831                                                     if pattern15_0 == 16 {
9832                                                         if pattern15_1 == 8 {
9833                                                             if let Some(pattern18_0) =
9834                                                                 C::def_inst(ctx, pattern9_1)
9835                                                             {
9836                                                                 let pattern19_0 =
9837                                                                     C::inst_data(ctx, pattern18_0);
9838                                                                 if let &InstructionData::Unary {
9839                                                                     opcode: ref pattern20_0,
9840                                                                     arg: pattern20_1,
9841                                                                 } = &pattern19_0
9842                                                                 {
9843                                                                     if let &Opcode::SwidenHigh =
9844                                                                         pattern20_0
9845                                                                     {
9846                                                                         let pattern22_0 =
9847                                                                             C::value_type(
9848                                                                                 ctx,
9849                                                                                 pattern20_1,
9850                                                                             );
9851                                                                         if let Some((
9852                                                                             pattern23_0,
9853                                                                             pattern23_1,
9854                                                                         )) = C::multi_lane(
9855                                                                             ctx,
9856                                                                             pattern22_0,
9857                                                                         ) {
9858                                                                             if pattern23_0 == 16 {
9859                                                                                 if pattern23_1 == 8
9860                                                                                 {
9861                                                                                     // Rule at src/isa/x64/lower.isle line 1054.
9862                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
9863                                                                                     let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
9864                                                                                     let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
9865                                                                                     let expr3_0 = constructor_x64_pmullw(ctx, expr0_0, &expr2_0)?;
9866                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
9867                                                                                     let expr5_0 = constructor_x64_pmulhw(ctx, expr0_0, &expr4_0)?;
9868                                                                                     let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
9869                                                                                     let expr7_0 = constructor_x64_punpckhwd(ctx, expr3_0, &expr6_0)?;
9870                                                                                     let expr8_0 = constructor_output_xmm(ctx, expr7_0)?;
9871                                                                                     return Some(
9872                                                                                         expr8_0,
9873                                                                                     );
9874                                                                                 }
9875                                                                             }
9876                                                                         }
9877                                                                     }
9878                                                                 }
9879                                                             }
9880                                                         }
9881                                                     }
9882                                                 }
9883                                             }
9884                                             &Opcode::UwidenLow => {
9885                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
9886                                                 if let Some((pattern15_0, pattern15_1)) =
9887                                                     C::multi_lane(ctx, pattern14_0)
9888                                                 {
9889                                                     if pattern15_0 == 16 {
9890                                                         if pattern15_1 == 8 {
9891                                                             if let Some(pattern18_0) =
9892                                                                 C::def_inst(ctx, pattern9_1)
9893                                                             {
9894                                                                 let pattern19_0 =
9895                                                                     C::inst_data(ctx, pattern18_0);
9896                                                                 if let &InstructionData::Unary {
9897                                                                     opcode: ref pattern20_0,
9898                                                                     arg: pattern20_1,
9899                                                                 } = &pattern19_0
9900                                                                 {
9901                                                                     if let &Opcode::UwidenLow =
9902                                                                         pattern20_0
9903                                                                     {
9904                                                                         let pattern22_0 =
9905                                                                             C::value_type(
9906                                                                                 ctx,
9907                                                                                 pattern20_1,
9908                                                                             );
9909                                                                         if let Some((
9910                                                                             pattern23_0,
9911                                                                             pattern23_1,
9912                                                                         )) = C::multi_lane(
9913                                                                             ctx,
9914                                                                             pattern22_0,
9915                                                                         ) {
9916                                                                             if pattern23_0 == 16 {
9917                                                                                 if pattern23_1 == 8
9918                                                                                 {
9919                                                                                     // Rule at src/isa/x64/lower.isle line 1166.
9920                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
9921                                                                                     let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
9922                                                                                     let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
9923                                                                                     let expr3_0 = constructor_x64_pmullw(ctx, expr0_0, &expr2_0)?;
9924                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
9925                                                                                     let expr5_0 = constructor_x64_pmulhuw(ctx, expr0_0, &expr4_0)?;
9926                                                                                     let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
9927                                                                                     let expr7_0 = constructor_x64_punpcklwd(ctx, expr3_0, &expr6_0)?;
9928                                                                                     let expr8_0 = constructor_output_xmm(ctx, expr7_0)?;
9929                                                                                     return Some(
9930                                                                                         expr8_0,
9931                                                                                     );
9932                                                                                 }
9933                                                                             }
9934                                                                         }
9935                                                                     }
9936                                                                 }
9937                                                             }
9938                                                         }
9939                                                     }
9940                                                 }
9941                                             }
9942                                             &Opcode::UwidenHigh => {
9943                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
9944                                                 if let Some((pattern15_0, pattern15_1)) =
9945                                                     C::multi_lane(ctx, pattern14_0)
9946                                                 {
9947                                                     if pattern15_0 == 16 {
9948                                                         if pattern15_1 == 8 {
9949                                                             if let Some(pattern18_0) =
9950                                                                 C::def_inst(ctx, pattern9_1)
9951                                                             {
9952                                                                 let pattern19_0 =
9953                                                                     C::inst_data(ctx, pattern18_0);
9954                                                                 if let &InstructionData::Unary {
9955                                                                     opcode: ref pattern20_0,
9956                                                                     arg: pattern20_1,
9957                                                                 } = &pattern19_0
9958                                                                 {
9959                                                                     if let &Opcode::UwidenHigh =
9960                                                                         pattern20_0
9961                                                                     {
9962                                                                         let pattern22_0 =
9963                                                                             C::value_type(
9964                                                                                 ctx,
9965                                                                                 pattern20_1,
9966                                                                             );
9967                                                                         if let Some((
9968                                                                             pattern23_0,
9969                                                                             pattern23_1,
9970                                                                         )) = C::multi_lane(
9971                                                                             ctx,
9972                                                                             pattern22_0,
9973                                                                         ) {
9974                                                                             if pattern23_0 == 16 {
9975                                                                                 if pattern23_1 == 8
9976                                                                                 {
9977                                                                                     // Rule at src/isa/x64/lower.isle line 1130.
9978                                                                                     let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?;
9979                                                                                     let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?;
9980                                                                                     let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
9981                                                                                     let expr3_0 = constructor_x64_pmullw(ctx, expr0_0, &expr2_0)?;
9982                                                                                     let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
9983                                                                                     let expr5_0 = constructor_x64_pmulhuw(ctx, expr0_0, &expr4_0)?;
9984                                                                                     let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0);
9985                                                                                     let expr7_0 = constructor_x64_punpckhwd(ctx, expr3_0, &expr6_0)?;
9986                                                                                     let expr8_0 = constructor_output_xmm(ctx, expr7_0)?;
9987                                                                                     return Some(
9988                                                                                         expr8_0,
9989                                                                                     );
9990                                                                                 }
9991                                                                             }
9992                                                                         }
9993                                                                     }
9994                                                                 }
9995                                                             }
9996                                                         }
9997                                                     }
9998                                                 }
9999                                             }
10000                                             _ => {}
10001                                         }
10002                                     }
10003                                 }
10004                                 // Rule at src/isa/x64/lower.isle line 987.
10005                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
10006                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
10007                                 let expr2_0 = constructor_x64_pmulld(ctx, expr0_0, &expr1_0)?;
10008                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
10009                                 return Some(expr3_0);
10010                             }
10011                             _ => {}
10012                         }
10013                     }
10014                 }
10015             }
10016             if pattern3_0 == 64 {
10017                 if pattern3_1 == 2 {
10018                     let pattern6_0 = C::inst_data(ctx, pattern0_0);
10019                     if let &InstructionData::Binary {
10020                         opcode: ref pattern7_0,
10021                         args: ref pattern7_1,
10022                     } = &pattern6_0
10023                     {
10024                         match pattern7_0 {
10025                             &Opcode::Iadd => {
10026                                 let (pattern9_0, pattern9_1) =
10027                                     C::unpack_value_array_2(ctx, pattern7_1);
10028                                 // Rule at src/isa/x64/lower.isle line 106.
10029                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
10030                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
10031                                 let expr2_0 = constructor_x64_paddq(ctx, expr0_0, &expr1_0)?;
10032                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
10033                                 return Some(expr3_0);
10034                             }
10035                             &Opcode::Isub => {
10036                                 let (pattern9_0, pattern9_1) =
10037                                     C::unpack_value_array_2(ctx, pattern7_1);
10038                                 // Rule at src/isa/x64/lower.isle line 252.
10039                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
10040                                 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?;
10041                                 let expr2_0 = constructor_x64_psubq(ctx, expr0_0, &expr1_0)?;
10042                                 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
10043                                 return Some(expr3_0);
10044                             }
10045                             &Opcode::Imul => {
10046                                 let (pattern9_0, pattern9_1) =
10047                                     C::unpack_value_array_2(ctx, pattern7_1);
10048                                 if let Some(pattern10_0) = C::def_inst(ctx, pattern9_0) {
10049                                     let pattern11_0 = C::inst_data(ctx, pattern10_0);
10050                                     if let &InstructionData::Unary {
10051                                         opcode: ref pattern12_0,
10052                                         arg: pattern12_1,
10053                                     } = &pattern11_0
10054                                     {
10055                                         match pattern12_0 {
10056                                             &Opcode::SwidenLow => {
10057                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
10058                                                 if let Some((pattern15_0, pattern15_1)) =
10059                                                     C::multi_lane(ctx, pattern14_0)
10060                                                 {
10061                                                     if pattern15_0 == 32 {
10062                                                         if pattern15_1 == 4 {
10063                                                             if let Some(pattern18_0) =
10064                                                                 C::def_inst(ctx, pattern9_1)
10065                                                             {
10066                                                                 let pattern19_0 =
10067                                                                     C::inst_data(ctx, pattern18_0);
10068                                                                 if let &InstructionData::Unary {
10069                                                                     opcode: ref pattern20_0,
10070                                                                     arg: pattern20_1,
10071                                                                 } = &pattern19_0
10072                                                                 {
10073                                                                     if let &Opcode::SwidenLow =
10074                                                                         pattern20_0
10075                                                                     {
10076                                                                         let pattern22_0 =
10077                                                                             C::value_type(
10078                                                                                 ctx,
10079                                                                                 pattern20_1,
10080                                                                             );
10081                                                                         if let Some((
10082                                                                             pattern23_0,
10083                                                                             pattern23_1,
10084                                                                         )) = C::multi_lane(
10085                                                                             ctx,
10086                                                                             pattern22_0,
10087                                                                         ) {
10088                                                                             if pattern23_0 == 32 {
10089                                                                                 if pattern23_1 == 4
10090                                                                                 {
10091                                                                                     // Rule at src/isa/x64/lower.isle line 1102.
10092                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
10093                                                                                     let expr1_0: u8 = 80;
10094                                                                                     let expr2_0 = OperandSize::Size32;
10095                                                                                     let expr3_0 = constructor_x64_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?;
10096                                                                                     let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
10097                                                                                     let expr5_0: u8 = 80;
10098                                                                                     let expr6_0 = OperandSize::Size32;
10099                                                                                     let expr7_0 = constructor_x64_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?;
10100                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
10101                                                                                     let expr9_0 = constructor_x64_pmuldq(ctx, expr3_0, &expr8_0)?;
10102                                                                                     let expr10_0 = constructor_output_xmm(ctx, expr9_0)?;
10103                                                                                     return Some(
10104                                                                                         expr10_0,
10105                                                                                     );
10106                                                                                 }
10107                                                                             }
10108                                                                         }
10109                                                                     }
10110                                                                 }
10111                                                             }
10112                                                         }
10113                                                     }
10114                                                 }
10115                                             }
10116                                             &Opcode::SwidenHigh => {
10117                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
10118                                                 if let Some((pattern15_0, pattern15_1)) =
10119                                                     C::multi_lane(ctx, pattern14_0)
10120                                                 {
10121                                                     if pattern15_0 == 32 {
10122                                                         if pattern15_1 == 4 {
10123                                                             if let Some(pattern18_0) =
10124                                                                 C::def_inst(ctx, pattern9_1)
10125                                                             {
10126                                                                 let pattern19_0 =
10127                                                                     C::inst_data(ctx, pattern18_0);
10128                                                                 if let &InstructionData::Unary {
10129                                                                     opcode: ref pattern20_0,
10130                                                                     arg: pattern20_1,
10131                                                                 } = &pattern19_0
10132                                                                 {
10133                                                                     if let &Opcode::SwidenHigh =
10134                                                                         pattern20_0
10135                                                                     {
10136                                                                         let pattern22_0 =
10137                                                                             C::value_type(
10138                                                                                 ctx,
10139                                                                                 pattern20_1,
10140                                                                             );
10141                                                                         if let Some((
10142                                                                             pattern23_0,
10143                                                                             pattern23_1,
10144                                                                         )) = C::multi_lane(
10145                                                                             ctx,
10146                                                                             pattern22_0,
10147                                                                         ) {
10148                                                                             if pattern23_0 == 32 {
10149                                                                                 if pattern23_1 == 4
10150                                                                                 {
10151                                                                                     // Rule at src/isa/x64/lower.isle line 1066.
10152                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
10153                                                                                     let expr1_0: u8 = 250;
10154                                                                                     let expr2_0 = OperandSize::Size32;
10155                                                                                     let expr3_0 = constructor_x64_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?;
10156                                                                                     let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
10157                                                                                     let expr5_0: u8 = 250;
10158                                                                                     let expr6_0 = OperandSize::Size32;
10159                                                                                     let expr7_0 = constructor_x64_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?;
10160                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
10161                                                                                     let expr9_0 = constructor_x64_pmuldq(ctx, expr3_0, &expr8_0)?;
10162                                                                                     let expr10_0 = constructor_output_xmm(ctx, expr9_0)?;
10163                                                                                     return Some(
10164                                                                                         expr10_0,
10165                                                                                     );
10166                                                                                 }
10167                                                                             }
10168                                                                         }
10169                                                                     }
10170                                                                 }
10171                                                             }
10172                                                         }
10173                                                     }
10174                                                 }
10175                                             }
10176                                             &Opcode::UwidenLow => {
10177                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
10178                                                 if let Some((pattern15_0, pattern15_1)) =
10179                                                     C::multi_lane(ctx, pattern14_0)
10180                                                 {
10181                                                     if pattern15_0 == 32 {
10182                                                         if pattern15_1 == 4 {
10183                                                             if let Some(pattern18_0) =
10184                                                                 C::def_inst(ctx, pattern9_1)
10185                                                             {
10186                                                                 let pattern19_0 =
10187                                                                     C::inst_data(ctx, pattern18_0);
10188                                                                 if let &InstructionData::Unary {
10189                                                                     opcode: ref pattern20_0,
10190                                                                     arg: pattern20_1,
10191                                                                 } = &pattern19_0
10192                                                                 {
10193                                                                     if let &Opcode::UwidenLow =
10194                                                                         pattern20_0
10195                                                                     {
10196                                                                         let pattern22_0 =
10197                                                                             C::value_type(
10198                                                                                 ctx,
10199                                                                                 pattern20_1,
10200                                                                             );
10201                                                                         if let Some((
10202                                                                             pattern23_0,
10203                                                                             pattern23_1,
10204                                                                         )) = C::multi_lane(
10205                                                                             ctx,
10206                                                                             pattern22_0,
10207                                                                         ) {
10208                                                                             if pattern23_0 == 32 {
10209                                                                                 if pattern23_1 == 4
10210                                                                                 {
10211                                                                                     // Rule at src/isa/x64/lower.isle line 1178.
10212                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
10213                                                                                     let expr1_0: u8 = 80;
10214                                                                                     let expr2_0 = OperandSize::Size32;
10215                                                                                     let expr3_0 = constructor_x64_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?;
10216                                                                                     let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
10217                                                                                     let expr5_0: u8 = 80;
10218                                                                                     let expr6_0 = OperandSize::Size32;
10219                                                                                     let expr7_0 = constructor_x64_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?;
10220                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
10221                                                                                     let expr9_0 = constructor_x64_pmuludq(ctx, expr3_0, &expr8_0)?;
10222                                                                                     let expr10_0 = constructor_output_xmm(ctx, expr9_0)?;
10223                                                                                     return Some(
10224                                                                                         expr10_0,
10225                                                                                     );
10226                                                                                 }
10227                                                                             }
10228                                                                         }
10229                                                                     }
10230                                                                 }
10231                                                             }
10232                                                         }
10233                                                     }
10234                                                 }
10235                                             }
10236                                             &Opcode::UwidenHigh => {
10237                                                 let pattern14_0 = C::value_type(ctx, pattern12_1);
10238                                                 if let Some((pattern15_0, pattern15_1)) =
10239                                                     C::multi_lane(ctx, pattern14_0)
10240                                                 {
10241                                                     if pattern15_0 == 32 {
10242                                                         if pattern15_1 == 4 {
10243                                                             if let Some(pattern18_0) =
10244                                                                 C::def_inst(ctx, pattern9_1)
10245                                                             {
10246                                                                 let pattern19_0 =
10247                                                                     C::inst_data(ctx, pattern18_0);
10248                                                                 if let &InstructionData::Unary {
10249                                                                     opcode: ref pattern20_0,
10250                                                                     arg: pattern20_1,
10251                                                                 } = &pattern19_0
10252                                                                 {
10253                                                                     if let &Opcode::UwidenHigh =
10254                                                                         pattern20_0
10255                                                                     {
10256                                                                         let pattern22_0 =
10257                                                                             C::value_type(
10258                                                                                 ctx,
10259                                                                                 pattern20_1,
10260                                                                             );
10261                                                                         if let Some((
10262                                                                             pattern23_0,
10263                                                                             pattern23_1,
10264                                                                         )) = C::multi_lane(
10265                                                                             ctx,
10266                                                                             pattern22_0,
10267                                                                         ) {
10268                                                                             if pattern23_0 == 32 {
10269                                                                                 if pattern23_1 == 4
10270                                                                                 {
10271                                                                                     // Rule at src/isa/x64/lower.isle line 1142.
10272                                                                                     let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?;
10273                                                                                     let expr1_0: u8 = 250;
10274                                                                                     let expr2_0 = OperandSize::Size32;
10275                                                                                     let expr3_0 = constructor_x64_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?;
10276                                                                                     let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?;
10277                                                                                     let expr5_0: u8 = 250;
10278                                                                                     let expr6_0 = OperandSize::Size32;
10279                                                                                     let expr7_0 = constructor_x64_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?;
10280                                                                                     let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0);
10281                                                                                     let expr9_0 = constructor_x64_pmuludq(ctx, expr3_0, &expr8_0)?;
10282                                                                                     let expr10_0 = constructor_output_xmm(ctx, expr9_0)?;
10283                                                                                     return Some(
10284                                                                                         expr10_0,
10285                                                                                     );
10286                                                                                 }
10287                                                                             }
10288                                                                         }
10289                                                                     }
10290                                                                 }
10291                                                             }
10292                                                         }
10293                                                     }
10294                                                 }
10295                                             }
10296                                             _ => {}
10297                                         }
10298                                     }
10299                                 }
10300                                 // Rule at src/isa/x64/lower.isle line 1018.
10301                                 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?;
10302                                 let expr1_0 = constructor_put_in_xmm(ctx, pattern9_1)?;
10303                                 let expr2_0: u32 = 32;
10304                                 let expr3_0 = RegMemImm::Imm { simm32: expr2_0 };
10305                                 let expr4_0 = constructor_mov_rmi_to_xmm(ctx, &expr3_0)?;
10306                                 let expr5_0 = constructor_x64_psrlq(ctx, expr0_0, &expr4_0)?;
10307                                 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
10308                                 let expr7_0 = constructor_x64_pmuludq(ctx, expr5_0, &expr6_0)?;
10309                                 let expr8_0: u32 = 32;
10310                                 let expr9_0 = RegMemImm::Imm { simm32: expr8_0 };
10311                                 let expr10_0 = constructor_mov_rmi_to_xmm(ctx, &expr9_0)?;
10312                                 let expr11_0 = constructor_x64_psrlq(ctx, expr1_0, &expr10_0)?;
10313                                 let expr12_0 = C::xmm_to_xmm_mem(ctx, expr11_0);
10314                                 let expr13_0 = constructor_x64_pmuludq(ctx, expr0_0, &expr12_0)?;
10315                                 let expr14_0 = C::xmm_to_xmm_mem(ctx, expr13_0);
10316                                 let expr15_0 = constructor_x64_paddq(ctx, expr7_0, &expr14_0)?;
10317                                 let expr16_0: u32 = 32;
10318                                 let expr17_0 = RegMemImm::Imm { simm32: expr16_0 };
10319                                 let expr18_0 = constructor_mov_rmi_to_xmm(ctx, &expr17_0)?;
10320                                 let expr19_0 = constructor_x64_psllq(ctx, expr15_0, &expr18_0)?;
10321                                 let expr20_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
10322                                 let expr21_0 = constructor_x64_pmuludq(ctx, expr0_0, &expr20_0)?;
10323                                 let expr22_0 = C::xmm_to_xmm_mem(ctx, expr19_0);
10324                                 let expr23_0 = constructor_x64_paddq(ctx, expr21_0, &expr22_0)?;
10325                                 let expr24_0 = constructor_output_xmm(ctx, expr23_0)?;
10326                                 return Some(expr24_0);
10327                             }
10328                             _ => {}
10329                         }
10330                     }
10331                 }
10332             }
10333             let pattern4_0 = C::inst_data(ctx, pattern0_0);
10334             match &pattern4_0 {
10335                 &InstructionData::Binary {
10336                     opcode: ref pattern5_0,
10337                     args: ref pattern5_1,
10338                 } => {
10339                     match pattern5_0 {
10340                         &Opcode::Band => {
10341                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
10342                             // Rule at src/isa/x64/lower.isle line 328.
10343                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
10344                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
10345                             let expr2_0 = constructor_sse_and(ctx, pattern2_0, expr0_0, &expr1_0)?;
10346                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
10347                             return Some(expr3_0);
10348                         }
10349                         &Opcode::Bor => {
10350                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
10351                             // Rule at src/isa/x64/lower.isle line 392.
10352                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
10353                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
10354                             let expr2_0 = constructor_sse_or(ctx, pattern2_0, expr0_0, &expr1_0)?;
10355                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
10356                             return Some(expr3_0);
10357                         }
10358                         &Opcode::Bxor => {
10359                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
10360                             // Rule at src/isa/x64/lower.isle line 453.
10361                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
10362                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
10363                             let expr2_0 = constructor_sse_xor(ctx, pattern2_0, expr0_0, &expr1_0)?;
10364                             let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
10365                             return Some(expr3_0);
10366                         }
10367                         _ => {}
10368                     }
10369                 }
10370                 &InstructionData::Ternary {
10371                     opcode: ref pattern5_0,
10372                     args: ref pattern5_1,
10373                 } => {
10374                     match pattern5_0 {
10375                         &Opcode::Bitselect => {
10376                             let (pattern7_0, pattern7_1, pattern7_2) =
10377                                 C::unpack_value_array_3(ctx, pattern5_1);
10378                             // Rule at src/isa/x64/lower.isle line 1279.
10379                             let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?;
10380                             let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?;
10381                             let expr2_0 = C::xmm_to_xmm_mem(ctx, expr0_0);
10382                             let expr3_0 = constructor_sse_and(ctx, pattern2_0, expr1_0, &expr2_0)?;
10383                             let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern7_2)?;
10384                             let expr5_0 =
10385                                 constructor_sse_and_not(ctx, pattern2_0, expr0_0, &expr4_0)?;
10386                             let expr6_0 = C::xmm_to_xmm_mem(ctx, expr3_0);
10387                             let expr7_0 = constructor_sse_or(ctx, pattern2_0, expr5_0, &expr6_0)?;
10388                             let expr8_0 = constructor_output_xmm(ctx, expr7_0)?;
10389                             return Some(expr8_0);
10390                         }
10391                         &Opcode::Vselect => {
10392                             let (pattern7_0, pattern7_1, pattern7_2) =
10393                                 C::unpack_value_array_3(ctx, pattern5_1);
10394                             // Rule at src/isa/x64/lower.isle line 1293.
10395                             let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern7_0)?;
10396                             let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?;
10397                             let expr2_0 = constructor_put_in_xmm(ctx, pattern7_2)?;
10398                             let expr3_0 = constructor_x64_blend(
10399                                 ctx, pattern2_0, &expr0_0, &expr1_0, expr2_0,
10400                             )?;
10401                             let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
10402                             return Some(expr4_0);
10403                         }
10404                         _ => {}
10405                     }
10406                 }
10407                 &InstructionData::Unary {
10408                     opcode: ref pattern5_0,
10409                     arg: pattern5_1,
10410                 } => {
10411                     if let &Opcode::Bnot = pattern5_0 {
10412                         // Rule at src/isa/x64/lower.isle line 1274.
10413                         let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?;
10414                         let expr1_0 = constructor_vector_all_ones(ctx, pattern2_0)?;
10415                         let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
10416                         let expr3_0 = constructor_sse_xor(ctx, pattern2_0, expr0_0, &expr2_0)?;
10417                         let expr4_0 = constructor_output_xmm(ctx, expr3_0)?;
10418                         return Some(expr4_0);
10419                     }
10420                 }
10421                 _ => {}
10422             }
10423         }
10424         if let Some(pattern3_0) = C::fits_in_32(ctx, pattern2_0) {
10425             let pattern4_0 = C::inst_data(ctx, pattern0_0);
10426             if let &InstructionData::Unary {
10427                 opcode: ref pattern5_0,
10428                 arg: pattern5_1,
10429             } = &pattern4_0
10430             {
10431                 if let &Opcode::Uextend = pattern5_0 {
10432                     let pattern7_0 = C::value_type(ctx, pattern5_1);
10433                     if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) {
10434                         // Rule at src/isa/x64/lower.isle line 2130.
10435                         let expr0_0: Type = I32;
10436                         let expr1_0 = ExtendKind::Zero;
10437                         let expr2_0 =
10438                             constructor_extend_to_gpr(ctx, pattern5_1, expr0_0, &expr1_0)?;
10439                         let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
10440                         return Some(expr3_0);
10441                     }
10442                 }
10443             }
10444             if let Some(pattern4_0) = C::is_gpr_type(ctx, pattern2_0) {
10445                 let pattern5_0 = C::inst_data(ctx, pattern0_0);
10446                 if let &InstructionData::Load {
10447                     opcode: ref pattern6_0,
10448                     arg: pattern6_1,
10449                     flags: pattern6_2,
10450                     offset: pattern6_3,
10451                 } = &pattern5_0
10452                 {
10453                     if let &Opcode::Load = pattern6_0 {
10454                         // Rule at src/isa/x64/lower.isle line 2520.
10455                         let expr0_0 = C::ty_bits_u16(ctx, pattern3_0);
10456                         let expr1_0: u16 = 64;
10457                         let expr2_0 = C::ext_mode(ctx, expr0_0, expr1_0);
10458                         let expr3_0 =
10459                             constructor_to_amode(ctx, pattern6_2, pattern6_1, pattern6_3)?;
10460                         let expr4_0 = constructor_amode_to_gpr_mem(ctx, &expr3_0)?;
10461                         let expr5_0 = constructor_x64_movzx(ctx, &expr2_0, &expr4_0)?;
10462                         let expr6_0 = constructor_output_gpr(ctx, expr5_0)?;
10463                         return Some(expr6_0);
10464                     }
10465                 }
10466             }
10467         }
10468         if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) {
10469             let pattern4_0 = C::inst_data(ctx, pattern0_0);
10470             match &pattern4_0 {
10471                 &InstructionData::UnaryImm {
10472                     opcode: ref pattern5_0,
10473                     imm: pattern5_1,
10474                 } => {
10475                     if let &Opcode::Iconst = pattern5_0 {
10476                         let pattern7_0 = C::u64_from_imm64(ctx, pattern5_1);
10477                         // Rule at src/isa/x64/lower.isle line 10.
10478                         let expr0_0 = constructor_imm(ctx, pattern3_0, pattern7_0)?;
10479                         let expr1_0 = constructor_output_reg(ctx, expr0_0)?;
10480                         return Some(expr1_0);
10481                     }
10482                 }
10483                 &InstructionData::UnaryBool {
10484                     opcode: ref pattern5_0,
10485                     imm: pattern5_1,
10486                 } => {
10487                     if let &Opcode::Bconst = pattern5_0 {
10488                         if pattern5_1 == true {
10489                             // Rule at src/isa/x64/lower.isle line 28.
10490                             let expr0_0: u64 = 1;
10491                             let expr1_0 = constructor_imm(ctx, pattern3_0, expr0_0)?;
10492                             let expr2_0 = constructor_output_reg(ctx, expr1_0)?;
10493                             return Some(expr2_0);
10494                         }
10495                         if pattern5_1 == false {
10496                             // Rule at src/isa/x64/lower.isle line 24.
10497                             let expr0_0: u64 = 0;
10498                             let expr1_0 = constructor_imm(ctx, pattern3_0, expr0_0)?;
10499                             let expr2_0 = constructor_output_reg(ctx, expr1_0)?;
10500                             return Some(expr2_0);
10501                         }
10502                     }
10503                 }
10504                 &InstructionData::Binary {
10505                     opcode: ref pattern5_0,
10506                     args: ref pattern5_1,
10507                 } => {
10508                     match pattern5_0 {
10509                         &Opcode::Imin => {
10510                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
10511                             // Rule at src/isa/x64/lower.isle line 1386.
10512                             let expr0_0 = CC::L;
10513                             let expr1_0 = constructor_cmp_and_choose(
10514                                 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1,
10515                             )?;
10516                             let expr2_0 = C::output(ctx, expr1_0);
10517                             return Some(expr2_0);
10518                         }
10519                         &Opcode::Umin => {
10520                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
10521                             // Rule at src/isa/x64/lower.isle line 1380.
10522                             let expr0_0 = CC::B;
10523                             let expr1_0 = constructor_cmp_and_choose(
10524                                 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1,
10525                             )?;
10526                             let expr2_0 = C::output(ctx, expr1_0);
10527                             return Some(expr2_0);
10528                         }
10529                         &Opcode::Imax => {
10530                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
10531                             // Rule at src/isa/x64/lower.isle line 1389.
10532                             let expr0_0 = CC::NL;
10533                             let expr1_0 = constructor_cmp_and_choose(
10534                                 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1,
10535                             )?;
10536                             let expr2_0 = C::output(ctx, expr1_0);
10537                             return Some(expr2_0);
10538                         }
10539                         &Opcode::Umax => {
10540                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
10541                             // Rule at src/isa/x64/lower.isle line 1383.
10542                             let expr0_0 = CC::NB;
10543                             let expr1_0 = constructor_cmp_and_choose(
10544                                 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1,
10545                             )?;
10546                             let expr2_0 = C::output(ctx, expr1_0);
10547                             return Some(expr2_0);
10548                         }
10549                         &Opcode::Iadd => {
10550                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
10551                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
10552                                 // Rule at src/isa/x64/lower.isle line 74.
10553                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
10554                                 let expr1_0 =
10555                                     constructor_x64_add(ctx, pattern3_0, expr0_0, &pattern8_0)?;
10556                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
10557                                 return Some(expr2_0);
10558                             }
10559                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
10560                                 // Rule at src/isa/x64/lower.isle line 86.
10561                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
10562                                 let expr1_0 =
10563                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
10564                                 let expr2_0 =
10565                                     constructor_x64_add(ctx, pattern3_0, expr0_0, &expr1_0)?;
10566                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
10567                                 return Some(expr3_0);
10568                             }
10569                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
10570                                 // Rule at src/isa/x64/lower.isle line 70.
10571                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10572                                 let expr1_0 =
10573                                     constructor_x64_add(ctx, pattern3_0, expr0_0, &pattern8_0)?;
10574                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
10575                                 return Some(expr2_0);
10576                             }
10577                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
10578                                 // Rule at src/isa/x64/lower.isle line 80.
10579                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10580                                 let expr1_0 =
10581                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
10582                                 let expr2_0 =
10583                                     constructor_x64_add(ctx, pattern3_0, expr0_0, &expr1_0)?;
10584                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
10585                                 return Some(expr3_0);
10586                             }
10587                             // Rule at src/isa/x64/lower.isle line 64.
10588                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10589                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
10590                             let expr2_0 = constructor_x64_add(ctx, pattern3_0, expr0_0, &expr1_0)?;
10591                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
10592                             return Some(expr3_0);
10593                         }
10594                         &Opcode::Isub => {
10595                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
10596                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
10597                                 // Rule at src/isa/x64/lower.isle line 228.
10598                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10599                                 let expr1_0 =
10600                                     constructor_x64_sub(ctx, pattern3_0, expr0_0, &pattern8_0)?;
10601                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
10602                                 return Some(expr2_0);
10603                             }
10604                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
10605                                 // Rule at src/isa/x64/lower.isle line 233.
10606                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10607                                 let expr1_0 =
10608                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
10609                                 let expr2_0 =
10610                                     constructor_x64_sub(ctx, pattern3_0, expr0_0, &expr1_0)?;
10611                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
10612                                 return Some(expr3_0);
10613                             }
10614                             // Rule at src/isa/x64/lower.isle line 223.
10615                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10616                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
10617                             let expr2_0 = constructor_x64_sub(ctx, pattern3_0, expr0_0, &expr1_0)?;
10618                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
10619                             return Some(expr3_0);
10620                         }
10621                         &Opcode::Imul => {
10622                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
10623                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
10624                                 // Rule at src/isa/x64/lower.isle line 925.
10625                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
10626                                 let expr1_0 =
10627                                     constructor_x64_mul(ctx, pattern3_0, expr0_0, &pattern8_0)?;
10628                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
10629                                 return Some(expr2_0);
10630                             }
10631                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
10632                                 // Rule at src/isa/x64/lower.isle line 937.
10633                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
10634                                 let expr1_0 =
10635                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
10636                                 let expr2_0 =
10637                                     constructor_x64_mul(ctx, pattern3_0, expr0_0, &expr1_0)?;
10638                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
10639                                 return Some(expr3_0);
10640                             }
10641                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
10642                                 // Rule at src/isa/x64/lower.isle line 921.
10643                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10644                                 let expr1_0 =
10645                                     constructor_x64_mul(ctx, pattern3_0, expr0_0, &pattern8_0)?;
10646                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
10647                                 return Some(expr2_0);
10648                             }
10649                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
10650                                 // Rule at src/isa/x64/lower.isle line 931.
10651                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10652                                 let expr1_0 =
10653                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
10654                                 let expr2_0 =
10655                                     constructor_x64_mul(ctx, pattern3_0, expr0_0, &expr1_0)?;
10656                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
10657                                 return Some(expr3_0);
10658                             }
10659                             // Rule at src/isa/x64/lower.isle line 916.
10660                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10661                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
10662                             let expr2_0 = constructor_x64_mul(ctx, pattern3_0, expr0_0, &expr1_0)?;
10663                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
10664                             return Some(expr3_0);
10665                         }
10666                         &Opcode::IaddIfcout => {
10667                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
10668                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
10669                                 // Rule at src/isa/x64/lower.isle line 171.
10670                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
10671                                 let expr1_0 =
10672                                     constructor_x64_add(ctx, pattern3_0, expr0_0, &pattern8_0)?;
10673                                 let expr2_0 = C::gpr_to_reg(ctx, expr1_0);
10674                                 let expr3_0 = constructor_output_ifcout(ctx, expr2_0)?;
10675                                 return Some(expr3_0);
10676                             }
10677                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
10678                                 // Rule at src/isa/x64/lower.isle line 181.
10679                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
10680                                 let expr1_0 =
10681                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
10682                                 let expr2_0 =
10683                                     constructor_x64_add(ctx, pattern3_0, expr0_0, &expr1_0)?;
10684                                 let expr3_0 = C::gpr_to_reg(ctx, expr2_0);
10685                                 let expr4_0 = constructor_output_ifcout(ctx, expr3_0)?;
10686                                 return Some(expr4_0);
10687                             }
10688                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
10689                                 // Rule at src/isa/x64/lower.isle line 167.
10690                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10691                                 let expr1_0 =
10692                                     constructor_x64_add(ctx, pattern3_0, expr0_0, &pattern8_0)?;
10693                                 let expr2_0 = C::gpr_to_reg(ctx, expr1_0);
10694                                 let expr3_0 = constructor_output_ifcout(ctx, expr2_0)?;
10695                                 return Some(expr3_0);
10696                             }
10697                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
10698                                 // Rule at src/isa/x64/lower.isle line 177.
10699                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10700                                 let expr1_0 =
10701                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
10702                                 let expr2_0 =
10703                                     constructor_x64_add(ctx, pattern3_0, expr0_0, &expr1_0)?;
10704                                 let expr3_0 = C::gpr_to_reg(ctx, expr2_0);
10705                                 let expr4_0 = constructor_output_ifcout(ctx, expr3_0)?;
10706                                 return Some(expr4_0);
10707                             }
10708                             // Rule at src/isa/x64/lower.isle line 161.
10709                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10710                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
10711                             let expr2_0 = constructor_x64_add(ctx, pattern3_0, expr0_0, &expr1_0)?;
10712                             let expr3_0 = C::gpr_to_reg(ctx, expr2_0);
10713                             let expr4_0 = constructor_output_ifcout(ctx, expr3_0)?;
10714                             return Some(expr4_0);
10715                         }
10716                         &Opcode::Band => {
10717                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
10718                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
10719                                 // Rule at src/isa/x64/lower.isle line 317.
10720                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
10721                                 let expr1_0 =
10722                                     constructor_x64_and(ctx, pattern3_0, expr0_0, &pattern8_0)?;
10723                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
10724                                 return Some(expr2_0);
10725                             }
10726                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
10727                                 // Rule at src/isa/x64/lower.isle line 305.
10728                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
10729                                 let expr1_0 =
10730                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
10731                                 let expr2_0 =
10732                                     constructor_x64_and(ctx, pattern3_0, expr0_0, &expr1_0)?;
10733                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
10734                                 return Some(expr3_0);
10735                             }
10736                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
10737                                 // Rule at src/isa/x64/lower.isle line 313.
10738                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10739                                 let expr1_0 =
10740                                     constructor_x64_and(ctx, pattern3_0, expr0_0, &pattern8_0)?;
10741                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
10742                                 return Some(expr2_0);
10743                             }
10744                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
10745                                 // Rule at src/isa/x64/lower.isle line 300.
10746                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10747                                 let expr1_0 =
10748                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
10749                                 let expr2_0 =
10750                                     constructor_x64_and(ctx, pattern3_0, expr0_0, &expr1_0)?;
10751                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
10752                                 return Some(expr3_0);
10753                             }
10754                             // Rule at src/isa/x64/lower.isle line 295.
10755                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10756                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
10757                             let expr2_0 = constructor_x64_and(ctx, pattern3_0, expr0_0, &expr1_0)?;
10758                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
10759                             return Some(expr3_0);
10760                         }
10761                         &Opcode::Bor => {
10762                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
10763                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
10764                                 // Rule at src/isa/x64/lower.isle line 381.
10765                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
10766                                 let expr1_0 =
10767                                     constructor_x64_or(ctx, pattern3_0, expr0_0, &pattern8_0)?;
10768                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
10769                                 return Some(expr2_0);
10770                             }
10771                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
10772                                 // Rule at src/isa/x64/lower.isle line 370.
10773                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
10774                                 let expr1_0 =
10775                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
10776                                 let expr2_0 =
10777                                     constructor_x64_or(ctx, pattern3_0, expr0_0, &expr1_0)?;
10778                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
10779                                 return Some(expr3_0);
10780                             }
10781                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
10782                                 // Rule at src/isa/x64/lower.isle line 377.
10783                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10784                                 let expr1_0 =
10785                                     constructor_x64_or(ctx, pattern3_0, expr0_0, &pattern8_0)?;
10786                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
10787                                 return Some(expr2_0);
10788                             }
10789                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
10790                                 // Rule at src/isa/x64/lower.isle line 365.
10791                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10792                                 let expr1_0 =
10793                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
10794                                 let expr2_0 =
10795                                     constructor_x64_or(ctx, pattern3_0, expr0_0, &expr1_0)?;
10796                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
10797                                 return Some(expr3_0);
10798                             }
10799                             // Rule at src/isa/x64/lower.isle line 360.
10800                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10801                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
10802                             let expr2_0 = constructor_x64_or(ctx, pattern3_0, expr0_0, &expr1_0)?;
10803                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
10804                             return Some(expr3_0);
10805                         }
10806                         &Opcode::Bxor => {
10807                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
10808                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) {
10809                                 // Rule at src/isa/x64/lower.isle line 447.
10810                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
10811                                 let expr1_0 =
10812                                     constructor_x64_xor(ctx, pattern3_0, expr0_0, &pattern8_0)?;
10813                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
10814                                 return Some(expr2_0);
10815                             }
10816                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) {
10817                                 // Rule at src/isa/x64/lower.isle line 436.
10818                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?;
10819                                 let expr1_0 =
10820                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
10821                                 let expr2_0 =
10822                                     constructor_x64_xor(ctx, pattern3_0, expr0_0, &expr1_0)?;
10823                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
10824                                 return Some(expr3_0);
10825                             }
10826                             if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) {
10827                                 // Rule at src/isa/x64/lower.isle line 443.
10828                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10829                                 let expr1_0 =
10830                                     constructor_x64_xor(ctx, pattern3_0, expr0_0, &pattern8_0)?;
10831                                 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
10832                                 return Some(expr2_0);
10833                             }
10834                             if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) {
10835                                 // Rule at src/isa/x64/lower.isle line 431.
10836                                 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10837                                 let expr1_0 =
10838                                     constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?;
10839                                 let expr2_0 =
10840                                     constructor_x64_xor(ctx, pattern3_0, expr0_0, &expr1_0)?;
10841                                 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
10842                                 return Some(expr3_0);
10843                             }
10844                             // Rule at src/isa/x64/lower.isle line 426.
10845                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10846                             let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?;
10847                             let expr2_0 = constructor_x64_xor(ctx, pattern3_0, expr0_0, &expr1_0)?;
10848                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
10849                             return Some(expr3_0);
10850                         }
10851                         &Opcode::Ishl => {
10852                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
10853                             // Rule at src/isa/x64/lower.isle line 483.
10854                             let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10855                             let expr1_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0);
10856                             let expr2_0 = constructor_x64_shl(ctx, pattern3_0, expr0_0, &expr1_0)?;
10857                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
10858                             return Some(expr3_0);
10859                         }
10860                         &Opcode::Ushr => {
10861                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
10862                             // Rule at src/isa/x64/lower.isle line 589.
10863                             let expr0_0 = ExtendKind::Zero;
10864                             let expr1_0 =
10865                                 constructor_extend_to_gpr(ctx, pattern7_0, pattern3_0, &expr0_0)?;
10866                             let expr2_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0);
10867                             let expr3_0 = constructor_x64_shr(ctx, pattern3_0, expr1_0, &expr2_0)?;
10868                             let expr4_0 = constructor_output_gpr(ctx, expr3_0)?;
10869                             return Some(expr4_0);
10870                         }
10871                         &Opcode::Sshr => {
10872                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
10873                             // Rule at src/isa/x64/lower.isle line 691.
10874                             let expr0_0 = ExtendKind::Sign;
10875                             let expr1_0 =
10876                                 constructor_extend_to_gpr(ctx, pattern7_0, pattern3_0, &expr0_0)?;
10877                             let expr2_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0);
10878                             let expr3_0 = constructor_x64_sar(ctx, pattern3_0, expr1_0, &expr2_0)?;
10879                             let expr4_0 = constructor_output_gpr(ctx, expr3_0)?;
10880                             return Some(expr4_0);
10881                         }
10882                         _ => {}
10883                     }
10884                 }
10885                 &InstructionData::Unary {
10886                     opcode: ref pattern5_0,
10887                     arg: pattern5_1,
10888                 } => {
10889                     match pattern5_0 {
10890                         &Opcode::Ineg => {
10891                             // Rule at src/isa/x64/lower.isle line 884.
10892                             let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
10893                             let expr1_0 = constructor_x64_neg(ctx, pattern3_0, expr0_0)?;
10894                             let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
10895                             return Some(expr2_0);
10896                         }
10897                         &Opcode::Bnot => {
10898                             // Rule at src/isa/x64/lower.isle line 1253.
10899                             let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
10900                             let expr1_0 = constructor_x64_not(ctx, pattern3_0, expr0_0)?;
10901                             let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
10902                             return Some(expr2_0);
10903                         }
10904                         &Opcode::Breduce => {
10905                             // Rule at src/isa/x64/lower.isle line 2235.
10906                             let expr0_0 = C::put_in_regs(ctx, pattern5_1);
10907                             let expr1_0: usize = 0;
10908                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
10909                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
10910                             return Some(expr3_0);
10911                         }
10912                         &Opcode::Bint => {
10913                             // Rule at src/isa/x64/lower.isle line 2243.
10914                             let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
10915                             let expr1_0: u32 = 1;
10916                             let expr2_0 = RegMemImm::Imm { simm32: expr1_0 };
10917                             let expr3_0 = C::gpr_mem_imm_new(ctx, &expr2_0);
10918                             let expr4_0 = constructor_x64_and(ctx, pattern3_0, expr0_0, &expr3_0)?;
10919                             let expr5_0 = constructor_output_gpr(ctx, expr4_0)?;
10920                             return Some(expr5_0);
10921                         }
10922                         &Opcode::Ireduce => {
10923                             // Rule at src/isa/x64/lower.isle line 2227.
10924                             let expr0_0 = C::put_in_regs(ctx, pattern5_1);
10925                             let expr1_0: usize = 0;
10926                             let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
10927                             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
10928                             return Some(expr3_0);
10929                         }
10930                         _ => {}
10931                     }
10932                 }
10933                 &InstructionData::BinaryImm64 {
10934                     opcode: ref pattern5_0,
10935                     arg: pattern5_1,
10936                     imm: pattern5_2,
10937                 } => {
10938                     if let &Opcode::IaddImm = pattern5_0 {
10939                         let pattern7_0 = C::u64_from_imm64(ctx, pattern5_2);
10940                         // Rule at src/isa/x64/lower.isle line 196.
10941                         let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
10942                         let expr1_0 = constructor_imm(ctx, pattern3_0, pattern7_0)?;
10943                         let expr2_0 = constructor_reg_to_gpr_mem_imm(ctx, expr1_0)?;
10944                         let expr3_0 = constructor_x64_add(ctx, pattern3_0, expr0_0, &expr2_0)?;
10945                         let expr4_0 = constructor_output_gpr(ctx, expr3_0)?;
10946                         return Some(expr4_0);
10947                     }
10948                 }
10949                 _ => {}
10950             }
10951         }
10952         if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) {
10953             let pattern4_0 = C::inst_data(ctx, pattern0_0);
10954             match &pattern4_0 {
10955                 &InstructionData::Binary {
10956                     opcode: ref pattern5_0,
10957                     args: ref pattern5_1,
10958                 } => {
10959                     match pattern5_0 {
10960                         &Opcode::Rotl => {
10961                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
10962                             if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) {
10963                                 let pattern9_0 = C::inst_data(ctx, pattern8_0);
10964                                 if let &InstructionData::UnaryImm {
10965                                     opcode: ref pattern10_0,
10966                                     imm: pattern10_1,
10967                                 } = &pattern9_0
10968                                 {
10969                                     if let &Opcode::Iconst = pattern10_0 {
10970                                         let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1);
10971                                         // Rule at src/isa/x64/lower.isle line 823.
10972                                         let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10973                                         let expr1_0 = C::const_to_type_masked_imm8(
10974                                             ctx,
10975                                             pattern12_0,
10976                                             pattern3_0,
10977                                         );
10978                                         let expr2_0 = constructor_x64_rotl(
10979                                             ctx, pattern3_0, expr0_0, &expr1_0,
10980                                         )?;
10981                                         let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
10982                                         return Some(expr3_0);
10983                                     }
10984                                 }
10985                             }
10986                             // Rule at src/isa/x64/lower.isle line 817.
10987                             let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?;
10988                             let expr1_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
10989                             let expr2_0 = C::gpr_to_imm8_gpr(ctx, expr0_0);
10990                             let expr3_0 = constructor_x64_rotl(ctx, pattern3_0, expr1_0, &expr2_0)?;
10991                             let expr4_0 = constructor_output_gpr(ctx, expr3_0)?;
10992                             return Some(expr4_0);
10993                         }
10994                         &Opcode::Rotr => {
10995                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
10996                             if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) {
10997                                 let pattern9_0 = C::inst_data(ctx, pattern8_0);
10998                                 if let &InstructionData::UnaryImm {
10999                                     opcode: ref pattern10_0,
11000                                     imm: pattern10_1,
11001                                 } = &pattern9_0
11002                                 {
11003                                     if let &Opcode::Iconst = pattern10_0 {
11004                                         let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1);
11005                                         // Rule at src/isa/x64/lower.isle line 863.
11006                                         let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
11007                                         let expr1_0 = C::const_to_type_masked_imm8(
11008                                             ctx,
11009                                             pattern12_0,
11010                                             pattern3_0,
11011                                         );
11012                                         let expr2_0 = constructor_x64_rotr(
11013                                             ctx, pattern3_0, expr0_0, &expr1_0,
11014                                         )?;
11015                                         let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
11016                                         return Some(expr3_0);
11017                                     }
11018                                 }
11019                             }
11020                             // Rule at src/isa/x64/lower.isle line 857.
11021                             let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?;
11022                             let expr1_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
11023                             let expr2_0 = C::gpr_to_imm8_gpr(ctx, expr0_0);
11024                             let expr3_0 = constructor_x64_rotr(ctx, pattern3_0, expr1_0, &expr2_0)?;
11025                             let expr4_0 = constructor_output_gpr(ctx, expr3_0)?;
11026                             return Some(expr4_0);
11027                         }
11028                         _ => {}
11029                     }
11030                 }
11031                 &InstructionData::Unary {
11032                     opcode: ref pattern5_0,
11033                     arg: pattern5_1,
11034                 } => {
11035                     match pattern5_0 {
11036                         &Opcode::Clz => {
11037                             // Rule at src/isa/x64/lower.isle line 1791.
11038                             let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
11039                             let expr1_0 = constructor_do_clz(ctx, pattern3_0, pattern3_0, expr0_0)?;
11040                             let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
11041                             return Some(expr2_0);
11042                         }
11043                         &Opcode::Ctz => {
11044                             // Rule at src/isa/x64/lower.isle line 1833.
11045                             let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
11046                             let expr1_0 = constructor_do_ctz(ctx, pattern3_0, pattern3_0, expr0_0)?;
11047                             let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
11048                             return Some(expr2_0);
11049                         }
11050                         &Opcode::Popcnt => {
11051                             // Rule at src/isa/x64/lower.isle line 1885.
11052                             let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?;
11053                             let expr1_0 = constructor_do_popcnt(ctx, pattern3_0, expr0_0)?;
11054                             let expr2_0 = constructor_output_gpr(ctx, expr1_0)?;
11055                             return Some(expr2_0);
11056                         }
11057                         _ => {}
11058                     }
11059                 }
11060                 _ => {}
11061             }
11062         }
11063         if let Some(pattern3_0) = C::ty_8_or_16(ctx, pattern2_0) {
11064             let pattern4_0 = C::inst_data(ctx, pattern0_0);
11065             match &pattern4_0 {
11066                 &InstructionData::Binary {
11067                     opcode: ref pattern5_0,
11068                     args: ref pattern5_1,
11069                 } => {
11070                     match pattern5_0 {
11071                         &Opcode::Rotl => {
11072                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
11073                             if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) {
11074                                 let pattern9_0 = C::inst_data(ctx, pattern8_0);
11075                                 if let &InstructionData::UnaryImm {
11076                                     opcode: ref pattern10_0,
11077                                     imm: pattern10_1,
11078                                 } = &pattern9_0
11079                                 {
11080                                     if let &Opcode::Iconst = pattern10_0 {
11081                                         let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1);
11082                                         // Rule at src/isa/x64/lower.isle line 809.
11083                                         let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
11084                                         let expr1_0 = C::const_to_type_masked_imm8(
11085                                             ctx,
11086                                             pattern12_0,
11087                                             pattern3_0,
11088                                         );
11089                                         let expr2_0 = constructor_x64_rotl(
11090                                             ctx, pattern3_0, expr0_0, &expr1_0,
11091                                         )?;
11092                                         let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
11093                                         return Some(expr3_0);
11094                                     }
11095                                 }
11096                             }
11097                             // Rule at src/isa/x64/lower.isle line 805.
11098                             let expr0_0: Type = I32;
11099                             let expr1_0 = ExtendKind::Zero;
11100                             let expr2_0 =
11101                                 constructor_extend_to_gpr(ctx, pattern7_1, expr0_0, &expr1_0)?;
11102                             let expr3_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
11103                             let expr4_0 = C::gpr_to_imm8_gpr(ctx, expr2_0);
11104                             let expr5_0 = constructor_x64_rotl(ctx, pattern3_0, expr3_0, &expr4_0)?;
11105                             let expr6_0 = constructor_output_gpr(ctx, expr5_0)?;
11106                             return Some(expr6_0);
11107                         }
11108                         &Opcode::Rotr => {
11109                             let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1);
11110                             if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) {
11111                                 let pattern9_0 = C::inst_data(ctx, pattern8_0);
11112                                 if let &InstructionData::UnaryImm {
11113                                     opcode: ref pattern10_0,
11114                                     imm: pattern10_1,
11115                                 } = &pattern9_0
11116                                 {
11117                                     if let &Opcode::Iconst = pattern10_0 {
11118                                         let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1);
11119                                         // Rule at src/isa/x64/lower.isle line 849.
11120                                         let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
11121                                         let expr1_0 = C::const_to_type_masked_imm8(
11122                                             ctx,
11123                                             pattern12_0,
11124                                             pattern3_0,
11125                                         );
11126                                         let expr2_0 = constructor_x64_rotr(
11127                                             ctx, pattern3_0, expr0_0, &expr1_0,
11128                                         )?;
11129                                         let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
11130                                         return Some(expr3_0);
11131                                     }
11132                                 }
11133                             }
11134                             // Rule at src/isa/x64/lower.isle line 845.
11135                             let expr0_0: Type = I32;
11136                             let expr1_0 = ExtendKind::Zero;
11137                             let expr2_0 =
11138                                 constructor_extend_to_gpr(ctx, pattern7_1, expr0_0, &expr1_0)?;
11139                             let expr3_0 = constructor_put_in_gpr(ctx, pattern7_0)?;
11140                             let expr4_0 = C::gpr_to_imm8_gpr(ctx, expr2_0);
11141                             let expr5_0 = constructor_x64_rotr(ctx, pattern3_0, expr3_0, &expr4_0)?;
11142                             let expr6_0 = constructor_output_gpr(ctx, expr5_0)?;
11143                             return Some(expr6_0);
11144                         }
11145                         _ => {}
11146                     }
11147                 }
11148                 &InstructionData::Unary {
11149                     opcode: ref pattern5_0,
11150                     arg: pattern5_1,
11151                 } => {
11152                     match pattern5_0 {
11153                         &Opcode::Clz => {
11154                             // Rule at src/isa/x64/lower.isle line 1796.
11155                             let expr0_0: Type = I32;
11156                             let expr1_0: Type = I32;
11157                             let expr2_0 = ExtendKind::Zero;
11158                             let expr3_0 =
11159                                 constructor_extend_to_gpr(ctx, pattern5_1, expr1_0, &expr2_0)?;
11160                             let expr4_0 = constructor_do_clz(ctx, expr0_0, pattern3_0, expr3_0)?;
11161                             let expr5_0 = constructor_output_gpr(ctx, expr4_0)?;
11162                             return Some(expr5_0);
11163                         }
11164                         &Opcode::Ctz => {
11165                             // Rule at src/isa/x64/lower.isle line 1838.
11166                             let expr0_0: Type = I32;
11167                             let expr1_0: Type = I32;
11168                             let expr2_0 = ExtendKind::Zero;
11169                             let expr3_0 =
11170                                 constructor_extend_to_gpr(ctx, pattern5_1, expr1_0, &expr2_0)?;
11171                             let expr4_0 = constructor_do_ctz(ctx, expr0_0, pattern3_0, expr3_0)?;
11172                             let expr5_0 = constructor_output_gpr(ctx, expr4_0)?;
11173                             return Some(expr5_0);
11174                         }
11175                         &Opcode::Popcnt => {
11176                             // Rule at src/isa/x64/lower.isle line 1890.
11177                             let expr0_0: Type = I32;
11178                             let expr1_0: Type = I32;
11179                             let expr2_0 = ExtendKind::Zero;
11180                             let expr3_0 =
11181                                 constructor_extend_to_gpr(ctx, pattern5_1, expr1_0, &expr2_0)?;
11182                             let expr4_0 = constructor_do_popcnt(ctx, expr0_0, expr3_0)?;
11183                             let expr5_0 = constructor_output_gpr(ctx, expr4_0)?;
11184                             return Some(expr5_0);
11185                         }
11186                         _ => {}
11187                     }
11188                 }
11189                 _ => {}
11190             }
11191         }
11192         if let Some(pattern3_0) = C::ty_int_bool_ref_64(ctx, pattern2_0) {
11193             let pattern4_0 = C::inst_data(ctx, pattern0_0);
11194             if let &InstructionData::Load {
11195                 opcode: ref pattern5_0,
11196                 arg: pattern5_1,
11197                 flags: pattern5_2,
11198                 offset: pattern5_3,
11199             } = &pattern4_0
11200             {
11201                 if let &Opcode::Load = pattern5_0 {
11202                     // Rule at src/isa/x64/lower.isle line 2524.
11203                     let expr0_0 = constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?;
11204                     let expr1_0 = constructor_x64_mov(ctx, &expr0_0)?;
11205                     let expr2_0 = constructor_output_reg(ctx, expr1_0)?;
11206                     return Some(expr2_0);
11207                 }
11208             }
11209         }
11210         if let Some(pattern3_0) = C::ty_int_bool_128(ctx, pattern2_0) {
11211             let pattern4_0 = C::inst_data(ctx, pattern0_0);
11212             if let &InstructionData::Load {
11213                 opcode: ref pattern5_0,
11214                 arg: pattern5_1,
11215                 flags: pattern5_2,
11216                 offset: pattern5_3,
11217             } = &pattern4_0
11218             {
11219                 if let &Opcode::Load = pattern5_0 {
11220                     // Rule at src/isa/x64/lower.isle line 2558.
11221                     let expr0_0 = constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?;
11222                     let expr1_0: u32 = 8;
11223                     let expr2_0 = C::amode_offset(ctx, &expr0_0, expr1_0);
11224                     let expr3_0 = constructor_x64_mov(ctx, &expr0_0)?;
11225                     let expr4_0 = constructor_x64_mov(ctx, &expr2_0)?;
11226                     let expr5_0 = C::value_regs(ctx, expr3_0, expr4_0);
11227                     let expr6_0 = C::output(ctx, expr5_0);
11228                     return Some(expr6_0);
11229                 }
11230             }
11231         }
11232         if let Some(pattern3_0) = C::ty_vec128(ctx, pattern2_0) {
11233             let pattern4_0 = C::inst_data(ctx, pattern0_0);
11234             if let &InstructionData::Load {
11235                 opcode: ref pattern5_0,
11236                 arg: pattern5_1,
11237                 flags: pattern5_2,
11238                 offset: pattern5_3,
11239             } = &pattern4_0
11240             {
11241                 if let &Opcode::Load = pattern5_0 {
11242                     // Rule at src/isa/x64/lower.isle line 2554.
11243                     let expr0_0 = constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?;
11244                     let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?;
11245                     let expr2_0 = constructor_x64_movdqu(ctx, &expr1_0)?;
11246                     let expr3_0 = constructor_output_xmm(ctx, expr2_0)?;
11247                     return Some(expr3_0);
11248                 }
11249             }
11250         }
11251         if let Some(pattern3_0) = C::is_gpr_type(ctx, pattern2_0) {
11252             let pattern4_0 = C::inst_data(ctx, pattern0_0);
11253             if let &InstructionData::Load {
11254                 opcode: ref pattern5_0,
11255                 arg: pattern5_1,
11256                 flags: pattern5_2,
11257                 offset: pattern5_3,
11258             } = &pattern4_0
11259             {
11260                 match pattern5_0 {
11261                     &Opcode::Uload8 => {
11262                         // Rule at src/isa/x64/lower.isle line 2529.
11263                         let expr0_0 = ExtMode::BQ;
11264                         let expr1_0 =
11265                             constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?;
11266                         let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0)?;
11267                         let expr3_0 = constructor_x64_movzx(ctx, &expr0_0, &expr2_0)?;
11268                         let expr4_0 = constructor_output_gpr(ctx, expr3_0)?;
11269                         return Some(expr4_0);
11270                     }
11271                     &Opcode::Sload8 => {
11272                         // Rule at src/isa/x64/lower.isle line 2531.
11273                         let expr0_0 = ExtMode::BQ;
11274                         let expr1_0 =
11275                             constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?;
11276                         let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0)?;
11277                         let expr3_0 = constructor_x64_movsx(ctx, &expr0_0, &expr2_0)?;
11278                         let expr4_0 = constructor_output_gpr(ctx, expr3_0)?;
11279                         return Some(expr4_0);
11280                     }
11281                     &Opcode::Uload16 => {
11282                         // Rule at src/isa/x64/lower.isle line 2533.
11283                         let expr0_0 = ExtMode::WQ;
11284                         let expr1_0 =
11285                             constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?;
11286                         let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0)?;
11287                         let expr3_0 = constructor_x64_movzx(ctx, &expr0_0, &expr2_0)?;
11288                         let expr4_0 = constructor_output_gpr(ctx, expr3_0)?;
11289                         return Some(expr4_0);
11290                     }
11291                     &Opcode::Sload16 => {
11292                         // Rule at src/isa/x64/lower.isle line 2535.
11293                         let expr0_0 = ExtMode::WQ;
11294                         let expr1_0 =
11295                             constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?;
11296                         let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0)?;
11297                         let expr3_0 = constructor_x64_movsx(ctx, &expr0_0, &expr2_0)?;
11298                         let expr4_0 = constructor_output_gpr(ctx, expr3_0)?;
11299                         return Some(expr4_0);
11300                     }
11301                     &Opcode::Uload32 => {
11302                         // Rule at src/isa/x64/lower.isle line 2537.
11303                         let expr0_0 = ExtMode::LQ;
11304                         let expr1_0 =
11305                             constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?;
11306                         let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0)?;
11307                         let expr3_0 = constructor_x64_movzx(ctx, &expr0_0, &expr2_0)?;
11308                         let expr4_0 = constructor_output_gpr(ctx, expr3_0)?;
11309                         return Some(expr4_0);
11310                     }
11311                     &Opcode::Sload32 => {
11312                         // Rule at src/isa/x64/lower.isle line 2539.
11313                         let expr0_0 = ExtMode::LQ;
11314                         let expr1_0 =
11315                             constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?;
11316                         let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0)?;
11317                         let expr3_0 = constructor_x64_movsx(ctx, &expr0_0, &expr2_0)?;
11318                         let expr4_0 = constructor_output_gpr(ctx, expr3_0)?;
11319                         return Some(expr4_0);
11320                     }
11321                     _ => {}
11322                 }
11323             }
11324         }
11325     }
11326     return None;
11327 }
11328 
11329 // Generated as internal constructor for term output_ifcout.
11330 pub fn constructor_output_ifcout<C: Context>(ctx: &mut C, arg0: Reg) -> Option<InstOutput> {
11331     let pattern0_0 = arg0;
11332     // Rule at src/isa/x64/lower.isle line 157.
11333     let expr0_0 = C::value_reg(ctx, pattern0_0);
11334     let expr1_0 = C::value_regs_invalid(ctx);
11335     let expr2_0 = C::output_pair(ctx, expr0_0, expr1_0);
11336     return Some(expr2_0);
11337 }
11338 
11339 // Generated as internal constructor for term sse_and.
11340 pub fn constructor_sse_and<C: Context>(
11341     ctx: &mut C,
11342     arg0: Type,
11343     arg1: Xmm,
11344     arg2: &XmmMem,
11345 ) -> Option<Xmm> {
11346     let pattern0_0 = arg0;
11347     if pattern0_0 == F32X4 {
11348         let pattern2_0 = arg1;
11349         let pattern3_0 = arg2;
11350         // Rule at src/isa/x64/lower.isle line 324.
11351         let expr0_0 = constructor_x64_andps(ctx, pattern2_0, pattern3_0)?;
11352         return Some(expr0_0);
11353     }
11354     if pattern0_0 == F64X2 {
11355         let pattern2_0 = arg1;
11356         let pattern3_0 = arg2;
11357         // Rule at src/isa/x64/lower.isle line 325.
11358         let expr0_0 = constructor_x64_andpd(ctx, pattern2_0, pattern3_0)?;
11359         return Some(expr0_0);
11360     }
11361     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
11362         let pattern2_0 = arg1;
11363         let pattern3_0 = arg2;
11364         // Rule at src/isa/x64/lower.isle line 326.
11365         let expr0_0 = constructor_x64_pand(ctx, pattern2_0, pattern3_0)?;
11366         return Some(expr0_0);
11367     }
11368     return None;
11369 }
11370 
11371 // Generated as internal constructor for term sse_or.
11372 pub fn constructor_sse_or<C: Context>(
11373     ctx: &mut C,
11374     arg0: Type,
11375     arg1: Xmm,
11376     arg2: &XmmMem,
11377 ) -> Option<Xmm> {
11378     let pattern0_0 = arg0;
11379     if pattern0_0 == F32X4 {
11380         let pattern2_0 = arg1;
11381         let pattern3_0 = arg2;
11382         // Rule at src/isa/x64/lower.isle line 388.
11383         let expr0_0 = constructor_x64_orps(ctx, pattern2_0, pattern3_0)?;
11384         return Some(expr0_0);
11385     }
11386     if pattern0_0 == F64X2 {
11387         let pattern2_0 = arg1;
11388         let pattern3_0 = arg2;
11389         // Rule at src/isa/x64/lower.isle line 389.
11390         let expr0_0 = constructor_x64_orpd(ctx, pattern2_0, pattern3_0)?;
11391         return Some(expr0_0);
11392     }
11393     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
11394         let pattern2_0 = arg1;
11395         let pattern3_0 = arg2;
11396         // Rule at src/isa/x64/lower.isle line 390.
11397         let expr0_0 = constructor_x64_por(ctx, pattern2_0, pattern3_0)?;
11398         return Some(expr0_0);
11399     }
11400     return None;
11401 }
11402 
11403 // Generated as internal constructor for term or_i128.
11404 pub fn constructor_or_i128<C: Context>(
11405     ctx: &mut C,
11406     arg0: ValueRegs,
11407     arg1: ValueRegs,
11408 ) -> Option<ValueRegs> {
11409     let pattern0_0 = arg0;
11410     let pattern1_0 = arg1;
11411     // Rule at src/isa/x64/lower.isle line 399.
11412     let expr0_0: usize = 0;
11413     let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?;
11414     let expr2_0: usize = 1;
11415     let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?;
11416     let expr4_0: usize = 0;
11417     let expr5_0 = constructor_value_regs_get_gpr(ctx, pattern1_0, expr4_0)?;
11418     let expr6_0: usize = 1;
11419     let expr7_0 = constructor_value_regs_get_gpr(ctx, pattern1_0, expr6_0)?;
11420     let expr8_0: Type = I64;
11421     let expr9_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
11422     let expr10_0 = constructor_x64_or(ctx, expr8_0, expr1_0, &expr9_0)?;
11423     let expr11_0: Type = I64;
11424     let expr12_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0);
11425     let expr13_0 = constructor_x64_or(ctx, expr11_0, expr3_0, &expr12_0)?;
11426     let expr14_0 = constructor_value_gprs(ctx, expr10_0, expr13_0)?;
11427     return Some(expr14_0);
11428 }
11429 
11430 // Generated as internal constructor for term shl_i128.
11431 pub fn constructor_shl_i128<C: Context>(
11432     ctx: &mut C,
11433     arg0: ValueRegs,
11434     arg1: Gpr,
11435 ) -> Option<ValueRegs> {
11436     let pattern0_0 = arg0;
11437     let pattern1_0 = arg1;
11438     // Rule at src/isa/x64/lower.isle line 489.
11439     let expr0_0: usize = 0;
11440     let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?;
11441     let expr2_0: usize = 1;
11442     let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?;
11443     let expr4_0: Type = I64;
11444     let expr5_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
11445     let expr6_0 = constructor_x64_shl(ctx, expr4_0, expr1_0, &expr5_0)?;
11446     let expr7_0: Type = I64;
11447     let expr8_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
11448     let expr9_0 = constructor_x64_shl(ctx, expr7_0, expr3_0, &expr8_0)?;
11449     let expr10_0: Type = I64;
11450     let expr11_0: Type = I64;
11451     let expr12_0: Type = I64;
11452     let expr13_0: u64 = 64;
11453     let expr14_0 = constructor_imm(ctx, expr12_0, expr13_0)?;
11454     let expr15_0 = C::gpr_new(ctx, expr14_0);
11455     let expr16_0 = C::gpr_to_gpr_mem_imm(ctx, pattern1_0);
11456     let expr17_0 = constructor_x64_sub(ctx, expr11_0, expr15_0, &expr16_0)?;
11457     let expr18_0 = C::gpr_to_imm8_gpr(ctx, expr17_0);
11458     let expr19_0 = constructor_x64_shr(ctx, expr10_0, expr1_0, &expr18_0)?;
11459     let expr20_0: Type = I64;
11460     let expr21_0: u64 = 0;
11461     let expr22_0 = constructor_imm(ctx, expr20_0, expr21_0)?;
11462     let expr23_0 = C::gpr_new(ctx, expr22_0);
11463     let expr24_0 = OperandSize::Size64;
11464     let expr25_0: u32 = 127;
11465     let expr26_0 = RegMemImm::Imm { simm32: expr25_0 };
11466     let expr27_0 = C::gpr_mem_imm_new(ctx, &expr26_0);
11467     let expr28_0 = constructor_x64_test(ctx, &expr24_0, &expr27_0, pattern1_0)?;
11468     let expr29_0: Type = I64;
11469     let expr30_0 = CC::Z;
11470     let expr31_0 = C::gpr_to_gpr_mem(ctx, expr23_0);
11471     let expr32_0 = constructor_cmove(ctx, expr29_0, &expr30_0, &expr31_0, expr19_0)?;
11472     let expr33_0 = constructor_with_flags_reg(ctx, &expr28_0, &expr32_0)?;
11473     let expr34_0 = C::gpr_new(ctx, expr33_0);
11474     let expr35_0: Type = I64;
11475     let expr36_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
11476     let expr37_0 = constructor_x64_or(ctx, expr35_0, expr34_0, &expr36_0)?;
11477     let expr38_0 = OperandSize::Size64;
11478     let expr39_0: u32 = 64;
11479     let expr40_0 = RegMemImm::Imm { simm32: expr39_0 };
11480     let expr41_0 = C::gpr_mem_imm_new(ctx, &expr40_0);
11481     let expr42_0 = constructor_x64_test(ctx, &expr38_0, &expr41_0, pattern1_0)?;
11482     let expr43_0: Type = I64;
11483     let expr44_0 = CC::Z;
11484     let expr45_0 = C::gpr_to_gpr_mem(ctx, expr6_0);
11485     let expr46_0 = constructor_cmove(ctx, expr43_0, &expr44_0, &expr45_0, expr23_0)?;
11486     let expr47_0: Type = I64;
11487     let expr48_0 = CC::Z;
11488     let expr49_0 = C::gpr_to_gpr_mem(ctx, expr37_0);
11489     let expr50_0 = constructor_cmove(ctx, expr47_0, &expr48_0, &expr49_0, expr6_0)?;
11490     let expr51_0 = constructor_consumes_flags_concat(ctx, &expr46_0, &expr50_0)?;
11491     let expr52_0 = constructor_with_flags(ctx, &expr42_0, &expr51_0)?;
11492     return Some(expr52_0);
11493 }
11494 
11495 // Generated as internal constructor for term ishl_i8x16_mask.
11496 pub fn constructor_ishl_i8x16_mask<C: Context>(
11497     ctx: &mut C,
11498     arg0: &RegMemImm,
11499 ) -> Option<SyntheticAmode> {
11500     let pattern0_0 = arg0;
11501     match pattern0_0 {
11502         &RegMemImm::Imm { simm32: pattern1_0 } => {
11503             // Rule at src/isa/x64/lower.isle line 552.
11504             let expr0_0 = C::ishl_i8x16_mask_for_const(ctx, pattern1_0);
11505             return Some(expr0_0);
11506         }
11507         &RegMemImm::Reg { reg: pattern1_0 } => {
11508             // Rule at src/isa/x64/lower.isle line 561.
11509             let expr0_0 = C::ishl_i8x16_mask_table(ctx);
11510             let expr1_0 = constructor_x64_lea(ctx, &expr0_0)?;
11511             let expr2_0: Type = I64;
11512             let expr3_0 = C::gpr_new(ctx, pattern1_0);
11513             let expr4_0: u8 = 4;
11514             let expr5_0 = C::imm8_to_imm8_gpr(ctx, expr4_0);
11515             let expr6_0 = constructor_x64_shl(ctx, expr2_0, expr3_0, &expr5_0)?;
11516             let expr7_0: u32 = 0;
11517             let expr8_0: u8 = 0;
11518             let expr9_0 = C::amode_imm_reg_reg_shift(ctx, expr7_0, expr1_0, expr6_0, expr8_0);
11519             let expr10_0 = C::amode_to_synthetic_amode(ctx, &expr9_0);
11520             return Some(expr10_0);
11521         }
11522         &RegMemImm::Mem {
11523             addr: ref pattern1_0,
11524         } => {
11525             // Rule at src/isa/x64/lower.isle line 571.
11526             let expr0_0: Type = I64;
11527             let expr1_0 = ExtKind::None;
11528             let expr2_0 = constructor_x64_load(ctx, expr0_0, pattern1_0, &expr1_0)?;
11529             let expr3_0 = RegMemImm::Reg { reg: expr2_0 };
11530             let expr4_0 = constructor_ishl_i8x16_mask(ctx, &expr3_0)?;
11531             return Some(expr4_0);
11532         }
11533         _ => {}
11534     }
11535     return None;
11536 }
11537 
11538 // Generated as internal constructor for term shr_i128.
11539 pub fn constructor_shr_i128<C: Context>(
11540     ctx: &mut C,
11541     arg0: ValueRegs,
11542     arg1: Gpr,
11543 ) -> Option<ValueRegs> {
11544     let pattern0_0 = arg0;
11545     let pattern1_0 = arg1;
11546     // Rule at src/isa/x64/lower.isle line 596.
11547     let expr0_0: usize = 0;
11548     let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?;
11549     let expr2_0: usize = 1;
11550     let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?;
11551     let expr4_0: Type = I64;
11552     let expr5_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
11553     let expr6_0 = constructor_x64_shr(ctx, expr4_0, expr1_0, &expr5_0)?;
11554     let expr7_0: Type = I64;
11555     let expr8_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
11556     let expr9_0 = constructor_x64_shr(ctx, expr7_0, expr3_0, &expr8_0)?;
11557     let expr10_0: Type = I64;
11558     let expr11_0: Type = I64;
11559     let expr12_0: Type = I64;
11560     let expr13_0: u64 = 64;
11561     let expr14_0 = constructor_imm(ctx, expr12_0, expr13_0)?;
11562     let expr15_0 = C::gpr_new(ctx, expr14_0);
11563     let expr16_0 = C::gpr_to_gpr_mem_imm(ctx, pattern1_0);
11564     let expr17_0 = constructor_x64_sub(ctx, expr11_0, expr15_0, &expr16_0)?;
11565     let expr18_0 = C::gpr_to_imm8_gpr(ctx, expr17_0);
11566     let expr19_0 = constructor_x64_shl(ctx, expr10_0, expr3_0, &expr18_0)?;
11567     let expr20_0 = OperandSize::Size64;
11568     let expr21_0: u32 = 127;
11569     let expr22_0 = RegMemImm::Imm { simm32: expr21_0 };
11570     let expr23_0 = C::gpr_mem_imm_new(ctx, &expr22_0);
11571     let expr24_0 = constructor_x64_test(ctx, &expr20_0, &expr23_0, pattern1_0)?;
11572     let expr25_0: Type = I64;
11573     let expr26_0 = CC::Z;
11574     let expr27_0: Type = I64;
11575     let expr28_0: u64 = 0;
11576     let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0)?;
11577     let expr30_0 = C::reg_to_gpr_mem(ctx, expr29_0);
11578     let expr31_0 = constructor_cmove(ctx, expr25_0, &expr26_0, &expr30_0, expr19_0)?;
11579     let expr32_0 = constructor_with_flags_reg(ctx, &expr24_0, &expr31_0)?;
11580     let expr33_0 = C::gpr_new(ctx, expr32_0);
11581     let expr34_0: Type = I64;
11582     let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr6_0);
11583     let expr36_0 = constructor_x64_or(ctx, expr34_0, expr33_0, &expr35_0)?;
11584     let expr37_0 = OperandSize::Size64;
11585     let expr38_0: u32 = 64;
11586     let expr39_0 = RegMemImm::Imm { simm32: expr38_0 };
11587     let expr40_0 = C::gpr_mem_imm_new(ctx, &expr39_0);
11588     let expr41_0 = constructor_x64_test(ctx, &expr37_0, &expr40_0, pattern1_0)?;
11589     let expr42_0: Type = I64;
11590     let expr43_0 = CC::Z;
11591     let expr44_0 = C::gpr_to_gpr_mem(ctx, expr36_0);
11592     let expr45_0 = constructor_cmove(ctx, expr42_0, &expr43_0, &expr44_0, expr9_0)?;
11593     let expr46_0: Type = I64;
11594     let expr47_0 = CC::Z;
11595     let expr48_0 = C::gpr_to_gpr_mem(ctx, expr9_0);
11596     let expr49_0: Type = I64;
11597     let expr50_0: u64 = 0;
11598     let expr51_0 = constructor_imm(ctx, expr49_0, expr50_0)?;
11599     let expr52_0 = C::gpr_new(ctx, expr51_0);
11600     let expr53_0 = constructor_cmove(ctx, expr46_0, &expr47_0, &expr48_0, expr52_0)?;
11601     let expr54_0 = constructor_consumes_flags_concat(ctx, &expr45_0, &expr53_0)?;
11602     let expr55_0 = constructor_with_flags(ctx, &expr41_0, &expr54_0)?;
11603     return Some(expr55_0);
11604 }
11605 
11606 // Generated as internal constructor for term ushr_i8x16_mask.
11607 pub fn constructor_ushr_i8x16_mask<C: Context>(
11608     ctx: &mut C,
11609     arg0: &RegMemImm,
11610 ) -> Option<SyntheticAmode> {
11611     let pattern0_0 = arg0;
11612     match pattern0_0 {
11613         &RegMemImm::Imm { simm32: pattern1_0 } => {
11614             // Rule at src/isa/x64/lower.isle line 653.
11615             let expr0_0 = C::ushr_i8x16_mask_for_const(ctx, pattern1_0);
11616             return Some(expr0_0);
11617         }
11618         &RegMemImm::Reg { reg: pattern1_0 } => {
11619             // Rule at src/isa/x64/lower.isle line 662.
11620             let expr0_0 = C::ushr_i8x16_mask_table(ctx);
11621             let expr1_0 = constructor_x64_lea(ctx, &expr0_0)?;
11622             let expr2_0: Type = I64;
11623             let expr3_0 = C::gpr_new(ctx, pattern1_0);
11624             let expr4_0: u8 = 4;
11625             let expr5_0 = C::imm8_to_imm8_gpr(ctx, expr4_0);
11626             let expr6_0 = constructor_x64_shl(ctx, expr2_0, expr3_0, &expr5_0)?;
11627             let expr7_0: u32 = 0;
11628             let expr8_0: u8 = 0;
11629             let expr9_0 = C::amode_imm_reg_reg_shift(ctx, expr7_0, expr1_0, expr6_0, expr8_0);
11630             let expr10_0 = C::amode_to_synthetic_amode(ctx, &expr9_0);
11631             return Some(expr10_0);
11632         }
11633         &RegMemImm::Mem {
11634             addr: ref pattern1_0,
11635         } => {
11636             // Rule at src/isa/x64/lower.isle line 673.
11637             let expr0_0: Type = I64;
11638             let expr1_0 = ExtKind::None;
11639             let expr2_0 = constructor_x64_load(ctx, expr0_0, pattern1_0, &expr1_0)?;
11640             let expr3_0 = RegMemImm::Reg { reg: expr2_0 };
11641             let expr4_0 = constructor_ushr_i8x16_mask(ctx, &expr3_0)?;
11642             return Some(expr4_0);
11643         }
11644         _ => {}
11645     }
11646     return None;
11647 }
11648 
11649 // Generated as internal constructor for term sar_i128.
11650 pub fn constructor_sar_i128<C: Context>(
11651     ctx: &mut C,
11652     arg0: ValueRegs,
11653     arg1: Gpr,
11654 ) -> Option<ValueRegs> {
11655     let pattern0_0 = arg0;
11656     let pattern1_0 = arg1;
11657     // Rule at src/isa/x64/lower.isle line 698.
11658     let expr0_0: usize = 0;
11659     let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?;
11660     let expr2_0: usize = 1;
11661     let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?;
11662     let expr4_0: Type = I64;
11663     let expr5_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
11664     let expr6_0 = constructor_x64_shr(ctx, expr4_0, expr1_0, &expr5_0)?;
11665     let expr7_0: Type = I64;
11666     let expr8_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0);
11667     let expr9_0 = constructor_x64_sar(ctx, expr7_0, expr3_0, &expr8_0)?;
11668     let expr10_0: Type = I64;
11669     let expr11_0: Type = I64;
11670     let expr12_0: Type = I64;
11671     let expr13_0: u64 = 64;
11672     let expr14_0 = constructor_imm(ctx, expr12_0, expr13_0)?;
11673     let expr15_0 = C::gpr_new(ctx, expr14_0);
11674     let expr16_0 = C::gpr_to_gpr_mem_imm(ctx, pattern1_0);
11675     let expr17_0 = constructor_x64_sub(ctx, expr11_0, expr15_0, &expr16_0)?;
11676     let expr18_0 = C::gpr_to_imm8_gpr(ctx, expr17_0);
11677     let expr19_0 = constructor_x64_shl(ctx, expr10_0, expr3_0, &expr18_0)?;
11678     let expr20_0 = OperandSize::Size64;
11679     let expr21_0: u32 = 127;
11680     let expr22_0 = RegMemImm::Imm { simm32: expr21_0 };
11681     let expr23_0 = C::gpr_mem_imm_new(ctx, &expr22_0);
11682     let expr24_0 = constructor_x64_test(ctx, &expr20_0, &expr23_0, pattern1_0)?;
11683     let expr25_0: Type = I64;
11684     let expr26_0 = CC::Z;
11685     let expr27_0: Type = I64;
11686     let expr28_0: u64 = 0;
11687     let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0)?;
11688     let expr30_0 = C::reg_to_gpr_mem(ctx, expr29_0);
11689     let expr31_0 = constructor_cmove(ctx, expr25_0, &expr26_0, &expr30_0, expr19_0)?;
11690     let expr32_0 = constructor_with_flags_reg(ctx, &expr24_0, &expr31_0)?;
11691     let expr33_0 = C::gpr_new(ctx, expr32_0);
11692     let expr34_0: Type = I64;
11693     let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr33_0);
11694     let expr36_0 = constructor_x64_or(ctx, expr34_0, expr6_0, &expr35_0)?;
11695     let expr37_0: Type = I64;
11696     let expr38_0: u8 = 63;
11697     let expr39_0 = C::imm8_to_imm8_gpr(ctx, expr38_0);
11698     let expr40_0 = constructor_x64_sar(ctx, expr37_0, expr3_0, &expr39_0)?;
11699     let expr41_0 = OperandSize::Size64;
11700     let expr42_0: u32 = 64;
11701     let expr43_0 = RegMemImm::Imm { simm32: expr42_0 };
11702     let expr44_0 = C::gpr_mem_imm_new(ctx, &expr43_0);
11703     let expr45_0 = constructor_x64_test(ctx, &expr41_0, &expr44_0, pattern1_0)?;
11704     let expr46_0: Type = I64;
11705     let expr47_0 = CC::Z;
11706     let expr48_0 = C::gpr_to_gpr_mem(ctx, expr36_0);
11707     let expr49_0 = constructor_cmove(ctx, expr46_0, &expr47_0, &expr48_0, expr9_0)?;
11708     let expr50_0: Type = I64;
11709     let expr51_0 = CC::Z;
11710     let expr52_0 = C::gpr_to_gpr_mem(ctx, expr9_0);
11711     let expr53_0 = constructor_cmove(ctx, expr50_0, &expr51_0, &expr52_0, expr40_0)?;
11712     let expr54_0 = constructor_consumes_flags_concat(ctx, &expr49_0, &expr53_0)?;
11713     let expr55_0 = constructor_with_flags(ctx, &expr45_0, &expr54_0)?;
11714     return Some(expr55_0);
11715 }
11716 
11717 // Generated as internal constructor for term sshr_i8x16_bigger_shift.
11718 pub fn constructor_sshr_i8x16_bigger_shift<C: Context>(
11719     ctx: &mut C,
11720     arg0: Type,
11721     arg1: &RegMemImm,
11722 ) -> Option<XmmMemImm> {
11723     let pattern0_0 = arg0;
11724     let pattern1_0 = arg1;
11725     match pattern1_0 {
11726         &RegMemImm::Imm { simm32: pattern2_0 } => {
11727             // Rule at src/isa/x64/lower.isle line 762.
11728             let expr0_0: u32 = 8;
11729             let expr1_0 = C::u32_add(ctx, pattern2_0, expr0_0);
11730             let expr2_0 = RegMemImm::Imm { simm32: expr1_0 };
11731             let expr3_0 = C::xmm_mem_imm_new(ctx, &expr2_0);
11732             return Some(expr3_0);
11733         }
11734         &RegMemImm::Reg { reg: pattern2_0 } => {
11735             // Rule at src/isa/x64/lower.isle line 764.
11736             let expr0_0 = C::gpr_new(ctx, pattern2_0);
11737             let expr1_0: u32 = 8;
11738             let expr2_0 = RegMemImm::Imm { simm32: expr1_0 };
11739             let expr3_0 = C::gpr_mem_imm_new(ctx, &expr2_0);
11740             let expr4_0 = constructor_x64_add(ctx, pattern0_0, expr0_0, &expr3_0)?;
11741             let expr5_0 = C::gpr_to_reg(ctx, expr4_0);
11742             let expr6_0 = RegMemImm::Reg { reg: expr5_0 };
11743             let expr7_0 = constructor_mov_rmi_to_xmm(ctx, &expr6_0)?;
11744             return Some(expr7_0);
11745         }
11746         &RegMemImm::Mem {
11747             addr: ref pattern2_0,
11748         } => {
11749             // Rule at src/isa/x64/lower.isle line 768.
11750             let expr0_0: u64 = 8;
11751             let expr1_0 = constructor_imm(ctx, pattern0_0, expr0_0)?;
11752             let expr2_0 = C::gpr_new(ctx, expr1_0);
11753             let expr3_0 = C::gpr_mem_imm_new(ctx, pattern1_0);
11754             let expr4_0 = constructor_x64_add(ctx, pattern0_0, expr2_0, &expr3_0)?;
11755             let expr5_0 = C::gpr_to_reg(ctx, expr4_0);
11756             let expr6_0 = RegMemImm::Reg { reg: expr5_0 };
11757             let expr7_0 = constructor_mov_rmi_to_xmm(ctx, &expr6_0)?;
11758             return Some(expr7_0);
11759         }
11760         _ => {}
11761     }
11762     return None;
11763 }
11764 
11765 // Generated as internal constructor for term sse_and_not.
11766 pub fn constructor_sse_and_not<C: Context>(
11767     ctx: &mut C,
11768     arg0: Type,
11769     arg1: Xmm,
11770     arg2: &XmmMem,
11771 ) -> Option<Xmm> {
11772     let pattern0_0 = arg0;
11773     if pattern0_0 == F32X4 {
11774         let pattern2_0 = arg1;
11775         let pattern3_0 = arg2;
11776         // Rule at src/isa/x64/lower.isle line 1194.
11777         let expr0_0 = constructor_x64_andnps(ctx, pattern2_0, pattern3_0)?;
11778         return Some(expr0_0);
11779     }
11780     if pattern0_0 == F64X2 {
11781         let pattern2_0 = arg1;
11782         let pattern3_0 = arg2;
11783         // Rule at src/isa/x64/lower.isle line 1195.
11784         let expr0_0 = constructor_x64_andnpd(ctx, pattern2_0, pattern3_0)?;
11785         return Some(expr0_0);
11786     }
11787     if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) {
11788         let pattern2_0 = arg1;
11789         let pattern3_0 = arg2;
11790         // Rule at src/isa/x64/lower.isle line 1196.
11791         let expr0_0 = constructor_x64_pandn(ctx, pattern2_0, pattern3_0)?;
11792         return Some(expr0_0);
11793     }
11794     return None;
11795 }
11796 
11797 // Generated as internal constructor for term i128_not.
11798 pub fn constructor_i128_not<C: Context>(ctx: &mut C, arg0: Value) -> Option<ValueRegs> {
11799     let pattern0_0 = arg0;
11800     // Rule at src/isa/x64/lower.isle line 1259.
11801     let expr0_0 = C::put_in_regs(ctx, pattern0_0);
11802     let expr1_0: usize = 0;
11803     let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?;
11804     let expr3_0: usize = 1;
11805     let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?;
11806     let expr5_0: Type = I64;
11807     let expr6_0 = constructor_x64_not(ctx, expr5_0, expr2_0)?;
11808     let expr7_0: Type = I64;
11809     let expr8_0 = constructor_x64_not(ctx, expr7_0, expr4_0)?;
11810     let expr9_0 = constructor_value_gprs(ctx, expr6_0, expr8_0)?;
11811     return Some(expr9_0);
11812 }
11813 
11814 // Generated as internal constructor for term vec_insert_lane.
11815 pub fn constructor_vec_insert_lane<C: Context>(
11816     ctx: &mut C,
11817     arg0: Type,
11818     arg1: Xmm,
11819     arg2: &RegMem,
11820     arg3: u8,
11821 ) -> Option<Xmm> {
11822     let pattern0_0 = arg0;
11823     if pattern0_0 == I8X16 {
11824         let pattern2_0 = arg1;
11825         let pattern3_0 = arg2;
11826         let pattern4_0 = arg3;
11827         // Rule at src/isa/x64/lower.isle line 1313.
11828         let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0);
11829         let expr1_0 = constructor_x64_pinsrb(ctx, pattern2_0, &expr0_0, pattern4_0)?;
11830         return Some(expr1_0);
11831     }
11832     if pattern0_0 == I16X8 {
11833         let pattern2_0 = arg1;
11834         let pattern3_0 = arg2;
11835         let pattern4_0 = arg3;
11836         // Rule at src/isa/x64/lower.isle line 1317.
11837         let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0);
11838         let expr1_0 = constructor_x64_pinsrw(ctx, pattern2_0, &expr0_0, pattern4_0)?;
11839         return Some(expr1_0);
11840     }
11841     if pattern0_0 == I32X4 {
11842         let pattern2_0 = arg1;
11843         let pattern3_0 = arg2;
11844         let pattern4_0 = arg3;
11845         // Rule at src/isa/x64/lower.isle line 1321.
11846         let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0);
11847         let expr1_0 = OperandSize::Size32;
11848         let expr2_0 = constructor_x64_pinsrd(ctx, pattern2_0, &expr0_0, pattern4_0, &expr1_0)?;
11849         return Some(expr2_0);
11850     }
11851     if pattern0_0 == I64X2 {
11852         let pattern2_0 = arg1;
11853         let pattern3_0 = arg2;
11854         let pattern4_0 = arg3;
11855         // Rule at src/isa/x64/lower.isle line 1325.
11856         let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0);
11857         let expr1_0 = OperandSize::Size64;
11858         let expr2_0 = constructor_x64_pinsrd(ctx, pattern2_0, &expr0_0, pattern4_0, &expr1_0)?;
11859         return Some(expr2_0);
11860     }
11861     if pattern0_0 == F32X4 {
11862         let pattern2_0 = arg1;
11863         let pattern3_0 = arg2;
11864         let pattern4_0 = arg3;
11865         // Rule at src/isa/x64/lower.isle line 1329.
11866         let expr0_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0);
11867         let expr1_0 = C::sse_insertps_lane_imm(ctx, pattern4_0);
11868         let expr2_0 = constructor_x64_insertps(ctx, pattern2_0, &expr0_0, expr1_0)?;
11869         return Some(expr2_0);
11870     }
11871     if pattern0_0 == F64X2 {
11872         let pattern2_0 = arg1;
11873         let pattern3_0 = arg2;
11874         if let &RegMem::Reg { reg: pattern4_0 } = pattern3_0 {
11875             let pattern5_0 = arg3;
11876             if pattern5_0 == 0 {
11877                 // Rule at src/isa/x64/lower.isle line 1351.
11878                 let expr0_0 = constructor_reg_to_xmm_mem(ctx, pattern4_0)?;
11879                 let expr1_0 = constructor_x64_movsd_regmove(ctx, pattern2_0, &expr0_0)?;
11880                 return Some(expr1_0);
11881             }
11882         }
11883         let pattern4_0 = arg3;
11884         if pattern4_0 == 0 {
11885             // Rule at src/isa/x64/lower.isle line 1353.
11886             let expr0_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0);
11887             let expr1_0 = constructor_x64_movsd_load(ctx, &expr0_0)?;
11888             let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0);
11889             let expr3_0 = constructor_x64_movsd_regmove(ctx, pattern2_0, &expr2_0)?;
11890             return Some(expr3_0);
11891         }
11892         if pattern4_0 == 1 {
11893             // Rule at src/isa/x64/lower.isle line 1361.
11894             let expr0_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0);
11895             let expr1_0 = constructor_x64_movlhps(ctx, pattern2_0, &expr0_0)?;
11896             return Some(expr1_0);
11897         }
11898     }
11899     return None;
11900 }
11901 
11902 // Generated as internal constructor for term cmp_and_choose.
11903 pub fn constructor_cmp_and_choose<C: Context>(
11904     ctx: &mut C,
11905     arg0: Type,
11906     arg1: &CC,
11907     arg2: Value,
11908     arg3: Value,
11909 ) -> Option<ValueRegs> {
11910     let pattern0_0 = arg0;
11911     if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) {
11912         let pattern2_0 = arg1;
11913         let pattern3_0 = arg2;
11914         let pattern4_0 = arg3;
11915         // Rule at src/isa/x64/lower.isle line 1369.
11916         let expr0_0 = C::raw_operand_size_of_type(ctx, pattern1_0);
11917         let expr1_0 = C::put_in_reg(ctx, pattern3_0);
11918         let expr2_0 = C::put_in_reg(ctx, pattern4_0);
11919         let expr3_0 = constructor_reg_to_gpr_mem_imm(ctx, expr1_0)?;
11920         let expr4_0 = C::gpr_new(ctx, expr2_0);
11921         let expr5_0 = constructor_x64_cmp(ctx, &expr0_0, &expr3_0, expr4_0)?;
11922         let expr6_0 = C::reg_to_gpr_mem(ctx, expr2_0);
11923         let expr7_0 = C::gpr_new(ctx, expr1_0);
11924         let expr8_0 = constructor_cmove(ctx, pattern1_0, pattern2_0, &expr6_0, expr7_0)?;
11925         let expr9_0 = constructor_with_flags_reg(ctx, &expr5_0, &expr8_0)?;
11926         let expr10_0 = C::value_reg(ctx, expr9_0);
11927         return Some(expr10_0);
11928     }
11929     return None;
11930 }
11931 
11932 // Generated as internal constructor for term do_clz.
11933 pub fn constructor_do_clz<C: Context>(
11934     ctx: &mut C,
11935     arg0: Type,
11936     arg1: Type,
11937     arg2: Gpr,
11938 ) -> Option<Gpr> {
11939     let pattern0_0 = arg0;
11940     let pattern1_0 = arg1;
11941     let pattern2_0 = arg2;
11942     // Rule at src/isa/x64/lower.isle line 1816.
11943     let expr0_0: Type = I64;
11944     let expr1_0: i64 = -1;
11945     let expr2_0 = constructor_imm_i64(ctx, expr0_0, expr1_0)?;
11946     let expr3_0 = C::gpr_new(ctx, expr2_0);
11947     let expr4_0 = constructor_bsr_or_else(ctx, pattern0_0, pattern2_0, expr3_0)?;
11948     let expr5_0 = C::gpr_to_reg(ctx, expr4_0);
11949     let expr6_0 = C::ty_bits_u64(ctx, pattern1_0);
11950     let expr7_0: u64 = 1;
11951     let expr8_0 = C::u64_sub(ctx, expr6_0, expr7_0)?;
11952     let expr9_0 = constructor_imm(ctx, pattern0_0, expr8_0)?;
11953     let expr10_0 = C::gpr_new(ctx, expr9_0);
11954     let expr11_0 = constructor_reg_to_gpr_mem_imm(ctx, expr5_0)?;
11955     let expr12_0 = constructor_x64_sub(ctx, pattern0_0, expr10_0, &expr11_0)?;
11956     return Some(expr12_0);
11957 }
11958 
11959 // Generated as internal constructor for term do_ctz.
11960 pub fn constructor_do_ctz<C: Context>(
11961     ctx: &mut C,
11962     arg0: Type,
11963     arg1: Type,
11964     arg2: Gpr,
11965 ) -> Option<Gpr> {
11966     let pattern0_0 = arg0;
11967     let pattern1_0 = arg1;
11968     let pattern2_0 = arg2;
11969     // Rule at src/isa/x64/lower.isle line 1857.
11970     let expr0_0: Type = I64;
11971     let expr1_0 = C::ty_bits_u64(ctx, pattern1_0);
11972     let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?;
11973     let expr3_0 = C::gpr_new(ctx, expr2_0);
11974     let expr4_0 = constructor_bsf_or_else(ctx, pattern0_0, pattern2_0, expr3_0)?;
11975     return Some(expr4_0);
11976 }
11977 
11978 // Generated as internal constructor for term do_popcnt.
11979 pub fn constructor_do_popcnt<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
11980     let pattern0_0 = arg0;
11981     if pattern0_0 == I32 {
11982         let pattern2_0 = arg1;
11983         // Rule at src/isa/x64/lower.isle line 1948.
11984         let expr0_0: Type = I32;
11985         let expr1_0: u8 = 1;
11986         let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 };
11987         let expr3_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr2_0);
11988         let expr4_0 = constructor_x64_shr(ctx, expr0_0, pattern2_0, &expr3_0)?;
11989         let expr5_0: Type = I32;
11990         let expr6_0: u64 = 2004318071;
11991         let expr7_0 = constructor_imm(ctx, expr5_0, expr6_0)?;
11992         let expr8_0 = C::gpr_new(ctx, expr7_0);
11993         let expr9_0: Type = I32;
11994         let expr10_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0);
11995         let expr11_0 = constructor_x64_and(ctx, expr9_0, expr4_0, &expr10_0)?;
11996         let expr12_0: Type = I32;
11997         let expr13_0 = C::gpr_to_gpr_mem_imm(ctx, expr11_0);
11998         let expr14_0 = constructor_x64_sub(ctx, expr12_0, pattern2_0, &expr13_0)?;
11999         let expr15_0: Type = I32;
12000         let expr16_0: u8 = 1;
12001         let expr17_0 = Imm8Reg::Imm8 { imm: expr16_0 };
12002         let expr18_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr17_0);
12003         let expr19_0 = constructor_x64_shr(ctx, expr15_0, expr11_0, &expr18_0)?;
12004         let expr20_0: Type = I32;
12005         let expr21_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0);
12006         let expr22_0 = constructor_x64_and(ctx, expr20_0, expr19_0, &expr21_0)?;
12007         let expr23_0: Type = I32;
12008         let expr24_0 = C::gpr_to_gpr_mem_imm(ctx, expr22_0);
12009         let expr25_0 = constructor_x64_sub(ctx, expr23_0, expr14_0, &expr24_0)?;
12010         let expr26_0: Type = I32;
12011         let expr27_0: u8 = 1;
12012         let expr28_0 = Imm8Reg::Imm8 { imm: expr27_0 };
12013         let expr29_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr28_0);
12014         let expr30_0 = constructor_x64_shr(ctx, expr26_0, expr22_0, &expr29_0)?;
12015         let expr31_0: Type = I32;
12016         let expr32_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0);
12017         let expr33_0 = constructor_x64_and(ctx, expr31_0, expr30_0, &expr32_0)?;
12018         let expr34_0: Type = I32;
12019         let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr33_0);
12020         let expr36_0 = constructor_x64_sub(ctx, expr34_0, expr25_0, &expr35_0)?;
12021         let expr37_0: Type = I32;
12022         let expr38_0: Type = I32;
12023         let expr39_0: u8 = 4;
12024         let expr40_0 = Imm8Reg::Imm8 { imm: expr39_0 };
12025         let expr41_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr40_0);
12026         let expr42_0 = constructor_x64_shr(ctx, expr38_0, expr36_0, &expr41_0)?;
12027         let expr43_0 = C::gpr_to_gpr_mem_imm(ctx, expr36_0);
12028         let expr44_0 = constructor_x64_add(ctx, expr37_0, expr42_0, &expr43_0)?;
12029         let expr45_0: Type = I32;
12030         let expr46_0: u32 = 252645135;
12031         let expr47_0 = RegMemImm::Imm { simm32: expr46_0 };
12032         let expr48_0 = C::gpr_mem_imm_new(ctx, &expr47_0);
12033         let expr49_0 = constructor_x64_and(ctx, expr45_0, expr44_0, &expr48_0)?;
12034         let expr50_0: Type = I32;
12035         let expr51_0: u32 = 16843009;
12036         let expr52_0 = RegMemImm::Imm { simm32: expr51_0 };
12037         let expr53_0 = C::gpr_mem_imm_new(ctx, &expr52_0);
12038         let expr54_0 = constructor_x64_mul(ctx, expr50_0, expr49_0, &expr53_0)?;
12039         let expr55_0: Type = I32;
12040         let expr56_0: u8 = 24;
12041         let expr57_0 = Imm8Reg::Imm8 { imm: expr56_0 };
12042         let expr58_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr57_0);
12043         let expr59_0 = constructor_x64_shr(ctx, expr55_0, expr54_0, &expr58_0)?;
12044         return Some(expr59_0);
12045     }
12046     if pattern0_0 == I64 {
12047         let pattern2_0 = arg1;
12048         // Rule at src/isa/x64/lower.isle line 1905.
12049         let expr0_0: Type = I64;
12050         let expr1_0: u8 = 1;
12051         let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 };
12052         let expr3_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr2_0);
12053         let expr4_0 = constructor_x64_shr(ctx, expr0_0, pattern2_0, &expr3_0)?;
12054         let expr5_0: Type = I64;
12055         let expr6_0: u64 = 8608480567731124087;
12056         let expr7_0 = constructor_imm(ctx, expr5_0, expr6_0)?;
12057         let expr8_0 = C::gpr_new(ctx, expr7_0);
12058         let expr9_0: Type = I64;
12059         let expr10_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0);
12060         let expr11_0 = constructor_x64_and(ctx, expr9_0, expr4_0, &expr10_0)?;
12061         let expr12_0: Type = I64;
12062         let expr13_0 = C::gpr_to_gpr_mem_imm(ctx, expr11_0);
12063         let expr14_0 = constructor_x64_sub(ctx, expr12_0, pattern2_0, &expr13_0)?;
12064         let expr15_0: Type = I64;
12065         let expr16_0: u8 = 1;
12066         let expr17_0 = Imm8Reg::Imm8 { imm: expr16_0 };
12067         let expr18_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr17_0);
12068         let expr19_0 = constructor_x64_shr(ctx, expr15_0, expr11_0, &expr18_0)?;
12069         let expr20_0: Type = I64;
12070         let expr21_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0);
12071         let expr22_0 = constructor_x64_and(ctx, expr20_0, expr19_0, &expr21_0)?;
12072         let expr23_0: Type = I64;
12073         let expr24_0 = C::gpr_to_gpr_mem_imm(ctx, expr22_0);
12074         let expr25_0 = constructor_x64_sub(ctx, expr23_0, expr14_0, &expr24_0)?;
12075         let expr26_0: Type = I64;
12076         let expr27_0: u8 = 1;
12077         let expr28_0 = Imm8Reg::Imm8 { imm: expr27_0 };
12078         let expr29_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr28_0);
12079         let expr30_0 = constructor_x64_shr(ctx, expr26_0, expr22_0, &expr29_0)?;
12080         let expr31_0: Type = I64;
12081         let expr32_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0);
12082         let expr33_0 = constructor_x64_and(ctx, expr31_0, expr30_0, &expr32_0)?;
12083         let expr34_0: Type = I64;
12084         let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr33_0);
12085         let expr36_0 = constructor_x64_sub(ctx, expr34_0, expr25_0, &expr35_0)?;
12086         let expr37_0: Type = I64;
12087         let expr38_0: Type = I64;
12088         let expr39_0: u8 = 4;
12089         let expr40_0 = Imm8Reg::Imm8 { imm: expr39_0 };
12090         let expr41_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr40_0);
12091         let expr42_0 = constructor_x64_shr(ctx, expr38_0, expr36_0, &expr41_0)?;
12092         let expr43_0 = C::gpr_to_gpr_mem_imm(ctx, expr36_0);
12093         let expr44_0 = constructor_x64_add(ctx, expr37_0, expr42_0, &expr43_0)?;
12094         let expr45_0: Type = I64;
12095         let expr46_0: u64 = 1085102592571150095;
12096         let expr47_0 = constructor_imm(ctx, expr45_0, expr46_0)?;
12097         let expr48_0 = C::gpr_new(ctx, expr47_0);
12098         let expr49_0: Type = I64;
12099         let expr50_0 = C::gpr_to_gpr_mem_imm(ctx, expr48_0);
12100         let expr51_0 = constructor_x64_and(ctx, expr49_0, expr44_0, &expr50_0)?;
12101         let expr52_0: Type = I64;
12102         let expr53_0: u64 = 72340172838076673;
12103         let expr54_0 = constructor_imm(ctx, expr52_0, expr53_0)?;
12104         let expr55_0 = C::gpr_new(ctx, expr54_0);
12105         let expr56_0: Type = I64;
12106         let expr57_0 = C::gpr_to_gpr_mem_imm(ctx, expr55_0);
12107         let expr58_0 = constructor_x64_mul(ctx, expr56_0, expr51_0, &expr57_0)?;
12108         let expr59_0: Type = I64;
12109         let expr60_0: u8 = 56;
12110         let expr61_0 = Imm8Reg::Imm8 { imm: expr60_0 };
12111         let expr62_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr61_0);
12112         let expr63_0 = constructor_x64_shr(ctx, expr59_0, expr58_0, &expr62_0)?;
12113         return Some(expr63_0);
12114     }
12115     return None;
12116 }
12117 
12118 // Generated as internal constructor for term do_bitrev8.
12119 pub fn constructor_do_bitrev8<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
12120     let pattern0_0 = arg0;
12121     let pattern1_0 = arg1;
12122     // Rule at src/isa/x64/lower.isle line 2037.
12123     let expr0_0 = C::ty_mask(ctx, pattern0_0);
12124     let expr1_0: u64 = 6148914691236517205;
12125     let expr2_0 = C::u64_and(ctx, expr0_0, expr1_0)?;
12126     let expr3_0 = constructor_imm(ctx, pattern0_0, expr2_0)?;
12127     let expr4_0 = C::gpr_new(ctx, expr3_0);
12128     let expr5_0 = C::gpr_to_gpr_mem_imm(ctx, expr4_0);
12129     let expr6_0 = constructor_x64_and(ctx, pattern0_0, pattern1_0, &expr5_0)?;
12130     let expr7_0: u8 = 1;
12131     let expr8_0 = Imm8Reg::Imm8 { imm: expr7_0 };
12132     let expr9_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr8_0);
12133     let expr10_0 = constructor_x64_shr(ctx, pattern0_0, pattern1_0, &expr9_0)?;
12134     let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr4_0);
12135     let expr12_0 = constructor_x64_and(ctx, pattern0_0, expr10_0, &expr11_0)?;
12136     let expr13_0: u8 = 1;
12137     let expr14_0 = Imm8Reg::Imm8 { imm: expr13_0 };
12138     let expr15_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr14_0);
12139     let expr16_0 = constructor_x64_shl(ctx, pattern0_0, expr6_0, &expr15_0)?;
12140     let expr17_0 = C::gpr_to_gpr_mem_imm(ctx, expr12_0);
12141     let expr18_0 = constructor_x64_or(ctx, pattern0_0, expr16_0, &expr17_0)?;
12142     let expr19_0: u64 = 3689348814741910323;
12143     let expr20_0 = C::u64_and(ctx, expr0_0, expr19_0)?;
12144     let expr21_0 = constructor_imm(ctx, pattern0_0, expr20_0)?;
12145     let expr22_0 = C::gpr_new(ctx, expr21_0);
12146     let expr23_0 = C::gpr_to_gpr_mem_imm(ctx, expr22_0);
12147     let expr24_0 = constructor_x64_and(ctx, pattern0_0, expr18_0, &expr23_0)?;
12148     let expr25_0: u8 = 2;
12149     let expr26_0 = Imm8Reg::Imm8 { imm: expr25_0 };
12150     let expr27_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr26_0);
12151     let expr28_0 = constructor_x64_shr(ctx, pattern0_0, expr18_0, &expr27_0)?;
12152     let expr29_0 = C::gpr_to_gpr_mem_imm(ctx, expr22_0);
12153     let expr30_0 = constructor_x64_and(ctx, pattern0_0, expr28_0, &expr29_0)?;
12154     let expr31_0: u8 = 2;
12155     let expr32_0 = Imm8Reg::Imm8 { imm: expr31_0 };
12156     let expr33_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr32_0);
12157     let expr34_0 = constructor_x64_shl(ctx, pattern0_0, expr24_0, &expr33_0)?;
12158     let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr30_0);
12159     let expr36_0 = constructor_x64_or(ctx, pattern0_0, expr34_0, &expr35_0)?;
12160     let expr37_0: u64 = 1085102592571150095;
12161     let expr38_0 = C::u64_and(ctx, expr0_0, expr37_0)?;
12162     let expr39_0 = constructor_imm(ctx, pattern0_0, expr38_0)?;
12163     let expr40_0 = C::gpr_new(ctx, expr39_0);
12164     let expr41_0 = C::gpr_to_gpr_mem_imm(ctx, expr40_0);
12165     let expr42_0 = constructor_x64_and(ctx, pattern0_0, expr36_0, &expr41_0)?;
12166     let expr43_0: u8 = 4;
12167     let expr44_0 = Imm8Reg::Imm8 { imm: expr43_0 };
12168     let expr45_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr44_0);
12169     let expr46_0 = constructor_x64_shr(ctx, pattern0_0, expr36_0, &expr45_0)?;
12170     let expr47_0 = C::gpr_to_gpr_mem_imm(ctx, expr40_0);
12171     let expr48_0 = constructor_x64_and(ctx, pattern0_0, expr46_0, &expr47_0)?;
12172     let expr49_0: u8 = 4;
12173     let expr50_0 = Imm8Reg::Imm8 { imm: expr49_0 };
12174     let expr51_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr50_0);
12175     let expr52_0 = constructor_x64_shl(ctx, pattern0_0, expr42_0, &expr51_0)?;
12176     let expr53_0 = C::gpr_to_gpr_mem_imm(ctx, expr48_0);
12177     let expr54_0 = constructor_x64_or(ctx, pattern0_0, expr52_0, &expr53_0)?;
12178     return Some(expr54_0);
12179 }
12180 
12181 // Generated as internal constructor for term do_bitrev16.
12182 pub fn constructor_do_bitrev16<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
12183     let pattern0_0 = arg0;
12184     let pattern1_0 = arg1;
12185     // Rule at src/isa/x64/lower.isle line 2060.
12186     let expr0_0 = constructor_do_bitrev8(ctx, pattern0_0, pattern1_0)?;
12187     let expr1_0 = C::ty_mask(ctx, pattern0_0);
12188     let expr2_0: u64 = 71777214294589695;
12189     let expr3_0 = C::u64_and(ctx, expr1_0, expr2_0)?;
12190     let expr4_0 = constructor_imm(ctx, pattern0_0, expr3_0)?;
12191     let expr5_0 = C::gpr_new(ctx, expr4_0);
12192     let expr6_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
12193     let expr7_0 = constructor_x64_and(ctx, pattern0_0, expr0_0, &expr6_0)?;
12194     let expr8_0: u8 = 8;
12195     let expr9_0 = Imm8Reg::Imm8 { imm: expr8_0 };
12196     let expr10_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr9_0);
12197     let expr11_0 = constructor_x64_shr(ctx, pattern0_0, expr0_0, &expr10_0)?;
12198     let expr12_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
12199     let expr13_0 = constructor_x64_and(ctx, pattern0_0, expr11_0, &expr12_0)?;
12200     let expr14_0: u8 = 8;
12201     let expr15_0 = Imm8Reg::Imm8 { imm: expr14_0 };
12202     let expr16_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr15_0);
12203     let expr17_0 = constructor_x64_shl(ctx, pattern0_0, expr7_0, &expr16_0)?;
12204     let expr18_0 = C::gpr_to_gpr_mem_imm(ctx, expr13_0);
12205     let expr19_0 = constructor_x64_or(ctx, pattern0_0, expr17_0, &expr18_0)?;
12206     return Some(expr19_0);
12207 }
12208 
12209 // Generated as internal constructor for term do_bitrev32.
12210 pub fn constructor_do_bitrev32<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
12211     let pattern0_0 = arg0;
12212     let pattern1_0 = arg1;
12213     // Rule at src/isa/x64/lower.isle line 2072.
12214     let expr0_0 = constructor_do_bitrev16(ctx, pattern0_0, pattern1_0)?;
12215     let expr1_0 = C::ty_mask(ctx, pattern0_0);
12216     let expr2_0: u64 = 281470681808895;
12217     let expr3_0 = C::u64_and(ctx, expr1_0, expr2_0)?;
12218     let expr4_0 = constructor_imm(ctx, pattern0_0, expr3_0)?;
12219     let expr5_0 = C::gpr_new(ctx, expr4_0);
12220     let expr6_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
12221     let expr7_0 = constructor_x64_and(ctx, pattern0_0, expr0_0, &expr6_0)?;
12222     let expr8_0: u8 = 16;
12223     let expr9_0 = Imm8Reg::Imm8 { imm: expr8_0 };
12224     let expr10_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr9_0);
12225     let expr11_0 = constructor_x64_shr(ctx, pattern0_0, expr0_0, &expr10_0)?;
12226     let expr12_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0);
12227     let expr13_0 = constructor_x64_and(ctx, pattern0_0, expr11_0, &expr12_0)?;
12228     let expr14_0: u8 = 16;
12229     let expr15_0 = Imm8Reg::Imm8 { imm: expr14_0 };
12230     let expr16_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr15_0);
12231     let expr17_0 = constructor_x64_shl(ctx, pattern0_0, expr7_0, &expr16_0)?;
12232     let expr18_0 = C::gpr_to_gpr_mem_imm(ctx, expr13_0);
12233     let expr19_0 = constructor_x64_or(ctx, pattern0_0, expr17_0, &expr18_0)?;
12234     return Some(expr19_0);
12235 }
12236 
12237 // Generated as internal constructor for term do_bitrev64.
12238 pub fn constructor_do_bitrev64<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> {
12239     let pattern0_0 = arg0;
12240     if pattern0_0 == I64 {
12241         let pattern2_0 = arg1;
12242         // Rule at src/isa/x64/lower.isle line 2084.
12243         let expr0_0 = constructor_do_bitrev32(ctx, pattern0_0, pattern2_0)?;
12244         let expr1_0: u64 = 4294967295;
12245         let expr2_0 = constructor_imm(ctx, pattern0_0, expr1_0)?;
12246         let expr3_0 = C::gpr_new(ctx, expr2_0);
12247         let expr4_0 = C::gpr_to_gpr_mem_imm(ctx, expr3_0);
12248         let expr5_0 = constructor_x64_and(ctx, pattern0_0, expr0_0, &expr4_0)?;
12249         let expr6_0: u8 = 32;
12250         let expr7_0 = Imm8Reg::Imm8 { imm: expr6_0 };
12251         let expr8_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr7_0);
12252         let expr9_0 = constructor_x64_shr(ctx, pattern0_0, expr0_0, &expr8_0)?;
12253         let expr10_0: u8 = 32;
12254         let expr11_0 = Imm8Reg::Imm8 { imm: expr10_0 };
12255         let expr12_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr11_0);
12256         let expr13_0 = constructor_x64_shl(ctx, pattern0_0, expr5_0, &expr12_0)?;
12257         let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0);
12258         let expr15_0 = constructor_x64_or(ctx, pattern0_0, expr13_0, &expr14_0)?;
12259         return Some(expr15_0);
12260     }
12261     return None;
12262 }
12263 
12264 // Generated as internal constructor for term generic_sextend.
12265 pub fn constructor_generic_sextend<C: Context>(
12266     ctx: &mut C,
12267     arg0: Value,
12268     arg1: Type,
12269     arg2: Type,
12270 ) -> Option<InstOutput> {
12271     let pattern0_0 = arg0;
12272     let pattern1_0 = arg1;
12273     if let Some(pattern2_0) = C::fits_in_32(ctx, pattern1_0) {
12274         let pattern3_0 = arg2;
12275         if let Some(pattern4_0) = C::fits_in_32(ctx, pattern3_0) {
12276             // Rule at src/isa/x64/lower.isle line 2204.
12277             let expr0_0: Type = I32;
12278             let expr1_0 = ExtendKind::Sign;
12279             let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?;
12280             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
12281             return Some(expr3_0);
12282         }
12283         if let Some(pattern4_0) = C::ty_int_bool_64(ctx, pattern3_0) {
12284             // Rule at src/isa/x64/lower.isle line 2200.
12285             let expr0_0: Type = I64;
12286             let expr1_0 = ExtendKind::Sign;
12287             let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?;
12288             let expr3_0 = constructor_output_gpr(ctx, expr2_0)?;
12289             return Some(expr3_0);
12290         }
12291         if let Some(pattern4_0) = C::ty_int_bool_128(ctx, pattern3_0) {
12292             // Rule at src/isa/x64/lower.isle line 2194.
12293             let expr0_0: Type = I64;
12294             let expr1_0 = ExtendKind::Sign;
12295             let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?;
12296             let expr3_0 = constructor_spread_sign_bit(ctx, expr2_0)?;
12297             let expr4_0 = C::gpr_to_reg(ctx, expr2_0);
12298             let expr5_0 = C::gpr_to_reg(ctx, expr3_0);
12299             let expr6_0 = C::value_regs(ctx, expr4_0, expr5_0);
12300             let expr7_0 = C::output(ctx, expr6_0);
12301             return Some(expr7_0);
12302         }
12303     }
12304     if let Some(pattern2_0) = C::ty_int_bool_64(ctx, pattern1_0) {
12305         let pattern3_0 = arg2;
12306         if let Some(pattern4_0) = C::ty_int_bool_128(ctx, pattern3_0) {
12307             // Rule at src/isa/x64/lower.isle line 2190.
12308             let expr0_0 = C::put_in_reg(ctx, pattern0_0);
12309             let expr1_0 = constructor_put_in_gpr(ctx, pattern0_0)?;
12310             let expr2_0 = constructor_spread_sign_bit(ctx, expr1_0)?;
12311             let expr3_0 = C::gpr_to_reg(ctx, expr2_0);
12312             let expr4_0 = C::value_regs(ctx, expr0_0, expr3_0);
12313             let expr5_0 = C::output(ctx, expr4_0);
12314             return Some(expr5_0);
12315         }
12316     }
12317     let pattern2_0 = arg2;
12318     if pattern2_0 == pattern1_0 {
12319         // Rule at src/isa/x64/lower.isle line 2180.
12320         let expr0_0 = constructor_output_value(ctx, pattern0_0)?;
12321         return Some(expr0_0);
12322     }
12323     return None;
12324 }
12325 
12326 // Generated as internal constructor for term spread_sign_bit.
12327 pub fn constructor_spread_sign_bit<C: Context>(ctx: &mut C, arg0: Gpr) -> Option<Gpr> {
12328     let pattern0_0 = arg0;
12329     // Rule at src/isa/x64/lower.isle line 2186.
12330     let expr0_0: Type = I64;
12331     let expr1_0: u8 = 63;
12332     let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 };
12333     let expr3_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr2_0);
12334     let expr4_0 = constructor_x64_sar(ctx, expr0_0, pattern0_0, &expr3_0)?;
12335     return Some(expr4_0);
12336 }
12337