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 temp_writable_reg(&mut self, arg0: Type) -> WritableReg; 29 fn invalid_reg(&mut self) -> Reg; 30 fn put_in_reg(&mut self, arg0: Value) -> Reg; 31 fn put_in_regs(&mut self, arg0: Value) -> ValueRegs; 32 fn value_regs_get(&mut self, arg0: ValueRegs, arg1: usize) -> Reg; 33 fn u8_as_u64(&mut self, arg0: u8) -> u64; 34 fn u16_as_u64(&mut self, arg0: u16) -> u64; 35 fn u32_as_u64(&mut self, arg0: u32) -> u64; 36 fn ty_bits(&mut self, arg0: Type) -> u8; 37 fn ty_bits_u16(&mut self, arg0: Type) -> u16; 38 fn ty_bytes(&mut self, arg0: Type) -> u16; 39 fn lane_type(&mut self, arg0: Type) -> Type; 40 fn fits_in_16(&mut self, arg0: Type) -> Option<Type>; 41 fn fits_in_32(&mut self, arg0: Type) -> Option<Type>; 42 fn fits_in_64(&mut self, arg0: Type) -> Option<Type>; 43 fn ty_32_or_64(&mut self, arg0: Type) -> Option<Type>; 44 fn ty_8_or_16(&mut self, arg0: Type) -> Option<Type>; 45 fn vec128(&mut self, arg0: Type) -> Option<Type>; 46 fn not_i64x2(&mut self, arg0: Type) -> Option<()>; 47 fn value_list_slice(&mut self, arg0: ValueList) -> ValueSlice; 48 fn unwrap_head_value_list_1(&mut self, arg0: ValueList) -> (Value, ValueSlice); 49 fn unwrap_head_value_list_2(&mut self, arg0: ValueList) -> (Value, Value, ValueSlice); 50 fn writable_reg_to_reg(&mut self, arg0: WritableReg) -> Reg; 51 fn u8_from_uimm8(&mut self, arg0: Uimm8) -> u8; 52 fn u64_from_imm64(&mut self, arg0: Imm64) -> u64; 53 fn nonzero_u64_from_imm64(&mut self, arg0: Imm64) -> Option<u64>; 54 fn u64_from_ieee32(&mut self, arg0: Ieee32) -> u64; 55 fn u64_from_ieee64(&mut self, arg0: Ieee64) -> u64; 56 fn inst_results(&mut self, arg0: Inst) -> ValueSlice; 57 fn first_result(&mut self, arg0: Inst) -> Option<Value>; 58 fn inst_data(&mut self, arg0: Inst) -> InstructionData; 59 fn value_type(&mut self, arg0: Value) -> Type; 60 fn multi_lane(&mut self, arg0: Type) -> Option<(u8, u16)>; 61 fn def_inst(&mut self, arg0: Value) -> Option<Inst>; 62 fn emit(&mut self, arg0: &MInst) -> Unit; 63 fn emit_safepoint(&mut self, arg0: &MInst) -> Unit; 64 fn trap_code_division_by_zero(&mut self) -> TrapCode; 65 fn trap_code_integer_overflow(&mut self) -> TrapCode; 66 fn trap_code_bad_conversion_to_integer(&mut self) -> TrapCode; 67 fn avoid_div_traps(&mut self, arg0: Type) -> Option<()>; 68 fn func_ref_data(&mut self, arg0: FuncRef) -> (SigRef, ExternalName, RelocDistance); 69 fn symbol_value_data( 70 &mut self, 71 arg0: GlobalValue, 72 ) -> Option<(ExternalName, RelocDistance, i64)>; 73 fn reloc_distance_near(&mut self, arg0: RelocDistance) -> Option<()>; 74 fn operand_size_of_type_32_64(&mut self, arg0: Type) -> OperandSize; 75 fn raw_operand_size_of_type(&mut self, arg0: Type) -> OperandSize; 76 fn put_in_reg_mem_imm(&mut self, arg0: Value) -> RegMemImm; 77 fn put_in_reg_mem(&mut self, arg0: Value) -> RegMem; 78 fn synthetic_amode_to_reg_mem(&mut self, arg0: &SyntheticAmode) -> RegMem; 79 fn amode_imm_reg_reg_shift(&mut self, arg0: u32, arg1: Gpr, arg2: Gpr, arg3: u8) -> Amode; 80 fn amode_to_synthetic_amode(&mut self, arg0: &Amode) -> SyntheticAmode; 81 fn put_masked_in_imm8_gpr(&mut self, arg0: Value, arg1: Type) -> Imm8Gpr; 82 fn encode_fcmp_imm(&mut self, arg0: &FcmpImm) -> u8; 83 fn imm8_reg_to_imm8_gpr(&mut self, arg0: &Imm8Reg) -> Imm8Gpr; 84 fn writable_gpr_to_reg(&mut self, arg0: WritableGpr) -> WritableReg; 85 fn writable_xmm_to_reg(&mut self, arg0: WritableXmm) -> WritableReg; 86 fn writable_reg_to_xmm(&mut self, arg0: WritableReg) -> WritableXmm; 87 fn writable_xmm_to_xmm(&mut self, arg0: WritableXmm) -> Xmm; 88 fn writable_gpr_to_gpr(&mut self, arg0: WritableGpr) -> Gpr; 89 fn gpr_to_reg(&mut self, arg0: Gpr) -> Reg; 90 fn gpr_to_gpr_mem(&mut self, arg0: Gpr) -> GprMem; 91 fn gpr_to_gpr_mem_imm(&mut self, arg0: Gpr) -> GprMemImm; 92 fn xmm_to_reg(&mut self, arg0: Xmm) -> Reg; 93 fn xmm_to_xmm_mem_imm(&mut self, arg0: Xmm) -> XmmMemImm; 94 fn temp_writable_gpr(&mut self) -> WritableGpr; 95 fn temp_writable_xmm(&mut self) -> WritableXmm; 96 fn reg_mem_to_xmm_mem(&mut self, arg0: &RegMem) -> XmmMem; 97 fn gpr_mem_imm_new(&mut self, arg0: &RegMemImm) -> GprMemImm; 98 fn xmm_mem_imm_new(&mut self, arg0: &RegMemImm) -> XmmMemImm; 99 fn xmm_to_xmm_mem(&mut self, arg0: Xmm) -> XmmMem; 100 fn xmm_mem_to_reg_mem(&mut self, arg0: &XmmMem) -> RegMem; 101 fn gpr_mem_to_reg_mem(&mut self, arg0: &GprMem) -> RegMem; 102 fn xmm_new(&mut self, arg0: Reg) -> Xmm; 103 fn gpr_new(&mut self, arg0: Reg) -> Gpr; 104 fn reg_mem_to_gpr_mem(&mut self, arg0: &RegMem) -> GprMem; 105 fn reg_to_gpr_mem(&mut self, arg0: Reg) -> GprMem; 106 fn gpr_to_imm8_gpr(&mut self, arg0: Gpr) -> Imm8Gpr; 107 fn imm8_to_imm8_gpr(&mut self, arg0: u8) -> Imm8Gpr; 108 fn xmm0(&mut self) -> WritableXmm; 109 fn avx512vl_enabled(&mut self, arg0: Type) -> Option<()>; 110 fn avx512dq_enabled(&mut self, arg0: Type) -> Option<()>; 111 fn avx512f_enabled(&mut self, arg0: Type) -> Option<()>; 112 fn imm8_from_value(&mut self, arg0: Value) -> Option<Imm8Reg>; 113 fn const_to_type_masked_imm8(&mut self, arg0: u64, arg1: Type) -> Imm8Gpr; 114 fn simm32_from_value(&mut self, arg0: Value) -> Option<GprMemImm>; 115 fn simm32_from_imm64(&mut self, arg0: Imm64) -> Option<GprMemImm>; 116 fn sinkable_load(&mut self, arg0: Value) -> Option<SinkableLoad>; 117 fn sink_load(&mut self, arg0: &SinkableLoad) -> RegMemImm; 118 fn ext_mode(&mut self, arg0: u16, arg1: u16) -> ExtMode; 119 fn nonzero_u64_fits_in_u32(&mut self, arg0: u64) -> Option<u64>; 120 fn ishl_i8x16_mask_for_const(&mut self, arg0: u32) -> SyntheticAmode; 121 fn ishl_i8x16_mask_table(&mut self) -> SyntheticAmode; 122 fn ushr_i8x16_mask_for_const(&mut self, arg0: u32) -> SyntheticAmode; 123 fn ushr_i8x16_mask_table(&mut self) -> SyntheticAmode; 124 fn sse_insertps_lane_imm(&mut self, arg0: u8) -> u8; 125 } 126 127 /// Internal type SideEffectNoResult: defined at src/prelude.isle line 308. 128 #[derive(Clone, Debug)] 129 pub enum SideEffectNoResult { 130 Inst { inst: MInst }, 131 } 132 133 /// Internal type ProducesFlags: defined at src/prelude.isle line 327. 134 #[derive(Clone, Debug)] 135 pub enum ProducesFlags { 136 ProducesFlags { inst: MInst, result: Reg }, 137 } 138 139 /// Internal type ConsumesFlags: defined at src/prelude.isle line 330. 140 #[derive(Clone, Debug)] 141 pub enum ConsumesFlags { 142 ConsumesFlags { inst: MInst, result: Reg }, 143 } 144 145 /// Internal type MInst: defined at src/isa/x64/inst.isle line 8. 146 #[derive(Clone)] 147 pub enum MInst { 148 Nop { 149 len: u8, 150 }, 151 AluRmiR { 152 size: OperandSize, 153 op: AluRmiROpcode, 154 src1: Gpr, 155 src2: GprMemImm, 156 dst: WritableGpr, 157 }, 158 UnaryRmR { 159 size: OperandSize, 160 op: UnaryRmROpcode, 161 src: GprMem, 162 dst: WritableGpr, 163 }, 164 Not { 165 size: OperandSize, 166 src: Gpr, 167 dst: WritableGpr, 168 }, 169 Neg { 170 size: OperandSize, 171 src: Gpr, 172 dst: WritableGpr, 173 }, 174 Div { 175 size: OperandSize, 176 signed: bool, 177 divisor: GprMem, 178 dividend: Gpr, 179 dst_quotient: WritableGpr, 180 dst_remainder: WritableGpr, 181 }, 182 MulHi { 183 size: OperandSize, 184 signed: bool, 185 src1: Gpr, 186 src2: GprMem, 187 dst_lo: WritableGpr, 188 dst_hi: WritableGpr, 189 }, 190 CheckedDivOrRemSeq { 191 kind: DivOrRemKind, 192 size: OperandSize, 193 dividend: Gpr, 194 divisor: WritableGpr, 195 dst_quotient: WritableGpr, 196 dst_remainder: WritableGpr, 197 tmp: OptionWritableGpr, 198 }, 199 SignExtendData { 200 size: OperandSize, 201 src: Gpr, 202 dst: WritableGpr, 203 }, 204 Imm { 205 dst_size: OperandSize, 206 simm64: u64, 207 dst: WritableGpr, 208 }, 209 MovRR { 210 size: OperandSize, 211 src: Gpr, 212 dst: WritableGpr, 213 }, 214 MovzxRmR { 215 ext_mode: ExtMode, 216 src: GprMem, 217 dst: WritableGpr, 218 }, 219 Mov64MR { 220 src: SyntheticAmode, 221 dst: WritableGpr, 222 }, 223 LoadEffectiveAddress { 224 addr: SyntheticAmode, 225 dst: WritableGpr, 226 }, 227 MovsxRmR { 228 ext_mode: ExtMode, 229 src: GprMem, 230 dst: WritableGpr, 231 }, 232 MovRM { 233 size: OperandSize, 234 src: Gpr, 235 dst: SyntheticAmode, 236 }, 237 ShiftR { 238 size: OperandSize, 239 kind: ShiftKind, 240 src: Gpr, 241 num_bits: Imm8Gpr, 242 dst: WritableGpr, 243 }, 244 XmmRmiReg { 245 opcode: SseOpcode, 246 src1: Xmm, 247 src2: XmmMemImm, 248 dst: WritableXmm, 249 }, 250 CmpRmiR { 251 size: OperandSize, 252 opcode: CmpOpcode, 253 src: GprMemImm, 254 dst: Gpr, 255 }, 256 Setcc { 257 cc: CC, 258 dst: WritableGpr, 259 }, 260 Cmove { 261 size: OperandSize, 262 cc: CC, 263 consequent: GprMem, 264 alternative: Gpr, 265 dst: WritableGpr, 266 }, 267 Push64 { 268 src: GprMemImm, 269 }, 270 Pop64 { 271 dst: WritableGpr, 272 }, 273 XmmRmR { 274 op: SseOpcode, 275 src1: Xmm, 276 src2: XmmMem, 277 dst: WritableXmm, 278 }, 279 XmmRmREvex { 280 op: Avx512Opcode, 281 src1: XmmMem, 282 src2: Xmm, 283 dst: WritableXmm, 284 }, 285 XmmUnaryRmR { 286 op: SseOpcode, 287 src: XmmMem, 288 dst: WritableXmm, 289 }, 290 XmmUnaryRmREvex { 291 op: Avx512Opcode, 292 src: XmmMem, 293 dst: WritableXmm, 294 }, 295 XmmMovRM { 296 op: SseOpcode, 297 src: Reg, 298 dst: SyntheticAmode, 299 }, 300 XmmLoadConst { 301 src: VCodeConstant, 302 dst: WritableReg, 303 ty: Type, 304 }, 305 XmmToGpr { 306 op: SseOpcode, 307 src: Xmm, 308 dst: WritableGpr, 309 dst_size: OperandSize, 310 }, 311 GprToXmm { 312 op: SseOpcode, 313 src: GprMem, 314 dst: WritableXmm, 315 src_size: OperandSize, 316 }, 317 CvtUint64ToFloatSeq { 318 dst_size: OperandSize, 319 src: WritableGpr, 320 dst: WritableXmm, 321 tmp_gpr1: WritableGpr, 322 tmp_gpr2: WritableGpr, 323 }, 324 CvtFloatToSintSeq { 325 dst_size: OperandSize, 326 src_size: OperandSize, 327 is_saturating: bool, 328 src: WritableXmm, 329 dst: WritableGpr, 330 tmp_gpr: WritableGpr, 331 tmp_xmm: WritableXmm, 332 }, 333 CvtFloatToUintSeq { 334 dst_size: OperandSize, 335 src_size: OperandSize, 336 is_saturating: bool, 337 src: WritableXmm, 338 dst: WritableGpr, 339 tmp_gpr: WritableGpr, 340 tmp_xmm: WritableXmm, 341 }, 342 XmmMinMaxSeq { 343 size: OperandSize, 344 is_min: bool, 345 lhs: Xmm, 346 rhs_dst: WritableXmm, 347 }, 348 XmmCmove { 349 size: OperandSize, 350 cc: CC, 351 src: XmmMem, 352 dst: WritableXmm, 353 }, 354 XmmCmpRmR { 355 op: SseOpcode, 356 src: XmmMem, 357 dst: Xmm, 358 }, 359 XmmRmRImm { 360 op: SseOpcode, 361 src1: Reg, 362 src2: RegMem, 363 dst: WritableReg, 364 imm: u8, 365 size: OperandSize, 366 }, 367 CallKnown { 368 dest: ExternalName, 369 uses: VecReg, 370 defs: VecWritableReg, 371 opcode: Opcode, 372 }, 373 CallUnknown { 374 dest: RegMem, 375 uses: VecReg, 376 defs: VecWritableReg, 377 opcode: Opcode, 378 }, 379 Ret, 380 EpiloguePlaceholder, 381 JmpKnown { 382 dst: MachLabel, 383 }, 384 JmpIf { 385 cc: CC, 386 taken: MachLabel, 387 }, 388 JmpCond { 389 cc: CC, 390 taken: MachLabel, 391 not_taken: MachLabel, 392 }, 393 JmpTableSeq { 394 idx: Reg, 395 tmp1: WritableReg, 396 tmp2: WritableReg, 397 default_target: MachLabel, 398 targets: VecMachLabel, 399 targets_for_term: VecMachLabel, 400 }, 401 JmpUnknown { 402 target: RegMem, 403 }, 404 TrapIf { 405 cc: CC, 406 trap_code: TrapCode, 407 }, 408 Hlt, 409 Ud2 { 410 trap_code: TrapCode, 411 }, 412 LoadExtName { 413 dst: WritableReg, 414 name: BoxExternalName, 415 offset: i64, 416 }, 417 LockCmpxchg { 418 ty: Type, 419 replacement: Reg, 420 expected: Reg, 421 mem: SyntheticAmode, 422 dst_old: WritableReg, 423 }, 424 AtomicRmwSeq { 425 ty: Type, 426 op: AtomicRmwOp, 427 address: Reg, 428 operand: Reg, 429 temp: WritableReg, 430 dst_old: WritableReg, 431 }, 432 Fence { 433 kind: FenceKind, 434 }, 435 VirtualSPOffsetAdj { 436 offset: i64, 437 }, 438 XmmUninitializedValue { 439 dst: WritableXmm, 440 }, 441 ElfTlsGetAddr { 442 symbol: ExternalName, 443 }, 444 MachOTlsGetAddr { 445 symbol: ExternalName, 446 }, 447 ValueLabelMarker { 448 reg: Reg, 449 label: ValueLabel, 450 }, 451 Unwind { 452 inst: UnwindInst, 453 }, 454 } 455 456 /// Internal type ExtendKind: defined at src/isa/x64/inst.isle line 1089. 457 #[derive(Copy, Clone, PartialEq, Eq, Debug)] 458 pub enum ExtendKind { 459 Sign, 460 Zero, 461 } 462 463 // Generated as internal constructor for term temp_reg. 464 pub fn constructor_temp_reg<C: Context>(ctx: &mut C, arg0: Type) -> Option<Reg> { 465 let pattern0_0 = arg0; 466 // Rule at src/prelude.isle line 73. 467 let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); 468 let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0); 469 return Some(expr1_0); 470 } 471 472 // Generated as internal constructor for term lo_reg. 473 pub fn constructor_lo_reg<C: Context>(ctx: &mut C, arg0: Value) -> Option<Reg> { 474 let pattern0_0 = arg0; 475 // Rule at src/prelude.isle line 108. 476 let expr0_0 = C::put_in_regs(ctx, pattern0_0); 477 let expr1_0: usize = 0; 478 let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); 479 return Some(expr2_0); 480 } 481 482 // Generated as internal constructor for term value_regs_none. 483 pub fn constructor_value_regs_none<C: Context>( 484 ctx: &mut C, 485 arg0: &SideEffectNoResult, 486 ) -> Option<ValueRegs> { 487 let pattern0_0 = arg0; 488 if let &SideEffectNoResult::Inst { 489 inst: ref pattern1_0, 490 } = pattern0_0 491 { 492 // Rule at src/prelude.isle line 313. 493 let expr0_0 = C::emit(ctx, &pattern1_0); 494 let expr1_0 = C::value_regs_invalid(ctx); 495 return Some(expr1_0); 496 } 497 return None; 498 } 499 500 // Generated as internal constructor for term safepoint. 501 pub fn constructor_safepoint<C: Context>( 502 ctx: &mut C, 503 arg0: &SideEffectNoResult, 504 ) -> Option<ValueRegs> { 505 let pattern0_0 = arg0; 506 if let &SideEffectNoResult::Inst { 507 inst: ref pattern1_0, 508 } = pattern0_0 509 { 510 // Rule at src/prelude.isle line 319. 511 let expr0_0 = C::emit_safepoint(ctx, &pattern1_0); 512 let expr1_0 = C::value_regs_invalid(ctx); 513 return Some(expr1_0); 514 } 515 return None; 516 } 517 518 // Generated as internal constructor for term with_flags. 519 pub fn constructor_with_flags<C: Context>( 520 ctx: &mut C, 521 arg0: &ProducesFlags, 522 arg1: &ConsumesFlags, 523 ) -> Option<ValueRegs> { 524 let pattern0_0 = arg0; 525 if let &ProducesFlags::ProducesFlags { 526 inst: ref pattern1_0, 527 result: pattern1_1, 528 } = pattern0_0 529 { 530 let pattern2_0 = arg1; 531 if let &ConsumesFlags::ConsumesFlags { 532 inst: ref pattern3_0, 533 result: pattern3_1, 534 } = pattern2_0 535 { 536 // Rule at src/prelude.isle line 340. 537 let expr0_0 = C::emit(ctx, &pattern1_0); 538 let expr1_0 = C::emit(ctx, &pattern3_0); 539 let expr2_0 = C::value_regs(ctx, pattern1_1, pattern3_1); 540 return Some(expr2_0); 541 } 542 } 543 return None; 544 } 545 546 // Generated as internal constructor for term with_flags_1. 547 pub fn constructor_with_flags_1<C: Context>( 548 ctx: &mut C, 549 arg0: &ProducesFlags, 550 arg1: &ConsumesFlags, 551 ) -> Option<Reg> { 552 let pattern0_0 = arg0; 553 if let &ProducesFlags::ProducesFlags { 554 inst: ref pattern1_0, 555 result: pattern1_1, 556 } = pattern0_0 557 { 558 let pattern2_0 = arg1; 559 if let &ConsumesFlags::ConsumesFlags { 560 inst: ref pattern3_0, 561 result: pattern3_1, 562 } = pattern2_0 563 { 564 // Rule at src/prelude.isle line 348. 565 let expr0_0 = C::emit(ctx, &pattern1_0); 566 let expr1_0 = C::emit(ctx, &pattern3_0); 567 return Some(pattern3_1); 568 } 569 } 570 return None; 571 } 572 573 // Generated as internal constructor for term with_flags_2. 574 pub fn constructor_with_flags_2<C: Context>( 575 ctx: &mut C, 576 arg0: &ProducesFlags, 577 arg1: &ConsumesFlags, 578 arg2: &ConsumesFlags, 579 ) -> Option<ValueRegs> { 580 let pattern0_0 = arg0; 581 if let &ProducesFlags::ProducesFlags { 582 inst: ref pattern1_0, 583 result: pattern1_1, 584 } = pattern0_0 585 { 586 let pattern2_0 = arg1; 587 if let &ConsumesFlags::ConsumesFlags { 588 inst: ref pattern3_0, 589 result: pattern3_1, 590 } = pattern2_0 591 { 592 let pattern4_0 = arg2; 593 if let &ConsumesFlags::ConsumesFlags { 594 inst: ref pattern5_0, 595 result: pattern5_1, 596 } = pattern4_0 597 { 598 // Rule at src/prelude.isle line 358. 599 let expr0_0 = C::emit(ctx, &pattern1_0); 600 let expr1_0 = C::emit(ctx, &pattern5_0); 601 let expr2_0 = C::emit(ctx, &pattern3_0); 602 let expr3_0 = C::value_regs(ctx, pattern3_1, pattern5_1); 603 return Some(expr3_0); 604 } 605 } 606 } 607 return None; 608 } 609 610 // Generated as internal constructor for term operand_size_bits. 611 pub fn constructor_operand_size_bits<C: Context>(ctx: &mut C, arg0: &OperandSize) -> Option<u16> { 612 let pattern0_0 = arg0; 613 match pattern0_0 { 614 &OperandSize::Size8 => { 615 // Rule at src/isa/x64/inst.isle line 509. 616 let expr0_0: u16 = 8; 617 return Some(expr0_0); 618 } 619 &OperandSize::Size16 => { 620 // Rule at src/isa/x64/inst.isle line 510. 621 let expr0_0: u16 = 16; 622 return Some(expr0_0); 623 } 624 &OperandSize::Size32 => { 625 // Rule at src/isa/x64/inst.isle line 511. 626 let expr0_0: u16 = 32; 627 return Some(expr0_0); 628 } 629 &OperandSize::Size64 => { 630 // Rule at src/isa/x64/inst.isle line 512. 631 let expr0_0: u16 = 64; 632 return Some(expr0_0); 633 } 634 _ => {} 635 } 636 return None; 637 } 638 639 // Generated as internal constructor for term put_in_gpr. 640 pub fn constructor_put_in_gpr<C: Context>(ctx: &mut C, arg0: Value) -> Option<Gpr> { 641 let pattern0_0 = arg0; 642 // Rule at src/isa/x64/inst.isle line 949. 643 let expr0_0 = C::put_in_reg(ctx, pattern0_0); 644 let expr1_0 = C::gpr_new(ctx, expr0_0); 645 return Some(expr1_0); 646 } 647 648 // Generated as internal constructor for term put_in_gpr_mem. 649 pub fn constructor_put_in_gpr_mem<C: Context>(ctx: &mut C, arg0: Value) -> Option<GprMem> { 650 let pattern0_0 = arg0; 651 // Rule at src/isa/x64/inst.isle line 956. 652 let expr0_0 = C::put_in_reg_mem(ctx, pattern0_0); 653 let expr1_0 = C::reg_mem_to_gpr_mem(ctx, &expr0_0); 654 return Some(expr1_0); 655 } 656 657 // Generated as internal constructor for term put_in_gpr_mem_imm. 658 pub fn constructor_put_in_gpr_mem_imm<C: Context>(ctx: &mut C, arg0: Value) -> Option<GprMemImm> { 659 let pattern0_0 = arg0; 660 // Rule at src/isa/x64/inst.isle line 963. 661 let expr0_0 = C::put_in_reg_mem_imm(ctx, pattern0_0); 662 let expr1_0 = C::gpr_mem_imm_new(ctx, &expr0_0); 663 return Some(expr1_0); 664 } 665 666 // Generated as internal constructor for term put_in_xmm. 667 pub fn constructor_put_in_xmm<C: Context>(ctx: &mut C, arg0: Value) -> Option<Xmm> { 668 let pattern0_0 = arg0; 669 // Rule at src/isa/x64/inst.isle line 970. 670 let expr0_0 = C::put_in_reg(ctx, pattern0_0); 671 let expr1_0 = C::xmm_new(ctx, expr0_0); 672 return Some(expr1_0); 673 } 674 675 // Generated as internal constructor for term put_in_xmm_mem. 676 pub fn constructor_put_in_xmm_mem<C: Context>(ctx: &mut C, arg0: Value) -> Option<XmmMem> { 677 let pattern0_0 = arg0; 678 // Rule at src/isa/x64/inst.isle line 977. 679 let expr0_0 = C::put_in_reg_mem(ctx, pattern0_0); 680 let expr1_0 = C::reg_mem_to_xmm_mem(ctx, &expr0_0); 681 return Some(expr1_0); 682 } 683 684 // Generated as internal constructor for term put_in_xmm_mem_imm. 685 pub fn constructor_put_in_xmm_mem_imm<C: Context>(ctx: &mut C, arg0: Value) -> Option<XmmMemImm> { 686 let pattern0_0 = arg0; 687 // Rule at src/isa/x64/inst.isle line 984. 688 let expr0_0 = C::put_in_reg_mem_imm(ctx, pattern0_0); 689 let expr1_0 = C::xmm_mem_imm_new(ctx, &expr0_0); 690 return Some(expr1_0); 691 } 692 693 // Generated as internal constructor for term value_gpr. 694 pub fn constructor_value_gpr<C: Context>(ctx: &mut C, arg0: Gpr) -> Option<ValueRegs> { 695 let pattern0_0 = arg0; 696 // Rule at src/isa/x64/inst.isle line 989. 697 let expr0_0 = C::gpr_to_reg(ctx, pattern0_0); 698 let expr1_0 = C::value_reg(ctx, expr0_0); 699 return Some(expr1_0); 700 } 701 702 // Generated as internal constructor for term value_gprs. 703 pub fn constructor_value_gprs<C: Context>(ctx: &mut C, arg0: Gpr, arg1: Gpr) -> Option<ValueRegs> { 704 let pattern0_0 = arg0; 705 let pattern1_0 = arg1; 706 // Rule at src/isa/x64/inst.isle line 994. 707 let expr0_0 = C::gpr_to_reg(ctx, pattern0_0); 708 let expr1_0 = C::gpr_to_reg(ctx, pattern1_0); 709 let expr2_0 = C::value_regs(ctx, expr0_0, expr1_0); 710 return Some(expr2_0); 711 } 712 713 // Generated as internal constructor for term value_xmm. 714 pub fn constructor_value_xmm<C: Context>(ctx: &mut C, arg0: Xmm) -> Option<ValueRegs> { 715 let pattern0_0 = arg0; 716 // Rule at src/isa/x64/inst.isle line 999. 717 let expr0_0 = C::xmm_to_reg(ctx, pattern0_0); 718 let expr1_0 = C::value_reg(ctx, expr0_0); 719 return Some(expr1_0); 720 } 721 722 // Generated as internal constructor for term value_regs_get_gpr. 723 pub fn constructor_value_regs_get_gpr<C: Context>( 724 ctx: &mut C, 725 arg0: ValueRegs, 726 arg1: usize, 727 ) -> Option<Gpr> { 728 let pattern0_0 = arg0; 729 let pattern1_0 = arg1; 730 // Rule at src/isa/x64/inst.isle line 1006. 731 let expr0_0 = C::value_regs_get(ctx, pattern0_0, pattern1_0); 732 let expr1_0 = C::gpr_new(ctx, expr0_0); 733 return Some(expr1_0); 734 } 735 736 // Generated as internal constructor for term lo_gpr. 737 pub fn constructor_lo_gpr<C: Context>(ctx: &mut C, arg0: Value) -> Option<Gpr> { 738 let pattern0_0 = arg0; 739 // Rule at src/isa/x64/inst.isle line 1019. 740 let expr0_0 = constructor_lo_reg(ctx, pattern0_0)?; 741 let expr1_0 = C::gpr_new(ctx, expr0_0); 742 return Some(expr1_0); 743 } 744 745 // Generated as internal constructor for term sink_load_to_gpr_mem_imm. 746 pub fn constructor_sink_load_to_gpr_mem_imm<C: Context>( 747 ctx: &mut C, 748 arg0: &SinkableLoad, 749 ) -> Option<GprMemImm> { 750 let pattern0_0 = arg0; 751 // Rule at src/isa/x64/inst.isle line 1079. 752 let expr0_0 = C::sink_load(ctx, pattern0_0); 753 let expr1_0 = C::gpr_mem_imm_new(ctx, &expr0_0); 754 return Some(expr1_0); 755 } 756 757 // Generated as internal constructor for term extend_to_gpr. 758 pub fn constructor_extend_to_gpr<C: Context>( 759 ctx: &mut C, 760 arg0: Value, 761 arg1: Type, 762 arg2: &ExtendKind, 763 ) -> Option<Gpr> { 764 let pattern0_0 = arg0; 765 let pattern1_0 = C::value_type(ctx, pattern0_0); 766 let pattern2_0 = arg1; 767 if pattern2_0 == pattern1_0 { 768 let pattern4_0 = arg2; 769 // Rule at src/isa/x64/inst.isle line 1101. 770 let expr0_0 = constructor_put_in_gpr(ctx, pattern0_0)?; 771 return Some(expr0_0); 772 } 773 let pattern3_0 = arg2; 774 // Rule at src/isa/x64/inst.isle line 1104. 775 let expr0_0 = C::ty_bits_u16(ctx, pattern1_0); 776 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern2_0); 777 let expr2_0 = constructor_operand_size_bits(ctx, &expr1_0)?; 778 let expr3_0 = C::ext_mode(ctx, expr0_0, expr2_0); 779 let expr4_0 = constructor_put_in_gpr_mem(ctx, pattern0_0)?; 780 let expr5_0 = constructor_extend(ctx, pattern3_0, pattern2_0, &expr3_0, &expr4_0)?; 781 return Some(expr5_0); 782 } 783 784 // Generated as internal constructor for term extend. 785 pub fn constructor_extend<C: Context>( 786 ctx: &mut C, 787 arg0: &ExtendKind, 788 arg1: Type, 789 arg2: &ExtMode, 790 arg3: &GprMem, 791 ) -> Option<Gpr> { 792 let pattern0_0 = arg0; 793 match pattern0_0 { 794 &ExtendKind::Sign => { 795 let pattern2_0 = arg1; 796 let pattern3_0 = arg2; 797 let pattern4_0 = arg3; 798 // Rule at src/isa/x64/inst.isle line 1124. 799 let expr0_0 = constructor_movsx(ctx, pattern2_0, pattern3_0, pattern4_0)?; 800 return Some(expr0_0); 801 } 802 &ExtendKind::Zero => { 803 let pattern2_0 = arg1; 804 let pattern3_0 = arg2; 805 let pattern4_0 = arg3; 806 // Rule at src/isa/x64/inst.isle line 1120. 807 let expr0_0 = constructor_movzx(ctx, pattern2_0, pattern3_0, pattern4_0)?; 808 return Some(expr0_0); 809 } 810 _ => {} 811 } 812 return None; 813 } 814 815 // Generated as internal constructor for term sse_xor_op. 816 pub fn constructor_sse_xor_op<C: Context>(ctx: &mut C, arg0: Type) -> Option<SseOpcode> { 817 let pattern0_0 = arg0; 818 if pattern0_0 == F32X4 { 819 // Rule at src/isa/x64/inst.isle line 1131. 820 let expr0_0 = SseOpcode::Xorps; 821 return Some(expr0_0); 822 } 823 if pattern0_0 == F64X2 { 824 // Rule at src/isa/x64/inst.isle line 1132. 825 let expr0_0 = SseOpcode::Xorpd; 826 return Some(expr0_0); 827 } 828 if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { 829 // Rule at src/isa/x64/inst.isle line 1133. 830 let expr0_0 = SseOpcode::Pxor; 831 return Some(expr0_0); 832 } 833 return None; 834 } 835 836 // Generated as internal constructor for term sse_xor. 837 pub fn constructor_sse_xor<C: Context>( 838 ctx: &mut C, 839 arg0: Type, 840 arg1: Xmm, 841 arg2: &XmmMem, 842 ) -> Option<Xmm> { 843 let pattern0_0 = arg0; 844 let pattern1_0 = arg1; 845 let pattern2_0 = arg2; 846 // Rule at src/isa/x64/inst.isle line 1137. 847 let expr0_0 = constructor_sse_xor_op(ctx, pattern0_0)?; 848 let expr1_0 = constructor_xmm_rm_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 849 return Some(expr1_0); 850 } 851 852 // Generated as internal constructor for term sse_cmp_op. 853 pub fn constructor_sse_cmp_op<C: Context>(ctx: &mut C, arg0: Type) -> Option<SseOpcode> { 854 let pattern0_0 = arg0; 855 if pattern0_0 == F32X4 { 856 // Rule at src/isa/x64/inst.isle line 1146. 857 let expr0_0 = SseOpcode::Cmpps; 858 return Some(expr0_0); 859 } 860 if pattern0_0 == F64X2 { 861 // Rule at src/isa/x64/inst.isle line 1147. 862 let expr0_0 = SseOpcode::Cmppd; 863 return Some(expr0_0); 864 } 865 if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { 866 if pattern1_0 == 8 { 867 if pattern1_1 == 16 { 868 // Rule at src/isa/x64/inst.isle line 1142. 869 let expr0_0 = SseOpcode::Pcmpeqb; 870 return Some(expr0_0); 871 } 872 } 873 if pattern1_0 == 16 { 874 if pattern1_1 == 8 { 875 // Rule at src/isa/x64/inst.isle line 1143. 876 let expr0_0 = SseOpcode::Pcmpeqw; 877 return Some(expr0_0); 878 } 879 } 880 if pattern1_0 == 32 { 881 if pattern1_1 == 4 { 882 // Rule at src/isa/x64/inst.isle line 1144. 883 let expr0_0 = SseOpcode::Pcmpeqd; 884 return Some(expr0_0); 885 } 886 } 887 if pattern1_0 == 64 { 888 if pattern1_1 == 2 { 889 // Rule at src/isa/x64/inst.isle line 1145. 890 let expr0_0 = SseOpcode::Pcmpeqq; 891 return Some(expr0_0); 892 } 893 } 894 } 895 return None; 896 } 897 898 // Generated as internal constructor for term vector_all_ones. 899 pub fn constructor_vector_all_ones<C: Context>(ctx: &mut C, arg0: Type) -> Option<Xmm> { 900 let pattern0_0 = arg0; 901 // Rule at src/isa/x64/inst.isle line 1161. 902 let expr0_0 = C::temp_writable_xmm(ctx); 903 let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 904 let expr2_0: Type = I32X4; 905 let expr3_0 = constructor_sse_cmp_op(ctx, expr2_0)?; 906 let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 907 let expr5_0 = MInst::XmmRmR { 908 op: expr3_0, 909 src1: expr1_0, 910 src2: expr4_0, 911 dst: expr0_0, 912 }; 913 let expr6_0 = C::emit(ctx, &expr5_0); 914 return Some(expr1_0); 915 } 916 917 // Generated as internal constructor for term make_i64x2_from_lanes. 918 pub fn constructor_make_i64x2_from_lanes<C: Context>( 919 ctx: &mut C, 920 arg0: &GprMem, 921 arg1: &GprMem, 922 ) -> Option<Xmm> { 923 let pattern0_0 = arg0; 924 let pattern1_0 = arg1; 925 // Rule at src/isa/x64/inst.isle line 1172. 926 let expr0_0 = C::temp_writable_xmm(ctx); 927 let expr1_0 = C::writable_xmm_to_reg(ctx, expr0_0); 928 let expr2_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 929 let expr3_0 = C::xmm_to_reg(ctx, expr2_0); 930 let expr4_0 = MInst::XmmUninitializedValue { dst: expr0_0 }; 931 let expr5_0 = C::emit(ctx, &expr4_0); 932 let expr6_0 = SseOpcode::Pinsrd; 933 let expr7_0 = C::gpr_mem_to_reg_mem(ctx, pattern0_0); 934 let expr8_0: u8 = 0; 935 let expr9_0 = OperandSize::Size64; 936 let expr10_0 = MInst::XmmRmRImm { 937 op: expr6_0, 938 src1: expr3_0, 939 src2: expr7_0, 940 dst: expr1_0, 941 imm: expr8_0, 942 size: expr9_0, 943 }; 944 let expr11_0 = C::emit(ctx, &expr10_0); 945 let expr12_0 = SseOpcode::Pinsrd; 946 let expr13_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0); 947 let expr14_0: u8 = 1; 948 let expr15_0 = OperandSize::Size64; 949 let expr16_0 = MInst::XmmRmRImm { 950 op: expr12_0, 951 src1: expr3_0, 952 src2: expr13_0, 953 dst: expr1_0, 954 imm: expr14_0, 955 size: expr15_0, 956 }; 957 let expr17_0 = C::emit(ctx, &expr16_0); 958 return Some(expr2_0); 959 } 960 961 // Generated as internal constructor for term mov_rmi_to_xmm. 962 pub fn constructor_mov_rmi_to_xmm<C: Context>(ctx: &mut C, arg0: &RegMemImm) -> Option<XmmMemImm> { 963 let pattern0_0 = arg0; 964 match pattern0_0 { 965 &RegMemImm::Imm { simm32: pattern1_0 } => { 966 // Rule at src/isa/x64/inst.isle line 1195. 967 let expr0_0 = C::xmm_mem_imm_new(ctx, pattern0_0); 968 return Some(expr0_0); 969 } 970 &RegMemImm::Reg { reg: pattern1_0 } => { 971 // Rule at src/isa/x64/inst.isle line 1196. 972 let expr0_0 = SseOpcode::Movd; 973 let expr1_0 = C::reg_to_gpr_mem(ctx, pattern1_0); 974 let expr2_0 = OperandSize::Size32; 975 let expr3_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr1_0, &expr2_0)?; 976 let expr4_0 = C::xmm_to_xmm_mem_imm(ctx, expr3_0); 977 return Some(expr4_0); 978 } 979 &RegMemImm::Mem { 980 addr: ref pattern1_0, 981 } => { 982 // Rule at src/isa/x64/inst.isle line 1194. 983 let expr0_0 = C::xmm_mem_imm_new(ctx, pattern0_0); 984 return Some(expr0_0); 985 } 986 _ => {} 987 } 988 return None; 989 } 990 991 // Generated as internal constructor for term x64_load. 992 pub fn constructor_x64_load<C: Context>( 993 ctx: &mut C, 994 arg0: Type, 995 arg1: &SyntheticAmode, 996 arg2: &ExtKind, 997 ) -> Option<Reg> { 998 let pattern0_0 = arg0; 999 if pattern0_0 == I64 { 1000 let pattern2_0 = arg1; 1001 let pattern3_0 = arg2; 1002 // Rule at src/isa/x64/inst.isle line 1211. 1003 let expr0_0 = C::temp_writable_gpr(ctx); 1004 let expr1_0 = MInst::Mov64MR { 1005 src: pattern2_0.clone(), 1006 dst: expr0_0, 1007 }; 1008 let expr2_0 = C::emit(ctx, &expr1_0); 1009 let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 1010 let expr4_0 = C::gpr_to_reg(ctx, expr3_0); 1011 return Some(expr4_0); 1012 } 1013 if pattern0_0 == F32 { 1014 let pattern2_0 = arg1; 1015 let pattern3_0 = arg2; 1016 // Rule at src/isa/x64/inst.isle line 1216. 1017 let expr0_0 = SseOpcode::Movss; 1018 let expr1_0 = C::synthetic_amode_to_reg_mem(ctx, pattern2_0); 1019 let expr2_0 = C::reg_mem_to_xmm_mem(ctx, &expr1_0); 1020 let expr3_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr2_0)?; 1021 let expr4_0 = C::xmm_to_reg(ctx, expr3_0); 1022 return Some(expr4_0); 1023 } 1024 if pattern0_0 == F64 { 1025 let pattern2_0 = arg1; 1026 let pattern3_0 = arg2; 1027 // Rule at src/isa/x64/inst.isle line 1220. 1028 let expr0_0 = SseOpcode::Movsd; 1029 let expr1_0 = C::synthetic_amode_to_reg_mem(ctx, pattern2_0); 1030 let expr2_0 = C::reg_mem_to_xmm_mem(ctx, &expr1_0); 1031 let expr3_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr2_0)?; 1032 let expr4_0 = C::xmm_to_reg(ctx, expr3_0); 1033 return Some(expr4_0); 1034 } 1035 if pattern0_0 == F32X4 { 1036 let pattern2_0 = arg1; 1037 let pattern3_0 = arg2; 1038 // Rule at src/isa/x64/inst.isle line 1224. 1039 let expr0_0 = SseOpcode::Movups; 1040 let expr1_0 = C::synthetic_amode_to_reg_mem(ctx, pattern2_0); 1041 let expr2_0 = C::reg_mem_to_xmm_mem(ctx, &expr1_0); 1042 let expr3_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr2_0)?; 1043 let expr4_0 = C::xmm_to_reg(ctx, expr3_0); 1044 return Some(expr4_0); 1045 } 1046 if pattern0_0 == F64X2 { 1047 let pattern2_0 = arg1; 1048 let pattern3_0 = arg2; 1049 // Rule at src/isa/x64/inst.isle line 1228. 1050 let expr0_0 = SseOpcode::Movupd; 1051 let expr1_0 = C::synthetic_amode_to_reg_mem(ctx, pattern2_0); 1052 let expr2_0 = C::reg_mem_to_xmm_mem(ctx, &expr1_0); 1053 let expr3_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr2_0)?; 1054 let expr4_0 = C::xmm_to_reg(ctx, expr3_0); 1055 return Some(expr4_0); 1056 } 1057 if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { 1058 let pattern2_0 = arg1; 1059 let pattern3_0 = arg2; 1060 // Rule at src/isa/x64/inst.isle line 1232. 1061 let expr0_0 = SseOpcode::Movdqu; 1062 let expr1_0 = C::synthetic_amode_to_reg_mem(ctx, pattern2_0); 1063 let expr2_0 = C::reg_mem_to_xmm_mem(ctx, &expr1_0); 1064 let expr3_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr2_0)?; 1065 let expr4_0 = C::xmm_to_reg(ctx, expr3_0); 1066 return Some(expr4_0); 1067 } 1068 if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) { 1069 let pattern2_0 = arg1; 1070 let pattern3_0 = arg2; 1071 if let &ExtKind::SignExtend = pattern3_0 { 1072 // Rule at src/isa/x64/inst.isle line 1206. 1073 let expr0_0 = C::ty_bytes(ctx, pattern1_0); 1074 let expr1_0: u16 = 8; 1075 let expr2_0 = C::ext_mode(ctx, expr0_0, expr1_0); 1076 let expr3_0 = C::synthetic_amode_to_reg_mem(ctx, pattern2_0); 1077 let expr4_0 = C::reg_mem_to_gpr_mem(ctx, &expr3_0); 1078 let expr5_0 = constructor_movsx(ctx, pattern1_0, &expr2_0, &expr4_0)?; 1079 let expr6_0 = C::gpr_to_reg(ctx, expr5_0); 1080 return Some(expr6_0); 1081 } 1082 } 1083 return None; 1084 } 1085 1086 // Generated as internal constructor for term alu_rmi_r. 1087 pub fn constructor_alu_rmi_r<C: Context>( 1088 ctx: &mut C, 1089 arg0: Type, 1090 arg1: &AluRmiROpcode, 1091 arg2: Gpr, 1092 arg3: &GprMemImm, 1093 ) -> Option<Gpr> { 1094 let pattern0_0 = arg0; 1095 let pattern1_0 = arg1; 1096 let pattern2_0 = arg2; 1097 let pattern3_0 = arg3; 1098 // Rule at src/isa/x64/inst.isle line 1244. 1099 let expr0_0 = C::temp_writable_gpr(ctx); 1100 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 1101 let expr2_0 = MInst::AluRmiR { 1102 size: expr1_0, 1103 op: pattern1_0.clone(), 1104 src1: pattern2_0, 1105 src2: pattern3_0.clone(), 1106 dst: expr0_0, 1107 }; 1108 let expr3_0 = C::emit(ctx, &expr2_0); 1109 let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 1110 return Some(expr4_0); 1111 } 1112 1113 // Generated as internal constructor for term add. 1114 pub fn constructor_add<C: Context>( 1115 ctx: &mut C, 1116 arg0: Type, 1117 arg1: Gpr, 1118 arg2: &GprMemImm, 1119 ) -> Option<Gpr> { 1120 let pattern0_0 = arg0; 1121 let pattern1_0 = arg1; 1122 let pattern2_0 = arg2; 1123 // Rule at src/isa/x64/inst.isle line 1252. 1124 let expr0_0 = AluRmiROpcode::Add; 1125 let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 1126 return Some(expr1_0); 1127 } 1128 1129 // Generated as internal constructor for term add_with_flags. 1130 pub fn constructor_add_with_flags<C: Context>( 1131 ctx: &mut C, 1132 arg0: Type, 1133 arg1: Gpr, 1134 arg2: &GprMemImm, 1135 ) -> Option<ProducesFlags> { 1136 let pattern0_0 = arg0; 1137 let pattern1_0 = arg1; 1138 let pattern2_0 = arg2; 1139 // Rule at src/isa/x64/inst.isle line 1260. 1140 let expr0_0 = C::temp_writable_gpr(ctx); 1141 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 1142 let expr2_0 = AluRmiROpcode::Add; 1143 let expr3_0 = MInst::AluRmiR { 1144 size: expr1_0, 1145 op: expr2_0, 1146 src1: pattern1_0, 1147 src2: pattern2_0.clone(), 1148 dst: expr0_0, 1149 }; 1150 let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 1151 let expr5_0 = C::gpr_to_reg(ctx, expr4_0); 1152 let expr6_0 = ProducesFlags::ProducesFlags { 1153 inst: expr3_0, 1154 result: expr5_0, 1155 }; 1156 return Some(expr6_0); 1157 } 1158 1159 // Generated as internal constructor for term adc. 1160 pub fn constructor_adc<C: Context>( 1161 ctx: &mut C, 1162 arg0: Type, 1163 arg1: Gpr, 1164 arg2: &GprMemImm, 1165 ) -> Option<ConsumesFlags> { 1166 let pattern0_0 = arg0; 1167 let pattern1_0 = arg1; 1168 let pattern2_0 = arg2; 1169 // Rule at src/isa/x64/inst.isle line 1271. 1170 let expr0_0 = C::temp_writable_gpr(ctx); 1171 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 1172 let expr2_0 = AluRmiROpcode::Adc; 1173 let expr3_0 = MInst::AluRmiR { 1174 size: expr1_0, 1175 op: expr2_0, 1176 src1: pattern1_0, 1177 src2: pattern2_0.clone(), 1178 dst: expr0_0, 1179 }; 1180 let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 1181 let expr5_0 = C::gpr_to_reg(ctx, expr4_0); 1182 let expr6_0 = ConsumesFlags::ConsumesFlags { 1183 inst: expr3_0, 1184 result: expr5_0, 1185 }; 1186 return Some(expr6_0); 1187 } 1188 1189 // Generated as internal constructor for term sub. 1190 pub fn constructor_sub<C: Context>( 1191 ctx: &mut C, 1192 arg0: Type, 1193 arg1: Gpr, 1194 arg2: &GprMemImm, 1195 ) -> Option<Gpr> { 1196 let pattern0_0 = arg0; 1197 let pattern1_0 = arg1; 1198 let pattern2_0 = arg2; 1199 // Rule at src/isa/x64/inst.isle line 1282. 1200 let expr0_0 = AluRmiROpcode::Sub; 1201 let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 1202 return Some(expr1_0); 1203 } 1204 1205 // Generated as internal constructor for term sub_with_flags. 1206 pub fn constructor_sub_with_flags<C: Context>( 1207 ctx: &mut C, 1208 arg0: Type, 1209 arg1: Gpr, 1210 arg2: &GprMemImm, 1211 ) -> Option<ProducesFlags> { 1212 let pattern0_0 = arg0; 1213 let pattern1_0 = arg1; 1214 let pattern2_0 = arg2; 1215 // Rule at src/isa/x64/inst.isle line 1290. 1216 let expr0_0 = C::temp_writable_gpr(ctx); 1217 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 1218 let expr2_0 = AluRmiROpcode::Sub; 1219 let expr3_0 = MInst::AluRmiR { 1220 size: expr1_0, 1221 op: expr2_0, 1222 src1: pattern1_0, 1223 src2: pattern2_0.clone(), 1224 dst: expr0_0, 1225 }; 1226 let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 1227 let expr5_0 = C::gpr_to_reg(ctx, expr4_0); 1228 let expr6_0 = ProducesFlags::ProducesFlags { 1229 inst: expr3_0, 1230 result: expr5_0, 1231 }; 1232 return Some(expr6_0); 1233 } 1234 1235 // Generated as internal constructor for term sbb. 1236 pub fn constructor_sbb<C: Context>( 1237 ctx: &mut C, 1238 arg0: Type, 1239 arg1: Gpr, 1240 arg2: &GprMemImm, 1241 ) -> Option<ConsumesFlags> { 1242 let pattern0_0 = arg0; 1243 let pattern1_0 = arg1; 1244 let pattern2_0 = arg2; 1245 // Rule at src/isa/x64/inst.isle line 1301. 1246 let expr0_0 = C::temp_writable_gpr(ctx); 1247 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 1248 let expr2_0 = AluRmiROpcode::Sbb; 1249 let expr3_0 = MInst::AluRmiR { 1250 size: expr1_0, 1251 op: expr2_0, 1252 src1: pattern1_0, 1253 src2: pattern2_0.clone(), 1254 dst: expr0_0, 1255 }; 1256 let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 1257 let expr5_0 = C::gpr_to_reg(ctx, expr4_0); 1258 let expr6_0 = ConsumesFlags::ConsumesFlags { 1259 inst: expr3_0, 1260 result: expr5_0, 1261 }; 1262 return Some(expr6_0); 1263 } 1264 1265 // Generated as internal constructor for term mul. 1266 pub fn constructor_mul<C: Context>( 1267 ctx: &mut C, 1268 arg0: Type, 1269 arg1: Gpr, 1270 arg2: &GprMemImm, 1271 ) -> Option<Gpr> { 1272 let pattern0_0 = arg0; 1273 let pattern1_0 = arg1; 1274 let pattern2_0 = arg2; 1275 // Rule at src/isa/x64/inst.isle line 1312. 1276 let expr0_0 = AluRmiROpcode::Mul; 1277 let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 1278 return Some(expr1_0); 1279 } 1280 1281 // Generated as internal constructor for term x64_and. 1282 pub fn constructor_x64_and<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 1320. 1292 let expr0_0 = AluRmiROpcode::And; 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 or. 1298 pub fn constructor_or<C: Context>( 1299 ctx: &mut C, 1300 arg0: Type, 1301 arg1: Gpr, 1302 arg2: &GprMemImm, 1303 ) -> Option<Gpr> { 1304 let pattern0_0 = arg0; 1305 let pattern1_0 = arg1; 1306 let pattern2_0 = arg2; 1307 // Rule at src/isa/x64/inst.isle line 1328. 1308 let expr0_0 = AluRmiROpcode::Or; 1309 let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 1310 return Some(expr1_0); 1311 } 1312 1313 // Generated as internal constructor for term xor. 1314 pub fn constructor_xor<C: Context>( 1315 ctx: &mut C, 1316 arg0: Type, 1317 arg1: Gpr, 1318 arg2: &GprMemImm, 1319 ) -> Option<Gpr> { 1320 let pattern0_0 = arg0; 1321 let pattern1_0 = arg1; 1322 let pattern2_0 = arg2; 1323 // Rule at src/isa/x64/inst.isle line 1336. 1324 let expr0_0 = AluRmiROpcode::Xor; 1325 let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 1326 return Some(expr1_0); 1327 } 1328 1329 // Generated as internal constructor for term imm. 1330 pub fn constructor_imm<C: Context>(ctx: &mut C, arg0: Type, arg1: u64) -> Option<Reg> { 1331 let pattern0_0 = arg0; 1332 if pattern0_0 == I64 { 1333 let pattern2_0 = arg1; 1334 if let Some(pattern3_0) = C::nonzero_u64_fits_in_u32(ctx, pattern2_0) { 1335 // Rule at src/isa/x64/inst.isle line 1369. 1336 let expr0_0 = C::temp_writable_gpr(ctx); 1337 let expr1_0 = OperandSize::Size32; 1338 let expr2_0 = MInst::Imm { 1339 dst_size: expr1_0, 1340 simm64: pattern3_0, 1341 dst: expr0_0, 1342 }; 1343 let expr3_0 = C::emit(ctx, &expr2_0); 1344 let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 1345 let expr5_0 = C::gpr_to_reg(ctx, expr4_0); 1346 return Some(expr5_0); 1347 } 1348 } 1349 if pattern0_0 == F32 { 1350 let pattern2_0 = arg1; 1351 if pattern2_0 == 0 { 1352 // Rule at src/isa/x64/inst.isle line 1398. 1353 let expr0_0 = C::temp_writable_xmm(ctx); 1354 let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 1355 let expr2_0 = SseOpcode::Xorps; 1356 let expr3_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 1357 let expr4_0 = MInst::XmmRmR { 1358 op: expr2_0, 1359 src1: expr1_0, 1360 src2: expr3_0, 1361 dst: expr0_0, 1362 }; 1363 let expr5_0 = C::emit(ctx, &expr4_0); 1364 let expr6_0 = C::xmm_to_reg(ctx, expr1_0); 1365 return Some(expr6_0); 1366 } 1367 // Rule at src/isa/x64/inst.isle line 1353. 1368 let expr0_0 = SseOpcode::Movd; 1369 let expr1_0: Type = I32; 1370 let expr2_0 = constructor_imm(ctx, expr1_0, pattern2_0)?; 1371 let expr3_0 = RegMem::Reg { reg: expr2_0 }; 1372 let expr4_0 = C::reg_mem_to_gpr_mem(ctx, &expr3_0); 1373 let expr5_0 = OperandSize::Size32; 1374 let expr6_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr4_0, &expr5_0)?; 1375 let expr7_0 = C::xmm_to_reg(ctx, expr6_0); 1376 return Some(expr7_0); 1377 } 1378 if pattern0_0 == F64 { 1379 let pattern2_0 = arg1; 1380 if pattern2_0 == 0 { 1381 // Rule at src/isa/x64/inst.isle line 1410. 1382 let expr0_0 = C::temp_writable_xmm(ctx); 1383 let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 1384 let expr2_0 = SseOpcode::Xorpd; 1385 let expr3_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 1386 let expr4_0 = MInst::XmmRmR { 1387 op: expr2_0, 1388 src1: expr1_0, 1389 src2: expr3_0, 1390 dst: expr0_0, 1391 }; 1392 let expr5_0 = C::emit(ctx, &expr4_0); 1393 let expr6_0 = C::xmm_to_reg(ctx, expr1_0); 1394 return Some(expr6_0); 1395 } 1396 // Rule at src/isa/x64/inst.isle line 1359. 1397 let expr0_0 = SseOpcode::Movq; 1398 let expr1_0: Type = I64; 1399 let expr2_0 = constructor_imm(ctx, expr1_0, pattern2_0)?; 1400 let expr3_0 = RegMem::Reg { reg: expr2_0 }; 1401 let expr4_0 = C::reg_mem_to_gpr_mem(ctx, &expr3_0); 1402 let expr5_0 = OperandSize::Size64; 1403 let expr6_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr4_0, &expr5_0)?; 1404 let expr7_0 = C::xmm_to_reg(ctx, expr6_0); 1405 return Some(expr7_0); 1406 } 1407 if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { 1408 let pattern2_0 = arg1; 1409 if pattern2_0 == 0 { 1410 // Rule at src/isa/x64/inst.isle line 1388. 1411 let expr0_0 = C::temp_writable_xmm(ctx); 1412 let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 1413 let expr2_0 = constructor_sse_xor_op(ctx, pattern0_0)?; 1414 let expr3_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 1415 let expr4_0 = MInst::XmmRmR { 1416 op: expr2_0, 1417 src1: expr1_0, 1418 src2: expr3_0, 1419 dst: expr0_0, 1420 }; 1421 let expr5_0 = C::emit(ctx, &expr4_0); 1422 let expr6_0 = C::xmm_to_reg(ctx, expr1_0); 1423 return Some(expr6_0); 1424 } 1425 } 1426 if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { 1427 let pattern2_0 = arg1; 1428 if pattern2_0 == 0 { 1429 // Rule at src/isa/x64/inst.isle line 1375. 1430 let expr0_0 = C::temp_writable_gpr(ctx); 1431 let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 1432 let expr2_0 = C::operand_size_of_type_32_64(ctx, pattern1_0); 1433 let expr3_0 = AluRmiROpcode::Xor; 1434 let expr4_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0); 1435 let expr5_0 = MInst::AluRmiR { 1436 size: expr2_0, 1437 op: expr3_0, 1438 src1: expr1_0, 1439 src2: expr4_0, 1440 dst: expr0_0, 1441 }; 1442 let expr6_0 = C::emit(ctx, &expr5_0); 1443 let expr7_0 = C::gpr_to_reg(ctx, expr1_0); 1444 return Some(expr7_0); 1445 } 1446 // Rule at src/isa/x64/inst.isle line 1346. 1447 let expr0_0 = C::temp_writable_gpr(ctx); 1448 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern1_0); 1449 let expr2_0 = MInst::Imm { 1450 dst_size: expr1_0, 1451 simm64: pattern2_0, 1452 dst: expr0_0, 1453 }; 1454 let expr3_0 = C::emit(ctx, &expr2_0); 1455 let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 1456 let expr5_0 = C::gpr_to_reg(ctx, expr4_0); 1457 return Some(expr5_0); 1458 } 1459 return None; 1460 } 1461 1462 // Generated as internal constructor for term shift_r. 1463 pub fn constructor_shift_r<C: Context>( 1464 ctx: &mut C, 1465 arg0: Type, 1466 arg1: &ShiftKind, 1467 arg2: Gpr, 1468 arg3: &Imm8Gpr, 1469 ) -> Option<Gpr> { 1470 let pattern0_0 = arg0; 1471 let pattern1_0 = arg1; 1472 let pattern2_0 = arg2; 1473 let pattern3_0 = arg3; 1474 // Rule at src/isa/x64/inst.isle line 1423. 1475 let expr0_0 = C::temp_writable_gpr(ctx); 1476 let expr1_0 = C::raw_operand_size_of_type(ctx, pattern0_0); 1477 let expr2_0 = MInst::ShiftR { 1478 size: expr1_0, 1479 kind: pattern1_0.clone(), 1480 src: pattern2_0, 1481 num_bits: pattern3_0.clone(), 1482 dst: expr0_0, 1483 }; 1484 let expr3_0 = C::emit(ctx, &expr2_0); 1485 let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 1486 return Some(expr4_0); 1487 } 1488 1489 // Generated as internal constructor for term x64_rotl. 1490 pub fn constructor_x64_rotl<C: Context>( 1491 ctx: &mut C, 1492 arg0: Type, 1493 arg1: Gpr, 1494 arg2: &Imm8Gpr, 1495 ) -> Option<Gpr> { 1496 let pattern0_0 = arg0; 1497 let pattern1_0 = arg1; 1498 let pattern2_0 = arg2; 1499 // Rule at src/isa/x64/inst.isle line 1433. 1500 let expr0_0 = ShiftKind::RotateLeft; 1501 let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 1502 return Some(expr1_0); 1503 } 1504 1505 // Generated as internal constructor for term x64_rotr. 1506 pub fn constructor_x64_rotr<C: Context>( 1507 ctx: &mut C, 1508 arg0: Type, 1509 arg1: Gpr, 1510 arg2: &Imm8Gpr, 1511 ) -> Option<Gpr> { 1512 let pattern0_0 = arg0; 1513 let pattern1_0 = arg1; 1514 let pattern2_0 = arg2; 1515 // Rule at src/isa/x64/inst.isle line 1438. 1516 let expr0_0 = ShiftKind::RotateRight; 1517 let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 1518 return Some(expr1_0); 1519 } 1520 1521 // Generated as internal constructor for term shl. 1522 pub fn constructor_shl<C: Context>( 1523 ctx: &mut C, 1524 arg0: Type, 1525 arg1: Gpr, 1526 arg2: &Imm8Gpr, 1527 ) -> Option<Gpr> { 1528 let pattern0_0 = arg0; 1529 let pattern1_0 = arg1; 1530 let pattern2_0 = arg2; 1531 // Rule at src/isa/x64/inst.isle line 1443. 1532 let expr0_0 = ShiftKind::ShiftLeft; 1533 let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 1534 return Some(expr1_0); 1535 } 1536 1537 // Generated as internal constructor for term shr. 1538 pub fn constructor_shr<C: Context>( 1539 ctx: &mut C, 1540 arg0: Type, 1541 arg1: Gpr, 1542 arg2: &Imm8Gpr, 1543 ) -> Option<Gpr> { 1544 let pattern0_0 = arg0; 1545 let pattern1_0 = arg1; 1546 let pattern2_0 = arg2; 1547 // Rule at src/isa/x64/inst.isle line 1448. 1548 let expr0_0 = ShiftKind::ShiftRightLogical; 1549 let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 1550 return Some(expr1_0); 1551 } 1552 1553 // Generated as internal constructor for term sar. 1554 pub fn constructor_sar<C: Context>( 1555 ctx: &mut C, 1556 arg0: Type, 1557 arg1: Gpr, 1558 arg2: &Imm8Gpr, 1559 ) -> Option<Gpr> { 1560 let pattern0_0 = arg0; 1561 let pattern1_0 = arg1; 1562 let pattern2_0 = arg2; 1563 // Rule at src/isa/x64/inst.isle line 1453. 1564 let expr0_0 = ShiftKind::ShiftRightArithmetic; 1565 let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 1566 return Some(expr1_0); 1567 } 1568 1569 // Generated as internal constructor for term cmp_rmi_r. 1570 pub fn constructor_cmp_rmi_r<C: Context>( 1571 ctx: &mut C, 1572 arg0: &OperandSize, 1573 arg1: &CmpOpcode, 1574 arg2: &GprMemImm, 1575 arg3: Gpr, 1576 ) -> Option<ProducesFlags> { 1577 let pattern0_0 = arg0; 1578 let pattern1_0 = arg1; 1579 let pattern2_0 = arg2; 1580 let pattern3_0 = arg3; 1581 // Rule at src/isa/x64/inst.isle line 1458. 1582 let expr0_0 = MInst::CmpRmiR { 1583 size: pattern0_0.clone(), 1584 opcode: pattern1_0.clone(), 1585 src: pattern2_0.clone(), 1586 dst: pattern3_0, 1587 }; 1588 let expr1_0 = C::invalid_reg(ctx); 1589 let expr2_0 = ProducesFlags::ProducesFlags { 1590 inst: expr0_0, 1591 result: expr1_0, 1592 }; 1593 return Some(expr2_0); 1594 } 1595 1596 // Generated as internal constructor for term cmp. 1597 pub fn constructor_cmp<C: Context>( 1598 ctx: &mut C, 1599 arg0: &OperandSize, 1600 arg1: &GprMemImm, 1601 arg2: Gpr, 1602 ) -> Option<ProducesFlags> { 1603 let pattern0_0 = arg0; 1604 let pattern1_0 = arg1; 1605 let pattern2_0 = arg2; 1606 // Rule at src/isa/x64/inst.isle line 1467. 1607 let expr0_0 = CmpOpcode::Cmp; 1608 let expr1_0 = constructor_cmp_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 1609 return Some(expr1_0); 1610 } 1611 1612 // Generated as internal constructor for term test. 1613 pub fn constructor_test<C: Context>( 1614 ctx: &mut C, 1615 arg0: &OperandSize, 1616 arg1: &GprMemImm, 1617 arg2: Gpr, 1618 ) -> Option<ProducesFlags> { 1619 let pattern0_0 = arg0; 1620 let pattern1_0 = arg1; 1621 let pattern2_0 = arg2; 1622 // Rule at src/isa/x64/inst.isle line 1472. 1623 let expr0_0 = CmpOpcode::Test; 1624 let expr1_0 = constructor_cmp_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 1625 return Some(expr1_0); 1626 } 1627 1628 // Generated as internal constructor for term cmove. 1629 pub fn constructor_cmove<C: Context>( 1630 ctx: &mut C, 1631 arg0: Type, 1632 arg1: &CC, 1633 arg2: &GprMem, 1634 arg3: Gpr, 1635 ) -> Option<ConsumesFlags> { 1636 let pattern0_0 = arg0; 1637 let pattern1_0 = arg1; 1638 let pattern2_0 = arg2; 1639 let pattern3_0 = arg3; 1640 // Rule at src/isa/x64/inst.isle line 1477. 1641 let expr0_0 = C::temp_writable_gpr(ctx); 1642 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 1643 let expr2_0 = MInst::Cmove { 1644 size: expr1_0, 1645 cc: pattern1_0.clone(), 1646 consequent: pattern2_0.clone(), 1647 alternative: pattern3_0, 1648 dst: expr0_0, 1649 }; 1650 let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 1651 let expr4_0 = C::gpr_to_reg(ctx, expr3_0); 1652 let expr5_0 = ConsumesFlags::ConsumesFlags { 1653 inst: expr2_0, 1654 result: expr4_0, 1655 }; 1656 return Some(expr5_0); 1657 } 1658 1659 // Generated as internal constructor for term movzx. 1660 pub fn constructor_movzx<C: Context>( 1661 ctx: &mut C, 1662 arg0: Type, 1663 arg1: &ExtMode, 1664 arg2: &GprMem, 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 1485. 1670 let expr0_0 = C::temp_writable_gpr(ctx); 1671 let expr1_0 = MInst::MovzxRmR { 1672 ext_mode: pattern1_0.clone(), 1673 src: pattern2_0.clone(), 1674 dst: expr0_0, 1675 }; 1676 let expr2_0 = C::emit(ctx, &expr1_0); 1677 let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 1678 return Some(expr3_0); 1679 } 1680 1681 // Generated as internal constructor for term movsx. 1682 pub fn constructor_movsx<C: Context>( 1683 ctx: &mut C, 1684 arg0: Type, 1685 arg1: &ExtMode, 1686 arg2: &GprMem, 1687 ) -> Option<Gpr> { 1688 let pattern0_0 = arg0; 1689 let pattern1_0 = arg1; 1690 let pattern2_0 = arg2; 1691 // Rule at src/isa/x64/inst.isle line 1492. 1692 let expr0_0 = C::temp_writable_gpr(ctx); 1693 let expr1_0 = MInst::MovsxRmR { 1694 ext_mode: pattern1_0.clone(), 1695 src: pattern2_0.clone(), 1696 dst: expr0_0, 1697 }; 1698 let expr2_0 = C::emit(ctx, &expr1_0); 1699 let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 1700 return Some(expr3_0); 1701 } 1702 1703 // Generated as internal constructor for term xmm_rm_r. 1704 pub fn constructor_xmm_rm_r<C: Context>( 1705 ctx: &mut C, 1706 arg0: Type, 1707 arg1: &SseOpcode, 1708 arg2: Xmm, 1709 arg3: &XmmMem, 1710 ) -> Option<Xmm> { 1711 let pattern0_0 = arg0; 1712 let pattern1_0 = arg1; 1713 let pattern2_0 = arg2; 1714 let pattern3_0 = arg3; 1715 // Rule at src/isa/x64/inst.isle line 1499. 1716 let expr0_0 = C::temp_writable_xmm(ctx); 1717 let expr1_0 = MInst::XmmRmR { 1718 op: pattern1_0.clone(), 1719 src1: pattern2_0, 1720 src2: pattern3_0.clone(), 1721 dst: expr0_0, 1722 }; 1723 let expr2_0 = C::emit(ctx, &expr1_0); 1724 let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 1725 return Some(expr3_0); 1726 } 1727 1728 // Generated as internal constructor for term paddb. 1729 pub fn constructor_paddb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1730 let pattern0_0 = arg0; 1731 let pattern1_0 = arg1; 1732 // Rule at src/isa/x64/inst.isle line 1506. 1733 let expr0_0: Type = I8X16; 1734 let expr1_0 = SseOpcode::Paddb; 1735 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1736 return Some(expr2_0); 1737 } 1738 1739 // Generated as internal constructor for term paddw. 1740 pub fn constructor_paddw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1741 let pattern0_0 = arg0; 1742 let pattern1_0 = arg1; 1743 // Rule at src/isa/x64/inst.isle line 1511. 1744 let expr0_0: Type = I16X8; 1745 let expr1_0 = SseOpcode::Paddw; 1746 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1747 return Some(expr2_0); 1748 } 1749 1750 // Generated as internal constructor for term paddd. 1751 pub fn constructor_paddd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1752 let pattern0_0 = arg0; 1753 let pattern1_0 = arg1; 1754 // Rule at src/isa/x64/inst.isle line 1516. 1755 let expr0_0: Type = I32X4; 1756 let expr1_0 = SseOpcode::Paddd; 1757 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1758 return Some(expr2_0); 1759 } 1760 1761 // Generated as internal constructor for term paddq. 1762 pub fn constructor_paddq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1763 let pattern0_0 = arg0; 1764 let pattern1_0 = arg1; 1765 // Rule at src/isa/x64/inst.isle line 1521. 1766 let expr0_0: Type = I64X2; 1767 let expr1_0 = SseOpcode::Paddq; 1768 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1769 return Some(expr2_0); 1770 } 1771 1772 // Generated as internal constructor for term paddsb. 1773 pub fn constructor_paddsb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1774 let pattern0_0 = arg0; 1775 let pattern1_0 = arg1; 1776 // Rule at src/isa/x64/inst.isle line 1526. 1777 let expr0_0: Type = I8X16; 1778 let expr1_0 = SseOpcode::Paddsb; 1779 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1780 return Some(expr2_0); 1781 } 1782 1783 // Generated as internal constructor for term paddsw. 1784 pub fn constructor_paddsw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1785 let pattern0_0 = arg0; 1786 let pattern1_0 = arg1; 1787 // Rule at src/isa/x64/inst.isle line 1531. 1788 let expr0_0: Type = I16X8; 1789 let expr1_0 = SseOpcode::Paddsw; 1790 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1791 return Some(expr2_0); 1792 } 1793 1794 // Generated as internal constructor for term paddusb. 1795 pub fn constructor_paddusb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1796 let pattern0_0 = arg0; 1797 let pattern1_0 = arg1; 1798 // Rule at src/isa/x64/inst.isle line 1536. 1799 let expr0_0: Type = I8X16; 1800 let expr1_0 = SseOpcode::Paddusb; 1801 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1802 return Some(expr2_0); 1803 } 1804 1805 // Generated as internal constructor for term paddusw. 1806 pub fn constructor_paddusw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1807 let pattern0_0 = arg0; 1808 let pattern1_0 = arg1; 1809 // Rule at src/isa/x64/inst.isle line 1541. 1810 let expr0_0: Type = I16X8; 1811 let expr1_0 = SseOpcode::Paddusw; 1812 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1813 return Some(expr2_0); 1814 } 1815 1816 // Generated as internal constructor for term psubb. 1817 pub fn constructor_psubb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1818 let pattern0_0 = arg0; 1819 let pattern1_0 = arg1; 1820 // Rule at src/isa/x64/inst.isle line 1546. 1821 let expr0_0: Type = I8X16; 1822 let expr1_0 = SseOpcode::Psubb; 1823 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1824 return Some(expr2_0); 1825 } 1826 1827 // Generated as internal constructor for term psubw. 1828 pub fn constructor_psubw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1829 let pattern0_0 = arg0; 1830 let pattern1_0 = arg1; 1831 // Rule at src/isa/x64/inst.isle line 1551. 1832 let expr0_0: Type = I16X8; 1833 let expr1_0 = SseOpcode::Psubw; 1834 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1835 return Some(expr2_0); 1836 } 1837 1838 // Generated as internal constructor for term psubd. 1839 pub fn constructor_psubd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1840 let pattern0_0 = arg0; 1841 let pattern1_0 = arg1; 1842 // Rule at src/isa/x64/inst.isle line 1556. 1843 let expr0_0: Type = I32X4; 1844 let expr1_0 = SseOpcode::Psubd; 1845 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1846 return Some(expr2_0); 1847 } 1848 1849 // Generated as internal constructor for term psubq. 1850 pub fn constructor_psubq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1851 let pattern0_0 = arg0; 1852 let pattern1_0 = arg1; 1853 // Rule at src/isa/x64/inst.isle line 1561. 1854 let expr0_0: Type = I64X2; 1855 let expr1_0 = SseOpcode::Psubq; 1856 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1857 return Some(expr2_0); 1858 } 1859 1860 // Generated as internal constructor for term psubsb. 1861 pub fn constructor_psubsb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1862 let pattern0_0 = arg0; 1863 let pattern1_0 = arg1; 1864 // Rule at src/isa/x64/inst.isle line 1566. 1865 let expr0_0: Type = I8X16; 1866 let expr1_0 = SseOpcode::Psubsb; 1867 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1868 return Some(expr2_0); 1869 } 1870 1871 // Generated as internal constructor for term psubsw. 1872 pub fn constructor_psubsw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1873 let pattern0_0 = arg0; 1874 let pattern1_0 = arg1; 1875 // Rule at src/isa/x64/inst.isle line 1571. 1876 let expr0_0: Type = I16X8; 1877 let expr1_0 = SseOpcode::Psubsw; 1878 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1879 return Some(expr2_0); 1880 } 1881 1882 // Generated as internal constructor for term psubusb. 1883 pub fn constructor_psubusb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1884 let pattern0_0 = arg0; 1885 let pattern1_0 = arg1; 1886 // Rule at src/isa/x64/inst.isle line 1576. 1887 let expr0_0: Type = I8X16; 1888 let expr1_0 = SseOpcode::Psubusb; 1889 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1890 return Some(expr2_0); 1891 } 1892 1893 // Generated as internal constructor for term psubusw. 1894 pub fn constructor_psubusw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1895 let pattern0_0 = arg0; 1896 let pattern1_0 = arg1; 1897 // Rule at src/isa/x64/inst.isle line 1581. 1898 let expr0_0: Type = I16X8; 1899 let expr1_0 = SseOpcode::Psubusw; 1900 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1901 return Some(expr2_0); 1902 } 1903 1904 // Generated as internal constructor for term pavgb. 1905 pub fn constructor_pavgb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1906 let pattern0_0 = arg0; 1907 let pattern1_0 = arg1; 1908 // Rule at src/isa/x64/inst.isle line 1586. 1909 let expr0_0: Type = I8X16; 1910 let expr1_0 = SseOpcode::Pavgb; 1911 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1912 return Some(expr2_0); 1913 } 1914 1915 // Generated as internal constructor for term pavgw. 1916 pub fn constructor_pavgw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1917 let pattern0_0 = arg0; 1918 let pattern1_0 = arg1; 1919 // Rule at src/isa/x64/inst.isle line 1591. 1920 let expr0_0: Type = I16X8; 1921 let expr1_0 = SseOpcode::Pavgw; 1922 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1923 return Some(expr2_0); 1924 } 1925 1926 // Generated as internal constructor for term pand. 1927 pub fn constructor_pand<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1928 let pattern0_0 = arg0; 1929 let pattern1_0 = arg1; 1930 // Rule at src/isa/x64/inst.isle line 1596. 1931 let expr0_0: Type = F32X4; 1932 let expr1_0 = SseOpcode::Pand; 1933 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1934 return Some(expr2_0); 1935 } 1936 1937 // Generated as internal constructor for term andps. 1938 pub fn constructor_andps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1939 let pattern0_0 = arg0; 1940 let pattern1_0 = arg1; 1941 // Rule at src/isa/x64/inst.isle line 1601. 1942 let expr0_0: Type = F32X4; 1943 let expr1_0 = SseOpcode::Andps; 1944 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1945 return Some(expr2_0); 1946 } 1947 1948 // Generated as internal constructor for term andpd. 1949 pub fn constructor_andpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1950 let pattern0_0 = arg0; 1951 let pattern1_0 = arg1; 1952 // Rule at src/isa/x64/inst.isle line 1606. 1953 let expr0_0: Type = F64X2; 1954 let expr1_0 = SseOpcode::Andpd; 1955 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1956 return Some(expr2_0); 1957 } 1958 1959 // Generated as internal constructor for term por. 1960 pub fn constructor_por<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1961 let pattern0_0 = arg0; 1962 let pattern1_0 = arg1; 1963 // Rule at src/isa/x64/inst.isle line 1611. 1964 let expr0_0: Type = F32X4; 1965 let expr1_0 = SseOpcode::Por; 1966 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1967 return Some(expr2_0); 1968 } 1969 1970 // Generated as internal constructor for term orps. 1971 pub fn constructor_orps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1972 let pattern0_0 = arg0; 1973 let pattern1_0 = arg1; 1974 // Rule at src/isa/x64/inst.isle line 1616. 1975 let expr0_0: Type = F32X4; 1976 let expr1_0 = SseOpcode::Orps; 1977 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1978 return Some(expr2_0); 1979 } 1980 1981 // Generated as internal constructor for term orpd. 1982 pub fn constructor_orpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1983 let pattern0_0 = arg0; 1984 let pattern1_0 = arg1; 1985 // Rule at src/isa/x64/inst.isle line 1621. 1986 let expr0_0: Type = F64X2; 1987 let expr1_0 = SseOpcode::Orpd; 1988 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 1989 return Some(expr2_0); 1990 } 1991 1992 // Generated as internal constructor for term pxor. 1993 pub fn constructor_pxor<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 1994 let pattern0_0 = arg0; 1995 let pattern1_0 = arg1; 1996 // Rule at src/isa/x64/inst.isle line 1626. 1997 let expr0_0: Type = I8X16; 1998 let expr1_0 = SseOpcode::Pxor; 1999 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 2000 return Some(expr2_0); 2001 } 2002 2003 // Generated as internal constructor for term xorps. 2004 pub fn constructor_xorps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 2005 let pattern0_0 = arg0; 2006 let pattern1_0 = arg1; 2007 // Rule at src/isa/x64/inst.isle line 1631. 2008 let expr0_0: Type = F32X4; 2009 let expr1_0 = SseOpcode::Xorps; 2010 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 2011 return Some(expr2_0); 2012 } 2013 2014 // Generated as internal constructor for term xorpd. 2015 pub fn constructor_xorpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 2016 let pattern0_0 = arg0; 2017 let pattern1_0 = arg1; 2018 // Rule at src/isa/x64/inst.isle line 1636. 2019 let expr0_0: Type = F64X2; 2020 let expr1_0 = SseOpcode::Xorpd; 2021 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 2022 return Some(expr2_0); 2023 } 2024 2025 // Generated as internal constructor for term pmullw. 2026 pub fn constructor_pmullw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 2027 let pattern0_0 = arg0; 2028 let pattern1_0 = arg1; 2029 // Rule at src/isa/x64/inst.isle line 1641. 2030 let expr0_0: Type = I16X8; 2031 let expr1_0 = SseOpcode::Pmullw; 2032 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 2033 return Some(expr2_0); 2034 } 2035 2036 // Generated as internal constructor for term pmulld. 2037 pub fn constructor_pmulld<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 2038 let pattern0_0 = arg0; 2039 let pattern1_0 = arg1; 2040 // Rule at src/isa/x64/inst.isle line 1646. 2041 let expr0_0: Type = I16X8; 2042 let expr1_0 = SseOpcode::Pmulld; 2043 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 2044 return Some(expr2_0); 2045 } 2046 2047 // Generated as internal constructor for term pmulhw. 2048 pub fn constructor_pmulhw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 2049 let pattern0_0 = arg0; 2050 let pattern1_0 = arg1; 2051 // Rule at src/isa/x64/inst.isle line 1651. 2052 let expr0_0: Type = I16X8; 2053 let expr1_0 = SseOpcode::Pmulhw; 2054 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 2055 return Some(expr2_0); 2056 } 2057 2058 // Generated as internal constructor for term pmulhuw. 2059 pub fn constructor_pmulhuw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 2060 let pattern0_0 = arg0; 2061 let pattern1_0 = arg1; 2062 // Rule at src/isa/x64/inst.isle line 1656. 2063 let expr0_0: Type = I16X8; 2064 let expr1_0 = SseOpcode::Pmulhuw; 2065 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 2066 return Some(expr2_0); 2067 } 2068 2069 // Generated as internal constructor for term pmuldq. 2070 pub fn constructor_pmuldq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 2071 let pattern0_0 = arg0; 2072 let pattern1_0 = arg1; 2073 // Rule at src/isa/x64/inst.isle line 1661. 2074 let expr0_0: Type = I16X8; 2075 let expr1_0 = SseOpcode::Pmuldq; 2076 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 2077 return Some(expr2_0); 2078 } 2079 2080 // Generated as internal constructor for term pmuludq. 2081 pub fn constructor_pmuludq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 2082 let pattern0_0 = arg0; 2083 let pattern1_0 = arg1; 2084 // Rule at src/isa/x64/inst.isle line 1666. 2085 let expr0_0: Type = I64X2; 2086 let expr1_0 = SseOpcode::Pmuludq; 2087 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 2088 return Some(expr2_0); 2089 } 2090 2091 // Generated as internal constructor for term punpckhwd. 2092 pub fn constructor_punpckhwd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 2093 let pattern0_0 = arg0; 2094 let pattern1_0 = arg1; 2095 // Rule at src/isa/x64/inst.isle line 1671. 2096 let expr0_0: Type = I16X8; 2097 let expr1_0 = SseOpcode::Punpckhwd; 2098 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 2099 return Some(expr2_0); 2100 } 2101 2102 // Generated as internal constructor for term punpcklwd. 2103 pub fn constructor_punpcklwd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 2104 let pattern0_0 = arg0; 2105 let pattern1_0 = arg1; 2106 // Rule at src/isa/x64/inst.isle line 1676. 2107 let expr0_0: Type = I16X8; 2108 let expr1_0 = SseOpcode::Punpcklwd; 2109 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 2110 return Some(expr2_0); 2111 } 2112 2113 // Generated as internal constructor for term andnps. 2114 pub fn constructor_andnps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 2115 let pattern0_0 = arg0; 2116 let pattern1_0 = arg1; 2117 // Rule at src/isa/x64/inst.isle line 1681. 2118 let expr0_0: Type = F32X4; 2119 let expr1_0 = SseOpcode::Andnps; 2120 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 2121 return Some(expr2_0); 2122 } 2123 2124 // Generated as internal constructor for term andnpd. 2125 pub fn constructor_andnpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 2126 let pattern0_0 = arg0; 2127 let pattern1_0 = arg1; 2128 // Rule at src/isa/x64/inst.isle line 1686. 2129 let expr0_0: Type = F64X2; 2130 let expr1_0 = SseOpcode::Andnpd; 2131 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 2132 return Some(expr2_0); 2133 } 2134 2135 // Generated as internal constructor for term pandn. 2136 pub fn constructor_pandn<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 2137 let pattern0_0 = arg0; 2138 let pattern1_0 = arg1; 2139 // Rule at src/isa/x64/inst.isle line 1691. 2140 let expr0_0: Type = F64X2; 2141 let expr1_0 = SseOpcode::Pandn; 2142 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 2143 return Some(expr2_0); 2144 } 2145 2146 // Generated as internal constructor for term sse_blend_op. 2147 pub fn constructor_sse_blend_op<C: Context>(ctx: &mut C, arg0: Type) -> Option<SseOpcode> { 2148 let pattern0_0 = arg0; 2149 if pattern0_0 == F32X4 { 2150 // Rule at src/isa/x64/inst.isle line 1695. 2151 let expr0_0 = SseOpcode::Blendvps; 2152 return Some(expr0_0); 2153 } 2154 if pattern0_0 == F64X2 { 2155 // Rule at src/isa/x64/inst.isle line 1696. 2156 let expr0_0 = SseOpcode::Blendvpd; 2157 return Some(expr0_0); 2158 } 2159 if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { 2160 // Rule at src/isa/x64/inst.isle line 1697. 2161 let expr0_0 = SseOpcode::Pblendvb; 2162 return Some(expr0_0); 2163 } 2164 return None; 2165 } 2166 2167 // Generated as internal constructor for term sse_mov_op. 2168 pub fn constructor_sse_mov_op<C: Context>(ctx: &mut C, arg0: Type) -> Option<SseOpcode> { 2169 let pattern0_0 = arg0; 2170 if pattern0_0 == F32X4 { 2171 // Rule at src/isa/x64/inst.isle line 1700. 2172 let expr0_0 = SseOpcode::Movaps; 2173 return Some(expr0_0); 2174 } 2175 if pattern0_0 == F64X2 { 2176 // Rule at src/isa/x64/inst.isle line 1701. 2177 let expr0_0 = SseOpcode::Movapd; 2178 return Some(expr0_0); 2179 } 2180 if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { 2181 // Rule at src/isa/x64/inst.isle line 1702. 2182 let expr0_0 = SseOpcode::Movdqa; 2183 return Some(expr0_0); 2184 } 2185 return None; 2186 } 2187 2188 // Generated as internal constructor for term sse_blend. 2189 pub fn constructor_sse_blend<C: Context>( 2190 ctx: &mut C, 2191 arg0: Type, 2192 arg1: &XmmMem, 2193 arg2: &XmmMem, 2194 arg3: Xmm, 2195 ) -> Option<Xmm> { 2196 let pattern0_0 = arg0; 2197 let pattern1_0 = arg1; 2198 let pattern2_0 = arg2; 2199 let pattern3_0 = arg3; 2200 // Rule at src/isa/x64/inst.isle line 1706. 2201 let expr0_0 = C::xmm0(ctx); 2202 let expr1_0 = constructor_sse_mov_op(ctx, pattern0_0)?; 2203 let expr2_0 = MInst::XmmUnaryRmR { 2204 op: expr1_0, 2205 src: pattern1_0.clone(), 2206 dst: expr0_0, 2207 }; 2208 let expr3_0 = C::emit(ctx, &expr2_0); 2209 let expr4_0 = constructor_sse_blend_op(ctx, pattern0_0)?; 2210 let expr5_0 = constructor_xmm_rm_r(ctx, pattern0_0, &expr4_0, pattern3_0, pattern2_0)?; 2211 return Some(expr5_0); 2212 } 2213 2214 // Generated as internal constructor for term blendvpd. 2215 pub fn constructor_blendvpd<C: Context>( 2216 ctx: &mut C, 2217 arg0: Xmm, 2218 arg1: &XmmMem, 2219 arg2: Xmm, 2220 ) -> Option<Xmm> { 2221 let pattern0_0 = arg0; 2222 let pattern1_0 = arg1; 2223 let pattern2_0 = arg2; 2224 // Rule at src/isa/x64/inst.isle line 1720. 2225 let expr0_0 = C::xmm0(ctx); 2226 let expr1_0 = SseOpcode::Movapd; 2227 let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern2_0); 2228 let expr3_0 = MInst::XmmUnaryRmR { 2229 op: expr1_0, 2230 src: expr2_0, 2231 dst: expr0_0, 2232 }; 2233 let expr4_0 = C::emit(ctx, &expr3_0); 2234 let expr5_0: Type = F64X2; 2235 let expr6_0 = SseOpcode::Blendvpd; 2236 let expr7_0 = constructor_xmm_rm_r(ctx, expr5_0, &expr6_0, pattern0_0, pattern1_0)?; 2237 return Some(expr7_0); 2238 } 2239 2240 // Generated as internal constructor for term movsd. 2241 pub fn constructor_movsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 2242 let pattern0_0 = arg0; 2243 let pattern1_0 = arg1; 2244 // Rule at src/isa/x64/inst.isle line 1734. 2245 let expr0_0: Type = I8X16; 2246 let expr1_0 = SseOpcode::Movsd; 2247 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 2248 return Some(expr2_0); 2249 } 2250 2251 // Generated as internal constructor for term movlhps. 2252 pub fn constructor_movlhps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 2253 let pattern0_0 = arg0; 2254 let pattern1_0 = arg1; 2255 // Rule at src/isa/x64/inst.isle line 1739. 2256 let expr0_0: Type = I8X16; 2257 let expr1_0 = SseOpcode::Movlhps; 2258 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 2259 return Some(expr2_0); 2260 } 2261 2262 // Generated as internal constructor for term pmaxsb. 2263 pub fn constructor_pmaxsb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 2264 let pattern0_0 = arg0; 2265 let pattern1_0 = arg1; 2266 // Rule at src/isa/x64/inst.isle line 1744. 2267 let expr0_0: Type = I8X16; 2268 let expr1_0 = SseOpcode::Pmaxsb; 2269 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 2270 return Some(expr2_0); 2271 } 2272 2273 // Generated as internal constructor for term pmaxsw. 2274 pub fn constructor_pmaxsw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 2275 let pattern0_0 = arg0; 2276 let pattern1_0 = arg1; 2277 // Rule at src/isa/x64/inst.isle line 1749. 2278 let expr0_0: Type = I8X16; 2279 let expr1_0 = SseOpcode::Pmaxsw; 2280 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 2281 return Some(expr2_0); 2282 } 2283 2284 // Generated as internal constructor for term pmaxsd. 2285 pub fn constructor_pmaxsd<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 1754. 2289 let expr0_0: Type = I8X16; 2290 let expr1_0 = SseOpcode::Pmaxsd; 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 pminsb. 2296 pub fn constructor_pminsb<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 1759. 2300 let expr0_0: Type = I8X16; 2301 let expr1_0 = SseOpcode::Pminsb; 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 pminsw. 2307 pub fn constructor_pminsw<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 1764. 2311 let expr0_0: Type = I8X16; 2312 let expr1_0 = SseOpcode::Pminsw; 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 pminsd. 2318 pub fn constructor_pminsd<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 1769. 2322 let expr0_0: Type = I8X16; 2323 let expr1_0 = SseOpcode::Pminsd; 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 pmaxub. 2329 pub fn constructor_pmaxub<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 1774. 2333 let expr0_0: Type = I8X16; 2334 let expr1_0 = SseOpcode::Pmaxub; 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 pmaxuw. 2340 pub fn constructor_pmaxuw<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 1779. 2344 let expr0_0: Type = I8X16; 2345 let expr1_0 = SseOpcode::Pmaxuw; 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 pmaxud. 2351 pub fn constructor_pmaxud<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 1784. 2355 let expr0_0: Type = I8X16; 2356 let expr1_0 = SseOpcode::Pmaxud; 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 pminub. 2362 pub fn constructor_pminub<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 1789. 2366 let expr0_0: Type = I8X16; 2367 let expr1_0 = SseOpcode::Pminub; 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 pminuw. 2373 pub fn constructor_pminuw<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 1794. 2377 let expr0_0: Type = I8X16; 2378 let expr1_0 = SseOpcode::Pminuw; 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 pminud. 2384 pub fn constructor_pminud<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 1799. 2388 let expr0_0: Type = I8X16; 2389 let expr1_0 = SseOpcode::Pminud; 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 punpcklbw. 2395 pub fn constructor_punpcklbw<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 1804. 2399 let expr0_0: Type = I8X16; 2400 let expr1_0 = SseOpcode::Punpcklbw; 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 punpckhbw. 2406 pub fn constructor_punpckhbw<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 1809. 2410 let expr0_0: Type = I8X16; 2411 let expr1_0 = SseOpcode::Punpckhbw; 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 packsswb. 2417 pub fn constructor_packsswb<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 1814. 2421 let expr0_0: Type = I8X16; 2422 let expr1_0 = SseOpcode::Packsswb; 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 xmm_rm_r_imm. 2428 pub fn constructor_xmm_rm_r_imm<C: Context>( 2429 ctx: &mut C, 2430 arg0: &SseOpcode, 2431 arg1: Reg, 2432 arg2: &RegMem, 2433 arg3: u8, 2434 arg4: &OperandSize, 2435 ) -> Option<Xmm> { 2436 let pattern0_0 = arg0; 2437 let pattern1_0 = arg1; 2438 let pattern2_0 = arg2; 2439 let pattern3_0 = arg3; 2440 let pattern4_0 = arg4; 2441 // Rule at src/isa/x64/inst.isle line 1819. 2442 let expr0_0 = C::temp_writable_xmm(ctx); 2443 let expr1_0 = C::writable_xmm_to_reg(ctx, expr0_0); 2444 let expr2_0 = MInst::XmmRmRImm { 2445 op: pattern0_0.clone(), 2446 src1: pattern1_0, 2447 src2: pattern2_0.clone(), 2448 dst: expr1_0, 2449 imm: pattern3_0, 2450 size: pattern4_0.clone(), 2451 }; 2452 let expr3_0 = C::emit(ctx, &expr2_0); 2453 let expr4_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 2454 return Some(expr4_0); 2455 } 2456 2457 // Generated as internal constructor for term palignr. 2458 pub fn constructor_palignr<C: Context>( 2459 ctx: &mut C, 2460 arg0: Xmm, 2461 arg1: &XmmMem, 2462 arg2: u8, 2463 arg3: &OperandSize, 2464 ) -> Option<Xmm> { 2465 let pattern0_0 = arg0; 2466 let pattern1_0 = arg1; 2467 let pattern2_0 = arg2; 2468 let pattern3_0 = arg3; 2469 // Rule at src/isa/x64/inst.isle line 1831. 2470 let expr0_0 = SseOpcode::Palignr; 2471 let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); 2472 let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0); 2473 let expr3_0 = 2474 constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, pattern3_0)?; 2475 return Some(expr3_0); 2476 } 2477 2478 // Generated as internal constructor for term cmpps. 2479 pub fn constructor_cmpps<C: Context>( 2480 ctx: &mut C, 2481 arg0: Xmm, 2482 arg1: &XmmMem, 2483 arg2: &FcmpImm, 2484 ) -> Option<Xmm> { 2485 let pattern0_0 = arg0; 2486 let pattern1_0 = arg1; 2487 let pattern2_0 = arg2; 2488 // Rule at src/isa/x64/inst.isle line 1840. 2489 let expr0_0 = SseOpcode::Cmpps; 2490 let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); 2491 let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0); 2492 let expr3_0 = C::encode_fcmp_imm(ctx, pattern2_0); 2493 let expr4_0 = OperandSize::Size32; 2494 let expr5_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, expr3_0, &expr4_0)?; 2495 return Some(expr5_0); 2496 } 2497 2498 // Generated as internal constructor for term pinsrb. 2499 pub fn constructor_pinsrb<C: Context>( 2500 ctx: &mut C, 2501 arg0: Xmm, 2502 arg1: &GprMem, 2503 arg2: u8, 2504 ) -> Option<Xmm> { 2505 let pattern0_0 = arg0; 2506 let pattern1_0 = arg1; 2507 let pattern2_0 = arg2; 2508 // Rule at src/isa/x64/inst.isle line 1849. 2509 let expr0_0 = SseOpcode::Pinsrb; 2510 let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); 2511 let expr2_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0); 2512 let expr3_0 = OperandSize::Size32; 2513 let expr4_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, &expr3_0)?; 2514 return Some(expr4_0); 2515 } 2516 2517 // Generated as internal constructor for term pinsrw. 2518 pub fn constructor_pinsrw<C: Context>( 2519 ctx: &mut C, 2520 arg0: Xmm, 2521 arg1: &GprMem, 2522 arg2: u8, 2523 ) -> Option<Xmm> { 2524 let pattern0_0 = arg0; 2525 let pattern1_0 = arg1; 2526 let pattern2_0 = arg2; 2527 // Rule at src/isa/x64/inst.isle line 1858. 2528 let expr0_0 = SseOpcode::Pinsrw; 2529 let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); 2530 let expr2_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0); 2531 let expr3_0 = OperandSize::Size32; 2532 let expr4_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, &expr3_0)?; 2533 return Some(expr4_0); 2534 } 2535 2536 // Generated as internal constructor for term pinsrd. 2537 pub fn constructor_pinsrd<C: Context>( 2538 ctx: &mut C, 2539 arg0: Xmm, 2540 arg1: &GprMem, 2541 arg2: u8, 2542 arg3: &OperandSize, 2543 ) -> Option<Xmm> { 2544 let pattern0_0 = arg0; 2545 let pattern1_0 = arg1; 2546 let pattern2_0 = arg2; 2547 let pattern3_0 = arg3; 2548 // Rule at src/isa/x64/inst.isle line 1867. 2549 let expr0_0 = SseOpcode::Pinsrd; 2550 let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); 2551 let expr2_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0); 2552 let expr3_0 = 2553 constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, pattern3_0)?; 2554 return Some(expr3_0); 2555 } 2556 2557 // Generated as internal constructor for term insertps. 2558 pub fn constructor_insertps<C: Context>( 2559 ctx: &mut C, 2560 arg0: Xmm, 2561 arg1: &XmmMem, 2562 arg2: u8, 2563 ) -> Option<Xmm> { 2564 let pattern0_0 = arg0; 2565 let pattern1_0 = arg1; 2566 let pattern2_0 = arg2; 2567 // Rule at src/isa/x64/inst.isle line 1876. 2568 let expr0_0 = SseOpcode::Insertps; 2569 let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); 2570 let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0); 2571 let expr3_0 = OperandSize::Size32; 2572 let expr4_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, &expr3_0)?; 2573 return Some(expr4_0); 2574 } 2575 2576 // Generated as internal constructor for term pshufd. 2577 pub fn constructor_pshufd<C: Context>( 2578 ctx: &mut C, 2579 arg0: &XmmMem, 2580 arg1: u8, 2581 arg2: &OperandSize, 2582 ) -> Option<Xmm> { 2583 let pattern0_0 = arg0; 2584 let pattern1_0 = arg1; 2585 let pattern2_0 = arg2; 2586 // Rule at src/isa/x64/inst.isle line 1885. 2587 let expr0_0 = C::temp_writable_xmm(ctx); 2588 let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 2589 let expr2_0 = SseOpcode::Pshufd; 2590 let expr3_0 = C::xmm_to_reg(ctx, expr1_0); 2591 let expr4_0 = C::xmm_mem_to_reg_mem(ctx, pattern0_0); 2592 let expr5_0 = C::writable_xmm_to_reg(ctx, expr0_0); 2593 let expr6_0 = MInst::XmmRmRImm { 2594 op: expr2_0, 2595 src1: expr3_0, 2596 src2: expr4_0, 2597 dst: expr5_0, 2598 imm: pattern1_0, 2599 size: pattern2_0.clone(), 2600 }; 2601 let expr7_0 = C::emit(ctx, &expr6_0); 2602 return Some(expr1_0); 2603 } 2604 2605 // Generated as internal constructor for term xmm_unary_rm_r. 2606 pub fn constructor_xmm_unary_rm_r<C: Context>( 2607 ctx: &mut C, 2608 arg0: &SseOpcode, 2609 arg1: &XmmMem, 2610 ) -> Option<Xmm> { 2611 let pattern0_0 = arg0; 2612 let pattern1_0 = arg1; 2613 // Rule at src/isa/x64/inst.isle line 1898. 2614 let expr0_0 = C::temp_writable_xmm(ctx); 2615 let expr1_0 = MInst::XmmUnaryRmR { 2616 op: pattern0_0.clone(), 2617 src: pattern1_0.clone(), 2618 dst: expr0_0, 2619 }; 2620 let expr2_0 = C::emit(ctx, &expr1_0); 2621 let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 2622 return Some(expr3_0); 2623 } 2624 2625 // Generated as internal constructor for term pmovsxbw. 2626 pub fn constructor_pmovsxbw<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> { 2627 let pattern0_0 = arg0; 2628 // Rule at src/isa/x64/inst.isle line 1905. 2629 let expr0_0 = SseOpcode::Pmovsxbw; 2630 let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; 2631 return Some(expr1_0); 2632 } 2633 2634 // Generated as internal constructor for term pmovzxbw. 2635 pub fn constructor_pmovzxbw<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> { 2636 let pattern0_0 = arg0; 2637 // Rule at src/isa/x64/inst.isle line 1910. 2638 let expr0_0 = SseOpcode::Pmovzxbw; 2639 let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; 2640 return Some(expr1_0); 2641 } 2642 2643 // Generated as internal constructor for term pabsb. 2644 pub fn constructor_pabsb<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> { 2645 let pattern0_0 = arg0; 2646 // Rule at src/isa/x64/inst.isle line 1915. 2647 let expr0_0 = SseOpcode::Pabsb; 2648 let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; 2649 return Some(expr1_0); 2650 } 2651 2652 // Generated as internal constructor for term pabsw. 2653 pub fn constructor_pabsw<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> { 2654 let pattern0_0 = arg0; 2655 // Rule at src/isa/x64/inst.isle line 1920. 2656 let expr0_0 = SseOpcode::Pabsw; 2657 let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; 2658 return Some(expr1_0); 2659 } 2660 2661 // Generated as internal constructor for term pabsd. 2662 pub fn constructor_pabsd<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> { 2663 let pattern0_0 = arg0; 2664 // Rule at src/isa/x64/inst.isle line 1925. 2665 let expr0_0 = SseOpcode::Pabsd; 2666 let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; 2667 return Some(expr1_0); 2668 } 2669 2670 // Generated as internal constructor for term xmm_unary_rm_r_evex. 2671 pub fn constructor_xmm_unary_rm_r_evex<C: Context>( 2672 ctx: &mut C, 2673 arg0: &Avx512Opcode, 2674 arg1: &XmmMem, 2675 ) -> Option<Xmm> { 2676 let pattern0_0 = arg0; 2677 let pattern1_0 = arg1; 2678 // Rule at src/isa/x64/inst.isle line 1930. 2679 let expr0_0 = C::temp_writable_xmm(ctx); 2680 let expr1_0 = MInst::XmmUnaryRmREvex { 2681 op: pattern0_0.clone(), 2682 src: pattern1_0.clone(), 2683 dst: expr0_0, 2684 }; 2685 let expr2_0 = C::emit(ctx, &expr1_0); 2686 let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 2687 return Some(expr3_0); 2688 } 2689 2690 // Generated as internal constructor for term vpabsq. 2691 pub fn constructor_vpabsq<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> { 2692 let pattern0_0 = arg0; 2693 // Rule at src/isa/x64/inst.isle line 1937. 2694 let expr0_0 = Avx512Opcode::Vpabsq; 2695 let expr1_0 = constructor_xmm_unary_rm_r_evex(ctx, &expr0_0, pattern0_0)?; 2696 return Some(expr1_0); 2697 } 2698 2699 // Generated as internal constructor for term xmm_rm_r_evex. 2700 pub fn constructor_xmm_rm_r_evex<C: Context>( 2701 ctx: &mut C, 2702 arg0: &Avx512Opcode, 2703 arg1: &XmmMem, 2704 arg2: Xmm, 2705 ) -> Option<Xmm> { 2706 let pattern0_0 = arg0; 2707 let pattern1_0 = arg1; 2708 let pattern2_0 = arg2; 2709 // Rule at src/isa/x64/inst.isle line 1942. 2710 let expr0_0 = C::temp_writable_xmm(ctx); 2711 let expr1_0 = MInst::XmmRmREvex { 2712 op: pattern0_0.clone(), 2713 src1: pattern1_0.clone(), 2714 src2: pattern2_0, 2715 dst: expr0_0, 2716 }; 2717 let expr2_0 = C::emit(ctx, &expr1_0); 2718 let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 2719 return Some(expr3_0); 2720 } 2721 2722 // Generated as internal constructor for term vpmullq. 2723 pub fn constructor_vpmullq<C: Context>(ctx: &mut C, arg0: &XmmMem, arg1: Xmm) -> Option<Xmm> { 2724 let pattern0_0 = arg0; 2725 let pattern1_0 = arg1; 2726 // Rule at src/isa/x64/inst.isle line 1954. 2727 let expr0_0 = Avx512Opcode::Vpmullq; 2728 let expr1_0 = constructor_xmm_rm_r_evex(ctx, &expr0_0, pattern0_0, pattern1_0)?; 2729 return Some(expr1_0); 2730 } 2731 2732 // Generated as internal constructor for term mul_hi. 2733 pub fn constructor_mul_hi<C: Context>( 2734 ctx: &mut C, 2735 arg0: Type, 2736 arg1: bool, 2737 arg2: Gpr, 2738 arg3: &GprMem, 2739 ) -> Option<ValueRegs> { 2740 let pattern0_0 = arg0; 2741 let pattern1_0 = arg1; 2742 let pattern2_0 = arg2; 2743 let pattern3_0 = arg3; 2744 // Rule at src/isa/x64/inst.isle line 1963. 2745 let expr0_0 = C::temp_writable_gpr(ctx); 2746 let expr1_0 = C::temp_writable_gpr(ctx); 2747 let expr2_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 2748 let expr3_0 = MInst::MulHi { 2749 size: expr2_0, 2750 signed: pattern1_0, 2751 src1: pattern2_0, 2752 src2: pattern3_0.clone(), 2753 dst_lo: expr0_0, 2754 dst_hi: expr1_0, 2755 }; 2756 let expr4_0 = C::emit(ctx, &expr3_0); 2757 let expr5_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 2758 let expr6_0 = C::writable_gpr_to_gpr(ctx, expr1_0); 2759 let expr7_0 = constructor_value_gprs(ctx, expr5_0, expr6_0)?; 2760 return Some(expr7_0); 2761 } 2762 2763 // Generated as internal constructor for term mulhi_u. 2764 pub fn constructor_mulhi_u<C: Context>( 2765 ctx: &mut C, 2766 arg0: Type, 2767 arg1: Gpr, 2768 arg2: &GprMem, 2769 ) -> Option<ValueRegs> { 2770 let pattern0_0 = arg0; 2771 let pattern1_0 = arg1; 2772 let pattern2_0 = arg2; 2773 // Rule at src/isa/x64/inst.isle line 1979. 2774 let expr0_0: bool = false; 2775 let expr1_0 = constructor_mul_hi(ctx, pattern0_0, expr0_0, pattern1_0, pattern2_0)?; 2776 return Some(expr1_0); 2777 } 2778 2779 // Generated as internal constructor for term xmm_rmi_xmm. 2780 pub fn constructor_xmm_rmi_xmm<C: Context>( 2781 ctx: &mut C, 2782 arg0: &SseOpcode, 2783 arg1: Xmm, 2784 arg2: &XmmMemImm, 2785 ) -> Option<Xmm> { 2786 let pattern0_0 = arg0; 2787 let pattern1_0 = arg1; 2788 let pattern2_0 = arg2; 2789 // Rule at src/isa/x64/inst.isle line 1984. 2790 let expr0_0 = C::temp_writable_xmm(ctx); 2791 let expr1_0 = MInst::XmmRmiReg { 2792 opcode: pattern0_0.clone(), 2793 src1: pattern1_0, 2794 src2: pattern2_0.clone(), 2795 dst: expr0_0, 2796 }; 2797 let expr2_0 = C::emit(ctx, &expr1_0); 2798 let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 2799 return Some(expr3_0); 2800 } 2801 2802 // Generated as internal constructor for term psllw. 2803 pub fn constructor_psllw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> { 2804 let pattern0_0 = arg0; 2805 let pattern1_0 = arg1; 2806 // Rule at src/isa/x64/inst.isle line 1994. 2807 let expr0_0 = SseOpcode::Psllw; 2808 let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; 2809 return Some(expr1_0); 2810 } 2811 2812 // Generated as internal constructor for term pslld. 2813 pub fn constructor_pslld<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> { 2814 let pattern0_0 = arg0; 2815 let pattern1_0 = arg1; 2816 // Rule at src/isa/x64/inst.isle line 1999. 2817 let expr0_0 = SseOpcode::Pslld; 2818 let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; 2819 return Some(expr1_0); 2820 } 2821 2822 // Generated as internal constructor for term psllq. 2823 pub fn constructor_psllq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> { 2824 let pattern0_0 = arg0; 2825 let pattern1_0 = arg1; 2826 // Rule at src/isa/x64/inst.isle line 2004. 2827 let expr0_0 = SseOpcode::Psllq; 2828 let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; 2829 return Some(expr1_0); 2830 } 2831 2832 // Generated as internal constructor for term psrlw. 2833 pub fn constructor_psrlw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> { 2834 let pattern0_0 = arg0; 2835 let pattern1_0 = arg1; 2836 // Rule at src/isa/x64/inst.isle line 2009. 2837 let expr0_0 = SseOpcode::Psrlw; 2838 let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; 2839 return Some(expr1_0); 2840 } 2841 2842 // Generated as internal constructor for term psrld. 2843 pub fn constructor_psrld<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> { 2844 let pattern0_0 = arg0; 2845 let pattern1_0 = arg1; 2846 // Rule at src/isa/x64/inst.isle line 2014. 2847 let expr0_0 = SseOpcode::Psrld; 2848 let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; 2849 return Some(expr1_0); 2850 } 2851 2852 // Generated as internal constructor for term psrlq. 2853 pub fn constructor_psrlq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> { 2854 let pattern0_0 = arg0; 2855 let pattern1_0 = arg1; 2856 // Rule at src/isa/x64/inst.isle line 2019. 2857 let expr0_0 = SseOpcode::Psrlq; 2858 let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; 2859 return Some(expr1_0); 2860 } 2861 2862 // Generated as internal constructor for term psraw. 2863 pub fn constructor_psraw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> { 2864 let pattern0_0 = arg0; 2865 let pattern1_0 = arg1; 2866 // Rule at src/isa/x64/inst.isle line 2024. 2867 let expr0_0 = SseOpcode::Psraw; 2868 let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; 2869 return Some(expr1_0); 2870 } 2871 2872 // Generated as internal constructor for term psrad. 2873 pub fn constructor_psrad<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> { 2874 let pattern0_0 = arg0; 2875 let pattern1_0 = arg1; 2876 // Rule at src/isa/x64/inst.isle line 2029. 2877 let expr0_0 = SseOpcode::Psrad; 2878 let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; 2879 return Some(expr1_0); 2880 } 2881 2882 // Generated as internal constructor for term pextrd. 2883 pub fn constructor_pextrd<C: Context>(ctx: &mut C, arg0: Type, arg1: Xmm, arg2: u8) -> Option<Gpr> { 2884 let pattern0_0 = arg0; 2885 let pattern1_0 = arg1; 2886 let pattern2_0 = arg2; 2887 // Rule at src/isa/x64/inst.isle line 2034. 2888 let expr0_0 = C::temp_writable_gpr(ctx); 2889 let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 2890 let expr2_0 = SseOpcode::Pextrd; 2891 let expr3_0 = C::gpr_to_reg(ctx, expr1_0); 2892 let expr4_0 = C::xmm_to_reg(ctx, pattern1_0); 2893 let expr5_0 = RegMem::Reg { reg: expr4_0 }; 2894 let expr6_0 = C::writable_gpr_to_reg(ctx, expr0_0); 2895 let expr7_0 = C::lane_type(ctx, pattern0_0); 2896 let expr8_0 = C::operand_size_of_type_32_64(ctx, expr7_0); 2897 let expr9_0 = MInst::XmmRmRImm { 2898 op: expr2_0, 2899 src1: expr3_0, 2900 src2: expr5_0, 2901 dst: expr6_0, 2902 imm: pattern2_0, 2903 size: expr8_0, 2904 }; 2905 let expr10_0 = C::emit(ctx, &expr9_0); 2906 return Some(expr1_0); 2907 } 2908 2909 // Generated as internal constructor for term cmppd. 2910 pub fn constructor_cmppd<C: Context>( 2911 ctx: &mut C, 2912 arg0: Xmm, 2913 arg1: &XmmMem, 2914 arg2: &FcmpImm, 2915 ) -> Option<Xmm> { 2916 let pattern0_0 = arg0; 2917 let pattern1_0 = arg1; 2918 let pattern2_0 = arg2; 2919 // Rule at src/isa/x64/inst.isle line 2051. 2920 let expr0_0 = SseOpcode::Cmppd; 2921 let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); 2922 let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0); 2923 let expr3_0 = C::encode_fcmp_imm(ctx, pattern2_0); 2924 let expr4_0 = OperandSize::Size32; 2925 let expr5_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, expr3_0, &expr4_0)?; 2926 return Some(expr5_0); 2927 } 2928 2929 // Generated as internal constructor for term gpr_to_xmm. 2930 pub fn constructor_gpr_to_xmm<C: Context>( 2931 ctx: &mut C, 2932 arg0: &SseOpcode, 2933 arg1: &GprMem, 2934 arg2: &OperandSize, 2935 ) -> Option<Xmm> { 2936 let pattern0_0 = arg0; 2937 let pattern1_0 = arg1; 2938 let pattern2_0 = arg2; 2939 // Rule at src/isa/x64/inst.isle line 2060. 2940 let expr0_0 = C::temp_writable_xmm(ctx); 2941 let expr1_0 = MInst::GprToXmm { 2942 op: pattern0_0.clone(), 2943 src: pattern1_0.clone(), 2944 dst: expr0_0, 2945 src_size: pattern2_0.clone(), 2946 }; 2947 let expr2_0 = C::emit(ctx, &expr1_0); 2948 let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 2949 return Some(expr3_0); 2950 } 2951 2952 // Generated as internal constructor for term not. 2953 pub fn constructor_not<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> { 2954 let pattern0_0 = arg0; 2955 let pattern1_0 = arg1; 2956 // Rule at src/isa/x64/inst.isle line 2067. 2957 let expr0_0 = C::temp_writable_gpr(ctx); 2958 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 2959 let expr2_0 = MInst::Not { 2960 size: expr1_0, 2961 src: pattern1_0, 2962 dst: expr0_0, 2963 }; 2964 let expr3_0 = C::emit(ctx, &expr2_0); 2965 let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 2966 return Some(expr4_0); 2967 } 2968 2969 // Generated as internal constructor for term neg. 2970 pub fn constructor_neg<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> { 2971 let pattern0_0 = arg0; 2972 let pattern1_0 = arg1; 2973 // Rule at src/isa/x64/inst.isle line 2075. 2974 let expr0_0 = C::temp_writable_gpr(ctx); 2975 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 2976 let expr2_0 = MInst::Neg { 2977 size: expr1_0, 2978 src: pattern1_0, 2979 dst: expr0_0, 2980 }; 2981 let expr3_0 = C::emit(ctx, &expr2_0); 2982 let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 2983 return Some(expr4_0); 2984 } 2985 2986 // Generated as internal constructor for term lea. 2987 pub fn constructor_lea<C: Context>(ctx: &mut C, arg0: &SyntheticAmode) -> Option<Gpr> { 2988 let pattern0_0 = arg0; 2989 // Rule at src/isa/x64/inst.isle line 2082. 2990 let expr0_0 = C::temp_writable_gpr(ctx); 2991 let expr1_0 = MInst::LoadEffectiveAddress { 2992 addr: pattern0_0.clone(), 2993 dst: expr0_0, 2994 }; 2995 let expr2_0 = C::emit(ctx, &expr1_0); 2996 let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 2997 return Some(expr3_0); 2998 } 2999 3000 // Generated as internal constructor for term ud2. 3001 pub fn constructor_ud2<C: Context>(ctx: &mut C, arg0: &TrapCode) -> Option<SideEffectNoResult> { 3002 let pattern0_0 = arg0; 3003 // Rule at src/isa/x64/inst.isle line 2089. 3004 let expr0_0 = MInst::Ud2 { 3005 trap_code: pattern0_0.clone(), 3006 }; 3007 let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; 3008 return Some(expr1_0); 3009 } 3010 3011 // Generated as internal constructor for term lower. 3012 pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<ValueRegs> { 3013 let pattern0_0 = arg0; 3014 let pattern1_0 = C::inst_data(ctx, pattern0_0); 3015 match &pattern1_0 { 3016 &InstructionData::UnaryIeee32 { 3017 opcode: ref pattern2_0, 3018 imm: pattern2_1, 3019 } => { 3020 if let &Opcode::F32const = &pattern2_0 { 3021 let pattern4_0 = C::u64_from_ieee32(ctx, pattern2_1); 3022 // Rule at src/isa/x64/lower.isle line 46. 3023 let expr0_0: Type = F32; 3024 let expr1_0 = constructor_imm(ctx, expr0_0, pattern4_0)?; 3025 let expr2_0 = C::value_reg(ctx, expr1_0); 3026 return Some(expr2_0); 3027 } 3028 } 3029 &InstructionData::UnaryIeee64 { 3030 opcode: ref pattern2_0, 3031 imm: pattern2_1, 3032 } => { 3033 if let &Opcode::F64const = &pattern2_0 { 3034 let pattern4_0 = C::u64_from_ieee64(ctx, pattern2_1); 3035 // Rule at src/isa/x64/lower.isle line 51. 3036 let expr0_0: Type = F64; 3037 let expr1_0 = constructor_imm(ctx, expr0_0, pattern4_0)?; 3038 let expr2_0 = C::value_reg(ctx, expr1_0); 3039 return Some(expr2_0); 3040 } 3041 } 3042 &InstructionData::Trap { 3043 opcode: ref pattern2_0, 3044 code: ref pattern2_1, 3045 } => { 3046 match &pattern2_0 { 3047 &Opcode::Trap => { 3048 // Rule at src/isa/x64/lower.isle line 1532. 3049 let expr0_0 = constructor_ud2(ctx, &pattern2_1)?; 3050 let expr1_0 = constructor_safepoint(ctx, &expr0_0)?; 3051 return Some(expr1_0); 3052 } 3053 &Opcode::ResumableTrap => { 3054 // Rule at src/isa/x64/lower.isle line 1537. 3055 let expr0_0 = constructor_ud2(ctx, &pattern2_1)?; 3056 let expr1_0 = constructor_safepoint(ctx, &expr0_0)?; 3057 return Some(expr1_0); 3058 } 3059 _ => {} 3060 } 3061 } 3062 &InstructionData::TernaryImm8 { 3063 opcode: ref pattern2_0, 3064 args: ref pattern2_1, 3065 imm: pattern2_2, 3066 } => { 3067 if let &Opcode::Insertlane = &pattern2_0 { 3068 let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, &pattern2_1); 3069 let pattern5_0 = C::value_type(ctx, pattern4_0); 3070 let pattern6_0 = C::u8_from_uimm8(ctx, pattern2_2); 3071 // Rule at src/isa/x64/lower.isle line 1399. 3072 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 3073 let expr1_0 = C::put_in_reg_mem(ctx, pattern4_1); 3074 let expr2_0 = 3075 constructor_vec_insert_lane(ctx, pattern5_0, expr0_0, &expr1_0, pattern6_0)?; 3076 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 3077 return Some(expr3_0); 3078 } 3079 } 3080 _ => {} 3081 } 3082 if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { 3083 let pattern2_0 = C::value_type(ctx, pattern1_0); 3084 if pattern2_0 == B128 { 3085 let pattern4_0 = C::inst_data(ctx, pattern0_0); 3086 match &pattern4_0 { 3087 &InstructionData::UnaryBool { 3088 opcode: ref pattern5_0, 3089 imm: pattern5_1, 3090 } => { 3091 if let &Opcode::Bconst = &pattern5_0 { 3092 if pattern5_1 == true { 3093 // Rule at src/isa/x64/lower.isle line 39. 3094 let expr0_0: Type = B64; 3095 let expr1_0: u64 = 1; 3096 let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?; 3097 let expr3_0: Type = B64; 3098 let expr4_0: u64 = 0; 3099 let expr5_0 = constructor_imm(ctx, expr3_0, expr4_0)?; 3100 let expr6_0 = C::value_regs(ctx, expr2_0, expr5_0); 3101 return Some(expr6_0); 3102 } 3103 if pattern5_1 == false { 3104 // Rule at src/isa/x64/lower.isle line 34. 3105 let expr0_0: Type = B64; 3106 let expr1_0: u64 = 0; 3107 let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?; 3108 let expr3_0: Type = B64; 3109 let expr4_0: u64 = 0; 3110 let expr5_0 = constructor_imm(ctx, expr3_0, expr4_0)?; 3111 let expr6_0 = C::value_regs(ctx, expr2_0, expr5_0); 3112 return Some(expr6_0); 3113 } 3114 } 3115 } 3116 &InstructionData::Binary { 3117 opcode: ref pattern5_0, 3118 args: ref pattern5_1, 3119 } => { 3120 match &pattern5_0 { 3121 &Opcode::Band => { 3122 let (pattern7_0, pattern7_1) = 3123 C::unpack_value_array_2(ctx, &pattern5_1); 3124 // Rule at src/isa/x64/lower.isle line 386. 3125 let expr0_0 = C::put_in_regs(ctx, pattern7_0); 3126 let expr1_0: usize = 0; 3127 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 3128 let expr3_0: usize = 1; 3129 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?; 3130 let expr5_0 = constructor_lo_gpr(ctx, pattern7_1)?; 3131 let expr6_0: Type = I64; 3132 let expr7_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0); 3133 let expr8_0 = constructor_x64_and(ctx, expr6_0, expr2_0, &expr7_0)?; 3134 let expr9_0 = constructor_value_gprs(ctx, expr8_0, expr4_0)?; 3135 return Some(expr9_0); 3136 } 3137 &Opcode::Bor => { 3138 let (pattern7_0, pattern7_1) = 3139 C::unpack_value_array_2(ctx, &pattern5_1); 3140 // Rule at src/isa/x64/lower.isle line 462. 3141 let expr0_0 = C::put_in_regs(ctx, pattern7_0); 3142 let expr1_0: usize = 0; 3143 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 3144 let expr3_0: usize = 1; 3145 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?; 3146 let expr5_0 = constructor_lo_gpr(ctx, pattern7_1)?; 3147 let expr6_0: Type = I64; 3148 let expr7_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0); 3149 let expr8_0 = constructor_or(ctx, expr6_0, expr2_0, &expr7_0)?; 3150 let expr9_0 = constructor_value_gprs(ctx, expr8_0, expr4_0)?; 3151 return Some(expr9_0); 3152 } 3153 &Opcode::Bxor => { 3154 let (pattern7_0, pattern7_1) = 3155 C::unpack_value_array_2(ctx, &pattern5_1); 3156 // Rule at src/isa/x64/lower.isle line 528. 3157 let expr0_0 = C::put_in_regs(ctx, pattern7_0); 3158 let expr1_0: usize = 0; 3159 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 3160 let expr3_0: usize = 1; 3161 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?; 3162 let expr5_0 = constructor_lo_gpr(ctx, pattern7_1)?; 3163 let expr6_0: Type = I64; 3164 let expr7_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0); 3165 let expr8_0 = constructor_xor(ctx, expr6_0, expr2_0, &expr7_0)?; 3166 let expr9_0 = constructor_value_gprs(ctx, expr8_0, expr4_0)?; 3167 return Some(expr9_0); 3168 } 3169 _ => {} 3170 } 3171 } 3172 &InstructionData::Unary { 3173 opcode: ref pattern5_0, 3174 arg: pattern5_1, 3175 } => { 3176 if let &Opcode::Bnot = &pattern5_0 { 3177 // Rule at src/isa/x64/lower.isle line 1366. 3178 let expr0_0 = constructor_i128_not(ctx, pattern5_1)?; 3179 return Some(expr0_0); 3180 } 3181 } 3182 _ => {} 3183 } 3184 } 3185 if pattern2_0 == I128 { 3186 let pattern4_0 = C::inst_data(ctx, pattern0_0); 3187 match &pattern4_0 { 3188 &InstructionData::UnaryImm { 3189 opcode: ref pattern5_0, 3190 imm: pattern5_1, 3191 } => { 3192 if let &Opcode::Iconst = &pattern5_0 { 3193 let pattern7_0 = C::u64_from_imm64(ctx, pattern5_1); 3194 // Rule at src/isa/x64/lower.isle line 15. 3195 let expr0_0: Type = I64; 3196 let expr1_0 = constructor_imm(ctx, expr0_0, pattern7_0)?; 3197 let expr2_0: Type = I64; 3198 let expr3_0: u64 = 0; 3199 let expr4_0 = constructor_imm(ctx, expr2_0, expr3_0)?; 3200 let expr5_0 = C::value_regs(ctx, expr1_0, expr4_0); 3201 return Some(expr5_0); 3202 } 3203 } 3204 &InstructionData::Binary { 3205 opcode: ref pattern5_0, 3206 args: ref pattern5_1, 3207 } => { 3208 match &pattern5_0 { 3209 &Opcode::Iadd => { 3210 let (pattern7_0, pattern7_1) = 3211 C::unpack_value_array_2(ctx, &pattern5_1); 3212 // Rule at src/isa/x64/lower.isle line 117. 3213 let expr0_0 = C::put_in_regs(ctx, pattern7_0); 3214 let expr1_0: usize = 0; 3215 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 3216 let expr3_0: usize = 1; 3217 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?; 3218 let expr5_0 = C::put_in_regs(ctx, pattern7_1); 3219 let expr6_0: usize = 0; 3220 let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?; 3221 let expr8_0: usize = 1; 3222 let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?; 3223 let expr10_0: Type = I64; 3224 let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0); 3225 let expr12_0 = 3226 constructor_add_with_flags(ctx, expr10_0, expr2_0, &expr11_0)?; 3227 let expr13_0: Type = I64; 3228 let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); 3229 let expr15_0 = constructor_adc(ctx, expr13_0, expr4_0, &expr14_0)?; 3230 let expr16_0 = constructor_with_flags(ctx, &expr12_0, &expr15_0)?; 3231 return Some(expr16_0); 3232 } 3233 &Opcode::Isub => { 3234 let (pattern7_0, pattern7_1) = 3235 C::unpack_value_array_2(ctx, &pattern5_1); 3236 // Rule at src/isa/x64/lower.isle line 286. 3237 let expr0_0 = C::put_in_regs(ctx, pattern7_0); 3238 let expr1_0: usize = 0; 3239 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 3240 let expr3_0: usize = 1; 3241 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?; 3242 let expr5_0 = C::put_in_regs(ctx, pattern7_1); 3243 let expr6_0: usize = 0; 3244 let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?; 3245 let expr8_0: usize = 1; 3246 let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?; 3247 let expr10_0: Type = I64; 3248 let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0); 3249 let expr12_0 = 3250 constructor_sub_with_flags(ctx, expr10_0, expr2_0, &expr11_0)?; 3251 let expr13_0: Type = I64; 3252 let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); 3253 let expr15_0 = constructor_sbb(ctx, expr13_0, expr4_0, &expr14_0)?; 3254 let expr16_0 = constructor_with_flags(ctx, &expr12_0, &expr15_0)?; 3255 return Some(expr16_0); 3256 } 3257 &Opcode::Imul => { 3258 let (pattern7_0, pattern7_1) = 3259 C::unpack_value_array_2(ctx, &pattern5_1); 3260 // Rule at src/isa/x64/lower.isle line 1052. 3261 let expr0_0 = C::put_in_regs(ctx, pattern7_0); 3262 let expr1_0: usize = 0; 3263 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 3264 let expr3_0: usize = 1; 3265 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?; 3266 let expr5_0 = C::put_in_regs(ctx, pattern7_1); 3267 let expr6_0: usize = 0; 3268 let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?; 3269 let expr8_0: usize = 1; 3270 let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?; 3271 let expr10_0: Type = I64; 3272 let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); 3273 let expr12_0 = constructor_mul(ctx, expr10_0, expr2_0, &expr11_0)?; 3274 let expr13_0: Type = I64; 3275 let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0); 3276 let expr15_0 = constructor_mul(ctx, expr13_0, expr4_0, &expr14_0)?; 3277 let expr16_0: Type = I64; 3278 let expr17_0 = C::gpr_to_gpr_mem_imm(ctx, expr15_0); 3279 let expr18_0 = constructor_add(ctx, expr16_0, expr12_0, &expr17_0)?; 3280 let expr19_0: Type = I64; 3281 let expr20_0 = C::gpr_to_gpr_mem(ctx, expr7_0); 3282 let expr21_0 = constructor_mulhi_u(ctx, expr19_0, expr2_0, &expr20_0)?; 3283 let expr22_0: usize = 0; 3284 let expr23_0 = constructor_value_regs_get_gpr(ctx, expr21_0, expr22_0)?; 3285 let expr24_0: usize = 1; 3286 let expr25_0 = constructor_value_regs_get_gpr(ctx, expr21_0, expr24_0)?; 3287 let expr26_0: Type = I64; 3288 let expr27_0 = C::gpr_to_gpr_mem_imm(ctx, expr25_0); 3289 let expr28_0 = constructor_add(ctx, expr26_0, expr18_0, &expr27_0)?; 3290 let expr29_0 = constructor_value_gprs(ctx, expr23_0, expr28_0)?; 3291 return Some(expr29_0); 3292 } 3293 &Opcode::Band => { 3294 let (pattern7_0, pattern7_1) = 3295 C::unpack_value_array_2(ctx, &pattern5_1); 3296 // Rule at src/isa/x64/lower.isle line 376. 3297 let expr0_0 = C::put_in_regs(ctx, pattern7_0); 3298 let expr1_0: usize = 0; 3299 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 3300 let expr3_0: usize = 1; 3301 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?; 3302 let expr5_0 = C::put_in_regs(ctx, pattern7_1); 3303 let expr6_0: usize = 0; 3304 let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?; 3305 let expr8_0: usize = 1; 3306 let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?; 3307 let expr10_0: Type = I64; 3308 let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0); 3309 let expr12_0 = constructor_x64_and(ctx, expr10_0, expr2_0, &expr11_0)?; 3310 let expr13_0: Type = I64; 3311 let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); 3312 let expr15_0 = constructor_x64_and(ctx, expr13_0, expr4_0, &expr14_0)?; 3313 let expr16_0 = constructor_value_gprs(ctx, expr12_0, expr15_0)?; 3314 return Some(expr16_0); 3315 } 3316 &Opcode::Bor => { 3317 let (pattern7_0, pattern7_1) = 3318 C::unpack_value_array_2(ctx, &pattern5_1); 3319 // Rule at src/isa/x64/lower.isle line 459. 3320 let expr0_0 = C::put_in_regs(ctx, pattern7_0); 3321 let expr1_0 = C::put_in_regs(ctx, pattern7_1); 3322 let expr2_0 = constructor_or_i128(ctx, expr0_0, expr1_0)?; 3323 return Some(expr2_0); 3324 } 3325 &Opcode::Bxor => { 3326 let (pattern7_0, pattern7_1) = 3327 C::unpack_value_array_2(ctx, &pattern5_1); 3328 // Rule at src/isa/x64/lower.isle line 518. 3329 let expr0_0 = C::put_in_regs(ctx, pattern7_0); 3330 let expr1_0: usize = 0; 3331 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 3332 let expr3_0: usize = 1; 3333 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?; 3334 let expr5_0 = C::put_in_regs(ctx, pattern7_1); 3335 let expr6_0: usize = 0; 3336 let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?; 3337 let expr8_0: usize = 1; 3338 let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?; 3339 let expr10_0: Type = I64; 3340 let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0); 3341 let expr12_0 = constructor_xor(ctx, expr10_0, expr2_0, &expr11_0)?; 3342 let expr13_0: Type = I64; 3343 let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); 3344 let expr15_0 = constructor_xor(ctx, expr13_0, expr4_0, &expr14_0)?; 3345 let expr16_0 = constructor_value_gprs(ctx, expr12_0, expr15_0)?; 3346 return Some(expr16_0); 3347 } 3348 &Opcode::Rotl => { 3349 let (pattern7_0, pattern7_1) = 3350 C::unpack_value_array_2(ctx, &pattern5_1); 3351 // Rule at src/isa/x64/lower.isle line 916. 3352 let expr0_0 = C::put_in_regs(ctx, pattern7_0); 3353 let expr1_0 = constructor_lo_gpr(ctx, pattern7_1)?; 3354 let expr2_0 = constructor_shl_i128(ctx, expr0_0, expr1_0)?; 3355 let expr3_0: Type = I64; 3356 let expr4_0: Type = I64; 3357 let expr5_0: u64 = 128; 3358 let expr6_0 = constructor_imm(ctx, expr4_0, expr5_0)?; 3359 let expr7_0 = C::gpr_new(ctx, expr6_0); 3360 let expr8_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0); 3361 let expr9_0 = constructor_sub(ctx, expr3_0, expr7_0, &expr8_0)?; 3362 let expr10_0 = constructor_shr_i128(ctx, expr0_0, expr9_0)?; 3363 let expr11_0 = constructor_or_i128(ctx, expr2_0, expr10_0)?; 3364 return Some(expr11_0); 3365 } 3366 &Opcode::Rotr => { 3367 let (pattern7_0, pattern7_1) = 3368 C::unpack_value_array_2(ctx, &pattern5_1); 3369 // Rule at src/isa/x64/lower.isle line 958. 3370 let expr0_0 = C::put_in_regs(ctx, pattern7_0); 3371 let expr1_0 = constructor_lo_gpr(ctx, pattern7_1)?; 3372 let expr2_0 = constructor_shr_i128(ctx, expr0_0, expr1_0)?; 3373 let expr3_0: Type = I64; 3374 let expr4_0: Type = I64; 3375 let expr5_0: u64 = 128; 3376 let expr6_0 = constructor_imm(ctx, expr4_0, expr5_0)?; 3377 let expr7_0 = C::gpr_new(ctx, expr6_0); 3378 let expr8_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0); 3379 let expr9_0 = constructor_sub(ctx, expr3_0, expr7_0, &expr8_0)?; 3380 let expr10_0 = constructor_shl_i128(ctx, expr0_0, expr9_0)?; 3381 let expr11_0 = constructor_or_i128(ctx, expr2_0, expr10_0)?; 3382 return Some(expr11_0); 3383 } 3384 &Opcode::Ishl => { 3385 let (pattern7_0, pattern7_1) = 3386 C::unpack_value_array_2(ctx, &pattern5_1); 3387 // Rule at src/isa/x64/lower.isle line 583. 3388 let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?; 3389 let expr1_0 = C::put_in_regs(ctx, pattern7_0); 3390 let expr2_0 = constructor_shl_i128(ctx, expr1_0, expr0_0)?; 3391 return Some(expr2_0); 3392 } 3393 &Opcode::Ushr => { 3394 let (pattern7_0, pattern7_1) = 3395 C::unpack_value_array_2(ctx, &pattern5_1); 3396 // Rule at src/isa/x64/lower.isle line 695. 3397 let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?; 3398 let expr1_0 = C::put_in_regs(ctx, pattern7_0); 3399 let expr2_0 = constructor_shr_i128(ctx, expr1_0, expr0_0)?; 3400 return Some(expr2_0); 3401 } 3402 &Opcode::Sshr => { 3403 let (pattern7_0, pattern7_1) = 3404 C::unpack_value_array_2(ctx, &pattern5_1); 3405 // Rule at src/isa/x64/lower.isle line 810. 3406 let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?; 3407 let expr1_0 = C::put_in_regs(ctx, pattern7_0); 3408 let expr2_0 = constructor_sar_i128(ctx, expr1_0, expr0_0)?; 3409 return Some(expr2_0); 3410 } 3411 _ => {} 3412 } 3413 } 3414 &InstructionData::Unary { 3415 opcode: ref pattern5_0, 3416 arg: pattern5_1, 3417 } => { 3418 if let &Opcode::Bnot = &pattern5_0 { 3419 // Rule at src/isa/x64/lower.isle line 1363. 3420 let expr0_0 = constructor_i128_not(ctx, pattern5_1)?; 3421 return Some(expr0_0); 3422 } 3423 } 3424 &InstructionData::BinaryImm64 { 3425 opcode: ref pattern5_0, 3426 arg: pattern5_1, 3427 imm: pattern5_2, 3428 } => { 3429 if let &Opcode::IaddImm = &pattern5_0 { 3430 let pattern7_0 = C::u64_from_imm64(ctx, pattern5_2); 3431 // Rule at src/isa/x64/lower.isle line 232. 3432 let expr0_0 = C::put_in_regs(ctx, pattern5_1); 3433 let expr1_0: usize = 0; 3434 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 3435 let expr3_0: usize = 1; 3436 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?; 3437 let expr5_0: Type = I64; 3438 let expr6_0 = constructor_imm(ctx, expr5_0, pattern7_0)?; 3439 let expr7_0 = C::gpr_new(ctx, expr6_0); 3440 let expr8_0: Type = I64; 3441 let expr9_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0); 3442 let expr10_0 = constructor_add_with_flags(ctx, expr8_0, expr2_0, &expr9_0)?; 3443 let expr11_0: Type = I64; 3444 let expr12_0: u32 = 0; 3445 let expr13_0 = RegMemImm::Imm { simm32: expr12_0 }; 3446 let expr14_0 = C::gpr_mem_imm_new(ctx, &expr13_0); 3447 let expr15_0 = constructor_adc(ctx, expr11_0, expr4_0, &expr14_0)?; 3448 let expr16_0 = constructor_with_flags(ctx, &expr10_0, &expr15_0)?; 3449 return Some(expr16_0); 3450 } 3451 } 3452 _ => {} 3453 } 3454 } 3455 if pattern2_0 == I8X16 { 3456 let pattern4_0 = C::inst_data(ctx, pattern0_0); 3457 match &pattern4_0 { 3458 &InstructionData::Binary { 3459 opcode: ref pattern5_0, 3460 args: ref pattern5_1, 3461 } => { 3462 match &pattern5_0 { 3463 &Opcode::Imin => { 3464 let (pattern7_0, pattern7_1) = 3465 C::unpack_value_array_2(ctx, &pattern5_1); 3466 // Rule at src/isa/x64/lower.isle line 1499. 3467 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3468 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 3469 let expr2_0 = constructor_pminsb(ctx, expr0_0, &expr1_0)?; 3470 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 3471 return Some(expr3_0); 3472 } 3473 &Opcode::Umin => { 3474 let (pattern7_0, pattern7_1) = 3475 C::unpack_value_array_2(ctx, &pattern5_1); 3476 // Rule at src/isa/x64/lower.isle line 1521. 3477 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3478 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 3479 let expr2_0 = constructor_pminub(ctx, expr0_0, &expr1_0)?; 3480 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 3481 return Some(expr3_0); 3482 } 3483 &Opcode::Imax => { 3484 let (pattern7_0, pattern7_1) = 3485 C::unpack_value_array_2(ctx, &pattern5_1); 3486 // Rule at src/isa/x64/lower.isle line 1488. 3487 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3488 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 3489 let expr2_0 = constructor_pmaxsb(ctx, expr0_0, &expr1_0)?; 3490 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 3491 return Some(expr3_0); 3492 } 3493 &Opcode::Umax => { 3494 let (pattern7_0, pattern7_1) = 3495 C::unpack_value_array_2(ctx, &pattern5_1); 3496 // Rule at src/isa/x64/lower.isle line 1510. 3497 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3498 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 3499 let expr2_0 = constructor_pmaxub(ctx, expr0_0, &expr1_0)?; 3500 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 3501 return Some(expr3_0); 3502 } 3503 &Opcode::Ishl => { 3504 let (pattern7_0, pattern7_1) = 3505 C::unpack_value_array_2(ctx, &pattern5_1); 3506 // Rule at src/isa/x64/lower.isle line 595. 3507 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3508 let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 3509 let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; 3510 let expr3_0 = constructor_psllw(ctx, expr0_0, &expr2_0)?; 3511 let expr4_0 = constructor_ishl_i8x16_mask(ctx, &expr1_0)?; 3512 let expr5_0: Type = I8X16; 3513 let expr6_0 = ExtKind::None; 3514 let expr7_0 = constructor_x64_load(ctx, expr5_0, &expr4_0, &expr6_0)?; 3515 let expr8_0: Type = I8X16; 3516 let expr9_0 = RegMem::Reg { reg: expr7_0 }; 3517 let expr10_0 = C::reg_mem_to_xmm_mem(ctx, &expr9_0); 3518 let expr11_0 = constructor_sse_and(ctx, expr8_0, expr3_0, &expr10_0)?; 3519 let expr12_0 = constructor_value_xmm(ctx, expr11_0)?; 3520 return Some(expr12_0); 3521 } 3522 &Opcode::Ushr => { 3523 let (pattern7_0, pattern7_1) = 3524 C::unpack_value_array_2(ctx, &pattern5_1); 3525 // Rule at src/isa/x64/lower.isle line 705. 3526 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3527 let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 3528 let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; 3529 let expr3_0 = constructor_psrlw(ctx, expr0_0, &expr2_0)?; 3530 let expr4_0 = constructor_ushr_i8x16_mask(ctx, &expr1_0)?; 3531 let expr5_0: Type = I8X16; 3532 let expr6_0 = ExtKind::None; 3533 let expr7_0 = constructor_x64_load(ctx, expr5_0, &expr4_0, &expr6_0)?; 3534 let expr8_0: Type = I8X16; 3535 let expr9_0 = RegMem::Reg { reg: expr7_0 }; 3536 let expr10_0 = C::reg_mem_to_xmm_mem(ctx, &expr9_0); 3537 let expr11_0 = constructor_sse_and(ctx, expr8_0, expr3_0, &expr10_0)?; 3538 let expr12_0 = constructor_value_xmm(ctx, expr11_0)?; 3539 return Some(expr12_0); 3540 } 3541 &Opcode::Sshr => { 3542 let (pattern7_0, pattern7_1) = 3543 C::unpack_value_array_2(ctx, &pattern5_1); 3544 let pattern8_0 = C::value_type(ctx, pattern7_1); 3545 // Rule at src/isa/x64/lower.isle line 831. 3546 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3547 let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); 3548 let expr2_0 = constructor_punpcklbw(ctx, expr0_0, &expr1_0)?; 3549 let expr3_0 = C::xmm_to_xmm_mem(ctx, expr0_0); 3550 let expr4_0 = constructor_punpckhbw(ctx, expr0_0, &expr3_0)?; 3551 let expr5_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 3552 let expr6_0 = 3553 constructor_sshr_i8x16_bigger_shift(ctx, pattern8_0, &expr5_0)?; 3554 let expr7_0 = constructor_psraw(ctx, expr2_0, &expr6_0)?; 3555 let expr8_0 = constructor_psraw(ctx, expr4_0, &expr6_0)?; 3556 let expr9_0 = C::xmm_to_xmm_mem(ctx, expr8_0); 3557 let expr10_0 = constructor_packsswb(ctx, expr7_0, &expr9_0)?; 3558 let expr11_0 = constructor_value_xmm(ctx, expr10_0)?; 3559 return Some(expr11_0); 3560 } 3561 _ => {} 3562 } 3563 } 3564 &InstructionData::Unary { 3565 opcode: ref pattern5_0, 3566 arg: pattern5_1, 3567 } => { 3568 match &pattern5_0 { 3569 &Opcode::Ineg => { 3570 // Rule at src/isa/x64/lower.isle line 977. 3571 let expr0_0: Type = I8X16; 3572 let expr1_0: u64 = 0; 3573 let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?; 3574 let expr3_0 = C::xmm_new(ctx, expr2_0); 3575 let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?; 3576 let expr5_0 = constructor_psubb(ctx, expr3_0, &expr4_0)?; 3577 let expr6_0 = constructor_value_xmm(ctx, expr5_0)?; 3578 return Some(expr6_0); 3579 } 3580 &Opcode::Iabs => { 3581 // Rule at src/isa/x64/lower.isle line 1307. 3582 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?; 3583 let expr1_0 = constructor_pabsb(ctx, &expr0_0)?; 3584 let expr2_0 = constructor_value_xmm(ctx, expr1_0)?; 3585 return Some(expr2_0); 3586 } 3587 _ => {} 3588 } 3589 } 3590 _ => {} 3591 } 3592 } 3593 if pattern2_0 == I16X8 { 3594 let pattern4_0 = C::inst_data(ctx, pattern0_0); 3595 match &pattern4_0 { 3596 &InstructionData::Binary { 3597 opcode: ref pattern5_0, 3598 args: ref pattern5_1, 3599 } => { 3600 match &pattern5_0 { 3601 &Opcode::Imin => { 3602 let (pattern7_0, pattern7_1) = 3603 C::unpack_value_array_2(ctx, &pattern5_1); 3604 // Rule at src/isa/x64/lower.isle line 1502. 3605 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3606 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 3607 let expr2_0 = constructor_pminsw(ctx, expr0_0, &expr1_0)?; 3608 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 3609 return Some(expr3_0); 3610 } 3611 &Opcode::Umin => { 3612 let (pattern7_0, pattern7_1) = 3613 C::unpack_value_array_2(ctx, &pattern5_1); 3614 // Rule at src/isa/x64/lower.isle line 1524. 3615 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3616 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 3617 let expr2_0 = constructor_pminuw(ctx, expr0_0, &expr1_0)?; 3618 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 3619 return Some(expr3_0); 3620 } 3621 &Opcode::Imax => { 3622 let (pattern7_0, pattern7_1) = 3623 C::unpack_value_array_2(ctx, &pattern5_1); 3624 // Rule at src/isa/x64/lower.isle line 1491. 3625 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3626 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 3627 let expr2_0 = constructor_pmaxsw(ctx, expr0_0, &expr1_0)?; 3628 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 3629 return Some(expr3_0); 3630 } 3631 &Opcode::Umax => { 3632 let (pattern7_0, pattern7_1) = 3633 C::unpack_value_array_2(ctx, &pattern5_1); 3634 // Rule at src/isa/x64/lower.isle line 1513. 3635 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3636 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 3637 let expr2_0 = constructor_pmaxuw(ctx, expr0_0, &expr1_0)?; 3638 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 3639 return Some(expr3_0); 3640 } 3641 &Opcode::Ishl => { 3642 let (pattern7_0, pattern7_1) = 3643 C::unpack_value_array_2(ctx, &pattern5_1); 3644 // Rule at src/isa/x64/lower.isle line 639. 3645 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3646 let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 3647 let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; 3648 let expr3_0 = constructor_psllw(ctx, expr0_0, &expr2_0)?; 3649 let expr4_0 = constructor_value_xmm(ctx, expr3_0)?; 3650 return Some(expr4_0); 3651 } 3652 &Opcode::Ushr => { 3653 let (pattern7_0, pattern7_1) = 3654 C::unpack_value_array_2(ctx, &pattern5_1); 3655 // Rule at src/isa/x64/lower.isle line 751. 3656 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3657 let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 3658 let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; 3659 let expr3_0 = constructor_psrlw(ctx, expr0_0, &expr2_0)?; 3660 let expr4_0 = constructor_value_xmm(ctx, expr3_0)?; 3661 return Some(expr4_0); 3662 } 3663 &Opcode::Sshr => { 3664 let (pattern7_0, pattern7_1) = 3665 C::unpack_value_array_2(ctx, &pattern5_1); 3666 // Rule at src/isa/x64/lower.isle line 858. 3667 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3668 let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 3669 let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; 3670 let expr3_0 = constructor_psraw(ctx, expr0_0, &expr2_0)?; 3671 let expr4_0 = constructor_value_xmm(ctx, expr3_0)?; 3672 return Some(expr4_0); 3673 } 3674 _ => {} 3675 } 3676 } 3677 &InstructionData::Unary { 3678 opcode: ref pattern5_0, 3679 arg: pattern5_1, 3680 } => { 3681 match &pattern5_0 { 3682 &Opcode::Ineg => { 3683 // Rule at src/isa/x64/lower.isle line 981. 3684 let expr0_0: Type = I16X8; 3685 let expr1_0: u64 = 0; 3686 let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?; 3687 let expr3_0 = C::xmm_new(ctx, expr2_0); 3688 let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?; 3689 let expr5_0 = constructor_psubw(ctx, expr3_0, &expr4_0)?; 3690 let expr6_0 = constructor_value_xmm(ctx, expr5_0)?; 3691 return Some(expr6_0); 3692 } 3693 &Opcode::Iabs => { 3694 // Rule at src/isa/x64/lower.isle line 1310. 3695 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?; 3696 let expr1_0 = constructor_pabsw(ctx, &expr0_0)?; 3697 let expr2_0 = constructor_value_xmm(ctx, expr1_0)?; 3698 return Some(expr2_0); 3699 } 3700 _ => {} 3701 } 3702 } 3703 _ => {} 3704 } 3705 } 3706 if pattern2_0 == I32X4 { 3707 let pattern4_0 = C::inst_data(ctx, pattern0_0); 3708 match &pattern4_0 { 3709 &InstructionData::Binary { 3710 opcode: ref pattern5_0, 3711 args: ref pattern5_1, 3712 } => { 3713 match &pattern5_0 { 3714 &Opcode::Imin => { 3715 let (pattern7_0, pattern7_1) = 3716 C::unpack_value_array_2(ctx, &pattern5_1); 3717 // Rule at src/isa/x64/lower.isle line 1505. 3718 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3719 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 3720 let expr2_0 = constructor_pminsd(ctx, expr0_0, &expr1_0)?; 3721 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 3722 return Some(expr3_0); 3723 } 3724 &Opcode::Umin => { 3725 let (pattern7_0, pattern7_1) = 3726 C::unpack_value_array_2(ctx, &pattern5_1); 3727 // Rule at src/isa/x64/lower.isle line 1527. 3728 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3729 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 3730 let expr2_0 = constructor_pminud(ctx, expr0_0, &expr1_0)?; 3731 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 3732 return Some(expr3_0); 3733 } 3734 &Opcode::Imax => { 3735 let (pattern7_0, pattern7_1) = 3736 C::unpack_value_array_2(ctx, &pattern5_1); 3737 // Rule at src/isa/x64/lower.isle line 1494. 3738 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3739 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 3740 let expr2_0 = constructor_pmaxsd(ctx, expr0_0, &expr1_0)?; 3741 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 3742 return Some(expr3_0); 3743 } 3744 &Opcode::Umax => { 3745 let (pattern7_0, pattern7_1) = 3746 C::unpack_value_array_2(ctx, &pattern5_1); 3747 // Rule at src/isa/x64/lower.isle line 1516. 3748 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3749 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 3750 let expr2_0 = constructor_pmaxud(ctx, expr0_0, &expr1_0)?; 3751 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 3752 return Some(expr3_0); 3753 } 3754 &Opcode::Ishl => { 3755 let (pattern7_0, pattern7_1) = 3756 C::unpack_value_array_2(ctx, &pattern5_1); 3757 // Rule at src/isa/x64/lower.isle line 643. 3758 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3759 let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 3760 let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; 3761 let expr3_0 = constructor_pslld(ctx, expr0_0, &expr2_0)?; 3762 let expr4_0 = constructor_value_xmm(ctx, expr3_0)?; 3763 return Some(expr4_0); 3764 } 3765 &Opcode::Ushr => { 3766 let (pattern7_0, pattern7_1) = 3767 C::unpack_value_array_2(ctx, &pattern5_1); 3768 // Rule at src/isa/x64/lower.isle line 755. 3769 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3770 let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 3771 let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; 3772 let expr3_0 = constructor_psrld(ctx, expr0_0, &expr2_0)?; 3773 let expr4_0 = constructor_value_xmm(ctx, expr3_0)?; 3774 return Some(expr4_0); 3775 } 3776 &Opcode::Sshr => { 3777 let (pattern7_0, pattern7_1) = 3778 C::unpack_value_array_2(ctx, &pattern5_1); 3779 // Rule at src/isa/x64/lower.isle line 862. 3780 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3781 let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 3782 let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; 3783 let expr3_0 = constructor_psrad(ctx, expr0_0, &expr2_0)?; 3784 let expr4_0 = constructor_value_xmm(ctx, expr3_0)?; 3785 return Some(expr4_0); 3786 } 3787 _ => {} 3788 } 3789 } 3790 &InstructionData::Unary { 3791 opcode: ref pattern5_0, 3792 arg: pattern5_1, 3793 } => { 3794 match &pattern5_0 { 3795 &Opcode::Ineg => { 3796 // Rule at src/isa/x64/lower.isle line 985. 3797 let expr0_0: Type = I32X4; 3798 let expr1_0: u64 = 0; 3799 let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?; 3800 let expr3_0 = C::xmm_new(ctx, expr2_0); 3801 let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?; 3802 let expr5_0 = constructor_psubd(ctx, expr3_0, &expr4_0)?; 3803 let expr6_0 = constructor_value_xmm(ctx, expr5_0)?; 3804 return Some(expr6_0); 3805 } 3806 &Opcode::Iabs => { 3807 // Rule at src/isa/x64/lower.isle line 1313. 3808 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?; 3809 let expr1_0 = constructor_pabsd(ctx, &expr0_0)?; 3810 let expr2_0 = constructor_value_xmm(ctx, expr1_0)?; 3811 return Some(expr2_0); 3812 } 3813 _ => {} 3814 } 3815 } 3816 _ => {} 3817 } 3818 } 3819 if pattern2_0 == I64X2 { 3820 let pattern4_0 = C::inst_data(ctx, pattern0_0); 3821 match &pattern4_0 { 3822 &InstructionData::Binary { 3823 opcode: ref pattern5_0, 3824 args: ref pattern5_1, 3825 } => { 3826 match &pattern5_0 { 3827 &Opcode::Ishl => { 3828 let (pattern7_0, pattern7_1) = 3829 C::unpack_value_array_2(ctx, &pattern5_1); 3830 // Rule at src/isa/x64/lower.isle line 647. 3831 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3832 let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 3833 let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; 3834 let expr3_0 = constructor_psllq(ctx, expr0_0, &expr2_0)?; 3835 let expr4_0 = constructor_value_xmm(ctx, expr3_0)?; 3836 return Some(expr4_0); 3837 } 3838 &Opcode::Ushr => { 3839 let (pattern7_0, pattern7_1) = 3840 C::unpack_value_array_2(ctx, &pattern5_1); 3841 // Rule at src/isa/x64/lower.isle line 759. 3842 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3843 let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 3844 let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; 3845 let expr3_0 = constructor_psrlq(ctx, expr0_0, &expr2_0)?; 3846 let expr4_0 = constructor_value_xmm(ctx, expr3_0)?; 3847 return Some(expr4_0); 3848 } 3849 &Opcode::Sshr => { 3850 let (pattern7_0, pattern7_1) = 3851 C::unpack_value_array_2(ctx, &pattern5_1); 3852 // Rule at src/isa/x64/lower.isle line 874. 3853 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 3854 let expr1_0: Type = I64; 3855 let expr2_0: u8 = 0; 3856 let expr3_0 = constructor_pextrd(ctx, expr1_0, expr0_0, expr2_0)?; 3857 let expr4_0: Type = I64; 3858 let expr5_0: u8 = 1; 3859 let expr6_0 = constructor_pextrd(ctx, expr4_0, expr0_0, expr5_0)?; 3860 let expr7_0: Type = I64; 3861 let expr8_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, expr7_0); 3862 let expr9_0: Type = I64; 3863 let expr10_0 = constructor_sar(ctx, expr9_0, expr3_0, &expr8_0)?; 3864 let expr11_0: Type = I64; 3865 let expr12_0 = constructor_sar(ctx, expr11_0, expr6_0, &expr8_0)?; 3866 let expr13_0 = C::gpr_to_gpr_mem(ctx, expr10_0); 3867 let expr14_0 = C::gpr_to_gpr_mem(ctx, expr12_0); 3868 let expr15_0 = 3869 constructor_make_i64x2_from_lanes(ctx, &expr13_0, &expr14_0)?; 3870 let expr16_0 = constructor_value_xmm(ctx, expr15_0)?; 3871 return Some(expr16_0); 3872 } 3873 _ => {} 3874 } 3875 } 3876 &InstructionData::Unary { 3877 opcode: ref pattern5_0, 3878 arg: pattern5_1, 3879 } => { 3880 match &pattern5_0 { 3881 &Opcode::Ineg => { 3882 // Rule at src/isa/x64/lower.isle line 989. 3883 let expr0_0: Type = I64X2; 3884 let expr1_0: u64 = 0; 3885 let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?; 3886 let expr3_0 = C::xmm_new(ctx, expr2_0); 3887 let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?; 3888 let expr5_0 = constructor_psubq(ctx, expr3_0, &expr4_0)?; 3889 let expr6_0 = constructor_value_xmm(ctx, expr5_0)?; 3890 return Some(expr6_0); 3891 } 3892 &Opcode::Iabs => { 3893 // Rule at src/isa/x64/lower.isle line 1327. 3894 let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?; 3895 let expr1_0: Type = I64X2; 3896 let expr2_0: u64 = 0; 3897 let expr3_0 = constructor_imm(ctx, expr1_0, expr2_0)?; 3898 let expr4_0 = C::xmm_new(ctx, expr3_0); 3899 let expr5_0 = C::xmm_to_xmm_mem(ctx, expr0_0); 3900 let expr6_0 = constructor_psubq(ctx, expr4_0, &expr5_0)?; 3901 let expr7_0 = C::xmm_to_xmm_mem(ctx, expr0_0); 3902 let expr8_0 = constructor_blendvpd(ctx, expr6_0, &expr7_0, expr6_0)?; 3903 let expr9_0 = constructor_value_xmm(ctx, expr8_0)?; 3904 return Some(expr9_0); 3905 } 3906 _ => {} 3907 } 3908 } 3909 _ => {} 3910 } 3911 } 3912 if pattern2_0 == F32X4 { 3913 let pattern4_0 = C::inst_data(ctx, pattern0_0); 3914 if let &InstructionData::Unary { 3915 opcode: ref pattern5_0, 3916 arg: pattern5_1, 3917 } = &pattern4_0 3918 { 3919 if let &Opcode::Fabs = &pattern5_0 { 3920 // Rule at src/isa/x64/lower.isle line 1335. 3921 let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?; 3922 let expr1_0: Type = F32X4; 3923 let expr2_0 = constructor_vector_all_ones(ctx, expr1_0)?; 3924 let expr3_0: u32 = 1; 3925 let expr4_0 = RegMemImm::Imm { simm32: expr3_0 }; 3926 let expr5_0 = C::xmm_mem_imm_new(ctx, &expr4_0); 3927 let expr6_0 = constructor_psrld(ctx, expr2_0, &expr5_0)?; 3928 let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0); 3929 let expr8_0 = constructor_andps(ctx, expr0_0, &expr7_0)?; 3930 let expr9_0 = constructor_value_xmm(ctx, expr8_0)?; 3931 return Some(expr9_0); 3932 } 3933 } 3934 } 3935 if pattern2_0 == F64X2 { 3936 let pattern4_0 = C::inst_data(ctx, pattern0_0); 3937 if let &InstructionData::Unary { 3938 opcode: ref pattern5_0, 3939 arg: pattern5_1, 3940 } = &pattern4_0 3941 { 3942 if let &Opcode::Fabs = &pattern5_0 { 3943 // Rule at src/isa/x64/lower.isle line 1341. 3944 let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?; 3945 let expr1_0: Type = F64X2; 3946 let expr2_0 = constructor_vector_all_ones(ctx, expr1_0)?; 3947 let expr3_0: u32 = 1; 3948 let expr4_0 = RegMemImm::Imm { simm32: expr3_0 }; 3949 let expr5_0 = C::xmm_mem_imm_new(ctx, &expr4_0); 3950 let expr6_0 = constructor_psrlq(ctx, expr2_0, &expr5_0)?; 3951 let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0); 3952 let expr8_0 = constructor_andpd(ctx, expr0_0, &expr7_0)?; 3953 let expr9_0 = constructor_value_xmm(ctx, expr8_0)?; 3954 return Some(expr9_0); 3955 } 3956 } 3957 } 3958 let pattern3_0 = C::inst_data(ctx, pattern0_0); 3959 match &pattern3_0 { 3960 &InstructionData::NullAry { 3961 opcode: ref pattern4_0, 3962 } => { 3963 if let &Opcode::Null = &pattern4_0 { 3964 // Rule at src/isa/x64/lower.isle line 56. 3965 let expr0_0: u64 = 0; 3966 let expr1_0 = constructor_imm(ctx, pattern2_0, expr0_0)?; 3967 let expr2_0 = C::value_reg(ctx, expr1_0); 3968 return Some(expr2_0); 3969 } 3970 } 3971 &InstructionData::Binary { 3972 opcode: ref pattern4_0, 3973 args: ref pattern4_1, 3974 } => { 3975 if let &Opcode::BandNot = &pattern4_0 { 3976 let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, &pattern4_1); 3977 // Rule at src/isa/x64/lower.isle line 1300. 3978 let expr0_0 = constructor_put_in_xmm(ctx, pattern6_1)?; 3979 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern6_0)?; 3980 let expr2_0 = constructor_sse_and_not(ctx, pattern2_0, expr0_0, &expr1_0)?; 3981 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 3982 return Some(expr3_0); 3983 } 3984 } 3985 _ => {} 3986 } 3987 if let Some(()) = C::avx512vl_enabled(ctx, pattern2_0) { 3988 if let Some(()) = C::avx512dq_enabled(ctx, pattern2_0) { 3989 if let Some((pattern5_0, pattern5_1)) = C::multi_lane(ctx, pattern2_0) { 3990 if pattern5_0 == 64 { 3991 if pattern5_1 == 2 { 3992 let pattern8_0 = C::inst_data(ctx, pattern0_0); 3993 if let &InstructionData::Binary { 3994 opcode: ref pattern9_0, 3995 args: ref pattern9_1, 3996 } = &pattern8_0 3997 { 3998 if let &Opcode::Imul = &pattern9_0 { 3999 let (pattern11_0, pattern11_1) = 4000 C::unpack_value_array_2(ctx, &pattern9_1); 4001 // Rule at src/isa/x64/lower.isle line 1087. 4002 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern11_0)?; 4003 let expr1_0 = constructor_put_in_xmm(ctx, pattern11_1)?; 4004 let expr2_0 = constructor_vpmullq(ctx, &expr0_0, expr1_0)?; 4005 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 4006 return Some(expr3_0); 4007 } 4008 } 4009 } 4010 } 4011 } 4012 } 4013 if let Some(()) = C::avx512f_enabled(ctx, pattern2_0) { 4014 if pattern2_0 == I64X2 { 4015 let pattern6_0 = C::inst_data(ctx, pattern0_0); 4016 if let &InstructionData::Unary { 4017 opcode: ref pattern7_0, 4018 arg: pattern7_1, 4019 } = &pattern6_0 4020 { 4021 if let &Opcode::Iabs = &pattern7_0 { 4022 // Rule at src/isa/x64/lower.isle line 1317. 4023 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 4024 let expr1_0 = constructor_vpabsq(ctx, &expr0_0)?; 4025 let expr2_0 = constructor_value_xmm(ctx, expr1_0)?; 4026 return Some(expr2_0); 4027 } 4028 } 4029 } 4030 } 4031 } 4032 if let Some((pattern3_0, pattern3_1)) = C::multi_lane(ctx, pattern2_0) { 4033 if pattern3_0 == 8 { 4034 if pattern3_1 == 16 { 4035 let pattern6_0 = C::inst_data(ctx, pattern0_0); 4036 if let &InstructionData::Binary { 4037 opcode: ref pattern7_0, 4038 args: ref pattern7_1, 4039 } = &pattern6_0 4040 { 4041 match &pattern7_0 { 4042 &Opcode::AvgRound => { 4043 let (pattern9_0, pattern9_1) = 4044 C::unpack_value_array_2(ctx, &pattern7_1); 4045 // Rule at src/isa/x64/lower.isle line 995. 4046 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 4047 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 4048 let expr2_0 = constructor_pavgb(ctx, expr0_0, &expr1_0)?; 4049 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 4050 return Some(expr3_0); 4051 } 4052 &Opcode::UaddSat => { 4053 let (pattern9_0, pattern9_1) = 4054 C::unpack_value_array_2(ctx, &pattern7_1); 4055 // Rule at src/isa/x64/lower.isle line 144. 4056 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 4057 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 4058 let expr2_0 = constructor_paddusb(ctx, expr0_0, &expr1_0)?; 4059 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 4060 return Some(expr3_0); 4061 } 4062 &Opcode::SaddSat => { 4063 let (pattern9_0, pattern9_1) = 4064 C::unpack_value_array_2(ctx, &pattern7_1); 4065 // Rule at src/isa/x64/lower.isle line 132. 4066 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 4067 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 4068 let expr2_0 = constructor_paddsb(ctx, expr0_0, &expr1_0)?; 4069 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 4070 return Some(expr3_0); 4071 } 4072 &Opcode::UsubSat => { 4073 let (pattern9_0, pattern9_1) = 4074 C::unpack_value_array_2(ctx, &pattern7_1); 4075 // Rule at src/isa/x64/lower.isle line 313. 4076 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 4077 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 4078 let expr2_0 = constructor_psubusb(ctx, expr0_0, &expr1_0)?; 4079 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 4080 return Some(expr3_0); 4081 } 4082 &Opcode::SsubSat => { 4083 let (pattern9_0, pattern9_1) = 4084 C::unpack_value_array_2(ctx, &pattern7_1); 4085 // Rule at src/isa/x64/lower.isle line 301. 4086 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 4087 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 4088 let expr2_0 = constructor_psubsb(ctx, expr0_0, &expr1_0)?; 4089 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 4090 return Some(expr3_0); 4091 } 4092 &Opcode::Iadd => { 4093 let (pattern9_0, pattern9_1) = 4094 C::unpack_value_array_2(ctx, &pattern7_1); 4095 // Rule at src/isa/x64/lower.isle line 96. 4096 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 4097 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 4098 let expr2_0 = constructor_paddb(ctx, expr0_0, &expr1_0)?; 4099 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 4100 return Some(expr3_0); 4101 } 4102 &Opcode::Isub => { 4103 let (pattern9_0, pattern9_1) = 4104 C::unpack_value_array_2(ctx, &pattern7_1); 4105 // Rule at src/isa/x64/lower.isle line 265. 4106 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 4107 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 4108 let expr2_0 = constructor_psubb(ctx, expr0_0, &expr1_0)?; 4109 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 4110 return Some(expr3_0); 4111 } 4112 _ => {} 4113 } 4114 } 4115 } 4116 } 4117 if pattern3_0 == 16 { 4118 if pattern3_1 == 8 { 4119 let pattern6_0 = C::inst_data(ctx, pattern0_0); 4120 if let &InstructionData::Binary { 4121 opcode: ref pattern7_0, 4122 args: ref pattern7_1, 4123 } = &pattern6_0 4124 { 4125 match &pattern7_0 { 4126 &Opcode::AvgRound => { 4127 let (pattern9_0, pattern9_1) = 4128 C::unpack_value_array_2(ctx, &pattern7_1); 4129 // Rule at src/isa/x64/lower.isle line 999. 4130 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 4131 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 4132 let expr2_0 = constructor_pavgw(ctx, expr0_0, &expr1_0)?; 4133 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 4134 return Some(expr3_0); 4135 } 4136 &Opcode::UaddSat => { 4137 let (pattern9_0, pattern9_1) = 4138 C::unpack_value_array_2(ctx, &pattern7_1); 4139 // Rule at src/isa/x64/lower.isle line 149. 4140 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 4141 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 4142 let expr2_0 = constructor_paddusw(ctx, expr0_0, &expr1_0)?; 4143 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 4144 return Some(expr3_0); 4145 } 4146 &Opcode::SaddSat => { 4147 let (pattern9_0, pattern9_1) = 4148 C::unpack_value_array_2(ctx, &pattern7_1); 4149 // Rule at src/isa/x64/lower.isle line 137. 4150 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 4151 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 4152 let expr2_0 = constructor_paddsw(ctx, expr0_0, &expr1_0)?; 4153 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 4154 return Some(expr3_0); 4155 } 4156 &Opcode::UsubSat => { 4157 let (pattern9_0, pattern9_1) = 4158 C::unpack_value_array_2(ctx, &pattern7_1); 4159 // Rule at src/isa/x64/lower.isle line 318. 4160 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 4161 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 4162 let expr2_0 = constructor_psubusw(ctx, expr0_0, &expr1_0)?; 4163 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 4164 return Some(expr3_0); 4165 } 4166 &Opcode::SsubSat => { 4167 let (pattern9_0, pattern9_1) = 4168 C::unpack_value_array_2(ctx, &pattern7_1); 4169 // Rule at src/isa/x64/lower.isle line 306. 4170 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 4171 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 4172 let expr2_0 = constructor_psubsw(ctx, expr0_0, &expr1_0)?; 4173 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 4174 return Some(expr3_0); 4175 } 4176 &Opcode::Iadd => { 4177 let (pattern9_0, pattern9_1) = 4178 C::unpack_value_array_2(ctx, &pattern7_1); 4179 // Rule at src/isa/x64/lower.isle line 101. 4180 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 4181 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 4182 let expr2_0 = constructor_paddw(ctx, expr0_0, &expr1_0)?; 4183 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 4184 return Some(expr3_0); 4185 } 4186 &Opcode::Isub => { 4187 let (pattern9_0, pattern9_1) = 4188 C::unpack_value_array_2(ctx, &pattern7_1); 4189 // Rule at src/isa/x64/lower.isle line 270. 4190 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 4191 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 4192 let expr2_0 = constructor_psubw(ctx, expr0_0, &expr1_0)?; 4193 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 4194 return Some(expr3_0); 4195 } 4196 &Opcode::Imul => { 4197 let (pattern9_0, pattern9_1) = 4198 C::unpack_value_array_2(ctx, &pattern7_1); 4199 if let Some(pattern10_0) = C::def_inst(ctx, pattern9_0) { 4200 let pattern11_0 = C::inst_data(ctx, pattern10_0); 4201 if let &InstructionData::Unary { 4202 opcode: ref pattern12_0, 4203 arg: pattern12_1, 4204 } = &pattern11_0 4205 { 4206 match &pattern12_0 { 4207 &Opcode::SwidenLow => { 4208 let pattern14_0 = C::value_type(ctx, pattern12_1); 4209 if let Some((pattern15_0, pattern15_1)) = 4210 C::multi_lane(ctx, pattern14_0) 4211 { 4212 if pattern15_0 == 8 { 4213 if pattern15_1 == 16 { 4214 if let Some(pattern18_0) = 4215 C::def_inst(ctx, pattern9_1) 4216 { 4217 let pattern19_0 = 4218 C::inst_data(ctx, pattern18_0); 4219 if let &InstructionData::Unary { 4220 opcode: ref pattern20_0, 4221 arg: pattern20_1, 4222 } = &pattern19_0 4223 { 4224 if let &Opcode::SwidenLow = 4225 &pattern20_0 4226 { 4227 let pattern22_0 = 4228 C::value_type( 4229 ctx, 4230 pattern20_1, 4231 ); 4232 if let Some(( 4233 pattern23_0, 4234 pattern23_1, 4235 )) = C::multi_lane( 4236 ctx, 4237 pattern22_0, 4238 ) { 4239 if pattern23_0 == 8 { 4240 if pattern23_1 == 16 4241 { 4242 // Rule at src/isa/x64/lower.isle line 1175. 4243 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?; 4244 let expr1_0 = constructor_pmovsxbw(ctx, &expr0_0)?; 4245 let expr2_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?; 4246 let expr3_0 = constructor_pmovsxbw(ctx, &expr2_0)?; 4247 let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0); 4248 let expr5_0 = constructor_pmullw(ctx, expr1_0, &expr4_0)?; 4249 let expr6_0 = constructor_value_xmm(ctx, expr5_0)?; 4250 return Some( 4251 expr6_0, 4252 ); 4253 } 4254 } 4255 } 4256 } 4257 } 4258 } 4259 } 4260 } 4261 } 4262 } 4263 &Opcode::SwidenHigh => { 4264 let pattern14_0 = C::value_type(ctx, pattern12_1); 4265 if let Some((pattern15_0, pattern15_1)) = 4266 C::multi_lane(ctx, pattern14_0) 4267 { 4268 if pattern15_0 == 8 { 4269 if pattern15_1 == 16 { 4270 if let Some(pattern18_0) = 4271 C::def_inst(ctx, pattern9_1) 4272 { 4273 let pattern19_0 = 4274 C::inst_data(ctx, pattern18_0); 4275 if let &InstructionData::Unary { 4276 opcode: ref pattern20_0, 4277 arg: pattern20_1, 4278 } = &pattern19_0 4279 { 4280 if let &Opcode::SwidenHigh = 4281 &pattern20_0 4282 { 4283 let pattern22_0 = 4284 C::value_type( 4285 ctx, 4286 pattern20_1, 4287 ); 4288 if let Some(( 4289 pattern23_0, 4290 pattern23_1, 4291 )) = C::multi_lane( 4292 ctx, 4293 pattern22_0, 4294 ) { 4295 if pattern23_0 == 8 { 4296 if pattern23_1 == 16 4297 { 4298 // Rule at src/isa/x64/lower.isle line 1135. 4299 let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?; 4300 let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); 4301 let expr2_0: u8 = 8; 4302 let expr3_0 = OperandSize::Size32; 4303 let expr4_0 = constructor_palignr(ctx, expr0_0, &expr1_0, expr2_0, &expr3_0)?; 4304 let expr5_0 = C::xmm_to_xmm_mem(ctx, expr4_0); 4305 let expr6_0 = constructor_pmovsxbw(ctx, &expr5_0)?; 4306 let expr7_0 = constructor_put_in_xmm(ctx, pattern20_1)?; 4307 let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); 4308 let expr9_0: u8 = 8; 4309 let expr10_0 = OperandSize::Size32; 4310 let expr11_0 = constructor_palignr(ctx, expr7_0, &expr8_0, expr9_0, &expr10_0)?; 4311 let expr12_0 = C::xmm_to_xmm_mem(ctx, expr11_0); 4312 let expr13_0 = constructor_pmovsxbw(ctx, &expr12_0)?; 4313 let expr14_0 = C::xmm_to_xmm_mem(ctx, expr13_0); 4314 let expr15_0 = constructor_pmullw(ctx, expr6_0, &expr14_0)?; 4315 let expr16_0 = constructor_value_xmm(ctx, expr15_0)?; 4316 return Some( 4317 expr16_0, 4318 ); 4319 } 4320 } 4321 } 4322 } 4323 } 4324 } 4325 } 4326 } 4327 } 4328 } 4329 &Opcode::UwidenLow => { 4330 let pattern14_0 = C::value_type(ctx, pattern12_1); 4331 if let Some((pattern15_0, pattern15_1)) = 4332 C::multi_lane(ctx, pattern14_0) 4333 { 4334 if pattern15_0 == 8 { 4335 if pattern15_1 == 16 { 4336 if let Some(pattern18_0) = 4337 C::def_inst(ctx, pattern9_1) 4338 { 4339 let pattern19_0 = 4340 C::inst_data(ctx, pattern18_0); 4341 if let &InstructionData::Unary { 4342 opcode: ref pattern20_0, 4343 arg: pattern20_1, 4344 } = &pattern19_0 4345 { 4346 if let &Opcode::UwidenLow = 4347 &pattern20_0 4348 { 4349 let pattern22_0 = 4350 C::value_type( 4351 ctx, 4352 pattern20_1, 4353 ); 4354 if let Some(( 4355 pattern23_0, 4356 pattern23_1, 4357 )) = C::multi_lane( 4358 ctx, 4359 pattern22_0, 4360 ) { 4361 if pattern23_0 == 8 { 4362 if pattern23_1 == 16 4363 { 4364 // Rule at src/isa/x64/lower.isle line 1251. 4365 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?; 4366 let expr1_0 = constructor_pmovzxbw(ctx, &expr0_0)?; 4367 let expr2_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?; 4368 let expr3_0 = constructor_pmovzxbw(ctx, &expr2_0)?; 4369 let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0); 4370 let expr5_0 = constructor_pmullw(ctx, expr1_0, &expr4_0)?; 4371 let expr6_0 = constructor_value_xmm(ctx, expr5_0)?; 4372 return Some( 4373 expr6_0, 4374 ); 4375 } 4376 } 4377 } 4378 } 4379 } 4380 } 4381 } 4382 } 4383 } 4384 } 4385 &Opcode::UwidenHigh => { 4386 let pattern14_0 = C::value_type(ctx, pattern12_1); 4387 if let Some((pattern15_0, pattern15_1)) = 4388 C::multi_lane(ctx, pattern14_0) 4389 { 4390 if pattern15_0 == 8 { 4391 if pattern15_1 == 16 { 4392 if let Some(pattern18_0) = 4393 C::def_inst(ctx, pattern9_1) 4394 { 4395 let pattern19_0 = 4396 C::inst_data(ctx, pattern18_0); 4397 if let &InstructionData::Unary { 4398 opcode: ref pattern20_0, 4399 arg: pattern20_1, 4400 } = &pattern19_0 4401 { 4402 if let &Opcode::UwidenHigh = 4403 &pattern20_0 4404 { 4405 let pattern22_0 = 4406 C::value_type( 4407 ctx, 4408 pattern20_1, 4409 ); 4410 if let Some(( 4411 pattern23_0, 4412 pattern23_1, 4413 )) = C::multi_lane( 4414 ctx, 4415 pattern22_0, 4416 ) { 4417 if pattern23_0 == 8 { 4418 if pattern23_1 == 16 4419 { 4420 // Rule at src/isa/x64/lower.isle line 1211. 4421 let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?; 4422 let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); 4423 let expr2_0: u8 = 8; 4424 let expr3_0 = OperandSize::Size32; 4425 let expr4_0 = constructor_palignr(ctx, expr0_0, &expr1_0, expr2_0, &expr3_0)?; 4426 let expr5_0 = C::xmm_to_xmm_mem(ctx, expr4_0); 4427 let expr6_0 = constructor_pmovzxbw(ctx, &expr5_0)?; 4428 let expr7_0 = constructor_put_in_xmm(ctx, pattern20_1)?; 4429 let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); 4430 let expr9_0: u8 = 8; 4431 let expr10_0 = OperandSize::Size32; 4432 let expr11_0 = constructor_palignr(ctx, expr7_0, &expr8_0, expr9_0, &expr10_0)?; 4433 let expr12_0 = C::xmm_to_xmm_mem(ctx, expr11_0); 4434 let expr13_0 = constructor_pmovzxbw(ctx, &expr12_0)?; 4435 let expr14_0 = C::xmm_to_xmm_mem(ctx, expr13_0); 4436 let expr15_0 = constructor_pmullw(ctx, expr6_0, &expr14_0)?; 4437 let expr16_0 = constructor_value_xmm(ctx, expr15_0)?; 4438 return Some( 4439 expr16_0, 4440 ); 4441 } 4442 } 4443 } 4444 } 4445 } 4446 } 4447 } 4448 } 4449 } 4450 } 4451 _ => {} 4452 } 4453 } 4454 } 4455 // Rule at src/isa/x64/lower.isle line 1079. 4456 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 4457 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 4458 let expr2_0 = constructor_pmullw(ctx, expr0_0, &expr1_0)?; 4459 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 4460 return Some(expr3_0); 4461 } 4462 _ => {} 4463 } 4464 } 4465 } 4466 } 4467 if pattern3_0 == 32 { 4468 if pattern3_1 == 4 { 4469 let pattern6_0 = C::inst_data(ctx, pattern0_0); 4470 if let &InstructionData::Binary { 4471 opcode: ref pattern7_0, 4472 args: ref pattern7_1, 4473 } = &pattern6_0 4474 { 4475 match &pattern7_0 { 4476 &Opcode::Iadd => { 4477 let (pattern9_0, pattern9_1) = 4478 C::unpack_value_array_2(ctx, &pattern7_1); 4479 // Rule at src/isa/x64/lower.isle line 106. 4480 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 4481 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 4482 let expr2_0 = constructor_paddd(ctx, expr0_0, &expr1_0)?; 4483 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 4484 return Some(expr3_0); 4485 } 4486 &Opcode::Isub => { 4487 let (pattern9_0, pattern9_1) = 4488 C::unpack_value_array_2(ctx, &pattern7_1); 4489 // Rule at src/isa/x64/lower.isle line 275. 4490 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 4491 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 4492 let expr2_0 = constructor_psubd(ctx, expr0_0, &expr1_0)?; 4493 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 4494 return Some(expr3_0); 4495 } 4496 &Opcode::Imul => { 4497 let (pattern9_0, pattern9_1) = 4498 C::unpack_value_array_2(ctx, &pattern7_1); 4499 if let Some(pattern10_0) = C::def_inst(ctx, pattern9_0) { 4500 let pattern11_0 = C::inst_data(ctx, pattern10_0); 4501 if let &InstructionData::Unary { 4502 opcode: ref pattern12_0, 4503 arg: pattern12_1, 4504 } = &pattern11_0 4505 { 4506 match &pattern12_0 { 4507 &Opcode::SwidenLow => { 4508 let pattern14_0 = C::value_type(ctx, pattern12_1); 4509 if let Some((pattern15_0, pattern15_1)) = 4510 C::multi_lane(ctx, pattern14_0) 4511 { 4512 if pattern15_0 == 16 { 4513 if pattern15_1 == 8 { 4514 if let Some(pattern18_0) = 4515 C::def_inst(ctx, pattern9_1) 4516 { 4517 let pattern19_0 = 4518 C::inst_data(ctx, pattern18_0); 4519 if let &InstructionData::Unary { 4520 opcode: ref pattern20_0, 4521 arg: pattern20_1, 4522 } = &pattern19_0 4523 { 4524 if let &Opcode::SwidenLow = 4525 &pattern20_0 4526 { 4527 let pattern22_0 = 4528 C::value_type( 4529 ctx, 4530 pattern20_1, 4531 ); 4532 if let Some(( 4533 pattern23_0, 4534 pattern23_1, 4535 )) = C::multi_lane( 4536 ctx, 4537 pattern22_0, 4538 ) { 4539 if pattern23_0 == 16 { 4540 if pattern23_1 == 8 4541 { 4542 // Rule at src/isa/x64/lower.isle line 1185. 4543 let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?; 4544 let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?; 4545 let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 4546 let expr3_0 = constructor_pmullw(ctx, expr0_0, &expr2_0)?; 4547 let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 4548 let expr5_0 = constructor_pmulhw(ctx, expr0_0, &expr4_0)?; 4549 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); 4550 let expr7_0 = constructor_punpcklwd(ctx, expr3_0, &expr6_0)?; 4551 let expr8_0 = constructor_value_xmm(ctx, expr7_0)?; 4552 return Some( 4553 expr8_0, 4554 ); 4555 } 4556 } 4557 } 4558 } 4559 } 4560 } 4561 } 4562 } 4563 } 4564 } 4565 &Opcode::SwidenHigh => { 4566 let pattern14_0 = C::value_type(ctx, pattern12_1); 4567 if let Some((pattern15_0, pattern15_1)) = 4568 C::multi_lane(ctx, pattern14_0) 4569 { 4570 if pattern15_0 == 16 { 4571 if pattern15_1 == 8 { 4572 if let Some(pattern18_0) = 4573 C::def_inst(ctx, pattern9_1) 4574 { 4575 let pattern19_0 = 4576 C::inst_data(ctx, pattern18_0); 4577 if let &InstructionData::Unary { 4578 opcode: ref pattern20_0, 4579 arg: pattern20_1, 4580 } = &pattern19_0 4581 { 4582 if let &Opcode::SwidenHigh = 4583 &pattern20_0 4584 { 4585 let pattern22_0 = 4586 C::value_type( 4587 ctx, 4588 pattern20_1, 4589 ); 4590 if let Some(( 4591 pattern23_0, 4592 pattern23_1, 4593 )) = C::multi_lane( 4594 ctx, 4595 pattern22_0, 4596 ) { 4597 if pattern23_0 == 16 { 4598 if pattern23_1 == 8 4599 { 4600 // Rule at src/isa/x64/lower.isle line 1149. 4601 let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?; 4602 let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?; 4603 let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 4604 let expr3_0 = constructor_pmullw(ctx, expr0_0, &expr2_0)?; 4605 let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 4606 let expr5_0 = constructor_pmulhw(ctx, expr0_0, &expr4_0)?; 4607 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); 4608 let expr7_0 = constructor_punpckhwd(ctx, expr3_0, &expr6_0)?; 4609 let expr8_0 = constructor_value_xmm(ctx, expr7_0)?; 4610 return Some( 4611 expr8_0, 4612 ); 4613 } 4614 } 4615 } 4616 } 4617 } 4618 } 4619 } 4620 } 4621 } 4622 } 4623 &Opcode::UwidenLow => { 4624 let pattern14_0 = C::value_type(ctx, pattern12_1); 4625 if let Some((pattern15_0, pattern15_1)) = 4626 C::multi_lane(ctx, pattern14_0) 4627 { 4628 if pattern15_0 == 16 { 4629 if pattern15_1 == 8 { 4630 if let Some(pattern18_0) = 4631 C::def_inst(ctx, pattern9_1) 4632 { 4633 let pattern19_0 = 4634 C::inst_data(ctx, pattern18_0); 4635 if let &InstructionData::Unary { 4636 opcode: ref pattern20_0, 4637 arg: pattern20_1, 4638 } = &pattern19_0 4639 { 4640 if let &Opcode::UwidenLow = 4641 &pattern20_0 4642 { 4643 let pattern22_0 = 4644 C::value_type( 4645 ctx, 4646 pattern20_1, 4647 ); 4648 if let Some(( 4649 pattern23_0, 4650 pattern23_1, 4651 )) = C::multi_lane( 4652 ctx, 4653 pattern22_0, 4654 ) { 4655 if pattern23_0 == 16 { 4656 if pattern23_1 == 8 4657 { 4658 // Rule at src/isa/x64/lower.isle line 1261. 4659 let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?; 4660 let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?; 4661 let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 4662 let expr3_0 = constructor_pmullw(ctx, expr0_0, &expr2_0)?; 4663 let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 4664 let expr5_0 = constructor_pmulhuw(ctx, expr0_0, &expr4_0)?; 4665 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); 4666 let expr7_0 = constructor_punpcklwd(ctx, expr3_0, &expr6_0)?; 4667 let expr8_0 = constructor_value_xmm(ctx, expr7_0)?; 4668 return Some( 4669 expr8_0, 4670 ); 4671 } 4672 } 4673 } 4674 } 4675 } 4676 } 4677 } 4678 } 4679 } 4680 } 4681 &Opcode::UwidenHigh => { 4682 let pattern14_0 = C::value_type(ctx, pattern12_1); 4683 if let Some((pattern15_0, pattern15_1)) = 4684 C::multi_lane(ctx, pattern14_0) 4685 { 4686 if pattern15_0 == 16 { 4687 if pattern15_1 == 8 { 4688 if let Some(pattern18_0) = 4689 C::def_inst(ctx, pattern9_1) 4690 { 4691 let pattern19_0 = 4692 C::inst_data(ctx, pattern18_0); 4693 if let &InstructionData::Unary { 4694 opcode: ref pattern20_0, 4695 arg: pattern20_1, 4696 } = &pattern19_0 4697 { 4698 if let &Opcode::UwidenHigh = 4699 &pattern20_0 4700 { 4701 let pattern22_0 = 4702 C::value_type( 4703 ctx, 4704 pattern20_1, 4705 ); 4706 if let Some(( 4707 pattern23_0, 4708 pattern23_1, 4709 )) = C::multi_lane( 4710 ctx, 4711 pattern22_0, 4712 ) { 4713 if pattern23_0 == 16 { 4714 if pattern23_1 == 8 4715 { 4716 // Rule at src/isa/x64/lower.isle line 1225. 4717 let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?; 4718 let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?; 4719 let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 4720 let expr3_0 = constructor_pmullw(ctx, expr0_0, &expr2_0)?; 4721 let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 4722 let expr5_0 = constructor_pmulhuw(ctx, expr0_0, &expr4_0)?; 4723 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); 4724 let expr7_0 = constructor_punpckhwd(ctx, expr3_0, &expr6_0)?; 4725 let expr8_0 = constructor_value_xmm(ctx, expr7_0)?; 4726 return Some( 4727 expr8_0, 4728 ); 4729 } 4730 } 4731 } 4732 } 4733 } 4734 } 4735 } 4736 } 4737 } 4738 } 4739 _ => {} 4740 } 4741 } 4742 } 4743 // Rule at src/isa/x64/lower.isle line 1082. 4744 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 4745 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 4746 let expr2_0 = constructor_pmulld(ctx, expr0_0, &expr1_0)?; 4747 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 4748 return Some(expr3_0); 4749 } 4750 _ => {} 4751 } 4752 } 4753 } 4754 } 4755 if pattern3_0 == 64 { 4756 if pattern3_1 == 2 { 4757 let pattern6_0 = C::inst_data(ctx, pattern0_0); 4758 if let &InstructionData::Binary { 4759 opcode: ref pattern7_0, 4760 args: ref pattern7_1, 4761 } = &pattern6_0 4762 { 4763 match &pattern7_0 { 4764 &Opcode::Iadd => { 4765 let (pattern9_0, pattern9_1) = 4766 C::unpack_value_array_2(ctx, &pattern7_1); 4767 // Rule at src/isa/x64/lower.isle line 111. 4768 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 4769 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 4770 let expr2_0 = constructor_paddq(ctx, expr0_0, &expr1_0)?; 4771 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 4772 return Some(expr3_0); 4773 } 4774 &Opcode::Isub => { 4775 let (pattern9_0, pattern9_1) = 4776 C::unpack_value_array_2(ctx, &pattern7_1); 4777 // Rule at src/isa/x64/lower.isle line 280. 4778 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 4779 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 4780 let expr2_0 = constructor_psubq(ctx, expr0_0, &expr1_0)?; 4781 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 4782 return Some(expr3_0); 4783 } 4784 &Opcode::Imul => { 4785 let (pattern9_0, pattern9_1) = 4786 C::unpack_value_array_2(ctx, &pattern7_1); 4787 if let Some(pattern10_0) = C::def_inst(ctx, pattern9_0) { 4788 let pattern11_0 = C::inst_data(ctx, pattern10_0); 4789 if let &InstructionData::Unary { 4790 opcode: ref pattern12_0, 4791 arg: pattern12_1, 4792 } = &pattern11_0 4793 { 4794 match &pattern12_0 { 4795 &Opcode::SwidenLow => { 4796 let pattern14_0 = C::value_type(ctx, pattern12_1); 4797 if let Some((pattern15_0, pattern15_1)) = 4798 C::multi_lane(ctx, pattern14_0) 4799 { 4800 if pattern15_0 == 32 { 4801 if pattern15_1 == 4 { 4802 if let Some(pattern18_0) = 4803 C::def_inst(ctx, pattern9_1) 4804 { 4805 let pattern19_0 = 4806 C::inst_data(ctx, pattern18_0); 4807 if let &InstructionData::Unary { 4808 opcode: ref pattern20_0, 4809 arg: pattern20_1, 4810 } = &pattern19_0 4811 { 4812 if let &Opcode::SwidenLow = 4813 &pattern20_0 4814 { 4815 let pattern22_0 = 4816 C::value_type( 4817 ctx, 4818 pattern20_1, 4819 ); 4820 if let Some(( 4821 pattern23_0, 4822 pattern23_1, 4823 )) = C::multi_lane( 4824 ctx, 4825 pattern22_0, 4826 ) { 4827 if pattern23_0 == 32 { 4828 if pattern23_1 == 4 4829 { 4830 // Rule at src/isa/x64/lower.isle line 1197. 4831 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?; 4832 let expr1_0: u8 = 80; 4833 let expr2_0 = OperandSize::Size32; 4834 let expr3_0 = constructor_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?; 4835 let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?; 4836 let expr5_0: u8 = 80; 4837 let expr6_0 = OperandSize::Size32; 4838 let expr7_0 = constructor_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?; 4839 let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); 4840 let expr9_0 = constructor_pmuldq(ctx, expr3_0, &expr8_0)?; 4841 let expr10_0 = constructor_value_xmm(ctx, expr9_0)?; 4842 return Some( 4843 expr10_0, 4844 ); 4845 } 4846 } 4847 } 4848 } 4849 } 4850 } 4851 } 4852 } 4853 } 4854 } 4855 &Opcode::SwidenHigh => { 4856 let pattern14_0 = C::value_type(ctx, pattern12_1); 4857 if let Some((pattern15_0, pattern15_1)) = 4858 C::multi_lane(ctx, pattern14_0) 4859 { 4860 if pattern15_0 == 32 { 4861 if pattern15_1 == 4 { 4862 if let Some(pattern18_0) = 4863 C::def_inst(ctx, pattern9_1) 4864 { 4865 let pattern19_0 = 4866 C::inst_data(ctx, pattern18_0); 4867 if let &InstructionData::Unary { 4868 opcode: ref pattern20_0, 4869 arg: pattern20_1, 4870 } = &pattern19_0 4871 { 4872 if let &Opcode::SwidenHigh = 4873 &pattern20_0 4874 { 4875 let pattern22_0 = 4876 C::value_type( 4877 ctx, 4878 pattern20_1, 4879 ); 4880 if let Some(( 4881 pattern23_0, 4882 pattern23_1, 4883 )) = C::multi_lane( 4884 ctx, 4885 pattern22_0, 4886 ) { 4887 if pattern23_0 == 32 { 4888 if pattern23_1 == 4 4889 { 4890 // Rule at src/isa/x64/lower.isle line 1161. 4891 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?; 4892 let expr1_0: u8 = 250; 4893 let expr2_0 = OperandSize::Size32; 4894 let expr3_0 = constructor_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?; 4895 let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?; 4896 let expr5_0: u8 = 250; 4897 let expr6_0 = OperandSize::Size32; 4898 let expr7_0 = constructor_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?; 4899 let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); 4900 let expr9_0 = constructor_pmuldq(ctx, expr3_0, &expr8_0)?; 4901 let expr10_0 = constructor_value_xmm(ctx, expr9_0)?; 4902 return Some( 4903 expr10_0, 4904 ); 4905 } 4906 } 4907 } 4908 } 4909 } 4910 } 4911 } 4912 } 4913 } 4914 } 4915 &Opcode::UwidenLow => { 4916 let pattern14_0 = C::value_type(ctx, pattern12_1); 4917 if let Some((pattern15_0, pattern15_1)) = 4918 C::multi_lane(ctx, pattern14_0) 4919 { 4920 if pattern15_0 == 32 { 4921 if pattern15_1 == 4 { 4922 if let Some(pattern18_0) = 4923 C::def_inst(ctx, pattern9_1) 4924 { 4925 let pattern19_0 = 4926 C::inst_data(ctx, pattern18_0); 4927 if let &InstructionData::Unary { 4928 opcode: ref pattern20_0, 4929 arg: pattern20_1, 4930 } = &pattern19_0 4931 { 4932 if let &Opcode::UwidenLow = 4933 &pattern20_0 4934 { 4935 let pattern22_0 = 4936 C::value_type( 4937 ctx, 4938 pattern20_1, 4939 ); 4940 if let Some(( 4941 pattern23_0, 4942 pattern23_1, 4943 )) = C::multi_lane( 4944 ctx, 4945 pattern22_0, 4946 ) { 4947 if pattern23_0 == 32 { 4948 if pattern23_1 == 4 4949 { 4950 // Rule at src/isa/x64/lower.isle line 1273. 4951 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?; 4952 let expr1_0: u8 = 80; 4953 let expr2_0 = OperandSize::Size32; 4954 let expr3_0 = constructor_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?; 4955 let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?; 4956 let expr5_0: u8 = 80; 4957 let expr6_0 = OperandSize::Size32; 4958 let expr7_0 = constructor_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?; 4959 let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); 4960 let expr9_0 = constructor_pmuludq(ctx, expr3_0, &expr8_0)?; 4961 let expr10_0 = constructor_value_xmm(ctx, expr9_0)?; 4962 return Some( 4963 expr10_0, 4964 ); 4965 } 4966 } 4967 } 4968 } 4969 } 4970 } 4971 } 4972 } 4973 } 4974 } 4975 &Opcode::UwidenHigh => { 4976 let pattern14_0 = C::value_type(ctx, pattern12_1); 4977 if let Some((pattern15_0, pattern15_1)) = 4978 C::multi_lane(ctx, pattern14_0) 4979 { 4980 if pattern15_0 == 32 { 4981 if pattern15_1 == 4 { 4982 if let Some(pattern18_0) = 4983 C::def_inst(ctx, pattern9_1) 4984 { 4985 let pattern19_0 = 4986 C::inst_data(ctx, pattern18_0); 4987 if let &InstructionData::Unary { 4988 opcode: ref pattern20_0, 4989 arg: pattern20_1, 4990 } = &pattern19_0 4991 { 4992 if let &Opcode::UwidenHigh = 4993 &pattern20_0 4994 { 4995 let pattern22_0 = 4996 C::value_type( 4997 ctx, 4998 pattern20_1, 4999 ); 5000 if let Some(( 5001 pattern23_0, 5002 pattern23_1, 5003 )) = C::multi_lane( 5004 ctx, 5005 pattern22_0, 5006 ) { 5007 if pattern23_0 == 32 { 5008 if pattern23_1 == 4 5009 { 5010 // Rule at src/isa/x64/lower.isle line 1237. 5011 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?; 5012 let expr1_0: u8 = 250; 5013 let expr2_0 = OperandSize::Size32; 5014 let expr3_0 = constructor_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?; 5015 let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?; 5016 let expr5_0: u8 = 250; 5017 let expr6_0 = OperandSize::Size32; 5018 let expr7_0 = constructor_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?; 5019 let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); 5020 let expr9_0 = constructor_pmuludq(ctx, expr3_0, &expr8_0)?; 5021 let expr10_0 = constructor_value_xmm(ctx, expr9_0)?; 5022 return Some( 5023 expr10_0, 5024 ); 5025 } 5026 } 5027 } 5028 } 5029 } 5030 } 5031 } 5032 } 5033 } 5034 } 5035 _ => {} 5036 } 5037 } 5038 } 5039 // Rule at src/isa/x64/lower.isle line 1113. 5040 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 5041 let expr1_0 = constructor_put_in_xmm(ctx, pattern9_1)?; 5042 let expr2_0: u32 = 32; 5043 let expr3_0 = RegMemImm::Imm { simm32: expr2_0 }; 5044 let expr4_0 = C::xmm_mem_imm_new(ctx, &expr3_0); 5045 let expr5_0 = constructor_psrlq(ctx, expr0_0, &expr4_0)?; 5046 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 5047 let expr7_0 = constructor_pmuludq(ctx, expr5_0, &expr6_0)?; 5048 let expr8_0: u32 = 32; 5049 let expr9_0 = RegMemImm::Imm { simm32: expr8_0 }; 5050 let expr10_0 = C::xmm_mem_imm_new(ctx, &expr9_0); 5051 let expr11_0 = constructor_psrlq(ctx, expr1_0, &expr10_0)?; 5052 let expr12_0 = C::xmm_to_xmm_mem(ctx, expr11_0); 5053 let expr13_0 = constructor_pmuludq(ctx, expr0_0, &expr12_0)?; 5054 let expr14_0 = C::xmm_to_xmm_mem(ctx, expr13_0); 5055 let expr15_0 = constructor_paddq(ctx, expr7_0, &expr14_0)?; 5056 let expr16_0: u32 = 32; 5057 let expr17_0 = RegMemImm::Imm { simm32: expr16_0 }; 5058 let expr18_0 = C::xmm_mem_imm_new(ctx, &expr17_0); 5059 let expr19_0 = constructor_psllq(ctx, expr15_0, &expr18_0)?; 5060 let expr20_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 5061 let expr21_0 = constructor_pmuludq(ctx, expr0_0, &expr20_0)?; 5062 let expr22_0 = C::xmm_to_xmm_mem(ctx, expr19_0); 5063 let expr23_0 = constructor_paddq(ctx, expr21_0, &expr22_0)?; 5064 let expr24_0 = constructor_value_xmm(ctx, expr23_0)?; 5065 return Some(expr24_0); 5066 } 5067 _ => {} 5068 } 5069 } 5070 } 5071 } 5072 let pattern4_0 = C::inst_data(ctx, pattern0_0); 5073 match &pattern4_0 { 5074 &InstructionData::Binary { 5075 opcode: ref pattern5_0, 5076 args: ref pattern5_1, 5077 } => { 5078 match &pattern5_0 { 5079 &Opcode::Band => { 5080 let (pattern7_0, pattern7_1) = 5081 C::unpack_value_array_2(ctx, &pattern5_1); 5082 // Rule at src/isa/x64/lower.isle line 368. 5083 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 5084 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 5085 let expr2_0 = constructor_sse_and(ctx, pattern2_0, expr0_0, &expr1_0)?; 5086 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 5087 return Some(expr3_0); 5088 } 5089 &Opcode::Bor => { 5090 let (pattern7_0, pattern7_1) = 5091 C::unpack_value_array_2(ctx, &pattern5_1); 5092 // Rule at src/isa/x64/lower.isle line 442. 5093 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 5094 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 5095 let expr2_0 = constructor_sse_or(ctx, pattern2_0, expr0_0, &expr1_0)?; 5096 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 5097 return Some(expr3_0); 5098 } 5099 &Opcode::Bxor => { 5100 let (pattern7_0, pattern7_1) = 5101 C::unpack_value_array_2(ctx, &pattern5_1); 5102 // Rule at src/isa/x64/lower.isle line 513. 5103 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 5104 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 5105 let expr2_0 = constructor_sse_xor(ctx, pattern2_0, expr0_0, &expr1_0)?; 5106 let expr3_0 = constructor_value_xmm(ctx, expr2_0)?; 5107 return Some(expr3_0); 5108 } 5109 _ => {} 5110 } 5111 } 5112 &InstructionData::Ternary { 5113 opcode: ref pattern5_0, 5114 args: ref pattern5_1, 5115 } => { 5116 match &pattern5_0 { 5117 &Opcode::Bitselect => { 5118 let (pattern7_0, pattern7_1, pattern7_2) = 5119 C::unpack_value_array_3(ctx, &pattern5_1); 5120 // Rule at src/isa/x64/lower.isle line 1376. 5121 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 5122 let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; 5123 let expr2_0 = C::xmm_to_xmm_mem(ctx, expr0_0); 5124 let expr3_0 = constructor_sse_and(ctx, pattern2_0, expr1_0, &expr2_0)?; 5125 let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern7_2)?; 5126 let expr5_0 = 5127 constructor_sse_and_not(ctx, pattern2_0, expr0_0, &expr4_0)?; 5128 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr3_0); 5129 let expr7_0 = constructor_sse_or(ctx, pattern2_0, expr5_0, &expr6_0)?; 5130 let expr8_0 = constructor_value_xmm(ctx, expr7_0)?; 5131 return Some(expr8_0); 5132 } 5133 &Opcode::Vselect => { 5134 let (pattern7_0, pattern7_1, pattern7_2) = 5135 C::unpack_value_array_3(ctx, &pattern5_1); 5136 // Rule at src/isa/x64/lower.isle line 1390. 5137 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern7_0)?; 5138 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 5139 let expr2_0 = constructor_put_in_xmm(ctx, pattern7_2)?; 5140 let expr3_0 = constructor_sse_blend( 5141 ctx, pattern2_0, &expr0_0, &expr1_0, expr2_0, 5142 )?; 5143 let expr4_0 = constructor_value_xmm(ctx, expr3_0)?; 5144 return Some(expr4_0); 5145 } 5146 _ => {} 5147 } 5148 } 5149 &InstructionData::Unary { 5150 opcode: ref pattern5_0, 5151 arg: pattern5_1, 5152 } => { 5153 if let &Opcode::Bnot = &pattern5_0 { 5154 // Rule at src/isa/x64/lower.isle line 1371. 5155 let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?; 5156 let expr1_0 = constructor_vector_all_ones(ctx, pattern2_0)?; 5157 let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 5158 let expr3_0 = constructor_sse_xor(ctx, pattern2_0, expr0_0, &expr2_0)?; 5159 let expr4_0 = constructor_value_xmm(ctx, expr3_0)?; 5160 return Some(expr4_0); 5161 } 5162 } 5163 _ => {} 5164 } 5165 } 5166 if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { 5167 let pattern4_0 = C::inst_data(ctx, pattern0_0); 5168 match &pattern4_0 { 5169 &InstructionData::UnaryImm { 5170 opcode: ref pattern5_0, 5171 imm: pattern5_1, 5172 } => { 5173 if let &Opcode::Iconst = &pattern5_0 { 5174 let pattern7_0 = C::u64_from_imm64(ctx, pattern5_1); 5175 // Rule at src/isa/x64/lower.isle line 10. 5176 let expr0_0 = constructor_imm(ctx, pattern3_0, pattern7_0)?; 5177 let expr1_0 = C::value_reg(ctx, expr0_0); 5178 return Some(expr1_0); 5179 } 5180 } 5181 &InstructionData::UnaryBool { 5182 opcode: ref pattern5_0, 5183 imm: pattern5_1, 5184 } => { 5185 if let &Opcode::Bconst = &pattern5_0 { 5186 if pattern5_1 == true { 5187 // Rule at src/isa/x64/lower.isle line 28. 5188 let expr0_0: u64 = 1; 5189 let expr1_0 = constructor_imm(ctx, pattern3_0, expr0_0)?; 5190 let expr2_0 = C::value_reg(ctx, expr1_0); 5191 return Some(expr2_0); 5192 } 5193 if pattern5_1 == false { 5194 // Rule at src/isa/x64/lower.isle line 24. 5195 let expr0_0: u64 = 0; 5196 let expr1_0 = constructor_imm(ctx, pattern3_0, expr0_0)?; 5197 let expr2_0 = C::value_reg(ctx, expr1_0); 5198 return Some(expr2_0); 5199 } 5200 } 5201 } 5202 &InstructionData::Binary { 5203 opcode: ref pattern5_0, 5204 args: ref pattern5_1, 5205 } => { 5206 match &pattern5_0 { 5207 &Opcode::Imin => { 5208 let (pattern7_0, pattern7_1) = 5209 C::unpack_value_array_2(ctx, &pattern5_1); 5210 // Rule at src/isa/x64/lower.isle line 1480. 5211 let expr0_0 = CC::L; 5212 let expr1_0 = constructor_cmp_and_choose( 5213 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1, 5214 )?; 5215 return Some(expr1_0); 5216 } 5217 &Opcode::Umin => { 5218 let (pattern7_0, pattern7_1) = 5219 C::unpack_value_array_2(ctx, &pattern5_1); 5220 // Rule at src/isa/x64/lower.isle line 1474. 5221 let expr0_0 = CC::B; 5222 let expr1_0 = constructor_cmp_and_choose( 5223 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1, 5224 )?; 5225 return Some(expr1_0); 5226 } 5227 &Opcode::Imax => { 5228 let (pattern7_0, pattern7_1) = 5229 C::unpack_value_array_2(ctx, &pattern5_1); 5230 // Rule at src/isa/x64/lower.isle line 1483. 5231 let expr0_0 = CC::NL; 5232 let expr1_0 = constructor_cmp_and_choose( 5233 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1, 5234 )?; 5235 return Some(expr1_0); 5236 } 5237 &Opcode::Umax => { 5238 let (pattern7_0, pattern7_1) = 5239 C::unpack_value_array_2(ctx, &pattern5_1); 5240 // Rule at src/isa/x64/lower.isle line 1477. 5241 let expr0_0 = CC::NB; 5242 let expr1_0 = constructor_cmp_and_choose( 5243 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1, 5244 )?; 5245 return Some(expr1_0); 5246 } 5247 &Opcode::Iadd => { 5248 let (pattern7_0, pattern7_1) = 5249 C::unpack_value_array_2(ctx, &pattern5_1); 5250 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) { 5251 // Rule at src/isa/x64/lower.isle line 76. 5252 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 5253 let expr1_0 = 5254 constructor_add(ctx, pattern3_0, expr0_0, &pattern8_0)?; 5255 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?; 5256 return Some(expr2_0); 5257 } 5258 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) { 5259 // Rule at src/isa/x64/lower.isle line 88. 5260 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 5261 let expr1_0 = 5262 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 5263 let expr2_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr1_0)?; 5264 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?; 5265 return Some(expr3_0); 5266 } 5267 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) { 5268 // Rule at src/isa/x64/lower.isle line 72. 5269 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5270 let expr1_0 = 5271 constructor_add(ctx, pattern3_0, expr0_0, &pattern8_0)?; 5272 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?; 5273 return Some(expr2_0); 5274 } 5275 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) { 5276 // Rule at src/isa/x64/lower.isle line 82. 5277 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5278 let expr1_0 = 5279 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 5280 let expr2_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr1_0)?; 5281 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?; 5282 return Some(expr3_0); 5283 } 5284 // Rule at src/isa/x64/lower.isle line 64. 5285 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5286 let expr1_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 5287 let expr2_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0); 5288 let expr3_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr2_0)?; 5289 let expr4_0 = constructor_value_gpr(ctx, expr3_0)?; 5290 return Some(expr4_0); 5291 } 5292 &Opcode::Isub => { 5293 let (pattern7_0, pattern7_1) = 5294 C::unpack_value_array_2(ctx, &pattern5_1); 5295 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) { 5296 // Rule at src/isa/x64/lower.isle line 252. 5297 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5298 let expr1_0 = 5299 constructor_sub(ctx, pattern3_0, expr0_0, &pattern8_0)?; 5300 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?; 5301 return Some(expr2_0); 5302 } 5303 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) { 5304 // Rule at src/isa/x64/lower.isle line 257. 5305 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5306 let expr1_0 = 5307 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 5308 let expr2_0 = constructor_sub(ctx, pattern3_0, expr0_0, &expr1_0)?; 5309 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?; 5310 return Some(expr3_0); 5311 } 5312 // Rule at src/isa/x64/lower.isle line 245. 5313 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5314 let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?; 5315 let expr2_0 = constructor_sub(ctx, pattern3_0, expr0_0, &expr1_0)?; 5316 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?; 5317 return Some(expr3_0); 5318 } 5319 &Opcode::Imul => { 5320 let (pattern7_0, pattern7_1) = 5321 C::unpack_value_array_2(ctx, &pattern5_1); 5322 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) { 5323 // Rule at src/isa/x64/lower.isle line 1019. 5324 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 5325 let expr1_0 = 5326 constructor_mul(ctx, pattern3_0, expr0_0, &pattern8_0)?; 5327 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?; 5328 return Some(expr2_0); 5329 } 5330 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) { 5331 // Rule at src/isa/x64/lower.isle line 1031. 5332 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 5333 let expr1_0 = 5334 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 5335 let expr2_0 = constructor_mul(ctx, pattern3_0, expr0_0, &expr1_0)?; 5336 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?; 5337 return Some(expr3_0); 5338 } 5339 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) { 5340 // Rule at src/isa/x64/lower.isle line 1015. 5341 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5342 let expr1_0 = 5343 constructor_mul(ctx, pattern3_0, expr0_0, &pattern8_0)?; 5344 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?; 5345 return Some(expr2_0); 5346 } 5347 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) { 5348 // Rule at src/isa/x64/lower.isle line 1025. 5349 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5350 let expr1_0 = 5351 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 5352 let expr2_0 = constructor_mul(ctx, pattern3_0, expr0_0, &expr1_0)?; 5353 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?; 5354 return Some(expr3_0); 5355 } 5356 // Rule at src/isa/x64/lower.isle line 1008. 5357 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5358 let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?; 5359 let expr2_0 = constructor_mul(ctx, pattern3_0, expr0_0, &expr1_0)?; 5360 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?; 5361 return Some(expr3_0); 5362 } 5363 &Opcode::IaddIfcout => { 5364 let (pattern7_0, pattern7_1) = 5365 C::unpack_value_array_2(ctx, &pattern5_1); 5366 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) { 5367 // Rule at src/isa/x64/lower.isle line 183. 5368 let expr0_0 = C::temp_writable_gpr(ctx); 5369 let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 5370 let expr2_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 5371 let expr3_0 = 5372 constructor_add(ctx, pattern3_0, expr2_0, &pattern8_0)?; 5373 let expr4_0 = constructor_value_gprs(ctx, expr3_0, expr1_0)?; 5374 return Some(expr4_0); 5375 } 5376 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) { 5377 // Rule at src/isa/x64/lower.isle line 199. 5378 let expr0_0 = C::temp_writable_gpr(ctx); 5379 let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 5380 let expr2_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 5381 let expr3_0 = 5382 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 5383 let expr4_0 = constructor_add(ctx, pattern3_0, expr2_0, &expr3_0)?; 5384 let expr5_0 = constructor_value_gprs(ctx, expr4_0, expr1_0)?; 5385 return Some(expr5_0); 5386 } 5387 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) { 5388 // Rule at src/isa/x64/lower.isle line 177. 5389 let expr0_0 = C::temp_writable_gpr(ctx); 5390 let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 5391 let expr2_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5392 let expr3_0 = 5393 constructor_add(ctx, pattern3_0, expr2_0, &pattern8_0)?; 5394 let expr4_0 = constructor_value_gprs(ctx, expr3_0, expr1_0)?; 5395 return Some(expr4_0); 5396 } 5397 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) { 5398 // Rule at src/isa/x64/lower.isle line 191. 5399 let expr0_0 = C::temp_writable_gpr(ctx); 5400 let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 5401 let expr2_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5402 let expr3_0 = 5403 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 5404 let expr4_0 = constructor_add(ctx, pattern3_0, expr2_0, &expr3_0)?; 5405 let expr5_0 = constructor_value_gprs(ctx, expr4_0, expr1_0)?; 5406 return Some(expr5_0); 5407 } 5408 // Rule at src/isa/x64/lower.isle line 167. 5409 let expr0_0 = C::temp_writable_gpr(ctx); 5410 let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 5411 let expr2_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5412 let expr3_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?; 5413 let expr4_0 = constructor_add(ctx, pattern3_0, expr2_0, &expr3_0)?; 5414 let expr5_0 = constructor_value_gprs(ctx, expr4_0, expr1_0)?; 5415 return Some(expr5_0); 5416 } 5417 &Opcode::Band => { 5418 let (pattern7_0, pattern7_1) = 5419 C::unpack_value_array_2(ctx, &pattern5_1); 5420 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) { 5421 // Rule at src/isa/x64/lower.isle line 355. 5422 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 5423 let expr1_0 = 5424 constructor_x64_and(ctx, pattern3_0, expr0_0, &pattern8_0)?; 5425 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?; 5426 return Some(expr2_0); 5427 } 5428 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) { 5429 // Rule at src/isa/x64/lower.isle line 341. 5430 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 5431 let expr1_0 = 5432 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 5433 let expr2_0 = 5434 constructor_x64_and(ctx, pattern3_0, expr0_0, &expr1_0)?; 5435 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?; 5436 return Some(expr3_0); 5437 } 5438 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) { 5439 // Rule at src/isa/x64/lower.isle line 349. 5440 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5441 let expr1_0 = 5442 constructor_x64_and(ctx, pattern3_0, expr0_0, &pattern8_0)?; 5443 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?; 5444 return Some(expr2_0); 5445 } 5446 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) { 5447 // Rule at src/isa/x64/lower.isle line 335. 5448 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5449 let expr1_0 = 5450 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 5451 let expr2_0 = 5452 constructor_x64_and(ctx, pattern3_0, expr0_0, &expr1_0)?; 5453 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?; 5454 return Some(expr3_0); 5455 } 5456 // Rule at src/isa/x64/lower.isle line 328. 5457 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5458 let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?; 5459 let expr2_0 = constructor_x64_and(ctx, pattern3_0, expr0_0, &expr1_0)?; 5460 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?; 5461 return Some(expr3_0); 5462 } 5463 &Opcode::Bor => { 5464 let (pattern7_0, pattern7_1) = 5465 C::unpack_value_array_2(ctx, &pattern5_1); 5466 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) { 5467 // Rule at src/isa/x64/lower.isle line 429. 5468 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 5469 let expr1_0 = 5470 constructor_or(ctx, pattern3_0, expr0_0, &pattern8_0)?; 5471 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?; 5472 return Some(expr2_0); 5473 } 5474 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) { 5475 // Rule at src/isa/x64/lower.isle line 415. 5476 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 5477 let expr1_0 = 5478 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 5479 let expr2_0 = constructor_or(ctx, pattern3_0, expr0_0, &expr1_0)?; 5480 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?; 5481 return Some(expr3_0); 5482 } 5483 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) { 5484 // Rule at src/isa/x64/lower.isle line 423. 5485 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5486 let expr1_0 = 5487 constructor_or(ctx, pattern3_0, expr0_0, &pattern8_0)?; 5488 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?; 5489 return Some(expr2_0); 5490 } 5491 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) { 5492 // Rule at src/isa/x64/lower.isle line 409. 5493 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5494 let expr1_0 = 5495 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 5496 let expr2_0 = constructor_or(ctx, pattern3_0, expr0_0, &expr1_0)?; 5497 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?; 5498 return Some(expr3_0); 5499 } 5500 // Rule at src/isa/x64/lower.isle line 402. 5501 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5502 let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?; 5503 let expr2_0 = constructor_or(ctx, pattern3_0, expr0_0, &expr1_0)?; 5504 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?; 5505 return Some(expr3_0); 5506 } 5507 &Opcode::Bxor => { 5508 let (pattern7_0, pattern7_1) = 5509 C::unpack_value_array_2(ctx, &pattern5_1); 5510 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) { 5511 // Rule at src/isa/x64/lower.isle line 505. 5512 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 5513 let expr1_0 = 5514 constructor_xor(ctx, pattern3_0, expr0_0, &pattern8_0)?; 5515 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?; 5516 return Some(expr2_0); 5517 } 5518 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) { 5519 // Rule at src/isa/x64/lower.isle line 491. 5520 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 5521 let expr1_0 = 5522 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 5523 let expr2_0 = constructor_xor(ctx, pattern3_0, expr0_0, &expr1_0)?; 5524 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?; 5525 return Some(expr3_0); 5526 } 5527 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) { 5528 // Rule at src/isa/x64/lower.isle line 499. 5529 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5530 let expr1_0 = 5531 constructor_xor(ctx, pattern3_0, expr0_0, &pattern8_0)?; 5532 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?; 5533 return Some(expr2_0); 5534 } 5535 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) { 5536 // Rule at src/isa/x64/lower.isle line 485. 5537 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5538 let expr1_0 = 5539 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 5540 let expr2_0 = constructor_xor(ctx, pattern3_0, expr0_0, &expr1_0)?; 5541 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?; 5542 return Some(expr3_0); 5543 } 5544 // Rule at src/isa/x64/lower.isle line 478. 5545 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5546 let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?; 5547 let expr2_0 = constructor_xor(ctx, pattern3_0, expr0_0, &expr1_0)?; 5548 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?; 5549 return Some(expr3_0); 5550 } 5551 &Opcode::Ishl => { 5552 let (pattern7_0, pattern7_1) = 5553 C::unpack_value_array_2(ctx, &pattern5_1); 5554 // Rule at src/isa/x64/lower.isle line 543. 5555 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5556 let expr1_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0); 5557 let expr2_0 = constructor_shl(ctx, pattern3_0, expr0_0, &expr1_0)?; 5558 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?; 5559 return Some(expr3_0); 5560 } 5561 &Opcode::Ushr => { 5562 let (pattern7_0, pattern7_1) = 5563 C::unpack_value_array_2(ctx, &pattern5_1); 5564 // Rule at src/isa/x64/lower.isle line 655. 5565 let expr0_0 = ExtendKind::Zero; 5566 let expr1_0 = 5567 constructor_extend_to_gpr(ctx, pattern7_0, pattern3_0, &expr0_0)?; 5568 let expr2_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0); 5569 let expr3_0 = constructor_shr(ctx, pattern3_0, expr1_0, &expr2_0)?; 5570 let expr4_0 = constructor_value_gpr(ctx, expr3_0)?; 5571 return Some(expr4_0); 5572 } 5573 &Opcode::Sshr => { 5574 let (pattern7_0, pattern7_1) = 5575 C::unpack_value_array_2(ctx, &pattern5_1); 5576 // Rule at src/isa/x64/lower.isle line 767. 5577 let expr0_0 = ExtendKind::Sign; 5578 let expr1_0 = 5579 constructor_extend_to_gpr(ctx, pattern7_0, pattern3_0, &expr0_0)?; 5580 let expr2_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0); 5581 let expr3_0 = constructor_sar(ctx, pattern3_0, expr1_0, &expr2_0)?; 5582 let expr4_0 = constructor_value_gpr(ctx, expr3_0)?; 5583 return Some(expr4_0); 5584 } 5585 _ => {} 5586 } 5587 } 5588 &InstructionData::Unary { 5589 opcode: ref pattern5_0, 5590 arg: pattern5_1, 5591 } => { 5592 match &pattern5_0 { 5593 &Opcode::Ineg => { 5594 // Rule at src/isa/x64/lower.isle line 972. 5595 let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; 5596 let expr1_0 = constructor_neg(ctx, pattern3_0, expr0_0)?; 5597 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?; 5598 return Some(expr2_0); 5599 } 5600 &Opcode::Bnot => { 5601 // Rule at src/isa/x64/lower.isle line 1350. 5602 let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; 5603 let expr1_0 = constructor_not(ctx, pattern3_0, expr0_0)?; 5604 let expr2_0 = constructor_value_gpr(ctx, expr1_0)?; 5605 return Some(expr2_0); 5606 } 5607 _ => {} 5608 } 5609 } 5610 &InstructionData::BinaryImm64 { 5611 opcode: ref pattern5_0, 5612 arg: pattern5_1, 5613 imm: pattern5_2, 5614 } => { 5615 if let &Opcode::IaddImm = &pattern5_0 { 5616 let pattern7_0 = C::u64_from_imm64(ctx, pattern5_2); 5617 // Rule at src/isa/x64/lower.isle line 218. 5618 let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; 5619 let expr1_0 = constructor_imm(ctx, pattern3_0, pattern7_0)?; 5620 let expr2_0 = C::gpr_new(ctx, expr1_0); 5621 let expr3_0 = C::gpr_to_gpr_mem_imm(ctx, expr2_0); 5622 let expr4_0 = constructor_add(ctx, pattern3_0, expr0_0, &expr3_0)?; 5623 let expr5_0 = constructor_value_gpr(ctx, expr4_0)?; 5624 return Some(expr5_0); 5625 } 5626 } 5627 _ => {} 5628 } 5629 } 5630 if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) { 5631 let pattern4_0 = C::inst_data(ctx, pattern0_0); 5632 if let &InstructionData::Binary { 5633 opcode: ref pattern5_0, 5634 args: ref pattern5_1, 5635 } = &pattern4_0 5636 { 5637 match &pattern5_0 { 5638 &Opcode::Rotl => { 5639 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); 5640 if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { 5641 let pattern9_0 = C::inst_data(ctx, pattern8_0); 5642 if let &InstructionData::UnaryImm { 5643 opcode: ref pattern10_0, 5644 imm: pattern10_1, 5645 } = &pattern9_0 5646 { 5647 if let &Opcode::Iconst = &pattern10_0 { 5648 let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); 5649 // Rule at src/isa/x64/lower.isle line 908. 5650 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5651 let expr1_0 = 5652 C::const_to_type_masked_imm8(ctx, pattern12_0, pattern3_0); 5653 let expr2_0 = 5654 constructor_x64_rotl(ctx, pattern3_0, expr0_0, &expr1_0)?; 5655 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?; 5656 return Some(expr3_0); 5657 } 5658 } 5659 } 5660 // Rule at src/isa/x64/lower.isle line 902. 5661 let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?; 5662 let expr1_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5663 let expr2_0 = C::gpr_to_imm8_gpr(ctx, expr0_0); 5664 let expr3_0 = constructor_x64_rotl(ctx, pattern3_0, expr1_0, &expr2_0)?; 5665 let expr4_0 = constructor_value_gpr(ctx, expr3_0)?; 5666 return Some(expr4_0); 5667 } 5668 &Opcode::Rotr => { 5669 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); 5670 if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { 5671 let pattern9_0 = C::inst_data(ctx, pattern8_0); 5672 if let &InstructionData::UnaryImm { 5673 opcode: ref pattern10_0, 5674 imm: pattern10_1, 5675 } = &pattern9_0 5676 { 5677 if let &Opcode::Iconst = &pattern10_0 { 5678 let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); 5679 // Rule at src/isa/x64/lower.isle line 950. 5680 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5681 let expr1_0 = 5682 C::const_to_type_masked_imm8(ctx, pattern12_0, pattern3_0); 5683 let expr2_0 = 5684 constructor_x64_rotr(ctx, pattern3_0, expr0_0, &expr1_0)?; 5685 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?; 5686 return Some(expr3_0); 5687 } 5688 } 5689 } 5690 // Rule at src/isa/x64/lower.isle line 944. 5691 let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?; 5692 let expr1_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5693 let expr2_0 = C::gpr_to_imm8_gpr(ctx, expr0_0); 5694 let expr3_0 = constructor_x64_rotr(ctx, pattern3_0, expr1_0, &expr2_0)?; 5695 let expr4_0 = constructor_value_gpr(ctx, expr3_0)?; 5696 return Some(expr4_0); 5697 } 5698 _ => {} 5699 } 5700 } 5701 } 5702 if let Some(pattern3_0) = C::ty_8_or_16(ctx, pattern2_0) { 5703 let pattern4_0 = C::inst_data(ctx, pattern0_0); 5704 if let &InstructionData::Binary { 5705 opcode: ref pattern5_0, 5706 args: ref pattern5_1, 5707 } = &pattern4_0 5708 { 5709 match &pattern5_0 { 5710 &Opcode::Rotl => { 5711 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); 5712 if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { 5713 let pattern9_0 = C::inst_data(ctx, pattern8_0); 5714 if let &InstructionData::UnaryImm { 5715 opcode: ref pattern10_0, 5716 imm: pattern10_1, 5717 } = &pattern9_0 5718 { 5719 if let &Opcode::Iconst = &pattern10_0 { 5720 let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); 5721 // Rule at src/isa/x64/lower.isle line 893. 5722 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5723 let expr1_0 = 5724 C::const_to_type_masked_imm8(ctx, pattern12_0, pattern3_0); 5725 let expr2_0 = 5726 constructor_x64_rotl(ctx, pattern3_0, expr0_0, &expr1_0)?; 5727 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?; 5728 return Some(expr3_0); 5729 } 5730 } 5731 } 5732 // Rule at src/isa/x64/lower.isle line 889. 5733 let expr0_0: Type = I32; 5734 let expr1_0 = ExtendKind::Zero; 5735 let expr2_0 = 5736 constructor_extend_to_gpr(ctx, pattern7_1, expr0_0, &expr1_0)?; 5737 let expr3_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5738 let expr4_0 = C::gpr_to_imm8_gpr(ctx, expr2_0); 5739 let expr5_0 = constructor_x64_rotl(ctx, pattern3_0, expr3_0, &expr4_0)?; 5740 let expr6_0 = constructor_value_gpr(ctx, expr5_0)?; 5741 return Some(expr6_0); 5742 } 5743 &Opcode::Rotr => { 5744 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, &pattern5_1); 5745 if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { 5746 let pattern9_0 = C::inst_data(ctx, pattern8_0); 5747 if let &InstructionData::UnaryImm { 5748 opcode: ref pattern10_0, 5749 imm: pattern10_1, 5750 } = &pattern9_0 5751 { 5752 if let &Opcode::Iconst = &pattern10_0 { 5753 let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); 5754 // Rule at src/isa/x64/lower.isle line 935. 5755 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5756 let expr1_0 = 5757 C::const_to_type_masked_imm8(ctx, pattern12_0, pattern3_0); 5758 let expr2_0 = 5759 constructor_x64_rotr(ctx, pattern3_0, expr0_0, &expr1_0)?; 5760 let expr3_0 = constructor_value_gpr(ctx, expr2_0)?; 5761 return Some(expr3_0); 5762 } 5763 } 5764 } 5765 // Rule at src/isa/x64/lower.isle line 931. 5766 let expr0_0: Type = I32; 5767 let expr1_0 = ExtendKind::Zero; 5768 let expr2_0 = 5769 constructor_extend_to_gpr(ctx, pattern7_1, expr0_0, &expr1_0)?; 5770 let expr3_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 5771 let expr4_0 = C::gpr_to_imm8_gpr(ctx, expr2_0); 5772 let expr5_0 = constructor_x64_rotr(ctx, pattern3_0, expr3_0, &expr4_0)?; 5773 let expr6_0 = constructor_value_gpr(ctx, expr5_0)?; 5774 return Some(expr6_0); 5775 } 5776 _ => {} 5777 } 5778 } 5779 } 5780 } 5781 return None; 5782 } 5783 5784 // Generated as internal constructor for term sse_and. 5785 pub fn constructor_sse_and<C: Context>( 5786 ctx: &mut C, 5787 arg0: Type, 5788 arg1: Xmm, 5789 arg2: &XmmMem, 5790 ) -> Option<Xmm> { 5791 let pattern0_0 = arg0; 5792 if pattern0_0 == F32X4 { 5793 let pattern2_0 = arg1; 5794 let pattern3_0 = arg2; 5795 // Rule at src/isa/x64/lower.isle line 364. 5796 let expr0_0 = constructor_andps(ctx, pattern2_0, pattern3_0)?; 5797 return Some(expr0_0); 5798 } 5799 if pattern0_0 == F64X2 { 5800 let pattern2_0 = arg1; 5801 let pattern3_0 = arg2; 5802 // Rule at src/isa/x64/lower.isle line 365. 5803 let expr0_0 = constructor_andpd(ctx, pattern2_0, pattern3_0)?; 5804 return Some(expr0_0); 5805 } 5806 if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { 5807 let pattern2_0 = arg1; 5808 let pattern3_0 = arg2; 5809 // Rule at src/isa/x64/lower.isle line 366. 5810 let expr0_0 = constructor_pand(ctx, pattern2_0, pattern3_0)?; 5811 return Some(expr0_0); 5812 } 5813 return None; 5814 } 5815 5816 // Generated as internal constructor for term sse_or. 5817 pub fn constructor_sse_or<C: Context>( 5818 ctx: &mut C, 5819 arg0: Type, 5820 arg1: Xmm, 5821 arg2: &XmmMem, 5822 ) -> Option<Xmm> { 5823 let pattern0_0 = arg0; 5824 if pattern0_0 == F32X4 { 5825 let pattern2_0 = arg1; 5826 let pattern3_0 = arg2; 5827 // Rule at src/isa/x64/lower.isle line 438. 5828 let expr0_0 = constructor_orps(ctx, pattern2_0, pattern3_0)?; 5829 return Some(expr0_0); 5830 } 5831 if pattern0_0 == F64X2 { 5832 let pattern2_0 = arg1; 5833 let pattern3_0 = arg2; 5834 // Rule at src/isa/x64/lower.isle line 439. 5835 let expr0_0 = constructor_orpd(ctx, pattern2_0, pattern3_0)?; 5836 return Some(expr0_0); 5837 } 5838 if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { 5839 let pattern2_0 = arg1; 5840 let pattern3_0 = arg2; 5841 // Rule at src/isa/x64/lower.isle line 440. 5842 let expr0_0 = constructor_por(ctx, pattern2_0, pattern3_0)?; 5843 return Some(expr0_0); 5844 } 5845 return None; 5846 } 5847 5848 // Generated as internal constructor for term or_i128. 5849 pub fn constructor_or_i128<C: Context>( 5850 ctx: &mut C, 5851 arg0: ValueRegs, 5852 arg1: ValueRegs, 5853 ) -> Option<ValueRegs> { 5854 let pattern0_0 = arg0; 5855 let pattern1_0 = arg1; 5856 // Rule at src/isa/x64/lower.isle line 451. 5857 let expr0_0: usize = 0; 5858 let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?; 5859 let expr2_0: usize = 1; 5860 let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?; 5861 let expr4_0: usize = 0; 5862 let expr5_0 = constructor_value_regs_get_gpr(ctx, pattern1_0, expr4_0)?; 5863 let expr6_0: usize = 1; 5864 let expr7_0 = constructor_value_regs_get_gpr(ctx, pattern1_0, expr6_0)?; 5865 let expr8_0: Type = I64; 5866 let expr9_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0); 5867 let expr10_0 = constructor_or(ctx, expr8_0, expr1_0, &expr9_0)?; 5868 let expr11_0: Type = I64; 5869 let expr12_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0); 5870 let expr13_0 = constructor_or(ctx, expr11_0, expr3_0, &expr12_0)?; 5871 let expr14_0 = constructor_value_gprs(ctx, expr10_0, expr13_0)?; 5872 return Some(expr14_0); 5873 } 5874 5875 // Generated as internal constructor for term shl_i128. 5876 pub fn constructor_shl_i128<C: Context>( 5877 ctx: &mut C, 5878 arg0: ValueRegs, 5879 arg1: Gpr, 5880 ) -> Option<ValueRegs> { 5881 let pattern0_0 = arg0; 5882 let pattern1_0 = arg1; 5883 // Rule at src/isa/x64/lower.isle line 549. 5884 let expr0_0: usize = 0; 5885 let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?; 5886 let expr2_0: usize = 1; 5887 let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?; 5888 let expr4_0: Type = I64; 5889 let expr5_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0); 5890 let expr6_0 = constructor_shl(ctx, expr4_0, expr1_0, &expr5_0)?; 5891 let expr7_0: Type = I64; 5892 let expr8_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0); 5893 let expr9_0 = constructor_shl(ctx, expr7_0, expr3_0, &expr8_0)?; 5894 let expr10_0: Type = I64; 5895 let expr11_0: Type = I64; 5896 let expr12_0: Type = I64; 5897 let expr13_0: u64 = 64; 5898 let expr14_0 = constructor_imm(ctx, expr12_0, expr13_0)?; 5899 let expr15_0 = C::gpr_new(ctx, expr14_0); 5900 let expr16_0 = C::gpr_to_gpr_mem_imm(ctx, pattern1_0); 5901 let expr17_0 = constructor_sub(ctx, expr11_0, expr15_0, &expr16_0)?; 5902 let expr18_0 = C::gpr_to_imm8_gpr(ctx, expr17_0); 5903 let expr19_0 = constructor_shr(ctx, expr10_0, expr1_0, &expr18_0)?; 5904 let expr20_0: Type = I64; 5905 let expr21_0: u64 = 0; 5906 let expr22_0 = constructor_imm(ctx, expr20_0, expr21_0)?; 5907 let expr23_0 = C::gpr_new(ctx, expr22_0); 5908 let expr24_0 = OperandSize::Size64; 5909 let expr25_0: u32 = 127; 5910 let expr26_0 = RegMemImm::Imm { simm32: expr25_0 }; 5911 let expr27_0 = C::gpr_mem_imm_new(ctx, &expr26_0); 5912 let expr28_0 = constructor_test(ctx, &expr24_0, &expr27_0, pattern1_0)?; 5913 let expr29_0: Type = I64; 5914 let expr30_0 = CC::Z; 5915 let expr31_0 = C::gpr_to_gpr_mem(ctx, expr23_0); 5916 let expr32_0 = constructor_cmove(ctx, expr29_0, &expr30_0, &expr31_0, expr19_0)?; 5917 let expr33_0 = constructor_with_flags_1(ctx, &expr28_0, &expr32_0)?; 5918 let expr34_0 = C::gpr_new(ctx, expr33_0); 5919 let expr35_0: Type = I64; 5920 let expr36_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); 5921 let expr37_0 = constructor_or(ctx, expr35_0, expr34_0, &expr36_0)?; 5922 let expr38_0 = OperandSize::Size64; 5923 let expr39_0: u32 = 64; 5924 let expr40_0 = RegMemImm::Imm { simm32: expr39_0 }; 5925 let expr41_0 = C::gpr_mem_imm_new(ctx, &expr40_0); 5926 let expr42_0 = constructor_test(ctx, &expr38_0, &expr41_0, pattern1_0)?; 5927 let expr43_0: Type = I64; 5928 let expr44_0 = CC::Z; 5929 let expr45_0 = C::gpr_to_gpr_mem(ctx, expr6_0); 5930 let expr46_0 = constructor_cmove(ctx, expr43_0, &expr44_0, &expr45_0, expr23_0)?; 5931 let expr47_0: Type = I64; 5932 let expr48_0 = CC::Z; 5933 let expr49_0 = C::gpr_to_gpr_mem(ctx, expr37_0); 5934 let expr50_0 = constructor_cmove(ctx, expr47_0, &expr48_0, &expr49_0, expr6_0)?; 5935 let expr51_0 = constructor_with_flags_2(ctx, &expr42_0, &expr46_0, &expr50_0)?; 5936 return Some(expr51_0); 5937 } 5938 5939 // Generated as internal constructor for term ishl_i8x16_mask. 5940 pub fn constructor_ishl_i8x16_mask<C: Context>( 5941 ctx: &mut C, 5942 arg0: &RegMemImm, 5943 ) -> Option<SyntheticAmode> { 5944 let pattern0_0 = arg0; 5945 match pattern0_0 { 5946 &RegMemImm::Imm { simm32: pattern1_0 } => { 5947 // Rule at src/isa/x64/lower.isle line 615. 5948 let expr0_0 = C::ishl_i8x16_mask_for_const(ctx, pattern1_0); 5949 return Some(expr0_0); 5950 } 5951 &RegMemImm::Reg { reg: pattern1_0 } => { 5952 // Rule at src/isa/x64/lower.isle line 624. 5953 let expr0_0 = C::ishl_i8x16_mask_table(ctx); 5954 let expr1_0 = constructor_lea(ctx, &expr0_0)?; 5955 let expr2_0: Type = I64; 5956 let expr3_0 = C::gpr_new(ctx, pattern1_0); 5957 let expr4_0: u8 = 4; 5958 let expr5_0 = C::imm8_to_imm8_gpr(ctx, expr4_0); 5959 let expr6_0 = constructor_shl(ctx, expr2_0, expr3_0, &expr5_0)?; 5960 let expr7_0: u32 = 0; 5961 let expr8_0: u8 = 0; 5962 let expr9_0 = C::amode_imm_reg_reg_shift(ctx, expr7_0, expr1_0, expr6_0, expr8_0); 5963 let expr10_0 = C::amode_to_synthetic_amode(ctx, &expr9_0); 5964 return Some(expr10_0); 5965 } 5966 &RegMemImm::Mem { 5967 addr: ref pattern1_0, 5968 } => { 5969 // Rule at src/isa/x64/lower.isle line 634. 5970 let expr0_0: Type = I64; 5971 let expr1_0 = ExtKind::None; 5972 let expr2_0 = constructor_x64_load(ctx, expr0_0, &pattern1_0, &expr1_0)?; 5973 let expr3_0 = RegMemImm::Reg { reg: expr2_0 }; 5974 let expr4_0 = constructor_ishl_i8x16_mask(ctx, &expr3_0)?; 5975 return Some(expr4_0); 5976 } 5977 _ => {} 5978 } 5979 return None; 5980 } 5981 5982 // Generated as internal constructor for term shr_i128. 5983 pub fn constructor_shr_i128<C: Context>( 5984 ctx: &mut C, 5985 arg0: ValueRegs, 5986 arg1: Gpr, 5987 ) -> Option<ValueRegs> { 5988 let pattern0_0 = arg0; 5989 let pattern1_0 = arg1; 5990 // Rule at src/isa/x64/lower.isle line 662. 5991 let expr0_0: usize = 0; 5992 let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?; 5993 let expr2_0: usize = 1; 5994 let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?; 5995 let expr4_0: Type = I64; 5996 let expr5_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0); 5997 let expr6_0 = constructor_shr(ctx, expr4_0, expr1_0, &expr5_0)?; 5998 let expr7_0: Type = I64; 5999 let expr8_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0); 6000 let expr9_0 = constructor_shr(ctx, expr7_0, expr3_0, &expr8_0)?; 6001 let expr10_0: Type = I64; 6002 let expr11_0: Type = I64; 6003 let expr12_0: Type = I64; 6004 let expr13_0: u64 = 64; 6005 let expr14_0 = constructor_imm(ctx, expr12_0, expr13_0)?; 6006 let expr15_0 = C::gpr_new(ctx, expr14_0); 6007 let expr16_0 = C::gpr_to_gpr_mem_imm(ctx, pattern1_0); 6008 let expr17_0 = constructor_sub(ctx, expr11_0, expr15_0, &expr16_0)?; 6009 let expr18_0 = C::gpr_to_imm8_gpr(ctx, expr17_0); 6010 let expr19_0 = constructor_shl(ctx, expr10_0, expr3_0, &expr18_0)?; 6011 let expr20_0 = OperandSize::Size64; 6012 let expr21_0: u32 = 127; 6013 let expr22_0 = RegMemImm::Imm { simm32: expr21_0 }; 6014 let expr23_0 = C::gpr_mem_imm_new(ctx, &expr22_0); 6015 let expr24_0 = constructor_test(ctx, &expr20_0, &expr23_0, pattern1_0)?; 6016 let expr25_0: Type = I64; 6017 let expr26_0 = CC::Z; 6018 let expr27_0: Type = I64; 6019 let expr28_0: u64 = 0; 6020 let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0)?; 6021 let expr30_0 = C::gpr_new(ctx, expr29_0); 6022 let expr31_0 = C::gpr_to_gpr_mem(ctx, expr30_0); 6023 let expr32_0 = constructor_cmove(ctx, expr25_0, &expr26_0, &expr31_0, expr19_0)?; 6024 let expr33_0 = constructor_with_flags_1(ctx, &expr24_0, &expr32_0)?; 6025 let expr34_0 = C::gpr_new(ctx, expr33_0); 6026 let expr35_0: Type = I64; 6027 let expr36_0 = C::gpr_to_gpr_mem_imm(ctx, expr6_0); 6028 let expr37_0 = constructor_or(ctx, expr35_0, expr34_0, &expr36_0)?; 6029 let expr38_0 = OperandSize::Size64; 6030 let expr39_0: u32 = 64; 6031 let expr40_0 = RegMemImm::Imm { simm32: expr39_0 }; 6032 let expr41_0 = C::gpr_mem_imm_new(ctx, &expr40_0); 6033 let expr42_0 = constructor_test(ctx, &expr38_0, &expr41_0, pattern1_0)?; 6034 let expr43_0: Type = I64; 6035 let expr44_0 = CC::Z; 6036 let expr45_0 = C::gpr_to_gpr_mem(ctx, expr37_0); 6037 let expr46_0 = constructor_cmove(ctx, expr43_0, &expr44_0, &expr45_0, expr9_0)?; 6038 let expr47_0: Type = I64; 6039 let expr48_0 = CC::Z; 6040 let expr49_0 = C::gpr_to_gpr_mem(ctx, expr9_0); 6041 let expr50_0: Type = I64; 6042 let expr51_0: u64 = 0; 6043 let expr52_0 = constructor_imm(ctx, expr50_0, expr51_0)?; 6044 let expr53_0 = C::gpr_new(ctx, expr52_0); 6045 let expr54_0 = constructor_cmove(ctx, expr47_0, &expr48_0, &expr49_0, expr53_0)?; 6046 let expr55_0 = constructor_with_flags_2(ctx, &expr42_0, &expr46_0, &expr54_0)?; 6047 return Some(expr55_0); 6048 } 6049 6050 // Generated as internal constructor for term ushr_i8x16_mask. 6051 pub fn constructor_ushr_i8x16_mask<C: Context>( 6052 ctx: &mut C, 6053 arg0: &RegMemImm, 6054 ) -> Option<SyntheticAmode> { 6055 let pattern0_0 = arg0; 6056 match pattern0_0 { 6057 &RegMemImm::Imm { simm32: pattern1_0 } => { 6058 // Rule at src/isa/x64/lower.isle line 727. 6059 let expr0_0 = C::ushr_i8x16_mask_for_const(ctx, pattern1_0); 6060 return Some(expr0_0); 6061 } 6062 &RegMemImm::Reg { reg: pattern1_0 } => { 6063 // Rule at src/isa/x64/lower.isle line 736. 6064 let expr0_0 = C::ushr_i8x16_mask_table(ctx); 6065 let expr1_0 = constructor_lea(ctx, &expr0_0)?; 6066 let expr2_0: Type = I64; 6067 let expr3_0 = C::gpr_new(ctx, pattern1_0); 6068 let expr4_0: u8 = 4; 6069 let expr5_0 = C::imm8_to_imm8_gpr(ctx, expr4_0); 6070 let expr6_0 = constructor_shl(ctx, expr2_0, expr3_0, &expr5_0)?; 6071 let expr7_0: u32 = 0; 6072 let expr8_0: u8 = 0; 6073 let expr9_0 = C::amode_imm_reg_reg_shift(ctx, expr7_0, expr1_0, expr6_0, expr8_0); 6074 let expr10_0 = C::amode_to_synthetic_amode(ctx, &expr9_0); 6075 return Some(expr10_0); 6076 } 6077 &RegMemImm::Mem { 6078 addr: ref pattern1_0, 6079 } => { 6080 // Rule at src/isa/x64/lower.isle line 746. 6081 let expr0_0: Type = I64; 6082 let expr1_0 = ExtKind::None; 6083 let expr2_0 = constructor_x64_load(ctx, expr0_0, &pattern1_0, &expr1_0)?; 6084 let expr3_0 = RegMemImm::Reg { reg: expr2_0 }; 6085 let expr4_0 = constructor_ushr_i8x16_mask(ctx, &expr3_0)?; 6086 return Some(expr4_0); 6087 } 6088 _ => {} 6089 } 6090 return None; 6091 } 6092 6093 // Generated as internal constructor for term sar_i128. 6094 pub fn constructor_sar_i128<C: Context>( 6095 ctx: &mut C, 6096 arg0: ValueRegs, 6097 arg1: Gpr, 6098 ) -> Option<ValueRegs> { 6099 let pattern0_0 = arg0; 6100 let pattern1_0 = arg1; 6101 // Rule at src/isa/x64/lower.isle line 774. 6102 let expr0_0: usize = 0; 6103 let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?; 6104 let expr2_0: usize = 1; 6105 let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?; 6106 let expr4_0: Type = I64; 6107 let expr5_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0); 6108 let expr6_0 = constructor_shr(ctx, expr4_0, expr1_0, &expr5_0)?; 6109 let expr7_0: Type = I64; 6110 let expr8_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0); 6111 let expr9_0 = constructor_sar(ctx, expr7_0, expr3_0, &expr8_0)?; 6112 let expr10_0: Type = I64; 6113 let expr11_0: Type = I64; 6114 let expr12_0: Type = I64; 6115 let expr13_0: u64 = 64; 6116 let expr14_0 = constructor_imm(ctx, expr12_0, expr13_0)?; 6117 let expr15_0 = C::gpr_new(ctx, expr14_0); 6118 let expr16_0 = C::gpr_to_gpr_mem_imm(ctx, pattern1_0); 6119 let expr17_0 = constructor_sub(ctx, expr11_0, expr15_0, &expr16_0)?; 6120 let expr18_0 = C::gpr_to_imm8_gpr(ctx, expr17_0); 6121 let expr19_0 = constructor_shl(ctx, expr10_0, expr3_0, &expr18_0)?; 6122 let expr20_0 = OperandSize::Size64; 6123 let expr21_0: u32 = 127; 6124 let expr22_0 = RegMemImm::Imm { simm32: expr21_0 }; 6125 let expr23_0 = C::gpr_mem_imm_new(ctx, &expr22_0); 6126 let expr24_0 = constructor_test(ctx, &expr20_0, &expr23_0, pattern1_0)?; 6127 let expr25_0: Type = I64; 6128 let expr26_0 = CC::Z; 6129 let expr27_0: Type = I64; 6130 let expr28_0: u64 = 0; 6131 let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0)?; 6132 let expr30_0 = C::gpr_new(ctx, expr29_0); 6133 let expr31_0 = C::gpr_to_gpr_mem(ctx, expr30_0); 6134 let expr32_0 = constructor_cmove(ctx, expr25_0, &expr26_0, &expr31_0, expr19_0)?; 6135 let expr33_0 = constructor_with_flags_1(ctx, &expr24_0, &expr32_0)?; 6136 let expr34_0 = C::gpr_new(ctx, expr33_0); 6137 let expr35_0: Type = I64; 6138 let expr36_0 = C::gpr_to_gpr_mem_imm(ctx, expr34_0); 6139 let expr37_0 = constructor_or(ctx, expr35_0, expr6_0, &expr36_0)?; 6140 let expr38_0: Type = I64; 6141 let expr39_0: u8 = 63; 6142 let expr40_0 = C::imm8_to_imm8_gpr(ctx, expr39_0); 6143 let expr41_0 = constructor_sar(ctx, expr38_0, expr3_0, &expr40_0)?; 6144 let expr42_0 = OperandSize::Size64; 6145 let expr43_0: u32 = 64; 6146 let expr44_0 = RegMemImm::Imm { simm32: expr43_0 }; 6147 let expr45_0 = C::gpr_mem_imm_new(ctx, &expr44_0); 6148 let expr46_0 = constructor_test(ctx, &expr42_0, &expr45_0, pattern1_0)?; 6149 let expr47_0: Type = I64; 6150 let expr48_0 = CC::Z; 6151 let expr49_0 = C::gpr_to_gpr_mem(ctx, expr37_0); 6152 let expr50_0 = constructor_cmove(ctx, expr47_0, &expr48_0, &expr49_0, expr9_0)?; 6153 let expr51_0: Type = I64; 6154 let expr52_0 = CC::Z; 6155 let expr53_0 = C::gpr_to_gpr_mem(ctx, expr9_0); 6156 let expr54_0 = constructor_cmove(ctx, expr51_0, &expr52_0, &expr53_0, expr41_0)?; 6157 let expr55_0 = constructor_with_flags_2(ctx, &expr46_0, &expr50_0, &expr54_0)?; 6158 return Some(expr55_0); 6159 } 6160 6161 // Generated as internal constructor for term sshr_i8x16_bigger_shift. 6162 pub fn constructor_sshr_i8x16_bigger_shift<C: Context>( 6163 ctx: &mut C, 6164 arg0: Type, 6165 arg1: &RegMemImm, 6166 ) -> Option<XmmMemImm> { 6167 let pattern0_0 = arg0; 6168 let pattern1_0 = arg1; 6169 match pattern1_0 { 6170 &RegMemImm::Imm { simm32: pattern2_0 } => { 6171 // Rule at src/isa/x64/lower.isle line 844. 6172 let expr0_0: u32 = 8; 6173 let expr1_0 = C::u32_add(ctx, pattern2_0, expr0_0); 6174 let expr2_0 = RegMemImm::Imm { simm32: expr1_0 }; 6175 let expr3_0 = C::xmm_mem_imm_new(ctx, &expr2_0); 6176 return Some(expr3_0); 6177 } 6178 &RegMemImm::Reg { reg: pattern2_0 } => { 6179 // Rule at src/isa/x64/lower.isle line 846. 6180 let expr0_0 = C::gpr_new(ctx, pattern2_0); 6181 let expr1_0: u32 = 8; 6182 let expr2_0 = RegMemImm::Imm { simm32: expr1_0 }; 6183 let expr3_0 = C::gpr_mem_imm_new(ctx, &expr2_0); 6184 let expr4_0 = constructor_add(ctx, pattern0_0, expr0_0, &expr3_0)?; 6185 let expr5_0 = C::gpr_to_reg(ctx, expr4_0); 6186 let expr6_0 = RegMemImm::Reg { reg: expr5_0 }; 6187 let expr7_0 = constructor_mov_rmi_to_xmm(ctx, &expr6_0)?; 6188 return Some(expr7_0); 6189 } 6190 &RegMemImm::Mem { 6191 addr: ref pattern2_0, 6192 } => { 6193 // Rule at src/isa/x64/lower.isle line 850. 6194 let expr0_0: u64 = 8; 6195 let expr1_0 = constructor_imm(ctx, pattern0_0, expr0_0)?; 6196 let expr2_0 = C::gpr_new(ctx, expr1_0); 6197 let expr3_0 = C::gpr_mem_imm_new(ctx, pattern1_0); 6198 let expr4_0 = constructor_add(ctx, pattern0_0, expr2_0, &expr3_0)?; 6199 let expr5_0 = C::gpr_to_reg(ctx, expr4_0); 6200 let expr6_0 = RegMemImm::Reg { reg: expr5_0 }; 6201 let expr7_0 = constructor_mov_rmi_to_xmm(ctx, &expr6_0)?; 6202 return Some(expr7_0); 6203 } 6204 _ => {} 6205 } 6206 return None; 6207 } 6208 6209 // Generated as internal constructor for term sse_and_not. 6210 pub fn constructor_sse_and_not<C: Context>( 6211 ctx: &mut C, 6212 arg0: Type, 6213 arg1: Xmm, 6214 arg2: &XmmMem, 6215 ) -> Option<Xmm> { 6216 let pattern0_0 = arg0; 6217 if pattern0_0 == F32X4 { 6218 let pattern2_0 = arg1; 6219 let pattern3_0 = arg2; 6220 // Rule at src/isa/x64/lower.isle line 1289. 6221 let expr0_0 = constructor_andnps(ctx, pattern2_0, pattern3_0)?; 6222 return Some(expr0_0); 6223 } 6224 if pattern0_0 == F64X2 { 6225 let pattern2_0 = arg1; 6226 let pattern3_0 = arg2; 6227 // Rule at src/isa/x64/lower.isle line 1290. 6228 let expr0_0 = constructor_andnpd(ctx, pattern2_0, pattern3_0)?; 6229 return Some(expr0_0); 6230 } 6231 if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { 6232 let pattern2_0 = arg1; 6233 let pattern3_0 = arg2; 6234 // Rule at src/isa/x64/lower.isle line 1291. 6235 let expr0_0 = constructor_pandn(ctx, pattern2_0, pattern3_0)?; 6236 return Some(expr0_0); 6237 } 6238 return None; 6239 } 6240 6241 // Generated as internal constructor for term i128_not. 6242 pub fn constructor_i128_not<C: Context>(ctx: &mut C, arg0: Value) -> Option<ValueRegs> { 6243 let pattern0_0 = arg0; 6244 // Rule at src/isa/x64/lower.isle line 1356. 6245 let expr0_0 = C::put_in_regs(ctx, pattern0_0); 6246 let expr1_0: usize = 0; 6247 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 6248 let expr3_0: usize = 1; 6249 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?; 6250 let expr5_0: Type = I64; 6251 let expr6_0 = constructor_not(ctx, expr5_0, expr2_0)?; 6252 let expr7_0: Type = I64; 6253 let expr8_0 = constructor_not(ctx, expr7_0, expr4_0)?; 6254 let expr9_0 = constructor_value_gprs(ctx, expr6_0, expr8_0)?; 6255 return Some(expr9_0); 6256 } 6257 6258 // Generated as internal constructor for term vec_insert_lane. 6259 pub fn constructor_vec_insert_lane<C: Context>( 6260 ctx: &mut C, 6261 arg0: Type, 6262 arg1: Xmm, 6263 arg2: &RegMem, 6264 arg3: u8, 6265 ) -> Option<Xmm> { 6266 let pattern0_0 = arg0; 6267 if pattern0_0 == I8X16 { 6268 let pattern2_0 = arg1; 6269 let pattern3_0 = arg2; 6270 let pattern4_0 = arg3; 6271 // Rule at src/isa/x64/lower.isle line 1410. 6272 let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0); 6273 let expr1_0 = constructor_pinsrb(ctx, pattern2_0, &expr0_0, pattern4_0)?; 6274 return Some(expr1_0); 6275 } 6276 if pattern0_0 == I16X8 { 6277 let pattern2_0 = arg1; 6278 let pattern3_0 = arg2; 6279 let pattern4_0 = arg3; 6280 // Rule at src/isa/x64/lower.isle line 1414. 6281 let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0); 6282 let expr1_0 = constructor_pinsrw(ctx, pattern2_0, &expr0_0, pattern4_0)?; 6283 return Some(expr1_0); 6284 } 6285 if pattern0_0 == I32X4 { 6286 let pattern2_0 = arg1; 6287 let pattern3_0 = arg2; 6288 let pattern4_0 = arg3; 6289 // Rule at src/isa/x64/lower.isle line 1418. 6290 let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0); 6291 let expr1_0 = OperandSize::Size32; 6292 let expr2_0 = constructor_pinsrd(ctx, pattern2_0, &expr0_0, pattern4_0, &expr1_0)?; 6293 return Some(expr2_0); 6294 } 6295 if pattern0_0 == I64X2 { 6296 let pattern2_0 = arg1; 6297 let pattern3_0 = arg2; 6298 let pattern4_0 = arg3; 6299 // Rule at src/isa/x64/lower.isle line 1422. 6300 let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0); 6301 let expr1_0 = OperandSize::Size64; 6302 let expr2_0 = constructor_pinsrd(ctx, pattern2_0, &expr0_0, pattern4_0, &expr1_0)?; 6303 return Some(expr2_0); 6304 } 6305 if pattern0_0 == F32X4 { 6306 let pattern2_0 = arg1; 6307 let pattern3_0 = arg2; 6308 let pattern4_0 = arg3; 6309 // Rule at src/isa/x64/lower.isle line 1426. 6310 let expr0_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0); 6311 let expr1_0 = C::sse_insertps_lane_imm(ctx, pattern4_0); 6312 let expr2_0 = constructor_insertps(ctx, pattern2_0, &expr0_0, expr1_0)?; 6313 return Some(expr2_0); 6314 } 6315 if pattern0_0 == F64X2 { 6316 let pattern2_0 = arg1; 6317 let pattern3_0 = arg2; 6318 if let &RegMem::Reg { reg: pattern4_0 } = pattern3_0 { 6319 let pattern5_0 = arg3; 6320 if pattern5_0 == 0 { 6321 // Rule at src/isa/x64/lower.isle line 1448. 6322 let expr0_0 = RegMem::Reg { reg: pattern4_0 }; 6323 let expr1_0 = C::reg_mem_to_xmm_mem(ctx, &expr0_0); 6324 let expr2_0 = constructor_movsd(ctx, pattern2_0, &expr1_0)?; 6325 return Some(expr2_0); 6326 } 6327 } 6328 let pattern4_0 = arg3; 6329 if pattern4_0 == 0 { 6330 // Rule at src/isa/x64/lower.isle line 1450. 6331 let expr0_0 = SseOpcode::Movsd; 6332 let expr1_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0); 6333 let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?; 6334 let expr3_0 = C::xmm_to_xmm_mem(ctx, expr2_0); 6335 let expr4_0 = constructor_movsd(ctx, pattern2_0, &expr3_0)?; 6336 return Some(expr4_0); 6337 } 6338 if pattern4_0 == 1 { 6339 // Rule at src/isa/x64/lower.isle line 1459. 6340 let expr0_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0); 6341 let expr1_0 = constructor_movlhps(ctx, pattern2_0, &expr0_0)?; 6342 return Some(expr1_0); 6343 } 6344 } 6345 return None; 6346 } 6347 6348 // Generated as internal constructor for term cmp_and_choose. 6349 pub fn constructor_cmp_and_choose<C: Context>( 6350 ctx: &mut C, 6351 arg0: Type, 6352 arg1: &CC, 6353 arg2: Value, 6354 arg3: Value, 6355 ) -> Option<ValueRegs> { 6356 let pattern0_0 = arg0; 6357 if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { 6358 let pattern2_0 = arg1; 6359 let pattern3_0 = arg2; 6360 let pattern4_0 = arg3; 6361 // Rule at src/isa/x64/lower.isle line 1467. 6362 let expr0_0 = constructor_put_in_gpr(ctx, pattern3_0)?; 6363 let expr1_0 = constructor_put_in_gpr(ctx, pattern4_0)?; 6364 let expr2_0 = C::raw_operand_size_of_type(ctx, pattern1_0); 6365 let expr3_0 = C::gpr_to_gpr_mem_imm(ctx, expr0_0); 6366 let expr4_0 = constructor_cmp(ctx, &expr2_0, &expr3_0, expr1_0)?; 6367 let expr5_0 = C::gpr_to_gpr_mem(ctx, expr1_0); 6368 let expr6_0 = constructor_cmove(ctx, pattern1_0, pattern2_0, &expr5_0, expr0_0)?; 6369 let expr7_0 = constructor_with_flags_1(ctx, &expr4_0, &expr6_0)?; 6370 let expr8_0 = C::value_reg(ctx, expr7_0); 6371 return Some(expr8_0); 6372 } 6373 return None; 6374 } 6375