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