1 // GENERATED BY ISLE. DO NOT EDIT! 2 // 3 // Generated automatically from the instruction-selection DSL code in: 4 // - src/clif.isle 5 // - src/prelude.isle 6 // - src/isa/x64/inst.isle 7 // - src/isa/x64/lower.isle 8 9 #![allow(dead_code, unreachable_code, unreachable_patterns)] 10 #![allow(unused_imports, unused_variables, non_snake_case, unused_mut)] 11 #![allow(irrefutable_let_patterns)] 12 13 use super::*; // Pulls in all external types. 14 15 /// Context during lowering: an implementation of this trait 16 /// must be provided with all external constructors and extractors. 17 /// A mutable borrow is passed along through all lowering logic. 18 pub trait Context { 19 fn unpack_value_array_2(&mut self, arg0: &ValueArray2) -> (Value, Value); 20 fn pack_value_array_2(&mut self, arg0: Value, arg1: Value) -> ValueArray2; 21 fn unpack_value_array_3(&mut self, arg0: &ValueArray3) -> (Value, Value, Value); 22 fn pack_value_array_3(&mut self, arg0: Value, arg1: Value, arg2: Value) -> ValueArray3; 23 fn u32_add(&mut self, arg0: u32, arg1: u32) -> u32; 24 fn s32_add_fallible(&mut self, arg0: u32, arg1: u32) -> Option<u32>; 25 fn u32_nonnegative(&mut self, arg0: u32) -> Option<u32>; 26 fn offset32(&mut self, arg0: Offset32) -> Option<u32>; 27 fn u32_lteq(&mut self, arg0: u32, arg1: u32) -> Option<Unit>; 28 fn simm32(&mut self, arg0: Imm64) -> Option<u32>; 29 fn uimm8(&mut self, arg0: Imm64) -> Option<u8>; 30 fn u8_and(&mut self, arg0: u8, arg1: u8) -> u8; 31 fn value_reg(&mut self, arg0: Reg) -> ValueRegs; 32 fn value_regs(&mut self, arg0: Reg, arg1: Reg) -> ValueRegs; 33 fn value_regs_invalid(&mut self) -> ValueRegs; 34 fn output_none(&mut self) -> InstOutput; 35 fn output(&mut self, arg0: ValueRegs) -> InstOutput; 36 fn output_pair(&mut self, arg0: ValueRegs, arg1: ValueRegs) -> InstOutput; 37 fn output_builder_new(&mut self) -> InstOutputBuilder; 38 fn output_builder_push(&mut self, arg0: &InstOutputBuilder, arg1: ValueRegs) -> Unit; 39 fn output_builder_finish(&mut self, arg0: &InstOutputBuilder) -> InstOutput; 40 fn temp_writable_reg(&mut self, arg0: Type) -> WritableReg; 41 fn invalid_reg_etor(&mut self, arg0: Reg) -> Option<()>; 42 fn invalid_reg(&mut self) -> Reg; 43 fn valid_reg(&mut self, arg0: Reg) -> Option<()>; 44 fn put_in_reg(&mut self, arg0: Value) -> Reg; 45 fn put_in_regs(&mut self, arg0: Value) -> ValueRegs; 46 fn ensure_in_vreg(&mut self, arg0: Reg, arg1: Type) -> Reg; 47 fn value_regs_get(&mut self, arg0: ValueRegs, arg1: usize) -> Reg; 48 fn u8_as_u32(&mut self, arg0: u8) -> Option<u32>; 49 fn u8_as_u64(&mut self, arg0: u8) -> Option<u64>; 50 fn u16_as_u64(&mut self, arg0: u16) -> Option<u64>; 51 fn u32_as_u64(&mut self, arg0: u32) -> Option<u64>; 52 fn i64_as_u64(&mut self, arg0: i64) -> Option<u64>; 53 fn u64_add(&mut self, arg0: u64, arg1: u64) -> Option<u64>; 54 fn u64_sub(&mut self, arg0: u64, arg1: u64) -> Option<u64>; 55 fn u64_and(&mut self, arg0: u64, arg1: u64) -> Option<u64>; 56 fn ty_bits(&mut self, arg0: Type) -> Option<u8>; 57 fn ty_bits_u16(&mut self, arg0: Type) -> u16; 58 fn ty_bits_u64(&mut self, arg0: Type) -> u64; 59 fn ty_mask(&mut self, arg0: Type) -> u64; 60 fn ty_bytes(&mut self, arg0: Type) -> u16; 61 fn lane_type(&mut self, arg0: Type) -> Type; 62 fn fits_in_16(&mut self, arg0: Type) -> Option<Type>; 63 fn fits_in_32(&mut self, arg0: Type) -> Option<Type>; 64 fn fits_in_64(&mut self, arg0: Type) -> Option<Type>; 65 fn ty_32_or_64(&mut self, arg0: Type) -> Option<Type>; 66 fn ty_8_or_16(&mut self, arg0: Type) -> Option<Type>; 67 fn ty_int_bool_64(&mut self, arg0: Type) -> Option<Type>; 68 fn ty_int_bool_ref_64(&mut self, arg0: Type) -> Option<Type>; 69 fn ty_int_bool_128(&mut self, arg0: Type) -> Option<Type>; 70 fn ty_scalar_float(&mut self, arg0: Type) -> Option<Type>; 71 fn ty_vec128(&mut self, arg0: Type) -> Option<Type>; 72 fn ty_vec128_int(&mut self, arg0: Type) -> Option<Type>; 73 fn not_i64x2(&mut self, arg0: Type) -> Option<()>; 74 fn value_list_slice(&mut self, arg0: ValueList) -> ValueSlice; 75 fn value_slice_empty(&mut self, arg0: ValueSlice) -> Option<()>; 76 fn value_slice_unwrap(&mut self, arg0: ValueSlice) -> Option<(Value, ValueSlice)>; 77 fn value_slice_len(&mut self, arg0: ValueSlice) -> usize; 78 fn value_slice_get(&mut self, arg0: ValueSlice, arg1: usize) -> Value; 79 fn writable_reg_to_reg(&mut self, arg0: WritableReg) -> Reg; 80 fn u8_from_uimm8(&mut self, arg0: Uimm8) -> u8; 81 fn u64_from_imm64(&mut self, arg0: Imm64) -> u64; 82 fn nonzero_u64_from_imm64(&mut self, arg0: Imm64) -> Option<u64>; 83 fn u64_from_ieee32(&mut self, arg0: Ieee32) -> u64; 84 fn u64_from_ieee64(&mut self, arg0: Ieee64) -> u64; 85 fn inst_results(&mut self, arg0: Inst) -> ValueSlice; 86 fn first_result(&mut self, arg0: Inst) -> Option<Value>; 87 fn inst_data(&mut self, arg0: Inst) -> InstructionData; 88 fn value_type(&mut self, arg0: Value) -> Type; 89 fn multi_lane(&mut self, arg0: Type) -> Option<(u8, u16)>; 90 fn def_inst(&mut self, arg0: Value) -> Option<Inst>; 91 fn offset32_to_u32(&mut self, arg0: Offset32) -> u32; 92 fn emit(&mut self, arg0: &MInst) -> Unit; 93 fn emit_u64_le_const(&mut self, arg0: u64) -> VCodeConstant; 94 fn trap_code_division_by_zero(&mut self) -> TrapCode; 95 fn trap_code_integer_overflow(&mut self) -> TrapCode; 96 fn trap_code_bad_conversion_to_integer(&mut self) -> TrapCode; 97 fn avoid_div_traps(&mut self, arg0: Type) -> Option<()>; 98 fn func_ref_data(&mut self, arg0: FuncRef) -> (SigRef, ExternalName, RelocDistance); 99 fn symbol_value_data( 100 &mut self, 101 arg0: GlobalValue, 102 ) -> Option<(ExternalName, RelocDistance, i64)>; 103 fn reloc_distance_near(&mut self, arg0: RelocDistance) -> Option<()>; 104 fn operand_size_of_type_32_64(&mut self, arg0: Type) -> OperandSize; 105 fn raw_operand_size_of_type(&mut self, arg0: Type) -> OperandSize; 106 fn put_in_reg_mem_imm(&mut self, arg0: Value) -> RegMemImm; 107 fn put_in_reg_mem(&mut self, arg0: Value) -> RegMem; 108 fn synthetic_amode_to_reg_mem(&mut self, arg0: &SyntheticAmode) -> RegMem; 109 fn amode_to_synthetic_amode(&mut self, arg0: &Amode) -> SyntheticAmode; 110 fn amode_with_flags(&mut self, arg0: &Amode, arg1: MemFlags) -> Amode; 111 fn amode_imm_reg(&mut self, arg0: u32, arg1: Gpr) -> Amode; 112 fn amode_imm_reg_reg_shift(&mut self, arg0: u32, arg1: Gpr, arg2: Gpr, arg3: u8) -> Amode; 113 fn sum_extend_fits_in_32_bits( 114 &mut self, 115 arg0: Type, 116 arg1: Imm64, 117 arg2: Offset32, 118 ) -> Option<u32>; 119 fn amode_offset(&mut self, arg0: &Amode, arg1: u32) -> Amode; 120 fn put_masked_in_imm8_gpr(&mut self, arg0: Value, arg1: Type) -> Imm8Gpr; 121 fn intcc_to_cc(&mut self, arg0: &IntCC) -> CC; 122 fn encode_fcmp_imm(&mut self, arg0: &FcmpImm) -> u8; 123 fn imm8_reg_to_imm8_gpr(&mut self, arg0: &Imm8Reg) -> Imm8Gpr; 124 fn writable_gpr_to_reg(&mut self, arg0: WritableGpr) -> WritableReg; 125 fn writable_xmm_to_reg(&mut self, arg0: WritableXmm) -> WritableReg; 126 fn writable_reg_to_xmm(&mut self, arg0: WritableReg) -> WritableXmm; 127 fn writable_xmm_to_xmm(&mut self, arg0: WritableXmm) -> Xmm; 128 fn writable_gpr_to_gpr(&mut self, arg0: WritableGpr) -> Gpr; 129 fn gpr_to_reg(&mut self, arg0: Gpr) -> Reg; 130 fn gpr_to_gpr_mem(&mut self, arg0: Gpr) -> GprMem; 131 fn gpr_to_gpr_mem_imm(&mut self, arg0: Gpr) -> GprMemImm; 132 fn xmm_to_reg(&mut self, arg0: Xmm) -> Reg; 133 fn xmm_to_xmm_mem_imm(&mut self, arg0: Xmm) -> XmmMemImm; 134 fn temp_writable_gpr(&mut self) -> WritableGpr; 135 fn temp_writable_xmm(&mut self) -> WritableXmm; 136 fn reg_mem_to_xmm_mem(&mut self, arg0: &RegMem) -> XmmMem; 137 fn gpr_mem_imm_new(&mut self, arg0: &RegMemImm) -> GprMemImm; 138 fn xmm_mem_imm_new(&mut self, arg0: &RegMemImm) -> XmmMemImm; 139 fn xmm_to_xmm_mem(&mut self, arg0: Xmm) -> XmmMem; 140 fn xmm_mem_to_reg_mem(&mut self, arg0: &XmmMem) -> RegMem; 141 fn gpr_mem_to_reg_mem(&mut self, arg0: &GprMem) -> RegMem; 142 fn xmm_new(&mut self, arg0: Reg) -> Xmm; 143 fn gpr_new(&mut self, arg0: Reg) -> Gpr; 144 fn reg_mem_to_gpr_mem(&mut self, arg0: &RegMem) -> GprMem; 145 fn reg_to_gpr_mem(&mut self, arg0: Reg) -> GprMem; 146 fn gpr_to_imm8_gpr(&mut self, arg0: Gpr) -> Imm8Gpr; 147 fn imm8_to_imm8_gpr(&mut self, arg0: u8) -> Imm8Gpr; 148 fn xmm0(&mut self) -> WritableXmm; 149 fn is_xmm_type(&mut self, arg0: Type) -> Option<Type>; 150 fn is_gpr_type(&mut self, arg0: Type) -> Option<Type>; 151 fn is_single_register_type(&mut self, arg0: Type) -> Option<Type>; 152 fn avx512vl_enabled(&mut self, arg0: Type) -> Option<()>; 153 fn avx512dq_enabled(&mut self, arg0: Type) -> Option<()>; 154 fn avx512f_enabled(&mut self, arg0: Type) -> Option<()>; 155 fn avx512bitalg_enabled(&mut self, arg0: Type) -> Option<()>; 156 fn use_lzcnt(&mut self, arg0: Type) -> Option<()>; 157 fn use_bmi1(&mut self, arg0: Type) -> Option<()>; 158 fn use_popcnt(&mut self, arg0: Type) -> Option<()>; 159 fn imm8_from_value(&mut self, arg0: Value) -> Option<Imm8Reg>; 160 fn const_to_type_masked_imm8(&mut self, arg0: u64, arg1: Type) -> Imm8Gpr; 161 fn simm32_from_value(&mut self, arg0: Value) -> Option<GprMemImm>; 162 fn simm32_from_imm64(&mut self, arg0: Imm64) -> Option<GprMemImm>; 163 fn sinkable_load(&mut self, arg0: Value) -> Option<SinkableLoad>; 164 fn sink_load(&mut self, arg0: &SinkableLoad) -> RegMemImm; 165 fn ext_mode(&mut self, arg0: u16, arg1: u16) -> ExtMode; 166 fn nonzero_u64_fits_in_u32(&mut self, arg0: u64) -> Option<u64>; 167 fn ishl_i8x16_mask_for_const(&mut self, arg0: u32) -> SyntheticAmode; 168 fn ishl_i8x16_mask_table(&mut self) -> SyntheticAmode; 169 fn ushr_i8x16_mask_for_const(&mut self, arg0: u32) -> SyntheticAmode; 170 fn ushr_i8x16_mask_table(&mut self) -> SyntheticAmode; 171 fn sse_insertps_lane_imm(&mut self, arg0: u8) -> u8; 172 fn popcount_4bit_table(&mut self) -> VCodeConstant; 173 fn popcount_low_mask(&mut self) -> VCodeConstant; 174 } 175 176 /// Internal type SideEffectNoResult: defined at src/prelude.isle line 457. 177 #[derive(Clone, Debug)] 178 pub enum SideEffectNoResult { 179 Inst { inst: MInst }, 180 Inst2 { inst1: MInst, inst2: MInst }, 181 } 182 183 /// Internal type ProducesFlags: defined at src/prelude.isle line 484. 184 #[derive(Clone, Debug)] 185 pub enum ProducesFlags { 186 ProducesFlagsSideEffect { inst: MInst }, 187 ProducesFlagsReturnsReg { inst: MInst, result: Reg }, 188 ProducesFlagsReturnsResultWithConsumer { inst: MInst, result: Reg }, 189 } 190 191 /// Internal type ConsumesFlags: defined at src/prelude.isle line 495. 192 #[derive(Clone, Debug)] 193 pub enum ConsumesFlags { 194 ConsumesFlagsReturnsResultWithProducer { 195 inst: MInst, 196 result: Reg, 197 }, 198 ConsumesFlagsReturnsReg { 199 inst: MInst, 200 result: Reg, 201 }, 202 ConsumesFlagsTwiceReturnsValueRegs { 203 inst1: MInst, 204 inst2: MInst, 205 result: ValueRegs, 206 }, 207 ConsumesFlagsFourTimesReturnsValueRegs { 208 inst1: MInst, 209 inst2: MInst, 210 inst3: MInst, 211 inst4: MInst, 212 result: ValueRegs, 213 }, 214 } 215 216 /// Internal type MInst: defined at src/isa/x64/inst.isle line 8. 217 #[derive(Clone)] 218 pub enum MInst { 219 Nop { 220 len: u8, 221 }, 222 AluRmiR { 223 size: OperandSize, 224 op: AluRmiROpcode, 225 src1: Gpr, 226 src2: GprMemImm, 227 dst: WritableGpr, 228 }, 229 AluRM { 230 size: OperandSize, 231 op: AluRmiROpcode, 232 src1_dst: SyntheticAmode, 233 src2: Gpr, 234 }, 235 UnaryRmR { 236 size: OperandSize, 237 op: UnaryRmROpcode, 238 src: GprMem, 239 dst: WritableGpr, 240 }, 241 Not { 242 size: OperandSize, 243 src: Gpr, 244 dst: WritableGpr, 245 }, 246 Neg { 247 size: OperandSize, 248 src: Gpr, 249 dst: WritableGpr, 250 }, 251 Div { 252 size: OperandSize, 253 signed: bool, 254 divisor: GprMem, 255 dividend_lo: Gpr, 256 dividend_hi: Gpr, 257 dst_quotient: WritableGpr, 258 dst_remainder: WritableGpr, 259 }, 260 MulHi { 261 size: OperandSize, 262 signed: bool, 263 src1: Gpr, 264 src2: GprMem, 265 dst_lo: WritableGpr, 266 dst_hi: WritableGpr, 267 }, 268 CheckedDivOrRemSeq { 269 kind: DivOrRemKind, 270 size: OperandSize, 271 dividend_lo: Gpr, 272 dividend_hi: Gpr, 273 divisor: WritableGpr, 274 dst_quotient: WritableGpr, 275 dst_remainder: WritableGpr, 276 tmp: OptionWritableGpr, 277 }, 278 SignExtendData { 279 size: OperandSize, 280 src: Gpr, 281 dst: WritableGpr, 282 }, 283 Imm { 284 dst_size: OperandSize, 285 simm64: u64, 286 dst: WritableGpr, 287 }, 288 MovRR { 289 size: OperandSize, 290 src: Gpr, 291 dst: WritableGpr, 292 }, 293 MovzxRmR { 294 ext_mode: ExtMode, 295 src: GprMem, 296 dst: WritableGpr, 297 }, 298 Mov64MR { 299 src: SyntheticAmode, 300 dst: WritableGpr, 301 }, 302 LoadEffectiveAddress { 303 addr: SyntheticAmode, 304 dst: WritableGpr, 305 }, 306 MovsxRmR { 307 ext_mode: ExtMode, 308 src: GprMem, 309 dst: WritableGpr, 310 }, 311 MovRM { 312 size: OperandSize, 313 src: Gpr, 314 dst: SyntheticAmode, 315 }, 316 ShiftR { 317 size: OperandSize, 318 kind: ShiftKind, 319 src: Gpr, 320 num_bits: Imm8Gpr, 321 dst: WritableGpr, 322 }, 323 XmmRmiReg { 324 opcode: SseOpcode, 325 src1: Xmm, 326 src2: XmmMemImm, 327 dst: WritableXmm, 328 }, 329 CmpRmiR { 330 size: OperandSize, 331 opcode: CmpOpcode, 332 src: GprMemImm, 333 dst: Gpr, 334 }, 335 Setcc { 336 cc: CC, 337 dst: WritableGpr, 338 }, 339 Cmove { 340 size: OperandSize, 341 cc: CC, 342 consequent: GprMem, 343 alternative: Gpr, 344 dst: WritableGpr, 345 }, 346 XmmCmove { 347 size: OperandSize, 348 cc: CC, 349 consequent: XmmMem, 350 alternative: Xmm, 351 dst: WritableXmm, 352 }, 353 Push64 { 354 src: GprMemImm, 355 }, 356 Pop64 { 357 dst: WritableGpr, 358 }, 359 XmmRmR { 360 op: SseOpcode, 361 src1: Xmm, 362 src2: XmmMem, 363 dst: WritableXmm, 364 }, 365 XmmRmREvex { 366 op: Avx512Opcode, 367 src1: XmmMem, 368 src2: Xmm, 369 dst: WritableXmm, 370 }, 371 XmmUnaryRmR { 372 op: SseOpcode, 373 src: XmmMem, 374 dst: WritableXmm, 375 }, 376 XmmUnaryRmREvex { 377 op: Avx512Opcode, 378 src: XmmMem, 379 dst: WritableXmm, 380 }, 381 XmmMovRM { 382 op: SseOpcode, 383 src: Reg, 384 dst: SyntheticAmode, 385 }, 386 XmmLoadConst { 387 src: VCodeConstant, 388 dst: WritableReg, 389 ty: Type, 390 }, 391 XmmToGpr { 392 op: SseOpcode, 393 src: Xmm, 394 dst: WritableGpr, 395 dst_size: OperandSize, 396 }, 397 GprToXmm { 398 op: SseOpcode, 399 src: GprMem, 400 dst: WritableXmm, 401 src_size: OperandSize, 402 }, 403 CvtUint64ToFloatSeq { 404 dst_size: OperandSize, 405 src: WritableGpr, 406 dst: WritableXmm, 407 tmp_gpr1: WritableGpr, 408 tmp_gpr2: WritableGpr, 409 }, 410 CvtFloatToSintSeq { 411 dst_size: OperandSize, 412 src_size: OperandSize, 413 is_saturating: bool, 414 src: WritableXmm, 415 dst: WritableGpr, 416 tmp_gpr: WritableGpr, 417 tmp_xmm: WritableXmm, 418 }, 419 CvtFloatToUintSeq { 420 dst_size: OperandSize, 421 src_size: OperandSize, 422 is_saturating: bool, 423 src: WritableXmm, 424 dst: WritableGpr, 425 tmp_gpr: WritableGpr, 426 tmp_xmm: WritableXmm, 427 }, 428 XmmMinMaxSeq { 429 size: OperandSize, 430 is_min: bool, 431 lhs: Xmm, 432 rhs: Xmm, 433 dst: WritableXmm, 434 }, 435 XmmCmpRmR { 436 op: SseOpcode, 437 src: XmmMem, 438 dst: Xmm, 439 }, 440 XmmRmRImm { 441 op: SseOpcode, 442 src1: Reg, 443 src2: RegMem, 444 dst: WritableReg, 445 imm: u8, 446 size: OperandSize, 447 }, 448 CallKnown { 449 dest: ExternalName, 450 uses: VecReg, 451 defs: VecWritableReg, 452 opcode: Opcode, 453 }, 454 CallUnknown { 455 dest: RegMem, 456 uses: VecReg, 457 defs: VecWritableReg, 458 opcode: Opcode, 459 }, 460 Ret { 461 rets: VecReg, 462 }, 463 EpiloguePlaceholder, 464 JmpKnown { 465 dst: MachLabel, 466 }, 467 JmpIf { 468 cc: CC, 469 taken: MachLabel, 470 }, 471 JmpCond { 472 cc: CC, 473 taken: MachLabel, 474 not_taken: MachLabel, 475 }, 476 JmpTableSeq { 477 idx: Reg, 478 tmp1: WritableReg, 479 tmp2: WritableReg, 480 default_target: MachLabel, 481 targets: VecMachLabel, 482 targets_for_term: VecMachLabel, 483 }, 484 JmpUnknown { 485 target: RegMem, 486 }, 487 TrapIf { 488 cc: CC, 489 trap_code: TrapCode, 490 }, 491 Hlt, 492 Ud2 { 493 trap_code: TrapCode, 494 }, 495 LoadExtName { 496 dst: WritableReg, 497 name: BoxExternalName, 498 offset: i64, 499 }, 500 LockCmpxchg { 501 ty: Type, 502 replacement: Reg, 503 expected: Reg, 504 mem: SyntheticAmode, 505 dst_old: WritableReg, 506 }, 507 AtomicRmwSeq { 508 ty: Type, 509 op: AtomicRmwOp, 510 address: Reg, 511 operand: Reg, 512 temp: WritableReg, 513 dst_old: WritableReg, 514 }, 515 Fence { 516 kind: FenceKind, 517 }, 518 VirtualSPOffsetAdj { 519 offset: i64, 520 }, 521 XmmUninitializedValue { 522 dst: WritableXmm, 523 }, 524 ElfTlsGetAddr { 525 symbol: ExternalName, 526 }, 527 MachOTlsGetAddr { 528 symbol: ExternalName, 529 }, 530 Unwind { 531 inst: UnwindInst, 532 }, 533 DummyUse { 534 reg: Reg, 535 }, 536 } 537 538 /// Internal type Amode: defined at src/isa/x64/inst.isle line 768. 539 #[derive(Clone, Debug)] 540 pub enum Amode { 541 ImmReg { 542 simm32: u32, 543 base: Reg, 544 flags: MemFlags, 545 }, 546 ImmRegRegShift { 547 simm32: u32, 548 base: Gpr, 549 index: Gpr, 550 shift: u8, 551 flags: MemFlags, 552 }, 553 RipRelative { 554 target: MachLabel, 555 }, 556 } 557 558 /// Internal type ExtendKind: defined at src/isa/x64/inst.isle line 1352. 559 #[derive(Copy, Clone, PartialEq, Eq, Debug)] 560 pub enum ExtendKind { 561 Sign, 562 Zero, 563 } 564 565 // Generated as internal constructor for term output_reg. 566 pub fn constructor_output_reg<C: Context>(ctx: &mut C, arg0: Reg) -> Option<InstOutput> { 567 let pattern0_0 = arg0; 568 // Rule at src/prelude.isle line 113. 569 let expr0_0 = C::value_reg(ctx, pattern0_0); 570 let expr1_0 = C::output(ctx, expr0_0); 571 return Some(expr1_0); 572 } 573 574 // Generated as internal constructor for term output_value. 575 pub fn constructor_output_value<C: Context>(ctx: &mut C, arg0: Value) -> Option<InstOutput> { 576 let pattern0_0 = arg0; 577 // Rule at src/prelude.isle line 117. 578 let expr0_0 = C::put_in_regs(ctx, pattern0_0); 579 let expr1_0 = C::output(ctx, expr0_0); 580 return Some(expr1_0); 581 } 582 583 // Generated as internal constructor for term temp_reg. 584 pub fn constructor_temp_reg<C: Context>(ctx: &mut C, arg0: Type) -> Option<Reg> { 585 let pattern0_0 = arg0; 586 // Rule at src/prelude.isle line 137. 587 let expr0_0 = C::temp_writable_reg(ctx, pattern0_0); 588 let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0); 589 return Some(expr1_0); 590 } 591 592 // Generated as internal constructor for term lo_reg. 593 pub fn constructor_lo_reg<C: Context>(ctx: &mut C, arg0: Value) -> Option<Reg> { 594 let pattern0_0 = arg0; 595 // Rule at src/prelude.isle line 182. 596 let expr0_0 = C::put_in_regs(ctx, pattern0_0); 597 let expr1_0: usize = 0; 598 let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); 599 return Some(expr2_0); 600 } 601 602 // Generated as internal constructor for term side_effect. 603 pub fn constructor_side_effect<C: Context>( 604 ctx: &mut C, 605 arg0: &SideEffectNoResult, 606 ) -> Option<InstOutput> { 607 let pattern0_0 = arg0; 608 match pattern0_0 { 609 &SideEffectNoResult::Inst { 610 inst: ref pattern1_0, 611 } => { 612 // Rule at src/prelude.isle line 465. 613 let expr0_0 = C::emit(ctx, pattern1_0); 614 let expr1_0 = C::output_none(ctx); 615 return Some(expr1_0); 616 } 617 &SideEffectNoResult::Inst2 { 618 inst1: ref pattern1_0, 619 inst2: ref pattern1_1, 620 } => { 621 // Rule at src/prelude.isle line 468. 622 let expr0_0 = C::emit(ctx, pattern1_0); 623 let expr1_0 = C::emit(ctx, pattern1_1); 624 let expr2_0 = C::output_none(ctx); 625 return Some(expr2_0); 626 } 627 _ => {} 628 } 629 return None; 630 } 631 632 // Generated as internal constructor for term side_effect_concat. 633 pub fn constructor_side_effect_concat<C: Context>( 634 ctx: &mut C, 635 arg0: &SideEffectNoResult, 636 arg1: &SideEffectNoResult, 637 ) -> Option<SideEffectNoResult> { 638 let pattern0_0 = arg0; 639 if let &SideEffectNoResult::Inst { 640 inst: ref pattern1_0, 641 } = pattern0_0 642 { 643 let pattern2_0 = arg1; 644 if let &SideEffectNoResult::Inst { 645 inst: ref pattern3_0, 646 } = pattern2_0 647 { 648 // Rule at src/prelude.isle line 474. 649 let expr0_0 = SideEffectNoResult::Inst2 { 650 inst1: pattern1_0.clone(), 651 inst2: pattern3_0.clone(), 652 }; 653 return Some(expr0_0); 654 } 655 } 656 return None; 657 } 658 659 // Generated as internal constructor for term produces_flags_get_reg. 660 pub fn constructor_produces_flags_get_reg<C: Context>( 661 ctx: &mut C, 662 arg0: &ProducesFlags, 663 ) -> Option<Reg> { 664 let pattern0_0 = arg0; 665 if let &ProducesFlags::ProducesFlagsReturnsReg { 666 inst: ref pattern1_0, 667 result: pattern1_1, 668 } = pattern0_0 669 { 670 // Rule at src/prelude.isle line 511. 671 return Some(pattern1_1); 672 } 673 return None; 674 } 675 676 // Generated as internal constructor for term produces_flags_ignore. 677 pub fn constructor_produces_flags_ignore<C: Context>( 678 ctx: &mut C, 679 arg0: &ProducesFlags, 680 ) -> Option<ProducesFlags> { 681 let pattern0_0 = arg0; 682 match pattern0_0 { 683 &ProducesFlags::ProducesFlagsReturnsReg { 684 inst: ref pattern1_0, 685 result: pattern1_1, 686 } => { 687 // Rule at src/prelude.isle line 516. 688 let expr0_0 = ProducesFlags::ProducesFlagsSideEffect { 689 inst: pattern1_0.clone(), 690 }; 691 return Some(expr0_0); 692 } 693 &ProducesFlags::ProducesFlagsReturnsResultWithConsumer { 694 inst: ref pattern1_0, 695 result: pattern1_1, 696 } => { 697 // Rule at src/prelude.isle line 518. 698 let expr0_0 = ProducesFlags::ProducesFlagsSideEffect { 699 inst: pattern1_0.clone(), 700 }; 701 return Some(expr0_0); 702 } 703 _ => {} 704 } 705 return None; 706 } 707 708 // Generated as internal constructor for term consumes_flags_concat. 709 pub fn constructor_consumes_flags_concat<C: Context>( 710 ctx: &mut C, 711 arg0: &ConsumesFlags, 712 arg1: &ConsumesFlags, 713 ) -> Option<ConsumesFlags> { 714 let pattern0_0 = arg0; 715 if let &ConsumesFlags::ConsumesFlagsReturnsReg { 716 inst: ref pattern1_0, 717 result: pattern1_1, 718 } = pattern0_0 719 { 720 let pattern2_0 = arg1; 721 if let &ConsumesFlags::ConsumesFlagsReturnsReg { 722 inst: ref pattern3_0, 723 result: pattern3_1, 724 } = pattern2_0 725 { 726 // Rule at src/prelude.isle line 525. 727 let expr0_0 = C::value_regs(ctx, pattern1_1, pattern3_1); 728 let expr1_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { 729 inst1: pattern1_0.clone(), 730 inst2: pattern3_0.clone(), 731 result: expr0_0, 732 }; 733 return Some(expr1_0); 734 } 735 } 736 return None; 737 } 738 739 // Generated as internal constructor for term with_flags. 740 pub fn constructor_with_flags<C: Context>( 741 ctx: &mut C, 742 arg0: &ProducesFlags, 743 arg1: &ConsumesFlags, 744 ) -> Option<ValueRegs> { 745 let pattern0_0 = arg0; 746 match pattern0_0 { 747 &ProducesFlags::ProducesFlagsSideEffect { 748 inst: ref pattern1_0, 749 } => { 750 let pattern2_0 = arg1; 751 match pattern2_0 { 752 &ConsumesFlags::ConsumesFlagsReturnsReg { 753 inst: ref pattern3_0, 754 result: pattern3_1, 755 } => { 756 // Rule at src/prelude.isle line 550. 757 let expr0_0 = C::emit(ctx, pattern1_0); 758 let expr1_0 = C::emit(ctx, pattern3_0); 759 let expr2_0 = C::value_reg(ctx, pattern3_1); 760 return Some(expr2_0); 761 } 762 &ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { 763 inst1: ref pattern3_0, 764 inst2: ref pattern3_1, 765 result: pattern3_2, 766 } => { 767 // Rule at src/prelude.isle line 556. 768 let expr0_0 = C::emit(ctx, pattern1_0); 769 let expr1_0 = C::emit(ctx, pattern3_0); 770 let expr2_0 = C::emit(ctx, pattern3_1); 771 return Some(pattern3_2); 772 } 773 &ConsumesFlags::ConsumesFlagsFourTimesReturnsValueRegs { 774 inst1: ref pattern3_0, 775 inst2: ref pattern3_1, 776 inst3: ref pattern3_2, 777 inst4: ref pattern3_3, 778 result: pattern3_4, 779 } => { 780 // Rule at src/prelude.isle line 568. 781 let expr0_0 = C::emit(ctx, pattern1_0); 782 let expr1_0 = C::emit(ctx, pattern3_0); 783 let expr2_0 = C::emit(ctx, pattern3_1); 784 let expr3_0 = C::emit(ctx, pattern3_2); 785 let expr4_0 = C::emit(ctx, pattern3_3); 786 return Some(pattern3_4); 787 } 788 _ => {} 789 } 790 } 791 &ProducesFlags::ProducesFlagsReturnsResultWithConsumer { 792 inst: ref pattern1_0, 793 result: pattern1_1, 794 } => { 795 let pattern2_0 = arg1; 796 if let &ConsumesFlags::ConsumesFlagsReturnsResultWithProducer { 797 inst: ref pattern3_0, 798 result: pattern3_1, 799 } = pattern2_0 800 { 801 // Rule at src/prelude.isle line 544. 802 let expr0_0 = C::emit(ctx, pattern1_0); 803 let expr1_0 = C::emit(ctx, pattern3_0); 804 let expr2_0 = C::value_regs(ctx, pattern1_1, pattern3_1); 805 return Some(expr2_0); 806 } 807 } 808 _ => {} 809 } 810 return None; 811 } 812 813 // Generated as internal constructor for term with_flags_reg. 814 pub fn constructor_with_flags_reg<C: Context>( 815 ctx: &mut C, 816 arg0: &ProducesFlags, 817 arg1: &ConsumesFlags, 818 ) -> Option<Reg> { 819 let pattern0_0 = arg0; 820 let pattern1_0 = arg1; 821 // Rule at src/prelude.isle line 585. 822 let expr0_0 = constructor_with_flags(ctx, pattern0_0, pattern1_0)?; 823 let expr1_0: usize = 0; 824 let expr2_0 = C::value_regs_get(ctx, expr0_0, expr1_0); 825 return Some(expr2_0); 826 } 827 828 // Generated as internal constructor for term operand_size_bits. 829 pub fn constructor_operand_size_bits<C: Context>(ctx: &mut C, arg0: &OperandSize) -> Option<u16> { 830 let pattern0_0 = arg0; 831 match pattern0_0 { 832 &OperandSize::Size8 => { 833 // Rule at src/isa/x64/inst.isle line 515. 834 let expr0_0: u16 = 8; 835 return Some(expr0_0); 836 } 837 &OperandSize::Size16 => { 838 // Rule at src/isa/x64/inst.isle line 516. 839 let expr0_0: u16 = 16; 840 return Some(expr0_0); 841 } 842 &OperandSize::Size32 => { 843 // Rule at src/isa/x64/inst.isle line 517. 844 let expr0_0: u16 = 32; 845 return Some(expr0_0); 846 } 847 &OperandSize::Size64 => { 848 // Rule at src/isa/x64/inst.isle line 518. 849 let expr0_0: u16 = 64; 850 return Some(expr0_0); 851 } 852 _ => {} 853 } 854 return None; 855 } 856 857 // Generated as internal constructor for term amode_imm_reg_flags. 858 pub fn constructor_amode_imm_reg_flags<C: Context>( 859 ctx: &mut C, 860 arg0: u32, 861 arg1: Gpr, 862 arg2: MemFlags, 863 ) -> Option<Amode> { 864 let pattern0_0 = arg0; 865 let pattern1_0 = arg1; 866 let pattern2_0 = arg2; 867 // Rule at src/isa/x64/inst.isle line 796. 868 let expr0_0 = C::amode_imm_reg(ctx, pattern0_0, pattern1_0); 869 let expr1_0 = C::amode_with_flags(ctx, &expr0_0, pattern2_0); 870 return Some(expr1_0); 871 } 872 873 // Generated as internal constructor for term amode_imm_reg_reg_shift_flags. 874 pub fn constructor_amode_imm_reg_reg_shift_flags<C: Context>( 875 ctx: &mut C, 876 arg0: u32, 877 arg1: Gpr, 878 arg2: Gpr, 879 arg3: u8, 880 arg4: MemFlags, 881 ) -> Option<Amode> { 882 let pattern0_0 = arg0; 883 let pattern1_0 = arg1; 884 let pattern2_0 = arg2; 885 let pattern3_0 = arg3; 886 let pattern4_0 = arg4; 887 // Rule at src/isa/x64/inst.isle line 803. 888 let expr0_0 = C::amode_imm_reg_reg_shift(ctx, pattern0_0, pattern1_0, pattern2_0, pattern3_0); 889 let expr1_0 = C::amode_with_flags(ctx, &expr0_0, pattern4_0); 890 return Some(expr1_0); 891 } 892 893 // Generated as internal constructor for term to_amode. 894 pub fn constructor_to_amode<C: Context>( 895 ctx: &mut C, 896 arg0: MemFlags, 897 arg1: Value, 898 arg2: Offset32, 899 ) -> Option<Amode> { 900 let pattern0_0 = arg0; 901 let pattern1_0 = arg1; 902 let pattern2_0 = arg2; 903 // Rule at src/isa/x64/inst.isle line 983. 904 let expr0_0 = constructor_amode_initial(ctx, pattern0_0, pattern2_0)?; 905 let expr1_0 = constructor_amode_add(ctx, &expr0_0, pattern1_0)?; 906 return Some(expr1_0); 907 } 908 909 // Generated as internal constructor for term amode_initial. 910 pub fn constructor_amode_initial<C: Context>( 911 ctx: &mut C, 912 arg0: MemFlags, 913 arg1: Offset32, 914 ) -> Option<Amode> { 915 let pattern0_0 = arg0; 916 let pattern1_0 = arg1; 917 if let Some(pattern2_0) = C::offset32(ctx, pattern1_0) { 918 // Rule at src/isa/x64/inst.isle line 873. 919 let expr0_0 = C::invalid_reg(ctx); 920 let expr1_0 = Amode::ImmReg { 921 simm32: pattern2_0, 922 base: expr0_0, 923 flags: pattern0_0, 924 }; 925 return Some(expr1_0); 926 } 927 return None; 928 } 929 930 // Generated as internal constructor for term amode_add. 931 pub fn constructor_amode_add<C: Context>(ctx: &mut C, arg0: &Amode, arg1: Value) -> Option<Amode> { 932 let pattern0_0 = arg0; 933 match pattern0_0 { 934 &Amode::ImmReg { 935 simm32: pattern1_0, 936 base: pattern1_1, 937 flags: pattern1_2, 938 } => { 939 let pattern2_0 = arg1; 940 if let Some(pattern3_0) = C::def_inst(ctx, pattern2_0) { 941 let pattern4_0 = C::inst_data(ctx, pattern3_0); 942 match &pattern4_0 { 943 &InstructionData::UnaryImm { 944 opcode: ref pattern5_0, 945 imm: pattern5_1, 946 } => { 947 if let &Opcode::Iconst = pattern5_0 { 948 if let Some(pattern7_0) = C::simm32(ctx, pattern5_1) { 949 let mut closure8 = || { 950 let expr0_0 = C::s32_add_fallible(ctx, pattern1_0, pattern7_0)?; 951 return Some(expr0_0); 952 }; 953 if let Some(pattern8_0) = closure8() { 954 // Rule at src/isa/x64/inst.isle line 941. 955 let expr0_0 = Amode::ImmReg { 956 simm32: pattern8_0, 957 base: pattern1_1, 958 flags: pattern1_2, 959 }; 960 return Some(expr0_0); 961 } 962 } 963 } 964 } 965 &InstructionData::Unary { 966 opcode: ref pattern5_0, 967 arg: pattern5_1, 968 } => { 969 match pattern5_0 { 970 &Opcode::Uextend => { 971 if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) { 972 let pattern8_0 = C::inst_data(ctx, pattern7_0); 973 if let &InstructionData::UnaryImm { 974 opcode: ref pattern9_0, 975 imm: pattern9_1, 976 } = &pattern8_0 977 { 978 if let &Opcode::Iconst = pattern9_0 { 979 if let Some(pattern11_0) = C::simm32(ctx, pattern9_1) { 980 if let Some(pattern12_0) = 981 C::u32_nonnegative(ctx, pattern11_0) 982 { 983 let mut closure13 = || { 984 let expr0_0 = C::s32_add_fallible( 985 ctx, 986 pattern1_0, 987 pattern12_0, 988 )?; 989 return Some(expr0_0); 990 }; 991 if let Some(pattern13_0) = closure13() { 992 // Rule at src/isa/x64/inst.isle line 954. 993 let expr0_0 = Amode::ImmReg { 994 simm32: pattern13_0, 995 base: pattern1_1, 996 flags: pattern1_2, 997 }; 998 return Some(expr0_0); 999 } 1000 } 1001 } 1002 } 1003 } 1004 } 1005 } 1006 &Opcode::Sextend => { 1007 if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) { 1008 let pattern8_0 = C::inst_data(ctx, pattern7_0); 1009 if let &InstructionData::UnaryImm { 1010 opcode: ref pattern9_0, 1011 imm: pattern9_1, 1012 } = &pattern8_0 1013 { 1014 if let &Opcode::Iconst = pattern9_0 { 1015 if let Some(pattern11_0) = C::simm32(ctx, pattern9_1) { 1016 let mut closure12 = || { 1017 let expr0_0 = C::s32_add_fallible( 1018 ctx, 1019 pattern1_0, 1020 pattern11_0, 1021 )?; 1022 return Some(expr0_0); 1023 }; 1024 if let Some(pattern12_0) = closure12() { 1025 // Rule at src/isa/x64/inst.isle line 964. 1026 let expr0_0 = Amode::ImmReg { 1027 simm32: pattern12_0, 1028 base: pattern1_1, 1029 flags: pattern1_2, 1030 }; 1031 return Some(expr0_0); 1032 } 1033 } 1034 } 1035 } 1036 } 1037 } 1038 _ => {} 1039 } 1040 } 1041 _ => {} 1042 } 1043 } 1044 } 1045 &Amode::ImmRegRegShift { 1046 simm32: pattern1_0, 1047 base: pattern1_1, 1048 index: pattern1_2, 1049 shift: pattern1_3, 1050 flags: pattern1_4, 1051 } => { 1052 let pattern2_0 = arg1; 1053 if let Some(pattern3_0) = C::def_inst(ctx, pattern2_0) { 1054 let pattern4_0 = C::inst_data(ctx, pattern3_0); 1055 match &pattern4_0 { 1056 &InstructionData::UnaryImm { 1057 opcode: ref pattern5_0, 1058 imm: pattern5_1, 1059 } => { 1060 if let &Opcode::Iconst = pattern5_0 { 1061 if let Some(pattern7_0) = C::simm32(ctx, pattern5_1) { 1062 let mut closure8 = || { 1063 let expr0_0 = C::s32_add_fallible(ctx, pattern1_0, pattern7_0)?; 1064 return Some(expr0_0); 1065 }; 1066 if let Some(pattern8_0) = closure8() { 1067 // Rule at src/isa/x64/inst.isle line 945. 1068 let expr0_0 = Amode::ImmRegRegShift { 1069 simm32: pattern8_0, 1070 base: pattern1_1, 1071 index: pattern1_2, 1072 shift: pattern1_3, 1073 flags: pattern1_4, 1074 }; 1075 return Some(expr0_0); 1076 } 1077 } 1078 } 1079 } 1080 &InstructionData::Unary { 1081 opcode: ref pattern5_0, 1082 arg: pattern5_1, 1083 } => { 1084 match pattern5_0 { 1085 &Opcode::Uextend => { 1086 if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) { 1087 let pattern8_0 = C::inst_data(ctx, pattern7_0); 1088 if let &InstructionData::UnaryImm { 1089 opcode: ref pattern9_0, 1090 imm: pattern9_1, 1091 } = &pattern8_0 1092 { 1093 if let &Opcode::Iconst = pattern9_0 { 1094 if let Some(pattern11_0) = C::simm32(ctx, pattern9_1) { 1095 if let Some(pattern12_0) = 1096 C::u32_nonnegative(ctx, pattern11_0) 1097 { 1098 let mut closure13 = || { 1099 let expr0_0 = C::s32_add_fallible( 1100 ctx, 1101 pattern1_0, 1102 pattern12_0, 1103 )?; 1104 return Some(expr0_0); 1105 }; 1106 if let Some(pattern13_0) = closure13() { 1107 // Rule at src/isa/x64/inst.isle line 958. 1108 let expr0_0 = Amode::ImmRegRegShift { 1109 simm32: pattern13_0, 1110 base: pattern1_1, 1111 index: pattern1_2, 1112 shift: pattern1_3, 1113 flags: pattern1_4, 1114 }; 1115 return Some(expr0_0); 1116 } 1117 } 1118 } 1119 } 1120 } 1121 } 1122 } 1123 &Opcode::Sextend => { 1124 if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) { 1125 let pattern8_0 = C::inst_data(ctx, pattern7_0); 1126 if let &InstructionData::UnaryImm { 1127 opcode: ref pattern9_0, 1128 imm: pattern9_1, 1129 } = &pattern8_0 1130 { 1131 if let &Opcode::Iconst = pattern9_0 { 1132 if let Some(pattern11_0) = C::simm32(ctx, pattern9_1) { 1133 let mut closure12 = || { 1134 let expr0_0 = C::s32_add_fallible( 1135 ctx, 1136 pattern1_0, 1137 pattern11_0, 1138 )?; 1139 return Some(expr0_0); 1140 }; 1141 if let Some(pattern12_0) = closure12() { 1142 // Rule at src/isa/x64/inst.isle line 968. 1143 let expr0_0 = Amode::ImmRegRegShift { 1144 simm32: pattern12_0, 1145 base: pattern1_1, 1146 index: pattern1_2, 1147 shift: pattern1_3, 1148 flags: pattern1_4, 1149 }; 1150 return Some(expr0_0); 1151 } 1152 } 1153 } 1154 } 1155 } 1156 } 1157 _ => {} 1158 } 1159 } 1160 _ => {} 1161 } 1162 } 1163 } 1164 _ => {} 1165 } 1166 let pattern0_0 = arg0; 1167 if let &Amode::ImmReg { 1168 simm32: pattern1_0, 1169 base: pattern1_1, 1170 flags: pattern1_2, 1171 } = pattern0_0 1172 { 1173 let pattern2_0 = arg1; 1174 if let Some(pattern3_0) = C::def_inst(ctx, pattern2_0) { 1175 let pattern4_0 = C::inst_data(ctx, pattern3_0); 1176 match &pattern4_0 { 1177 &InstructionData::Binary { 1178 opcode: ref pattern5_0, 1179 args: ref pattern5_1, 1180 } => { 1181 if let &Opcode::Ishl = pattern5_0 { 1182 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 1183 if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { 1184 let pattern9_0 = C::inst_data(ctx, pattern8_0); 1185 if let &InstructionData::UnaryImm { 1186 opcode: ref pattern10_0, 1187 imm: pattern10_1, 1188 } = &pattern9_0 1189 { 1190 if let &Opcode::Iconst = pattern10_0 { 1191 if let Some(pattern12_0) = C::uimm8(ctx, pattern10_1) { 1192 let mut closure13 = || { 1193 return Some(pattern1_1); 1194 }; 1195 if let Some(pattern13_0) = closure13() { 1196 if let Some(()) = C::valid_reg(ctx, pattern13_0) { 1197 let mut closure15 = || { 1198 let expr0_0 = C::u8_as_u32(ctx, pattern12_0)?; 1199 let expr1_0: u32 = 3; 1200 let expr2_0 = 1201 C::u32_lteq(ctx, expr0_0, expr1_0)?; 1202 return Some(expr2_0); 1203 }; 1204 if let Some(pattern15_0) = closure15() { 1205 // Rule at src/isa/x64/inst.isle line 912. 1206 let expr0_0 = C::gpr_new(ctx, pattern1_1); 1207 let expr1_0 = 1208 constructor_put_in_gpr(ctx, pattern7_0)?; 1209 let expr2_0 = Amode::ImmRegRegShift { 1210 simm32: pattern1_0, 1211 base: expr0_0, 1212 index: expr1_0, 1213 shift: pattern12_0, 1214 flags: pattern1_2, 1215 }; 1216 return Some(expr2_0); 1217 } 1218 } 1219 } 1220 } 1221 } 1222 } 1223 } 1224 } 1225 } 1226 &InstructionData::Unary { 1227 opcode: ref pattern5_0, 1228 arg: pattern5_1, 1229 } => { 1230 if let &Opcode::Uextend = pattern5_0 { 1231 if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) { 1232 let pattern8_0 = C::inst_data(ctx, pattern7_0); 1233 if let &InstructionData::Binary { 1234 opcode: ref pattern9_0, 1235 args: ref pattern9_1, 1236 } = &pattern8_0 1237 { 1238 if let &Opcode::Ishl = pattern9_0 { 1239 let (pattern11_0, pattern11_1) = 1240 C::unpack_value_array_2(ctx, pattern9_1); 1241 if let Some(pattern12_0) = C::def_inst(ctx, pattern11_0) { 1242 let pattern13_0 = C::inst_data(ctx, pattern12_0); 1243 if let &InstructionData::Binary { 1244 opcode: ref pattern14_0, 1245 args: ref pattern14_1, 1246 } = &pattern13_0 1247 { 1248 if let &Opcode::Iadd = pattern14_0 { 1249 let (pattern16_0, pattern16_1) = 1250 C::unpack_value_array_2(ctx, pattern14_1); 1251 if let Some(pattern17_0) = 1252 C::def_inst(ctx, pattern11_1) 1253 { 1254 let pattern18_0 = 1255 C::inst_data(ctx, pattern17_0); 1256 if let &InstructionData::UnaryImm { 1257 opcode: ref pattern19_0, 1258 imm: pattern19_1, 1259 } = &pattern18_0 1260 { 1261 if let &Opcode::Iconst = pattern19_0 { 1262 if let Some(pattern21_0) = 1263 C::uimm8(ctx, pattern19_1) 1264 { 1265 let mut closure22 = || { 1266 return Some(pattern1_1); 1267 }; 1268 if let Some(pattern22_0) = 1269 closure22() 1270 { 1271 if let Some(()) = C::valid_reg( 1272 ctx, 1273 pattern22_0, 1274 ) { 1275 let mut closure24 = || { 1276 let expr0_0 = 1277 C::u8_as_u32( 1278 ctx, 1279 pattern21_0, 1280 )?; 1281 let expr1_0: u32 = 3; 1282 let expr2_0 = 1283 C::u32_lteq( 1284 ctx, expr0_0, 1285 expr1_0, 1286 )?; 1287 return Some(expr2_0); 1288 }; 1289 if let Some(pattern24_0) = 1290 closure24() 1291 { 1292 // Rule at src/isa/x64/inst.isle line 927. 1293 let expr0_0 = 1294 C::gpr_new( 1295 ctx, pattern1_1, 1296 ); 1297 let expr1_0 = constructor_put_in_gpr(ctx, pattern11_0)?; 1298 let expr2_0 = Amode::ImmRegRegShift { 1299 simm32: pattern1_0, 1300 base: expr0_0, 1301 index: expr1_0, 1302 shift: pattern21_0, 1303 flags: pattern1_2, 1304 }; 1305 return Some(expr2_0); 1306 } 1307 } 1308 } 1309 } 1310 } 1311 } 1312 } 1313 } 1314 } 1315 } 1316 if let Some(pattern12_0) = C::def_inst(ctx, pattern11_1) { 1317 let pattern13_0 = C::inst_data(ctx, pattern12_0); 1318 if let &InstructionData::UnaryImm { 1319 opcode: ref pattern14_0, 1320 imm: pattern14_1, 1321 } = &pattern13_0 1322 { 1323 if let &Opcode::Iconst = pattern14_0 { 1324 if let Some(pattern16_0) = 1325 C::uimm8(ctx, pattern14_1) 1326 { 1327 let mut closure17 = || { 1328 return Some(pattern1_1); 1329 }; 1330 if let Some(pattern17_0) = closure17() { 1331 if let Some(()) = 1332 C::valid_reg(ctx, pattern17_0) 1333 { 1334 let mut closure19 = || { 1335 let expr0_0 = 1336 C::u8_as_u32(ctx, pattern16_0)?; 1337 let expr1_0: u32 = 3; 1338 let expr2_0 = C::u32_lteq( 1339 ctx, expr0_0, expr1_0, 1340 )?; 1341 return Some(expr2_0); 1342 }; 1343 if let Some(pattern19_0) = closure19() { 1344 // Rule at src/isa/x64/inst.isle line 916. 1345 let expr0_0 = 1346 C::gpr_new(ctx, pattern1_1); 1347 let expr1_0: Type = I64; 1348 let expr2_0 = ExtendKind::Zero; 1349 let expr3_0 = 1350 constructor_extend_to_gpr( 1351 ctx, 1352 pattern11_0, 1353 expr1_0, 1354 &expr2_0, 1355 )?; 1356 let expr4_0 = 1357 Amode::ImmRegRegShift { 1358 simm32: pattern1_0, 1359 base: expr0_0, 1360 index: expr3_0, 1361 shift: pattern16_0, 1362 flags: pattern1_2, 1363 }; 1364 return Some(expr4_0); 1365 } 1366 } 1367 } 1368 } 1369 } 1370 } 1371 } 1372 } 1373 } 1374 } 1375 } 1376 } 1377 _ => {} 1378 } 1379 } 1380 } 1381 let pattern1_0 = arg1; 1382 if let Some(pattern2_0) = C::def_inst(ctx, pattern1_0) { 1383 let pattern3_0 = C::inst_data(ctx, pattern2_0); 1384 if let &InstructionData::Binary { 1385 opcode: ref pattern4_0, 1386 args: ref pattern4_1, 1387 } = &pattern3_0 1388 { 1389 if let &Opcode::Iadd = pattern4_0 { 1390 let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); 1391 // Rule at src/isa/x64/inst.isle line 887. 1392 let expr0_0 = constructor_amode_add(ctx, pattern0_0, pattern6_0)?; 1393 let expr1_0 = constructor_amode_add(ctx, &expr0_0, pattern6_1)?; 1394 return Some(expr1_0); 1395 } 1396 } 1397 } 1398 let pattern0_0 = arg0; 1399 match pattern0_0 { 1400 &Amode::ImmReg { 1401 simm32: pattern1_0, 1402 base: pattern1_1, 1403 flags: pattern1_2, 1404 } => { 1405 if let Some(()) = C::invalid_reg_etor(ctx, pattern1_1) { 1406 let pattern3_0 = arg1; 1407 // Rule at src/isa/x64/inst.isle line 896. 1408 let expr0_0 = C::put_in_reg(ctx, pattern3_0); 1409 let expr1_0 = Amode::ImmReg { 1410 simm32: pattern1_0, 1411 base: expr0_0, 1412 flags: pattern1_2, 1413 }; 1414 return Some(expr1_0); 1415 } 1416 let pattern2_0 = arg1; 1417 let mut closure3 = || { 1418 return Some(pattern1_1); 1419 }; 1420 if let Some(pattern3_0) = closure3() { 1421 if let Some(()) = C::valid_reg(ctx, pattern3_0) { 1422 // Rule at src/isa/x64/inst.isle line 902. 1423 let expr0_0 = C::gpr_new(ctx, pattern1_1); 1424 let expr1_0 = constructor_put_in_gpr(ctx, pattern2_0)?; 1425 let expr2_0: u8 = 0; 1426 let expr3_0 = Amode::ImmRegRegShift { 1427 simm32: pattern1_0, 1428 base: expr0_0, 1429 index: expr1_0, 1430 shift: expr2_0, 1431 flags: pattern1_2, 1432 }; 1433 return Some(expr3_0); 1434 } 1435 } 1436 } 1437 &Amode::ImmRegRegShift { 1438 simm32: pattern1_0, 1439 base: pattern1_1, 1440 index: pattern1_2, 1441 shift: pattern1_3, 1442 flags: pattern1_4, 1443 } => { 1444 let pattern2_0 = arg1; 1445 // Rule at src/isa/x64/inst.isle line 978. 1446 let expr0_0: Type = I64; 1447 let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern2_0)?; 1448 let expr2_0 = constructor_x64_add(ctx, expr0_0, pattern1_1, &expr1_0)?; 1449 let expr3_0 = Amode::ImmRegRegShift { 1450 simm32: pattern1_0, 1451 base: expr2_0, 1452 index: pattern1_2, 1453 shift: pattern1_3, 1454 flags: pattern1_4, 1455 }; 1456 return Some(expr3_0); 1457 } 1458 _ => {} 1459 } 1460 return None; 1461 } 1462 1463 // Generated as internal constructor for term reg_to_gpr_mem_imm. 1464 pub fn constructor_reg_to_gpr_mem_imm<C: Context>(ctx: &mut C, arg0: Reg) -> Option<GprMemImm> { 1465 let pattern0_0 = arg0; 1466 // Rule at src/isa/x64/inst.isle line 1182. 1467 let expr0_0 = C::gpr_new(ctx, pattern0_0); 1468 let expr1_0 = C::gpr_to_gpr_mem_imm(ctx, expr0_0); 1469 return Some(expr1_0); 1470 } 1471 1472 // Generated as internal constructor for term put_in_gpr. 1473 pub fn constructor_put_in_gpr<C: Context>(ctx: &mut C, arg0: Value) -> Option<Gpr> { 1474 let pattern0_0 = arg0; 1475 // Rule at src/isa/x64/inst.isle line 1189. 1476 let expr0_0 = C::put_in_reg(ctx, pattern0_0); 1477 let expr1_0 = C::gpr_new(ctx, expr0_0); 1478 return Some(expr1_0); 1479 } 1480 1481 // Generated as internal constructor for term put_in_gpr_mem. 1482 pub fn constructor_put_in_gpr_mem<C: Context>(ctx: &mut C, arg0: Value) -> Option<GprMem> { 1483 let pattern0_0 = arg0; 1484 // Rule at src/isa/x64/inst.isle line 1196. 1485 let expr0_0 = C::put_in_reg_mem(ctx, pattern0_0); 1486 let expr1_0 = C::reg_mem_to_gpr_mem(ctx, &expr0_0); 1487 return Some(expr1_0); 1488 } 1489 1490 // Generated as internal constructor for term put_in_gpr_mem_imm. 1491 pub fn constructor_put_in_gpr_mem_imm<C: Context>(ctx: &mut C, arg0: Value) -> Option<GprMemImm> { 1492 let pattern0_0 = arg0; 1493 // Rule at src/isa/x64/inst.isle line 1203. 1494 let expr0_0 = C::put_in_reg_mem_imm(ctx, pattern0_0); 1495 let expr1_0 = C::gpr_mem_imm_new(ctx, &expr0_0); 1496 return Some(expr1_0); 1497 } 1498 1499 // Generated as internal constructor for term put_in_xmm. 1500 pub fn constructor_put_in_xmm<C: Context>(ctx: &mut C, arg0: Value) -> Option<Xmm> { 1501 let pattern0_0 = arg0; 1502 // Rule at src/isa/x64/inst.isle line 1210. 1503 let expr0_0 = C::put_in_reg(ctx, pattern0_0); 1504 let expr1_0 = C::xmm_new(ctx, expr0_0); 1505 return Some(expr1_0); 1506 } 1507 1508 // Generated as internal constructor for term put_in_xmm_mem. 1509 pub fn constructor_put_in_xmm_mem<C: Context>(ctx: &mut C, arg0: Value) -> Option<XmmMem> { 1510 let pattern0_0 = arg0; 1511 // Rule at src/isa/x64/inst.isle line 1217. 1512 let expr0_0 = C::put_in_reg_mem(ctx, pattern0_0); 1513 let expr1_0 = C::reg_mem_to_xmm_mem(ctx, &expr0_0); 1514 return Some(expr1_0); 1515 } 1516 1517 // Generated as internal constructor for term put_in_xmm_mem_imm. 1518 pub fn constructor_put_in_xmm_mem_imm<C: Context>(ctx: &mut C, arg0: Value) -> Option<XmmMemImm> { 1519 let pattern0_0 = arg0; 1520 // Rule at src/isa/x64/inst.isle line 1224. 1521 let expr0_0 = C::put_in_reg_mem_imm(ctx, pattern0_0); 1522 let expr1_0 = C::xmm_mem_imm_new(ctx, &expr0_0); 1523 return Some(expr1_0); 1524 } 1525 1526 // Generated as internal constructor for term output_gpr. 1527 pub fn constructor_output_gpr<C: Context>(ctx: &mut C, arg0: Gpr) -> Option<InstOutput> { 1528 let pattern0_0 = arg0; 1529 // Rule at src/isa/x64/inst.isle line 1229. 1530 let expr0_0 = C::gpr_to_reg(ctx, pattern0_0); 1531 let expr1_0 = constructor_output_reg(ctx, expr0_0)?; 1532 return Some(expr1_0); 1533 } 1534 1535 // Generated as internal constructor for term value_gprs. 1536 pub fn constructor_value_gprs<C: Context>(ctx: &mut C, arg0: Gpr, arg1: Gpr) -> Option<ValueRegs> { 1537 let pattern0_0 = arg0; 1538 let pattern1_0 = arg1; 1539 // Rule at src/isa/x64/inst.isle line 1234. 1540 let expr0_0 = C::gpr_to_reg(ctx, pattern0_0); 1541 let expr1_0 = C::gpr_to_reg(ctx, pattern1_0); 1542 let expr2_0 = C::value_regs(ctx, expr0_0, expr1_0); 1543 return Some(expr2_0); 1544 } 1545 1546 // Generated as internal constructor for term output_xmm. 1547 pub fn constructor_output_xmm<C: Context>(ctx: &mut C, arg0: Xmm) -> Option<InstOutput> { 1548 let pattern0_0 = arg0; 1549 // Rule at src/isa/x64/inst.isle line 1239. 1550 let expr0_0 = C::xmm_to_reg(ctx, pattern0_0); 1551 let expr1_0 = constructor_output_reg(ctx, expr0_0)?; 1552 return Some(expr1_0); 1553 } 1554 1555 // Generated as internal constructor for term value_regs_get_gpr. 1556 pub fn constructor_value_regs_get_gpr<C: Context>( 1557 ctx: &mut C, 1558 arg0: ValueRegs, 1559 arg1: usize, 1560 ) -> Option<Gpr> { 1561 let pattern0_0 = arg0; 1562 let pattern1_0 = arg1; 1563 // Rule at src/isa/x64/inst.isle line 1246. 1564 let expr0_0 = C::value_regs_get(ctx, pattern0_0, pattern1_0); 1565 let expr1_0 = C::gpr_new(ctx, expr0_0); 1566 return Some(expr1_0); 1567 } 1568 1569 // Generated as internal constructor for term lo_gpr. 1570 pub fn constructor_lo_gpr<C: Context>(ctx: &mut C, arg0: Value) -> Option<Gpr> { 1571 let pattern0_0 = arg0; 1572 // Rule at src/isa/x64/inst.isle line 1259. 1573 let expr0_0 = constructor_lo_reg(ctx, pattern0_0)?; 1574 let expr1_0 = C::gpr_new(ctx, expr0_0); 1575 return Some(expr1_0); 1576 } 1577 1578 // Generated as internal constructor for term sink_load_to_gpr_mem_imm. 1579 pub fn constructor_sink_load_to_gpr_mem_imm<C: Context>( 1580 ctx: &mut C, 1581 arg0: &SinkableLoad, 1582 ) -> Option<GprMemImm> { 1583 let pattern0_0 = arg0; 1584 // Rule at src/isa/x64/inst.isle line 1342. 1585 let expr0_0 = C::sink_load(ctx, pattern0_0); 1586 let expr1_0 = C::gpr_mem_imm_new(ctx, &expr0_0); 1587 return Some(expr1_0); 1588 } 1589 1590 // Generated as internal constructor for term extend_to_gpr. 1591 pub fn constructor_extend_to_gpr<C: Context>( 1592 ctx: &mut C, 1593 arg0: Value, 1594 arg1: Type, 1595 arg2: &ExtendKind, 1596 ) -> Option<Gpr> { 1597 let pattern0_0 = arg0; 1598 let pattern1_0 = C::value_type(ctx, pattern0_0); 1599 let pattern2_0 = arg1; 1600 if pattern2_0 == pattern1_0 { 1601 let pattern4_0 = arg2; 1602 // Rule at src/isa/x64/inst.isle line 1364. 1603 let expr0_0 = constructor_put_in_gpr(ctx, pattern0_0)?; 1604 return Some(expr0_0); 1605 } 1606 let pattern3_0 = arg2; 1607 // Rule at src/isa/x64/inst.isle line 1367. 1608 let expr0_0 = C::ty_bits_u16(ctx, pattern1_0); 1609 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern2_0); 1610 let expr2_0 = constructor_operand_size_bits(ctx, &expr1_0)?; 1611 let expr3_0 = C::ext_mode(ctx, expr0_0, expr2_0); 1612 let expr4_0 = constructor_put_in_gpr_mem(ctx, pattern0_0)?; 1613 let expr5_0 = constructor_extend(ctx, pattern3_0, pattern2_0, &expr3_0, &expr4_0)?; 1614 return Some(expr5_0); 1615 } 1616 1617 // Generated as internal constructor for term extend. 1618 pub fn constructor_extend<C: Context>( 1619 ctx: &mut C, 1620 arg0: &ExtendKind, 1621 arg1: Type, 1622 arg2: &ExtMode, 1623 arg3: &GprMem, 1624 ) -> Option<Gpr> { 1625 let pattern0_0 = arg0; 1626 match pattern0_0 { 1627 &ExtendKind::Sign => { 1628 let pattern2_0 = arg1; 1629 let pattern3_0 = arg2; 1630 let pattern4_0 = arg3; 1631 // Rule at src/isa/x64/inst.isle line 1387. 1632 let expr0_0 = constructor_x64_movsx(ctx, pattern3_0, pattern4_0)?; 1633 return Some(expr0_0); 1634 } 1635 &ExtendKind::Zero => { 1636 let pattern2_0 = arg1; 1637 let pattern3_0 = arg2; 1638 let pattern4_0 = arg3; 1639 // Rule at src/isa/x64/inst.isle line 1383. 1640 let expr0_0 = constructor_x64_movzx(ctx, pattern3_0, pattern4_0)?; 1641 return Some(expr0_0); 1642 } 1643 _ => {} 1644 } 1645 return None; 1646 } 1647 1648 // Generated as internal constructor for term sse_xor_op. 1649 pub fn constructor_sse_xor_op<C: Context>(ctx: &mut C, arg0: Type) -> Option<SseOpcode> { 1650 let pattern0_0 = arg0; 1651 if pattern0_0 == F32X4 { 1652 // Rule at src/isa/x64/inst.isle line 1394. 1653 let expr0_0 = SseOpcode::Xorps; 1654 return Some(expr0_0); 1655 } 1656 if pattern0_0 == F64X2 { 1657 // Rule at src/isa/x64/inst.isle line 1395. 1658 let expr0_0 = SseOpcode::Xorpd; 1659 return Some(expr0_0); 1660 } 1661 if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { 1662 // Rule at src/isa/x64/inst.isle line 1396. 1663 let expr0_0 = SseOpcode::Pxor; 1664 return Some(expr0_0); 1665 } 1666 return None; 1667 } 1668 1669 // Generated as internal constructor for term sse_xor. 1670 pub fn constructor_sse_xor<C: Context>( 1671 ctx: &mut C, 1672 arg0: Type, 1673 arg1: Xmm, 1674 arg2: &XmmMem, 1675 ) -> Option<Xmm> { 1676 let pattern0_0 = arg0; 1677 let pattern1_0 = arg1; 1678 let pattern2_0 = arg2; 1679 // Rule at src/isa/x64/inst.isle line 1400. 1680 let expr0_0 = constructor_sse_xor_op(ctx, pattern0_0)?; 1681 let expr1_0 = constructor_xmm_rm_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 1682 return Some(expr1_0); 1683 } 1684 1685 // Generated as internal constructor for term sse_cmp_op. 1686 pub fn constructor_sse_cmp_op<C: Context>(ctx: &mut C, arg0: Type) -> Option<SseOpcode> { 1687 let pattern0_0 = arg0; 1688 if pattern0_0 == F32X4 { 1689 // Rule at src/isa/x64/inst.isle line 1409. 1690 let expr0_0 = SseOpcode::Cmpps; 1691 return Some(expr0_0); 1692 } 1693 if pattern0_0 == F64X2 { 1694 // Rule at src/isa/x64/inst.isle line 1410. 1695 let expr0_0 = SseOpcode::Cmppd; 1696 return Some(expr0_0); 1697 } 1698 if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { 1699 if pattern1_0 == 8 { 1700 if pattern1_1 == 16 { 1701 // Rule at src/isa/x64/inst.isle line 1405. 1702 let expr0_0 = SseOpcode::Pcmpeqb; 1703 return Some(expr0_0); 1704 } 1705 } 1706 if pattern1_0 == 16 { 1707 if pattern1_1 == 8 { 1708 // Rule at src/isa/x64/inst.isle line 1406. 1709 let expr0_0 = SseOpcode::Pcmpeqw; 1710 return Some(expr0_0); 1711 } 1712 } 1713 if pattern1_0 == 32 { 1714 if pattern1_1 == 4 { 1715 // Rule at src/isa/x64/inst.isle line 1407. 1716 let expr0_0 = SseOpcode::Pcmpeqd; 1717 return Some(expr0_0); 1718 } 1719 } 1720 if pattern1_0 == 64 { 1721 if pattern1_1 == 2 { 1722 // Rule at src/isa/x64/inst.isle line 1408. 1723 let expr0_0 = SseOpcode::Pcmpeqq; 1724 return Some(expr0_0); 1725 } 1726 } 1727 } 1728 return None; 1729 } 1730 1731 // Generated as internal constructor for term vector_all_ones. 1732 pub fn constructor_vector_all_ones<C: Context>(ctx: &mut C, arg0: Type) -> Option<Xmm> { 1733 let pattern0_0 = arg0; 1734 // Rule at src/isa/x64/inst.isle line 1424. 1735 let expr0_0 = C::temp_writable_xmm(ctx); 1736 let expr1_0: Type = I32X4; 1737 let expr2_0 = constructor_sse_cmp_op(ctx, expr1_0)?; 1738 let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 1739 let expr4_0 = constructor_writable_xmm_to_xmm_mem(ctx, expr0_0)?; 1740 let expr5_0 = MInst::XmmRmR { 1741 op: expr2_0, 1742 src1: expr3_0, 1743 src2: expr4_0, 1744 dst: expr0_0, 1745 }; 1746 let expr6_0 = C::emit(ctx, &expr5_0); 1747 let expr7_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 1748 return Some(expr7_0); 1749 } 1750 1751 // Generated as internal constructor for term make_i64x2_from_lanes. 1752 pub fn constructor_make_i64x2_from_lanes<C: Context>( 1753 ctx: &mut C, 1754 arg0: &GprMem, 1755 arg1: &GprMem, 1756 ) -> Option<Xmm> { 1757 let pattern0_0 = arg0; 1758 let pattern1_0 = arg1; 1759 // Rule at src/isa/x64/inst.isle line 1434. 1760 let expr0_0 = C::temp_writable_xmm(ctx); 1761 let expr1_0 = C::writable_xmm_to_reg(ctx, expr0_0); 1762 let expr2_0 = MInst::XmmUninitializedValue { dst: expr0_0 }; 1763 let expr3_0 = C::emit(ctx, &expr2_0); 1764 let expr4_0 = SseOpcode::Pinsrd; 1765 let expr5_0 = C::writable_reg_to_reg(ctx, expr1_0); 1766 let expr6_0 = C::gpr_mem_to_reg_mem(ctx, pattern0_0); 1767 let expr7_0: u8 = 0; 1768 let expr8_0 = OperandSize::Size64; 1769 let expr9_0 = MInst::XmmRmRImm { 1770 op: expr4_0, 1771 src1: expr5_0, 1772 src2: expr6_0, 1773 dst: expr1_0, 1774 imm: expr7_0, 1775 size: expr8_0, 1776 }; 1777 let expr10_0 = C::emit(ctx, &expr9_0); 1778 let expr11_0 = SseOpcode::Pinsrd; 1779 let expr12_0 = C::writable_reg_to_reg(ctx, expr1_0); 1780 let expr13_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0); 1781 let expr14_0: u8 = 1; 1782 let expr15_0 = OperandSize::Size64; 1783 let expr16_0 = MInst::XmmRmRImm { 1784 op: expr11_0, 1785 src1: expr12_0, 1786 src2: expr13_0, 1787 dst: expr1_0, 1788 imm: expr14_0, 1789 size: expr15_0, 1790 }; 1791 let expr17_0 = C::emit(ctx, &expr16_0); 1792 let expr18_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 1793 return Some(expr18_0); 1794 } 1795 1796 // Generated as internal constructor for term mov_rmi_to_xmm. 1797 pub fn constructor_mov_rmi_to_xmm<C: Context>(ctx: &mut C, arg0: &RegMemImm) -> Option<XmmMemImm> { 1798 let pattern0_0 = arg0; 1799 match pattern0_0 { 1800 &RegMemImm::Imm { simm32: pattern1_0 } => { 1801 // Rule at src/isa/x64/inst.isle line 1455. 1802 let expr0_0 = C::xmm_mem_imm_new(ctx, pattern0_0); 1803 return Some(expr0_0); 1804 } 1805 &RegMemImm::Reg { reg: pattern1_0 } => { 1806 // Rule at src/isa/x64/inst.isle line 1456. 1807 let expr0_0 = SseOpcode::Movd; 1808 let expr1_0 = C::reg_to_gpr_mem(ctx, pattern1_0); 1809 let expr2_0 = OperandSize::Size32; 1810 let expr3_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr1_0, &expr2_0)?; 1811 let expr4_0 = C::xmm_to_xmm_mem_imm(ctx, expr3_0); 1812 return Some(expr4_0); 1813 } 1814 &RegMemImm::Mem { 1815 addr: ref pattern1_0, 1816 } => { 1817 // Rule at src/isa/x64/inst.isle line 1454. 1818 let expr0_0 = C::xmm_mem_imm_new(ctx, pattern0_0); 1819 return Some(expr0_0); 1820 } 1821 _ => {} 1822 } 1823 return None; 1824 } 1825 1826 // Generated as internal constructor for term x64_load. 1827 pub fn constructor_x64_load<C: Context>( 1828 ctx: &mut C, 1829 arg0: Type, 1830 arg1: &SyntheticAmode, 1831 arg2: &ExtKind, 1832 ) -> Option<Reg> { 1833 let pattern0_0 = arg0; 1834 if pattern0_0 == I64 { 1835 let pattern2_0 = arg1; 1836 let pattern3_0 = arg2; 1837 // Rule at src/isa/x64/inst.isle line 1470. 1838 let expr0_0 = C::temp_writable_gpr(ctx); 1839 let expr1_0 = MInst::Mov64MR { 1840 src: pattern2_0.clone(), 1841 dst: expr0_0, 1842 }; 1843 let expr2_0 = C::emit(ctx, &expr1_0); 1844 let expr3_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; 1845 return Some(expr3_0); 1846 } 1847 if pattern0_0 == F32 { 1848 let pattern2_0 = arg1; 1849 let pattern3_0 = arg2; 1850 // Rule at src/isa/x64/inst.isle line 1475. 1851 let expr0_0 = SseOpcode::Movss; 1852 let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0)?; 1853 let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?; 1854 let expr3_0 = C::xmm_to_reg(ctx, expr2_0); 1855 return Some(expr3_0); 1856 } 1857 if pattern0_0 == F64 { 1858 let pattern2_0 = arg1; 1859 let pattern3_0 = arg2; 1860 // Rule at src/isa/x64/inst.isle line 1479. 1861 let expr0_0 = SseOpcode::Movsd; 1862 let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0)?; 1863 let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?; 1864 let expr3_0 = C::xmm_to_reg(ctx, expr2_0); 1865 return Some(expr3_0); 1866 } 1867 if pattern0_0 == F32X4 { 1868 let pattern2_0 = arg1; 1869 let pattern3_0 = arg2; 1870 // Rule at src/isa/x64/inst.isle line 1483. 1871 let expr0_0 = SseOpcode::Movups; 1872 let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0)?; 1873 let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?; 1874 let expr3_0 = C::xmm_to_reg(ctx, expr2_0); 1875 return Some(expr3_0); 1876 } 1877 if pattern0_0 == F64X2 { 1878 let pattern2_0 = arg1; 1879 let pattern3_0 = arg2; 1880 // Rule at src/isa/x64/inst.isle line 1487. 1881 let expr0_0 = SseOpcode::Movupd; 1882 let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0)?; 1883 let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?; 1884 let expr3_0 = C::xmm_to_reg(ctx, expr2_0); 1885 return Some(expr3_0); 1886 } 1887 if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { 1888 let pattern2_0 = arg1; 1889 let pattern3_0 = arg2; 1890 // Rule at src/isa/x64/inst.isle line 1491. 1891 let expr0_0 = SseOpcode::Movdqu; 1892 let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, pattern2_0)?; 1893 let expr2_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, &expr1_0)?; 1894 let expr3_0 = C::xmm_to_reg(ctx, expr2_0); 1895 return Some(expr3_0); 1896 } 1897 if let Some(pattern1_0) = C::fits_in_32(ctx, pattern0_0) { 1898 let pattern2_0 = arg1; 1899 let pattern3_0 = arg2; 1900 if let &ExtKind::SignExtend = pattern3_0 { 1901 // Rule at src/isa/x64/inst.isle line 1466. 1902 let expr0_0 = C::ty_bytes(ctx, pattern1_0); 1903 let expr1_0: u16 = 8; 1904 let expr2_0 = C::ext_mode(ctx, expr0_0, expr1_0); 1905 let expr3_0 = constructor_synthetic_amode_to_gpr_mem(ctx, pattern2_0)?; 1906 let expr4_0 = constructor_x64_movsx(ctx, &expr2_0, &expr3_0)?; 1907 let expr5_0 = C::gpr_to_reg(ctx, expr4_0); 1908 return Some(expr5_0); 1909 } 1910 } 1911 return None; 1912 } 1913 1914 // Generated as internal constructor for term x64_mov. 1915 pub fn constructor_x64_mov<C: Context>(ctx: &mut C, arg0: &Amode) -> Option<Reg> { 1916 let pattern0_0 = arg0; 1917 // Rule at src/isa/x64/inst.isle line 1496. 1918 let expr0_0 = C::temp_writable_gpr(ctx); 1919 let expr1_0 = C::amode_to_synthetic_amode(ctx, pattern0_0); 1920 let expr2_0 = MInst::Mov64MR { 1921 src: expr1_0, 1922 dst: expr0_0, 1923 }; 1924 let expr3_0 = C::emit(ctx, &expr2_0); 1925 let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; 1926 return Some(expr4_0); 1927 } 1928 1929 // Generated as internal constructor for term x64_movzx. 1930 pub fn constructor_x64_movzx<C: Context>( 1931 ctx: &mut C, 1932 arg0: &ExtMode, 1933 arg1: &GprMem, 1934 ) -> Option<Gpr> { 1935 let pattern0_0 = arg0; 1936 let pattern1_0 = arg1; 1937 // Rule at src/isa/x64/inst.isle line 1502. 1938 let expr0_0 = C::temp_writable_gpr(ctx); 1939 let expr1_0 = MInst::MovzxRmR { 1940 ext_mode: pattern0_0.clone(), 1941 src: pattern1_0.clone(), 1942 dst: expr0_0, 1943 }; 1944 let expr2_0 = C::emit(ctx, &expr1_0); 1945 let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 1946 return Some(expr3_0); 1947 } 1948 1949 // Generated as internal constructor for term x64_movsx. 1950 pub fn constructor_x64_movsx<C: Context>( 1951 ctx: &mut C, 1952 arg0: &ExtMode, 1953 arg1: &GprMem, 1954 ) -> Option<Gpr> { 1955 let pattern0_0 = arg0; 1956 let pattern1_0 = arg1; 1957 // Rule at src/isa/x64/inst.isle line 1508. 1958 let expr0_0 = C::temp_writable_gpr(ctx); 1959 let expr1_0 = MInst::MovsxRmR { 1960 ext_mode: pattern0_0.clone(), 1961 src: pattern1_0.clone(), 1962 dst: expr0_0, 1963 }; 1964 let expr2_0 = C::emit(ctx, &expr1_0); 1965 let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 1966 return Some(expr3_0); 1967 } 1968 1969 // Generated as internal constructor for term x64_movss_load. 1970 pub fn constructor_x64_movss_load<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> { 1971 let pattern0_0 = arg0; 1972 // Rule at src/isa/x64/inst.isle line 1514. 1973 let expr0_0 = SseOpcode::Movss; 1974 let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; 1975 return Some(expr1_0); 1976 } 1977 1978 // Generated as internal constructor for term x64_movsd_load. 1979 pub fn constructor_x64_movsd_load<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> { 1980 let pattern0_0 = arg0; 1981 // Rule at src/isa/x64/inst.isle line 1518. 1982 let expr0_0 = SseOpcode::Movsd; 1983 let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; 1984 return Some(expr1_0); 1985 } 1986 1987 // Generated as internal constructor for term x64_movups. 1988 pub fn constructor_x64_movups<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> { 1989 let pattern0_0 = arg0; 1990 // Rule at src/isa/x64/inst.isle line 1522. 1991 let expr0_0 = SseOpcode::Movups; 1992 let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; 1993 return Some(expr1_0); 1994 } 1995 1996 // Generated as internal constructor for term x64_movupd. 1997 pub fn constructor_x64_movupd<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> { 1998 let pattern0_0 = arg0; 1999 // Rule at src/isa/x64/inst.isle line 1526. 2000 let expr0_0 = SseOpcode::Movupd; 2001 let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; 2002 return Some(expr1_0); 2003 } 2004 2005 // Generated as internal constructor for term x64_movdqu. 2006 pub fn constructor_x64_movdqu<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> { 2007 let pattern0_0 = arg0; 2008 // Rule at src/isa/x64/inst.isle line 1530. 2009 let expr0_0 = SseOpcode::Movdqu; 2010 let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; 2011 return Some(expr1_0); 2012 } 2013 2014 // Generated as internal constructor for term x64_pmovsxbw. 2015 pub fn constructor_x64_pmovsxbw<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> { 2016 let pattern0_0 = arg0; 2017 // Rule at src/isa/x64/inst.isle line 1534. 2018 let expr0_0 = SseOpcode::Pmovsxbw; 2019 let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; 2020 return Some(expr1_0); 2021 } 2022 2023 // Generated as internal constructor for term x64_pmovzxbw. 2024 pub fn constructor_x64_pmovzxbw<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> { 2025 let pattern0_0 = arg0; 2026 // Rule at src/isa/x64/inst.isle line 1538. 2027 let expr0_0 = SseOpcode::Pmovzxbw; 2028 let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; 2029 return Some(expr1_0); 2030 } 2031 2032 // Generated as internal constructor for term x64_pmovsxwd. 2033 pub fn constructor_x64_pmovsxwd<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> { 2034 let pattern0_0 = arg0; 2035 // Rule at src/isa/x64/inst.isle line 1542. 2036 let expr0_0 = SseOpcode::Pmovsxwd; 2037 let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; 2038 return Some(expr1_0); 2039 } 2040 2041 // Generated as internal constructor for term x64_pmovzxwd. 2042 pub fn constructor_x64_pmovzxwd<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> { 2043 let pattern0_0 = arg0; 2044 // Rule at src/isa/x64/inst.isle line 1546. 2045 let expr0_0 = SseOpcode::Pmovzxwd; 2046 let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; 2047 return Some(expr1_0); 2048 } 2049 2050 // Generated as internal constructor for term x64_pmovsxdq. 2051 pub fn constructor_x64_pmovsxdq<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> { 2052 let pattern0_0 = arg0; 2053 // Rule at src/isa/x64/inst.isle line 1550. 2054 let expr0_0 = SseOpcode::Pmovsxdq; 2055 let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; 2056 return Some(expr1_0); 2057 } 2058 2059 // Generated as internal constructor for term x64_pmovzxdq. 2060 pub fn constructor_x64_pmovzxdq<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> { 2061 let pattern0_0 = arg0; 2062 // Rule at src/isa/x64/inst.isle line 1554. 2063 let expr0_0 = SseOpcode::Pmovzxdq; 2064 let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; 2065 return Some(expr1_0); 2066 } 2067 2068 // Generated as internal constructor for term x64_movrm. 2069 pub fn constructor_x64_movrm<C: Context>( 2070 ctx: &mut C, 2071 arg0: Type, 2072 arg1: &SyntheticAmode, 2073 arg2: Gpr, 2074 ) -> Option<SideEffectNoResult> { 2075 let pattern0_0 = arg0; 2076 let pattern1_0 = arg1; 2077 let pattern2_0 = arg2; 2078 // Rule at src/isa/x64/inst.isle line 1558. 2079 let expr0_0 = C::raw_operand_size_of_type(ctx, pattern0_0); 2080 let expr1_0 = MInst::MovRM { 2081 size: expr0_0, 2082 src: pattern2_0, 2083 dst: pattern1_0.clone(), 2084 }; 2085 let expr2_0 = SideEffectNoResult::Inst { inst: expr1_0 }; 2086 return Some(expr2_0); 2087 } 2088 2089 // Generated as internal constructor for term x64_xmm_movrm. 2090 pub fn constructor_x64_xmm_movrm<C: Context>( 2091 ctx: &mut C, 2092 arg0: &SseOpcode, 2093 arg1: &SyntheticAmode, 2094 arg2: Xmm, 2095 ) -> Option<SideEffectNoResult> { 2096 let pattern0_0 = arg0; 2097 let pattern1_0 = arg1; 2098 let pattern2_0 = arg2; 2099 // Rule at src/isa/x64/inst.isle line 1563. 2100 let expr0_0 = C::xmm_to_reg(ctx, pattern2_0); 2101 let expr1_0 = MInst::XmmMovRM { 2102 op: pattern0_0.clone(), 2103 src: expr0_0, 2104 dst: pattern1_0.clone(), 2105 }; 2106 let expr2_0 = SideEffectNoResult::Inst { inst: expr1_0 }; 2107 return Some(expr2_0); 2108 } 2109 2110 // Generated as internal constructor for term x64_xmm_load_const. 2111 pub fn constructor_x64_xmm_load_const<C: Context>( 2112 ctx: &mut C, 2113 arg0: Type, 2114 arg1: VCodeConstant, 2115 ) -> Option<Xmm> { 2116 let pattern0_0 = arg0; 2117 let pattern1_0 = arg1; 2118 // Rule at src/isa/x64/inst.isle line 1568. 2119 let expr0_0 = C::temp_writable_xmm(ctx); 2120 let expr1_0 = C::writable_xmm_to_reg(ctx, expr0_0); 2121 let expr2_0 = MInst::XmmLoadConst { 2122 src: pattern1_0, 2123 dst: expr1_0, 2124 ty: pattern0_0, 2125 }; 2126 let expr3_0 = C::emit(ctx, &expr2_0); 2127 let expr4_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 2128 return Some(expr4_0); 2129 } 2130 2131 // Generated as internal constructor for term alu_rmi_r. 2132 pub fn constructor_alu_rmi_r<C: Context>( 2133 ctx: &mut C, 2134 arg0: Type, 2135 arg1: &AluRmiROpcode, 2136 arg2: Gpr, 2137 arg3: &GprMemImm, 2138 ) -> Option<Gpr> { 2139 let pattern0_0 = arg0; 2140 let pattern1_0 = arg1; 2141 let pattern2_0 = arg2; 2142 let pattern3_0 = arg3; 2143 // Rule at src/isa/x64/inst.isle line 1581. 2144 let expr0_0 = C::temp_writable_gpr(ctx); 2145 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 2146 let expr2_0 = MInst::AluRmiR { 2147 size: expr1_0, 2148 op: pattern1_0.clone(), 2149 src1: pattern2_0, 2150 src2: pattern3_0.clone(), 2151 dst: expr0_0, 2152 }; 2153 let expr3_0 = C::emit(ctx, &expr2_0); 2154 let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 2155 return Some(expr4_0); 2156 } 2157 2158 // Generated as internal constructor for term x64_add. 2159 pub fn constructor_x64_add<C: Context>( 2160 ctx: &mut C, 2161 arg0: Type, 2162 arg1: Gpr, 2163 arg2: &GprMemImm, 2164 ) -> Option<Gpr> { 2165 let pattern0_0 = arg0; 2166 let pattern1_0 = arg1; 2167 let pattern2_0 = arg2; 2168 // Rule at src/isa/x64/inst.isle line 1589. 2169 let expr0_0 = AluRmiROpcode::Add; 2170 let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 2171 return Some(expr1_0); 2172 } 2173 2174 // Generated as internal constructor for term x64_add_with_flags_paired. 2175 pub fn constructor_x64_add_with_flags_paired<C: Context>( 2176 ctx: &mut C, 2177 arg0: Type, 2178 arg1: Gpr, 2179 arg2: &GprMemImm, 2180 ) -> Option<ProducesFlags> { 2181 let pattern0_0 = arg0; 2182 let pattern1_0 = arg1; 2183 let pattern2_0 = arg2; 2184 // Rule at src/isa/x64/inst.isle line 1597. 2185 let expr0_0 = C::temp_writable_gpr(ctx); 2186 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 2187 let expr2_0 = AluRmiROpcode::Add; 2188 let expr3_0 = MInst::AluRmiR { 2189 size: expr1_0, 2190 op: expr2_0, 2191 src1: pattern1_0, 2192 src2: pattern2_0.clone(), 2193 dst: expr0_0, 2194 }; 2195 let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; 2196 let expr5_0 = ProducesFlags::ProducesFlagsReturnsResultWithConsumer { 2197 inst: expr3_0, 2198 result: expr4_0, 2199 }; 2200 return Some(expr5_0); 2201 } 2202 2203 // Generated as internal constructor for term x64_adc_paired. 2204 pub fn constructor_x64_adc_paired<C: Context>( 2205 ctx: &mut C, 2206 arg0: Type, 2207 arg1: Gpr, 2208 arg2: &GprMemImm, 2209 ) -> Option<ConsumesFlags> { 2210 let pattern0_0 = arg0; 2211 let pattern1_0 = arg1; 2212 let pattern2_0 = arg2; 2213 // Rule at src/isa/x64/inst.isle line 1609. 2214 let expr0_0 = C::temp_writable_gpr(ctx); 2215 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 2216 let expr2_0 = AluRmiROpcode::Adc; 2217 let expr3_0 = MInst::AluRmiR { 2218 size: expr1_0, 2219 op: expr2_0, 2220 src1: pattern1_0, 2221 src2: pattern2_0.clone(), 2222 dst: expr0_0, 2223 }; 2224 let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; 2225 let expr5_0 = ConsumesFlags::ConsumesFlagsReturnsResultWithProducer { 2226 inst: expr3_0, 2227 result: expr4_0, 2228 }; 2229 return Some(expr5_0); 2230 } 2231 2232 // Generated as internal constructor for term x64_sub. 2233 pub fn constructor_x64_sub<C: Context>( 2234 ctx: &mut C, 2235 arg0: Type, 2236 arg1: Gpr, 2237 arg2: &GprMemImm, 2238 ) -> Option<Gpr> { 2239 let pattern0_0 = arg0; 2240 let pattern1_0 = arg1; 2241 let pattern2_0 = arg2; 2242 // Rule at src/isa/x64/inst.isle line 1621. 2243 let expr0_0 = AluRmiROpcode::Sub; 2244 let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 2245 return Some(expr1_0); 2246 } 2247 2248 // Generated as internal constructor for term x64_sub_with_flags_paired. 2249 pub fn constructor_x64_sub_with_flags_paired<C: Context>( 2250 ctx: &mut C, 2251 arg0: Type, 2252 arg1: Gpr, 2253 arg2: &GprMemImm, 2254 ) -> Option<ProducesFlags> { 2255 let pattern0_0 = arg0; 2256 let pattern1_0 = arg1; 2257 let pattern2_0 = arg2; 2258 // Rule at src/isa/x64/inst.isle line 1629. 2259 let expr0_0 = C::temp_writable_gpr(ctx); 2260 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 2261 let expr2_0 = AluRmiROpcode::Sub; 2262 let expr3_0 = MInst::AluRmiR { 2263 size: expr1_0, 2264 op: expr2_0, 2265 src1: pattern1_0, 2266 src2: pattern2_0.clone(), 2267 dst: expr0_0, 2268 }; 2269 let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; 2270 let expr5_0 = ProducesFlags::ProducesFlagsReturnsResultWithConsumer { 2271 inst: expr3_0, 2272 result: expr4_0, 2273 }; 2274 return Some(expr5_0); 2275 } 2276 2277 // Generated as internal constructor for term x64_sbb_paired. 2278 pub fn constructor_x64_sbb_paired<C: Context>( 2279 ctx: &mut C, 2280 arg0: Type, 2281 arg1: Gpr, 2282 arg2: &GprMemImm, 2283 ) -> Option<ConsumesFlags> { 2284 let pattern0_0 = arg0; 2285 let pattern1_0 = arg1; 2286 let pattern2_0 = arg2; 2287 // Rule at src/isa/x64/inst.isle line 1641. 2288 let expr0_0 = C::temp_writable_gpr(ctx); 2289 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 2290 let expr2_0 = AluRmiROpcode::Sbb; 2291 let expr3_0 = MInst::AluRmiR { 2292 size: expr1_0, 2293 op: expr2_0, 2294 src1: pattern1_0, 2295 src2: pattern2_0.clone(), 2296 dst: expr0_0, 2297 }; 2298 let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; 2299 let expr5_0 = ConsumesFlags::ConsumesFlagsReturnsResultWithProducer { 2300 inst: expr3_0, 2301 result: expr4_0, 2302 }; 2303 return Some(expr5_0); 2304 } 2305 2306 // Generated as internal constructor for term x64_mul. 2307 pub fn constructor_x64_mul<C: Context>( 2308 ctx: &mut C, 2309 arg0: Type, 2310 arg1: Gpr, 2311 arg2: &GprMemImm, 2312 ) -> Option<Gpr> { 2313 let pattern0_0 = arg0; 2314 let pattern1_0 = arg1; 2315 let pattern2_0 = arg2; 2316 // Rule at src/isa/x64/inst.isle line 1653. 2317 let expr0_0 = AluRmiROpcode::Mul; 2318 let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 2319 return Some(expr1_0); 2320 } 2321 2322 // Generated as internal constructor for term x64_and. 2323 pub fn constructor_x64_and<C: Context>( 2324 ctx: &mut C, 2325 arg0: Type, 2326 arg1: Gpr, 2327 arg2: &GprMemImm, 2328 ) -> Option<Gpr> { 2329 let pattern0_0 = arg0; 2330 let pattern1_0 = arg1; 2331 let pattern2_0 = arg2; 2332 // Rule at src/isa/x64/inst.isle line 1661. 2333 let expr0_0 = AluRmiROpcode::And; 2334 let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 2335 return Some(expr1_0); 2336 } 2337 2338 // Generated as internal constructor for term x64_and_with_flags_paired. 2339 pub fn constructor_x64_and_with_flags_paired<C: Context>( 2340 ctx: &mut C, 2341 arg0: Type, 2342 arg1: Gpr, 2343 arg2: &GprMemImm, 2344 ) -> Option<ProducesFlags> { 2345 let pattern0_0 = arg0; 2346 let pattern1_0 = arg1; 2347 let pattern2_0 = arg2; 2348 // Rule at src/isa/x64/inst.isle line 1668. 2349 let expr0_0 = C::temp_writable_gpr(ctx); 2350 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 2351 let expr2_0 = AluRmiROpcode::And; 2352 let expr3_0 = MInst::AluRmiR { 2353 size: expr1_0, 2354 op: expr2_0, 2355 src1: pattern1_0, 2356 src2: pattern2_0.clone(), 2357 dst: expr0_0, 2358 }; 2359 let expr4_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr3_0 }; 2360 return Some(expr4_0); 2361 } 2362 2363 // Generated as internal constructor for term x64_or. 2364 pub fn constructor_x64_or<C: Context>( 2365 ctx: &mut C, 2366 arg0: Type, 2367 arg1: Gpr, 2368 arg2: &GprMemImm, 2369 ) -> Option<Gpr> { 2370 let pattern0_0 = arg0; 2371 let pattern1_0 = arg1; 2372 let pattern2_0 = arg2; 2373 // Rule at src/isa/x64/inst.isle line 1679. 2374 let expr0_0 = AluRmiROpcode::Or; 2375 let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 2376 return Some(expr1_0); 2377 } 2378 2379 // Generated as internal constructor for term x64_xor. 2380 pub fn constructor_x64_xor<C: Context>( 2381 ctx: &mut C, 2382 arg0: Type, 2383 arg1: Gpr, 2384 arg2: &GprMemImm, 2385 ) -> Option<Gpr> { 2386 let pattern0_0 = arg0; 2387 let pattern1_0 = arg1; 2388 let pattern2_0 = arg2; 2389 // Rule at src/isa/x64/inst.isle line 1687. 2390 let expr0_0 = AluRmiROpcode::Xor; 2391 let expr1_0 = constructor_alu_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 2392 return Some(expr1_0); 2393 } 2394 2395 // Generated as internal constructor for term imm. 2396 pub fn constructor_imm<C: Context>(ctx: &mut C, arg0: Type, arg1: u64) -> Option<Reg> { 2397 let pattern0_0 = arg0; 2398 if pattern0_0 == I64 { 2399 let pattern2_0 = arg1; 2400 if let Some(pattern3_0) = C::nonzero_u64_fits_in_u32(ctx, pattern2_0) { 2401 // Rule at src/isa/x64/inst.isle line 1727. 2402 let expr0_0 = C::temp_writable_gpr(ctx); 2403 let expr1_0 = OperandSize::Size32; 2404 let expr2_0 = MInst::Imm { 2405 dst_size: expr1_0, 2406 simm64: pattern3_0, 2407 dst: expr0_0, 2408 }; 2409 let expr3_0 = C::emit(ctx, &expr2_0); 2410 let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; 2411 return Some(expr4_0); 2412 } 2413 } 2414 if pattern0_0 == F32 { 2415 let pattern2_0 = arg1; 2416 if pattern2_0 == 0 { 2417 // Rule at src/isa/x64/inst.isle line 1756. 2418 let expr0_0 = C::temp_writable_xmm(ctx); 2419 let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 2420 let expr2_0 = SseOpcode::Xorps; 2421 let expr3_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 2422 let expr4_0 = MInst::XmmRmR { 2423 op: expr2_0, 2424 src1: expr1_0, 2425 src2: expr3_0, 2426 dst: expr0_0, 2427 }; 2428 let expr5_0 = C::emit(ctx, &expr4_0); 2429 let expr6_0 = C::xmm_to_reg(ctx, expr1_0); 2430 return Some(expr6_0); 2431 } 2432 // Rule at src/isa/x64/inst.isle line 1704. 2433 let expr0_0 = SseOpcode::Movd; 2434 let expr1_0: Type = I32; 2435 let expr2_0 = constructor_imm(ctx, expr1_0, pattern2_0)?; 2436 let expr3_0 = C::reg_to_gpr_mem(ctx, expr2_0); 2437 let expr4_0 = OperandSize::Size32; 2438 let expr5_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr3_0, &expr4_0)?; 2439 let expr6_0 = C::xmm_to_reg(ctx, expr5_0); 2440 return Some(expr6_0); 2441 } 2442 if pattern0_0 == F64 { 2443 let pattern2_0 = arg1; 2444 if pattern2_0 == 0 { 2445 // Rule at src/isa/x64/inst.isle line 1768. 2446 let expr0_0 = C::temp_writable_xmm(ctx); 2447 let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 2448 let expr2_0 = SseOpcode::Xorpd; 2449 let expr3_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 2450 let expr4_0 = MInst::XmmRmR { 2451 op: expr2_0, 2452 src1: expr1_0, 2453 src2: expr3_0, 2454 dst: expr0_0, 2455 }; 2456 let expr5_0 = C::emit(ctx, &expr4_0); 2457 let expr6_0 = C::xmm_to_reg(ctx, expr1_0); 2458 return Some(expr6_0); 2459 } 2460 // Rule at src/isa/x64/inst.isle line 1710. 2461 let expr0_0 = SseOpcode::Movq; 2462 let expr1_0: Type = I64; 2463 let expr2_0 = constructor_imm(ctx, expr1_0, pattern2_0)?; 2464 let expr3_0 = C::reg_to_gpr_mem(ctx, expr2_0); 2465 let expr4_0 = OperandSize::Size64; 2466 let expr5_0 = constructor_gpr_to_xmm(ctx, &expr0_0, &expr3_0, &expr4_0)?; 2467 let expr6_0 = C::xmm_to_reg(ctx, expr5_0); 2468 return Some(expr6_0); 2469 } 2470 if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { 2471 let pattern2_0 = arg1; 2472 if pattern2_0 == 0 { 2473 // Rule at src/isa/x64/inst.isle line 1746. 2474 let expr0_0 = C::temp_writable_xmm(ctx); 2475 let expr1_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 2476 let expr2_0 = constructor_sse_xor_op(ctx, pattern0_0)?; 2477 let expr3_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 2478 let expr4_0 = MInst::XmmRmR { 2479 op: expr2_0, 2480 src1: expr1_0, 2481 src2: expr3_0, 2482 dst: expr0_0, 2483 }; 2484 let expr5_0 = C::emit(ctx, &expr4_0); 2485 let expr6_0 = C::xmm_to_reg(ctx, expr1_0); 2486 return Some(expr6_0); 2487 } 2488 } 2489 if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { 2490 let pattern2_0 = arg1; 2491 if pattern2_0 == 0 { 2492 // Rule at src/isa/x64/inst.isle line 1733. 2493 let expr0_0 = C::temp_writable_gpr(ctx); 2494 let expr1_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 2495 let expr2_0 = C::operand_size_of_type_32_64(ctx, pattern1_0); 2496 let expr3_0 = AluRmiROpcode::Xor; 2497 let expr4_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0); 2498 let expr5_0 = MInst::AluRmiR { 2499 size: expr2_0, 2500 op: expr3_0, 2501 src1: expr1_0, 2502 src2: expr4_0, 2503 dst: expr0_0, 2504 }; 2505 let expr6_0 = C::emit(ctx, &expr5_0); 2506 let expr7_0 = C::gpr_to_reg(ctx, expr1_0); 2507 return Some(expr7_0); 2508 } 2509 // Rule at src/isa/x64/inst.isle line 1697. 2510 let expr0_0 = C::temp_writable_gpr(ctx); 2511 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern1_0); 2512 let expr2_0 = MInst::Imm { 2513 dst_size: expr1_0, 2514 simm64: pattern2_0, 2515 dst: expr0_0, 2516 }; 2517 let expr3_0 = C::emit(ctx, &expr2_0); 2518 let expr4_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; 2519 return Some(expr4_0); 2520 } 2521 return None; 2522 } 2523 2524 // Generated as internal constructor for term imm_i64. 2525 pub fn constructor_imm_i64<C: Context>(ctx: &mut C, arg0: Type, arg1: i64) -> Option<Reg> { 2526 let pattern0_0 = arg0; 2527 let pattern1_0 = arg1; 2528 // Rule at src/isa/x64/inst.isle line 1719. 2529 let expr0_0 = C::i64_as_u64(ctx, pattern1_0)?; 2530 let expr1_0 = constructor_imm(ctx, pattern0_0, expr0_0)?; 2531 return Some(expr1_0); 2532 } 2533 2534 // Generated as internal constructor for term shift_r. 2535 pub fn constructor_shift_r<C: Context>( 2536 ctx: &mut C, 2537 arg0: Type, 2538 arg1: &ShiftKind, 2539 arg2: Gpr, 2540 arg3: &Imm8Gpr, 2541 ) -> Option<Gpr> { 2542 let pattern0_0 = arg0; 2543 let pattern1_0 = arg1; 2544 let pattern2_0 = arg2; 2545 let pattern3_0 = arg3; 2546 // Rule at src/isa/x64/inst.isle line 1781. 2547 let expr0_0 = C::temp_writable_gpr(ctx); 2548 let expr1_0 = C::raw_operand_size_of_type(ctx, pattern0_0); 2549 let expr2_0 = MInst::ShiftR { 2550 size: expr1_0, 2551 kind: pattern1_0.clone(), 2552 src: pattern2_0, 2553 num_bits: pattern3_0.clone(), 2554 dst: expr0_0, 2555 }; 2556 let expr3_0 = C::emit(ctx, &expr2_0); 2557 let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 2558 return Some(expr4_0); 2559 } 2560 2561 // Generated as internal constructor for term x64_rotl. 2562 pub fn constructor_x64_rotl<C: Context>( 2563 ctx: &mut C, 2564 arg0: Type, 2565 arg1: Gpr, 2566 arg2: &Imm8Gpr, 2567 ) -> Option<Gpr> { 2568 let pattern0_0 = arg0; 2569 let pattern1_0 = arg1; 2570 let pattern2_0 = arg2; 2571 // Rule at src/isa/x64/inst.isle line 1791. 2572 let expr0_0 = ShiftKind::RotateLeft; 2573 let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 2574 return Some(expr1_0); 2575 } 2576 2577 // Generated as internal constructor for term x64_rotr. 2578 pub fn constructor_x64_rotr<C: Context>( 2579 ctx: &mut C, 2580 arg0: Type, 2581 arg1: Gpr, 2582 arg2: &Imm8Gpr, 2583 ) -> Option<Gpr> { 2584 let pattern0_0 = arg0; 2585 let pattern1_0 = arg1; 2586 let pattern2_0 = arg2; 2587 // Rule at src/isa/x64/inst.isle line 1796. 2588 let expr0_0 = ShiftKind::RotateRight; 2589 let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 2590 return Some(expr1_0); 2591 } 2592 2593 // Generated as internal constructor for term x64_shl. 2594 pub fn constructor_x64_shl<C: Context>( 2595 ctx: &mut C, 2596 arg0: Type, 2597 arg1: Gpr, 2598 arg2: &Imm8Gpr, 2599 ) -> Option<Gpr> { 2600 let pattern0_0 = arg0; 2601 let pattern1_0 = arg1; 2602 let pattern2_0 = arg2; 2603 // Rule at src/isa/x64/inst.isle line 1801. 2604 let expr0_0 = ShiftKind::ShiftLeft; 2605 let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 2606 return Some(expr1_0); 2607 } 2608 2609 // Generated as internal constructor for term x64_shr. 2610 pub fn constructor_x64_shr<C: Context>( 2611 ctx: &mut C, 2612 arg0: Type, 2613 arg1: Gpr, 2614 arg2: &Imm8Gpr, 2615 ) -> Option<Gpr> { 2616 let pattern0_0 = arg0; 2617 let pattern1_0 = arg1; 2618 let pattern2_0 = arg2; 2619 // Rule at src/isa/x64/inst.isle line 1806. 2620 let expr0_0 = ShiftKind::ShiftRightLogical; 2621 let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 2622 return Some(expr1_0); 2623 } 2624 2625 // Generated as internal constructor for term x64_sar. 2626 pub fn constructor_x64_sar<C: Context>( 2627 ctx: &mut C, 2628 arg0: Type, 2629 arg1: Gpr, 2630 arg2: &Imm8Gpr, 2631 ) -> Option<Gpr> { 2632 let pattern0_0 = arg0; 2633 let pattern1_0 = arg1; 2634 let pattern2_0 = arg2; 2635 // Rule at src/isa/x64/inst.isle line 1811. 2636 let expr0_0 = ShiftKind::ShiftRightArithmetic; 2637 let expr1_0 = constructor_shift_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 2638 return Some(expr1_0); 2639 } 2640 2641 // Generated as internal constructor for term cmp_rmi_r. 2642 pub fn constructor_cmp_rmi_r<C: Context>( 2643 ctx: &mut C, 2644 arg0: &OperandSize, 2645 arg1: &CmpOpcode, 2646 arg2: &GprMemImm, 2647 arg3: Gpr, 2648 ) -> Option<ProducesFlags> { 2649 let pattern0_0 = arg0; 2650 let pattern1_0 = arg1; 2651 let pattern2_0 = arg2; 2652 let pattern3_0 = arg3; 2653 // Rule at src/isa/x64/inst.isle line 1816. 2654 let expr0_0 = MInst::CmpRmiR { 2655 size: pattern0_0.clone(), 2656 opcode: pattern1_0.clone(), 2657 src: pattern2_0.clone(), 2658 dst: pattern3_0, 2659 }; 2660 let expr1_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr0_0 }; 2661 return Some(expr1_0); 2662 } 2663 2664 // Generated as internal constructor for term x64_cmp. 2665 pub fn constructor_x64_cmp<C: Context>( 2666 ctx: &mut C, 2667 arg0: &OperandSize, 2668 arg1: &GprMemImm, 2669 arg2: Gpr, 2670 ) -> Option<ProducesFlags> { 2671 let pattern0_0 = arg0; 2672 let pattern1_0 = arg1; 2673 let pattern2_0 = arg2; 2674 // Rule at src/isa/x64/inst.isle line 1825. 2675 let expr0_0 = CmpOpcode::Cmp; 2676 let expr1_0 = constructor_cmp_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 2677 return Some(expr1_0); 2678 } 2679 2680 // Generated as internal constructor for term x64_cmp_imm. 2681 pub fn constructor_x64_cmp_imm<C: Context>( 2682 ctx: &mut C, 2683 arg0: &OperandSize, 2684 arg1: u32, 2685 arg2: Gpr, 2686 ) -> Option<ProducesFlags> { 2687 let pattern0_0 = arg0; 2688 let pattern1_0 = arg1; 2689 let pattern2_0 = arg2; 2690 // Rule at src/isa/x64/inst.isle line 1830. 2691 let expr0_0 = CmpOpcode::Cmp; 2692 let expr1_0 = RegMemImm::Imm { simm32: pattern1_0 }; 2693 let expr2_0 = C::gpr_mem_imm_new(ctx, &expr1_0); 2694 let expr3_0 = constructor_cmp_rmi_r(ctx, pattern0_0, &expr0_0, &expr2_0, pattern2_0)?; 2695 return Some(expr3_0); 2696 } 2697 2698 // Generated as internal constructor for term xmm_cmp_rm_r. 2699 pub fn constructor_xmm_cmp_rm_r<C: Context>( 2700 ctx: &mut C, 2701 arg0: &SseOpcode, 2702 arg1: &XmmMem, 2703 arg2: Xmm, 2704 ) -> Option<ProducesFlags> { 2705 let pattern0_0 = arg0; 2706 let pattern1_0 = arg1; 2707 let pattern2_0 = arg2; 2708 // Rule at src/isa/x64/inst.isle line 1835. 2709 let expr0_0 = MInst::XmmCmpRmR { 2710 op: pattern0_0.clone(), 2711 src: pattern1_0.clone(), 2712 dst: pattern2_0, 2713 }; 2714 let expr1_0 = ProducesFlags::ProducesFlagsSideEffect { inst: expr0_0 }; 2715 return Some(expr1_0); 2716 } 2717 2718 // Generated as internal constructor for term x64_ucomis. 2719 pub fn constructor_x64_ucomis<C: Context>( 2720 ctx: &mut C, 2721 arg0: Value, 2722 arg1: Value, 2723 ) -> Option<ProducesFlags> { 2724 let pattern0_0 = arg0; 2725 let pattern1_0 = C::value_type(ctx, pattern0_0); 2726 if pattern1_0 == F32 { 2727 let pattern3_0 = arg1; 2728 // Rule at src/isa/x64/inst.isle line 1841. 2729 let expr0_0 = SseOpcode::Ucomiss; 2730 let expr1_0 = constructor_put_in_xmm(ctx, pattern0_0)?; 2731 let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 2732 let expr3_0 = constructor_put_in_xmm(ctx, pattern3_0)?; 2733 let expr4_0 = constructor_xmm_cmp_rm_r(ctx, &expr0_0, &expr2_0, expr3_0)?; 2734 return Some(expr4_0); 2735 } 2736 if pattern1_0 == F64 { 2737 let pattern3_0 = arg1; 2738 // Rule at src/isa/x64/inst.isle line 1845. 2739 let expr0_0 = SseOpcode::Ucomisd; 2740 let expr1_0 = constructor_put_in_xmm(ctx, pattern0_0)?; 2741 let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 2742 let expr3_0 = constructor_put_in_xmm(ctx, pattern3_0)?; 2743 let expr4_0 = constructor_xmm_cmp_rm_r(ctx, &expr0_0, &expr2_0, expr3_0)?; 2744 return Some(expr4_0); 2745 } 2746 return None; 2747 } 2748 2749 // Generated as internal constructor for term x64_test. 2750 pub fn constructor_x64_test<C: Context>( 2751 ctx: &mut C, 2752 arg0: &OperandSize, 2753 arg1: &GprMemImm, 2754 arg2: Gpr, 2755 ) -> Option<ProducesFlags> { 2756 let pattern0_0 = arg0; 2757 let pattern1_0 = arg1; 2758 let pattern2_0 = arg2; 2759 // Rule at src/isa/x64/inst.isle line 1850. 2760 let expr0_0 = CmpOpcode::Test; 2761 let expr1_0 = constructor_cmp_rmi_r(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 2762 return Some(expr1_0); 2763 } 2764 2765 // Generated as internal constructor for term cmove. 2766 pub fn constructor_cmove<C: Context>( 2767 ctx: &mut C, 2768 arg0: Type, 2769 arg1: &CC, 2770 arg2: &GprMem, 2771 arg3: Gpr, 2772 ) -> Option<ConsumesFlags> { 2773 let pattern0_0 = arg0; 2774 let pattern1_0 = arg1; 2775 let pattern2_0 = arg2; 2776 let pattern3_0 = arg3; 2777 // Rule at src/isa/x64/inst.isle line 1857. 2778 let expr0_0 = C::temp_writable_gpr(ctx); 2779 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 2780 let expr2_0 = MInst::Cmove { 2781 size: expr1_0, 2782 cc: pattern1_0.clone(), 2783 consequent: pattern2_0.clone(), 2784 alternative: pattern3_0, 2785 dst: expr0_0, 2786 }; 2787 let expr3_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; 2788 let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsReg { 2789 inst: expr2_0, 2790 result: expr3_0, 2791 }; 2792 return Some(expr4_0); 2793 } 2794 2795 // Generated as internal constructor for term cmove_xmm. 2796 pub fn constructor_cmove_xmm<C: Context>( 2797 ctx: &mut C, 2798 arg0: Type, 2799 arg1: &CC, 2800 arg2: &XmmMem, 2801 arg3: Xmm, 2802 ) -> Option<ConsumesFlags> { 2803 let pattern0_0 = arg0; 2804 let pattern1_0 = arg1; 2805 let pattern2_0 = arg2; 2806 let pattern3_0 = arg3; 2807 // Rule at src/isa/x64/inst.isle line 1865. 2808 let expr0_0 = C::temp_writable_xmm(ctx); 2809 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 2810 let expr2_0 = MInst::XmmCmove { 2811 size: expr1_0, 2812 cc: pattern1_0.clone(), 2813 consequent: pattern2_0.clone(), 2814 alternative: pattern3_0, 2815 dst: expr0_0, 2816 }; 2817 let expr3_0 = constructor_writable_xmm_to_r_reg(ctx, expr0_0)?; 2818 let expr4_0 = ConsumesFlags::ConsumesFlagsReturnsReg { 2819 inst: expr2_0, 2820 result: expr3_0, 2821 }; 2822 return Some(expr4_0); 2823 } 2824 2825 // Generated as internal constructor for term cmove_from_values. 2826 pub fn constructor_cmove_from_values<C: Context>( 2827 ctx: &mut C, 2828 arg0: Type, 2829 arg1: &CC, 2830 arg2: Value, 2831 arg3: Value, 2832 ) -> Option<ConsumesFlags> { 2833 let pattern0_0 = arg0; 2834 if pattern0_0 == I128 { 2835 let pattern2_0 = arg1; 2836 let pattern3_0 = arg2; 2837 let pattern4_0 = arg3; 2838 // Rule at src/isa/x64/inst.isle line 1876. 2839 let expr0_0 = C::put_in_regs(ctx, pattern3_0); 2840 let expr1_0 = C::put_in_regs(ctx, pattern4_0); 2841 let expr2_0 = C::temp_writable_gpr(ctx); 2842 let expr3_0 = C::temp_writable_gpr(ctx); 2843 let expr4_0 = OperandSize::Size64; 2844 let expr5_0: usize = 0; 2845 let expr6_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr5_0)?; 2846 let expr7_0 = C::gpr_to_gpr_mem(ctx, expr6_0); 2847 let expr8_0: usize = 0; 2848 let expr9_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr8_0)?; 2849 let expr10_0 = MInst::Cmove { 2850 size: expr4_0, 2851 cc: pattern2_0.clone(), 2852 consequent: expr7_0, 2853 alternative: expr9_0, 2854 dst: expr2_0, 2855 }; 2856 let expr11_0: usize = 1; 2857 let expr12_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr11_0)?; 2858 let expr13_0 = C::gpr_to_gpr_mem(ctx, expr12_0); 2859 let expr14_0: usize = 1; 2860 let expr15_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr14_0)?; 2861 let expr16_0 = MInst::Cmove { 2862 size: expr4_0, 2863 cc: pattern2_0.clone(), 2864 consequent: expr13_0, 2865 alternative: expr15_0, 2866 dst: expr3_0, 2867 }; 2868 let expr17_0 = constructor_writable_gpr_to_r_reg(ctx, expr2_0)?; 2869 let expr18_0 = constructor_writable_gpr_to_r_reg(ctx, expr3_0)?; 2870 let expr19_0 = C::value_regs(ctx, expr17_0, expr18_0); 2871 let expr20_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { 2872 inst1: expr10_0, 2873 inst2: expr16_0, 2874 result: expr19_0, 2875 }; 2876 return Some(expr20_0); 2877 } 2878 if let Some(pattern1_0) = C::is_xmm_type(ctx, pattern0_0) { 2879 if let Some(pattern2_0) = C::is_single_register_type(ctx, pattern1_0) { 2880 let pattern3_0 = arg1; 2881 let pattern4_0 = arg2; 2882 let pattern5_0 = arg3; 2883 // Rule at src/isa/x64/inst.isle line 1900. 2884 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?; 2885 let expr1_0 = constructor_put_in_xmm(ctx, pattern5_0)?; 2886 let expr2_0 = constructor_cmove_xmm(ctx, pattern2_0, pattern3_0, &expr0_0, expr1_0)?; 2887 return Some(expr2_0); 2888 } 2889 } 2890 if let Some(pattern1_0) = C::is_gpr_type(ctx, pattern0_0) { 2891 if let Some(pattern2_0) = C::is_single_register_type(ctx, pattern1_0) { 2892 let pattern3_0 = arg1; 2893 let pattern4_0 = arg2; 2894 let pattern5_0 = arg3; 2895 // Rule at src/isa/x64/inst.isle line 1897. 2896 let expr0_0 = constructor_put_in_gpr_mem(ctx, pattern4_0)?; 2897 let expr1_0 = constructor_put_in_gpr(ctx, pattern5_0)?; 2898 let expr2_0 = constructor_cmove(ctx, pattern2_0, pattern3_0, &expr0_0, expr1_0)?; 2899 return Some(expr2_0); 2900 } 2901 } 2902 return None; 2903 } 2904 2905 // Generated as internal constructor for term cmove_or. 2906 pub fn constructor_cmove_or<C: Context>( 2907 ctx: &mut C, 2908 arg0: Type, 2909 arg1: &CC, 2910 arg2: &CC, 2911 arg3: &GprMem, 2912 arg4: Gpr, 2913 ) -> Option<ConsumesFlags> { 2914 let pattern0_0 = arg0; 2915 let pattern1_0 = arg1; 2916 let pattern2_0 = arg2; 2917 let pattern3_0 = arg3; 2918 let pattern4_0 = arg4; 2919 // Rule at src/isa/x64/inst.isle line 1907. 2920 let expr0_0 = C::temp_writable_gpr(ctx); 2921 let expr1_0 = C::temp_writable_gpr(ctx); 2922 let expr2_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 2923 let expr3_0 = MInst::Cmove { 2924 size: expr2_0, 2925 cc: pattern1_0.clone(), 2926 consequent: pattern3_0.clone(), 2927 alternative: pattern4_0, 2928 dst: expr1_0, 2929 }; 2930 let expr4_0 = C::writable_gpr_to_gpr(ctx, expr1_0); 2931 let expr5_0 = MInst::Cmove { 2932 size: expr2_0, 2933 cc: pattern2_0.clone(), 2934 consequent: pattern3_0.clone(), 2935 alternative: expr4_0, 2936 dst: expr0_0, 2937 }; 2938 let expr6_0 = constructor_writable_gpr_to_value_regs(ctx, expr0_0)?; 2939 let expr7_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { 2940 inst1: expr3_0, 2941 inst2: expr5_0, 2942 result: expr6_0, 2943 }; 2944 return Some(expr7_0); 2945 } 2946 2947 // Generated as internal constructor for term cmove_or_xmm. 2948 pub fn constructor_cmove_or_xmm<C: Context>( 2949 ctx: &mut C, 2950 arg0: Type, 2951 arg1: &CC, 2952 arg2: &CC, 2953 arg3: &XmmMem, 2954 arg4: Xmm, 2955 ) -> Option<ConsumesFlags> { 2956 let pattern0_0 = arg0; 2957 let pattern1_0 = arg1; 2958 let pattern2_0 = arg2; 2959 let pattern3_0 = arg3; 2960 let pattern4_0 = arg4; 2961 // Rule at src/isa/x64/inst.isle line 1919. 2962 let expr0_0 = C::temp_writable_xmm(ctx); 2963 let expr1_0 = C::temp_writable_xmm(ctx); 2964 let expr2_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 2965 let expr3_0 = MInst::XmmCmove { 2966 size: expr2_0, 2967 cc: pattern1_0.clone(), 2968 consequent: pattern3_0.clone(), 2969 alternative: pattern4_0, 2970 dst: expr1_0, 2971 }; 2972 let expr4_0 = C::writable_xmm_to_xmm(ctx, expr1_0); 2973 let expr5_0 = MInst::XmmCmove { 2974 size: expr2_0, 2975 cc: pattern2_0.clone(), 2976 consequent: pattern3_0.clone(), 2977 alternative: expr4_0, 2978 dst: expr0_0, 2979 }; 2980 let expr6_0 = constructor_writable_xmm_to_value_regs(ctx, expr0_0)?; 2981 let expr7_0 = ConsumesFlags::ConsumesFlagsTwiceReturnsValueRegs { 2982 inst1: expr3_0, 2983 inst2: expr5_0, 2984 result: expr6_0, 2985 }; 2986 return Some(expr7_0); 2987 } 2988 2989 // Generated as internal constructor for term cmove_or_from_values. 2990 pub fn constructor_cmove_or_from_values<C: Context>( 2991 ctx: &mut C, 2992 arg0: Type, 2993 arg1: &CC, 2994 arg2: &CC, 2995 arg3: Value, 2996 arg4: Value, 2997 ) -> Option<ConsumesFlags> { 2998 let pattern0_0 = arg0; 2999 if pattern0_0 == I128 { 3000 let pattern2_0 = arg1; 3001 let pattern3_0 = arg2; 3002 let pattern4_0 = arg3; 3003 let pattern5_0 = arg4; 3004 // Rule at src/isa/x64/inst.isle line 1934. 3005 let expr0_0 = C::put_in_regs(ctx, pattern4_0); 3006 let expr1_0 = C::put_in_regs(ctx, pattern5_0); 3007 let expr2_0 = C::temp_writable_gpr(ctx); 3008 let expr3_0 = C::temp_writable_gpr(ctx); 3009 let expr4_0 = C::temp_writable_gpr(ctx); 3010 let expr5_0 = C::temp_writable_gpr(ctx); 3011 let expr6_0 = OperandSize::Size64; 3012 let expr7_0: usize = 0; 3013 let expr8_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr7_0)?; 3014 let expr9_0 = C::gpr_to_gpr_mem(ctx, expr8_0); 3015 let expr10_0: usize = 0; 3016 let expr11_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr10_0)?; 3017 let expr12_0 = MInst::Cmove { 3018 size: expr6_0, 3019 cc: pattern2_0.clone(), 3020 consequent: expr9_0, 3021 alternative: expr11_0, 3022 dst: expr4_0, 3023 }; 3024 let expr13_0: usize = 0; 3025 let expr14_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr13_0)?; 3026 let expr15_0 = C::gpr_to_gpr_mem(ctx, expr14_0); 3027 let expr16_0 = C::writable_gpr_to_gpr(ctx, expr4_0); 3028 let expr17_0 = MInst::Cmove { 3029 size: expr6_0, 3030 cc: pattern3_0.clone(), 3031 consequent: expr15_0, 3032 alternative: expr16_0, 3033 dst: expr2_0, 3034 }; 3035 let expr18_0: usize = 1; 3036 let expr19_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr18_0)?; 3037 let expr20_0 = C::gpr_to_gpr_mem(ctx, expr19_0); 3038 let expr21_0: usize = 1; 3039 let expr22_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr21_0)?; 3040 let expr23_0 = MInst::Cmove { 3041 size: expr6_0, 3042 cc: pattern2_0.clone(), 3043 consequent: expr20_0, 3044 alternative: expr22_0, 3045 dst: expr5_0, 3046 }; 3047 let expr24_0: usize = 1; 3048 let expr25_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr24_0)?; 3049 let expr26_0 = C::gpr_to_gpr_mem(ctx, expr25_0); 3050 let expr27_0 = C::writable_gpr_to_gpr(ctx, expr5_0); 3051 let expr28_0 = MInst::Cmove { 3052 size: expr6_0, 3053 cc: pattern3_0.clone(), 3054 consequent: expr26_0, 3055 alternative: expr27_0, 3056 dst: expr3_0, 3057 }; 3058 let expr29_0 = constructor_writable_gpr_to_r_reg(ctx, expr2_0)?; 3059 let expr30_0 = constructor_writable_gpr_to_r_reg(ctx, expr3_0)?; 3060 let expr31_0 = C::value_regs(ctx, expr29_0, expr30_0); 3061 let expr32_0 = ConsumesFlags::ConsumesFlagsFourTimesReturnsValueRegs { 3062 inst1: expr12_0, 3063 inst2: expr17_0, 3064 inst3: expr23_0, 3065 inst4: expr28_0, 3066 result: expr31_0, 3067 }; 3068 return Some(expr32_0); 3069 } 3070 if let Some(pattern1_0) = C::is_xmm_type(ctx, pattern0_0) { 3071 if let Some(pattern2_0) = C::is_single_register_type(ctx, pattern1_0) { 3072 let pattern3_0 = arg1; 3073 let pattern4_0 = arg2; 3074 let pattern5_0 = arg3; 3075 let pattern6_0 = arg4; 3076 // Rule at src/isa/x64/inst.isle line 1956. 3077 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_0)?; 3078 let expr1_0 = constructor_put_in_xmm(ctx, pattern6_0)?; 3079 let expr2_0 = constructor_cmove_or_xmm( 3080 ctx, pattern2_0, pattern3_0, pattern4_0, &expr0_0, expr1_0, 3081 )?; 3082 return Some(expr2_0); 3083 } 3084 } 3085 if let Some(pattern1_0) = C::is_gpr_type(ctx, pattern0_0) { 3086 if let Some(pattern2_0) = C::is_single_register_type(ctx, pattern1_0) { 3087 let pattern3_0 = arg1; 3088 let pattern4_0 = arg2; 3089 let pattern5_0 = arg3; 3090 let pattern6_0 = arg4; 3091 // Rule at src/isa/x64/inst.isle line 1953. 3092 let expr0_0 = constructor_put_in_gpr_mem(ctx, pattern5_0)?; 3093 let expr1_0 = constructor_put_in_gpr(ctx, pattern6_0)?; 3094 let expr2_0 = 3095 constructor_cmove_or(ctx, pattern2_0, pattern3_0, pattern4_0, &expr0_0, expr1_0)?; 3096 return Some(expr2_0); 3097 } 3098 } 3099 return None; 3100 } 3101 3102 // Generated as internal constructor for term x64_setcc. 3103 pub fn constructor_x64_setcc<C: Context>(ctx: &mut C, arg0: &CC) -> Option<ConsumesFlags> { 3104 let pattern0_0 = arg0; 3105 // Rule at src/isa/x64/inst.isle line 1961. 3106 let expr0_0 = C::temp_writable_gpr(ctx); 3107 let expr1_0 = MInst::Setcc { 3108 cc: pattern0_0.clone(), 3109 dst: expr0_0, 3110 }; 3111 let expr2_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; 3112 let expr3_0 = ConsumesFlags::ConsumesFlagsReturnsReg { 3113 inst: expr1_0, 3114 result: expr2_0, 3115 }; 3116 return Some(expr3_0); 3117 } 3118 3119 // Generated as internal constructor for term xmm_rm_r. 3120 pub fn constructor_xmm_rm_r<C: Context>( 3121 ctx: &mut C, 3122 arg0: Type, 3123 arg1: &SseOpcode, 3124 arg2: Xmm, 3125 arg3: &XmmMem, 3126 ) -> Option<Xmm> { 3127 let pattern0_0 = arg0; 3128 let pattern1_0 = arg1; 3129 let pattern2_0 = arg2; 3130 let pattern3_0 = arg3; 3131 // Rule at src/isa/x64/inst.isle line 1969. 3132 let expr0_0 = C::temp_writable_xmm(ctx); 3133 let expr1_0 = MInst::XmmRmR { 3134 op: pattern1_0.clone(), 3135 src1: pattern2_0, 3136 src2: pattern3_0.clone(), 3137 dst: expr0_0, 3138 }; 3139 let expr2_0 = C::emit(ctx, &expr1_0); 3140 let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 3141 return Some(expr3_0); 3142 } 3143 3144 // Generated as internal constructor for term x64_paddb. 3145 pub fn constructor_x64_paddb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3146 let pattern0_0 = arg0; 3147 let pattern1_0 = arg1; 3148 // Rule at src/isa/x64/inst.isle line 1976. 3149 let expr0_0: Type = I8X16; 3150 let expr1_0 = SseOpcode::Paddb; 3151 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3152 return Some(expr2_0); 3153 } 3154 3155 // Generated as internal constructor for term x64_paddw. 3156 pub fn constructor_x64_paddw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3157 let pattern0_0 = arg0; 3158 let pattern1_0 = arg1; 3159 // Rule at src/isa/x64/inst.isle line 1981. 3160 let expr0_0: Type = I16X8; 3161 let expr1_0 = SseOpcode::Paddw; 3162 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3163 return Some(expr2_0); 3164 } 3165 3166 // Generated as internal constructor for term x64_paddd. 3167 pub fn constructor_x64_paddd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3168 let pattern0_0 = arg0; 3169 let pattern1_0 = arg1; 3170 // Rule at src/isa/x64/inst.isle line 1986. 3171 let expr0_0: Type = I32X4; 3172 let expr1_0 = SseOpcode::Paddd; 3173 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3174 return Some(expr2_0); 3175 } 3176 3177 // Generated as internal constructor for term x64_paddq. 3178 pub fn constructor_x64_paddq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3179 let pattern0_0 = arg0; 3180 let pattern1_0 = arg1; 3181 // Rule at src/isa/x64/inst.isle line 1991. 3182 let expr0_0: Type = I64X2; 3183 let expr1_0 = SseOpcode::Paddq; 3184 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3185 return Some(expr2_0); 3186 } 3187 3188 // Generated as internal constructor for term x64_paddsb. 3189 pub fn constructor_x64_paddsb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3190 let pattern0_0 = arg0; 3191 let pattern1_0 = arg1; 3192 // Rule at src/isa/x64/inst.isle line 1996. 3193 let expr0_0: Type = I8X16; 3194 let expr1_0 = SseOpcode::Paddsb; 3195 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3196 return Some(expr2_0); 3197 } 3198 3199 // Generated as internal constructor for term x64_paddsw. 3200 pub fn constructor_x64_paddsw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3201 let pattern0_0 = arg0; 3202 let pattern1_0 = arg1; 3203 // Rule at src/isa/x64/inst.isle line 2001. 3204 let expr0_0: Type = I16X8; 3205 let expr1_0 = SseOpcode::Paddsw; 3206 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3207 return Some(expr2_0); 3208 } 3209 3210 // Generated as internal constructor for term x64_paddusb. 3211 pub fn constructor_x64_paddusb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3212 let pattern0_0 = arg0; 3213 let pattern1_0 = arg1; 3214 // Rule at src/isa/x64/inst.isle line 2006. 3215 let expr0_0: Type = I8X16; 3216 let expr1_0 = SseOpcode::Paddusb; 3217 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3218 return Some(expr2_0); 3219 } 3220 3221 // Generated as internal constructor for term x64_paddusw. 3222 pub fn constructor_x64_paddusw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3223 let pattern0_0 = arg0; 3224 let pattern1_0 = arg1; 3225 // Rule at src/isa/x64/inst.isle line 2011. 3226 let expr0_0: Type = I16X8; 3227 let expr1_0 = SseOpcode::Paddusw; 3228 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3229 return Some(expr2_0); 3230 } 3231 3232 // Generated as internal constructor for term x64_psubb. 3233 pub fn constructor_x64_psubb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3234 let pattern0_0 = arg0; 3235 let pattern1_0 = arg1; 3236 // Rule at src/isa/x64/inst.isle line 2016. 3237 let expr0_0: Type = I8X16; 3238 let expr1_0 = SseOpcode::Psubb; 3239 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3240 return Some(expr2_0); 3241 } 3242 3243 // Generated as internal constructor for term x64_psubw. 3244 pub fn constructor_x64_psubw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3245 let pattern0_0 = arg0; 3246 let pattern1_0 = arg1; 3247 // Rule at src/isa/x64/inst.isle line 2021. 3248 let expr0_0: Type = I16X8; 3249 let expr1_0 = SseOpcode::Psubw; 3250 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3251 return Some(expr2_0); 3252 } 3253 3254 // Generated as internal constructor for term x64_psubd. 3255 pub fn constructor_x64_psubd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3256 let pattern0_0 = arg0; 3257 let pattern1_0 = arg1; 3258 // Rule at src/isa/x64/inst.isle line 2026. 3259 let expr0_0: Type = I32X4; 3260 let expr1_0 = SseOpcode::Psubd; 3261 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3262 return Some(expr2_0); 3263 } 3264 3265 // Generated as internal constructor for term x64_psubq. 3266 pub fn constructor_x64_psubq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3267 let pattern0_0 = arg0; 3268 let pattern1_0 = arg1; 3269 // Rule at src/isa/x64/inst.isle line 2031. 3270 let expr0_0: Type = I64X2; 3271 let expr1_0 = SseOpcode::Psubq; 3272 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3273 return Some(expr2_0); 3274 } 3275 3276 // Generated as internal constructor for term x64_psubsb. 3277 pub fn constructor_x64_psubsb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3278 let pattern0_0 = arg0; 3279 let pattern1_0 = arg1; 3280 // Rule at src/isa/x64/inst.isle line 2036. 3281 let expr0_0: Type = I8X16; 3282 let expr1_0 = SseOpcode::Psubsb; 3283 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3284 return Some(expr2_0); 3285 } 3286 3287 // Generated as internal constructor for term x64_psubsw. 3288 pub fn constructor_x64_psubsw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3289 let pattern0_0 = arg0; 3290 let pattern1_0 = arg1; 3291 // Rule at src/isa/x64/inst.isle line 2041. 3292 let expr0_0: Type = I16X8; 3293 let expr1_0 = SseOpcode::Psubsw; 3294 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3295 return Some(expr2_0); 3296 } 3297 3298 // Generated as internal constructor for term x64_psubusb. 3299 pub fn constructor_x64_psubusb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3300 let pattern0_0 = arg0; 3301 let pattern1_0 = arg1; 3302 // Rule at src/isa/x64/inst.isle line 2046. 3303 let expr0_0: Type = I8X16; 3304 let expr1_0 = SseOpcode::Psubusb; 3305 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3306 return Some(expr2_0); 3307 } 3308 3309 // Generated as internal constructor for term x64_psubusw. 3310 pub fn constructor_x64_psubusw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3311 let pattern0_0 = arg0; 3312 let pattern1_0 = arg1; 3313 // Rule at src/isa/x64/inst.isle line 2051. 3314 let expr0_0: Type = I16X8; 3315 let expr1_0 = SseOpcode::Psubusw; 3316 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3317 return Some(expr2_0); 3318 } 3319 3320 // Generated as internal constructor for term x64_pavgb. 3321 pub fn constructor_x64_pavgb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3322 let pattern0_0 = arg0; 3323 let pattern1_0 = arg1; 3324 // Rule at src/isa/x64/inst.isle line 2056. 3325 let expr0_0: Type = I8X16; 3326 let expr1_0 = SseOpcode::Pavgb; 3327 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3328 return Some(expr2_0); 3329 } 3330 3331 // Generated as internal constructor for term x64_pavgw. 3332 pub fn constructor_x64_pavgw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3333 let pattern0_0 = arg0; 3334 let pattern1_0 = arg1; 3335 // Rule at src/isa/x64/inst.isle line 2061. 3336 let expr0_0: Type = I16X8; 3337 let expr1_0 = SseOpcode::Pavgw; 3338 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3339 return Some(expr2_0); 3340 } 3341 3342 // Generated as internal constructor for term x64_pand. 3343 pub fn constructor_x64_pand<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3344 let pattern0_0 = arg0; 3345 let pattern1_0 = arg1; 3346 // Rule at src/isa/x64/inst.isle line 2066. 3347 let expr0_0: Type = F32X4; 3348 let expr1_0 = SseOpcode::Pand; 3349 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3350 return Some(expr2_0); 3351 } 3352 3353 // Generated as internal constructor for term x64_andps. 3354 pub fn constructor_x64_andps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3355 let pattern0_0 = arg0; 3356 let pattern1_0 = arg1; 3357 // Rule at src/isa/x64/inst.isle line 2071. 3358 let expr0_0: Type = F32X4; 3359 let expr1_0 = SseOpcode::Andps; 3360 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3361 return Some(expr2_0); 3362 } 3363 3364 // Generated as internal constructor for term x64_andpd. 3365 pub fn constructor_x64_andpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3366 let pattern0_0 = arg0; 3367 let pattern1_0 = arg1; 3368 // Rule at src/isa/x64/inst.isle line 2076. 3369 let expr0_0: Type = F64X2; 3370 let expr1_0 = SseOpcode::Andpd; 3371 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3372 return Some(expr2_0); 3373 } 3374 3375 // Generated as internal constructor for term x64_por. 3376 pub fn constructor_x64_por<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3377 let pattern0_0 = arg0; 3378 let pattern1_0 = arg1; 3379 // Rule at src/isa/x64/inst.isle line 2081. 3380 let expr0_0: Type = F32X4; 3381 let expr1_0 = SseOpcode::Por; 3382 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3383 return Some(expr2_0); 3384 } 3385 3386 // Generated as internal constructor for term x64_orps. 3387 pub fn constructor_x64_orps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3388 let pattern0_0 = arg0; 3389 let pattern1_0 = arg1; 3390 // Rule at src/isa/x64/inst.isle line 2086. 3391 let expr0_0: Type = F32X4; 3392 let expr1_0 = SseOpcode::Orps; 3393 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3394 return Some(expr2_0); 3395 } 3396 3397 // Generated as internal constructor for term x64_orpd. 3398 pub fn constructor_x64_orpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3399 let pattern0_0 = arg0; 3400 let pattern1_0 = arg1; 3401 // Rule at src/isa/x64/inst.isle line 2091. 3402 let expr0_0: Type = F64X2; 3403 let expr1_0 = SseOpcode::Orpd; 3404 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3405 return Some(expr2_0); 3406 } 3407 3408 // Generated as internal constructor for term x64_pxor. 3409 pub fn constructor_x64_pxor<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3410 let pattern0_0 = arg0; 3411 let pattern1_0 = arg1; 3412 // Rule at src/isa/x64/inst.isle line 2096. 3413 let expr0_0: Type = I8X16; 3414 let expr1_0 = SseOpcode::Pxor; 3415 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3416 return Some(expr2_0); 3417 } 3418 3419 // Generated as internal constructor for term x64_xorps. 3420 pub fn constructor_x64_xorps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3421 let pattern0_0 = arg0; 3422 let pattern1_0 = arg1; 3423 // Rule at src/isa/x64/inst.isle line 2101. 3424 let expr0_0: Type = F32X4; 3425 let expr1_0 = SseOpcode::Xorps; 3426 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3427 return Some(expr2_0); 3428 } 3429 3430 // Generated as internal constructor for term x64_xorpd. 3431 pub fn constructor_x64_xorpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3432 let pattern0_0 = arg0; 3433 let pattern1_0 = arg1; 3434 // Rule at src/isa/x64/inst.isle line 2106. 3435 let expr0_0: Type = F64X2; 3436 let expr1_0 = SseOpcode::Xorpd; 3437 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3438 return Some(expr2_0); 3439 } 3440 3441 // Generated as internal constructor for term x64_pmullw. 3442 pub fn constructor_x64_pmullw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3443 let pattern0_0 = arg0; 3444 let pattern1_0 = arg1; 3445 // Rule at src/isa/x64/inst.isle line 2111. 3446 let expr0_0: Type = I16X8; 3447 let expr1_0 = SseOpcode::Pmullw; 3448 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3449 return Some(expr2_0); 3450 } 3451 3452 // Generated as internal constructor for term x64_pmulld. 3453 pub fn constructor_x64_pmulld<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3454 let pattern0_0 = arg0; 3455 let pattern1_0 = arg1; 3456 // Rule at src/isa/x64/inst.isle line 2116. 3457 let expr0_0: Type = I16X8; 3458 let expr1_0 = SseOpcode::Pmulld; 3459 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3460 return Some(expr2_0); 3461 } 3462 3463 // Generated as internal constructor for term x64_pmulhw. 3464 pub fn constructor_x64_pmulhw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3465 let pattern0_0 = arg0; 3466 let pattern1_0 = arg1; 3467 // Rule at src/isa/x64/inst.isle line 2121. 3468 let expr0_0: Type = I16X8; 3469 let expr1_0 = SseOpcode::Pmulhw; 3470 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3471 return Some(expr2_0); 3472 } 3473 3474 // Generated as internal constructor for term x64_pmulhuw. 3475 pub fn constructor_x64_pmulhuw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3476 let pattern0_0 = arg0; 3477 let pattern1_0 = arg1; 3478 // Rule at src/isa/x64/inst.isle line 2126. 3479 let expr0_0: Type = I16X8; 3480 let expr1_0 = SseOpcode::Pmulhuw; 3481 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3482 return Some(expr2_0); 3483 } 3484 3485 // Generated as internal constructor for term x64_pmuldq. 3486 pub fn constructor_x64_pmuldq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3487 let pattern0_0 = arg0; 3488 let pattern1_0 = arg1; 3489 // Rule at src/isa/x64/inst.isle line 2131. 3490 let expr0_0: Type = I16X8; 3491 let expr1_0 = SseOpcode::Pmuldq; 3492 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3493 return Some(expr2_0); 3494 } 3495 3496 // Generated as internal constructor for term x64_pmuludq. 3497 pub fn constructor_x64_pmuludq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3498 let pattern0_0 = arg0; 3499 let pattern1_0 = arg1; 3500 // Rule at src/isa/x64/inst.isle line 2136. 3501 let expr0_0: Type = I64X2; 3502 let expr1_0 = SseOpcode::Pmuludq; 3503 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3504 return Some(expr2_0); 3505 } 3506 3507 // Generated as internal constructor for term x64_punpckhwd. 3508 pub fn constructor_x64_punpckhwd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3509 let pattern0_0 = arg0; 3510 let pattern1_0 = arg1; 3511 // Rule at src/isa/x64/inst.isle line 2141. 3512 let expr0_0: Type = I16X8; 3513 let expr1_0 = SseOpcode::Punpckhwd; 3514 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3515 return Some(expr2_0); 3516 } 3517 3518 // Generated as internal constructor for term x64_punpcklwd. 3519 pub fn constructor_x64_punpcklwd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3520 let pattern0_0 = arg0; 3521 let pattern1_0 = arg1; 3522 // Rule at src/isa/x64/inst.isle line 2146. 3523 let expr0_0: Type = I16X8; 3524 let expr1_0 = SseOpcode::Punpcklwd; 3525 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3526 return Some(expr2_0); 3527 } 3528 3529 // Generated as internal constructor for term x64_andnps. 3530 pub fn constructor_x64_andnps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3531 let pattern0_0 = arg0; 3532 let pattern1_0 = arg1; 3533 // Rule at src/isa/x64/inst.isle line 2151. 3534 let expr0_0: Type = F32X4; 3535 let expr1_0 = SseOpcode::Andnps; 3536 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3537 return Some(expr2_0); 3538 } 3539 3540 // Generated as internal constructor for term x64_andnpd. 3541 pub fn constructor_x64_andnpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3542 let pattern0_0 = arg0; 3543 let pattern1_0 = arg1; 3544 // Rule at src/isa/x64/inst.isle line 2156. 3545 let expr0_0: Type = F64X2; 3546 let expr1_0 = SseOpcode::Andnpd; 3547 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3548 return Some(expr2_0); 3549 } 3550 3551 // Generated as internal constructor for term x64_pandn. 3552 pub fn constructor_x64_pandn<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3553 let pattern0_0 = arg0; 3554 let pattern1_0 = arg1; 3555 // Rule at src/isa/x64/inst.isle line 2161. 3556 let expr0_0: Type = F64X2; 3557 let expr1_0 = SseOpcode::Pandn; 3558 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3559 return Some(expr2_0); 3560 } 3561 3562 // Generated as internal constructor for term x64_addss. 3563 pub fn constructor_x64_addss<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3564 let pattern0_0 = arg0; 3565 let pattern1_0 = arg1; 3566 // Rule at src/isa/x64/inst.isle line 2166. 3567 let expr0_0: Type = F32; 3568 let expr1_0 = SseOpcode::Addss; 3569 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3570 return Some(expr2_0); 3571 } 3572 3573 // Generated as internal constructor for term x64_addsd. 3574 pub fn constructor_x64_addsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3575 let pattern0_0 = arg0; 3576 let pattern1_0 = arg1; 3577 // Rule at src/isa/x64/inst.isle line 2171. 3578 let expr0_0: Type = F64; 3579 let expr1_0 = SseOpcode::Addsd; 3580 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3581 return Some(expr2_0); 3582 } 3583 3584 // Generated as internal constructor for term x64_addps. 3585 pub fn constructor_x64_addps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3586 let pattern0_0 = arg0; 3587 let pattern1_0 = arg1; 3588 // Rule at src/isa/x64/inst.isle line 2176. 3589 let expr0_0: Type = F32; 3590 let expr1_0 = SseOpcode::Addps; 3591 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3592 return Some(expr2_0); 3593 } 3594 3595 // Generated as internal constructor for term x64_addpd. 3596 pub fn constructor_x64_addpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3597 let pattern0_0 = arg0; 3598 let pattern1_0 = arg1; 3599 // Rule at src/isa/x64/inst.isle line 2181. 3600 let expr0_0: Type = F32; 3601 let expr1_0 = SseOpcode::Addpd; 3602 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3603 return Some(expr2_0); 3604 } 3605 3606 // Generated as internal constructor for term x64_subss. 3607 pub fn constructor_x64_subss<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3608 let pattern0_0 = arg0; 3609 let pattern1_0 = arg1; 3610 // Rule at src/isa/x64/inst.isle line 2186. 3611 let expr0_0: Type = F32; 3612 let expr1_0 = SseOpcode::Subss; 3613 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3614 return Some(expr2_0); 3615 } 3616 3617 // Generated as internal constructor for term x64_subsd. 3618 pub fn constructor_x64_subsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3619 let pattern0_0 = arg0; 3620 let pattern1_0 = arg1; 3621 // Rule at src/isa/x64/inst.isle line 2191. 3622 let expr0_0: Type = F64; 3623 let expr1_0 = SseOpcode::Subsd; 3624 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3625 return Some(expr2_0); 3626 } 3627 3628 // Generated as internal constructor for term x64_subps. 3629 pub fn constructor_x64_subps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3630 let pattern0_0 = arg0; 3631 let pattern1_0 = arg1; 3632 // Rule at src/isa/x64/inst.isle line 2196. 3633 let expr0_0: Type = F32; 3634 let expr1_0 = SseOpcode::Subps; 3635 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3636 return Some(expr2_0); 3637 } 3638 3639 // Generated as internal constructor for term x64_subpd. 3640 pub fn constructor_x64_subpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3641 let pattern0_0 = arg0; 3642 let pattern1_0 = arg1; 3643 // Rule at src/isa/x64/inst.isle line 2201. 3644 let expr0_0: Type = F32; 3645 let expr1_0 = SseOpcode::Subpd; 3646 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3647 return Some(expr2_0); 3648 } 3649 3650 // Generated as internal constructor for term x64_mulss. 3651 pub fn constructor_x64_mulss<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3652 let pattern0_0 = arg0; 3653 let pattern1_0 = arg1; 3654 // Rule at src/isa/x64/inst.isle line 2206. 3655 let expr0_0: Type = F32; 3656 let expr1_0 = SseOpcode::Mulss; 3657 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3658 return Some(expr2_0); 3659 } 3660 3661 // Generated as internal constructor for term x64_mulsd. 3662 pub fn constructor_x64_mulsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3663 let pattern0_0 = arg0; 3664 let pattern1_0 = arg1; 3665 // Rule at src/isa/x64/inst.isle line 2211. 3666 let expr0_0: Type = F64; 3667 let expr1_0 = SseOpcode::Mulsd; 3668 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3669 return Some(expr2_0); 3670 } 3671 3672 // Generated as internal constructor for term x64_mulps. 3673 pub fn constructor_x64_mulps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3674 let pattern0_0 = arg0; 3675 let pattern1_0 = arg1; 3676 // Rule at src/isa/x64/inst.isle line 2216. 3677 let expr0_0: Type = F32; 3678 let expr1_0 = SseOpcode::Mulps; 3679 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3680 return Some(expr2_0); 3681 } 3682 3683 // Generated as internal constructor for term x64_mulpd. 3684 pub fn constructor_x64_mulpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3685 let pattern0_0 = arg0; 3686 let pattern1_0 = arg1; 3687 // Rule at src/isa/x64/inst.isle line 2221. 3688 let expr0_0: Type = F32; 3689 let expr1_0 = SseOpcode::Mulpd; 3690 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3691 return Some(expr2_0); 3692 } 3693 3694 // Generated as internal constructor for term x64_divss. 3695 pub fn constructor_x64_divss<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3696 let pattern0_0 = arg0; 3697 let pattern1_0 = arg1; 3698 // Rule at src/isa/x64/inst.isle line 2226. 3699 let expr0_0: Type = F32; 3700 let expr1_0 = SseOpcode::Divss; 3701 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3702 return Some(expr2_0); 3703 } 3704 3705 // Generated as internal constructor for term x64_divsd. 3706 pub fn constructor_x64_divsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3707 let pattern0_0 = arg0; 3708 let pattern1_0 = arg1; 3709 // Rule at src/isa/x64/inst.isle line 2231. 3710 let expr0_0: Type = F64; 3711 let expr1_0 = SseOpcode::Divsd; 3712 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3713 return Some(expr2_0); 3714 } 3715 3716 // Generated as internal constructor for term x64_divps. 3717 pub fn constructor_x64_divps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3718 let pattern0_0 = arg0; 3719 let pattern1_0 = arg1; 3720 // Rule at src/isa/x64/inst.isle line 2236. 3721 let expr0_0: Type = F32; 3722 let expr1_0 = SseOpcode::Divps; 3723 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3724 return Some(expr2_0); 3725 } 3726 3727 // Generated as internal constructor for term x64_divpd. 3728 pub fn constructor_x64_divpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3729 let pattern0_0 = arg0; 3730 let pattern1_0 = arg1; 3731 // Rule at src/isa/x64/inst.isle line 2241. 3732 let expr0_0: Type = F32; 3733 let expr1_0 = SseOpcode::Divpd; 3734 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3735 return Some(expr2_0); 3736 } 3737 3738 // Generated as internal constructor for term sse_blend_op. 3739 pub fn constructor_sse_blend_op<C: Context>(ctx: &mut C, arg0: Type) -> Option<SseOpcode> { 3740 let pattern0_0 = arg0; 3741 if pattern0_0 == F32X4 { 3742 // Rule at src/isa/x64/inst.isle line 2245. 3743 let expr0_0 = SseOpcode::Blendvps; 3744 return Some(expr0_0); 3745 } 3746 if pattern0_0 == F64X2 { 3747 // Rule at src/isa/x64/inst.isle line 2246. 3748 let expr0_0 = SseOpcode::Blendvpd; 3749 return Some(expr0_0); 3750 } 3751 if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { 3752 // Rule at src/isa/x64/inst.isle line 2247. 3753 let expr0_0 = SseOpcode::Pblendvb; 3754 return Some(expr0_0); 3755 } 3756 return None; 3757 } 3758 3759 // Generated as internal constructor for term sse_mov_op. 3760 pub fn constructor_sse_mov_op<C: Context>(ctx: &mut C, arg0: Type) -> Option<SseOpcode> { 3761 let pattern0_0 = arg0; 3762 if pattern0_0 == F32X4 { 3763 // Rule at src/isa/x64/inst.isle line 2250. 3764 let expr0_0 = SseOpcode::Movaps; 3765 return Some(expr0_0); 3766 } 3767 if pattern0_0 == F64X2 { 3768 // Rule at src/isa/x64/inst.isle line 2251. 3769 let expr0_0 = SseOpcode::Movapd; 3770 return Some(expr0_0); 3771 } 3772 if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { 3773 // Rule at src/isa/x64/inst.isle line 2252. 3774 let expr0_0 = SseOpcode::Movdqa; 3775 return Some(expr0_0); 3776 } 3777 return None; 3778 } 3779 3780 // Generated as internal constructor for term x64_blend. 3781 pub fn constructor_x64_blend<C: Context>( 3782 ctx: &mut C, 3783 arg0: Type, 3784 arg1: &XmmMem, 3785 arg2: &XmmMem, 3786 arg3: Xmm, 3787 ) -> Option<Xmm> { 3788 let pattern0_0 = arg0; 3789 let pattern1_0 = arg1; 3790 let pattern2_0 = arg2; 3791 let pattern3_0 = arg3; 3792 // Rule at src/isa/x64/inst.isle line 2256. 3793 let expr0_0 = C::xmm0(ctx); 3794 let expr1_0 = constructor_sse_mov_op(ctx, pattern0_0)?; 3795 let expr2_0 = MInst::XmmUnaryRmR { 3796 op: expr1_0, 3797 src: pattern1_0.clone(), 3798 dst: expr0_0, 3799 }; 3800 let expr3_0 = C::emit(ctx, &expr2_0); 3801 let expr4_0 = constructor_sse_blend_op(ctx, pattern0_0)?; 3802 let expr5_0 = constructor_xmm_rm_r(ctx, pattern0_0, &expr4_0, pattern3_0, pattern2_0)?; 3803 return Some(expr5_0); 3804 } 3805 3806 // Generated as internal constructor for term x64_blendvpd. 3807 pub fn constructor_x64_blendvpd<C: Context>( 3808 ctx: &mut C, 3809 arg0: Xmm, 3810 arg1: &XmmMem, 3811 arg2: Xmm, 3812 ) -> Option<Xmm> { 3813 let pattern0_0 = arg0; 3814 let pattern1_0 = arg1; 3815 let pattern2_0 = arg2; 3816 // Rule at src/isa/x64/inst.isle line 2270. 3817 let expr0_0 = C::xmm0(ctx); 3818 let expr1_0 = SseOpcode::Movapd; 3819 let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern2_0); 3820 let expr3_0 = MInst::XmmUnaryRmR { 3821 op: expr1_0, 3822 src: expr2_0, 3823 dst: expr0_0, 3824 }; 3825 let expr4_0 = C::emit(ctx, &expr3_0); 3826 let expr5_0: Type = F64X2; 3827 let expr6_0 = SseOpcode::Blendvpd; 3828 let expr7_0 = constructor_xmm_rm_r(ctx, expr5_0, &expr6_0, pattern0_0, pattern1_0)?; 3829 return Some(expr7_0); 3830 } 3831 3832 // Generated as internal constructor for term x64_movsd_regmove. 3833 pub fn constructor_x64_movsd_regmove<C: Context>( 3834 ctx: &mut C, 3835 arg0: Xmm, 3836 arg1: &XmmMem, 3837 ) -> Option<Xmm> { 3838 let pattern0_0 = arg0; 3839 let pattern1_0 = arg1; 3840 // Rule at src/isa/x64/inst.isle line 2284. 3841 let expr0_0: Type = I8X16; 3842 let expr1_0 = SseOpcode::Movsd; 3843 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3844 return Some(expr2_0); 3845 } 3846 3847 // Generated as internal constructor for term x64_movlhps. 3848 pub fn constructor_x64_movlhps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3849 let pattern0_0 = arg0; 3850 let pattern1_0 = arg1; 3851 // Rule at src/isa/x64/inst.isle line 2289. 3852 let expr0_0: Type = I8X16; 3853 let expr1_0 = SseOpcode::Movlhps; 3854 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3855 return Some(expr2_0); 3856 } 3857 3858 // Generated as internal constructor for term x64_pmaxs. 3859 pub fn constructor_x64_pmaxs<C: Context>( 3860 ctx: &mut C, 3861 arg0: Type, 3862 arg1: Xmm, 3863 arg2: &XmmMem, 3864 ) -> Option<Xmm> { 3865 let pattern0_0 = arg0; 3866 if pattern0_0 == I8X16 { 3867 let pattern2_0 = arg1; 3868 let pattern3_0 = arg2; 3869 // Rule at src/isa/x64/inst.isle line 2294. 3870 let expr0_0 = constructor_x64_pmaxsb(ctx, pattern2_0, pattern3_0)?; 3871 return Some(expr0_0); 3872 } 3873 if pattern0_0 == I16X8 { 3874 let pattern2_0 = arg1; 3875 let pattern3_0 = arg2; 3876 // Rule at src/isa/x64/inst.isle line 2295. 3877 let expr0_0 = constructor_x64_pmaxsw(ctx, pattern2_0, pattern3_0)?; 3878 return Some(expr0_0); 3879 } 3880 if pattern0_0 == I32X4 { 3881 let pattern2_0 = arg1; 3882 let pattern3_0 = arg2; 3883 // Rule at src/isa/x64/inst.isle line 2296. 3884 let expr0_0 = constructor_x64_pmaxsd(ctx, pattern2_0, pattern3_0)?; 3885 return Some(expr0_0); 3886 } 3887 return None; 3888 } 3889 3890 // Generated as internal constructor for term x64_pmaxsb. 3891 pub fn constructor_x64_pmaxsb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3892 let pattern0_0 = arg0; 3893 let pattern1_0 = arg1; 3894 // Rule at src/isa/x64/inst.isle line 2299. 3895 let expr0_0: Type = I8X16; 3896 let expr1_0 = SseOpcode::Pmaxsb; 3897 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3898 return Some(expr2_0); 3899 } 3900 3901 // Generated as internal constructor for term x64_pmaxsw. 3902 pub fn constructor_x64_pmaxsw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3903 let pattern0_0 = arg0; 3904 let pattern1_0 = arg1; 3905 // Rule at src/isa/x64/inst.isle line 2301. 3906 let expr0_0: Type = I8X16; 3907 let expr1_0 = SseOpcode::Pmaxsw; 3908 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3909 return Some(expr2_0); 3910 } 3911 3912 // Generated as internal constructor for term x64_pmaxsd. 3913 pub fn constructor_x64_pmaxsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3914 let pattern0_0 = arg0; 3915 let pattern1_0 = arg1; 3916 // Rule at src/isa/x64/inst.isle line 2303. 3917 let expr0_0: Type = I8X16; 3918 let expr1_0 = SseOpcode::Pmaxsd; 3919 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3920 return Some(expr2_0); 3921 } 3922 3923 // Generated as internal constructor for term x64_pmins. 3924 pub fn constructor_x64_pmins<C: Context>( 3925 ctx: &mut C, 3926 arg0: Type, 3927 arg1: Xmm, 3928 arg2: &XmmMem, 3929 ) -> Option<Xmm> { 3930 let pattern0_0 = arg0; 3931 if pattern0_0 == I8X16 { 3932 let pattern2_0 = arg1; 3933 let pattern3_0 = arg2; 3934 // Rule at src/isa/x64/inst.isle line 2307. 3935 let expr0_0 = constructor_x64_pminsb(ctx, pattern2_0, pattern3_0)?; 3936 return Some(expr0_0); 3937 } 3938 if pattern0_0 == I16X8 { 3939 let pattern2_0 = arg1; 3940 let pattern3_0 = arg2; 3941 // Rule at src/isa/x64/inst.isle line 2308. 3942 let expr0_0 = constructor_x64_pminsw(ctx, pattern2_0, pattern3_0)?; 3943 return Some(expr0_0); 3944 } 3945 if pattern0_0 == I32X4 { 3946 let pattern2_0 = arg1; 3947 let pattern3_0 = arg2; 3948 // Rule at src/isa/x64/inst.isle line 2309. 3949 let expr0_0 = constructor_x64_pminsd(ctx, pattern2_0, pattern3_0)?; 3950 return Some(expr0_0); 3951 } 3952 return None; 3953 } 3954 3955 // Generated as internal constructor for term x64_pminsb. 3956 pub fn constructor_x64_pminsb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3957 let pattern0_0 = arg0; 3958 let pattern1_0 = arg1; 3959 // Rule at src/isa/x64/inst.isle line 2312. 3960 let expr0_0: Type = I8X16; 3961 let expr1_0 = SseOpcode::Pminsb; 3962 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3963 return Some(expr2_0); 3964 } 3965 3966 // Generated as internal constructor for term x64_pminsw. 3967 pub fn constructor_x64_pminsw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3968 let pattern0_0 = arg0; 3969 let pattern1_0 = arg1; 3970 // Rule at src/isa/x64/inst.isle line 2314. 3971 let expr0_0: Type = I16X8; 3972 let expr1_0 = SseOpcode::Pminsw; 3973 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3974 return Some(expr2_0); 3975 } 3976 3977 // Generated as internal constructor for term x64_pminsd. 3978 pub fn constructor_x64_pminsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 3979 let pattern0_0 = arg0; 3980 let pattern1_0 = arg1; 3981 // Rule at src/isa/x64/inst.isle line 2316. 3982 let expr0_0: Type = I32X4; 3983 let expr1_0 = SseOpcode::Pminsd; 3984 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 3985 return Some(expr2_0); 3986 } 3987 3988 // Generated as internal constructor for term x64_pmaxu. 3989 pub fn constructor_x64_pmaxu<C: Context>( 3990 ctx: &mut C, 3991 arg0: Type, 3992 arg1: Xmm, 3993 arg2: &XmmMem, 3994 ) -> Option<Xmm> { 3995 let pattern0_0 = arg0; 3996 if pattern0_0 == I8X16 { 3997 let pattern2_0 = arg1; 3998 let pattern3_0 = arg2; 3999 // Rule at src/isa/x64/inst.isle line 2320. 4000 let expr0_0 = constructor_x64_pmaxub(ctx, pattern2_0, pattern3_0)?; 4001 return Some(expr0_0); 4002 } 4003 if pattern0_0 == I16X8 { 4004 let pattern2_0 = arg1; 4005 let pattern3_0 = arg2; 4006 // Rule at src/isa/x64/inst.isle line 2321. 4007 let expr0_0 = constructor_x64_pmaxuw(ctx, pattern2_0, pattern3_0)?; 4008 return Some(expr0_0); 4009 } 4010 if pattern0_0 == I32X4 { 4011 let pattern2_0 = arg1; 4012 let pattern3_0 = arg2; 4013 // Rule at src/isa/x64/inst.isle line 2322. 4014 let expr0_0 = constructor_x64_pmaxud(ctx, pattern2_0, pattern3_0)?; 4015 return Some(expr0_0); 4016 } 4017 return None; 4018 } 4019 4020 // Generated as internal constructor for term x64_pmaxub. 4021 pub fn constructor_x64_pmaxub<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 4022 let pattern0_0 = arg0; 4023 let pattern1_0 = arg1; 4024 // Rule at src/isa/x64/inst.isle line 2325. 4025 let expr0_0: Type = I8X16; 4026 let expr1_0 = SseOpcode::Pmaxub; 4027 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 4028 return Some(expr2_0); 4029 } 4030 4031 // Generated as internal constructor for term x64_pmaxuw. 4032 pub fn constructor_x64_pmaxuw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 4033 let pattern0_0 = arg0; 4034 let pattern1_0 = arg1; 4035 // Rule at src/isa/x64/inst.isle line 2327. 4036 let expr0_0: Type = I8X16; 4037 let expr1_0 = SseOpcode::Pmaxuw; 4038 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 4039 return Some(expr2_0); 4040 } 4041 4042 // Generated as internal constructor for term x64_pmaxud. 4043 pub fn constructor_x64_pmaxud<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 4044 let pattern0_0 = arg0; 4045 let pattern1_0 = arg1; 4046 // Rule at src/isa/x64/inst.isle line 2329. 4047 let expr0_0: Type = I8X16; 4048 let expr1_0 = SseOpcode::Pmaxud; 4049 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 4050 return Some(expr2_0); 4051 } 4052 4053 // Generated as internal constructor for term x64_pminu. 4054 pub fn constructor_x64_pminu<C: Context>( 4055 ctx: &mut C, 4056 arg0: Type, 4057 arg1: Xmm, 4058 arg2: &XmmMem, 4059 ) -> Option<Xmm> { 4060 let pattern0_0 = arg0; 4061 if pattern0_0 == I8X16 { 4062 let pattern2_0 = arg1; 4063 let pattern3_0 = arg2; 4064 // Rule at src/isa/x64/inst.isle line 2333. 4065 let expr0_0 = constructor_x64_pminub(ctx, pattern2_0, pattern3_0)?; 4066 return Some(expr0_0); 4067 } 4068 if pattern0_0 == I16X8 { 4069 let pattern2_0 = arg1; 4070 let pattern3_0 = arg2; 4071 // Rule at src/isa/x64/inst.isle line 2334. 4072 let expr0_0 = constructor_x64_pminuw(ctx, pattern2_0, pattern3_0)?; 4073 return Some(expr0_0); 4074 } 4075 if pattern0_0 == I32X4 { 4076 let pattern2_0 = arg1; 4077 let pattern3_0 = arg2; 4078 // Rule at src/isa/x64/inst.isle line 2335. 4079 let expr0_0 = constructor_x64_pminud(ctx, pattern2_0, pattern3_0)?; 4080 return Some(expr0_0); 4081 } 4082 return None; 4083 } 4084 4085 // Generated as internal constructor for term x64_pminub. 4086 pub fn constructor_x64_pminub<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 4087 let pattern0_0 = arg0; 4088 let pattern1_0 = arg1; 4089 // Rule at src/isa/x64/inst.isle line 2338. 4090 let expr0_0: Type = I8X16; 4091 let expr1_0 = SseOpcode::Pminub; 4092 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 4093 return Some(expr2_0); 4094 } 4095 4096 // Generated as internal constructor for term x64_pminuw. 4097 pub fn constructor_x64_pminuw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 4098 let pattern0_0 = arg0; 4099 let pattern1_0 = arg1; 4100 // Rule at src/isa/x64/inst.isle line 2340. 4101 let expr0_0: Type = I8X16; 4102 let expr1_0 = SseOpcode::Pminuw; 4103 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 4104 return Some(expr2_0); 4105 } 4106 4107 // Generated as internal constructor for term x64_pminud. 4108 pub fn constructor_x64_pminud<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 4109 let pattern0_0 = arg0; 4110 let pattern1_0 = arg1; 4111 // Rule at src/isa/x64/inst.isle line 2342. 4112 let expr0_0: Type = I8X16; 4113 let expr1_0 = SseOpcode::Pminud; 4114 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 4115 return Some(expr2_0); 4116 } 4117 4118 // Generated as internal constructor for term x64_punpcklbw. 4119 pub fn constructor_x64_punpcklbw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 4120 let pattern0_0 = arg0; 4121 let pattern1_0 = arg1; 4122 // Rule at src/isa/x64/inst.isle line 2346. 4123 let expr0_0: Type = I8X16; 4124 let expr1_0 = SseOpcode::Punpcklbw; 4125 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 4126 return Some(expr2_0); 4127 } 4128 4129 // Generated as internal constructor for term x64_punpckhbw. 4130 pub fn constructor_x64_punpckhbw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 4131 let pattern0_0 = arg0; 4132 let pattern1_0 = arg1; 4133 // Rule at src/isa/x64/inst.isle line 2351. 4134 let expr0_0: Type = I8X16; 4135 let expr1_0 = SseOpcode::Punpckhbw; 4136 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 4137 return Some(expr2_0); 4138 } 4139 4140 // Generated as internal constructor for term x64_packsswb. 4141 pub fn constructor_x64_packsswb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 4142 let pattern0_0 = arg0; 4143 let pattern1_0 = arg1; 4144 // Rule at src/isa/x64/inst.isle line 2356. 4145 let expr0_0: Type = I8X16; 4146 let expr1_0 = SseOpcode::Packsswb; 4147 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 4148 return Some(expr2_0); 4149 } 4150 4151 // Generated as internal constructor for term xmm_rm_r_imm. 4152 pub fn constructor_xmm_rm_r_imm<C: Context>( 4153 ctx: &mut C, 4154 arg0: &SseOpcode, 4155 arg1: Reg, 4156 arg2: &RegMem, 4157 arg3: u8, 4158 arg4: &OperandSize, 4159 ) -> Option<Xmm> { 4160 let pattern0_0 = arg0; 4161 let pattern1_0 = arg1; 4162 let pattern2_0 = arg2; 4163 let pattern3_0 = arg3; 4164 let pattern4_0 = arg4; 4165 // Rule at src/isa/x64/inst.isle line 2361. 4166 let expr0_0 = C::temp_writable_xmm(ctx); 4167 let expr1_0 = C::writable_xmm_to_reg(ctx, expr0_0); 4168 let expr2_0 = MInst::XmmRmRImm { 4169 op: pattern0_0.clone(), 4170 src1: pattern1_0, 4171 src2: pattern2_0.clone(), 4172 dst: expr1_0, 4173 imm: pattern3_0, 4174 size: pattern4_0.clone(), 4175 }; 4176 let expr3_0 = C::emit(ctx, &expr2_0); 4177 let expr4_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 4178 return Some(expr4_0); 4179 } 4180 4181 // Generated as internal constructor for term x64_palignr. 4182 pub fn constructor_x64_palignr<C: Context>( 4183 ctx: &mut C, 4184 arg0: Xmm, 4185 arg1: &XmmMem, 4186 arg2: u8, 4187 arg3: &OperandSize, 4188 ) -> Option<Xmm> { 4189 let pattern0_0 = arg0; 4190 let pattern1_0 = arg1; 4191 let pattern2_0 = arg2; 4192 let pattern3_0 = arg3; 4193 // Rule at src/isa/x64/inst.isle line 2373. 4194 let expr0_0 = SseOpcode::Palignr; 4195 let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); 4196 let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0); 4197 let expr3_0 = 4198 constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, pattern3_0)?; 4199 return Some(expr3_0); 4200 } 4201 4202 // Generated as internal constructor for term x64_cmpp. 4203 pub fn constructor_x64_cmpp<C: Context>( 4204 ctx: &mut C, 4205 arg0: Type, 4206 arg1: Xmm, 4207 arg2: &XmmMem, 4208 arg3: &FcmpImm, 4209 ) -> Option<Xmm> { 4210 let pattern0_0 = arg0; 4211 if pattern0_0 == F32X4 { 4212 let pattern2_0 = arg1; 4213 let pattern3_0 = arg2; 4214 let pattern4_0 = arg3; 4215 // Rule at src/isa/x64/inst.isle line 2382. 4216 let expr0_0 = constructor_x64_cmpps(ctx, pattern2_0, pattern3_0, pattern4_0)?; 4217 return Some(expr0_0); 4218 } 4219 if pattern0_0 == F64X2 { 4220 let pattern2_0 = arg1; 4221 let pattern3_0 = arg2; 4222 let pattern4_0 = arg3; 4223 // Rule at src/isa/x64/inst.isle line 2383. 4224 let expr0_0 = constructor_x64_cmppd(ctx, pattern2_0, pattern3_0, pattern4_0)?; 4225 return Some(expr0_0); 4226 } 4227 return None; 4228 } 4229 4230 // Generated as internal constructor for term x64_cmpps. 4231 pub fn constructor_x64_cmpps<C: Context>( 4232 ctx: &mut C, 4233 arg0: Xmm, 4234 arg1: &XmmMem, 4235 arg2: &FcmpImm, 4236 ) -> Option<Xmm> { 4237 let pattern0_0 = arg0; 4238 let pattern1_0 = arg1; 4239 let pattern2_0 = arg2; 4240 // Rule at src/isa/x64/inst.isle line 2386. 4241 let expr0_0 = SseOpcode::Cmpps; 4242 let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); 4243 let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0); 4244 let expr3_0 = C::encode_fcmp_imm(ctx, pattern2_0); 4245 let expr4_0 = OperandSize::Size32; 4246 let expr5_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, expr3_0, &expr4_0)?; 4247 return Some(expr5_0); 4248 } 4249 4250 // Generated as internal constructor for term x64_cmppd. 4251 pub fn constructor_x64_cmppd<C: Context>( 4252 ctx: &mut C, 4253 arg0: Xmm, 4254 arg1: &XmmMem, 4255 arg2: &FcmpImm, 4256 ) -> Option<Xmm> { 4257 let pattern0_0 = arg0; 4258 let pattern1_0 = arg1; 4259 let pattern2_0 = arg2; 4260 // Rule at src/isa/x64/inst.isle line 2397. 4261 let expr0_0 = SseOpcode::Cmppd; 4262 let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); 4263 let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0); 4264 let expr3_0 = C::encode_fcmp_imm(ctx, pattern2_0); 4265 let expr4_0 = OperandSize::Size32; 4266 let expr5_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, expr3_0, &expr4_0)?; 4267 return Some(expr5_0); 4268 } 4269 4270 // Generated as internal constructor for term x64_pinsrb. 4271 pub fn constructor_x64_pinsrb<C: Context>( 4272 ctx: &mut C, 4273 arg0: Xmm, 4274 arg1: &GprMem, 4275 arg2: u8, 4276 ) -> Option<Xmm> { 4277 let pattern0_0 = arg0; 4278 let pattern1_0 = arg1; 4279 let pattern2_0 = arg2; 4280 // Rule at src/isa/x64/inst.isle line 2406. 4281 let expr0_0 = SseOpcode::Pinsrb; 4282 let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); 4283 let expr2_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0); 4284 let expr3_0 = OperandSize::Size32; 4285 let expr4_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, &expr3_0)?; 4286 return Some(expr4_0); 4287 } 4288 4289 // Generated as internal constructor for term x64_pinsrw. 4290 pub fn constructor_x64_pinsrw<C: Context>( 4291 ctx: &mut C, 4292 arg0: Xmm, 4293 arg1: &GprMem, 4294 arg2: u8, 4295 ) -> Option<Xmm> { 4296 let pattern0_0 = arg0; 4297 let pattern1_0 = arg1; 4298 let pattern2_0 = arg2; 4299 // Rule at src/isa/x64/inst.isle line 2415. 4300 let expr0_0 = SseOpcode::Pinsrw; 4301 let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); 4302 let expr2_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0); 4303 let expr3_0 = OperandSize::Size32; 4304 let expr4_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, &expr3_0)?; 4305 return Some(expr4_0); 4306 } 4307 4308 // Generated as internal constructor for term x64_pinsrd. 4309 pub fn constructor_x64_pinsrd<C: Context>( 4310 ctx: &mut C, 4311 arg0: Xmm, 4312 arg1: &GprMem, 4313 arg2: u8, 4314 arg3: &OperandSize, 4315 ) -> Option<Xmm> { 4316 let pattern0_0 = arg0; 4317 let pattern1_0 = arg1; 4318 let pattern2_0 = arg2; 4319 let pattern3_0 = arg3; 4320 // Rule at src/isa/x64/inst.isle line 2424. 4321 let expr0_0 = SseOpcode::Pinsrd; 4322 let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); 4323 let expr2_0 = C::gpr_mem_to_reg_mem(ctx, pattern1_0); 4324 let expr3_0 = 4325 constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, pattern3_0)?; 4326 return Some(expr3_0); 4327 } 4328 4329 // Generated as internal constructor for term x64_pmaddwd. 4330 pub fn constructor_x64_pmaddwd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 4331 let pattern0_0 = arg0; 4332 let pattern1_0 = arg1; 4333 // Rule at src/isa/x64/inst.isle line 2433. 4334 let expr0_0 = C::temp_writable_xmm(ctx); 4335 let expr1_0 = SseOpcode::Pmaddwd; 4336 let expr2_0 = MInst::XmmRmR { 4337 op: expr1_0, 4338 src1: pattern0_0, 4339 src2: pattern1_0.clone(), 4340 dst: expr0_0, 4341 }; 4342 let expr3_0 = C::emit(ctx, &expr2_0); 4343 let expr4_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 4344 return Some(expr4_0); 4345 } 4346 4347 // Generated as internal constructor for term x64_insertps. 4348 pub fn constructor_x64_insertps<C: Context>( 4349 ctx: &mut C, 4350 arg0: Xmm, 4351 arg1: &XmmMem, 4352 arg2: u8, 4353 ) -> Option<Xmm> { 4354 let pattern0_0 = arg0; 4355 let pattern1_0 = arg1; 4356 let pattern2_0 = arg2; 4357 // Rule at src/isa/x64/inst.isle line 2443. 4358 let expr0_0 = SseOpcode::Insertps; 4359 let expr1_0 = C::xmm_to_reg(ctx, pattern0_0); 4360 let expr2_0 = C::xmm_mem_to_reg_mem(ctx, pattern1_0); 4361 let expr3_0 = OperandSize::Size32; 4362 let expr4_0 = constructor_xmm_rm_r_imm(ctx, &expr0_0, expr1_0, &expr2_0, pattern2_0, &expr3_0)?; 4363 return Some(expr4_0); 4364 } 4365 4366 // Generated as internal constructor for term x64_pshufd. 4367 pub fn constructor_x64_pshufd<C: Context>( 4368 ctx: &mut C, 4369 arg0: &XmmMem, 4370 arg1: u8, 4371 arg2: &OperandSize, 4372 ) -> Option<Xmm> { 4373 let pattern0_0 = arg0; 4374 let pattern1_0 = arg1; 4375 let pattern2_0 = arg2; 4376 // Rule at src/isa/x64/inst.isle line 2452. 4377 let expr0_0 = C::temp_writable_xmm(ctx); 4378 let expr1_0 = SseOpcode::Pshufd; 4379 let expr2_0 = constructor_writable_xmm_to_r_reg(ctx, expr0_0)?; 4380 let expr3_0 = C::xmm_mem_to_reg_mem(ctx, pattern0_0); 4381 let expr4_0 = C::writable_xmm_to_reg(ctx, expr0_0); 4382 let expr5_0 = MInst::XmmRmRImm { 4383 op: expr1_0, 4384 src1: expr2_0, 4385 src2: expr3_0, 4386 dst: expr4_0, 4387 imm: pattern1_0, 4388 size: pattern2_0.clone(), 4389 }; 4390 let expr6_0 = C::emit(ctx, &expr5_0); 4391 let expr7_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 4392 return Some(expr7_0); 4393 } 4394 4395 // Generated as internal constructor for term x64_pshufb. 4396 pub fn constructor_x64_pshufb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 4397 let pattern0_0 = arg0; 4398 let pattern1_0 = arg1; 4399 // Rule at src/isa/x64/inst.isle line 2464. 4400 let expr0_0 = C::temp_writable_xmm(ctx); 4401 let expr1_0 = SseOpcode::Pshufb; 4402 let expr2_0 = MInst::XmmRmR { 4403 op: expr1_0, 4404 src1: pattern0_0, 4405 src2: pattern1_0.clone(), 4406 dst: expr0_0, 4407 }; 4408 let expr3_0 = C::emit(ctx, &expr2_0); 4409 let expr4_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 4410 return Some(expr4_0); 4411 } 4412 4413 // Generated as internal constructor for term xmm_unary_rm_r. 4414 pub fn constructor_xmm_unary_rm_r<C: Context>( 4415 ctx: &mut C, 4416 arg0: &SseOpcode, 4417 arg1: &XmmMem, 4418 ) -> Option<Xmm> { 4419 let pattern0_0 = arg0; 4420 let pattern1_0 = arg1; 4421 // Rule at src/isa/x64/inst.isle line 2474. 4422 let expr0_0 = C::temp_writable_xmm(ctx); 4423 let expr1_0 = MInst::XmmUnaryRmR { 4424 op: pattern0_0.clone(), 4425 src: pattern1_0.clone(), 4426 dst: expr0_0, 4427 }; 4428 let expr2_0 = C::emit(ctx, &expr1_0); 4429 let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 4430 return Some(expr3_0); 4431 } 4432 4433 // Generated as internal constructor for term x64_pabsb. 4434 pub fn constructor_x64_pabsb<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> { 4435 let pattern0_0 = arg0; 4436 // Rule at src/isa/x64/inst.isle line 2481. 4437 let expr0_0 = SseOpcode::Pabsb; 4438 let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; 4439 return Some(expr1_0); 4440 } 4441 4442 // Generated as internal constructor for term x64_pabsw. 4443 pub fn constructor_x64_pabsw<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> { 4444 let pattern0_0 = arg0; 4445 // Rule at src/isa/x64/inst.isle line 2486. 4446 let expr0_0 = SseOpcode::Pabsw; 4447 let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; 4448 return Some(expr1_0); 4449 } 4450 4451 // Generated as internal constructor for term x64_pabsd. 4452 pub fn constructor_x64_pabsd<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> { 4453 let pattern0_0 = arg0; 4454 // Rule at src/isa/x64/inst.isle line 2491. 4455 let expr0_0 = SseOpcode::Pabsd; 4456 let expr1_0 = constructor_xmm_unary_rm_r(ctx, &expr0_0, pattern0_0)?; 4457 return Some(expr1_0); 4458 } 4459 4460 // Generated as internal constructor for term xmm_unary_rm_r_evex. 4461 pub fn constructor_xmm_unary_rm_r_evex<C: Context>( 4462 ctx: &mut C, 4463 arg0: &Avx512Opcode, 4464 arg1: &XmmMem, 4465 ) -> Option<Xmm> { 4466 let pattern0_0 = arg0; 4467 let pattern1_0 = arg1; 4468 // Rule at src/isa/x64/inst.isle line 2496. 4469 let expr0_0 = C::temp_writable_xmm(ctx); 4470 let expr1_0 = MInst::XmmUnaryRmREvex { 4471 op: pattern0_0.clone(), 4472 src: pattern1_0.clone(), 4473 dst: expr0_0, 4474 }; 4475 let expr2_0 = C::emit(ctx, &expr1_0); 4476 let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 4477 return Some(expr3_0); 4478 } 4479 4480 // Generated as internal constructor for term x64_vpabsq. 4481 pub fn constructor_x64_vpabsq<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> { 4482 let pattern0_0 = arg0; 4483 // Rule at src/isa/x64/inst.isle line 2503. 4484 let expr0_0 = Avx512Opcode::Vpabsq; 4485 let expr1_0 = constructor_xmm_unary_rm_r_evex(ctx, &expr0_0, pattern0_0)?; 4486 return Some(expr1_0); 4487 } 4488 4489 // Generated as internal constructor for term x64_vpopcntb. 4490 pub fn constructor_x64_vpopcntb<C: Context>(ctx: &mut C, arg0: &XmmMem) -> Option<Xmm> { 4491 let pattern0_0 = arg0; 4492 // Rule at src/isa/x64/inst.isle line 2508. 4493 let expr0_0 = Avx512Opcode::Vpopcntb; 4494 let expr1_0 = constructor_xmm_unary_rm_r_evex(ctx, &expr0_0, pattern0_0)?; 4495 return Some(expr1_0); 4496 } 4497 4498 // Generated as internal constructor for term xmm_rm_r_evex. 4499 pub fn constructor_xmm_rm_r_evex<C: Context>( 4500 ctx: &mut C, 4501 arg0: &Avx512Opcode, 4502 arg1: &XmmMem, 4503 arg2: Xmm, 4504 ) -> Option<Xmm> { 4505 let pattern0_0 = arg0; 4506 let pattern1_0 = arg1; 4507 let pattern2_0 = arg2; 4508 // Rule at src/isa/x64/inst.isle line 2513. 4509 let expr0_0 = C::temp_writable_xmm(ctx); 4510 let expr1_0 = MInst::XmmRmREvex { 4511 op: pattern0_0.clone(), 4512 src1: pattern1_0.clone(), 4513 src2: pattern2_0, 4514 dst: expr0_0, 4515 }; 4516 let expr2_0 = C::emit(ctx, &expr1_0); 4517 let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 4518 return Some(expr3_0); 4519 } 4520 4521 // Generated as internal constructor for term x64_vpmullq. 4522 pub fn constructor_x64_vpmullq<C: Context>(ctx: &mut C, arg0: &XmmMem, arg1: Xmm) -> Option<Xmm> { 4523 let pattern0_0 = arg0; 4524 let pattern1_0 = arg1; 4525 // Rule at src/isa/x64/inst.isle line 2525. 4526 let expr0_0 = Avx512Opcode::Vpmullq; 4527 let expr1_0 = constructor_xmm_rm_r_evex(ctx, &expr0_0, pattern0_0, pattern1_0)?; 4528 return Some(expr1_0); 4529 } 4530 4531 // Generated as internal constructor for term mul_hi. 4532 pub fn constructor_mul_hi<C: Context>( 4533 ctx: &mut C, 4534 arg0: Type, 4535 arg1: bool, 4536 arg2: Gpr, 4537 arg3: &GprMem, 4538 ) -> Option<ValueRegs> { 4539 let pattern0_0 = arg0; 4540 let pattern1_0 = arg1; 4541 let pattern2_0 = arg2; 4542 let pattern3_0 = arg3; 4543 // Rule at src/isa/x64/inst.isle line 2534. 4544 let expr0_0 = C::temp_writable_gpr(ctx); 4545 let expr1_0 = C::temp_writable_gpr(ctx); 4546 let expr2_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 4547 let expr3_0 = MInst::MulHi { 4548 size: expr2_0, 4549 signed: pattern1_0, 4550 src1: pattern2_0, 4551 src2: pattern3_0.clone(), 4552 dst_lo: expr0_0, 4553 dst_hi: expr1_0, 4554 }; 4555 let expr4_0 = C::emit(ctx, &expr3_0); 4556 let expr5_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 4557 let expr6_0 = C::writable_gpr_to_gpr(ctx, expr1_0); 4558 let expr7_0 = constructor_value_gprs(ctx, expr5_0, expr6_0)?; 4559 return Some(expr7_0); 4560 } 4561 4562 // Generated as internal constructor for term mulhi_u. 4563 pub fn constructor_mulhi_u<C: Context>( 4564 ctx: &mut C, 4565 arg0: Type, 4566 arg1: Gpr, 4567 arg2: &GprMem, 4568 ) -> Option<ValueRegs> { 4569 let pattern0_0 = arg0; 4570 let pattern1_0 = arg1; 4571 let pattern2_0 = arg2; 4572 // Rule at src/isa/x64/inst.isle line 2549. 4573 let expr0_0: bool = false; 4574 let expr1_0 = constructor_mul_hi(ctx, pattern0_0, expr0_0, pattern1_0, pattern2_0)?; 4575 return Some(expr1_0); 4576 } 4577 4578 // Generated as internal constructor for term xmm_rmi_xmm. 4579 pub fn constructor_xmm_rmi_xmm<C: Context>( 4580 ctx: &mut C, 4581 arg0: &SseOpcode, 4582 arg1: Xmm, 4583 arg2: &XmmMemImm, 4584 ) -> Option<Xmm> { 4585 let pattern0_0 = arg0; 4586 let pattern1_0 = arg1; 4587 let pattern2_0 = arg2; 4588 // Rule at src/isa/x64/inst.isle line 2554. 4589 let expr0_0 = C::temp_writable_xmm(ctx); 4590 let expr1_0 = MInst::XmmRmiReg { 4591 opcode: pattern0_0.clone(), 4592 src1: pattern1_0, 4593 src2: pattern2_0.clone(), 4594 dst: expr0_0, 4595 }; 4596 let expr2_0 = C::emit(ctx, &expr1_0); 4597 let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 4598 return Some(expr3_0); 4599 } 4600 4601 // Generated as internal constructor for term x64_psllw. 4602 pub fn constructor_x64_psllw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> { 4603 let pattern0_0 = arg0; 4604 let pattern1_0 = arg1; 4605 // Rule at src/isa/x64/inst.isle line 2564. 4606 let expr0_0 = SseOpcode::Psllw; 4607 let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; 4608 return Some(expr1_0); 4609 } 4610 4611 // Generated as internal constructor for term x64_pslld. 4612 pub fn constructor_x64_pslld<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> { 4613 let pattern0_0 = arg0; 4614 let pattern1_0 = arg1; 4615 // Rule at src/isa/x64/inst.isle line 2569. 4616 let expr0_0 = SseOpcode::Pslld; 4617 let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; 4618 return Some(expr1_0); 4619 } 4620 4621 // Generated as internal constructor for term x64_psllq. 4622 pub fn constructor_x64_psllq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> { 4623 let pattern0_0 = arg0; 4624 let pattern1_0 = arg1; 4625 // Rule at src/isa/x64/inst.isle line 2574. 4626 let expr0_0 = SseOpcode::Psllq; 4627 let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; 4628 return Some(expr1_0); 4629 } 4630 4631 // Generated as internal constructor for term x64_psrlw. 4632 pub fn constructor_x64_psrlw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> { 4633 let pattern0_0 = arg0; 4634 let pattern1_0 = arg1; 4635 // Rule at src/isa/x64/inst.isle line 2579. 4636 let expr0_0 = SseOpcode::Psrlw; 4637 let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; 4638 return Some(expr1_0); 4639 } 4640 4641 // Generated as internal constructor for term x64_psrld. 4642 pub fn constructor_x64_psrld<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> { 4643 let pattern0_0 = arg0; 4644 let pattern1_0 = arg1; 4645 // Rule at src/isa/x64/inst.isle line 2584. 4646 let expr0_0 = SseOpcode::Psrld; 4647 let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; 4648 return Some(expr1_0); 4649 } 4650 4651 // Generated as internal constructor for term x64_psrlq. 4652 pub fn constructor_x64_psrlq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> { 4653 let pattern0_0 = arg0; 4654 let pattern1_0 = arg1; 4655 // Rule at src/isa/x64/inst.isle line 2589. 4656 let expr0_0 = SseOpcode::Psrlq; 4657 let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; 4658 return Some(expr1_0); 4659 } 4660 4661 // Generated as internal constructor for term x64_psraw. 4662 pub fn constructor_x64_psraw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> { 4663 let pattern0_0 = arg0; 4664 let pattern1_0 = arg1; 4665 // Rule at src/isa/x64/inst.isle line 2594. 4666 let expr0_0 = SseOpcode::Psraw; 4667 let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; 4668 return Some(expr1_0); 4669 } 4670 4671 // Generated as internal constructor for term x64_psrad. 4672 pub fn constructor_x64_psrad<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMemImm) -> Option<Xmm> { 4673 let pattern0_0 = arg0; 4674 let pattern1_0 = arg1; 4675 // Rule at src/isa/x64/inst.isle line 2599. 4676 let expr0_0 = SseOpcode::Psrad; 4677 let expr1_0 = constructor_xmm_rmi_xmm(ctx, &expr0_0, pattern0_0, pattern1_0)?; 4678 return Some(expr1_0); 4679 } 4680 4681 // Generated as internal constructor for term x64_pextrd. 4682 pub fn constructor_x64_pextrd<C: Context>( 4683 ctx: &mut C, 4684 arg0: Type, 4685 arg1: Xmm, 4686 arg2: u8, 4687 ) -> Option<Gpr> { 4688 let pattern0_0 = arg0; 4689 let pattern1_0 = arg1; 4690 let pattern2_0 = arg2; 4691 // Rule at src/isa/x64/inst.isle line 2604. 4692 let expr0_0 = C::temp_writable_gpr(ctx); 4693 let expr1_0 = SseOpcode::Pextrd; 4694 let expr2_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; 4695 let expr3_0 = C::xmm_to_reg(ctx, pattern1_0); 4696 let expr4_0 = constructor_xmm_to_reg_mem(ctx, expr3_0)?; 4697 let expr5_0 = C::xmm_mem_to_reg_mem(ctx, &expr4_0); 4698 let expr6_0 = C::writable_gpr_to_reg(ctx, expr0_0); 4699 let expr7_0 = C::lane_type(ctx, pattern0_0); 4700 let expr8_0 = C::operand_size_of_type_32_64(ctx, expr7_0); 4701 let expr9_0 = MInst::XmmRmRImm { 4702 op: expr1_0, 4703 src1: expr2_0, 4704 src2: expr5_0, 4705 dst: expr6_0, 4706 imm: pattern2_0, 4707 size: expr8_0, 4708 }; 4709 let expr10_0 = C::emit(ctx, &expr9_0); 4710 let expr11_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 4711 return Some(expr11_0); 4712 } 4713 4714 // Generated as internal constructor for term gpr_to_xmm. 4715 pub fn constructor_gpr_to_xmm<C: Context>( 4716 ctx: &mut C, 4717 arg0: &SseOpcode, 4718 arg1: &GprMem, 4719 arg2: &OperandSize, 4720 ) -> Option<Xmm> { 4721 let pattern0_0 = arg0; 4722 let pattern1_0 = arg1; 4723 let pattern2_0 = arg2; 4724 // Rule at src/isa/x64/inst.isle line 2616. 4725 let expr0_0 = C::temp_writable_xmm(ctx); 4726 let expr1_0 = MInst::GprToXmm { 4727 op: pattern0_0.clone(), 4728 src: pattern1_0.clone(), 4729 dst: expr0_0, 4730 src_size: pattern2_0.clone(), 4731 }; 4732 let expr2_0 = C::emit(ctx, &expr1_0); 4733 let expr3_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 4734 return Some(expr3_0); 4735 } 4736 4737 // Generated as internal constructor for term x64_not. 4738 pub fn constructor_x64_not<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> { 4739 let pattern0_0 = arg0; 4740 let pattern1_0 = arg1; 4741 // Rule at src/isa/x64/inst.isle line 2623. 4742 let expr0_0 = C::temp_writable_gpr(ctx); 4743 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 4744 let expr2_0 = MInst::Not { 4745 size: expr1_0, 4746 src: pattern1_0, 4747 dst: expr0_0, 4748 }; 4749 let expr3_0 = C::emit(ctx, &expr2_0); 4750 let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 4751 return Some(expr4_0); 4752 } 4753 4754 // Generated as internal constructor for term x64_neg. 4755 pub fn constructor_x64_neg<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> { 4756 let pattern0_0 = arg0; 4757 let pattern1_0 = arg1; 4758 // Rule at src/isa/x64/inst.isle line 2631. 4759 let expr0_0 = C::temp_writable_gpr(ctx); 4760 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 4761 let expr2_0 = MInst::Neg { 4762 size: expr1_0, 4763 src: pattern1_0, 4764 dst: expr0_0, 4765 }; 4766 let expr3_0 = C::emit(ctx, &expr2_0); 4767 let expr4_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 4768 return Some(expr4_0); 4769 } 4770 4771 // Generated as internal constructor for term x64_lea. 4772 pub fn constructor_x64_lea<C: Context>(ctx: &mut C, arg0: &SyntheticAmode) -> Option<Gpr> { 4773 let pattern0_0 = arg0; 4774 // Rule at src/isa/x64/inst.isle line 2638. 4775 let expr0_0 = C::temp_writable_gpr(ctx); 4776 let expr1_0 = MInst::LoadEffectiveAddress { 4777 addr: pattern0_0.clone(), 4778 dst: expr0_0, 4779 }; 4780 let expr2_0 = C::emit(ctx, &expr1_0); 4781 let expr3_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 4782 return Some(expr3_0); 4783 } 4784 4785 // Generated as internal constructor for term x64_ud2. 4786 pub fn constructor_x64_ud2<C: Context>(ctx: &mut C, arg0: &TrapCode) -> Option<SideEffectNoResult> { 4787 let pattern0_0 = arg0; 4788 // Rule at src/isa/x64/inst.isle line 2645. 4789 let expr0_0 = MInst::Ud2 { 4790 trap_code: pattern0_0.clone(), 4791 }; 4792 let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; 4793 return Some(expr1_0); 4794 } 4795 4796 // Generated as internal constructor for term x64_hlt. 4797 pub fn constructor_x64_hlt<C: Context>(ctx: &mut C) -> Option<SideEffectNoResult> { 4798 // Rule at src/isa/x64/inst.isle line 2650. 4799 let expr0_0 = MInst::Hlt; 4800 let expr1_0 = SideEffectNoResult::Inst { inst: expr0_0 }; 4801 return Some(expr1_0); 4802 } 4803 4804 // Generated as internal constructor for term x64_lzcnt. 4805 pub fn constructor_x64_lzcnt<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> { 4806 let pattern0_0 = arg0; 4807 let pattern1_0 = arg1; 4808 // Rule at src/isa/x64/inst.isle line 2655. 4809 let expr0_0 = C::temp_writable_gpr(ctx); 4810 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 4811 let expr2_0 = UnaryRmROpcode::Lzcnt; 4812 let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0); 4813 let expr4_0 = MInst::UnaryRmR { 4814 size: expr1_0, 4815 op: expr2_0, 4816 src: expr3_0, 4817 dst: expr0_0, 4818 }; 4819 let expr5_0 = C::emit(ctx, &expr4_0); 4820 let expr6_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 4821 return Some(expr6_0); 4822 } 4823 4824 // Generated as internal constructor for term x64_tzcnt. 4825 pub fn constructor_x64_tzcnt<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> { 4826 let pattern0_0 = arg0; 4827 let pattern1_0 = arg1; 4828 // Rule at src/isa/x64/inst.isle line 2663. 4829 let expr0_0 = C::temp_writable_gpr(ctx); 4830 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 4831 let expr2_0 = UnaryRmROpcode::Tzcnt; 4832 let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0); 4833 let expr4_0 = MInst::UnaryRmR { 4834 size: expr1_0, 4835 op: expr2_0, 4836 src: expr3_0, 4837 dst: expr0_0, 4838 }; 4839 let expr5_0 = C::emit(ctx, &expr4_0); 4840 let expr6_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 4841 return Some(expr6_0); 4842 } 4843 4844 // Generated as internal constructor for term x64_bsr. 4845 pub fn constructor_x64_bsr<C: Context>( 4846 ctx: &mut C, 4847 arg0: Type, 4848 arg1: Gpr, 4849 ) -> Option<ProducesFlags> { 4850 let pattern0_0 = arg0; 4851 let pattern1_0 = arg1; 4852 // Rule at src/isa/x64/inst.isle line 2671. 4853 let expr0_0 = C::temp_writable_gpr(ctx); 4854 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 4855 let expr2_0 = UnaryRmROpcode::Bsr; 4856 let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0); 4857 let expr4_0 = MInst::UnaryRmR { 4858 size: expr1_0, 4859 op: expr2_0, 4860 src: expr3_0, 4861 dst: expr0_0, 4862 }; 4863 let expr5_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; 4864 let expr6_0 = ProducesFlags::ProducesFlagsReturnsReg { 4865 inst: expr4_0, 4866 result: expr5_0, 4867 }; 4868 return Some(expr6_0); 4869 } 4870 4871 // Generated as internal constructor for term bsr_or_else. 4872 pub fn constructor_bsr_or_else<C: Context>( 4873 ctx: &mut C, 4874 arg0: Type, 4875 arg1: Gpr, 4876 arg2: Gpr, 4877 ) -> Option<Gpr> { 4878 let pattern0_0 = arg0; 4879 let pattern1_0 = arg1; 4880 let pattern2_0 = arg2; 4881 // Rule at src/isa/x64/inst.isle line 2680. 4882 let expr0_0 = constructor_x64_bsr(ctx, pattern0_0, pattern1_0)?; 4883 let expr1_0 = constructor_produces_flags_get_reg(ctx, &expr0_0)?; 4884 let expr2_0 = C::gpr_new(ctx, expr1_0); 4885 let expr3_0 = CC::Z; 4886 let expr4_0 = C::gpr_to_gpr_mem(ctx, pattern2_0); 4887 let expr5_0 = constructor_cmove(ctx, pattern0_0, &expr3_0, &expr4_0, expr2_0)?; 4888 let expr6_0 = constructor_produces_flags_ignore(ctx, &expr0_0)?; 4889 let expr7_0 = constructor_with_flags_reg(ctx, &expr6_0, &expr5_0)?; 4890 let expr8_0 = C::gpr_new(ctx, expr7_0); 4891 return Some(expr8_0); 4892 } 4893 4894 // Generated as internal constructor for term x64_bsf. 4895 pub fn constructor_x64_bsf<C: Context>( 4896 ctx: &mut C, 4897 arg0: Type, 4898 arg1: Gpr, 4899 ) -> Option<ProducesFlags> { 4900 let pattern0_0 = arg0; 4901 let pattern1_0 = arg1; 4902 // Rule at src/isa/x64/inst.isle line 2691. 4903 let expr0_0 = C::temp_writable_gpr(ctx); 4904 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 4905 let expr2_0 = UnaryRmROpcode::Bsf; 4906 let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0); 4907 let expr4_0 = MInst::UnaryRmR { 4908 size: expr1_0, 4909 op: expr2_0, 4910 src: expr3_0, 4911 dst: expr0_0, 4912 }; 4913 let expr5_0 = constructor_writable_gpr_to_r_reg(ctx, expr0_0)?; 4914 let expr6_0 = ProducesFlags::ProducesFlagsReturnsReg { 4915 inst: expr4_0, 4916 result: expr5_0, 4917 }; 4918 return Some(expr6_0); 4919 } 4920 4921 // Generated as internal constructor for term bsf_or_else. 4922 pub fn constructor_bsf_or_else<C: Context>( 4923 ctx: &mut C, 4924 arg0: Type, 4925 arg1: Gpr, 4926 arg2: Gpr, 4927 ) -> Option<Gpr> { 4928 let pattern0_0 = arg0; 4929 let pattern1_0 = arg1; 4930 let pattern2_0 = arg2; 4931 // Rule at src/isa/x64/inst.isle line 2700. 4932 let expr0_0 = constructor_x64_bsf(ctx, pattern0_0, pattern1_0)?; 4933 let expr1_0 = constructor_produces_flags_get_reg(ctx, &expr0_0)?; 4934 let expr2_0 = C::gpr_new(ctx, expr1_0); 4935 let expr3_0 = CC::Z; 4936 let expr4_0 = C::gpr_to_gpr_mem(ctx, pattern2_0); 4937 let expr5_0 = constructor_cmove(ctx, pattern0_0, &expr3_0, &expr4_0, expr2_0)?; 4938 let expr6_0 = constructor_produces_flags_ignore(ctx, &expr0_0)?; 4939 let expr7_0 = constructor_with_flags_reg(ctx, &expr6_0, &expr5_0)?; 4940 let expr8_0 = C::gpr_new(ctx, expr7_0); 4941 return Some(expr8_0); 4942 } 4943 4944 // Generated as internal constructor for term x64_popcnt. 4945 pub fn constructor_x64_popcnt<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> { 4946 let pattern0_0 = arg0; 4947 let pattern1_0 = arg1; 4948 // Rule at src/isa/x64/inst.isle line 2711. 4949 let expr0_0 = C::temp_writable_gpr(ctx); 4950 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 4951 let expr2_0 = UnaryRmROpcode::Popcnt; 4952 let expr3_0 = C::gpr_to_gpr_mem(ctx, pattern1_0); 4953 let expr4_0 = MInst::UnaryRmR { 4954 size: expr1_0, 4955 op: expr2_0, 4956 src: expr3_0, 4957 dst: expr0_0, 4958 }; 4959 let expr5_0 = C::emit(ctx, &expr4_0); 4960 let expr6_0 = C::writable_gpr_to_gpr(ctx, expr0_0); 4961 return Some(expr6_0); 4962 } 4963 4964 // Generated as internal constructor for term xmm_min_max_seq. 4965 pub fn constructor_xmm_min_max_seq<C: Context>( 4966 ctx: &mut C, 4967 arg0: Type, 4968 arg1: bool, 4969 arg2: Xmm, 4970 arg3: Xmm, 4971 ) -> Option<Xmm> { 4972 let pattern0_0 = arg0; 4973 let pattern1_0 = arg1; 4974 let pattern2_0 = arg2; 4975 let pattern3_0 = arg3; 4976 // Rule at src/isa/x64/inst.isle line 2719. 4977 let expr0_0 = C::temp_writable_xmm(ctx); 4978 let expr1_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 4979 let expr2_0 = MInst::XmmMinMaxSeq { 4980 size: expr1_0, 4981 is_min: pattern1_0, 4982 lhs: pattern2_0, 4983 rhs: pattern3_0, 4984 dst: expr0_0, 4985 }; 4986 let expr3_0 = C::emit(ctx, &expr2_0); 4987 let expr4_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 4988 return Some(expr4_0); 4989 } 4990 4991 // Generated as internal constructor for term x64_minss. 4992 pub fn constructor_x64_minss<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> { 4993 let pattern0_0 = arg0; 4994 let pattern1_0 = arg1; 4995 // Rule at src/isa/x64/inst.isle line 2727. 4996 let expr0_0 = C::temp_writable_xmm(ctx); 4997 let expr1_0 = SseOpcode::Minss; 4998 let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); 4999 let expr3_0 = MInst::XmmRmR { 5000 op: expr1_0, 5001 src1: pattern0_0, 5002 src2: expr2_0, 5003 dst: expr0_0, 5004 }; 5005 let expr4_0 = C::emit(ctx, &expr3_0); 5006 let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 5007 return Some(expr5_0); 5008 } 5009 5010 // Generated as internal constructor for term x64_minsd. 5011 pub fn constructor_x64_minsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> { 5012 let pattern0_0 = arg0; 5013 let pattern1_0 = arg1; 5014 // Rule at src/isa/x64/inst.isle line 2734. 5015 let expr0_0 = C::temp_writable_xmm(ctx); 5016 let expr1_0 = SseOpcode::Minsd; 5017 let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); 5018 let expr3_0 = MInst::XmmRmR { 5019 op: expr1_0, 5020 src1: pattern0_0, 5021 src2: expr2_0, 5022 dst: expr0_0, 5023 }; 5024 let expr4_0 = C::emit(ctx, &expr3_0); 5025 let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 5026 return Some(expr5_0); 5027 } 5028 5029 // Generated as internal constructor for term x64_minps. 5030 pub fn constructor_x64_minps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> { 5031 let pattern0_0 = arg0; 5032 let pattern1_0 = arg1; 5033 // Rule at src/isa/x64/inst.isle line 2742. 5034 let expr0_0 = C::temp_writable_xmm(ctx); 5035 let expr1_0 = SseOpcode::Minps; 5036 let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); 5037 let expr3_0 = MInst::XmmRmR { 5038 op: expr1_0, 5039 src1: pattern0_0, 5040 src2: expr2_0, 5041 dst: expr0_0, 5042 }; 5043 let expr4_0 = C::emit(ctx, &expr3_0); 5044 let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 5045 return Some(expr5_0); 5046 } 5047 5048 // Generated as internal constructor for term x64_minpd. 5049 pub fn constructor_x64_minpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> { 5050 let pattern0_0 = arg0; 5051 let pattern1_0 = arg1; 5052 // Rule at src/isa/x64/inst.isle line 2749. 5053 let expr0_0 = C::temp_writable_xmm(ctx); 5054 let expr1_0 = SseOpcode::Minpd; 5055 let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); 5056 let expr3_0 = MInst::XmmRmR { 5057 op: expr1_0, 5058 src1: pattern0_0, 5059 src2: expr2_0, 5060 dst: expr0_0, 5061 }; 5062 let expr4_0 = C::emit(ctx, &expr3_0); 5063 let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 5064 return Some(expr5_0); 5065 } 5066 5067 // Generated as internal constructor for term x64_maxss. 5068 pub fn constructor_x64_maxss<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> { 5069 let pattern0_0 = arg0; 5070 let pattern1_0 = arg1; 5071 // Rule at src/isa/x64/inst.isle line 2756. 5072 let expr0_0 = C::temp_writable_xmm(ctx); 5073 let expr1_0 = SseOpcode::Maxss; 5074 let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); 5075 let expr3_0 = MInst::XmmRmR { 5076 op: expr1_0, 5077 src1: pattern0_0, 5078 src2: expr2_0, 5079 dst: expr0_0, 5080 }; 5081 let expr4_0 = C::emit(ctx, &expr3_0); 5082 let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 5083 return Some(expr5_0); 5084 } 5085 5086 // Generated as internal constructor for term x64_maxsd. 5087 pub fn constructor_x64_maxsd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> { 5088 let pattern0_0 = arg0; 5089 let pattern1_0 = arg1; 5090 // Rule at src/isa/x64/inst.isle line 2763. 5091 let expr0_0 = C::temp_writable_xmm(ctx); 5092 let expr1_0 = SseOpcode::Maxsd; 5093 let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); 5094 let expr3_0 = MInst::XmmRmR { 5095 op: expr1_0, 5096 src1: pattern0_0, 5097 src2: expr2_0, 5098 dst: expr0_0, 5099 }; 5100 let expr4_0 = C::emit(ctx, &expr3_0); 5101 let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 5102 return Some(expr5_0); 5103 } 5104 5105 // Generated as internal constructor for term x64_maxps. 5106 pub fn constructor_x64_maxps<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> { 5107 let pattern0_0 = arg0; 5108 let pattern1_0 = arg1; 5109 // Rule at src/isa/x64/inst.isle line 2770. 5110 let expr0_0 = C::temp_writable_xmm(ctx); 5111 let expr1_0 = SseOpcode::Maxps; 5112 let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); 5113 let expr3_0 = MInst::XmmRmR { 5114 op: expr1_0, 5115 src1: pattern0_0, 5116 src2: expr2_0, 5117 dst: expr0_0, 5118 }; 5119 let expr4_0 = C::emit(ctx, &expr3_0); 5120 let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 5121 return Some(expr5_0); 5122 } 5123 5124 // Generated as internal constructor for term x64_maxpd. 5125 pub fn constructor_x64_maxpd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: Xmm) -> Option<Xmm> { 5126 let pattern0_0 = arg0; 5127 let pattern1_0 = arg1; 5128 // Rule at src/isa/x64/inst.isle line 2777. 5129 let expr0_0 = C::temp_writable_xmm(ctx); 5130 let expr1_0 = SseOpcode::Maxpd; 5131 let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern1_0); 5132 let expr3_0 = MInst::XmmRmR { 5133 op: expr1_0, 5134 src1: pattern0_0, 5135 src2: expr2_0, 5136 dst: expr0_0, 5137 }; 5138 let expr4_0 = C::emit(ctx, &expr3_0); 5139 let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 5140 return Some(expr5_0); 5141 } 5142 5143 // Generated as internal constructor for term x64_sqrtss. 5144 pub fn constructor_x64_sqrtss<C: Context>(ctx: &mut C, arg0: Xmm) -> Option<Xmm> { 5145 let pattern0_0 = arg0; 5146 // Rule at src/isa/x64/inst.isle line 2785. 5147 let expr0_0 = C::temp_writable_xmm(ctx); 5148 let expr1_0 = SseOpcode::Sqrtss; 5149 let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern0_0); 5150 let expr3_0 = MInst::XmmUnaryRmR { 5151 op: expr1_0, 5152 src: expr2_0, 5153 dst: expr0_0, 5154 }; 5155 let expr4_0 = C::emit(ctx, &expr3_0); 5156 let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 5157 return Some(expr5_0); 5158 } 5159 5160 // Generated as internal constructor for term x64_sqrtsd. 5161 pub fn constructor_x64_sqrtsd<C: Context>(ctx: &mut C, arg0: Xmm) -> Option<Xmm> { 5162 let pattern0_0 = arg0; 5163 // Rule at src/isa/x64/inst.isle line 2792. 5164 let expr0_0 = C::temp_writable_xmm(ctx); 5165 let expr1_0 = SseOpcode::Sqrtsd; 5166 let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern0_0); 5167 let expr3_0 = MInst::XmmUnaryRmR { 5168 op: expr1_0, 5169 src: expr2_0, 5170 dst: expr0_0, 5171 }; 5172 let expr4_0 = C::emit(ctx, &expr3_0); 5173 let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 5174 return Some(expr5_0); 5175 } 5176 5177 // Generated as internal constructor for term x64_sqrtps. 5178 pub fn constructor_x64_sqrtps<C: Context>(ctx: &mut C, arg0: Xmm) -> Option<Xmm> { 5179 let pattern0_0 = arg0; 5180 // Rule at src/isa/x64/inst.isle line 2799. 5181 let expr0_0 = C::temp_writable_xmm(ctx); 5182 let expr1_0 = SseOpcode::Sqrtps; 5183 let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern0_0); 5184 let expr3_0 = MInst::XmmUnaryRmR { 5185 op: expr1_0, 5186 src: expr2_0, 5187 dst: expr0_0, 5188 }; 5189 let expr4_0 = C::emit(ctx, &expr3_0); 5190 let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 5191 return Some(expr5_0); 5192 } 5193 5194 // Generated as internal constructor for term x64_sqrtpd. 5195 pub fn constructor_x64_sqrtpd<C: Context>(ctx: &mut C, arg0: Xmm) -> Option<Xmm> { 5196 let pattern0_0 = arg0; 5197 // Rule at src/isa/x64/inst.isle line 2806. 5198 let expr0_0 = C::temp_writable_xmm(ctx); 5199 let expr1_0 = SseOpcode::Sqrtpd; 5200 let expr2_0 = C::xmm_to_xmm_mem(ctx, pattern0_0); 5201 let expr3_0 = MInst::XmmUnaryRmR { 5202 op: expr1_0, 5203 src: expr2_0, 5204 dst: expr0_0, 5205 }; 5206 let expr4_0 = C::emit(ctx, &expr3_0); 5207 let expr5_0 = C::writable_xmm_to_xmm(ctx, expr0_0); 5208 return Some(expr5_0); 5209 } 5210 5211 // Generated as internal constructor for term x64_pcmpeq. 5212 pub fn constructor_x64_pcmpeq<C: Context>( 5213 ctx: &mut C, 5214 arg0: Type, 5215 arg1: Xmm, 5216 arg2: &XmmMem, 5217 ) -> Option<Xmm> { 5218 let pattern0_0 = arg0; 5219 if pattern0_0 == I8X16 { 5220 let pattern2_0 = arg1; 5221 let pattern3_0 = arg2; 5222 // Rule at src/isa/x64/inst.isle line 2813. 5223 let expr0_0 = constructor_x64_pcmpeqb(ctx, pattern2_0, pattern3_0)?; 5224 return Some(expr0_0); 5225 } 5226 if pattern0_0 == I16X8 { 5227 let pattern2_0 = arg1; 5228 let pattern3_0 = arg2; 5229 // Rule at src/isa/x64/inst.isle line 2814. 5230 let expr0_0 = constructor_x64_pcmpeqw(ctx, pattern2_0, pattern3_0)?; 5231 return Some(expr0_0); 5232 } 5233 if pattern0_0 == I32X4 { 5234 let pattern2_0 = arg1; 5235 let pattern3_0 = arg2; 5236 // Rule at src/isa/x64/inst.isle line 2815. 5237 let expr0_0 = constructor_x64_pcmpeqd(ctx, pattern2_0, pattern3_0)?; 5238 return Some(expr0_0); 5239 } 5240 if pattern0_0 == I64X2 { 5241 let pattern2_0 = arg1; 5242 let pattern3_0 = arg2; 5243 // Rule at src/isa/x64/inst.isle line 2816. 5244 let expr0_0 = constructor_x64_pcmpeqq(ctx, pattern2_0, pattern3_0)?; 5245 return Some(expr0_0); 5246 } 5247 return None; 5248 } 5249 5250 // Generated as internal constructor for term x64_pcmpeqb. 5251 pub fn constructor_x64_pcmpeqb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 5252 let pattern0_0 = arg0; 5253 let pattern1_0 = arg1; 5254 // Rule at src/isa/x64/inst.isle line 2819. 5255 let expr0_0: Type = I8X16; 5256 let expr1_0 = SseOpcode::Pcmpeqb; 5257 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 5258 return Some(expr2_0); 5259 } 5260 5261 // Generated as internal constructor for term x64_pcmpeqw. 5262 pub fn constructor_x64_pcmpeqw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 5263 let pattern0_0 = arg0; 5264 let pattern1_0 = arg1; 5265 // Rule at src/isa/x64/inst.isle line 2821. 5266 let expr0_0: Type = I16X8; 5267 let expr1_0 = SseOpcode::Pcmpeqw; 5268 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 5269 return Some(expr2_0); 5270 } 5271 5272 // Generated as internal constructor for term x64_pcmpeqd. 5273 pub fn constructor_x64_pcmpeqd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 5274 let pattern0_0 = arg0; 5275 let pattern1_0 = arg1; 5276 // Rule at src/isa/x64/inst.isle line 2823. 5277 let expr0_0: Type = I32X4; 5278 let expr1_0 = SseOpcode::Pcmpeqd; 5279 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 5280 return Some(expr2_0); 5281 } 5282 5283 // Generated as internal constructor for term x64_pcmpeqq. 5284 pub fn constructor_x64_pcmpeqq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 5285 let pattern0_0 = arg0; 5286 let pattern1_0 = arg1; 5287 // Rule at src/isa/x64/inst.isle line 2825. 5288 let expr0_0: Type = I64X2; 5289 let expr1_0 = SseOpcode::Pcmpeqq; 5290 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 5291 return Some(expr2_0); 5292 } 5293 5294 // Generated as internal constructor for term x64_pcmpgt. 5295 pub fn constructor_x64_pcmpgt<C: Context>( 5296 ctx: &mut C, 5297 arg0: Type, 5298 arg1: Xmm, 5299 arg2: &XmmMem, 5300 ) -> Option<Xmm> { 5301 let pattern0_0 = arg0; 5302 if pattern0_0 == I8X16 { 5303 let pattern2_0 = arg1; 5304 let pattern3_0 = arg2; 5305 // Rule at src/isa/x64/inst.isle line 2829. 5306 let expr0_0 = constructor_x64_pcmpgtb(ctx, pattern2_0, pattern3_0)?; 5307 return Some(expr0_0); 5308 } 5309 if pattern0_0 == I16X8 { 5310 let pattern2_0 = arg1; 5311 let pattern3_0 = arg2; 5312 // Rule at src/isa/x64/inst.isle line 2830. 5313 let expr0_0 = constructor_x64_pcmpgtw(ctx, pattern2_0, pattern3_0)?; 5314 return Some(expr0_0); 5315 } 5316 if pattern0_0 == I32X4 { 5317 let pattern2_0 = arg1; 5318 let pattern3_0 = arg2; 5319 // Rule at src/isa/x64/inst.isle line 2831. 5320 let expr0_0 = constructor_x64_pcmpgtd(ctx, pattern2_0, pattern3_0)?; 5321 return Some(expr0_0); 5322 } 5323 if pattern0_0 == I64X2 { 5324 let pattern2_0 = arg1; 5325 let pattern3_0 = arg2; 5326 // Rule at src/isa/x64/inst.isle line 2832. 5327 let expr0_0 = constructor_x64_pcmpgtq(ctx, pattern2_0, pattern3_0)?; 5328 return Some(expr0_0); 5329 } 5330 return None; 5331 } 5332 5333 // Generated as internal constructor for term x64_pcmpgtb. 5334 pub fn constructor_x64_pcmpgtb<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 5335 let pattern0_0 = arg0; 5336 let pattern1_0 = arg1; 5337 // Rule at src/isa/x64/inst.isle line 2835. 5338 let expr0_0: Type = I8X16; 5339 let expr1_0 = SseOpcode::Pcmpgtb; 5340 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 5341 return Some(expr2_0); 5342 } 5343 5344 // Generated as internal constructor for term x64_pcmpgtw. 5345 pub fn constructor_x64_pcmpgtw<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 5346 let pattern0_0 = arg0; 5347 let pattern1_0 = arg1; 5348 // Rule at src/isa/x64/inst.isle line 2837. 5349 let expr0_0: Type = I16X8; 5350 let expr1_0 = SseOpcode::Pcmpgtw; 5351 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 5352 return Some(expr2_0); 5353 } 5354 5355 // Generated as internal constructor for term x64_pcmpgtd. 5356 pub fn constructor_x64_pcmpgtd<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 5357 let pattern0_0 = arg0; 5358 let pattern1_0 = arg1; 5359 // Rule at src/isa/x64/inst.isle line 2839. 5360 let expr0_0: Type = I32X4; 5361 let expr1_0 = SseOpcode::Pcmpgtd; 5362 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 5363 return Some(expr2_0); 5364 } 5365 5366 // Generated as internal constructor for term x64_pcmpgtq. 5367 pub fn constructor_x64_pcmpgtq<C: Context>(ctx: &mut C, arg0: Xmm, arg1: &XmmMem) -> Option<Xmm> { 5368 let pattern0_0 = arg0; 5369 let pattern1_0 = arg1; 5370 // Rule at src/isa/x64/inst.isle line 2841. 5371 let expr0_0: Type = I64X2; 5372 let expr1_0 = SseOpcode::Pcmpgtq; 5373 let expr2_0 = constructor_xmm_rm_r(ctx, expr0_0, &expr1_0, pattern0_0, pattern1_0)?; 5374 return Some(expr2_0); 5375 } 5376 5377 // Generated as internal constructor for term alu_rm. 5378 pub fn constructor_alu_rm<C: Context>( 5379 ctx: &mut C, 5380 arg0: Type, 5381 arg1: &AluRmiROpcode, 5382 arg2: &Amode, 5383 arg3: Gpr, 5384 ) -> Option<SideEffectNoResult> { 5385 let pattern0_0 = arg0; 5386 let pattern1_0 = arg1; 5387 let pattern2_0 = arg2; 5388 let pattern3_0 = arg3; 5389 // Rule at src/isa/x64/inst.isle line 2845. 5390 let expr0_0 = C::operand_size_of_type_32_64(ctx, pattern0_0); 5391 let expr1_0 = C::amode_to_synthetic_amode(ctx, pattern2_0); 5392 let expr2_0 = MInst::AluRM { 5393 size: expr0_0, 5394 op: pattern1_0.clone(), 5395 src1_dst: expr1_0, 5396 src2: pattern3_0, 5397 }; 5398 let expr3_0 = SideEffectNoResult::Inst { inst: expr2_0 }; 5399 return Some(expr3_0); 5400 } 5401 5402 // Generated as internal constructor for term x64_add_mem. 5403 pub fn constructor_x64_add_mem<C: Context>( 5404 ctx: &mut C, 5405 arg0: Type, 5406 arg1: &Amode, 5407 arg2: Gpr, 5408 ) -> Option<SideEffectNoResult> { 5409 let pattern0_0 = arg0; 5410 let pattern1_0 = arg1; 5411 let pattern2_0 = arg2; 5412 // Rule at src/isa/x64/inst.isle line 2850. 5413 let expr0_0 = AluRmiROpcode::Add; 5414 let expr1_0 = constructor_alu_rm(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 5415 return Some(expr1_0); 5416 } 5417 5418 // Generated as internal constructor for term x64_sub_mem. 5419 pub fn constructor_x64_sub_mem<C: Context>( 5420 ctx: &mut C, 5421 arg0: Type, 5422 arg1: &Amode, 5423 arg2: Gpr, 5424 ) -> Option<SideEffectNoResult> { 5425 let pattern0_0 = arg0; 5426 let pattern1_0 = arg1; 5427 let pattern2_0 = arg2; 5428 // Rule at src/isa/x64/inst.isle line 2854. 5429 let expr0_0 = AluRmiROpcode::Sub; 5430 let expr1_0 = constructor_alu_rm(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 5431 return Some(expr1_0); 5432 } 5433 5434 // Generated as internal constructor for term x64_and_mem. 5435 pub fn constructor_x64_and_mem<C: Context>( 5436 ctx: &mut C, 5437 arg0: Type, 5438 arg1: &Amode, 5439 arg2: Gpr, 5440 ) -> Option<SideEffectNoResult> { 5441 let pattern0_0 = arg0; 5442 let pattern1_0 = arg1; 5443 let pattern2_0 = arg2; 5444 // Rule at src/isa/x64/inst.isle line 2858. 5445 let expr0_0 = AluRmiROpcode::And; 5446 let expr1_0 = constructor_alu_rm(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 5447 return Some(expr1_0); 5448 } 5449 5450 // Generated as internal constructor for term x64_or_mem. 5451 pub fn constructor_x64_or_mem<C: Context>( 5452 ctx: &mut C, 5453 arg0: Type, 5454 arg1: &Amode, 5455 arg2: Gpr, 5456 ) -> Option<SideEffectNoResult> { 5457 let pattern0_0 = arg0; 5458 let pattern1_0 = arg1; 5459 let pattern2_0 = arg2; 5460 // Rule at src/isa/x64/inst.isle line 2862. 5461 let expr0_0 = AluRmiROpcode::Or; 5462 let expr1_0 = constructor_alu_rm(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 5463 return Some(expr1_0); 5464 } 5465 5466 // Generated as internal constructor for term x64_xor_mem. 5467 pub fn constructor_x64_xor_mem<C: Context>( 5468 ctx: &mut C, 5469 arg0: Type, 5470 arg1: &Amode, 5471 arg2: Gpr, 5472 ) -> Option<SideEffectNoResult> { 5473 let pattern0_0 = arg0; 5474 let pattern1_0 = arg1; 5475 let pattern2_0 = arg2; 5476 // Rule at src/isa/x64/inst.isle line 2866. 5477 let expr0_0 = AluRmiROpcode::Xor; 5478 let expr1_0 = constructor_alu_rm(ctx, pattern0_0, &expr0_0, pattern1_0, pattern2_0)?; 5479 return Some(expr1_0); 5480 } 5481 5482 // Generated as internal constructor for term reg_to_xmm_mem. 5483 pub fn constructor_reg_to_xmm_mem<C: Context>(ctx: &mut C, arg0: Reg) -> Option<XmmMem> { 5484 let pattern0_0 = arg0; 5485 // Rule at src/isa/x64/inst.isle line 2923. 5486 let expr0_0 = C::xmm_new(ctx, pattern0_0); 5487 let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); 5488 return Some(expr1_0); 5489 } 5490 5491 // Generated as internal constructor for term xmm_to_reg_mem. 5492 pub fn constructor_xmm_to_reg_mem<C: Context>(ctx: &mut C, arg0: Reg) -> Option<XmmMem> { 5493 let pattern0_0 = arg0; 5494 // Rule at src/isa/x64/inst.isle line 2926. 5495 let expr0_0 = C::xmm_new(ctx, pattern0_0); 5496 let expr1_0 = C::xmm_to_reg(ctx, expr0_0); 5497 let expr2_0 = RegMem::Reg { reg: expr1_0 }; 5498 let expr3_0 = C::reg_mem_to_xmm_mem(ctx, &expr2_0); 5499 return Some(expr3_0); 5500 } 5501 5502 // Generated as internal constructor for term writable_gpr_to_r_reg. 5503 pub fn constructor_writable_gpr_to_r_reg<C: Context>( 5504 ctx: &mut C, 5505 arg0: WritableGpr, 5506 ) -> Option<Reg> { 5507 let pattern0_0 = arg0; 5508 // Rule at src/isa/x64/inst.isle line 2930. 5509 let expr0_0 = C::writable_gpr_to_reg(ctx, pattern0_0); 5510 let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0); 5511 return Some(expr1_0); 5512 } 5513 5514 // Generated as internal constructor for term writable_gpr_to_gpr_mem. 5515 pub fn constructor_writable_gpr_to_gpr_mem<C: Context>( 5516 ctx: &mut C, 5517 arg0: WritableGpr, 5518 ) -> Option<GprMem> { 5519 let pattern0_0 = arg0; 5520 // Rule at src/isa/x64/inst.isle line 2933. 5521 let expr0_0 = C::writable_gpr_to_gpr(ctx, pattern0_0); 5522 let expr1_0 = C::gpr_to_gpr_mem(ctx, expr0_0); 5523 return Some(expr1_0); 5524 } 5525 5526 // Generated as internal constructor for term writable_gpr_to_value_regs. 5527 pub fn constructor_writable_gpr_to_value_regs<C: Context>( 5528 ctx: &mut C, 5529 arg0: WritableGpr, 5530 ) -> Option<ValueRegs> { 5531 let pattern0_0 = arg0; 5532 // Rule at src/isa/x64/inst.isle line 2936. 5533 let expr0_0 = constructor_writable_gpr_to_r_reg(ctx, pattern0_0)?; 5534 let expr1_0 = C::value_reg(ctx, expr0_0); 5535 return Some(expr1_0); 5536 } 5537 5538 // Generated as internal constructor for term writable_xmm_to_r_reg. 5539 pub fn constructor_writable_xmm_to_r_reg<C: Context>( 5540 ctx: &mut C, 5541 arg0: WritableXmm, 5542 ) -> Option<Reg> { 5543 let pattern0_0 = arg0; 5544 // Rule at src/isa/x64/inst.isle line 2939. 5545 let expr0_0 = C::writable_xmm_to_reg(ctx, pattern0_0); 5546 let expr1_0 = C::writable_reg_to_reg(ctx, expr0_0); 5547 return Some(expr1_0); 5548 } 5549 5550 // Generated as internal constructor for term writable_xmm_to_xmm_mem. 5551 pub fn constructor_writable_xmm_to_xmm_mem<C: Context>( 5552 ctx: &mut C, 5553 arg0: WritableXmm, 5554 ) -> Option<XmmMem> { 5555 let pattern0_0 = arg0; 5556 // Rule at src/isa/x64/inst.isle line 2942. 5557 let expr0_0 = C::writable_xmm_to_xmm(ctx, pattern0_0); 5558 let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); 5559 return Some(expr1_0); 5560 } 5561 5562 // Generated as internal constructor for term writable_xmm_to_value_regs. 5563 pub fn constructor_writable_xmm_to_value_regs<C: Context>( 5564 ctx: &mut C, 5565 arg0: WritableXmm, 5566 ) -> Option<ValueRegs> { 5567 let pattern0_0 = arg0; 5568 // Rule at src/isa/x64/inst.isle line 2945. 5569 let expr0_0 = constructor_writable_xmm_to_r_reg(ctx, pattern0_0)?; 5570 let expr1_0 = C::value_reg(ctx, expr0_0); 5571 return Some(expr1_0); 5572 } 5573 5574 // Generated as internal constructor for term synthetic_amode_to_gpr_mem. 5575 pub fn constructor_synthetic_amode_to_gpr_mem<C: Context>( 5576 ctx: &mut C, 5577 arg0: &SyntheticAmode, 5578 ) -> Option<GprMem> { 5579 let pattern0_0 = arg0; 5580 // Rule at src/isa/x64/inst.isle line 2952. 5581 let expr0_0 = C::synthetic_amode_to_reg_mem(ctx, pattern0_0); 5582 let expr1_0 = C::reg_mem_to_gpr_mem(ctx, &expr0_0); 5583 return Some(expr1_0); 5584 } 5585 5586 // Generated as internal constructor for term amode_to_gpr_mem. 5587 pub fn constructor_amode_to_gpr_mem<C: Context>(ctx: &mut C, arg0: &Amode) -> Option<GprMem> { 5588 let pattern0_0 = arg0; 5589 // Rule at src/isa/x64/inst.isle line 2950. 5590 let expr0_0 = C::amode_to_synthetic_amode(ctx, pattern0_0); 5591 let expr1_0 = constructor_synthetic_amode_to_gpr_mem(ctx, &expr0_0)?; 5592 return Some(expr1_0); 5593 } 5594 5595 // Generated as internal constructor for term amode_to_xmm_mem. 5596 pub fn constructor_amode_to_xmm_mem<C: Context>(ctx: &mut C, arg0: &Amode) -> Option<XmmMem> { 5597 let pattern0_0 = arg0; 5598 // Rule at src/isa/x64/inst.isle line 2955. 5599 let expr0_0 = C::amode_to_synthetic_amode(ctx, pattern0_0); 5600 let expr1_0 = constructor_synthetic_amode_to_xmm_mem(ctx, &expr0_0)?; 5601 return Some(expr1_0); 5602 } 5603 5604 // Generated as internal constructor for term synthetic_amode_to_xmm_mem. 5605 pub fn constructor_synthetic_amode_to_xmm_mem<C: Context>( 5606 ctx: &mut C, 5607 arg0: &SyntheticAmode, 5608 ) -> Option<XmmMem> { 5609 let pattern0_0 = arg0; 5610 // Rule at src/isa/x64/inst.isle line 2958. 5611 let expr0_0 = C::synthetic_amode_to_reg_mem(ctx, pattern0_0); 5612 let expr1_0 = C::reg_mem_to_xmm_mem(ctx, &expr0_0); 5613 return Some(expr1_0); 5614 } 5615 5616 // Generated as internal constructor for term lower. 5617 pub fn constructor_lower<C: Context>(ctx: &mut C, arg0: Inst) -> Option<InstOutput> { 5618 let pattern0_0 = arg0; 5619 if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { 5620 let pattern2_0 = C::value_type(ctx, pattern1_0); 5621 if pattern2_0 == I128 { 5622 if let Some(()) = C::use_popcnt(ctx, pattern2_0) { 5623 let pattern5_0 = C::inst_data(ctx, pattern0_0); 5624 if let &InstructionData::Unary { 5625 opcode: ref pattern6_0, 5626 arg: pattern6_1, 5627 } = &pattern5_0 5628 { 5629 if let &Opcode::Popcnt = pattern6_0 { 5630 // Rule at src/isa/x64/lower.isle line 1876. 5631 let expr0_0: Type = I64; 5632 let expr1_0 = C::put_in_regs(ctx, pattern6_1); 5633 let expr2_0: usize = 0; 5634 let expr3_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr2_0)?; 5635 let expr4_0 = constructor_x64_popcnt(ctx, expr0_0, expr3_0)?; 5636 let expr5_0: Type = I64; 5637 let expr6_0 = C::put_in_regs(ctx, pattern6_1); 5638 let expr7_0: usize = 1; 5639 let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0)?; 5640 let expr9_0 = constructor_x64_popcnt(ctx, expr5_0, expr8_0)?; 5641 let expr10_0: Type = I64; 5642 let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); 5643 let expr12_0 = constructor_x64_add(ctx, expr10_0, expr4_0, &expr11_0)?; 5644 let expr13_0 = C::gpr_to_reg(ctx, expr12_0); 5645 let expr14_0: Type = I64; 5646 let expr15_0: u64 = 0; 5647 let expr16_0 = constructor_imm(ctx, expr14_0, expr15_0)?; 5648 let expr17_0 = C::value_regs(ctx, expr13_0, expr16_0); 5649 let expr18_0 = C::output(ctx, expr17_0); 5650 return Some(expr18_0); 5651 } 5652 } 5653 } 5654 } 5655 if pattern2_0 == I8X16 { 5656 if let Some(()) = C::avx512vl_enabled(ctx, pattern2_0) { 5657 if let Some(()) = C::avx512bitalg_enabled(ctx, pattern2_0) { 5658 let pattern6_0 = C::inst_data(ctx, pattern0_0); 5659 if let &InstructionData::Unary { 5660 opcode: ref pattern7_0, 5661 arg: pattern7_1, 5662 } = &pattern6_0 5663 { 5664 if let &Opcode::Popcnt = pattern7_0 { 5665 // Rule at src/isa/x64/lower.isle line 1968. 5666 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 5667 let expr1_0 = constructor_x64_vpopcntb(ctx, &expr0_0)?; 5668 let expr2_0 = constructor_output_xmm(ctx, expr1_0)?; 5669 return Some(expr2_0); 5670 } 5671 } 5672 } 5673 } 5674 } 5675 if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) { 5676 if let Some(()) = C::use_lzcnt(ctx, pattern2_0) { 5677 let pattern5_0 = C::inst_data(ctx, pattern0_0); 5678 if let &InstructionData::Unary { 5679 opcode: ref pattern6_0, 5680 arg: pattern6_1, 5681 } = &pattern5_0 5682 { 5683 if let &Opcode::Clz = pattern6_0 { 5684 // Rule at src/isa/x64/lower.isle line 1784. 5685 let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1)?; 5686 let expr1_0 = constructor_x64_lzcnt(ctx, pattern3_0, expr0_0)?; 5687 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; 5688 return Some(expr2_0); 5689 } 5690 } 5691 } 5692 if let Some(()) = C::use_bmi1(ctx, pattern2_0) { 5693 let pattern5_0 = C::inst_data(ctx, pattern0_0); 5694 if let &InstructionData::Unary { 5695 opcode: ref pattern6_0, 5696 arg: pattern6_1, 5697 } = &pattern5_0 5698 { 5699 if let &Opcode::Ctz = pattern6_0 { 5700 // Rule at src/isa/x64/lower.isle line 1826. 5701 let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1)?; 5702 let expr1_0 = constructor_x64_tzcnt(ctx, pattern3_0, expr0_0)?; 5703 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; 5704 return Some(expr2_0); 5705 } 5706 } 5707 } 5708 if let Some(()) = C::use_popcnt(ctx, pattern2_0) { 5709 let pattern5_0 = C::inst_data(ctx, pattern0_0); 5710 if let &InstructionData::Unary { 5711 opcode: ref pattern6_0, 5712 arg: pattern6_1, 5713 } = &pattern5_0 5714 { 5715 if let &Opcode::Popcnt = pattern6_0 { 5716 // Rule at src/isa/x64/lower.isle line 1862. 5717 let expr0_0 = constructor_put_in_gpr(ctx, pattern6_1)?; 5718 let expr1_0 = constructor_x64_popcnt(ctx, pattern3_0, expr0_0)?; 5719 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; 5720 return Some(expr2_0); 5721 } 5722 } 5723 } 5724 } 5725 if let Some(pattern3_0) = C::ty_8_or_16(ctx, pattern2_0) { 5726 if let Some(()) = C::use_popcnt(ctx, pattern2_0) { 5727 let pattern5_0 = C::inst_data(ctx, pattern0_0); 5728 if let &InstructionData::Unary { 5729 opcode: ref pattern6_0, 5730 arg: pattern6_1, 5731 } = &pattern5_0 5732 { 5733 if let &Opcode::Popcnt = pattern6_0 { 5734 // Rule at src/isa/x64/lower.isle line 1869. 5735 let expr0_0: Type = I32; 5736 let expr1_0: Type = I32; 5737 let expr2_0 = ExtendKind::Zero; 5738 let expr3_0 = 5739 constructor_extend_to_gpr(ctx, pattern6_1, expr1_0, &expr2_0)?; 5740 let expr4_0 = constructor_x64_popcnt(ctx, expr0_0, expr3_0)?; 5741 let expr5_0 = constructor_output_gpr(ctx, expr4_0)?; 5742 return Some(expr5_0); 5743 } 5744 } 5745 } 5746 } 5747 } 5748 let pattern0_0 = arg0; 5749 let pattern1_0 = C::inst_data(ctx, pattern0_0); 5750 match &pattern1_0 { 5751 &InstructionData::NullAry { 5752 opcode: ref pattern2_0, 5753 } => { 5754 if let &Opcode::Debugtrap = pattern2_0 { 5755 // Rule at src/isa/x64/lower.isle line 2254. 5756 let expr0_0 = constructor_x64_hlt(ctx)?; 5757 let expr1_0 = constructor_side_effect(ctx, &expr0_0)?; 5758 return Some(expr1_0); 5759 } 5760 } 5761 &InstructionData::UnaryIeee32 { 5762 opcode: ref pattern2_0, 5763 imm: pattern2_1, 5764 } => { 5765 if let &Opcode::F32const = pattern2_0 { 5766 let pattern4_0 = C::u64_from_ieee32(ctx, pattern2_1); 5767 // Rule at src/isa/x64/lower.isle line 46. 5768 let expr0_0: Type = F32; 5769 let expr1_0 = constructor_imm(ctx, expr0_0, pattern4_0)?; 5770 let expr2_0 = constructor_output_reg(ctx, expr1_0)?; 5771 return Some(expr2_0); 5772 } 5773 } 5774 &InstructionData::UnaryIeee64 { 5775 opcode: ref pattern2_0, 5776 imm: pattern2_1, 5777 } => { 5778 if let &Opcode::F64const = pattern2_0 { 5779 let pattern4_0 = C::u64_from_ieee64(ctx, pattern2_1); 5780 // Rule at src/isa/x64/lower.isle line 51. 5781 let expr0_0: Type = F64; 5782 let expr1_0 = constructor_imm(ctx, expr0_0, pattern4_0)?; 5783 let expr2_0 = constructor_output_reg(ctx, expr1_0)?; 5784 return Some(expr2_0); 5785 } 5786 } 5787 &InstructionData::Trap { 5788 opcode: ref pattern2_0, 5789 code: ref pattern2_1, 5790 } => { 5791 match pattern2_0 { 5792 &Opcode::Trap => { 5793 // Rule at src/isa/x64/lower.isle line 1438. 5794 let expr0_0 = constructor_x64_ud2(ctx, pattern2_1)?; 5795 let expr1_0 = constructor_side_effect(ctx, &expr0_0)?; 5796 return Some(expr1_0); 5797 } 5798 &Opcode::ResumableTrap => { 5799 // Rule at src/isa/x64/lower.isle line 1443. 5800 let expr0_0 = constructor_x64_ud2(ctx, pattern2_1)?; 5801 let expr1_0 = constructor_side_effect(ctx, &expr0_0)?; 5802 return Some(expr1_0); 5803 } 5804 _ => {} 5805 } 5806 } 5807 &InstructionData::Store { 5808 opcode: ref pattern2_0, 5809 args: ref pattern2_1, 5810 flags: pattern2_2, 5811 offset: pattern2_3, 5812 } => { 5813 match pattern2_0 { 5814 &Opcode::Store => { 5815 let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); 5816 if let Some(pattern5_0) = C::def_inst(ctx, pattern4_0) { 5817 if let Some(pattern6_0) = C::first_result(ctx, pattern5_0) { 5818 let pattern7_0 = C::value_type(ctx, pattern6_0); 5819 if let Some(pattern8_0) = C::ty_32_or_64(ctx, pattern7_0) { 5820 let pattern9_0 = C::inst_data(ctx, pattern5_0); 5821 if let &InstructionData::Binary { 5822 opcode: ref pattern10_0, 5823 args: ref pattern10_1, 5824 } = &pattern9_0 5825 { 5826 match pattern10_0 { 5827 &Opcode::Iadd => { 5828 let (pattern12_0, pattern12_1) = 5829 C::unpack_value_array_2(ctx, pattern10_1); 5830 if let Some(pattern13_0) = 5831 C::sinkable_load(ctx, pattern12_0) 5832 { 5833 if let Some(pattern14_0) = 5834 C::def_inst(ctx, pattern12_0) 5835 { 5836 let pattern15_0 = 5837 C::inst_data(ctx, pattern14_0); 5838 if let &InstructionData::Load { 5839 opcode: ref pattern16_0, 5840 arg: pattern16_1, 5841 flags: pattern16_2, 5842 offset: pattern16_3, 5843 } = &pattern15_0 5844 { 5845 if let &Opcode::Load = pattern16_0 { 5846 if pattern4_1 == pattern16_1 { 5847 if pattern2_2 == pattern16_2 { 5848 if pattern2_3 == pattern16_3 { 5849 // Rule at src/isa/x64/lower.isle line 2662. 5850 let expr0_0 = C::sink_load( 5851 ctx, 5852 &pattern13_0, 5853 ); 5854 let expr1_0 = 5855 constructor_to_amode( 5856 ctx, 5857 pattern16_2, 5858 pattern16_1, 5859 pattern16_3, 5860 )?; 5861 let expr2_0 = 5862 constructor_put_in_gpr( 5863 ctx, 5864 pattern12_1, 5865 )?; 5866 let expr3_0 = constructor_x64_add_mem(ctx, pattern8_0, &expr1_0, expr2_0)?; 5867 let expr4_0 = constructor_side_effect(ctx, &expr3_0)?; 5868 return Some(expr4_0); 5869 } 5870 } 5871 } 5872 } 5873 } 5874 } 5875 } 5876 if let Some(pattern13_0) = 5877 C::sinkable_load(ctx, pattern12_1) 5878 { 5879 if let Some(pattern14_0) = 5880 C::def_inst(ctx, pattern12_1) 5881 { 5882 let pattern15_0 = 5883 C::inst_data(ctx, pattern14_0); 5884 if let &InstructionData::Load { 5885 opcode: ref pattern16_0, 5886 arg: pattern16_1, 5887 flags: pattern16_2, 5888 offset: pattern16_3, 5889 } = &pattern15_0 5890 { 5891 if let &Opcode::Load = pattern16_0 { 5892 if pattern4_1 == pattern16_1 { 5893 if pattern2_2 == pattern16_2 { 5894 if pattern2_3 == pattern16_3 { 5895 // Rule at src/isa/x64/lower.isle line 2676. 5896 let expr0_0 = C::sink_load( 5897 ctx, 5898 &pattern13_0, 5899 ); 5900 let expr1_0 = 5901 constructor_to_amode( 5902 ctx, 5903 pattern16_2, 5904 pattern16_1, 5905 pattern16_3, 5906 )?; 5907 let expr2_0 = 5908 constructor_put_in_gpr( 5909 ctx, 5910 pattern12_0, 5911 )?; 5912 let expr3_0 = constructor_x64_add_mem(ctx, pattern8_0, &expr1_0, expr2_0)?; 5913 let expr4_0 = constructor_side_effect(ctx, &expr3_0)?; 5914 return Some(expr4_0); 5915 } 5916 } 5917 } 5918 } 5919 } 5920 } 5921 } 5922 } 5923 &Opcode::Isub => { 5924 let (pattern12_0, pattern12_1) = 5925 C::unpack_value_array_2(ctx, pattern10_1); 5926 if let Some(pattern13_0) = 5927 C::sinkable_load(ctx, pattern12_0) 5928 { 5929 if let Some(pattern14_0) = 5930 C::def_inst(ctx, pattern12_0) 5931 { 5932 let pattern15_0 = 5933 C::inst_data(ctx, pattern14_0); 5934 if let &InstructionData::Load { 5935 opcode: ref pattern16_0, 5936 arg: pattern16_1, 5937 flags: pattern16_2, 5938 offset: pattern16_3, 5939 } = &pattern15_0 5940 { 5941 if let &Opcode::Load = pattern16_0 { 5942 if pattern4_1 == pattern16_1 { 5943 if pattern2_2 == pattern16_2 { 5944 if pattern2_3 == pattern16_3 { 5945 // Rule at src/isa/x64/lower.isle line 2690. 5946 let expr0_0 = C::sink_load( 5947 ctx, 5948 &pattern13_0, 5949 ); 5950 let expr1_0 = 5951 constructor_to_amode( 5952 ctx, 5953 pattern16_2, 5954 pattern16_1, 5955 pattern16_3, 5956 )?; 5957 let expr2_0 = 5958 constructor_put_in_gpr( 5959 ctx, 5960 pattern12_1, 5961 )?; 5962 let expr3_0 = constructor_x64_sub_mem(ctx, pattern8_0, &expr1_0, expr2_0)?; 5963 let expr4_0 = constructor_side_effect(ctx, &expr3_0)?; 5964 return Some(expr4_0); 5965 } 5966 } 5967 } 5968 } 5969 } 5970 } 5971 } 5972 } 5973 &Opcode::Band => { 5974 let (pattern12_0, pattern12_1) = 5975 C::unpack_value_array_2(ctx, pattern10_1); 5976 if let Some(pattern13_0) = 5977 C::sinkable_load(ctx, pattern12_0) 5978 { 5979 if let Some(pattern14_0) = 5980 C::def_inst(ctx, pattern12_0) 5981 { 5982 let pattern15_0 = 5983 C::inst_data(ctx, pattern14_0); 5984 if let &InstructionData::Load { 5985 opcode: ref pattern16_0, 5986 arg: pattern16_1, 5987 flags: pattern16_2, 5988 offset: pattern16_3, 5989 } = &pattern15_0 5990 { 5991 if let &Opcode::Load = pattern16_0 { 5992 if pattern4_1 == pattern16_1 { 5993 if pattern2_2 == pattern16_2 { 5994 if pattern2_3 == pattern16_3 { 5995 // Rule at src/isa/x64/lower.isle line 2704. 5996 let expr0_0 = C::sink_load( 5997 ctx, 5998 &pattern13_0, 5999 ); 6000 let expr1_0 = 6001 constructor_to_amode( 6002 ctx, 6003 pattern16_2, 6004 pattern16_1, 6005 pattern16_3, 6006 )?; 6007 let expr2_0 = 6008 constructor_put_in_gpr( 6009 ctx, 6010 pattern12_1, 6011 )?; 6012 let expr3_0 = constructor_x64_and_mem(ctx, pattern8_0, &expr1_0, expr2_0)?; 6013 let expr4_0 = constructor_side_effect(ctx, &expr3_0)?; 6014 return Some(expr4_0); 6015 } 6016 } 6017 } 6018 } 6019 } 6020 } 6021 } 6022 if let Some(pattern13_0) = 6023 C::sinkable_load(ctx, pattern12_1) 6024 { 6025 if let Some(pattern14_0) = 6026 C::def_inst(ctx, pattern12_1) 6027 { 6028 let pattern15_0 = 6029 C::inst_data(ctx, pattern14_0); 6030 if let &InstructionData::Load { 6031 opcode: ref pattern16_0, 6032 arg: pattern16_1, 6033 flags: pattern16_2, 6034 offset: pattern16_3, 6035 } = &pattern15_0 6036 { 6037 if let &Opcode::Load = pattern16_0 { 6038 if pattern4_1 == pattern16_1 { 6039 if pattern2_2 == pattern16_2 { 6040 if pattern2_3 == pattern16_3 { 6041 // Rule at src/isa/x64/lower.isle line 2718. 6042 let expr0_0 = C::sink_load( 6043 ctx, 6044 &pattern13_0, 6045 ); 6046 let expr1_0 = 6047 constructor_to_amode( 6048 ctx, 6049 pattern16_2, 6050 pattern16_1, 6051 pattern16_3, 6052 )?; 6053 let expr2_0 = 6054 constructor_put_in_gpr( 6055 ctx, 6056 pattern12_0, 6057 )?; 6058 let expr3_0 = constructor_x64_and_mem(ctx, pattern8_0, &expr1_0, expr2_0)?; 6059 let expr4_0 = constructor_side_effect(ctx, &expr3_0)?; 6060 return Some(expr4_0); 6061 } 6062 } 6063 } 6064 } 6065 } 6066 } 6067 } 6068 } 6069 &Opcode::Bor => { 6070 let (pattern12_0, pattern12_1) = 6071 C::unpack_value_array_2(ctx, pattern10_1); 6072 if let Some(pattern13_0) = 6073 C::sinkable_load(ctx, pattern12_0) 6074 { 6075 if let Some(pattern14_0) = 6076 C::def_inst(ctx, pattern12_0) 6077 { 6078 let pattern15_0 = 6079 C::inst_data(ctx, pattern14_0); 6080 if let &InstructionData::Load { 6081 opcode: ref pattern16_0, 6082 arg: pattern16_1, 6083 flags: pattern16_2, 6084 offset: pattern16_3, 6085 } = &pattern15_0 6086 { 6087 if let &Opcode::Load = pattern16_0 { 6088 if pattern4_1 == pattern16_1 { 6089 if pattern2_2 == pattern16_2 { 6090 if pattern2_3 == pattern16_3 { 6091 // Rule at src/isa/x64/lower.isle line 2732. 6092 let expr0_0 = C::sink_load( 6093 ctx, 6094 &pattern13_0, 6095 ); 6096 let expr1_0 = 6097 constructor_to_amode( 6098 ctx, 6099 pattern16_2, 6100 pattern16_1, 6101 pattern16_3, 6102 )?; 6103 let expr2_0 = 6104 constructor_put_in_gpr( 6105 ctx, 6106 pattern12_1, 6107 )?; 6108 let expr3_0 = 6109 constructor_x64_or_mem( 6110 ctx, pattern8_0, 6111 &expr1_0, expr2_0, 6112 )?; 6113 let expr4_0 = constructor_side_effect(ctx, &expr3_0)?; 6114 return Some(expr4_0); 6115 } 6116 } 6117 } 6118 } 6119 } 6120 } 6121 } 6122 if let Some(pattern13_0) = 6123 C::sinkable_load(ctx, pattern12_1) 6124 { 6125 if let Some(pattern14_0) = 6126 C::def_inst(ctx, pattern12_1) 6127 { 6128 let pattern15_0 = 6129 C::inst_data(ctx, pattern14_0); 6130 if let &InstructionData::Load { 6131 opcode: ref pattern16_0, 6132 arg: pattern16_1, 6133 flags: pattern16_2, 6134 offset: pattern16_3, 6135 } = &pattern15_0 6136 { 6137 if let &Opcode::Load = pattern16_0 { 6138 if pattern4_1 == pattern16_1 { 6139 if pattern2_2 == pattern16_2 { 6140 if pattern2_3 == pattern16_3 { 6141 // Rule at src/isa/x64/lower.isle line 2746. 6142 let expr0_0 = C::sink_load( 6143 ctx, 6144 &pattern13_0, 6145 ); 6146 let expr1_0 = 6147 constructor_to_amode( 6148 ctx, 6149 pattern16_2, 6150 pattern16_1, 6151 pattern16_3, 6152 )?; 6153 let expr2_0 = 6154 constructor_put_in_gpr( 6155 ctx, 6156 pattern12_0, 6157 )?; 6158 let expr3_0 = 6159 constructor_x64_or_mem( 6160 ctx, pattern8_0, 6161 &expr1_0, expr2_0, 6162 )?; 6163 let expr4_0 = constructor_side_effect(ctx, &expr3_0)?; 6164 return Some(expr4_0); 6165 } 6166 } 6167 } 6168 } 6169 } 6170 } 6171 } 6172 } 6173 &Opcode::Bxor => { 6174 let (pattern12_0, pattern12_1) = 6175 C::unpack_value_array_2(ctx, pattern10_1); 6176 if let Some(pattern13_0) = 6177 C::sinkable_load(ctx, pattern12_0) 6178 { 6179 if let Some(pattern14_0) = 6180 C::def_inst(ctx, pattern12_0) 6181 { 6182 let pattern15_0 = 6183 C::inst_data(ctx, pattern14_0); 6184 if let &InstructionData::Load { 6185 opcode: ref pattern16_0, 6186 arg: pattern16_1, 6187 flags: pattern16_2, 6188 offset: pattern16_3, 6189 } = &pattern15_0 6190 { 6191 if let &Opcode::Load = pattern16_0 { 6192 if pattern4_1 == pattern16_1 { 6193 if pattern2_2 == pattern16_2 { 6194 if pattern2_3 == pattern16_3 { 6195 // Rule at src/isa/x64/lower.isle line 2760. 6196 let expr0_0 = C::sink_load( 6197 ctx, 6198 &pattern13_0, 6199 ); 6200 let expr1_0 = 6201 constructor_to_amode( 6202 ctx, 6203 pattern16_2, 6204 pattern16_1, 6205 pattern16_3, 6206 )?; 6207 let expr2_0 = 6208 constructor_put_in_gpr( 6209 ctx, 6210 pattern12_1, 6211 )?; 6212 let expr3_0 = constructor_x64_xor_mem(ctx, pattern8_0, &expr1_0, expr2_0)?; 6213 let expr4_0 = constructor_side_effect(ctx, &expr3_0)?; 6214 return Some(expr4_0); 6215 } 6216 } 6217 } 6218 } 6219 } 6220 } 6221 } 6222 if let Some(pattern13_0) = 6223 C::sinkable_load(ctx, pattern12_1) 6224 { 6225 if let Some(pattern14_0) = 6226 C::def_inst(ctx, pattern12_1) 6227 { 6228 let pattern15_0 = 6229 C::inst_data(ctx, pattern14_0); 6230 if let &InstructionData::Load { 6231 opcode: ref pattern16_0, 6232 arg: pattern16_1, 6233 flags: pattern16_2, 6234 offset: pattern16_3, 6235 } = &pattern15_0 6236 { 6237 if let &Opcode::Load = pattern16_0 { 6238 if pattern4_1 == pattern16_1 { 6239 if pattern2_2 == pattern16_2 { 6240 if pattern2_3 == pattern16_3 { 6241 // Rule at src/isa/x64/lower.isle line 2774. 6242 let expr0_0 = C::sink_load( 6243 ctx, 6244 &pattern13_0, 6245 ); 6246 let expr1_0 = 6247 constructor_to_amode( 6248 ctx, 6249 pattern16_2, 6250 pattern16_1, 6251 pattern16_3, 6252 )?; 6253 let expr2_0 = 6254 constructor_put_in_gpr( 6255 ctx, 6256 pattern12_0, 6257 )?; 6258 let expr3_0 = constructor_x64_xor_mem(ctx, pattern8_0, &expr1_0, expr2_0)?; 6259 let expr4_0 = constructor_side_effect(ctx, &expr3_0)?; 6260 return Some(expr4_0); 6261 } 6262 } 6263 } 6264 } 6265 } 6266 } 6267 } 6268 } 6269 _ => {} 6270 } 6271 } 6272 } 6273 } 6274 } 6275 let pattern5_0 = C::value_type(ctx, pattern4_0); 6276 if pattern5_0 == F32 { 6277 // Rule at src/isa/x64/lower.isle line 2605. 6278 let expr0_0 = SseOpcode::Movss; 6279 let expr1_0 = 6280 constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3)?; 6281 let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0); 6282 let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6283 let expr4_0 = constructor_x64_xmm_movrm(ctx, &expr0_0, &expr2_0, expr3_0)?; 6284 let expr5_0 = constructor_side_effect(ctx, &expr4_0)?; 6285 return Some(expr5_0); 6286 } 6287 if pattern5_0 == F64 { 6288 // Rule at src/isa/x64/lower.isle line 2613. 6289 let expr0_0 = SseOpcode::Movsd; 6290 let expr1_0 = 6291 constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3)?; 6292 let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0); 6293 let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6294 let expr4_0 = constructor_x64_xmm_movrm(ctx, &expr0_0, &expr2_0, expr3_0)?; 6295 let expr5_0 = constructor_side_effect(ctx, &expr4_0)?; 6296 return Some(expr5_0); 6297 } 6298 if pattern5_0 == F32X4 { 6299 // Rule at src/isa/x64/lower.isle line 2621. 6300 let expr0_0 = SseOpcode::Movups; 6301 let expr1_0 = 6302 constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3)?; 6303 let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0); 6304 let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6305 let expr4_0 = constructor_x64_xmm_movrm(ctx, &expr0_0, &expr2_0, expr3_0)?; 6306 let expr5_0 = constructor_side_effect(ctx, &expr4_0)?; 6307 return Some(expr5_0); 6308 } 6309 if pattern5_0 == F64X2 { 6310 // Rule at src/isa/x64/lower.isle line 2629. 6311 let expr0_0 = SseOpcode::Movupd; 6312 let expr1_0 = 6313 constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3)?; 6314 let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0); 6315 let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6316 let expr4_0 = constructor_x64_xmm_movrm(ctx, &expr0_0, &expr2_0, expr3_0)?; 6317 let expr5_0 = constructor_side_effect(ctx, &expr4_0)?; 6318 return Some(expr5_0); 6319 } 6320 if let Some(pattern6_0) = C::ty_int_bool_128(ctx, pattern5_0) { 6321 // Rule at src/isa/x64/lower.isle line 2645. 6322 let expr0_0 = C::put_in_regs(ctx, pattern4_0); 6323 let expr1_0: usize = 0; 6324 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 6325 let expr3_0: usize = 1; 6326 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?; 6327 let expr5_0 = 6328 constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3)?; 6329 let expr6_0: u32 = 8; 6330 let expr7_0 = C::amode_offset(ctx, &expr5_0, expr6_0); 6331 let expr8_0: Type = I64; 6332 let expr9_0 = C::amode_to_synthetic_amode(ctx, &expr5_0); 6333 let expr10_0 = constructor_x64_movrm(ctx, expr8_0, &expr9_0, expr2_0)?; 6334 let expr11_0: Type = I64; 6335 let expr12_0 = C::amode_to_synthetic_amode(ctx, &expr7_0); 6336 let expr13_0 = constructor_x64_movrm(ctx, expr11_0, &expr12_0, expr4_0)?; 6337 let expr14_0 = constructor_side_effect_concat(ctx, &expr10_0, &expr13_0)?; 6338 let expr15_0 = constructor_side_effect(ctx, &expr14_0)?; 6339 return Some(expr15_0); 6340 } 6341 if let Some(pattern6_0) = C::ty_vec128_int(ctx, pattern5_0) { 6342 // Rule at src/isa/x64/lower.isle line 2637. 6343 let expr0_0 = SseOpcode::Movdqu; 6344 let expr1_0 = 6345 constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3)?; 6346 let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0); 6347 let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6348 let expr4_0 = constructor_x64_xmm_movrm(ctx, &expr0_0, &expr2_0, expr3_0)?; 6349 let expr5_0 = constructor_side_effect(ctx, &expr4_0)?; 6350 return Some(expr5_0); 6351 } 6352 if let Some(pattern6_0) = C::is_gpr_type(ctx, pattern5_0) { 6353 // Rule at src/isa/x64/lower.isle line 2586. 6354 let expr0_0 = 6355 constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3)?; 6356 let expr1_0 = C::amode_to_synthetic_amode(ctx, &expr0_0); 6357 let expr2_0 = constructor_put_in_gpr(ctx, pattern4_0)?; 6358 let expr3_0 = constructor_x64_movrm(ctx, pattern6_0, &expr1_0, expr2_0)?; 6359 let expr4_0 = constructor_side_effect(ctx, &expr3_0)?; 6360 return Some(expr4_0); 6361 } 6362 } 6363 &Opcode::Istore8 => { 6364 let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); 6365 // Rule at src/isa/x64/lower.isle line 2594. 6366 let expr0_0: Type = I8; 6367 let expr1_0 = constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3)?; 6368 let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0); 6369 let expr3_0 = constructor_put_in_gpr(ctx, pattern4_0)?; 6370 let expr4_0 = constructor_x64_movrm(ctx, expr0_0, &expr2_0, expr3_0)?; 6371 let expr5_0 = constructor_side_effect(ctx, &expr4_0)?; 6372 return Some(expr5_0); 6373 } 6374 &Opcode::Istore16 => { 6375 let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); 6376 // Rule at src/isa/x64/lower.isle line 2597. 6377 let expr0_0: Type = I16; 6378 let expr1_0 = constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3)?; 6379 let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0); 6380 let expr3_0 = constructor_put_in_gpr(ctx, pattern4_0)?; 6381 let expr4_0 = constructor_x64_movrm(ctx, expr0_0, &expr2_0, expr3_0)?; 6382 let expr5_0 = constructor_side_effect(ctx, &expr4_0)?; 6383 return Some(expr5_0); 6384 } 6385 &Opcode::Istore32 => { 6386 let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); 6387 // Rule at src/isa/x64/lower.isle line 2600. 6388 let expr0_0: Type = I32; 6389 let expr1_0 = constructor_to_amode(ctx, pattern2_2, pattern4_1, pattern2_3)?; 6390 let expr2_0 = C::amode_to_synthetic_amode(ctx, &expr1_0); 6391 let expr3_0 = constructor_put_in_gpr(ctx, pattern4_0)?; 6392 let expr4_0 = constructor_x64_movrm(ctx, expr0_0, &expr2_0, expr3_0)?; 6393 let expr5_0 = constructor_side_effect(ctx, &expr4_0)?; 6394 return Some(expr5_0); 6395 } 6396 _ => {} 6397 } 6398 } 6399 &InstructionData::TernaryImm8 { 6400 opcode: ref pattern2_0, 6401 args: ref pattern2_1, 6402 imm: pattern2_2, 6403 } => { 6404 if let &Opcode::Insertlane = pattern2_0 { 6405 let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); 6406 let pattern5_0 = C::value_type(ctx, pattern4_0); 6407 let pattern6_0 = C::u8_from_uimm8(ctx, pattern2_2); 6408 // Rule at src/isa/x64/lower.isle line 1302. 6409 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6410 let expr1_0 = C::put_in_reg_mem(ctx, pattern4_1); 6411 let expr2_0 = 6412 constructor_vec_insert_lane(ctx, pattern5_0, expr0_0, &expr1_0, pattern6_0)?; 6413 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 6414 return Some(expr3_0); 6415 } 6416 } 6417 &InstructionData::FloatCompare { 6418 opcode: ref pattern2_0, 6419 args: ref pattern2_1, 6420 cond: ref pattern2_2, 6421 } => { 6422 if let &Opcode::Fcmp = pattern2_0 { 6423 let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); 6424 let pattern5_0 = C::value_type(ctx, pattern4_0); 6425 if let Some(pattern6_0) = C::ty_scalar_float(ctx, pattern5_0) { 6426 match pattern2_2 { 6427 &FloatCC::Equal => { 6428 // Rule at src/isa/x64/lower.isle line 1575. 6429 let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?; 6430 let expr1_0 = CC::NP; 6431 let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; 6432 let expr3_0 = CC::Z; 6433 let expr4_0 = constructor_x64_setcc(ctx, &expr3_0)?; 6434 let expr5_0 = 6435 constructor_consumes_flags_concat(ctx, &expr2_0, &expr4_0)?; 6436 let expr6_0 = constructor_with_flags(ctx, &expr0_0, &expr5_0)?; 6437 let expr7_0: usize = 0; 6438 let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0)?; 6439 let expr9_0: usize = 1; 6440 let expr10_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr9_0)?; 6441 let expr11_0: Type = I32; 6442 let expr12_0 = C::gpr_to_gpr_mem_imm(ctx, expr10_0); 6443 let expr13_0 = constructor_x64_and(ctx, expr11_0, expr8_0, &expr12_0)?; 6444 let expr14_0 = constructor_output_gpr(ctx, expr13_0)?; 6445 return Some(expr14_0); 6446 } 6447 &FloatCC::GreaterThan => { 6448 // Rule at src/isa/x64/lower.isle line 1603. 6449 let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?; 6450 let expr1_0 = CC::NBE; 6451 let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; 6452 let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?; 6453 let expr4_0 = C::output(ctx, expr3_0); 6454 return Some(expr4_0); 6455 } 6456 &FloatCC::GreaterThanOrEqual => { 6457 // Rule at src/isa/x64/lower.isle line 1605. 6458 let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?; 6459 let expr1_0 = CC::NB; 6460 let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; 6461 let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?; 6462 let expr4_0 = C::output(ctx, expr3_0); 6463 return Some(expr4_0); 6464 } 6465 &FloatCC::LessThan => { 6466 // Rule at src/isa/x64/lower.isle line 1615. 6467 let expr0_0 = constructor_x64_ucomis(ctx, pattern4_0, pattern4_1)?; 6468 let expr1_0 = CC::NBE; 6469 let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; 6470 let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?; 6471 let expr4_0 = C::output(ctx, expr3_0); 6472 return Some(expr4_0); 6473 } 6474 &FloatCC::LessThanOrEqual => { 6475 // Rule at src/isa/x64/lower.isle line 1618. 6476 let expr0_0 = constructor_x64_ucomis(ctx, pattern4_0, pattern4_1)?; 6477 let expr1_0 = CC::NB; 6478 let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; 6479 let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?; 6480 let expr4_0 = C::output(ctx, expr3_0); 6481 return Some(expr4_0); 6482 } 6483 &FloatCC::NotEqual => { 6484 // Rule at src/isa/x64/lower.isle line 1584. 6485 let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?; 6486 let expr1_0 = CC::P; 6487 let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; 6488 let expr3_0 = CC::NZ; 6489 let expr4_0 = constructor_x64_setcc(ctx, &expr3_0)?; 6490 let expr5_0 = 6491 constructor_consumes_flags_concat(ctx, &expr2_0, &expr4_0)?; 6492 let expr6_0 = constructor_with_flags(ctx, &expr0_0, &expr5_0)?; 6493 let expr7_0: usize = 0; 6494 let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0)?; 6495 let expr9_0: usize = 1; 6496 let expr10_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr9_0)?; 6497 let expr11_0: Type = I32; 6498 let expr12_0 = C::gpr_to_gpr_mem_imm(ctx, expr10_0); 6499 let expr13_0 = constructor_x64_or(ctx, expr11_0, expr8_0, &expr12_0)?; 6500 let expr14_0 = constructor_output_gpr(ctx, expr13_0)?; 6501 return Some(expr14_0); 6502 } 6503 &FloatCC::Ordered => { 6504 // Rule at src/isa/x64/lower.isle line 1595. 6505 let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?; 6506 let expr1_0 = CC::NP; 6507 let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; 6508 let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?; 6509 let expr4_0 = C::output(ctx, expr3_0); 6510 return Some(expr4_0); 6511 } 6512 &FloatCC::OrderedNotEqual => { 6513 // Rule at src/isa/x64/lower.isle line 1599. 6514 let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?; 6515 let expr1_0 = CC::NZ; 6516 let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; 6517 let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?; 6518 let expr4_0 = C::output(ctx, expr3_0); 6519 return Some(expr4_0); 6520 } 6521 &FloatCC::Unordered => { 6522 // Rule at src/isa/x64/lower.isle line 1597. 6523 let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?; 6524 let expr1_0 = CC::P; 6525 let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; 6526 let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?; 6527 let expr4_0 = C::output(ctx, expr3_0); 6528 return Some(expr4_0); 6529 } 6530 &FloatCC::UnorderedOrEqual => { 6531 // Rule at src/isa/x64/lower.isle line 1601. 6532 let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?; 6533 let expr1_0 = CC::Z; 6534 let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; 6535 let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?; 6536 let expr4_0 = C::output(ctx, expr3_0); 6537 return Some(expr4_0); 6538 } 6539 &FloatCC::UnorderedOrGreaterThan => { 6540 // Rule at src/isa/x64/lower.isle line 1621. 6541 let expr0_0 = constructor_x64_ucomis(ctx, pattern4_0, pattern4_1)?; 6542 let expr1_0 = CC::B; 6543 let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; 6544 let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?; 6545 let expr4_0 = C::output(ctx, expr3_0); 6546 return Some(expr4_0); 6547 } 6548 &FloatCC::UnorderedOrGreaterThanOrEqual => { 6549 // Rule at src/isa/x64/lower.isle line 1624. 6550 let expr0_0 = constructor_x64_ucomis(ctx, pattern4_0, pattern4_1)?; 6551 let expr1_0 = CC::BE; 6552 let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; 6553 let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?; 6554 let expr4_0 = C::output(ctx, expr3_0); 6555 return Some(expr4_0); 6556 } 6557 &FloatCC::UnorderedOrLessThan => { 6558 // Rule at src/isa/x64/lower.isle line 1607. 6559 let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?; 6560 let expr1_0 = CC::B; 6561 let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; 6562 let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?; 6563 let expr4_0 = C::output(ctx, expr3_0); 6564 return Some(expr4_0); 6565 } 6566 &FloatCC::UnorderedOrLessThanOrEqual => { 6567 // Rule at src/isa/x64/lower.isle line 1609. 6568 let expr0_0 = constructor_x64_ucomis(ctx, pattern4_1, pattern4_0)?; 6569 let expr1_0 = CC::BE; 6570 let expr2_0 = constructor_x64_setcc(ctx, &expr1_0)?; 6571 let expr3_0 = constructor_with_flags(ctx, &expr0_0, &expr2_0)?; 6572 let expr4_0 = C::output(ctx, expr3_0); 6573 return Some(expr4_0); 6574 } 6575 _ => {} 6576 } 6577 } 6578 if let Some(pattern6_0) = C::ty_vec128(ctx, pattern5_0) { 6579 match pattern2_2 { 6580 &FloatCC::Equal => { 6581 // Rule at src/isa/x64/lower.isle line 1632. 6582 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6583 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; 6584 let expr2_0 = FcmpImm::Equal; 6585 let expr3_0 = 6586 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?; 6587 let expr4_0 = constructor_output_xmm(ctx, expr3_0)?; 6588 return Some(expr4_0); 6589 } 6590 &FloatCC::GreaterThan => { 6591 // Rule at src/isa/x64/lower.isle line 1652. 6592 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1)?; 6593 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?; 6594 let expr2_0 = FcmpImm::LessThan; 6595 let expr3_0 = 6596 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?; 6597 let expr4_0 = constructor_output_xmm(ctx, expr3_0)?; 6598 return Some(expr4_0); 6599 } 6600 &FloatCC::GreaterThanOrEqual => { 6601 // Rule at src/isa/x64/lower.isle line 1654. 6602 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1)?; 6603 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?; 6604 let expr2_0 = FcmpImm::LessThanOrEqual; 6605 let expr3_0 = 6606 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?; 6607 let expr4_0 = constructor_output_xmm(ctx, expr3_0)?; 6608 return Some(expr4_0); 6609 } 6610 &FloatCC::LessThan => { 6611 // Rule at src/isa/x64/lower.isle line 1636. 6612 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6613 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; 6614 let expr2_0 = FcmpImm::LessThan; 6615 let expr3_0 = 6616 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?; 6617 let expr4_0 = constructor_output_xmm(ctx, expr3_0)?; 6618 return Some(expr4_0); 6619 } 6620 &FloatCC::LessThanOrEqual => { 6621 // Rule at src/isa/x64/lower.isle line 1638. 6622 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6623 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; 6624 let expr2_0 = FcmpImm::LessThanOrEqual; 6625 let expr3_0 = 6626 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?; 6627 let expr4_0 = constructor_output_xmm(ctx, expr3_0)?; 6628 return Some(expr4_0); 6629 } 6630 &FloatCC::NotEqual => { 6631 // Rule at src/isa/x64/lower.isle line 1634. 6632 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6633 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; 6634 let expr2_0 = FcmpImm::NotEqual; 6635 let expr3_0 = 6636 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?; 6637 let expr4_0 = constructor_output_xmm(ctx, expr3_0)?; 6638 return Some(expr4_0); 6639 } 6640 &FloatCC::Ordered => { 6641 // Rule at src/isa/x64/lower.isle line 1640. 6642 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6643 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; 6644 let expr2_0 = FcmpImm::Ordered; 6645 let expr3_0 = 6646 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?; 6647 let expr4_0 = constructor_output_xmm(ctx, expr3_0)?; 6648 return Some(expr4_0); 6649 } 6650 &FloatCC::Unordered => { 6651 // Rule at src/isa/x64/lower.isle line 1642. 6652 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6653 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; 6654 let expr2_0 = FcmpImm::Unordered; 6655 let expr3_0 = 6656 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?; 6657 let expr4_0 = constructor_output_xmm(ctx, expr3_0)?; 6658 return Some(expr4_0); 6659 } 6660 &FloatCC::UnorderedOrGreaterThan => { 6661 // Rule at src/isa/x64/lower.isle line 1644. 6662 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6663 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; 6664 let expr2_0 = FcmpImm::UnorderedOrGreaterThan; 6665 let expr3_0 = 6666 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?; 6667 let expr4_0 = constructor_output_xmm(ctx, expr3_0)?; 6668 return Some(expr4_0); 6669 } 6670 &FloatCC::UnorderedOrGreaterThanOrEqual => { 6671 // Rule at src/isa/x64/lower.isle line 1646. 6672 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6673 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; 6674 let expr2_0 = FcmpImm::UnorderedOrGreaterThanOrEqual; 6675 let expr3_0 = 6676 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?; 6677 let expr4_0 = constructor_output_xmm(ctx, expr3_0)?; 6678 return Some(expr4_0); 6679 } 6680 &FloatCC::UnorderedOrLessThan => { 6681 // Rule at src/isa/x64/lower.isle line 1656. 6682 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1)?; 6683 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?; 6684 let expr2_0 = FcmpImm::UnorderedOrGreaterThan; 6685 let expr3_0 = 6686 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?; 6687 let expr4_0 = constructor_output_xmm(ctx, expr3_0)?; 6688 return Some(expr4_0); 6689 } 6690 &FloatCC::UnorderedOrLessThanOrEqual => { 6691 // Rule at src/isa/x64/lower.isle line 1658. 6692 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1)?; 6693 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?; 6694 let expr2_0 = FcmpImm::UnorderedOrGreaterThanOrEqual; 6695 let expr3_0 = 6696 constructor_x64_cmpp(ctx, pattern6_0, expr0_0, &expr1_0, &expr2_0)?; 6697 let expr4_0 = constructor_output_xmm(ctx, expr3_0)?; 6698 return Some(expr4_0); 6699 } 6700 _ => {} 6701 } 6702 } 6703 } 6704 } 6705 &InstructionData::IntCompare { 6706 opcode: ref pattern2_0, 6707 args: ref pattern2_1, 6708 cond: ref pattern2_2, 6709 } => { 6710 if let &Opcode::Icmp = pattern2_0 { 6711 let (pattern4_0, pattern4_1) = C::unpack_value_array_2(ctx, pattern2_1); 6712 let pattern5_0 = C::value_type(ctx, pattern4_0); 6713 if pattern5_0 == I128 { 6714 match pattern2_2 { 6715 &IntCC::Equal => { 6716 // Rule at src/isa/x64/lower.isle line 1526. 6717 let expr0_0 = C::put_in_regs(ctx, pattern4_0); 6718 let expr1_0: usize = 0; 6719 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 6720 let expr3_0 = C::put_in_regs(ctx, pattern4_0); 6721 let expr4_0: usize = 1; 6722 let expr5_0 = constructor_value_regs_get_gpr(ctx, expr3_0, expr4_0)?; 6723 let expr6_0 = C::put_in_regs(ctx, pattern4_1); 6724 let expr7_0: usize = 0; 6725 let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0)?; 6726 let expr9_0 = C::put_in_regs(ctx, pattern4_1); 6727 let expr10_0: usize = 1; 6728 let expr11_0 = constructor_value_regs_get_gpr(ctx, expr9_0, expr10_0)?; 6729 let expr12_0 = OperandSize::Size64; 6730 let expr13_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0); 6731 let expr14_0 = constructor_x64_cmp(ctx, &expr12_0, &expr13_0, expr2_0)?; 6732 let expr15_0 = CC::Z; 6733 let expr16_0 = constructor_x64_setcc(ctx, &expr15_0)?; 6734 let expr17_0 = constructor_with_flags_reg(ctx, &expr14_0, &expr16_0)?; 6735 let expr18_0 = OperandSize::Size64; 6736 let expr19_0 = C::gpr_to_gpr_mem_imm(ctx, expr11_0); 6737 let expr20_0 = constructor_x64_cmp(ctx, &expr18_0, &expr19_0, expr5_0)?; 6738 let expr21_0 = CC::Z; 6739 let expr22_0 = constructor_x64_setcc(ctx, &expr21_0)?; 6740 let expr23_0 = constructor_with_flags_reg(ctx, &expr20_0, &expr22_0)?; 6741 let expr24_0: Type = I64; 6742 let expr25_0 = C::gpr_new(ctx, expr17_0); 6743 let expr26_0 = constructor_reg_to_gpr_mem_imm(ctx, expr23_0)?; 6744 let expr27_0 = constructor_x64_and(ctx, expr24_0, expr25_0, &expr26_0)?; 6745 let expr28_0 = C::gpr_to_reg(ctx, expr27_0); 6746 let expr29_0 = OperandSize::Size64; 6747 let expr30_0: u32 = 1; 6748 let expr31_0 = RegMemImm::Imm { simm32: expr30_0 }; 6749 let expr32_0 = C::gpr_mem_imm_new(ctx, &expr31_0); 6750 let expr33_0 = C::gpr_new(ctx, expr28_0); 6751 let expr34_0 = 6752 constructor_x64_test(ctx, &expr29_0, &expr32_0, expr33_0)?; 6753 let expr35_0 = CC::NZ; 6754 let expr36_0 = constructor_x64_setcc(ctx, &expr35_0)?; 6755 let expr37_0 = constructor_with_flags(ctx, &expr34_0, &expr36_0)?; 6756 let expr38_0 = C::output(ctx, expr37_0); 6757 return Some(expr38_0); 6758 } 6759 &IntCC::NotEqual => { 6760 // Rule at src/isa/x64/lower.isle line 1545. 6761 let expr0_0 = C::put_in_regs(ctx, pattern4_0); 6762 let expr1_0: usize = 0; 6763 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 6764 let expr3_0 = C::put_in_regs(ctx, pattern4_0); 6765 let expr4_0: usize = 1; 6766 let expr5_0 = constructor_value_regs_get_gpr(ctx, expr3_0, expr4_0)?; 6767 let expr6_0 = C::put_in_regs(ctx, pattern4_1); 6768 let expr7_0: usize = 0; 6769 let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0)?; 6770 let expr9_0 = C::put_in_regs(ctx, pattern4_1); 6771 let expr10_0: usize = 1; 6772 let expr11_0 = constructor_value_regs_get_gpr(ctx, expr9_0, expr10_0)?; 6773 let expr12_0 = OperandSize::Size64; 6774 let expr13_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0); 6775 let expr14_0 = constructor_x64_cmp(ctx, &expr12_0, &expr13_0, expr2_0)?; 6776 let expr15_0 = CC::NZ; 6777 let expr16_0 = constructor_x64_setcc(ctx, &expr15_0)?; 6778 let expr17_0 = constructor_with_flags_reg(ctx, &expr14_0, &expr16_0)?; 6779 let expr18_0 = OperandSize::Size64; 6780 let expr19_0 = C::gpr_to_gpr_mem_imm(ctx, expr11_0); 6781 let expr20_0 = constructor_x64_cmp(ctx, &expr18_0, &expr19_0, expr5_0)?; 6782 let expr21_0 = CC::NZ; 6783 let expr22_0 = constructor_x64_setcc(ctx, &expr21_0)?; 6784 let expr23_0 = constructor_with_flags_reg(ctx, &expr20_0, &expr22_0)?; 6785 let expr24_0: Type = I64; 6786 let expr25_0 = C::gpr_new(ctx, expr17_0); 6787 let expr26_0 = constructor_reg_to_gpr_mem_imm(ctx, expr23_0)?; 6788 let expr27_0 = constructor_x64_or(ctx, expr24_0, expr25_0, &expr26_0)?; 6789 let expr28_0 = C::gpr_to_reg(ctx, expr27_0); 6790 let expr29_0 = OperandSize::Size64; 6791 let expr30_0: u32 = 1; 6792 let expr31_0 = RegMemImm::Imm { simm32: expr30_0 }; 6793 let expr32_0 = C::gpr_mem_imm_new(ctx, &expr31_0); 6794 let expr33_0 = C::gpr_new(ctx, expr28_0); 6795 let expr34_0 = 6796 constructor_x64_test(ctx, &expr29_0, &expr32_0, expr33_0)?; 6797 let expr35_0 = CC::NZ; 6798 let expr36_0 = constructor_x64_setcc(ctx, &expr35_0)?; 6799 let expr37_0 = constructor_with_flags(ctx, &expr34_0, &expr36_0)?; 6800 let expr38_0 = C::output(ctx, expr37_0); 6801 return Some(expr38_0); 6802 } 6803 _ => {} 6804 } 6805 } 6806 if pattern5_0 == I64X2 { 6807 match pattern2_2 { 6808 &IntCC::SignedGreaterThanOrEqual => { 6809 // Rule at src/isa/x64/lower.isle line 1511. 6810 let expr0_0: Type = I64X2; 6811 let expr1_0 = constructor_put_in_xmm(ctx, pattern4_1)?; 6812 let expr2_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?; 6813 let expr3_0 = constructor_x64_pcmpgt(ctx, expr0_0, expr1_0, &expr2_0)?; 6814 let expr4_0: Type = I64X2; 6815 let expr5_0 = constructor_vector_all_ones(ctx, expr4_0)?; 6816 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); 6817 let expr7_0 = constructor_x64_pxor(ctx, expr3_0, &expr6_0)?; 6818 let expr8_0 = constructor_output_xmm(ctx, expr7_0)?; 6819 return Some(expr8_0); 6820 } 6821 &IntCC::SignedLessThanOrEqual => { 6822 // Rule at src/isa/x64/lower.isle line 1515. 6823 let expr0_0: Type = I64X2; 6824 let expr1_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6825 let expr2_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; 6826 let expr3_0 = constructor_x64_pcmpgt(ctx, expr0_0, expr1_0, &expr2_0)?; 6827 let expr4_0: Type = I64X2; 6828 let expr5_0 = constructor_vector_all_ones(ctx, expr4_0)?; 6829 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); 6830 let expr7_0 = constructor_x64_pxor(ctx, expr3_0, &expr6_0)?; 6831 let expr8_0 = constructor_output_xmm(ctx, expr7_0)?; 6832 return Some(expr8_0); 6833 } 6834 _ => {} 6835 } 6836 } 6837 if let Some(pattern6_0) = C::fits_in_64(ctx, pattern5_0) { 6838 // Rule at src/isa/x64/lower.isle line 1451. 6839 let expr0_0 = C::raw_operand_size_of_type(ctx, pattern6_0); 6840 let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern4_1)?; 6841 let expr2_0 = constructor_put_in_gpr(ctx, pattern4_0)?; 6842 let expr3_0 = constructor_x64_cmp(ctx, &expr0_0, &expr1_0, expr2_0)?; 6843 let expr4_0 = C::intcc_to_cc(ctx, pattern2_2); 6844 let expr5_0 = constructor_x64_setcc(ctx, &expr4_0)?; 6845 let expr6_0 = constructor_with_flags(ctx, &expr3_0, &expr5_0)?; 6846 let expr7_0 = C::output(ctx, expr6_0); 6847 return Some(expr7_0); 6848 } 6849 if let Some(pattern6_0) = C::ty_vec128(ctx, pattern5_0) { 6850 match pattern2_2 { 6851 &IntCC::Equal => { 6852 // Rule at src/isa/x64/lower.isle line 1460. 6853 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6854 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; 6855 let expr2_0 = 6856 constructor_x64_pcmpeq(ctx, pattern6_0, expr0_0, &expr1_0)?; 6857 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 6858 return Some(expr3_0); 6859 } 6860 &IntCC::NotEqual => { 6861 // Rule at src/isa/x64/lower.isle line 1464. 6862 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6863 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; 6864 let expr2_0 = 6865 constructor_x64_pcmpeq(ctx, pattern6_0, expr0_0, &expr1_0)?; 6866 let expr3_0 = constructor_vector_all_ones(ctx, pattern6_0)?; 6867 let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0); 6868 let expr5_0 = constructor_x64_pxor(ctx, expr2_0, &expr4_0)?; 6869 let expr6_0 = constructor_output_xmm(ctx, expr5_0)?; 6870 return Some(expr6_0); 6871 } 6872 &IntCC::SignedGreaterThan => { 6873 // Rule at src/isa/x64/lower.isle line 1471. 6874 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6875 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; 6876 let expr2_0 = 6877 constructor_x64_pcmpgt(ctx, pattern6_0, expr0_0, &expr1_0)?; 6878 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 6879 return Some(expr3_0); 6880 } 6881 &IntCC::SignedGreaterThanOrEqual => { 6882 // Rule at src/isa/x64/lower.isle line 1496. 6883 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6884 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; 6885 let expr2_0 = 6886 constructor_x64_pmaxs(ctx, pattern6_0, expr0_0, &expr1_0)?; 6887 let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6888 let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0); 6889 let expr5_0 = 6890 constructor_x64_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0)?; 6891 let expr6_0 = constructor_output_xmm(ctx, expr5_0)?; 6892 return Some(expr6_0); 6893 } 6894 &IntCC::SignedLessThan => { 6895 // Rule at src/isa/x64/lower.isle line 1473. 6896 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_1)?; 6897 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_0)?; 6898 let expr2_0 = 6899 constructor_x64_pcmpgt(ctx, pattern6_0, expr0_0, &expr1_0)?; 6900 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 6901 return Some(expr3_0); 6902 } 6903 &IntCC::SignedLessThanOrEqual => { 6904 // Rule at src/isa/x64/lower.isle line 1499. 6905 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6906 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; 6907 let expr2_0 = 6908 constructor_x64_pmins(ctx, pattern6_0, expr0_0, &expr1_0)?; 6909 let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6910 let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0); 6911 let expr5_0 = 6912 constructor_x64_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0)?; 6913 let expr6_0 = constructor_output_xmm(ctx, expr5_0)?; 6914 return Some(expr6_0); 6915 } 6916 &IntCC::UnsignedGreaterThan => { 6917 // Rule at src/isa/x64/lower.isle line 1475. 6918 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6919 let expr1_0 = constructor_put_in_xmm(ctx, pattern4_1)?; 6920 let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 6921 let expr3_0 = 6922 constructor_x64_pmaxu(ctx, pattern6_0, expr0_0, &expr2_0)?; 6923 let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 6924 let expr5_0 = 6925 constructor_x64_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0)?; 6926 let expr6_0 = constructor_vector_all_ones(ctx, pattern6_0)?; 6927 let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0); 6928 let expr8_0 = constructor_x64_pxor(ctx, expr5_0, &expr7_0)?; 6929 let expr9_0 = constructor_output_xmm(ctx, expr8_0)?; 6930 return Some(expr9_0); 6931 } 6932 &IntCC::UnsignedGreaterThanOrEqual => { 6933 // Rule at src/isa/x64/lower.isle line 1502. 6934 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6935 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; 6936 let expr2_0 = 6937 constructor_x64_pmaxu(ctx, pattern6_0, expr0_0, &expr1_0)?; 6938 let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6939 let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0); 6940 let expr5_0 = 6941 constructor_x64_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0)?; 6942 let expr6_0 = constructor_output_xmm(ctx, expr5_0)?; 6943 return Some(expr6_0); 6944 } 6945 &IntCC::UnsignedLessThan => { 6946 // Rule at src/isa/x64/lower.isle line 1485. 6947 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6948 let expr1_0 = constructor_put_in_xmm(ctx, pattern4_1)?; 6949 let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 6950 let expr3_0 = 6951 constructor_x64_pminu(ctx, pattern6_0, expr0_0, &expr2_0)?; 6952 let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 6953 let expr5_0 = 6954 constructor_x64_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0)?; 6955 let expr6_0 = constructor_vector_all_ones(ctx, pattern6_0)?; 6956 let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0); 6957 let expr8_0 = constructor_x64_pxor(ctx, expr5_0, &expr7_0)?; 6958 let expr9_0 = constructor_output_xmm(ctx, expr8_0)?; 6959 return Some(expr9_0); 6960 } 6961 &IntCC::UnsignedLessThanOrEqual => { 6962 // Rule at src/isa/x64/lower.isle line 1505. 6963 let expr0_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6964 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern4_1)?; 6965 let expr2_0 = 6966 constructor_x64_pminu(ctx, pattern6_0, expr0_0, &expr1_0)?; 6967 let expr3_0 = constructor_put_in_xmm(ctx, pattern4_0)?; 6968 let expr4_0 = C::xmm_to_xmm_mem(ctx, expr2_0); 6969 let expr5_0 = 6970 constructor_x64_pcmpeq(ctx, pattern6_0, expr3_0, &expr4_0)?; 6971 let expr6_0 = constructor_output_xmm(ctx, expr5_0)?; 6972 return Some(expr6_0); 6973 } 6974 _ => {} 6975 } 6976 } 6977 } 6978 } 6979 &InstructionData::Unary { 6980 opcode: ref pattern2_0, 6981 arg: pattern2_1, 6982 } => { 6983 match pattern2_0 { 6984 &Opcode::IsNull => { 6985 let pattern4_0 = C::value_type(ctx, pattern2_1); 6986 if pattern4_0 == R64 { 6987 // Rule at src/isa/x64/lower.isle line 2097. 6988 let expr0_0 = OperandSize::Size64; 6989 let expr1_0: u32 = 0; 6990 let expr2_0 = constructor_put_in_gpr(ctx, pattern2_1)?; 6991 let expr3_0 = constructor_x64_cmp_imm(ctx, &expr0_0, expr1_0, expr2_0)?; 6992 let expr4_0 = CC::Z; 6993 let expr5_0 = constructor_x64_setcc(ctx, &expr4_0)?; 6994 let expr6_0 = constructor_with_flags(ctx, &expr3_0, &expr5_0)?; 6995 let expr7_0 = C::output(ctx, expr6_0); 6996 return Some(expr7_0); 6997 } 6998 } 6999 &Opcode::IsInvalid => { 7000 let pattern4_0 = C::value_type(ctx, pattern2_1); 7001 if pattern4_0 == R64 { 7002 // Rule at src/isa/x64/lower.isle line 2105. 7003 let expr0_0 = OperandSize::Size64; 7004 let expr1_0: u32 = 4294967295; 7005 let expr2_0 = constructor_put_in_gpr(ctx, pattern2_1)?; 7006 let expr3_0 = constructor_x64_cmp_imm(ctx, &expr0_0, expr1_0, expr2_0)?; 7007 let expr4_0 = CC::Z; 7008 let expr5_0 = constructor_x64_setcc(ctx, &expr4_0)?; 7009 let expr6_0 = constructor_with_flags(ctx, &expr3_0, &expr5_0)?; 7010 let expr7_0 = C::output(ctx, expr6_0); 7011 return Some(expr7_0); 7012 } 7013 } 7014 _ => {} 7015 } 7016 } 7017 _ => {} 7018 } 7019 if let Some(pattern1_0) = C::first_result(ctx, pattern0_0) { 7020 let pattern2_0 = C::value_type(ctx, pattern1_0); 7021 if pattern2_0 == B128 { 7022 let pattern4_0 = C::inst_data(ctx, pattern0_0); 7023 match &pattern4_0 { 7024 &InstructionData::UnaryBool { 7025 opcode: ref pattern5_0, 7026 imm: pattern5_1, 7027 } => { 7028 if let &Opcode::Bconst = pattern5_0 { 7029 if pattern5_1 == true { 7030 // Rule at src/isa/x64/lower.isle line 39. 7031 let expr0_0: Type = B64; 7032 let expr1_0: u64 = 1; 7033 let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?; 7034 let expr3_0: Type = B64; 7035 let expr4_0: u64 = 0; 7036 let expr5_0 = constructor_imm(ctx, expr3_0, expr4_0)?; 7037 let expr6_0 = C::value_regs(ctx, expr2_0, expr5_0); 7038 let expr7_0 = C::output(ctx, expr6_0); 7039 return Some(expr7_0); 7040 } 7041 if pattern5_1 == false { 7042 // Rule at src/isa/x64/lower.isle line 34. 7043 let expr0_0: Type = B64; 7044 let expr1_0: u64 = 0; 7045 let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?; 7046 let expr3_0: Type = B64; 7047 let expr4_0: u64 = 0; 7048 let expr5_0 = constructor_imm(ctx, expr3_0, expr4_0)?; 7049 let expr6_0 = C::value_regs(ctx, expr2_0, expr5_0); 7050 let expr7_0 = C::output(ctx, expr6_0); 7051 return Some(expr7_0); 7052 } 7053 } 7054 } 7055 &InstructionData::Binary { 7056 opcode: ref pattern5_0, 7057 args: ref pattern5_1, 7058 } => { 7059 match pattern5_0 { 7060 &Opcode::Band => { 7061 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7062 // Rule at src/isa/x64/lower.isle line 344. 7063 let expr0_0 = C::put_in_regs(ctx, pattern7_0); 7064 let expr1_0: usize = 0; 7065 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 7066 let expr3_0: usize = 1; 7067 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?; 7068 let expr5_0 = constructor_lo_gpr(ctx, pattern7_1)?; 7069 let expr6_0: Type = I64; 7070 let expr7_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0); 7071 let expr8_0 = constructor_x64_and(ctx, expr6_0, expr2_0, &expr7_0)?; 7072 let expr9_0 = constructor_value_gprs(ctx, expr8_0, expr4_0)?; 7073 let expr10_0 = C::output(ctx, expr9_0); 7074 return Some(expr10_0); 7075 } 7076 &Opcode::Bor => { 7077 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7078 // Rule at src/isa/x64/lower.isle line 410. 7079 let expr0_0 = C::put_in_regs(ctx, pattern7_0); 7080 let expr1_0: usize = 0; 7081 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 7082 let expr3_0: usize = 1; 7083 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?; 7084 let expr5_0 = constructor_lo_gpr(ctx, pattern7_1)?; 7085 let expr6_0: Type = I64; 7086 let expr7_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0); 7087 let expr8_0 = constructor_x64_or(ctx, expr6_0, expr2_0, &expr7_0)?; 7088 let expr9_0 = constructor_value_gprs(ctx, expr8_0, expr4_0)?; 7089 let expr10_0 = C::output(ctx, expr9_0); 7090 return Some(expr10_0); 7091 } 7092 &Opcode::Bxor => { 7093 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7094 // Rule at src/isa/x64/lower.isle line 468. 7095 let expr0_0 = C::put_in_regs(ctx, pattern7_0); 7096 let expr1_0: usize = 0; 7097 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 7098 let expr3_0: usize = 1; 7099 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?; 7100 let expr5_0 = constructor_lo_gpr(ctx, pattern7_1)?; 7101 let expr6_0: Type = I64; 7102 let expr7_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0); 7103 let expr8_0 = constructor_x64_xor(ctx, expr6_0, expr2_0, &expr7_0)?; 7104 let expr9_0 = constructor_value_gprs(ctx, expr8_0, expr4_0)?; 7105 let expr10_0 = C::output(ctx, expr9_0); 7106 return Some(expr10_0); 7107 } 7108 _ => {} 7109 } 7110 } 7111 &InstructionData::Unary { 7112 opcode: ref pattern5_0, 7113 arg: pattern5_1, 7114 } => { 7115 if let &Opcode::Bnot = pattern5_0 { 7116 // Rule at src/isa/x64/lower.isle line 1269. 7117 let expr0_0 = constructor_i128_not(ctx, pattern5_1)?; 7118 let expr1_0 = C::output(ctx, expr0_0); 7119 return Some(expr1_0); 7120 } 7121 } 7122 _ => {} 7123 } 7124 } 7125 if pattern2_0 == I8 { 7126 let pattern4_0 = C::inst_data(ctx, pattern0_0); 7127 if let &InstructionData::Unary { 7128 opcode: ref pattern5_0, 7129 arg: pattern5_1, 7130 } = &pattern4_0 7131 { 7132 if let &Opcode::Bitrev = pattern5_0 { 7133 // Rule at src/isa/x64/lower.isle line 2019. 7134 let expr0_0: Type = I32; 7135 let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?; 7136 let expr2_0 = constructor_do_bitrev8(ctx, expr0_0, expr1_0)?; 7137 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 7138 return Some(expr3_0); 7139 } 7140 } 7141 } 7142 if pattern2_0 == I16 { 7143 let pattern4_0 = C::inst_data(ctx, pattern0_0); 7144 if let &InstructionData::Unary { 7145 opcode: ref pattern5_0, 7146 arg: pattern5_1, 7147 } = &pattern4_0 7148 { 7149 if let &Opcode::Bitrev = pattern5_0 { 7150 // Rule at src/isa/x64/lower.isle line 2022. 7151 let expr0_0: Type = I32; 7152 let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?; 7153 let expr2_0 = constructor_do_bitrev16(ctx, expr0_0, expr1_0)?; 7154 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 7155 return Some(expr3_0); 7156 } 7157 } 7158 } 7159 if pattern2_0 == I32 { 7160 let pattern4_0 = C::inst_data(ctx, pattern0_0); 7161 if let &InstructionData::Unary { 7162 opcode: ref pattern5_0, 7163 arg: pattern5_1, 7164 } = &pattern4_0 7165 { 7166 if let &Opcode::Bitrev = pattern5_0 { 7167 // Rule at src/isa/x64/lower.isle line 2025. 7168 let expr0_0: Type = I32; 7169 let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?; 7170 let expr2_0 = constructor_do_bitrev32(ctx, expr0_0, expr1_0)?; 7171 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 7172 return Some(expr3_0); 7173 } 7174 } 7175 } 7176 if pattern2_0 == I64 { 7177 let pattern4_0 = C::inst_data(ctx, pattern0_0); 7178 if let &InstructionData::Unary { 7179 opcode: ref pattern5_0, 7180 arg: pattern5_1, 7181 } = &pattern4_0 7182 { 7183 match pattern5_0 { 7184 &Opcode::Bitrev => { 7185 // Rule at src/isa/x64/lower.isle line 2028. 7186 let expr0_0: Type = I64; 7187 let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?; 7188 let expr2_0 = constructor_do_bitrev64(ctx, expr0_0, expr1_0)?; 7189 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 7190 return Some(expr3_0); 7191 } 7192 &Opcode::Uextend => { 7193 if let Some(pattern7_0) = C::def_inst(ctx, pattern5_1) { 7194 if let Some(pattern8_0) = C::first_result(ctx, pattern7_0) { 7195 let pattern9_0 = C::value_type(ctx, pattern8_0); 7196 if pattern9_0 == I32 { 7197 let pattern11_0 = C::inst_data(ctx, pattern7_0); 7198 match &pattern11_0 { 7199 &InstructionData::Binary { 7200 opcode: ref pattern12_0, 7201 args: ref pattern12_1, 7202 } => { 7203 match pattern12_0 { 7204 &Opcode::Iadd => { 7205 let (pattern14_0, pattern14_1) = 7206 C::unpack_value_array_2(ctx, pattern12_1); 7207 // Rule at src/isa/x64/lower.isle line 2144. 7208 let expr0_0 = 7209 constructor_output_value(ctx, pattern5_1)?; 7210 return Some(expr0_0); 7211 } 7212 &Opcode::Isub => { 7213 let (pattern14_0, pattern14_1) = 7214 C::unpack_value_array_2(ctx, pattern12_1); 7215 // Rule at src/isa/x64/lower.isle line 2150. 7216 let expr0_0 = 7217 constructor_output_value(ctx, pattern5_1)?; 7218 return Some(expr0_0); 7219 } 7220 &Opcode::Imul => { 7221 let (pattern14_0, pattern14_1) = 7222 C::unpack_value_array_2(ctx, pattern12_1); 7223 // Rule at src/isa/x64/lower.isle line 2153. 7224 let expr0_0 = 7225 constructor_output_value(ctx, pattern5_1)?; 7226 return Some(expr0_0); 7227 } 7228 &Opcode::IaddIfcout => { 7229 let (pattern14_0, pattern14_1) = 7230 C::unpack_value_array_2(ctx, pattern12_1); 7231 // Rule at src/isa/x64/lower.isle line 2147. 7232 let expr0_0 = 7233 constructor_output_value(ctx, pattern5_1)?; 7234 return Some(expr0_0); 7235 } 7236 &Opcode::Band => { 7237 let (pattern14_0, pattern14_1) = 7238 C::unpack_value_array_2(ctx, pattern12_1); 7239 // Rule at src/isa/x64/lower.isle line 2156. 7240 let expr0_0 = 7241 constructor_output_value(ctx, pattern5_1)?; 7242 return Some(expr0_0); 7243 } 7244 &Opcode::Bor => { 7245 let (pattern14_0, pattern14_1) = 7246 C::unpack_value_array_2(ctx, pattern12_1); 7247 // Rule at src/isa/x64/lower.isle line 2159. 7248 let expr0_0 = 7249 constructor_output_value(ctx, pattern5_1)?; 7250 return Some(expr0_0); 7251 } 7252 &Opcode::Bxor => { 7253 let (pattern14_0, pattern14_1) = 7254 C::unpack_value_array_2(ctx, pattern12_1); 7255 // Rule at src/isa/x64/lower.isle line 2162. 7256 let expr0_0 = 7257 constructor_output_value(ctx, pattern5_1)?; 7258 return Some(expr0_0); 7259 } 7260 &Opcode::Ishl => { 7261 let (pattern14_0, pattern14_1) = 7262 C::unpack_value_array_2(ctx, pattern12_1); 7263 // Rule at src/isa/x64/lower.isle line 2165. 7264 let expr0_0 = 7265 constructor_output_value(ctx, pattern5_1)?; 7266 return Some(expr0_0); 7267 } 7268 &Opcode::Ushr => { 7269 let (pattern14_0, pattern14_1) = 7270 C::unpack_value_array_2(ctx, pattern12_1); 7271 // Rule at src/isa/x64/lower.isle line 2168. 7272 let expr0_0 = 7273 constructor_output_value(ctx, pattern5_1)?; 7274 return Some(expr0_0); 7275 } 7276 _ => {} 7277 } 7278 } 7279 &InstructionData::Load { 7280 opcode: ref pattern12_0, 7281 arg: pattern12_1, 7282 flags: pattern12_2, 7283 offset: pattern12_3, 7284 } => { 7285 if let &Opcode::Uload32 = pattern12_0 { 7286 // Rule at src/isa/x64/lower.isle line 2171. 7287 let expr0_0 = 7288 constructor_output_value(ctx, pattern5_1)?; 7289 return Some(expr0_0); 7290 } 7291 } 7292 _ => {} 7293 } 7294 } 7295 } 7296 } 7297 let pattern7_0 = C::value_type(ctx, pattern5_1); 7298 if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) { 7299 // Rule at src/isa/x64/lower.isle line 2126. 7300 let expr0_0: Type = I64; 7301 let expr1_0 = ExtendKind::Zero; 7302 let expr2_0 = 7303 constructor_extend_to_gpr(ctx, pattern5_1, expr0_0, &expr1_0)?; 7304 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 7305 return Some(expr3_0); 7306 } 7307 } 7308 _ => {} 7309 } 7310 } 7311 } 7312 if pattern2_0 == I128 { 7313 let pattern4_0 = C::inst_data(ctx, pattern0_0); 7314 match &pattern4_0 { 7315 &InstructionData::UnaryImm { 7316 opcode: ref pattern5_0, 7317 imm: pattern5_1, 7318 } => { 7319 if let &Opcode::Iconst = pattern5_0 { 7320 let pattern7_0 = C::u64_from_imm64(ctx, pattern5_1); 7321 // Rule at src/isa/x64/lower.isle line 15. 7322 let expr0_0: Type = I64; 7323 let expr1_0 = constructor_imm(ctx, expr0_0, pattern7_0)?; 7324 let expr2_0: Type = I64; 7325 let expr3_0: u64 = 0; 7326 let expr4_0 = constructor_imm(ctx, expr2_0, expr3_0)?; 7327 let expr5_0 = C::value_regs(ctx, expr1_0, expr4_0); 7328 let expr6_0 = C::output(ctx, expr5_0); 7329 return Some(expr6_0); 7330 } 7331 } 7332 &InstructionData::Binary { 7333 opcode: ref pattern5_0, 7334 args: ref pattern5_1, 7335 } => { 7336 match pattern5_0 { 7337 &Opcode::Iadd => { 7338 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7339 // Rule at src/isa/x64/lower.isle line 111. 7340 let expr0_0 = C::put_in_regs(ctx, pattern7_0); 7341 let expr1_0: usize = 0; 7342 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 7343 let expr3_0: usize = 1; 7344 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?; 7345 let expr5_0 = C::put_in_regs(ctx, pattern7_1); 7346 let expr6_0: usize = 0; 7347 let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?; 7348 let expr8_0: usize = 1; 7349 let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?; 7350 let expr10_0: Type = I64; 7351 let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0); 7352 let expr12_0 = constructor_x64_add_with_flags_paired( 7353 ctx, expr10_0, expr2_0, &expr11_0, 7354 )?; 7355 let expr13_0: Type = I64; 7356 let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); 7357 let expr15_0 = 7358 constructor_x64_adc_paired(ctx, expr13_0, expr4_0, &expr14_0)?; 7359 let expr16_0 = constructor_with_flags(ctx, &expr12_0, &expr15_0)?; 7360 let expr17_0 = C::output(ctx, expr16_0); 7361 return Some(expr17_0); 7362 } 7363 &Opcode::Isub => { 7364 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7365 // Rule at src/isa/x64/lower.isle line 257. 7366 let expr0_0 = C::put_in_regs(ctx, pattern7_0); 7367 let expr1_0: usize = 0; 7368 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 7369 let expr3_0: usize = 1; 7370 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?; 7371 let expr5_0 = C::put_in_regs(ctx, pattern7_1); 7372 let expr6_0: usize = 0; 7373 let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?; 7374 let expr8_0: usize = 1; 7375 let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?; 7376 let expr10_0: Type = I64; 7377 let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0); 7378 let expr12_0 = constructor_x64_sub_with_flags_paired( 7379 ctx, expr10_0, expr2_0, &expr11_0, 7380 )?; 7381 let expr13_0: Type = I64; 7382 let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); 7383 let expr15_0 = 7384 constructor_x64_sbb_paired(ctx, expr13_0, expr4_0, &expr14_0)?; 7385 let expr16_0 = constructor_with_flags(ctx, &expr12_0, &expr15_0)?; 7386 let expr17_0 = C::output(ctx, expr16_0); 7387 return Some(expr17_0); 7388 } 7389 &Opcode::Imul => { 7390 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7391 // Rule at src/isa/x64/lower.isle line 957. 7392 let expr0_0 = C::put_in_regs(ctx, pattern7_0); 7393 let expr1_0: usize = 0; 7394 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 7395 let expr3_0: usize = 1; 7396 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?; 7397 let expr5_0 = C::put_in_regs(ctx, pattern7_1); 7398 let expr6_0: usize = 0; 7399 let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?; 7400 let expr8_0: usize = 1; 7401 let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?; 7402 let expr10_0: Type = I64; 7403 let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); 7404 let expr12_0 = constructor_x64_mul(ctx, expr10_0, expr2_0, &expr11_0)?; 7405 let expr13_0: Type = I64; 7406 let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0); 7407 let expr15_0 = constructor_x64_mul(ctx, expr13_0, expr4_0, &expr14_0)?; 7408 let expr16_0: Type = I64; 7409 let expr17_0 = C::gpr_to_gpr_mem_imm(ctx, expr15_0); 7410 let expr18_0 = constructor_x64_add(ctx, expr16_0, expr12_0, &expr17_0)?; 7411 let expr19_0: Type = I64; 7412 let expr20_0 = C::gpr_to_gpr_mem(ctx, expr7_0); 7413 let expr21_0 = constructor_mulhi_u(ctx, expr19_0, expr2_0, &expr20_0)?; 7414 let expr22_0: usize = 0; 7415 let expr23_0 = constructor_value_regs_get_gpr(ctx, expr21_0, expr22_0)?; 7416 let expr24_0: usize = 1; 7417 let expr25_0 = constructor_value_regs_get_gpr(ctx, expr21_0, expr24_0)?; 7418 let expr26_0: Type = I64; 7419 let expr27_0 = C::gpr_to_gpr_mem_imm(ctx, expr25_0); 7420 let expr28_0 = constructor_x64_add(ctx, expr26_0, expr18_0, &expr27_0)?; 7421 let expr29_0 = constructor_value_gprs(ctx, expr23_0, expr28_0)?; 7422 let expr30_0 = C::output(ctx, expr29_0); 7423 return Some(expr30_0); 7424 } 7425 &Opcode::Band => { 7426 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7427 // Rule at src/isa/x64/lower.isle line 334. 7428 let expr0_0 = C::put_in_regs(ctx, pattern7_0); 7429 let expr1_0: usize = 0; 7430 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 7431 let expr3_0: usize = 1; 7432 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?; 7433 let expr5_0 = C::put_in_regs(ctx, pattern7_1); 7434 let expr6_0: usize = 0; 7435 let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?; 7436 let expr8_0: usize = 1; 7437 let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?; 7438 let expr10_0: Type = I64; 7439 let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0); 7440 let expr12_0 = constructor_x64_and(ctx, expr10_0, expr2_0, &expr11_0)?; 7441 let expr13_0: Type = I64; 7442 let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); 7443 let expr15_0 = constructor_x64_and(ctx, expr13_0, expr4_0, &expr14_0)?; 7444 let expr16_0 = constructor_value_gprs(ctx, expr12_0, expr15_0)?; 7445 let expr17_0 = C::output(ctx, expr16_0); 7446 return Some(expr17_0); 7447 } 7448 &Opcode::Bor => { 7449 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7450 // Rule at src/isa/x64/lower.isle line 407. 7451 let expr0_0 = C::put_in_regs(ctx, pattern7_0); 7452 let expr1_0 = C::put_in_regs(ctx, pattern7_1); 7453 let expr2_0 = constructor_or_i128(ctx, expr0_0, expr1_0)?; 7454 let expr3_0 = C::output(ctx, expr2_0); 7455 return Some(expr3_0); 7456 } 7457 &Opcode::Bxor => { 7458 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7459 // Rule at src/isa/x64/lower.isle line 458. 7460 let expr0_0 = C::put_in_regs(ctx, pattern7_0); 7461 let expr1_0: usize = 0; 7462 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 7463 let expr3_0: usize = 1; 7464 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?; 7465 let expr5_0 = C::put_in_regs(ctx, pattern7_1); 7466 let expr6_0: usize = 0; 7467 let expr7_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr6_0)?; 7468 let expr8_0: usize = 1; 7469 let expr9_0 = constructor_value_regs_get_gpr(ctx, expr5_0, expr8_0)?; 7470 let expr10_0: Type = I64; 7471 let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0); 7472 let expr12_0 = constructor_x64_xor(ctx, expr10_0, expr2_0, &expr11_0)?; 7473 let expr13_0: Type = I64; 7474 let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); 7475 let expr15_0 = constructor_x64_xor(ctx, expr13_0, expr4_0, &expr14_0)?; 7476 let expr16_0 = constructor_value_gprs(ctx, expr12_0, expr15_0)?; 7477 let expr17_0 = C::output(ctx, expr16_0); 7478 return Some(expr17_0); 7479 } 7480 &Opcode::Rotl => { 7481 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7482 // Rule at src/isa/x64/lower.isle line 830. 7483 let expr0_0 = C::put_in_regs(ctx, pattern7_0); 7484 let expr1_0 = constructor_lo_gpr(ctx, pattern7_1)?; 7485 let expr2_0 = constructor_shl_i128(ctx, expr0_0, expr1_0)?; 7486 let expr3_0: Type = I64; 7487 let expr4_0: Type = I64; 7488 let expr5_0: u64 = 128; 7489 let expr6_0 = constructor_imm(ctx, expr4_0, expr5_0)?; 7490 let expr7_0 = C::gpr_new(ctx, expr6_0); 7491 let expr8_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0); 7492 let expr9_0 = constructor_x64_sub(ctx, expr3_0, expr7_0, &expr8_0)?; 7493 let expr10_0 = constructor_shr_i128(ctx, expr0_0, expr9_0)?; 7494 let expr11_0 = constructor_or_i128(ctx, expr2_0, expr10_0)?; 7495 let expr12_0 = C::output(ctx, expr11_0); 7496 return Some(expr12_0); 7497 } 7498 &Opcode::Rotr => { 7499 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7500 // Rule at src/isa/x64/lower.isle line 870. 7501 let expr0_0 = C::put_in_regs(ctx, pattern7_0); 7502 let expr1_0 = constructor_lo_gpr(ctx, pattern7_1)?; 7503 let expr2_0 = constructor_shr_i128(ctx, expr0_0, expr1_0)?; 7504 let expr3_0: Type = I64; 7505 let expr4_0: Type = I64; 7506 let expr5_0: u64 = 128; 7507 let expr6_0 = constructor_imm(ctx, expr4_0, expr5_0)?; 7508 let expr7_0 = C::gpr_new(ctx, expr6_0); 7509 let expr8_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0); 7510 let expr9_0 = constructor_x64_sub(ctx, expr3_0, expr7_0, &expr8_0)?; 7511 let expr10_0 = constructor_shl_i128(ctx, expr0_0, expr9_0)?; 7512 let expr11_0 = constructor_or_i128(ctx, expr2_0, expr10_0)?; 7513 let expr12_0 = C::output(ctx, expr11_0); 7514 return Some(expr12_0); 7515 } 7516 &Opcode::Ishl => { 7517 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7518 // Rule at src/isa/x64/lower.isle line 522. 7519 let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?; 7520 let expr1_0 = C::put_in_regs(ctx, pattern7_0); 7521 let expr2_0 = constructor_shl_i128(ctx, expr1_0, expr0_0)?; 7522 let expr3_0 = C::output(ctx, expr2_0); 7523 return Some(expr3_0); 7524 } 7525 &Opcode::Ushr => { 7526 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7527 // Rule at src/isa/x64/lower.isle line 623. 7528 let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?; 7529 let expr1_0 = C::put_in_regs(ctx, pattern7_0); 7530 let expr2_0 = constructor_shr_i128(ctx, expr1_0, expr0_0)?; 7531 let expr3_0 = C::output(ctx, expr2_0); 7532 return Some(expr3_0); 7533 } 7534 &Opcode::Sshr => { 7535 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7536 // Rule at src/isa/x64/lower.isle line 728. 7537 let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?; 7538 let expr1_0 = C::put_in_regs(ctx, pattern7_0); 7539 let expr2_0 = constructor_sar_i128(ctx, expr1_0, expr0_0)?; 7540 let expr3_0 = C::output(ctx, expr2_0); 7541 return Some(expr3_0); 7542 } 7543 _ => {} 7544 } 7545 } 7546 &InstructionData::Unary { 7547 opcode: ref pattern5_0, 7548 arg: pattern5_1, 7549 } => { 7550 match pattern5_0 { 7551 &Opcode::Bnot => { 7552 // Rule at src/isa/x64/lower.isle line 1266. 7553 let expr0_0 = constructor_i128_not(ctx, pattern5_1)?; 7554 let expr1_0 = C::output(ctx, expr0_0); 7555 return Some(expr1_0); 7556 } 7557 &Opcode::Bitrev => { 7558 // Rule at src/isa/x64/lower.isle line 2031. 7559 let expr0_0: Type = I64; 7560 let expr1_0 = C::put_in_regs(ctx, pattern5_1); 7561 let expr2_0: usize = 1; 7562 let expr3_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr2_0)?; 7563 let expr4_0 = constructor_do_bitrev64(ctx, expr0_0, expr3_0)?; 7564 let expr5_0 = C::gpr_to_reg(ctx, expr4_0); 7565 let expr6_0: Type = I64; 7566 let expr7_0 = C::put_in_regs(ctx, pattern5_1); 7567 let expr8_0: usize = 0; 7568 let expr9_0 = constructor_value_regs_get_gpr(ctx, expr7_0, expr8_0)?; 7569 let expr10_0 = constructor_do_bitrev64(ctx, expr6_0, expr9_0)?; 7570 let expr11_0 = C::gpr_to_reg(ctx, expr10_0); 7571 let expr12_0 = C::value_regs(ctx, expr5_0, expr11_0); 7572 let expr13_0 = C::output(ctx, expr12_0); 7573 return Some(expr13_0); 7574 } 7575 &Opcode::Clz => { 7576 // Rule at src/isa/x64/lower.isle line 1801. 7577 let expr0_0: Type = I64; 7578 let expr1_0: Type = I64; 7579 let expr2_0 = C::put_in_regs(ctx, pattern5_1); 7580 let expr3_0: usize = 1; 7581 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr2_0, expr3_0)?; 7582 let expr5_0 = constructor_do_clz(ctx, expr0_0, expr1_0, expr4_0)?; 7583 let expr6_0: Type = I64; 7584 let expr7_0: Type = I64; 7585 let expr8_0: Type = I64; 7586 let expr9_0 = C::put_in_regs(ctx, pattern5_1); 7587 let expr10_0: usize = 0; 7588 let expr11_0 = constructor_value_regs_get_gpr(ctx, expr9_0, expr10_0)?; 7589 let expr12_0 = constructor_do_clz(ctx, expr7_0, expr8_0, expr11_0)?; 7590 let expr13_0: u32 = 64; 7591 let expr14_0 = RegMemImm::Imm { simm32: expr13_0 }; 7592 let expr15_0 = C::gpr_mem_imm_new(ctx, &expr14_0); 7593 let expr16_0 = constructor_x64_add(ctx, expr6_0, expr12_0, &expr15_0)?; 7594 let expr17_0 = OperandSize::Size64; 7595 let expr18_0: u32 = 64; 7596 let expr19_0 = 7597 constructor_x64_cmp_imm(ctx, &expr17_0, expr18_0, expr5_0)?; 7598 let expr20_0: Type = I64; 7599 let expr21_0 = CC::NZ; 7600 let expr22_0 = C::gpr_to_gpr_mem(ctx, expr5_0); 7601 let expr23_0 = 7602 constructor_cmove(ctx, expr20_0, &expr21_0, &expr22_0, expr16_0)?; 7603 let expr24_0 = constructor_with_flags_reg(ctx, &expr19_0, &expr23_0)?; 7604 let expr25_0 = C::gpr_new(ctx, expr24_0); 7605 let expr26_0 = C::gpr_to_reg(ctx, expr25_0); 7606 let expr27_0: Type = I64; 7607 let expr28_0: u64 = 0; 7608 let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0)?; 7609 let expr30_0 = C::value_regs(ctx, expr26_0, expr29_0); 7610 let expr31_0 = C::output(ctx, expr30_0); 7611 return Some(expr31_0); 7612 } 7613 &Opcode::Ctz => { 7614 // Rule at src/isa/x64/lower.isle line 1843. 7615 let expr0_0: Type = I64; 7616 let expr1_0: Type = I64; 7617 let expr2_0 = C::put_in_regs(ctx, pattern5_1); 7618 let expr3_0: usize = 0; 7619 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr2_0, expr3_0)?; 7620 let expr5_0 = constructor_do_ctz(ctx, expr0_0, expr1_0, expr4_0)?; 7621 let expr6_0: Type = I64; 7622 let expr7_0: Type = I64; 7623 let expr8_0: Type = I64; 7624 let expr9_0 = C::put_in_regs(ctx, pattern5_1); 7625 let expr10_0: usize = 1; 7626 let expr11_0 = constructor_value_regs_get_gpr(ctx, expr9_0, expr10_0)?; 7627 let expr12_0 = constructor_do_ctz(ctx, expr7_0, expr8_0, expr11_0)?; 7628 let expr13_0: u32 = 64; 7629 let expr14_0 = RegMemImm::Imm { simm32: expr13_0 }; 7630 let expr15_0 = C::gpr_mem_imm_new(ctx, &expr14_0); 7631 let expr16_0 = constructor_x64_add(ctx, expr6_0, expr12_0, &expr15_0)?; 7632 let expr17_0 = OperandSize::Size64; 7633 let expr18_0: u32 = 64; 7634 let expr19_0 = 7635 constructor_x64_cmp_imm(ctx, &expr17_0, expr18_0, expr5_0)?; 7636 let expr20_0: Type = I64; 7637 let expr21_0 = CC::Z; 7638 let expr22_0 = C::gpr_to_gpr_mem(ctx, expr16_0); 7639 let expr23_0 = 7640 constructor_cmove(ctx, expr20_0, &expr21_0, &expr22_0, expr5_0)?; 7641 let expr24_0 = constructor_with_flags_reg(ctx, &expr19_0, &expr23_0)?; 7642 let expr25_0 = C::gpr_new(ctx, expr24_0); 7643 let expr26_0 = C::gpr_to_reg(ctx, expr25_0); 7644 let expr27_0: Type = I64; 7645 let expr28_0: u64 = 0; 7646 let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0)?; 7647 let expr30_0 = C::value_regs(ctx, expr26_0, expr29_0); 7648 let expr31_0 = C::output(ctx, expr30_0); 7649 return Some(expr31_0); 7650 } 7651 &Opcode::Popcnt => { 7652 // Rule at src/isa/x64/lower.isle line 1895. 7653 let expr0_0: Type = I64; 7654 let expr1_0 = C::put_in_regs(ctx, pattern5_1); 7655 let expr2_0: usize = 0; 7656 let expr3_0 = constructor_value_regs_get_gpr(ctx, expr1_0, expr2_0)?; 7657 let expr4_0 = constructor_do_popcnt(ctx, expr0_0, expr3_0)?; 7658 let expr5_0: Type = I64; 7659 let expr6_0 = C::put_in_regs(ctx, pattern5_1); 7660 let expr7_0: usize = 1; 7661 let expr8_0 = constructor_value_regs_get_gpr(ctx, expr6_0, expr7_0)?; 7662 let expr9_0 = constructor_do_popcnt(ctx, expr5_0, expr8_0)?; 7663 let expr10_0: Type = I64; 7664 let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); 7665 let expr12_0 = constructor_x64_add(ctx, expr10_0, expr4_0, &expr11_0)?; 7666 let expr13_0 = C::gpr_to_reg(ctx, expr12_0); 7667 let expr14_0: Type = I64; 7668 let expr15_0: u64 = 0; 7669 let expr16_0 = constructor_imm(ctx, expr14_0, expr15_0)?; 7670 let expr17_0 = C::value_regs(ctx, expr13_0, expr16_0); 7671 let expr18_0 = C::output(ctx, expr17_0); 7672 return Some(expr18_0); 7673 } 7674 &Opcode::Bint => { 7675 // Rule at src/isa/x64/lower.isle line 2246. 7676 let expr0_0: Type = I64; 7677 let expr1_0 = constructor_put_in_gpr(ctx, pattern5_1)?; 7678 let expr2_0: u32 = 1; 7679 let expr3_0 = RegMemImm::Imm { simm32: expr2_0 }; 7680 let expr4_0 = C::gpr_mem_imm_new(ctx, &expr3_0); 7681 let expr5_0 = constructor_x64_and(ctx, expr0_0, expr1_0, &expr4_0)?; 7682 let expr6_0 = C::gpr_to_reg(ctx, expr5_0); 7683 let expr7_0: Type = I64; 7684 let expr8_0: u64 = 0; 7685 let expr9_0 = constructor_imm(ctx, expr7_0, expr8_0)?; 7686 let expr10_0 = C::value_regs(ctx, expr6_0, expr9_0); 7687 let expr11_0 = C::output(ctx, expr10_0); 7688 return Some(expr11_0); 7689 } 7690 &Opcode::Uextend => { 7691 let pattern7_0 = C::value_type(ctx, pattern5_1); 7692 if pattern7_0 == I64 { 7693 // Rule at src/isa/x64/lower.isle line 2118. 7694 let expr0_0 = C::put_in_reg(ctx, pattern5_1); 7695 let expr1_0: Type = I64; 7696 let expr2_0: u64 = 0; 7697 let expr3_0 = constructor_imm(ctx, expr1_0, expr2_0)?; 7698 let expr4_0 = C::value_regs(ctx, expr0_0, expr3_0); 7699 let expr5_0 = C::output(ctx, expr4_0); 7700 return Some(expr5_0); 7701 } 7702 if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) { 7703 // Rule at src/isa/x64/lower.isle line 2122. 7704 let expr0_0: Type = I64; 7705 let expr1_0 = ExtendKind::Zero; 7706 let expr2_0 = 7707 constructor_extend_to_gpr(ctx, pattern5_1, expr0_0, &expr1_0)?; 7708 let expr3_0 = C::gpr_to_reg(ctx, expr2_0); 7709 let expr4_0: Type = I64; 7710 let expr5_0: u64 = 0; 7711 let expr6_0 = constructor_imm(ctx, expr4_0, expr5_0)?; 7712 let expr7_0 = C::value_regs(ctx, expr3_0, expr6_0); 7713 let expr8_0 = C::output(ctx, expr7_0); 7714 return Some(expr8_0); 7715 } 7716 } 7717 _ => {} 7718 } 7719 } 7720 &InstructionData::BinaryImm64 { 7721 opcode: ref pattern5_0, 7722 arg: pattern5_1, 7723 imm: pattern5_2, 7724 } => { 7725 if let &Opcode::IaddImm = pattern5_0 { 7726 let pattern7_0 = C::u64_from_imm64(ctx, pattern5_2); 7727 // Rule at src/isa/x64/lower.isle line 210. 7728 let expr0_0 = C::put_in_regs(ctx, pattern5_1); 7729 let expr1_0: usize = 0; 7730 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 7731 let expr3_0: usize = 1; 7732 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?; 7733 let expr5_0: Type = I64; 7734 let expr6_0 = constructor_imm(ctx, expr5_0, pattern7_0)?; 7735 let expr7_0 = C::gpr_new(ctx, expr6_0); 7736 let expr8_0: Type = I64; 7737 let expr9_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0); 7738 let expr10_0 = 7739 constructor_x64_add_with_flags_paired(ctx, expr8_0, expr2_0, &expr9_0)?; 7740 let expr11_0: Type = I64; 7741 let expr12_0: u32 = 0; 7742 let expr13_0 = RegMemImm::Imm { simm32: expr12_0 }; 7743 let expr14_0 = C::gpr_mem_imm_new(ctx, &expr13_0); 7744 let expr15_0 = 7745 constructor_x64_adc_paired(ctx, expr11_0, expr4_0, &expr14_0)?; 7746 let expr16_0 = constructor_with_flags(ctx, &expr10_0, &expr15_0)?; 7747 let expr17_0 = C::output(ctx, expr16_0); 7748 return Some(expr17_0); 7749 } 7750 } 7751 _ => {} 7752 } 7753 } 7754 if pattern2_0 == F32 { 7755 let pattern4_0 = C::inst_data(ctx, pattern0_0); 7756 match &pattern4_0 { 7757 &InstructionData::Binary { 7758 opcode: ref pattern5_0, 7759 args: ref pattern5_1, 7760 } => { 7761 match pattern5_0 { 7762 &Opcode::Fadd => { 7763 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7764 // Rule at src/isa/x64/lower.isle line 2269. 7765 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 7766 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 7767 let expr2_0 = constructor_x64_addss(ctx, expr0_0, &expr1_0)?; 7768 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 7769 return Some(expr3_0); 7770 } 7771 &Opcode::Fsub => { 7772 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7773 // Rule at src/isa/x64/lower.isle line 2280. 7774 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 7775 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 7776 let expr2_0 = constructor_x64_subss(ctx, expr0_0, &expr1_0)?; 7777 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 7778 return Some(expr3_0); 7779 } 7780 &Opcode::Fmul => { 7781 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7782 // Rule at src/isa/x64/lower.isle line 2291. 7783 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 7784 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 7785 let expr2_0 = constructor_x64_mulss(ctx, expr0_0, &expr1_0)?; 7786 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 7787 return Some(expr3_0); 7788 } 7789 &Opcode::Fdiv => { 7790 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7791 // Rule at src/isa/x64/lower.isle line 2302. 7792 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 7793 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 7794 let expr2_0 = constructor_x64_divss(ctx, expr0_0, &expr1_0)?; 7795 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 7796 return Some(expr3_0); 7797 } 7798 &Opcode::Fmin => { 7799 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7800 // Rule at src/isa/x64/lower.isle line 2323. 7801 let expr0_0: Type = F32; 7802 let expr1_0: bool = true; 7803 let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 7804 let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?; 7805 let expr4_0 = constructor_xmm_min_max_seq( 7806 ctx, expr0_0, expr1_0, expr2_0, expr3_0, 7807 )?; 7808 let expr5_0 = constructor_output_xmm(ctx, expr4_0)?; 7809 return Some(expr5_0); 7810 } 7811 &Opcode::FminPseudo => { 7812 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7813 // Rule at src/isa/x64/lower.isle line 2492. 7814 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; 7815 let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 7816 let expr2_0 = constructor_x64_minss(ctx, expr0_0, expr1_0)?; 7817 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 7818 return Some(expr3_0); 7819 } 7820 &Opcode::Fmax => { 7821 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7822 // Rule at src/isa/x64/lower.isle line 2395. 7823 let expr0_0: Type = F32; 7824 let expr1_0: bool = false; 7825 let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 7826 let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?; 7827 let expr4_0 = constructor_xmm_min_max_seq( 7828 ctx, expr0_0, expr1_0, expr2_0, expr3_0, 7829 )?; 7830 let expr5_0 = constructor_output_xmm(ctx, expr4_0)?; 7831 return Some(expr5_0); 7832 } 7833 &Opcode::FmaxPseudo => { 7834 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7835 // Rule at src/isa/x64/lower.isle line 2503. 7836 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; 7837 let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 7838 let expr2_0 = constructor_x64_maxss(ctx, expr0_0, expr1_0)?; 7839 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 7840 return Some(expr3_0); 7841 } 7842 _ => {} 7843 } 7844 } 7845 &InstructionData::Unary { 7846 opcode: ref pattern5_0, 7847 arg: pattern5_1, 7848 } => { 7849 if let &Opcode::Sqrt = pattern5_0 { 7850 // Rule at src/isa/x64/lower.isle line 2312. 7851 let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?; 7852 let expr1_0 = constructor_x64_sqrtss(ctx, expr0_0)?; 7853 let expr2_0 = constructor_output_xmm(ctx, expr1_0)?; 7854 return Some(expr2_0); 7855 } 7856 } 7857 &InstructionData::Load { 7858 opcode: ref pattern5_0, 7859 arg: pattern5_1, 7860 flags: pattern5_2, 7861 offset: pattern5_3, 7862 } => { 7863 if let &Opcode::Load = pattern5_0 { 7864 // Rule at src/isa/x64/lower.isle line 2546. 7865 let expr0_0 = 7866 constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; 7867 let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?; 7868 let expr2_0 = constructor_x64_movss_load(ctx, &expr1_0)?; 7869 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 7870 return Some(expr3_0); 7871 } 7872 } 7873 _ => {} 7874 } 7875 } 7876 if pattern2_0 == F64 { 7877 let pattern4_0 = C::inst_data(ctx, pattern0_0); 7878 match &pattern4_0 { 7879 &InstructionData::Binary { 7880 opcode: ref pattern5_0, 7881 args: ref pattern5_1, 7882 } => { 7883 match pattern5_0 { 7884 &Opcode::Fadd => { 7885 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7886 // Rule at src/isa/x64/lower.isle line 2271. 7887 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 7888 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 7889 let expr2_0 = constructor_x64_addsd(ctx, expr0_0, &expr1_0)?; 7890 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 7891 return Some(expr3_0); 7892 } 7893 &Opcode::Fsub => { 7894 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7895 // Rule at src/isa/x64/lower.isle line 2282. 7896 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 7897 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 7898 let expr2_0 = constructor_x64_subsd(ctx, expr0_0, &expr1_0)?; 7899 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 7900 return Some(expr3_0); 7901 } 7902 &Opcode::Fmul => { 7903 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7904 // Rule at src/isa/x64/lower.isle line 2293. 7905 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 7906 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 7907 let expr2_0 = constructor_x64_mulsd(ctx, expr0_0, &expr1_0)?; 7908 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 7909 return Some(expr3_0); 7910 } 7911 &Opcode::Fdiv => { 7912 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7913 // Rule at src/isa/x64/lower.isle line 2304. 7914 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 7915 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 7916 let expr2_0 = constructor_x64_divsd(ctx, expr0_0, &expr1_0)?; 7917 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 7918 return Some(expr3_0); 7919 } 7920 &Opcode::Fmin => { 7921 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7922 // Rule at src/isa/x64/lower.isle line 2325. 7923 let expr0_0: Type = F64; 7924 let expr1_0: bool = true; 7925 let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 7926 let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?; 7927 let expr4_0 = constructor_xmm_min_max_seq( 7928 ctx, expr0_0, expr1_0, expr2_0, expr3_0, 7929 )?; 7930 let expr5_0 = constructor_output_xmm(ctx, expr4_0)?; 7931 return Some(expr5_0); 7932 } 7933 &Opcode::FminPseudo => { 7934 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7935 // Rule at src/isa/x64/lower.isle line 2494. 7936 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; 7937 let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 7938 let expr2_0 = constructor_x64_minsd(ctx, expr0_0, expr1_0)?; 7939 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 7940 return Some(expr3_0); 7941 } 7942 &Opcode::Fmax => { 7943 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7944 // Rule at src/isa/x64/lower.isle line 2397. 7945 let expr0_0: Type = F64; 7946 let expr1_0: bool = false; 7947 let expr2_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 7948 let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?; 7949 let expr4_0 = constructor_xmm_min_max_seq( 7950 ctx, expr0_0, expr1_0, expr2_0, expr3_0, 7951 )?; 7952 let expr5_0 = constructor_output_xmm(ctx, expr4_0)?; 7953 return Some(expr5_0); 7954 } 7955 &Opcode::FmaxPseudo => { 7956 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 7957 // Rule at src/isa/x64/lower.isle line 2505. 7958 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; 7959 let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 7960 let expr2_0 = constructor_x64_maxsd(ctx, expr0_0, expr1_0)?; 7961 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 7962 return Some(expr3_0); 7963 } 7964 _ => {} 7965 } 7966 } 7967 &InstructionData::Unary { 7968 opcode: ref pattern5_0, 7969 arg: pattern5_1, 7970 } => { 7971 if let &Opcode::Sqrt = pattern5_0 { 7972 // Rule at src/isa/x64/lower.isle line 2314. 7973 let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?; 7974 let expr1_0 = constructor_x64_sqrtsd(ctx, expr0_0)?; 7975 let expr2_0 = constructor_output_xmm(ctx, expr1_0)?; 7976 return Some(expr2_0); 7977 } 7978 } 7979 &InstructionData::Load { 7980 opcode: ref pattern5_0, 7981 arg: pattern5_1, 7982 flags: pattern5_2, 7983 offset: pattern5_3, 7984 } => { 7985 if let &Opcode::Load = pattern5_0 { 7986 // Rule at src/isa/x64/lower.isle line 2548. 7987 let expr0_0 = 7988 constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; 7989 let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?; 7990 let expr2_0 = constructor_x64_movsd_load(ctx, &expr1_0)?; 7991 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 7992 return Some(expr3_0); 7993 } 7994 } 7995 _ => {} 7996 } 7997 } 7998 if pattern2_0 == I8X16 { 7999 let pattern4_0 = C::inst_data(ctx, pattern0_0); 8000 match &pattern4_0 { 8001 &InstructionData::Binary { 8002 opcode: ref pattern5_0, 8003 args: ref pattern5_1, 8004 } => { 8005 match pattern5_0 { 8006 &Opcode::Imin => { 8007 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8008 // Rule at src/isa/x64/lower.isle line 1405. 8009 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8010 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 8011 let expr2_0 = constructor_x64_pminsb(ctx, expr0_0, &expr1_0)?; 8012 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8013 return Some(expr3_0); 8014 } 8015 &Opcode::Umin => { 8016 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8017 // Rule at src/isa/x64/lower.isle line 1427. 8018 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8019 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 8020 let expr2_0 = constructor_x64_pminub(ctx, expr0_0, &expr1_0)?; 8021 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8022 return Some(expr3_0); 8023 } 8024 &Opcode::Imax => { 8025 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8026 // Rule at src/isa/x64/lower.isle line 1394. 8027 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8028 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 8029 let expr2_0 = constructor_x64_pmaxsb(ctx, expr0_0, &expr1_0)?; 8030 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8031 return Some(expr3_0); 8032 } 8033 &Opcode::Umax => { 8034 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8035 // Rule at src/isa/x64/lower.isle line 1416. 8036 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8037 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 8038 let expr2_0 = constructor_x64_pmaxub(ctx, expr0_0, &expr1_0)?; 8039 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8040 return Some(expr3_0); 8041 } 8042 &Opcode::Ishl => { 8043 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8044 // Rule at src/isa/x64/lower.isle line 534. 8045 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8046 let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 8047 let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; 8048 let expr3_0 = constructor_x64_psllw(ctx, expr0_0, &expr2_0)?; 8049 let expr4_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 8050 let expr5_0 = constructor_ishl_i8x16_mask(ctx, &expr4_0)?; 8051 let expr6_0: Type = I8X16; 8052 let expr7_0 = ExtKind::None; 8053 let expr8_0 = constructor_x64_load(ctx, expr6_0, &expr5_0, &expr7_0)?; 8054 let expr9_0: Type = I8X16; 8055 let expr10_0 = RegMem::Reg { reg: expr8_0 }; 8056 let expr11_0 = C::reg_mem_to_xmm_mem(ctx, &expr10_0); 8057 let expr12_0 = constructor_sse_and(ctx, expr9_0, expr3_0, &expr11_0)?; 8058 let expr13_0 = constructor_output_xmm(ctx, expr12_0)?; 8059 return Some(expr13_0); 8060 } 8061 &Opcode::Ushr => { 8062 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8063 // Rule at src/isa/x64/lower.isle line 633. 8064 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8065 let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 8066 let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; 8067 let expr3_0 = constructor_x64_psrlw(ctx, expr0_0, &expr2_0)?; 8068 let expr4_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 8069 let expr5_0 = constructor_ushr_i8x16_mask(ctx, &expr4_0)?; 8070 let expr6_0: Type = I8X16; 8071 let expr7_0 = ExtKind::None; 8072 let expr8_0 = constructor_x64_load(ctx, expr6_0, &expr5_0, &expr7_0)?; 8073 let expr9_0: Type = I8X16; 8074 let expr10_0 = RegMem::Reg { reg: expr8_0 }; 8075 let expr11_0 = C::reg_mem_to_xmm_mem(ctx, &expr10_0); 8076 let expr12_0 = constructor_sse_and(ctx, expr9_0, expr3_0, &expr11_0)?; 8077 let expr13_0 = constructor_output_xmm(ctx, expr12_0)?; 8078 return Some(expr13_0); 8079 } 8080 &Opcode::Sshr => { 8081 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8082 let pattern8_0 = C::value_type(ctx, pattern7_1); 8083 // Rule at src/isa/x64/lower.isle line 749. 8084 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8085 let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); 8086 let expr2_0 = constructor_x64_punpcklbw(ctx, expr0_0, &expr1_0)?; 8087 let expr3_0 = C::xmm_to_xmm_mem(ctx, expr0_0); 8088 let expr4_0 = constructor_x64_punpckhbw(ctx, expr0_0, &expr3_0)?; 8089 let expr5_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 8090 let expr6_0 = 8091 constructor_sshr_i8x16_bigger_shift(ctx, pattern8_0, &expr5_0)?; 8092 let expr7_0 = constructor_x64_psraw(ctx, expr2_0, &expr6_0)?; 8093 let expr8_0 = constructor_x64_psraw(ctx, expr4_0, &expr6_0)?; 8094 let expr9_0 = C::xmm_to_xmm_mem(ctx, expr8_0); 8095 let expr10_0 = constructor_x64_packsswb(ctx, expr7_0, &expr9_0)?; 8096 let expr11_0 = constructor_output_xmm(ctx, expr10_0)?; 8097 return Some(expr11_0); 8098 } 8099 _ => {} 8100 } 8101 } 8102 &InstructionData::Unary { 8103 opcode: ref pattern5_0, 8104 arg: pattern5_1, 8105 } => { 8106 match pattern5_0 { 8107 &Opcode::Ineg => { 8108 // Rule at src/isa/x64/lower.isle line 889. 8109 let expr0_0: Type = I8X16; 8110 let expr1_0: u64 = 0; 8111 let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?; 8112 let expr3_0 = C::xmm_new(ctx, expr2_0); 8113 let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?; 8114 let expr5_0 = constructor_x64_psubb(ctx, expr3_0, &expr4_0)?; 8115 let expr6_0 = constructor_output_xmm(ctx, expr5_0)?; 8116 return Some(expr6_0); 8117 } 8118 &Opcode::Iabs => { 8119 // Rule at src/isa/x64/lower.isle line 1210. 8120 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?; 8121 let expr1_0 = constructor_x64_pabsb(ctx, &expr0_0)?; 8122 let expr2_0 = constructor_output_xmm(ctx, expr1_0)?; 8123 return Some(expr2_0); 8124 } 8125 &Opcode::Popcnt => { 8126 // Rule at src/isa/x64/lower.isle line 2002. 8127 let expr0_0 = C::popcount_4bit_table(ctx); 8128 let expr1_0: Type = I8X16; 8129 let expr2_0 = C::popcount_low_mask(ctx); 8130 let expr3_0 = constructor_x64_xmm_load_const(ctx, expr1_0, expr2_0)?; 8131 let expr4_0: Type = I8X16; 8132 let expr5_0 = constructor_put_in_xmm(ctx, pattern5_1)?; 8133 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr3_0); 8134 let expr7_0 = constructor_sse_and(ctx, expr4_0, expr5_0, &expr6_0)?; 8135 let expr8_0 = constructor_put_in_xmm(ctx, pattern5_1)?; 8136 let expr9_0: u32 = 4; 8137 let expr10_0 = RegMemImm::Imm { simm32: expr9_0 }; 8138 let expr11_0 = constructor_mov_rmi_to_xmm(ctx, &expr10_0)?; 8139 let expr12_0 = constructor_x64_psrlw(ctx, expr8_0, &expr11_0)?; 8140 let expr13_0: Type = I8X16; 8141 let expr14_0 = C::xmm_to_xmm_mem(ctx, expr3_0); 8142 let expr15_0 = constructor_sse_and(ctx, expr13_0, expr12_0, &expr14_0)?; 8143 let expr16_0: Type = I8X16; 8144 let expr17_0 = C::popcount_4bit_table(ctx); 8145 let expr18_0 = constructor_x64_xmm_load_const(ctx, expr16_0, expr17_0)?; 8146 let expr19_0 = C::xmm_to_xmm_mem(ctx, expr7_0); 8147 let expr20_0 = constructor_x64_pshufb(ctx, expr18_0, &expr19_0)?; 8148 let expr21_0 = C::xmm_to_xmm_mem(ctx, expr15_0); 8149 let expr22_0 = constructor_x64_pshufb(ctx, expr18_0, &expr21_0)?; 8150 let expr23_0 = C::xmm_to_xmm_mem(ctx, expr22_0); 8151 let expr24_0 = constructor_x64_paddb(ctx, expr20_0, &expr23_0)?; 8152 let expr25_0 = constructor_output_xmm(ctx, expr24_0)?; 8153 return Some(expr25_0); 8154 } 8155 _ => {} 8156 } 8157 } 8158 _ => {} 8159 } 8160 } 8161 if pattern2_0 == I16X8 { 8162 let pattern4_0 = C::inst_data(ctx, pattern0_0); 8163 match &pattern4_0 { 8164 &InstructionData::Binary { 8165 opcode: ref pattern5_0, 8166 args: ref pattern5_1, 8167 } => { 8168 match pattern5_0 { 8169 &Opcode::Imin => { 8170 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8171 // Rule at src/isa/x64/lower.isle line 1408. 8172 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8173 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 8174 let expr2_0 = constructor_x64_pminsw(ctx, expr0_0, &expr1_0)?; 8175 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8176 return Some(expr3_0); 8177 } 8178 &Opcode::Umin => { 8179 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8180 // Rule at src/isa/x64/lower.isle line 1430. 8181 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8182 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 8183 let expr2_0 = constructor_x64_pminuw(ctx, expr0_0, &expr1_0)?; 8184 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8185 return Some(expr3_0); 8186 } 8187 &Opcode::Imax => { 8188 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8189 // Rule at src/isa/x64/lower.isle line 1397. 8190 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8191 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 8192 let expr2_0 = constructor_x64_pmaxsw(ctx, expr0_0, &expr1_0)?; 8193 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8194 return Some(expr3_0); 8195 } 8196 &Opcode::Umax => { 8197 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8198 // Rule at src/isa/x64/lower.isle line 1419. 8199 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8200 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 8201 let expr2_0 = constructor_x64_pmaxuw(ctx, expr0_0, &expr1_0)?; 8202 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8203 return Some(expr3_0); 8204 } 8205 &Opcode::Ishl => { 8206 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8207 // Rule at src/isa/x64/lower.isle line 576. 8208 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8209 let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 8210 let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; 8211 let expr3_0 = constructor_x64_psllw(ctx, expr0_0, &expr2_0)?; 8212 let expr4_0 = constructor_output_xmm(ctx, expr3_0)?; 8213 return Some(expr4_0); 8214 } 8215 &Opcode::Ushr => { 8216 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8217 // Rule at src/isa/x64/lower.isle line 678. 8218 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8219 let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 8220 let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; 8221 let expr3_0 = constructor_x64_psrlw(ctx, expr0_0, &expr2_0)?; 8222 let expr4_0 = constructor_output_xmm(ctx, expr3_0)?; 8223 return Some(expr4_0); 8224 } 8225 &Opcode::Sshr => { 8226 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8227 // Rule at src/isa/x64/lower.isle line 776. 8228 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8229 let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 8230 let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; 8231 let expr3_0 = constructor_x64_psraw(ctx, expr0_0, &expr2_0)?; 8232 let expr4_0 = constructor_output_xmm(ctx, expr3_0)?; 8233 return Some(expr4_0); 8234 } 8235 _ => {} 8236 } 8237 } 8238 &InstructionData::Unary { 8239 opcode: ref pattern5_0, 8240 arg: pattern5_1, 8241 } => { 8242 match pattern5_0 { 8243 &Opcode::Ineg => { 8244 // Rule at src/isa/x64/lower.isle line 892. 8245 let expr0_0: Type = I16X8; 8246 let expr1_0: u64 = 0; 8247 let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?; 8248 let expr3_0 = C::xmm_new(ctx, expr2_0); 8249 let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?; 8250 let expr5_0 = constructor_x64_psubw(ctx, expr3_0, &expr4_0)?; 8251 let expr6_0 = constructor_output_xmm(ctx, expr5_0)?; 8252 return Some(expr6_0); 8253 } 8254 &Opcode::Iabs => { 8255 // Rule at src/isa/x64/lower.isle line 1213. 8256 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?; 8257 let expr1_0 = constructor_x64_pabsw(ctx, &expr0_0)?; 8258 let expr2_0 = constructor_output_xmm(ctx, expr1_0)?; 8259 return Some(expr2_0); 8260 } 8261 _ => {} 8262 } 8263 } 8264 &InstructionData::Load { 8265 opcode: ref pattern5_0, 8266 arg: pattern5_1, 8267 flags: pattern5_2, 8268 offset: pattern5_3, 8269 } => { 8270 match pattern5_0 { 8271 &Opcode::Uload8x8 => { 8272 // Rule at src/isa/x64/lower.isle line 2570. 8273 let expr0_0 = 8274 constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; 8275 let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?; 8276 let expr2_0 = constructor_x64_pmovzxbw(ctx, &expr1_0)?; 8277 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8278 return Some(expr3_0); 8279 } 8280 &Opcode::Sload8x8 => { 8281 // Rule at src/isa/x64/lower.isle line 2568. 8282 let expr0_0 = 8283 constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; 8284 let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?; 8285 let expr2_0 = constructor_x64_pmovsxbw(ctx, &expr1_0)?; 8286 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8287 return Some(expr3_0); 8288 } 8289 _ => {} 8290 } 8291 } 8292 _ => {} 8293 } 8294 } 8295 if pattern2_0 == I32X4 { 8296 let pattern4_0 = C::inst_data(ctx, pattern0_0); 8297 match &pattern4_0 { 8298 &InstructionData::Binary { 8299 opcode: ref pattern5_0, 8300 args: ref pattern5_1, 8301 } => { 8302 match pattern5_0 { 8303 &Opcode::Imin => { 8304 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8305 // Rule at src/isa/x64/lower.isle line 1411. 8306 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8307 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 8308 let expr2_0 = constructor_x64_pminsd(ctx, expr0_0, &expr1_0)?; 8309 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8310 return Some(expr3_0); 8311 } 8312 &Opcode::Umin => { 8313 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8314 // Rule at src/isa/x64/lower.isle line 1433. 8315 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8316 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 8317 let expr2_0 = constructor_x64_pminud(ctx, expr0_0, &expr1_0)?; 8318 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8319 return Some(expr3_0); 8320 } 8321 &Opcode::Imax => { 8322 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8323 // Rule at src/isa/x64/lower.isle line 1400. 8324 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8325 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 8326 let expr2_0 = constructor_x64_pmaxsd(ctx, expr0_0, &expr1_0)?; 8327 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8328 return Some(expr3_0); 8329 } 8330 &Opcode::Umax => { 8331 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8332 // Rule at src/isa/x64/lower.isle line 1422. 8333 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8334 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 8335 let expr2_0 = constructor_x64_pmaxud(ctx, expr0_0, &expr1_0)?; 8336 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8337 return Some(expr3_0); 8338 } 8339 &Opcode::Ishl => { 8340 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8341 // Rule at src/isa/x64/lower.isle line 579. 8342 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8343 let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 8344 let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; 8345 let expr3_0 = constructor_x64_pslld(ctx, expr0_0, &expr2_0)?; 8346 let expr4_0 = constructor_output_xmm(ctx, expr3_0)?; 8347 return Some(expr4_0); 8348 } 8349 &Opcode::Ushr => { 8350 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8351 // Rule at src/isa/x64/lower.isle line 681. 8352 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8353 let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 8354 let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; 8355 let expr3_0 = constructor_x64_psrld(ctx, expr0_0, &expr2_0)?; 8356 let expr4_0 = constructor_output_xmm(ctx, expr3_0)?; 8357 return Some(expr4_0); 8358 } 8359 &Opcode::Sshr => { 8360 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8361 // Rule at src/isa/x64/lower.isle line 779. 8362 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8363 let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 8364 let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; 8365 let expr3_0 = constructor_x64_psrad(ctx, expr0_0, &expr2_0)?; 8366 let expr4_0 = constructor_output_xmm(ctx, expr3_0)?; 8367 return Some(expr4_0); 8368 } 8369 &Opcode::WideningPairwiseDotProductS => { 8370 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8371 // Rule at src/isa/x64/lower.isle line 2259. 8372 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8373 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 8374 let expr2_0 = constructor_x64_pmaddwd(ctx, expr0_0, &expr1_0)?; 8375 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8376 return Some(expr3_0); 8377 } 8378 _ => {} 8379 } 8380 } 8381 &InstructionData::Unary { 8382 opcode: ref pattern5_0, 8383 arg: pattern5_1, 8384 } => { 8385 match pattern5_0 { 8386 &Opcode::Ineg => { 8387 // Rule at src/isa/x64/lower.isle line 895. 8388 let expr0_0: Type = I32X4; 8389 let expr1_0: u64 = 0; 8390 let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?; 8391 let expr3_0 = C::xmm_new(ctx, expr2_0); 8392 let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?; 8393 let expr5_0 = constructor_x64_psubd(ctx, expr3_0, &expr4_0)?; 8394 let expr6_0 = constructor_output_xmm(ctx, expr5_0)?; 8395 return Some(expr6_0); 8396 } 8397 &Opcode::Iabs => { 8398 // Rule at src/isa/x64/lower.isle line 1216. 8399 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?; 8400 let expr1_0 = constructor_x64_pabsd(ctx, &expr0_0)?; 8401 let expr2_0 = constructor_output_xmm(ctx, expr1_0)?; 8402 return Some(expr2_0); 8403 } 8404 _ => {} 8405 } 8406 } 8407 &InstructionData::Load { 8408 opcode: ref pattern5_0, 8409 arg: pattern5_1, 8410 flags: pattern5_2, 8411 offset: pattern5_3, 8412 } => { 8413 match pattern5_0 { 8414 &Opcode::Uload16x4 => { 8415 // Rule at src/isa/x64/lower.isle line 2574. 8416 let expr0_0 = 8417 constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; 8418 let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?; 8419 let expr2_0 = constructor_x64_pmovzxwd(ctx, &expr1_0)?; 8420 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8421 return Some(expr3_0); 8422 } 8423 &Opcode::Sload16x4 => { 8424 // Rule at src/isa/x64/lower.isle line 2572. 8425 let expr0_0 = 8426 constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; 8427 let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?; 8428 let expr2_0 = constructor_x64_pmovsxwd(ctx, &expr1_0)?; 8429 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8430 return Some(expr3_0); 8431 } 8432 _ => {} 8433 } 8434 } 8435 _ => {} 8436 } 8437 } 8438 if pattern2_0 == I64X2 { 8439 let pattern4_0 = C::inst_data(ctx, pattern0_0); 8440 match &pattern4_0 { 8441 &InstructionData::Binary { 8442 opcode: ref pattern5_0, 8443 args: ref pattern5_1, 8444 } => { 8445 match pattern5_0 { 8446 &Opcode::Ishl => { 8447 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8448 // Rule at src/isa/x64/lower.isle line 582. 8449 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8450 let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 8451 let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; 8452 let expr3_0 = constructor_x64_psllq(ctx, expr0_0, &expr2_0)?; 8453 let expr4_0 = constructor_output_xmm(ctx, expr3_0)?; 8454 return Some(expr4_0); 8455 } 8456 &Opcode::Ushr => { 8457 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8458 // Rule at src/isa/x64/lower.isle line 684. 8459 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8460 let expr1_0 = C::put_in_reg_mem_imm(ctx, pattern7_1); 8461 let expr2_0 = constructor_mov_rmi_to_xmm(ctx, &expr1_0)?; 8462 let expr3_0 = constructor_x64_psrlq(ctx, expr0_0, &expr2_0)?; 8463 let expr4_0 = constructor_output_xmm(ctx, expr3_0)?; 8464 return Some(expr4_0); 8465 } 8466 &Opcode::Sshr => { 8467 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8468 // Rule at src/isa/x64/lower.isle line 790. 8469 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8470 let expr1_0: Type = I64; 8471 let expr2_0: u8 = 0; 8472 let expr3_0 = constructor_x64_pextrd(ctx, expr1_0, expr0_0, expr2_0)?; 8473 let expr4_0: Type = I64; 8474 let expr5_0: u8 = 1; 8475 let expr6_0 = constructor_x64_pextrd(ctx, expr4_0, expr0_0, expr5_0)?; 8476 let expr7_0: Type = I64; 8477 let expr8_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, expr7_0); 8478 let expr9_0: Type = I64; 8479 let expr10_0 = constructor_x64_sar(ctx, expr9_0, expr3_0, &expr8_0)?; 8480 let expr11_0: Type = I64; 8481 let expr12_0 = constructor_x64_sar(ctx, expr11_0, expr6_0, &expr8_0)?; 8482 let expr13_0 = C::gpr_to_gpr_mem(ctx, expr10_0); 8483 let expr14_0 = C::gpr_to_gpr_mem(ctx, expr12_0); 8484 let expr15_0 = 8485 constructor_make_i64x2_from_lanes(ctx, &expr13_0, &expr14_0)?; 8486 let expr16_0 = constructor_output_xmm(ctx, expr15_0)?; 8487 return Some(expr16_0); 8488 } 8489 _ => {} 8490 } 8491 } 8492 &InstructionData::Unary { 8493 opcode: ref pattern5_0, 8494 arg: pattern5_1, 8495 } => { 8496 match pattern5_0 { 8497 &Opcode::Ineg => { 8498 // Rule at src/isa/x64/lower.isle line 898. 8499 let expr0_0: Type = I64X2; 8500 let expr1_0: u64 = 0; 8501 let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?; 8502 let expr3_0 = C::xmm_new(ctx, expr2_0); 8503 let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern5_1)?; 8504 let expr5_0 = constructor_x64_psubq(ctx, expr3_0, &expr4_0)?; 8505 let expr6_0 = constructor_output_xmm(ctx, expr5_0)?; 8506 return Some(expr6_0); 8507 } 8508 &Opcode::Iabs => { 8509 // Rule at src/isa/x64/lower.isle line 1230. 8510 let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?; 8511 let expr1_0: Type = I64X2; 8512 let expr2_0: u64 = 0; 8513 let expr3_0 = constructor_imm(ctx, expr1_0, expr2_0)?; 8514 let expr4_0 = C::xmm_new(ctx, expr3_0); 8515 let expr5_0 = C::xmm_to_xmm_mem(ctx, expr0_0); 8516 let expr6_0 = constructor_x64_psubq(ctx, expr4_0, &expr5_0)?; 8517 let expr7_0 = C::xmm_to_xmm_mem(ctx, expr0_0); 8518 let expr8_0 = 8519 constructor_x64_blendvpd(ctx, expr6_0, &expr7_0, expr6_0)?; 8520 let expr9_0 = constructor_output_xmm(ctx, expr8_0)?; 8521 return Some(expr9_0); 8522 } 8523 _ => {} 8524 } 8525 } 8526 &InstructionData::Load { 8527 opcode: ref pattern5_0, 8528 arg: pattern5_1, 8529 flags: pattern5_2, 8530 offset: pattern5_3, 8531 } => { 8532 match pattern5_0 { 8533 &Opcode::Uload32x2 => { 8534 // Rule at src/isa/x64/lower.isle line 2578. 8535 let expr0_0 = 8536 constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; 8537 let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?; 8538 let expr2_0 = constructor_x64_pmovzxdq(ctx, &expr1_0)?; 8539 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8540 return Some(expr3_0); 8541 } 8542 &Opcode::Sload32x2 => { 8543 // Rule at src/isa/x64/lower.isle line 2576. 8544 let expr0_0 = 8545 constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; 8546 let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?; 8547 let expr2_0 = constructor_x64_pmovsxdq(ctx, &expr1_0)?; 8548 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8549 return Some(expr3_0); 8550 } 8551 _ => {} 8552 } 8553 } 8554 _ => {} 8555 } 8556 } 8557 if pattern2_0 == F32X4 { 8558 let pattern4_0 = C::inst_data(ctx, pattern0_0); 8559 match &pattern4_0 { 8560 &InstructionData::Binary { 8561 opcode: ref pattern5_0, 8562 args: ref pattern5_1, 8563 } => { 8564 match pattern5_0 { 8565 &Opcode::Fadd => { 8566 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8567 // Rule at src/isa/x64/lower.isle line 2273. 8568 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8569 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 8570 let expr2_0 = constructor_x64_addps(ctx, expr0_0, &expr1_0)?; 8571 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8572 return Some(expr3_0); 8573 } 8574 &Opcode::Fsub => { 8575 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8576 // Rule at src/isa/x64/lower.isle line 2284. 8577 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8578 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 8579 let expr2_0 = constructor_x64_subps(ctx, expr0_0, &expr1_0)?; 8580 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8581 return Some(expr3_0); 8582 } 8583 &Opcode::Fmul => { 8584 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8585 // Rule at src/isa/x64/lower.isle line 2295. 8586 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8587 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 8588 let expr2_0 = constructor_x64_mulps(ctx, expr0_0, &expr1_0)?; 8589 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8590 return Some(expr3_0); 8591 } 8592 &Opcode::Fdiv => { 8593 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8594 // Rule at src/isa/x64/lower.isle line 2306. 8595 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8596 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 8597 let expr2_0 = constructor_x64_divps(ctx, expr0_0, &expr1_0)?; 8598 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8599 return Some(expr3_0); 8600 } 8601 &Opcode::Fmin => { 8602 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8603 // Rule at src/isa/x64/lower.isle line 2340. 8604 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8605 let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; 8606 let expr2_0 = constructor_x64_minps(ctx, expr0_0, expr1_0)?; 8607 let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?; 8608 let expr4_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8609 let expr5_0 = constructor_x64_minps(ctx, expr3_0, expr4_0)?; 8610 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); 8611 let expr7_0 = constructor_x64_orps(ctx, expr2_0, &expr6_0)?; 8612 let expr8_0 = C::xmm_to_xmm_mem(ctx, expr5_0); 8613 let expr9_0 = FcmpImm::Unordered; 8614 let expr10_0 = constructor_x64_cmpps(ctx, expr7_0, &expr8_0, &expr9_0)?; 8615 let expr11_0 = C::xmm_to_xmm_mem(ctx, expr10_0); 8616 let expr12_0 = constructor_x64_orps(ctx, expr7_0, &expr11_0)?; 8617 let expr13_0: u32 = 10; 8618 let expr14_0 = RegMemImm::Imm { simm32: expr13_0 }; 8619 let expr15_0 = constructor_mov_rmi_to_xmm(ctx, &expr14_0)?; 8620 let expr16_0 = constructor_x64_psrld(ctx, expr10_0, &expr15_0)?; 8621 let expr17_0 = C::xmm_to_xmm_mem(ctx, expr12_0); 8622 let expr18_0 = constructor_x64_andnps(ctx, expr16_0, &expr17_0)?; 8623 let expr19_0 = constructor_output_xmm(ctx, expr18_0)?; 8624 return Some(expr19_0); 8625 } 8626 &Opcode::FminPseudo => { 8627 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8628 // Rule at src/isa/x64/lower.isle line 2496. 8629 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; 8630 let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8631 let expr2_0 = constructor_x64_minps(ctx, expr0_0, expr1_0)?; 8632 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8633 return Some(expr3_0); 8634 } 8635 &Opcode::Fmax => { 8636 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8637 // Rule at src/isa/x64/lower.isle line 2403. 8638 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8639 let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; 8640 let expr2_0 = constructor_x64_maxps(ctx, expr0_0, expr1_0)?; 8641 let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?; 8642 let expr4_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8643 let expr5_0 = constructor_x64_maxps(ctx, expr3_0, expr4_0)?; 8644 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); 8645 let expr7_0 = constructor_x64_xorps(ctx, expr2_0, &expr6_0)?; 8646 let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); 8647 let expr9_0 = constructor_x64_orps(ctx, expr2_0, &expr8_0)?; 8648 let expr10_0 = C::xmm_to_xmm_mem(ctx, expr7_0); 8649 let expr11_0 = constructor_x64_subps(ctx, expr9_0, &expr10_0)?; 8650 let expr12_0 = C::xmm_to_xmm_mem(ctx, expr9_0); 8651 let expr13_0 = FcmpImm::Unordered; 8652 let expr14_0 = 8653 constructor_x64_cmpps(ctx, expr9_0, &expr12_0, &expr13_0)?; 8654 let expr15_0: u32 = 10; 8655 let expr16_0 = RegMemImm::Imm { simm32: expr15_0 }; 8656 let expr17_0 = constructor_mov_rmi_to_xmm(ctx, &expr16_0)?; 8657 let expr18_0 = constructor_x64_psrld(ctx, expr14_0, &expr17_0)?; 8658 let expr19_0 = C::xmm_to_xmm_mem(ctx, expr11_0); 8659 let expr20_0 = constructor_x64_andnps(ctx, expr18_0, &expr19_0)?; 8660 let expr21_0 = constructor_output_xmm(ctx, expr20_0)?; 8661 return Some(expr21_0); 8662 } 8663 &Opcode::FmaxPseudo => { 8664 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8665 // Rule at src/isa/x64/lower.isle line 2507. 8666 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; 8667 let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8668 let expr2_0 = constructor_x64_maxps(ctx, expr0_0, expr1_0)?; 8669 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8670 return Some(expr3_0); 8671 } 8672 _ => {} 8673 } 8674 } 8675 &InstructionData::Unary { 8676 opcode: ref pattern5_0, 8677 arg: pattern5_1, 8678 } => { 8679 match pattern5_0 { 8680 &Opcode::Sqrt => { 8681 // Rule at src/isa/x64/lower.isle line 2316. 8682 let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?; 8683 let expr1_0 = constructor_x64_sqrtps(ctx, expr0_0)?; 8684 let expr2_0 = constructor_output_xmm(ctx, expr1_0)?; 8685 return Some(expr2_0); 8686 } 8687 &Opcode::Fabs => { 8688 // Rule at src/isa/x64/lower.isle line 1238. 8689 let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?; 8690 let expr1_0: Type = F32X4; 8691 let expr2_0 = constructor_vector_all_ones(ctx, expr1_0)?; 8692 let expr3_0: u32 = 1; 8693 let expr4_0 = RegMemImm::Imm { simm32: expr3_0 }; 8694 let expr5_0 = constructor_mov_rmi_to_xmm(ctx, &expr4_0)?; 8695 let expr6_0 = constructor_x64_psrld(ctx, expr2_0, &expr5_0)?; 8696 let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0); 8697 let expr8_0 = constructor_x64_andps(ctx, expr0_0, &expr7_0)?; 8698 let expr9_0 = constructor_output_xmm(ctx, expr8_0)?; 8699 return Some(expr9_0); 8700 } 8701 _ => {} 8702 } 8703 } 8704 &InstructionData::Load { 8705 opcode: ref pattern5_0, 8706 arg: pattern5_1, 8707 flags: pattern5_2, 8708 offset: pattern5_3, 8709 } => { 8710 if let &Opcode::Load = pattern5_0 { 8711 // Rule at src/isa/x64/lower.isle line 2550. 8712 let expr0_0 = 8713 constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; 8714 let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?; 8715 let expr2_0 = constructor_x64_movups(ctx, &expr1_0)?; 8716 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8717 return Some(expr3_0); 8718 } 8719 } 8720 _ => {} 8721 } 8722 } 8723 if pattern2_0 == F64X2 { 8724 let pattern4_0 = C::inst_data(ctx, pattern0_0); 8725 match &pattern4_0 { 8726 &InstructionData::Binary { 8727 opcode: ref pattern5_0, 8728 args: ref pattern5_1, 8729 } => { 8730 match pattern5_0 { 8731 &Opcode::Fadd => { 8732 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8733 // Rule at src/isa/x64/lower.isle line 2275. 8734 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8735 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 8736 let expr2_0 = constructor_x64_addpd(ctx, expr0_0, &expr1_0)?; 8737 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8738 return Some(expr3_0); 8739 } 8740 &Opcode::Fsub => { 8741 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8742 // Rule at src/isa/x64/lower.isle line 2286. 8743 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8744 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 8745 let expr2_0 = constructor_x64_subpd(ctx, expr0_0, &expr1_0)?; 8746 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8747 return Some(expr3_0); 8748 } 8749 &Opcode::Fmul => { 8750 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8751 // Rule at src/isa/x64/lower.isle line 2297. 8752 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8753 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 8754 let expr2_0 = constructor_x64_mulpd(ctx, expr0_0, &expr1_0)?; 8755 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8756 return Some(expr3_0); 8757 } 8758 &Opcode::Fdiv => { 8759 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8760 // Rule at src/isa/x64/lower.isle line 2308. 8761 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8762 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 8763 let expr2_0 = constructor_x64_divpd(ctx, expr0_0, &expr1_0)?; 8764 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8765 return Some(expr3_0); 8766 } 8767 &Opcode::Fmin => { 8768 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8769 // Rule at src/isa/x64/lower.isle line 2383. 8770 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8771 let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; 8772 let expr2_0 = constructor_x64_minpd(ctx, expr0_0, expr1_0)?; 8773 let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?; 8774 let expr4_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8775 let expr5_0 = constructor_x64_minpd(ctx, expr3_0, expr4_0)?; 8776 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); 8777 let expr7_0 = constructor_x64_orpd(ctx, expr2_0, &expr6_0)?; 8778 let expr8_0 = C::xmm_to_xmm_mem(ctx, expr5_0); 8779 let expr9_0 = FcmpImm::Unordered; 8780 let expr10_0 = constructor_x64_cmppd(ctx, expr2_0, &expr8_0, &expr9_0)?; 8781 let expr11_0 = C::xmm_to_xmm_mem(ctx, expr10_0); 8782 let expr12_0 = constructor_x64_orpd(ctx, expr7_0, &expr11_0)?; 8783 let expr13_0: u32 = 13; 8784 let expr14_0 = RegMemImm::Imm { simm32: expr13_0 }; 8785 let expr15_0 = constructor_mov_rmi_to_xmm(ctx, &expr14_0)?; 8786 let expr16_0 = constructor_x64_psrlq(ctx, expr10_0, &expr15_0)?; 8787 let expr17_0 = C::xmm_to_xmm_mem(ctx, expr12_0); 8788 let expr18_0 = constructor_x64_andnpd(ctx, expr16_0, &expr17_0)?; 8789 let expr19_0 = constructor_output_xmm(ctx, expr18_0)?; 8790 return Some(expr19_0); 8791 } 8792 &Opcode::FminPseudo => { 8793 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8794 // Rule at src/isa/x64/lower.isle line 2498. 8795 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; 8796 let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8797 let expr2_0 = constructor_x64_minpd(ctx, expr0_0, expr1_0)?; 8798 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8799 return Some(expr3_0); 8800 } 8801 &Opcode::Fmax => { 8802 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8803 // Rule at src/isa/x64/lower.isle line 2446. 8804 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8805 let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; 8806 let expr2_0 = constructor_x64_maxpd(ctx, expr0_0, expr1_0)?; 8807 let expr3_0 = constructor_put_in_xmm(ctx, pattern7_1)?; 8808 let expr4_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8809 let expr5_0 = constructor_x64_maxpd(ctx, expr3_0, expr4_0)?; 8810 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); 8811 let expr7_0 = constructor_x64_xorpd(ctx, expr2_0, &expr6_0)?; 8812 let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); 8813 let expr9_0 = constructor_x64_orpd(ctx, expr2_0, &expr8_0)?; 8814 let expr10_0 = C::xmm_to_xmm_mem(ctx, expr7_0); 8815 let expr11_0 = constructor_x64_subpd(ctx, expr9_0, &expr10_0)?; 8816 let expr12_0 = C::xmm_to_xmm_mem(ctx, expr9_0); 8817 let expr13_0 = FcmpImm::Unordered; 8818 let expr14_0 = 8819 constructor_x64_cmppd(ctx, expr9_0, &expr12_0, &expr13_0)?; 8820 let expr15_0: u32 = 13; 8821 let expr16_0 = RegMemImm::Imm { simm32: expr15_0 }; 8822 let expr17_0 = constructor_mov_rmi_to_xmm(ctx, &expr16_0)?; 8823 let expr18_0 = constructor_x64_psrlq(ctx, expr14_0, &expr17_0)?; 8824 let expr19_0 = C::xmm_to_xmm_mem(ctx, expr11_0); 8825 let expr20_0 = constructor_x64_andnpd(ctx, expr18_0, &expr19_0)?; 8826 let expr21_0 = constructor_output_xmm(ctx, expr20_0)?; 8827 return Some(expr21_0); 8828 } 8829 &Opcode::FmaxPseudo => { 8830 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 8831 // Rule at src/isa/x64/lower.isle line 2509. 8832 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_1)?; 8833 let expr1_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 8834 let expr2_0 = constructor_x64_maxpd(ctx, expr0_0, expr1_0)?; 8835 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8836 return Some(expr3_0); 8837 } 8838 _ => {} 8839 } 8840 } 8841 &InstructionData::Unary { 8842 opcode: ref pattern5_0, 8843 arg: pattern5_1, 8844 } => { 8845 match pattern5_0 { 8846 &Opcode::Sqrt => { 8847 // Rule at src/isa/x64/lower.isle line 2318. 8848 let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?; 8849 let expr1_0 = constructor_x64_sqrtpd(ctx, expr0_0)?; 8850 let expr2_0 = constructor_output_xmm(ctx, expr1_0)?; 8851 return Some(expr2_0); 8852 } 8853 &Opcode::Fabs => { 8854 // Rule at src/isa/x64/lower.isle line 1244. 8855 let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?; 8856 let expr1_0: Type = F64X2; 8857 let expr2_0 = constructor_vector_all_ones(ctx, expr1_0)?; 8858 let expr3_0: u32 = 1; 8859 let expr4_0 = RegMemImm::Imm { simm32: expr3_0 }; 8860 let expr5_0 = constructor_mov_rmi_to_xmm(ctx, &expr4_0)?; 8861 let expr6_0 = constructor_x64_psrlq(ctx, expr2_0, &expr5_0)?; 8862 let expr7_0 = C::xmm_to_xmm_mem(ctx, expr6_0); 8863 let expr8_0 = constructor_x64_andpd(ctx, expr0_0, &expr7_0)?; 8864 let expr9_0 = constructor_output_xmm(ctx, expr8_0)?; 8865 return Some(expr9_0); 8866 } 8867 _ => {} 8868 } 8869 } 8870 &InstructionData::Load { 8871 opcode: ref pattern5_0, 8872 arg: pattern5_1, 8873 flags: pattern5_2, 8874 offset: pattern5_3, 8875 } => { 8876 if let &Opcode::Load = pattern5_0 { 8877 // Rule at src/isa/x64/lower.isle line 2552. 8878 let expr0_0 = 8879 constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; 8880 let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?; 8881 let expr2_0 = constructor_x64_movupd(ctx, &expr1_0)?; 8882 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8883 return Some(expr3_0); 8884 } 8885 } 8886 _ => {} 8887 } 8888 } 8889 let pattern3_0 = C::inst_data(ctx, pattern0_0); 8890 match &pattern3_0 { 8891 &InstructionData::NullAry { 8892 opcode: ref pattern4_0, 8893 } => { 8894 if let &Opcode::Null = pattern4_0 { 8895 // Rule at src/isa/x64/lower.isle line 56. 8896 let expr0_0: u64 = 0; 8897 let expr1_0 = constructor_imm(ctx, pattern2_0, expr0_0)?; 8898 let expr2_0 = constructor_output_reg(ctx, expr1_0)?; 8899 return Some(expr2_0); 8900 } 8901 } 8902 &InstructionData::Binary { 8903 opcode: ref pattern4_0, 8904 args: ref pattern4_1, 8905 } => { 8906 if let &Opcode::BandNot = pattern4_0 { 8907 let (pattern6_0, pattern6_1) = C::unpack_value_array_2(ctx, pattern4_1); 8908 // Rule at src/isa/x64/lower.isle line 1205. 8909 let expr0_0 = constructor_put_in_xmm(ctx, pattern6_1)?; 8910 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern6_0)?; 8911 let expr2_0 = constructor_sse_and_not(ctx, pattern2_0, expr0_0, &expr1_0)?; 8912 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 8913 return Some(expr3_0); 8914 } 8915 } 8916 &InstructionData::Ternary { 8917 opcode: ref pattern4_0, 8918 args: ref pattern4_1, 8919 } => { 8920 if let &Opcode::Select = pattern4_0 { 8921 let (pattern6_0, pattern6_1, pattern6_2) = 8922 C::unpack_value_array_3(ctx, pattern4_1); 8923 if let Some(pattern7_0) = C::def_inst(ctx, pattern6_0) { 8924 let pattern8_0 = C::inst_data(ctx, pattern7_0); 8925 match &pattern8_0 { 8926 &InstructionData::FloatCompare { 8927 opcode: ref pattern9_0, 8928 args: ref pattern9_1, 8929 cond: ref pattern9_2, 8930 } => { 8931 if let &Opcode::Fcmp = pattern9_0 { 8932 let (pattern11_0, pattern11_1) = 8933 C::unpack_value_array_2(ctx, pattern9_1); 8934 match pattern9_2 { 8935 &FloatCC::Equal => { 8936 // Rule at src/isa/x64/lower.isle line 1746. 8937 let expr0_0 = constructor_x64_ucomis( 8938 ctx, 8939 pattern11_0, 8940 pattern11_1, 8941 )?; 8942 let expr1_0 = CC::NZ; 8943 let expr2_0 = CC::P; 8944 let expr3_0 = constructor_cmove_or_from_values( 8945 ctx, pattern2_0, &expr1_0, &expr2_0, pattern6_2, 8946 pattern6_1, 8947 )?; 8948 let expr4_0 = 8949 constructor_with_flags(ctx, &expr0_0, &expr3_0)?; 8950 let expr5_0 = C::output(ctx, expr4_0); 8951 return Some(expr5_0); 8952 } 8953 &FloatCC::GreaterThan => { 8954 // Rule at src/isa/x64/lower.isle line 1698. 8955 let expr0_0 = constructor_x64_ucomis( 8956 ctx, 8957 pattern11_1, 8958 pattern11_0, 8959 )?; 8960 let expr1_0 = CC::NBE; 8961 let expr2_0 = constructor_cmove_from_values( 8962 ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2, 8963 )?; 8964 let expr3_0 = 8965 constructor_with_flags(ctx, &expr0_0, &expr2_0)?; 8966 let expr4_0 = C::output(ctx, expr3_0); 8967 return Some(expr4_0); 8968 } 8969 &FloatCC::GreaterThanOrEqual => { 8970 // Rule at src/isa/x64/lower.isle line 1701. 8971 let expr0_0 = constructor_x64_ucomis( 8972 ctx, 8973 pattern11_1, 8974 pattern11_0, 8975 )?; 8976 let expr1_0 = CC::NB; 8977 let expr2_0 = constructor_cmove_from_values( 8978 ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2, 8979 )?; 8980 let expr3_0 = 8981 constructor_with_flags(ctx, &expr0_0, &expr2_0)?; 8982 let expr4_0 = C::output(ctx, expr3_0); 8983 return Some(expr4_0); 8984 } 8985 &FloatCC::LessThan => { 8986 // Rule at src/isa/x64/lower.isle line 1721. 8987 let expr0_0 = constructor_x64_ucomis( 8988 ctx, 8989 pattern11_0, 8990 pattern11_1, 8991 )?; 8992 let expr1_0 = CC::NBE; 8993 let expr2_0 = constructor_cmove_from_values( 8994 ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2, 8995 )?; 8996 let expr3_0 = 8997 constructor_with_flags(ctx, &expr0_0, &expr2_0)?; 8998 let expr4_0 = C::output(ctx, expr3_0); 8999 return Some(expr4_0); 9000 } 9001 &FloatCC::LessThanOrEqual => { 9002 // Rule at src/isa/x64/lower.isle line 1724. 9003 let expr0_0 = constructor_x64_ucomis( 9004 ctx, 9005 pattern11_0, 9006 pattern11_1, 9007 )?; 9008 let expr1_0 = CC::NB; 9009 let expr2_0 = constructor_cmove_from_values( 9010 ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2, 9011 )?; 9012 let expr3_0 = 9013 constructor_with_flags(ctx, &expr0_0, &expr2_0)?; 9014 let expr4_0 = C::output(ctx, expr3_0); 9015 return Some(expr4_0); 9016 } 9017 &FloatCC::NotEqual => { 9018 // Rule at src/isa/x64/lower.isle line 1749. 9019 let expr0_0 = constructor_x64_ucomis( 9020 ctx, 9021 pattern11_0, 9022 pattern11_1, 9023 )?; 9024 let expr1_0 = CC::NZ; 9025 let expr2_0 = CC::P; 9026 let expr3_0 = constructor_cmove_or_from_values( 9027 ctx, pattern2_0, &expr1_0, &expr2_0, pattern6_1, 9028 pattern6_2, 9029 )?; 9030 let expr4_0 = 9031 constructor_with_flags(ctx, &expr0_0, &expr3_0)?; 9032 let expr5_0 = C::output(ctx, expr4_0); 9033 return Some(expr5_0); 9034 } 9035 &FloatCC::Ordered => { 9036 // Rule at src/isa/x64/lower.isle line 1692. 9037 let expr0_0 = constructor_x64_ucomis( 9038 ctx, 9039 pattern11_1, 9040 pattern11_0, 9041 )?; 9042 let expr1_0 = CC::NP; 9043 let expr2_0 = constructor_cmove_from_values( 9044 ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2, 9045 )?; 9046 let expr3_0 = 9047 constructor_with_flags(ctx, &expr0_0, &expr2_0)?; 9048 let expr4_0 = C::output(ctx, expr3_0); 9049 return Some(expr4_0); 9050 } 9051 &FloatCC::Unordered => { 9052 // Rule at src/isa/x64/lower.isle line 1695. 9053 let expr0_0 = constructor_x64_ucomis( 9054 ctx, 9055 pattern11_1, 9056 pattern11_0, 9057 )?; 9058 let expr1_0 = CC::P; 9059 let expr2_0 = constructor_cmove_from_values( 9060 ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2, 9061 )?; 9062 let expr3_0 = 9063 constructor_with_flags(ctx, &expr0_0, &expr2_0)?; 9064 let expr4_0 = C::output(ctx, expr3_0); 9065 return Some(expr4_0); 9066 } 9067 &FloatCC::UnorderedOrGreaterThan => { 9068 // Rule at src/isa/x64/lower.isle line 1727. 9069 let expr0_0 = constructor_x64_ucomis( 9070 ctx, 9071 pattern11_0, 9072 pattern11_1, 9073 )?; 9074 let expr1_0 = CC::B; 9075 let expr2_0 = constructor_cmove_from_values( 9076 ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2, 9077 )?; 9078 let expr3_0 = 9079 constructor_with_flags(ctx, &expr0_0, &expr2_0)?; 9080 let expr4_0 = C::output(ctx, expr3_0); 9081 return Some(expr4_0); 9082 } 9083 &FloatCC::UnorderedOrGreaterThanOrEqual => { 9084 // Rule at src/isa/x64/lower.isle line 1730. 9085 let expr0_0 = constructor_x64_ucomis( 9086 ctx, 9087 pattern11_0, 9088 pattern11_1, 9089 )?; 9090 let expr1_0 = CC::BE; 9091 let expr2_0 = constructor_cmove_from_values( 9092 ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2, 9093 )?; 9094 let expr3_0 = 9095 constructor_with_flags(ctx, &expr0_0, &expr2_0)?; 9096 let expr4_0 = C::output(ctx, expr3_0); 9097 return Some(expr4_0); 9098 } 9099 &FloatCC::UnorderedOrLessThan => { 9100 // Rule at src/isa/x64/lower.isle line 1704. 9101 let expr0_0 = constructor_x64_ucomis( 9102 ctx, 9103 pattern11_1, 9104 pattern11_0, 9105 )?; 9106 let expr1_0 = CC::B; 9107 let expr2_0 = constructor_cmove_from_values( 9108 ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2, 9109 )?; 9110 let expr3_0 = 9111 constructor_with_flags(ctx, &expr0_0, &expr2_0)?; 9112 let expr4_0 = C::output(ctx, expr3_0); 9113 return Some(expr4_0); 9114 } 9115 &FloatCC::UnorderedOrLessThanOrEqual => { 9116 // Rule at src/isa/x64/lower.isle line 1707. 9117 let expr0_0 = constructor_x64_ucomis( 9118 ctx, 9119 pattern11_1, 9120 pattern11_0, 9121 )?; 9122 let expr1_0 = CC::BE; 9123 let expr2_0 = constructor_cmove_from_values( 9124 ctx, pattern2_0, &expr1_0, pattern6_1, pattern6_2, 9125 )?; 9126 let expr3_0 = 9127 constructor_with_flags(ctx, &expr0_0, &expr2_0)?; 9128 let expr4_0 = C::output(ctx, expr3_0); 9129 return Some(expr4_0); 9130 } 9131 _ => {} 9132 } 9133 } 9134 } 9135 &InstructionData::IntCompare { 9136 opcode: ref pattern9_0, 9137 args: ref pattern9_1, 9138 cond: ref pattern9_2, 9139 } => { 9140 if let &Opcode::Icmp = pattern9_0 { 9141 let (pattern11_0, pattern11_1) = 9142 C::unpack_value_array_2(ctx, pattern9_1); 9143 let pattern12_0 = C::value_type(ctx, pattern11_0); 9144 if let Some(pattern13_0) = C::fits_in_64(ctx, pattern12_0) { 9145 // Rule at src/isa/x64/lower.isle line 1757. 9146 let expr0_0 = C::raw_operand_size_of_type(ctx, pattern13_0); 9147 let expr1_0 = 9148 constructor_put_in_gpr_mem_imm(ctx, pattern11_1)?; 9149 let expr2_0 = constructor_put_in_gpr(ctx, pattern11_0)?; 9150 let expr3_0 = 9151 constructor_x64_cmp(ctx, &expr0_0, &expr1_0, expr2_0)?; 9152 let expr4_0 = C::intcc_to_cc(ctx, pattern9_2); 9153 let expr5_0 = constructor_cmove_from_values( 9154 ctx, pattern2_0, &expr4_0, pattern6_1, pattern6_2, 9155 )?; 9156 let expr6_0 = 9157 constructor_with_flags(ctx, &expr3_0, &expr5_0)?; 9158 let expr7_0 = C::output(ctx, expr6_0); 9159 return Some(expr7_0); 9160 } 9161 } 9162 } 9163 _ => {} 9164 } 9165 } 9166 let pattern7_0 = C::value_type(ctx, pattern6_0); 9167 if pattern7_0 == B1 { 9168 // Rule at src/isa/x64/lower.isle line 1764. 9169 let expr0_0: Type = B1; 9170 let expr1_0 = C::raw_operand_size_of_type(ctx, expr0_0); 9171 let expr2_0 = constructor_put_in_gpr(ctx, pattern6_0)?; 9172 let expr3_0: u32 = 1; 9173 let expr4_0 = RegMemImm::Imm { simm32: expr3_0 }; 9174 let expr5_0 = C::gpr_mem_imm_new(ctx, &expr4_0); 9175 let expr6_0 = constructor_x64_test(ctx, &expr1_0, &expr5_0, expr2_0)?; 9176 let expr7_0 = CC::NZ; 9177 let expr8_0 = constructor_cmove_from_values( 9178 ctx, pattern2_0, &expr7_0, pattern6_1, pattern6_2, 9179 )?; 9180 let expr9_0 = constructor_with_flags(ctx, &expr6_0, &expr8_0)?; 9181 let expr10_0 = C::output(ctx, expr9_0); 9182 return Some(expr10_0); 9183 } 9184 if let Some(pattern8_0) = C::fits_in_64(ctx, pattern7_0) { 9185 // Rule at src/isa/x64/lower.isle line 1771. 9186 let expr0_0 = C::raw_operand_size_of_type(ctx, pattern8_0); 9187 let expr1_0 = constructor_put_in_gpr(ctx, pattern6_0)?; 9188 let expr2_0 = C::gpr_to_gpr_mem_imm(ctx, expr1_0); 9189 let expr3_0 = constructor_x64_test(ctx, &expr0_0, &expr2_0, expr1_0)?; 9190 let expr4_0 = CC::NZ; 9191 let expr5_0 = constructor_cmove_from_values( 9192 ctx, pattern2_0, &expr4_0, pattern6_1, pattern6_2, 9193 )?; 9194 let expr6_0 = constructor_with_flags(ctx, &expr3_0, &expr5_0)?; 9195 let expr7_0 = C::output(ctx, expr6_0); 9196 return Some(expr7_0); 9197 } 9198 } 9199 } 9200 &InstructionData::Unary { 9201 opcode: ref pattern4_0, 9202 arg: pattern4_1, 9203 } => { 9204 match pattern4_0 { 9205 &Opcode::Breduce => { 9206 let pattern6_0 = C::value_type(ctx, pattern4_1); 9207 if pattern6_0 == pattern2_0 { 9208 // Rule at src/isa/x64/lower.isle line 2232. 9209 let expr0_0 = constructor_output_value(ctx, pattern4_1)?; 9210 return Some(expr0_0); 9211 } 9212 } 9213 &Opcode::Bextend => { 9214 let pattern6_0 = C::value_type(ctx, pattern4_1); 9215 // Rule at src/isa/x64/lower.isle line 2213. 9216 let expr0_0 = 9217 constructor_generic_sextend(ctx, pattern4_1, pattern6_0, pattern2_0)?; 9218 return Some(expr0_0); 9219 } 9220 &Opcode::Ireduce => { 9221 let pattern6_0 = C::value_type(ctx, pattern4_1); 9222 if pattern6_0 == pattern2_0 { 9223 // Rule at src/isa/x64/lower.isle line 2221. 9224 let expr0_0 = constructor_output_value(ctx, pattern4_1)?; 9225 return Some(expr0_0); 9226 } 9227 } 9228 &Opcode::Uextend => { 9229 let pattern6_0 = C::value_type(ctx, pattern4_1); 9230 if pattern6_0 == pattern2_0 { 9231 // Rule at src/isa/x64/lower.isle line 2114. 9232 let expr0_0 = constructor_output_value(ctx, pattern4_1)?; 9233 return Some(expr0_0); 9234 } 9235 } 9236 &Opcode::Sextend => { 9237 let pattern6_0 = C::value_type(ctx, pattern4_1); 9238 // Rule at src/isa/x64/lower.isle line 2207. 9239 let expr0_0 = 9240 constructor_generic_sextend(ctx, pattern4_1, pattern6_0, pattern2_0)?; 9241 return Some(expr0_0); 9242 } 9243 _ => {} 9244 } 9245 } 9246 _ => {} 9247 } 9248 if let Some(()) = C::avx512vl_enabled(ctx, pattern2_0) { 9249 if let Some(()) = C::avx512dq_enabled(ctx, pattern2_0) { 9250 if let Some((pattern5_0, pattern5_1)) = C::multi_lane(ctx, pattern2_0) { 9251 if pattern5_0 == 64 { 9252 if pattern5_1 == 2 { 9253 let pattern8_0 = C::inst_data(ctx, pattern0_0); 9254 if let &InstructionData::Binary { 9255 opcode: ref pattern9_0, 9256 args: ref pattern9_1, 9257 } = &pattern8_0 9258 { 9259 if let &Opcode::Imul = pattern9_0 { 9260 let (pattern11_0, pattern11_1) = 9261 C::unpack_value_array_2(ctx, pattern9_1); 9262 // Rule at src/isa/x64/lower.isle line 992. 9263 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern11_0)?; 9264 let expr1_0 = constructor_put_in_xmm(ctx, pattern11_1)?; 9265 let expr2_0 = constructor_x64_vpmullq(ctx, &expr0_0, expr1_0)?; 9266 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 9267 return Some(expr3_0); 9268 } 9269 } 9270 } 9271 } 9272 } 9273 } 9274 if let Some(()) = C::avx512f_enabled(ctx, pattern2_0) { 9275 if pattern2_0 == I64X2 { 9276 let pattern6_0 = C::inst_data(ctx, pattern0_0); 9277 if let &InstructionData::Unary { 9278 opcode: ref pattern7_0, 9279 arg: pattern7_1, 9280 } = &pattern6_0 9281 { 9282 if let &Opcode::Iabs = pattern7_0 { 9283 // Rule at src/isa/x64/lower.isle line 1220. 9284 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 9285 let expr1_0 = constructor_x64_vpabsq(ctx, &expr0_0)?; 9286 let expr2_0 = constructor_output_xmm(ctx, expr1_0)?; 9287 return Some(expr2_0); 9288 } 9289 } 9290 } 9291 } 9292 } 9293 if let Some((pattern3_0, pattern3_1)) = C::multi_lane(ctx, pattern2_0) { 9294 if pattern3_0 == 8 { 9295 if pattern3_1 == 16 { 9296 let pattern6_0 = C::inst_data(ctx, pattern0_0); 9297 if let &InstructionData::Binary { 9298 opcode: ref pattern7_0, 9299 args: ref pattern7_1, 9300 } = &pattern6_0 9301 { 9302 match pattern7_0 { 9303 &Opcode::AvgRound => { 9304 let (pattern9_0, pattern9_1) = 9305 C::unpack_value_array_2(ctx, pattern7_1); 9306 // Rule at src/isa/x64/lower.isle line 903. 9307 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 9308 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 9309 let expr2_0 = constructor_x64_pavgb(ctx, expr0_0, &expr1_0)?; 9310 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 9311 return Some(expr3_0); 9312 } 9313 &Opcode::UaddSat => { 9314 let (pattern9_0, pattern9_1) = 9315 C::unpack_value_array_2(ctx, pattern7_1); 9316 // Rule at src/isa/x64/lower.isle line 136. 9317 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 9318 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 9319 let expr2_0 = constructor_x64_paddusb(ctx, expr0_0, &expr1_0)?; 9320 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 9321 return Some(expr3_0); 9322 } 9323 &Opcode::SaddSat => { 9324 let (pattern9_0, pattern9_1) = 9325 C::unpack_value_array_2(ctx, pattern7_1); 9326 // Rule at src/isa/x64/lower.isle line 126. 9327 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 9328 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 9329 let expr2_0 = constructor_x64_paddsb(ctx, expr0_0, &expr1_0)?; 9330 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 9331 return Some(expr3_0); 9332 } 9333 &Opcode::UsubSat => { 9334 let (pattern9_0, pattern9_1) = 9335 C::unpack_value_array_2(ctx, pattern7_1); 9336 // Rule at src/isa/x64/lower.isle line 282. 9337 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 9338 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 9339 let expr2_0 = constructor_x64_psubusb(ctx, expr0_0, &expr1_0)?; 9340 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 9341 return Some(expr3_0); 9342 } 9343 &Opcode::SsubSat => { 9344 let (pattern9_0, pattern9_1) = 9345 C::unpack_value_array_2(ctx, pattern7_1); 9346 // Rule at src/isa/x64/lower.isle line 272. 9347 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 9348 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 9349 let expr2_0 = constructor_x64_psubsb(ctx, expr0_0, &expr1_0)?; 9350 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 9351 return Some(expr3_0); 9352 } 9353 &Opcode::Iadd => { 9354 let (pattern9_0, pattern9_1) = 9355 C::unpack_value_array_2(ctx, pattern7_1); 9356 // Rule at src/isa/x64/lower.isle line 94. 9357 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 9358 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 9359 let expr2_0 = constructor_x64_paddb(ctx, expr0_0, &expr1_0)?; 9360 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 9361 return Some(expr3_0); 9362 } 9363 &Opcode::Isub => { 9364 let (pattern9_0, pattern9_1) = 9365 C::unpack_value_array_2(ctx, pattern7_1); 9366 // Rule at src/isa/x64/lower.isle line 240. 9367 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 9368 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 9369 let expr2_0 = constructor_x64_psubb(ctx, expr0_0, &expr1_0)?; 9370 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 9371 return Some(expr3_0); 9372 } 9373 _ => {} 9374 } 9375 } 9376 } 9377 } 9378 if pattern3_0 == 16 { 9379 if pattern3_1 == 8 { 9380 let pattern6_0 = C::inst_data(ctx, pattern0_0); 9381 if let &InstructionData::Binary { 9382 opcode: ref pattern7_0, 9383 args: ref pattern7_1, 9384 } = &pattern6_0 9385 { 9386 match pattern7_0 { 9387 &Opcode::AvgRound => { 9388 let (pattern9_0, pattern9_1) = 9389 C::unpack_value_array_2(ctx, pattern7_1); 9390 // Rule at src/isa/x64/lower.isle line 907. 9391 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 9392 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 9393 let expr2_0 = constructor_x64_pavgw(ctx, expr0_0, &expr1_0)?; 9394 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 9395 return Some(expr3_0); 9396 } 9397 &Opcode::UaddSat => { 9398 let (pattern9_0, pattern9_1) = 9399 C::unpack_value_array_2(ctx, pattern7_1); 9400 // Rule at src/isa/x64/lower.isle line 140. 9401 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 9402 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 9403 let expr2_0 = constructor_x64_paddusw(ctx, expr0_0, &expr1_0)?; 9404 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 9405 return Some(expr3_0); 9406 } 9407 &Opcode::SaddSat => { 9408 let (pattern9_0, pattern9_1) = 9409 C::unpack_value_array_2(ctx, pattern7_1); 9410 // Rule at src/isa/x64/lower.isle line 130. 9411 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 9412 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 9413 let expr2_0 = constructor_x64_paddsw(ctx, expr0_0, &expr1_0)?; 9414 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 9415 return Some(expr3_0); 9416 } 9417 &Opcode::UsubSat => { 9418 let (pattern9_0, pattern9_1) = 9419 C::unpack_value_array_2(ctx, pattern7_1); 9420 // Rule at src/isa/x64/lower.isle line 286. 9421 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 9422 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 9423 let expr2_0 = constructor_x64_psubusw(ctx, expr0_0, &expr1_0)?; 9424 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 9425 return Some(expr3_0); 9426 } 9427 &Opcode::SsubSat => { 9428 let (pattern9_0, pattern9_1) = 9429 C::unpack_value_array_2(ctx, pattern7_1); 9430 // Rule at src/isa/x64/lower.isle line 276. 9431 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 9432 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 9433 let expr2_0 = constructor_x64_psubsw(ctx, expr0_0, &expr1_0)?; 9434 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 9435 return Some(expr3_0); 9436 } 9437 &Opcode::Iadd => { 9438 let (pattern9_0, pattern9_1) = 9439 C::unpack_value_array_2(ctx, pattern7_1); 9440 // Rule at src/isa/x64/lower.isle line 98. 9441 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 9442 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 9443 let expr2_0 = constructor_x64_paddw(ctx, expr0_0, &expr1_0)?; 9444 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 9445 return Some(expr3_0); 9446 } 9447 &Opcode::Isub => { 9448 let (pattern9_0, pattern9_1) = 9449 C::unpack_value_array_2(ctx, pattern7_1); 9450 // Rule at src/isa/x64/lower.isle line 244. 9451 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 9452 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 9453 let expr2_0 = constructor_x64_psubw(ctx, expr0_0, &expr1_0)?; 9454 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 9455 return Some(expr3_0); 9456 } 9457 &Opcode::Imul => { 9458 let (pattern9_0, pattern9_1) = 9459 C::unpack_value_array_2(ctx, pattern7_1); 9460 if let Some(pattern10_0) = C::def_inst(ctx, pattern9_0) { 9461 let pattern11_0 = C::inst_data(ctx, pattern10_0); 9462 if let &InstructionData::Unary { 9463 opcode: ref pattern12_0, 9464 arg: pattern12_1, 9465 } = &pattern11_0 9466 { 9467 match pattern12_0 { 9468 &Opcode::SwidenLow => { 9469 let pattern14_0 = C::value_type(ctx, pattern12_1); 9470 if let Some((pattern15_0, pattern15_1)) = 9471 C::multi_lane(ctx, pattern14_0) 9472 { 9473 if pattern15_0 == 8 { 9474 if pattern15_1 == 16 { 9475 if let Some(pattern18_0) = 9476 C::def_inst(ctx, pattern9_1) 9477 { 9478 let pattern19_0 = 9479 C::inst_data(ctx, pattern18_0); 9480 if let &InstructionData::Unary { 9481 opcode: ref pattern20_0, 9482 arg: pattern20_1, 9483 } = &pattern19_0 9484 { 9485 if let &Opcode::SwidenLow = 9486 pattern20_0 9487 { 9488 let pattern22_0 = 9489 C::value_type( 9490 ctx, 9491 pattern20_1, 9492 ); 9493 if let Some(( 9494 pattern23_0, 9495 pattern23_1, 9496 )) = C::multi_lane( 9497 ctx, 9498 pattern22_0, 9499 ) { 9500 if pattern23_0 == 8 { 9501 if pattern23_1 == 16 9502 { 9503 // Rule at src/isa/x64/lower.isle line 1080. 9504 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?; 9505 let expr1_0 = constructor_x64_pmovsxbw(ctx, &expr0_0)?; 9506 let expr2_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?; 9507 let expr3_0 = constructor_x64_pmovsxbw(ctx, &expr2_0)?; 9508 let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0); 9509 let expr5_0 = constructor_x64_pmullw(ctx, expr1_0, &expr4_0)?; 9510 let expr6_0 = constructor_output_xmm(ctx, expr5_0)?; 9511 return Some( 9512 expr6_0, 9513 ); 9514 } 9515 } 9516 } 9517 } 9518 } 9519 } 9520 } 9521 } 9522 } 9523 } 9524 &Opcode::SwidenHigh => { 9525 let pattern14_0 = C::value_type(ctx, pattern12_1); 9526 if let Some((pattern15_0, pattern15_1)) = 9527 C::multi_lane(ctx, pattern14_0) 9528 { 9529 if pattern15_0 == 8 { 9530 if pattern15_1 == 16 { 9531 if let Some(pattern18_0) = 9532 C::def_inst(ctx, pattern9_1) 9533 { 9534 let pattern19_0 = 9535 C::inst_data(ctx, pattern18_0); 9536 if let &InstructionData::Unary { 9537 opcode: ref pattern20_0, 9538 arg: pattern20_1, 9539 } = &pattern19_0 9540 { 9541 if let &Opcode::SwidenHigh = 9542 pattern20_0 9543 { 9544 let pattern22_0 = 9545 C::value_type( 9546 ctx, 9547 pattern20_1, 9548 ); 9549 if let Some(( 9550 pattern23_0, 9551 pattern23_1, 9552 )) = C::multi_lane( 9553 ctx, 9554 pattern22_0, 9555 ) { 9556 if pattern23_0 == 8 { 9557 if pattern23_1 == 16 9558 { 9559 // Rule at src/isa/x64/lower.isle line 1040. 9560 let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?; 9561 let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); 9562 let expr2_0: u8 = 8; 9563 let expr3_0 = OperandSize::Size32; 9564 let expr4_0 = constructor_x64_palignr(ctx, expr0_0, &expr1_0, expr2_0, &expr3_0)?; 9565 let expr5_0 = C::xmm_to_xmm_mem(ctx, expr4_0); 9566 let expr6_0 = constructor_x64_pmovsxbw(ctx, &expr5_0)?; 9567 let expr7_0 = constructor_put_in_xmm(ctx, pattern20_1)?; 9568 let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); 9569 let expr9_0: u8 = 8; 9570 let expr10_0 = OperandSize::Size32; 9571 let expr11_0 = constructor_x64_palignr(ctx, expr7_0, &expr8_0, expr9_0, &expr10_0)?; 9572 let expr12_0 = C::xmm_to_xmm_mem(ctx, expr11_0); 9573 let expr13_0 = constructor_x64_pmovsxbw(ctx, &expr12_0)?; 9574 let expr14_0 = C::xmm_to_xmm_mem(ctx, expr13_0); 9575 let expr15_0 = constructor_x64_pmullw(ctx, expr6_0, &expr14_0)?; 9576 let expr16_0 = constructor_output_xmm(ctx, expr15_0)?; 9577 return Some( 9578 expr16_0, 9579 ); 9580 } 9581 } 9582 } 9583 } 9584 } 9585 } 9586 } 9587 } 9588 } 9589 } 9590 &Opcode::UwidenLow => { 9591 let pattern14_0 = C::value_type(ctx, pattern12_1); 9592 if let Some((pattern15_0, pattern15_1)) = 9593 C::multi_lane(ctx, pattern14_0) 9594 { 9595 if pattern15_0 == 8 { 9596 if pattern15_1 == 16 { 9597 if let Some(pattern18_0) = 9598 C::def_inst(ctx, pattern9_1) 9599 { 9600 let pattern19_0 = 9601 C::inst_data(ctx, pattern18_0); 9602 if let &InstructionData::Unary { 9603 opcode: ref pattern20_0, 9604 arg: pattern20_1, 9605 } = &pattern19_0 9606 { 9607 if let &Opcode::UwidenLow = 9608 pattern20_0 9609 { 9610 let pattern22_0 = 9611 C::value_type( 9612 ctx, 9613 pattern20_1, 9614 ); 9615 if let Some(( 9616 pattern23_0, 9617 pattern23_1, 9618 )) = C::multi_lane( 9619 ctx, 9620 pattern22_0, 9621 ) { 9622 if pattern23_0 == 8 { 9623 if pattern23_1 == 16 9624 { 9625 // Rule at src/isa/x64/lower.isle line 1156. 9626 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?; 9627 let expr1_0 = constructor_x64_pmovzxbw(ctx, &expr0_0)?; 9628 let expr2_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?; 9629 let expr3_0 = constructor_x64_pmovzxbw(ctx, &expr2_0)?; 9630 let expr4_0 = C::xmm_to_xmm_mem(ctx, expr3_0); 9631 let expr5_0 = constructor_x64_pmullw(ctx, expr1_0, &expr4_0)?; 9632 let expr6_0 = constructor_output_xmm(ctx, expr5_0)?; 9633 return Some( 9634 expr6_0, 9635 ); 9636 } 9637 } 9638 } 9639 } 9640 } 9641 } 9642 } 9643 } 9644 } 9645 } 9646 &Opcode::UwidenHigh => { 9647 let pattern14_0 = C::value_type(ctx, pattern12_1); 9648 if let Some((pattern15_0, pattern15_1)) = 9649 C::multi_lane(ctx, pattern14_0) 9650 { 9651 if pattern15_0 == 8 { 9652 if pattern15_1 == 16 { 9653 if let Some(pattern18_0) = 9654 C::def_inst(ctx, pattern9_1) 9655 { 9656 let pattern19_0 = 9657 C::inst_data(ctx, pattern18_0); 9658 if let &InstructionData::Unary { 9659 opcode: ref pattern20_0, 9660 arg: pattern20_1, 9661 } = &pattern19_0 9662 { 9663 if let &Opcode::UwidenHigh = 9664 pattern20_0 9665 { 9666 let pattern22_0 = 9667 C::value_type( 9668 ctx, 9669 pattern20_1, 9670 ); 9671 if let Some(( 9672 pattern23_0, 9673 pattern23_1, 9674 )) = C::multi_lane( 9675 ctx, 9676 pattern22_0, 9677 ) { 9678 if pattern23_0 == 8 { 9679 if pattern23_1 == 16 9680 { 9681 // Rule at src/isa/x64/lower.isle line 1116. 9682 let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?; 9683 let expr1_0 = C::xmm_to_xmm_mem(ctx, expr0_0); 9684 let expr2_0: u8 = 8; 9685 let expr3_0 = OperandSize::Size32; 9686 let expr4_0 = constructor_x64_palignr(ctx, expr0_0, &expr1_0, expr2_0, &expr3_0)?; 9687 let expr5_0 = C::xmm_to_xmm_mem(ctx, expr4_0); 9688 let expr6_0 = constructor_x64_pmovzxbw(ctx, &expr5_0)?; 9689 let expr7_0 = constructor_put_in_xmm(ctx, pattern20_1)?; 9690 let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); 9691 let expr9_0: u8 = 8; 9692 let expr10_0 = OperandSize::Size32; 9693 let expr11_0 = constructor_x64_palignr(ctx, expr7_0, &expr8_0, expr9_0, &expr10_0)?; 9694 let expr12_0 = C::xmm_to_xmm_mem(ctx, expr11_0); 9695 let expr13_0 = constructor_x64_pmovzxbw(ctx, &expr12_0)?; 9696 let expr14_0 = C::xmm_to_xmm_mem(ctx, expr13_0); 9697 let expr15_0 = constructor_x64_pmullw(ctx, expr6_0, &expr14_0)?; 9698 let expr16_0 = constructor_output_xmm(ctx, expr15_0)?; 9699 return Some( 9700 expr16_0, 9701 ); 9702 } 9703 } 9704 } 9705 } 9706 } 9707 } 9708 } 9709 } 9710 } 9711 } 9712 _ => {} 9713 } 9714 } 9715 } 9716 // Rule at src/isa/x64/lower.isle line 984. 9717 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 9718 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 9719 let expr2_0 = constructor_x64_pmullw(ctx, expr0_0, &expr1_0)?; 9720 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 9721 return Some(expr3_0); 9722 } 9723 _ => {} 9724 } 9725 } 9726 } 9727 } 9728 if pattern3_0 == 32 { 9729 if pattern3_1 == 4 { 9730 let pattern6_0 = C::inst_data(ctx, pattern0_0); 9731 if let &InstructionData::Binary { 9732 opcode: ref pattern7_0, 9733 args: ref pattern7_1, 9734 } = &pattern6_0 9735 { 9736 match pattern7_0 { 9737 &Opcode::Iadd => { 9738 let (pattern9_0, pattern9_1) = 9739 C::unpack_value_array_2(ctx, pattern7_1); 9740 // Rule at src/isa/x64/lower.isle line 102. 9741 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 9742 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 9743 let expr2_0 = constructor_x64_paddd(ctx, expr0_0, &expr1_0)?; 9744 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 9745 return Some(expr3_0); 9746 } 9747 &Opcode::Isub => { 9748 let (pattern9_0, pattern9_1) = 9749 C::unpack_value_array_2(ctx, pattern7_1); 9750 // Rule at src/isa/x64/lower.isle line 248. 9751 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 9752 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 9753 let expr2_0 = constructor_x64_psubd(ctx, expr0_0, &expr1_0)?; 9754 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 9755 return Some(expr3_0); 9756 } 9757 &Opcode::Imul => { 9758 let (pattern9_0, pattern9_1) = 9759 C::unpack_value_array_2(ctx, pattern7_1); 9760 if let Some(pattern10_0) = C::def_inst(ctx, pattern9_0) { 9761 let pattern11_0 = C::inst_data(ctx, pattern10_0); 9762 if let &InstructionData::Unary { 9763 opcode: ref pattern12_0, 9764 arg: pattern12_1, 9765 } = &pattern11_0 9766 { 9767 match pattern12_0 { 9768 &Opcode::SwidenLow => { 9769 let pattern14_0 = C::value_type(ctx, pattern12_1); 9770 if let Some((pattern15_0, pattern15_1)) = 9771 C::multi_lane(ctx, pattern14_0) 9772 { 9773 if pattern15_0 == 16 { 9774 if pattern15_1 == 8 { 9775 if let Some(pattern18_0) = 9776 C::def_inst(ctx, pattern9_1) 9777 { 9778 let pattern19_0 = 9779 C::inst_data(ctx, pattern18_0); 9780 if let &InstructionData::Unary { 9781 opcode: ref pattern20_0, 9782 arg: pattern20_1, 9783 } = &pattern19_0 9784 { 9785 if let &Opcode::SwidenLow = 9786 pattern20_0 9787 { 9788 let pattern22_0 = 9789 C::value_type( 9790 ctx, 9791 pattern20_1, 9792 ); 9793 if let Some(( 9794 pattern23_0, 9795 pattern23_1, 9796 )) = C::multi_lane( 9797 ctx, 9798 pattern22_0, 9799 ) { 9800 if pattern23_0 == 16 { 9801 if pattern23_1 == 8 9802 { 9803 // Rule at src/isa/x64/lower.isle line 1090. 9804 let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?; 9805 let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?; 9806 let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 9807 let expr3_0 = constructor_x64_pmullw(ctx, expr0_0, &expr2_0)?; 9808 let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 9809 let expr5_0 = constructor_x64_pmulhw(ctx, expr0_0, &expr4_0)?; 9810 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); 9811 let expr7_0 = constructor_x64_punpcklwd(ctx, expr3_0, &expr6_0)?; 9812 let expr8_0 = constructor_output_xmm(ctx, expr7_0)?; 9813 return Some( 9814 expr8_0, 9815 ); 9816 } 9817 } 9818 } 9819 } 9820 } 9821 } 9822 } 9823 } 9824 } 9825 } 9826 &Opcode::SwidenHigh => { 9827 let pattern14_0 = C::value_type(ctx, pattern12_1); 9828 if let Some((pattern15_0, pattern15_1)) = 9829 C::multi_lane(ctx, pattern14_0) 9830 { 9831 if pattern15_0 == 16 { 9832 if pattern15_1 == 8 { 9833 if let Some(pattern18_0) = 9834 C::def_inst(ctx, pattern9_1) 9835 { 9836 let pattern19_0 = 9837 C::inst_data(ctx, pattern18_0); 9838 if let &InstructionData::Unary { 9839 opcode: ref pattern20_0, 9840 arg: pattern20_1, 9841 } = &pattern19_0 9842 { 9843 if let &Opcode::SwidenHigh = 9844 pattern20_0 9845 { 9846 let pattern22_0 = 9847 C::value_type( 9848 ctx, 9849 pattern20_1, 9850 ); 9851 if let Some(( 9852 pattern23_0, 9853 pattern23_1, 9854 )) = C::multi_lane( 9855 ctx, 9856 pattern22_0, 9857 ) { 9858 if pattern23_0 == 16 { 9859 if pattern23_1 == 8 9860 { 9861 // Rule at src/isa/x64/lower.isle line 1054. 9862 let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?; 9863 let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?; 9864 let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 9865 let expr3_0 = constructor_x64_pmullw(ctx, expr0_0, &expr2_0)?; 9866 let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 9867 let expr5_0 = constructor_x64_pmulhw(ctx, expr0_0, &expr4_0)?; 9868 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); 9869 let expr7_0 = constructor_x64_punpckhwd(ctx, expr3_0, &expr6_0)?; 9870 let expr8_0 = constructor_output_xmm(ctx, expr7_0)?; 9871 return Some( 9872 expr8_0, 9873 ); 9874 } 9875 } 9876 } 9877 } 9878 } 9879 } 9880 } 9881 } 9882 } 9883 } 9884 &Opcode::UwidenLow => { 9885 let pattern14_0 = C::value_type(ctx, pattern12_1); 9886 if let Some((pattern15_0, pattern15_1)) = 9887 C::multi_lane(ctx, pattern14_0) 9888 { 9889 if pattern15_0 == 16 { 9890 if pattern15_1 == 8 { 9891 if let Some(pattern18_0) = 9892 C::def_inst(ctx, pattern9_1) 9893 { 9894 let pattern19_0 = 9895 C::inst_data(ctx, pattern18_0); 9896 if let &InstructionData::Unary { 9897 opcode: ref pattern20_0, 9898 arg: pattern20_1, 9899 } = &pattern19_0 9900 { 9901 if let &Opcode::UwidenLow = 9902 pattern20_0 9903 { 9904 let pattern22_0 = 9905 C::value_type( 9906 ctx, 9907 pattern20_1, 9908 ); 9909 if let Some(( 9910 pattern23_0, 9911 pattern23_1, 9912 )) = C::multi_lane( 9913 ctx, 9914 pattern22_0, 9915 ) { 9916 if pattern23_0 == 16 { 9917 if pattern23_1 == 8 9918 { 9919 // Rule at src/isa/x64/lower.isle line 1166. 9920 let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?; 9921 let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?; 9922 let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 9923 let expr3_0 = constructor_x64_pmullw(ctx, expr0_0, &expr2_0)?; 9924 let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 9925 let expr5_0 = constructor_x64_pmulhuw(ctx, expr0_0, &expr4_0)?; 9926 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); 9927 let expr7_0 = constructor_x64_punpcklwd(ctx, expr3_0, &expr6_0)?; 9928 let expr8_0 = constructor_output_xmm(ctx, expr7_0)?; 9929 return Some( 9930 expr8_0, 9931 ); 9932 } 9933 } 9934 } 9935 } 9936 } 9937 } 9938 } 9939 } 9940 } 9941 } 9942 &Opcode::UwidenHigh => { 9943 let pattern14_0 = C::value_type(ctx, pattern12_1); 9944 if let Some((pattern15_0, pattern15_1)) = 9945 C::multi_lane(ctx, pattern14_0) 9946 { 9947 if pattern15_0 == 16 { 9948 if pattern15_1 == 8 { 9949 if let Some(pattern18_0) = 9950 C::def_inst(ctx, pattern9_1) 9951 { 9952 let pattern19_0 = 9953 C::inst_data(ctx, pattern18_0); 9954 if let &InstructionData::Unary { 9955 opcode: ref pattern20_0, 9956 arg: pattern20_1, 9957 } = &pattern19_0 9958 { 9959 if let &Opcode::UwidenHigh = 9960 pattern20_0 9961 { 9962 let pattern22_0 = 9963 C::value_type( 9964 ctx, 9965 pattern20_1, 9966 ); 9967 if let Some(( 9968 pattern23_0, 9969 pattern23_1, 9970 )) = C::multi_lane( 9971 ctx, 9972 pattern22_0, 9973 ) { 9974 if pattern23_0 == 16 { 9975 if pattern23_1 == 8 9976 { 9977 // Rule at src/isa/x64/lower.isle line 1130. 9978 let expr0_0 = constructor_put_in_xmm(ctx, pattern12_1)?; 9979 let expr1_0 = constructor_put_in_xmm(ctx, pattern20_1)?; 9980 let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 9981 let expr3_0 = constructor_x64_pmullw(ctx, expr0_0, &expr2_0)?; 9982 let expr4_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 9983 let expr5_0 = constructor_x64_pmulhuw(ctx, expr0_0, &expr4_0)?; 9984 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr5_0); 9985 let expr7_0 = constructor_x64_punpckhwd(ctx, expr3_0, &expr6_0)?; 9986 let expr8_0 = constructor_output_xmm(ctx, expr7_0)?; 9987 return Some( 9988 expr8_0, 9989 ); 9990 } 9991 } 9992 } 9993 } 9994 } 9995 } 9996 } 9997 } 9998 } 9999 } 10000 _ => {} 10001 } 10002 } 10003 } 10004 // Rule at src/isa/x64/lower.isle line 987. 10005 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 10006 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 10007 let expr2_0 = constructor_x64_pmulld(ctx, expr0_0, &expr1_0)?; 10008 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 10009 return Some(expr3_0); 10010 } 10011 _ => {} 10012 } 10013 } 10014 } 10015 } 10016 if pattern3_0 == 64 { 10017 if pattern3_1 == 2 { 10018 let pattern6_0 = C::inst_data(ctx, pattern0_0); 10019 if let &InstructionData::Binary { 10020 opcode: ref pattern7_0, 10021 args: ref pattern7_1, 10022 } = &pattern6_0 10023 { 10024 match pattern7_0 { 10025 &Opcode::Iadd => { 10026 let (pattern9_0, pattern9_1) = 10027 C::unpack_value_array_2(ctx, pattern7_1); 10028 // Rule at src/isa/x64/lower.isle line 106. 10029 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 10030 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 10031 let expr2_0 = constructor_x64_paddq(ctx, expr0_0, &expr1_0)?; 10032 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 10033 return Some(expr3_0); 10034 } 10035 &Opcode::Isub => { 10036 let (pattern9_0, pattern9_1) = 10037 C::unpack_value_array_2(ctx, pattern7_1); 10038 // Rule at src/isa/x64/lower.isle line 252. 10039 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 10040 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern9_1)?; 10041 let expr2_0 = constructor_x64_psubq(ctx, expr0_0, &expr1_0)?; 10042 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 10043 return Some(expr3_0); 10044 } 10045 &Opcode::Imul => { 10046 let (pattern9_0, pattern9_1) = 10047 C::unpack_value_array_2(ctx, pattern7_1); 10048 if let Some(pattern10_0) = C::def_inst(ctx, pattern9_0) { 10049 let pattern11_0 = C::inst_data(ctx, pattern10_0); 10050 if let &InstructionData::Unary { 10051 opcode: ref pattern12_0, 10052 arg: pattern12_1, 10053 } = &pattern11_0 10054 { 10055 match pattern12_0 { 10056 &Opcode::SwidenLow => { 10057 let pattern14_0 = C::value_type(ctx, pattern12_1); 10058 if let Some((pattern15_0, pattern15_1)) = 10059 C::multi_lane(ctx, pattern14_0) 10060 { 10061 if pattern15_0 == 32 { 10062 if pattern15_1 == 4 { 10063 if let Some(pattern18_0) = 10064 C::def_inst(ctx, pattern9_1) 10065 { 10066 let pattern19_0 = 10067 C::inst_data(ctx, pattern18_0); 10068 if let &InstructionData::Unary { 10069 opcode: ref pattern20_0, 10070 arg: pattern20_1, 10071 } = &pattern19_0 10072 { 10073 if let &Opcode::SwidenLow = 10074 pattern20_0 10075 { 10076 let pattern22_0 = 10077 C::value_type( 10078 ctx, 10079 pattern20_1, 10080 ); 10081 if let Some(( 10082 pattern23_0, 10083 pattern23_1, 10084 )) = C::multi_lane( 10085 ctx, 10086 pattern22_0, 10087 ) { 10088 if pattern23_0 == 32 { 10089 if pattern23_1 == 4 10090 { 10091 // Rule at src/isa/x64/lower.isle line 1102. 10092 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?; 10093 let expr1_0: u8 = 80; 10094 let expr2_0 = OperandSize::Size32; 10095 let expr3_0 = constructor_x64_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?; 10096 let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?; 10097 let expr5_0: u8 = 80; 10098 let expr6_0 = OperandSize::Size32; 10099 let expr7_0 = constructor_x64_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?; 10100 let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); 10101 let expr9_0 = constructor_x64_pmuldq(ctx, expr3_0, &expr8_0)?; 10102 let expr10_0 = constructor_output_xmm(ctx, expr9_0)?; 10103 return Some( 10104 expr10_0, 10105 ); 10106 } 10107 } 10108 } 10109 } 10110 } 10111 } 10112 } 10113 } 10114 } 10115 } 10116 &Opcode::SwidenHigh => { 10117 let pattern14_0 = C::value_type(ctx, pattern12_1); 10118 if let Some((pattern15_0, pattern15_1)) = 10119 C::multi_lane(ctx, pattern14_0) 10120 { 10121 if pattern15_0 == 32 { 10122 if pattern15_1 == 4 { 10123 if let Some(pattern18_0) = 10124 C::def_inst(ctx, pattern9_1) 10125 { 10126 let pattern19_0 = 10127 C::inst_data(ctx, pattern18_0); 10128 if let &InstructionData::Unary { 10129 opcode: ref pattern20_0, 10130 arg: pattern20_1, 10131 } = &pattern19_0 10132 { 10133 if let &Opcode::SwidenHigh = 10134 pattern20_0 10135 { 10136 let pattern22_0 = 10137 C::value_type( 10138 ctx, 10139 pattern20_1, 10140 ); 10141 if let Some(( 10142 pattern23_0, 10143 pattern23_1, 10144 )) = C::multi_lane( 10145 ctx, 10146 pattern22_0, 10147 ) { 10148 if pattern23_0 == 32 { 10149 if pattern23_1 == 4 10150 { 10151 // Rule at src/isa/x64/lower.isle line 1066. 10152 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?; 10153 let expr1_0: u8 = 250; 10154 let expr2_0 = OperandSize::Size32; 10155 let expr3_0 = constructor_x64_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?; 10156 let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?; 10157 let expr5_0: u8 = 250; 10158 let expr6_0 = OperandSize::Size32; 10159 let expr7_0 = constructor_x64_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?; 10160 let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); 10161 let expr9_0 = constructor_x64_pmuldq(ctx, expr3_0, &expr8_0)?; 10162 let expr10_0 = constructor_output_xmm(ctx, expr9_0)?; 10163 return Some( 10164 expr10_0, 10165 ); 10166 } 10167 } 10168 } 10169 } 10170 } 10171 } 10172 } 10173 } 10174 } 10175 } 10176 &Opcode::UwidenLow => { 10177 let pattern14_0 = C::value_type(ctx, pattern12_1); 10178 if let Some((pattern15_0, pattern15_1)) = 10179 C::multi_lane(ctx, pattern14_0) 10180 { 10181 if pattern15_0 == 32 { 10182 if pattern15_1 == 4 { 10183 if let Some(pattern18_0) = 10184 C::def_inst(ctx, pattern9_1) 10185 { 10186 let pattern19_0 = 10187 C::inst_data(ctx, pattern18_0); 10188 if let &InstructionData::Unary { 10189 opcode: ref pattern20_0, 10190 arg: pattern20_1, 10191 } = &pattern19_0 10192 { 10193 if let &Opcode::UwidenLow = 10194 pattern20_0 10195 { 10196 let pattern22_0 = 10197 C::value_type( 10198 ctx, 10199 pattern20_1, 10200 ); 10201 if let Some(( 10202 pattern23_0, 10203 pattern23_1, 10204 )) = C::multi_lane( 10205 ctx, 10206 pattern22_0, 10207 ) { 10208 if pattern23_0 == 32 { 10209 if pattern23_1 == 4 10210 { 10211 // Rule at src/isa/x64/lower.isle line 1178. 10212 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?; 10213 let expr1_0: u8 = 80; 10214 let expr2_0 = OperandSize::Size32; 10215 let expr3_0 = constructor_x64_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?; 10216 let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?; 10217 let expr5_0: u8 = 80; 10218 let expr6_0 = OperandSize::Size32; 10219 let expr7_0 = constructor_x64_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?; 10220 let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); 10221 let expr9_0 = constructor_x64_pmuludq(ctx, expr3_0, &expr8_0)?; 10222 let expr10_0 = constructor_output_xmm(ctx, expr9_0)?; 10223 return Some( 10224 expr10_0, 10225 ); 10226 } 10227 } 10228 } 10229 } 10230 } 10231 } 10232 } 10233 } 10234 } 10235 } 10236 &Opcode::UwidenHigh => { 10237 let pattern14_0 = C::value_type(ctx, pattern12_1); 10238 if let Some((pattern15_0, pattern15_1)) = 10239 C::multi_lane(ctx, pattern14_0) 10240 { 10241 if pattern15_0 == 32 { 10242 if pattern15_1 == 4 { 10243 if let Some(pattern18_0) = 10244 C::def_inst(ctx, pattern9_1) 10245 { 10246 let pattern19_0 = 10247 C::inst_data(ctx, pattern18_0); 10248 if let &InstructionData::Unary { 10249 opcode: ref pattern20_0, 10250 arg: pattern20_1, 10251 } = &pattern19_0 10252 { 10253 if let &Opcode::UwidenHigh = 10254 pattern20_0 10255 { 10256 let pattern22_0 = 10257 C::value_type( 10258 ctx, 10259 pattern20_1, 10260 ); 10261 if let Some(( 10262 pattern23_0, 10263 pattern23_1, 10264 )) = C::multi_lane( 10265 ctx, 10266 pattern22_0, 10267 ) { 10268 if pattern23_0 == 32 { 10269 if pattern23_1 == 4 10270 { 10271 // Rule at src/isa/x64/lower.isle line 1142. 10272 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern12_1)?; 10273 let expr1_0: u8 = 250; 10274 let expr2_0 = OperandSize::Size32; 10275 let expr3_0 = constructor_x64_pshufd(ctx, &expr0_0, expr1_0, &expr2_0)?; 10276 let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern20_1)?; 10277 let expr5_0: u8 = 250; 10278 let expr6_0 = OperandSize::Size32; 10279 let expr7_0 = constructor_x64_pshufd(ctx, &expr4_0, expr5_0, &expr6_0)?; 10280 let expr8_0 = C::xmm_to_xmm_mem(ctx, expr7_0); 10281 let expr9_0 = constructor_x64_pmuludq(ctx, expr3_0, &expr8_0)?; 10282 let expr10_0 = constructor_output_xmm(ctx, expr9_0)?; 10283 return Some( 10284 expr10_0, 10285 ); 10286 } 10287 } 10288 } 10289 } 10290 } 10291 } 10292 } 10293 } 10294 } 10295 } 10296 _ => {} 10297 } 10298 } 10299 } 10300 // Rule at src/isa/x64/lower.isle line 1018. 10301 let expr0_0 = constructor_put_in_xmm(ctx, pattern9_0)?; 10302 let expr1_0 = constructor_put_in_xmm(ctx, pattern9_1)?; 10303 let expr2_0: u32 = 32; 10304 let expr3_0 = RegMemImm::Imm { simm32: expr2_0 }; 10305 let expr4_0 = constructor_mov_rmi_to_xmm(ctx, &expr3_0)?; 10306 let expr5_0 = constructor_x64_psrlq(ctx, expr0_0, &expr4_0)?; 10307 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 10308 let expr7_0 = constructor_x64_pmuludq(ctx, expr5_0, &expr6_0)?; 10309 let expr8_0: u32 = 32; 10310 let expr9_0 = RegMemImm::Imm { simm32: expr8_0 }; 10311 let expr10_0 = constructor_mov_rmi_to_xmm(ctx, &expr9_0)?; 10312 let expr11_0 = constructor_x64_psrlq(ctx, expr1_0, &expr10_0)?; 10313 let expr12_0 = C::xmm_to_xmm_mem(ctx, expr11_0); 10314 let expr13_0 = constructor_x64_pmuludq(ctx, expr0_0, &expr12_0)?; 10315 let expr14_0 = C::xmm_to_xmm_mem(ctx, expr13_0); 10316 let expr15_0 = constructor_x64_paddq(ctx, expr7_0, &expr14_0)?; 10317 let expr16_0: u32 = 32; 10318 let expr17_0 = RegMemImm::Imm { simm32: expr16_0 }; 10319 let expr18_0 = constructor_mov_rmi_to_xmm(ctx, &expr17_0)?; 10320 let expr19_0 = constructor_x64_psllq(ctx, expr15_0, &expr18_0)?; 10321 let expr20_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 10322 let expr21_0 = constructor_x64_pmuludq(ctx, expr0_0, &expr20_0)?; 10323 let expr22_0 = C::xmm_to_xmm_mem(ctx, expr19_0); 10324 let expr23_0 = constructor_x64_paddq(ctx, expr21_0, &expr22_0)?; 10325 let expr24_0 = constructor_output_xmm(ctx, expr23_0)?; 10326 return Some(expr24_0); 10327 } 10328 _ => {} 10329 } 10330 } 10331 } 10332 } 10333 let pattern4_0 = C::inst_data(ctx, pattern0_0); 10334 match &pattern4_0 { 10335 &InstructionData::Binary { 10336 opcode: ref pattern5_0, 10337 args: ref pattern5_1, 10338 } => { 10339 match pattern5_0 { 10340 &Opcode::Band => { 10341 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 10342 // Rule at src/isa/x64/lower.isle line 328. 10343 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 10344 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 10345 let expr2_0 = constructor_sse_and(ctx, pattern2_0, expr0_0, &expr1_0)?; 10346 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 10347 return Some(expr3_0); 10348 } 10349 &Opcode::Bor => { 10350 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 10351 // Rule at src/isa/x64/lower.isle line 392. 10352 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 10353 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 10354 let expr2_0 = constructor_sse_or(ctx, pattern2_0, expr0_0, &expr1_0)?; 10355 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 10356 return Some(expr3_0); 10357 } 10358 &Opcode::Bxor => { 10359 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 10360 // Rule at src/isa/x64/lower.isle line 453. 10361 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 10362 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 10363 let expr2_0 = constructor_sse_xor(ctx, pattern2_0, expr0_0, &expr1_0)?; 10364 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 10365 return Some(expr3_0); 10366 } 10367 _ => {} 10368 } 10369 } 10370 &InstructionData::Ternary { 10371 opcode: ref pattern5_0, 10372 args: ref pattern5_1, 10373 } => { 10374 match pattern5_0 { 10375 &Opcode::Bitselect => { 10376 let (pattern7_0, pattern7_1, pattern7_2) = 10377 C::unpack_value_array_3(ctx, pattern5_1); 10378 // Rule at src/isa/x64/lower.isle line 1279. 10379 let expr0_0 = constructor_put_in_xmm(ctx, pattern7_0)?; 10380 let expr1_0 = constructor_put_in_xmm(ctx, pattern7_1)?; 10381 let expr2_0 = C::xmm_to_xmm_mem(ctx, expr0_0); 10382 let expr3_0 = constructor_sse_and(ctx, pattern2_0, expr1_0, &expr2_0)?; 10383 let expr4_0 = constructor_put_in_xmm_mem(ctx, pattern7_2)?; 10384 let expr5_0 = 10385 constructor_sse_and_not(ctx, pattern2_0, expr0_0, &expr4_0)?; 10386 let expr6_0 = C::xmm_to_xmm_mem(ctx, expr3_0); 10387 let expr7_0 = constructor_sse_or(ctx, pattern2_0, expr5_0, &expr6_0)?; 10388 let expr8_0 = constructor_output_xmm(ctx, expr7_0)?; 10389 return Some(expr8_0); 10390 } 10391 &Opcode::Vselect => { 10392 let (pattern7_0, pattern7_1, pattern7_2) = 10393 C::unpack_value_array_3(ctx, pattern5_1); 10394 // Rule at src/isa/x64/lower.isle line 1293. 10395 let expr0_0 = constructor_put_in_xmm_mem(ctx, pattern7_0)?; 10396 let expr1_0 = constructor_put_in_xmm_mem(ctx, pattern7_1)?; 10397 let expr2_0 = constructor_put_in_xmm(ctx, pattern7_2)?; 10398 let expr3_0 = constructor_x64_blend( 10399 ctx, pattern2_0, &expr0_0, &expr1_0, expr2_0, 10400 )?; 10401 let expr4_0 = constructor_output_xmm(ctx, expr3_0)?; 10402 return Some(expr4_0); 10403 } 10404 _ => {} 10405 } 10406 } 10407 &InstructionData::Unary { 10408 opcode: ref pattern5_0, 10409 arg: pattern5_1, 10410 } => { 10411 if let &Opcode::Bnot = pattern5_0 { 10412 // Rule at src/isa/x64/lower.isle line 1274. 10413 let expr0_0 = constructor_put_in_xmm(ctx, pattern5_1)?; 10414 let expr1_0 = constructor_vector_all_ones(ctx, pattern2_0)?; 10415 let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 10416 let expr3_0 = constructor_sse_xor(ctx, pattern2_0, expr0_0, &expr2_0)?; 10417 let expr4_0 = constructor_output_xmm(ctx, expr3_0)?; 10418 return Some(expr4_0); 10419 } 10420 } 10421 _ => {} 10422 } 10423 } 10424 if let Some(pattern3_0) = C::fits_in_32(ctx, pattern2_0) { 10425 let pattern4_0 = C::inst_data(ctx, pattern0_0); 10426 if let &InstructionData::Unary { 10427 opcode: ref pattern5_0, 10428 arg: pattern5_1, 10429 } = &pattern4_0 10430 { 10431 if let &Opcode::Uextend = pattern5_0 { 10432 let pattern7_0 = C::value_type(ctx, pattern5_1); 10433 if let Some(pattern8_0) = C::fits_in_32(ctx, pattern7_0) { 10434 // Rule at src/isa/x64/lower.isle line 2130. 10435 let expr0_0: Type = I32; 10436 let expr1_0 = ExtendKind::Zero; 10437 let expr2_0 = 10438 constructor_extend_to_gpr(ctx, pattern5_1, expr0_0, &expr1_0)?; 10439 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 10440 return Some(expr3_0); 10441 } 10442 } 10443 } 10444 if let Some(pattern4_0) = C::is_gpr_type(ctx, pattern2_0) { 10445 let pattern5_0 = C::inst_data(ctx, pattern0_0); 10446 if let &InstructionData::Load { 10447 opcode: ref pattern6_0, 10448 arg: pattern6_1, 10449 flags: pattern6_2, 10450 offset: pattern6_3, 10451 } = &pattern5_0 10452 { 10453 if let &Opcode::Load = pattern6_0 { 10454 // Rule at src/isa/x64/lower.isle line 2520. 10455 let expr0_0 = C::ty_bits_u16(ctx, pattern3_0); 10456 let expr1_0: u16 = 64; 10457 let expr2_0 = C::ext_mode(ctx, expr0_0, expr1_0); 10458 let expr3_0 = 10459 constructor_to_amode(ctx, pattern6_2, pattern6_1, pattern6_3)?; 10460 let expr4_0 = constructor_amode_to_gpr_mem(ctx, &expr3_0)?; 10461 let expr5_0 = constructor_x64_movzx(ctx, &expr2_0, &expr4_0)?; 10462 let expr6_0 = constructor_output_gpr(ctx, expr5_0)?; 10463 return Some(expr6_0); 10464 } 10465 } 10466 } 10467 } 10468 if let Some(pattern3_0) = C::fits_in_64(ctx, pattern2_0) { 10469 let pattern4_0 = C::inst_data(ctx, pattern0_0); 10470 match &pattern4_0 { 10471 &InstructionData::UnaryImm { 10472 opcode: ref pattern5_0, 10473 imm: pattern5_1, 10474 } => { 10475 if let &Opcode::Iconst = pattern5_0 { 10476 let pattern7_0 = C::u64_from_imm64(ctx, pattern5_1); 10477 // Rule at src/isa/x64/lower.isle line 10. 10478 let expr0_0 = constructor_imm(ctx, pattern3_0, pattern7_0)?; 10479 let expr1_0 = constructor_output_reg(ctx, expr0_0)?; 10480 return Some(expr1_0); 10481 } 10482 } 10483 &InstructionData::UnaryBool { 10484 opcode: ref pattern5_0, 10485 imm: pattern5_1, 10486 } => { 10487 if let &Opcode::Bconst = pattern5_0 { 10488 if pattern5_1 == true { 10489 // Rule at src/isa/x64/lower.isle line 28. 10490 let expr0_0: u64 = 1; 10491 let expr1_0 = constructor_imm(ctx, pattern3_0, expr0_0)?; 10492 let expr2_0 = constructor_output_reg(ctx, expr1_0)?; 10493 return Some(expr2_0); 10494 } 10495 if pattern5_1 == false { 10496 // Rule at src/isa/x64/lower.isle line 24. 10497 let expr0_0: u64 = 0; 10498 let expr1_0 = constructor_imm(ctx, pattern3_0, expr0_0)?; 10499 let expr2_0 = constructor_output_reg(ctx, expr1_0)?; 10500 return Some(expr2_0); 10501 } 10502 } 10503 } 10504 &InstructionData::Binary { 10505 opcode: ref pattern5_0, 10506 args: ref pattern5_1, 10507 } => { 10508 match pattern5_0 { 10509 &Opcode::Imin => { 10510 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 10511 // Rule at src/isa/x64/lower.isle line 1386. 10512 let expr0_0 = CC::L; 10513 let expr1_0 = constructor_cmp_and_choose( 10514 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1, 10515 )?; 10516 let expr2_0 = C::output(ctx, expr1_0); 10517 return Some(expr2_0); 10518 } 10519 &Opcode::Umin => { 10520 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 10521 // Rule at src/isa/x64/lower.isle line 1380. 10522 let expr0_0 = CC::B; 10523 let expr1_0 = constructor_cmp_and_choose( 10524 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1, 10525 )?; 10526 let expr2_0 = C::output(ctx, expr1_0); 10527 return Some(expr2_0); 10528 } 10529 &Opcode::Imax => { 10530 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 10531 // Rule at src/isa/x64/lower.isle line 1389. 10532 let expr0_0 = CC::NL; 10533 let expr1_0 = constructor_cmp_and_choose( 10534 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1, 10535 )?; 10536 let expr2_0 = C::output(ctx, expr1_0); 10537 return Some(expr2_0); 10538 } 10539 &Opcode::Umax => { 10540 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 10541 // Rule at src/isa/x64/lower.isle line 1383. 10542 let expr0_0 = CC::NB; 10543 let expr1_0 = constructor_cmp_and_choose( 10544 ctx, pattern3_0, &expr0_0, pattern7_0, pattern7_1, 10545 )?; 10546 let expr2_0 = C::output(ctx, expr1_0); 10547 return Some(expr2_0); 10548 } 10549 &Opcode::Iadd => { 10550 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 10551 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) { 10552 // Rule at src/isa/x64/lower.isle line 74. 10553 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 10554 let expr1_0 = 10555 constructor_x64_add(ctx, pattern3_0, expr0_0, &pattern8_0)?; 10556 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; 10557 return Some(expr2_0); 10558 } 10559 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) { 10560 // Rule at src/isa/x64/lower.isle line 86. 10561 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 10562 let expr1_0 = 10563 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 10564 let expr2_0 = 10565 constructor_x64_add(ctx, pattern3_0, expr0_0, &expr1_0)?; 10566 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 10567 return Some(expr3_0); 10568 } 10569 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) { 10570 // Rule at src/isa/x64/lower.isle line 70. 10571 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10572 let expr1_0 = 10573 constructor_x64_add(ctx, pattern3_0, expr0_0, &pattern8_0)?; 10574 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; 10575 return Some(expr2_0); 10576 } 10577 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) { 10578 // Rule at src/isa/x64/lower.isle line 80. 10579 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10580 let expr1_0 = 10581 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 10582 let expr2_0 = 10583 constructor_x64_add(ctx, pattern3_0, expr0_0, &expr1_0)?; 10584 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 10585 return Some(expr3_0); 10586 } 10587 // Rule at src/isa/x64/lower.isle line 64. 10588 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10589 let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?; 10590 let expr2_0 = constructor_x64_add(ctx, pattern3_0, expr0_0, &expr1_0)?; 10591 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 10592 return Some(expr3_0); 10593 } 10594 &Opcode::Isub => { 10595 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 10596 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) { 10597 // Rule at src/isa/x64/lower.isle line 228. 10598 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10599 let expr1_0 = 10600 constructor_x64_sub(ctx, pattern3_0, expr0_0, &pattern8_0)?; 10601 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; 10602 return Some(expr2_0); 10603 } 10604 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) { 10605 // Rule at src/isa/x64/lower.isle line 233. 10606 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10607 let expr1_0 = 10608 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 10609 let expr2_0 = 10610 constructor_x64_sub(ctx, pattern3_0, expr0_0, &expr1_0)?; 10611 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 10612 return Some(expr3_0); 10613 } 10614 // Rule at src/isa/x64/lower.isle line 223. 10615 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10616 let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?; 10617 let expr2_0 = constructor_x64_sub(ctx, pattern3_0, expr0_0, &expr1_0)?; 10618 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 10619 return Some(expr3_0); 10620 } 10621 &Opcode::Imul => { 10622 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 10623 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) { 10624 // Rule at src/isa/x64/lower.isle line 925. 10625 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 10626 let expr1_0 = 10627 constructor_x64_mul(ctx, pattern3_0, expr0_0, &pattern8_0)?; 10628 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; 10629 return Some(expr2_0); 10630 } 10631 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) { 10632 // Rule at src/isa/x64/lower.isle line 937. 10633 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 10634 let expr1_0 = 10635 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 10636 let expr2_0 = 10637 constructor_x64_mul(ctx, pattern3_0, expr0_0, &expr1_0)?; 10638 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 10639 return Some(expr3_0); 10640 } 10641 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) { 10642 // Rule at src/isa/x64/lower.isle line 921. 10643 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10644 let expr1_0 = 10645 constructor_x64_mul(ctx, pattern3_0, expr0_0, &pattern8_0)?; 10646 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; 10647 return Some(expr2_0); 10648 } 10649 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) { 10650 // Rule at src/isa/x64/lower.isle line 931. 10651 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10652 let expr1_0 = 10653 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 10654 let expr2_0 = 10655 constructor_x64_mul(ctx, pattern3_0, expr0_0, &expr1_0)?; 10656 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 10657 return Some(expr3_0); 10658 } 10659 // Rule at src/isa/x64/lower.isle line 916. 10660 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10661 let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?; 10662 let expr2_0 = constructor_x64_mul(ctx, pattern3_0, expr0_0, &expr1_0)?; 10663 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 10664 return Some(expr3_0); 10665 } 10666 &Opcode::IaddIfcout => { 10667 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 10668 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) { 10669 // Rule at src/isa/x64/lower.isle line 171. 10670 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 10671 let expr1_0 = 10672 constructor_x64_add(ctx, pattern3_0, expr0_0, &pattern8_0)?; 10673 let expr2_0 = C::gpr_to_reg(ctx, expr1_0); 10674 let expr3_0 = constructor_output_ifcout(ctx, expr2_0)?; 10675 return Some(expr3_0); 10676 } 10677 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) { 10678 // Rule at src/isa/x64/lower.isle line 181. 10679 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 10680 let expr1_0 = 10681 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 10682 let expr2_0 = 10683 constructor_x64_add(ctx, pattern3_0, expr0_0, &expr1_0)?; 10684 let expr3_0 = C::gpr_to_reg(ctx, expr2_0); 10685 let expr4_0 = constructor_output_ifcout(ctx, expr3_0)?; 10686 return Some(expr4_0); 10687 } 10688 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) { 10689 // Rule at src/isa/x64/lower.isle line 167. 10690 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10691 let expr1_0 = 10692 constructor_x64_add(ctx, pattern3_0, expr0_0, &pattern8_0)?; 10693 let expr2_0 = C::gpr_to_reg(ctx, expr1_0); 10694 let expr3_0 = constructor_output_ifcout(ctx, expr2_0)?; 10695 return Some(expr3_0); 10696 } 10697 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) { 10698 // Rule at src/isa/x64/lower.isle line 177. 10699 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10700 let expr1_0 = 10701 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 10702 let expr2_0 = 10703 constructor_x64_add(ctx, pattern3_0, expr0_0, &expr1_0)?; 10704 let expr3_0 = C::gpr_to_reg(ctx, expr2_0); 10705 let expr4_0 = constructor_output_ifcout(ctx, expr3_0)?; 10706 return Some(expr4_0); 10707 } 10708 // Rule at src/isa/x64/lower.isle line 161. 10709 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10710 let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?; 10711 let expr2_0 = constructor_x64_add(ctx, pattern3_0, expr0_0, &expr1_0)?; 10712 let expr3_0 = C::gpr_to_reg(ctx, expr2_0); 10713 let expr4_0 = constructor_output_ifcout(ctx, expr3_0)?; 10714 return Some(expr4_0); 10715 } 10716 &Opcode::Band => { 10717 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 10718 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) { 10719 // Rule at src/isa/x64/lower.isle line 317. 10720 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 10721 let expr1_0 = 10722 constructor_x64_and(ctx, pattern3_0, expr0_0, &pattern8_0)?; 10723 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; 10724 return Some(expr2_0); 10725 } 10726 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) { 10727 // Rule at src/isa/x64/lower.isle line 305. 10728 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 10729 let expr1_0 = 10730 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 10731 let expr2_0 = 10732 constructor_x64_and(ctx, pattern3_0, expr0_0, &expr1_0)?; 10733 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 10734 return Some(expr3_0); 10735 } 10736 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) { 10737 // Rule at src/isa/x64/lower.isle line 313. 10738 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10739 let expr1_0 = 10740 constructor_x64_and(ctx, pattern3_0, expr0_0, &pattern8_0)?; 10741 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; 10742 return Some(expr2_0); 10743 } 10744 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) { 10745 // Rule at src/isa/x64/lower.isle line 300. 10746 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10747 let expr1_0 = 10748 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 10749 let expr2_0 = 10750 constructor_x64_and(ctx, pattern3_0, expr0_0, &expr1_0)?; 10751 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 10752 return Some(expr3_0); 10753 } 10754 // Rule at src/isa/x64/lower.isle line 295. 10755 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10756 let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?; 10757 let expr2_0 = constructor_x64_and(ctx, pattern3_0, expr0_0, &expr1_0)?; 10758 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 10759 return Some(expr3_0); 10760 } 10761 &Opcode::Bor => { 10762 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 10763 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) { 10764 // Rule at src/isa/x64/lower.isle line 381. 10765 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 10766 let expr1_0 = 10767 constructor_x64_or(ctx, pattern3_0, expr0_0, &pattern8_0)?; 10768 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; 10769 return Some(expr2_0); 10770 } 10771 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) { 10772 // Rule at src/isa/x64/lower.isle line 370. 10773 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 10774 let expr1_0 = 10775 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 10776 let expr2_0 = 10777 constructor_x64_or(ctx, pattern3_0, expr0_0, &expr1_0)?; 10778 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 10779 return Some(expr3_0); 10780 } 10781 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) { 10782 // Rule at src/isa/x64/lower.isle line 377. 10783 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10784 let expr1_0 = 10785 constructor_x64_or(ctx, pattern3_0, expr0_0, &pattern8_0)?; 10786 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; 10787 return Some(expr2_0); 10788 } 10789 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) { 10790 // Rule at src/isa/x64/lower.isle line 365. 10791 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10792 let expr1_0 = 10793 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 10794 let expr2_0 = 10795 constructor_x64_or(ctx, pattern3_0, expr0_0, &expr1_0)?; 10796 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 10797 return Some(expr3_0); 10798 } 10799 // Rule at src/isa/x64/lower.isle line 360. 10800 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10801 let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?; 10802 let expr2_0 = constructor_x64_or(ctx, pattern3_0, expr0_0, &expr1_0)?; 10803 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 10804 return Some(expr3_0); 10805 } 10806 &Opcode::Bxor => { 10807 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 10808 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_0) { 10809 // Rule at src/isa/x64/lower.isle line 447. 10810 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 10811 let expr1_0 = 10812 constructor_x64_xor(ctx, pattern3_0, expr0_0, &pattern8_0)?; 10813 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; 10814 return Some(expr2_0); 10815 } 10816 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_0) { 10817 // Rule at src/isa/x64/lower.isle line 436. 10818 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_1)?; 10819 let expr1_0 = 10820 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 10821 let expr2_0 = 10822 constructor_x64_xor(ctx, pattern3_0, expr0_0, &expr1_0)?; 10823 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 10824 return Some(expr3_0); 10825 } 10826 if let Some(pattern8_0) = C::simm32_from_value(ctx, pattern7_1) { 10827 // Rule at src/isa/x64/lower.isle line 443. 10828 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10829 let expr1_0 = 10830 constructor_x64_xor(ctx, pattern3_0, expr0_0, &pattern8_0)?; 10831 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; 10832 return Some(expr2_0); 10833 } 10834 if let Some(pattern8_0) = C::sinkable_load(ctx, pattern7_1) { 10835 // Rule at src/isa/x64/lower.isle line 431. 10836 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10837 let expr1_0 = 10838 constructor_sink_load_to_gpr_mem_imm(ctx, &pattern8_0)?; 10839 let expr2_0 = 10840 constructor_x64_xor(ctx, pattern3_0, expr0_0, &expr1_0)?; 10841 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 10842 return Some(expr3_0); 10843 } 10844 // Rule at src/isa/x64/lower.isle line 426. 10845 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10846 let expr1_0 = constructor_put_in_gpr_mem_imm(ctx, pattern7_1)?; 10847 let expr2_0 = constructor_x64_xor(ctx, pattern3_0, expr0_0, &expr1_0)?; 10848 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 10849 return Some(expr3_0); 10850 } 10851 &Opcode::Ishl => { 10852 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 10853 // Rule at src/isa/x64/lower.isle line 483. 10854 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10855 let expr1_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0); 10856 let expr2_0 = constructor_x64_shl(ctx, pattern3_0, expr0_0, &expr1_0)?; 10857 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 10858 return Some(expr3_0); 10859 } 10860 &Opcode::Ushr => { 10861 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 10862 // Rule at src/isa/x64/lower.isle line 589. 10863 let expr0_0 = ExtendKind::Zero; 10864 let expr1_0 = 10865 constructor_extend_to_gpr(ctx, pattern7_0, pattern3_0, &expr0_0)?; 10866 let expr2_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0); 10867 let expr3_0 = constructor_x64_shr(ctx, pattern3_0, expr1_0, &expr2_0)?; 10868 let expr4_0 = constructor_output_gpr(ctx, expr3_0)?; 10869 return Some(expr4_0); 10870 } 10871 &Opcode::Sshr => { 10872 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 10873 // Rule at src/isa/x64/lower.isle line 691. 10874 let expr0_0 = ExtendKind::Sign; 10875 let expr1_0 = 10876 constructor_extend_to_gpr(ctx, pattern7_0, pattern3_0, &expr0_0)?; 10877 let expr2_0 = C::put_masked_in_imm8_gpr(ctx, pattern7_1, pattern3_0); 10878 let expr3_0 = constructor_x64_sar(ctx, pattern3_0, expr1_0, &expr2_0)?; 10879 let expr4_0 = constructor_output_gpr(ctx, expr3_0)?; 10880 return Some(expr4_0); 10881 } 10882 _ => {} 10883 } 10884 } 10885 &InstructionData::Unary { 10886 opcode: ref pattern5_0, 10887 arg: pattern5_1, 10888 } => { 10889 match pattern5_0 { 10890 &Opcode::Ineg => { 10891 // Rule at src/isa/x64/lower.isle line 884. 10892 let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; 10893 let expr1_0 = constructor_x64_neg(ctx, pattern3_0, expr0_0)?; 10894 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; 10895 return Some(expr2_0); 10896 } 10897 &Opcode::Bnot => { 10898 // Rule at src/isa/x64/lower.isle line 1253. 10899 let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; 10900 let expr1_0 = constructor_x64_not(ctx, pattern3_0, expr0_0)?; 10901 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; 10902 return Some(expr2_0); 10903 } 10904 &Opcode::Breduce => { 10905 // Rule at src/isa/x64/lower.isle line 2235. 10906 let expr0_0 = C::put_in_regs(ctx, pattern5_1); 10907 let expr1_0: usize = 0; 10908 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 10909 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 10910 return Some(expr3_0); 10911 } 10912 &Opcode::Bint => { 10913 // Rule at src/isa/x64/lower.isle line 2243. 10914 let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; 10915 let expr1_0: u32 = 1; 10916 let expr2_0 = RegMemImm::Imm { simm32: expr1_0 }; 10917 let expr3_0 = C::gpr_mem_imm_new(ctx, &expr2_0); 10918 let expr4_0 = constructor_x64_and(ctx, pattern3_0, expr0_0, &expr3_0)?; 10919 let expr5_0 = constructor_output_gpr(ctx, expr4_0)?; 10920 return Some(expr5_0); 10921 } 10922 &Opcode::Ireduce => { 10923 // Rule at src/isa/x64/lower.isle line 2227. 10924 let expr0_0 = C::put_in_regs(ctx, pattern5_1); 10925 let expr1_0: usize = 0; 10926 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 10927 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 10928 return Some(expr3_0); 10929 } 10930 _ => {} 10931 } 10932 } 10933 &InstructionData::BinaryImm64 { 10934 opcode: ref pattern5_0, 10935 arg: pattern5_1, 10936 imm: pattern5_2, 10937 } => { 10938 if let &Opcode::IaddImm = pattern5_0 { 10939 let pattern7_0 = C::u64_from_imm64(ctx, pattern5_2); 10940 // Rule at src/isa/x64/lower.isle line 196. 10941 let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; 10942 let expr1_0 = constructor_imm(ctx, pattern3_0, pattern7_0)?; 10943 let expr2_0 = constructor_reg_to_gpr_mem_imm(ctx, expr1_0)?; 10944 let expr3_0 = constructor_x64_add(ctx, pattern3_0, expr0_0, &expr2_0)?; 10945 let expr4_0 = constructor_output_gpr(ctx, expr3_0)?; 10946 return Some(expr4_0); 10947 } 10948 } 10949 _ => {} 10950 } 10951 } 10952 if let Some(pattern3_0) = C::ty_32_or_64(ctx, pattern2_0) { 10953 let pattern4_0 = C::inst_data(ctx, pattern0_0); 10954 match &pattern4_0 { 10955 &InstructionData::Binary { 10956 opcode: ref pattern5_0, 10957 args: ref pattern5_1, 10958 } => { 10959 match pattern5_0 { 10960 &Opcode::Rotl => { 10961 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 10962 if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { 10963 let pattern9_0 = C::inst_data(ctx, pattern8_0); 10964 if let &InstructionData::UnaryImm { 10965 opcode: ref pattern10_0, 10966 imm: pattern10_1, 10967 } = &pattern9_0 10968 { 10969 if let &Opcode::Iconst = pattern10_0 { 10970 let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); 10971 // Rule at src/isa/x64/lower.isle line 823. 10972 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10973 let expr1_0 = C::const_to_type_masked_imm8( 10974 ctx, 10975 pattern12_0, 10976 pattern3_0, 10977 ); 10978 let expr2_0 = constructor_x64_rotl( 10979 ctx, pattern3_0, expr0_0, &expr1_0, 10980 )?; 10981 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 10982 return Some(expr3_0); 10983 } 10984 } 10985 } 10986 // Rule at src/isa/x64/lower.isle line 817. 10987 let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?; 10988 let expr1_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 10989 let expr2_0 = C::gpr_to_imm8_gpr(ctx, expr0_0); 10990 let expr3_0 = constructor_x64_rotl(ctx, pattern3_0, expr1_0, &expr2_0)?; 10991 let expr4_0 = constructor_output_gpr(ctx, expr3_0)?; 10992 return Some(expr4_0); 10993 } 10994 &Opcode::Rotr => { 10995 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 10996 if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { 10997 let pattern9_0 = C::inst_data(ctx, pattern8_0); 10998 if let &InstructionData::UnaryImm { 10999 opcode: ref pattern10_0, 11000 imm: pattern10_1, 11001 } = &pattern9_0 11002 { 11003 if let &Opcode::Iconst = pattern10_0 { 11004 let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); 11005 // Rule at src/isa/x64/lower.isle line 863. 11006 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 11007 let expr1_0 = C::const_to_type_masked_imm8( 11008 ctx, 11009 pattern12_0, 11010 pattern3_0, 11011 ); 11012 let expr2_0 = constructor_x64_rotr( 11013 ctx, pattern3_0, expr0_0, &expr1_0, 11014 )?; 11015 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 11016 return Some(expr3_0); 11017 } 11018 } 11019 } 11020 // Rule at src/isa/x64/lower.isle line 857. 11021 let expr0_0 = constructor_lo_gpr(ctx, pattern7_1)?; 11022 let expr1_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 11023 let expr2_0 = C::gpr_to_imm8_gpr(ctx, expr0_0); 11024 let expr3_0 = constructor_x64_rotr(ctx, pattern3_0, expr1_0, &expr2_0)?; 11025 let expr4_0 = constructor_output_gpr(ctx, expr3_0)?; 11026 return Some(expr4_0); 11027 } 11028 _ => {} 11029 } 11030 } 11031 &InstructionData::Unary { 11032 opcode: ref pattern5_0, 11033 arg: pattern5_1, 11034 } => { 11035 match pattern5_0 { 11036 &Opcode::Clz => { 11037 // Rule at src/isa/x64/lower.isle line 1791. 11038 let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; 11039 let expr1_0 = constructor_do_clz(ctx, pattern3_0, pattern3_0, expr0_0)?; 11040 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; 11041 return Some(expr2_0); 11042 } 11043 &Opcode::Ctz => { 11044 // Rule at src/isa/x64/lower.isle line 1833. 11045 let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; 11046 let expr1_0 = constructor_do_ctz(ctx, pattern3_0, pattern3_0, expr0_0)?; 11047 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; 11048 return Some(expr2_0); 11049 } 11050 &Opcode::Popcnt => { 11051 // Rule at src/isa/x64/lower.isle line 1885. 11052 let expr0_0 = constructor_put_in_gpr(ctx, pattern5_1)?; 11053 let expr1_0 = constructor_do_popcnt(ctx, pattern3_0, expr0_0)?; 11054 let expr2_0 = constructor_output_gpr(ctx, expr1_0)?; 11055 return Some(expr2_0); 11056 } 11057 _ => {} 11058 } 11059 } 11060 _ => {} 11061 } 11062 } 11063 if let Some(pattern3_0) = C::ty_8_or_16(ctx, pattern2_0) { 11064 let pattern4_0 = C::inst_data(ctx, pattern0_0); 11065 match &pattern4_0 { 11066 &InstructionData::Binary { 11067 opcode: ref pattern5_0, 11068 args: ref pattern5_1, 11069 } => { 11070 match pattern5_0 { 11071 &Opcode::Rotl => { 11072 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 11073 if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { 11074 let pattern9_0 = C::inst_data(ctx, pattern8_0); 11075 if let &InstructionData::UnaryImm { 11076 opcode: ref pattern10_0, 11077 imm: pattern10_1, 11078 } = &pattern9_0 11079 { 11080 if let &Opcode::Iconst = pattern10_0 { 11081 let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); 11082 // Rule at src/isa/x64/lower.isle line 809. 11083 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 11084 let expr1_0 = C::const_to_type_masked_imm8( 11085 ctx, 11086 pattern12_0, 11087 pattern3_0, 11088 ); 11089 let expr2_0 = constructor_x64_rotl( 11090 ctx, pattern3_0, expr0_0, &expr1_0, 11091 )?; 11092 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 11093 return Some(expr3_0); 11094 } 11095 } 11096 } 11097 // Rule at src/isa/x64/lower.isle line 805. 11098 let expr0_0: Type = I32; 11099 let expr1_0 = ExtendKind::Zero; 11100 let expr2_0 = 11101 constructor_extend_to_gpr(ctx, pattern7_1, expr0_0, &expr1_0)?; 11102 let expr3_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 11103 let expr4_0 = C::gpr_to_imm8_gpr(ctx, expr2_0); 11104 let expr5_0 = constructor_x64_rotl(ctx, pattern3_0, expr3_0, &expr4_0)?; 11105 let expr6_0 = constructor_output_gpr(ctx, expr5_0)?; 11106 return Some(expr6_0); 11107 } 11108 &Opcode::Rotr => { 11109 let (pattern7_0, pattern7_1) = C::unpack_value_array_2(ctx, pattern5_1); 11110 if let Some(pattern8_0) = C::def_inst(ctx, pattern7_1) { 11111 let pattern9_0 = C::inst_data(ctx, pattern8_0); 11112 if let &InstructionData::UnaryImm { 11113 opcode: ref pattern10_0, 11114 imm: pattern10_1, 11115 } = &pattern9_0 11116 { 11117 if let &Opcode::Iconst = pattern10_0 { 11118 let pattern12_0 = C::u64_from_imm64(ctx, pattern10_1); 11119 // Rule at src/isa/x64/lower.isle line 849. 11120 let expr0_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 11121 let expr1_0 = C::const_to_type_masked_imm8( 11122 ctx, 11123 pattern12_0, 11124 pattern3_0, 11125 ); 11126 let expr2_0 = constructor_x64_rotr( 11127 ctx, pattern3_0, expr0_0, &expr1_0, 11128 )?; 11129 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 11130 return Some(expr3_0); 11131 } 11132 } 11133 } 11134 // Rule at src/isa/x64/lower.isle line 845. 11135 let expr0_0: Type = I32; 11136 let expr1_0 = ExtendKind::Zero; 11137 let expr2_0 = 11138 constructor_extend_to_gpr(ctx, pattern7_1, expr0_0, &expr1_0)?; 11139 let expr3_0 = constructor_put_in_gpr(ctx, pattern7_0)?; 11140 let expr4_0 = C::gpr_to_imm8_gpr(ctx, expr2_0); 11141 let expr5_0 = constructor_x64_rotr(ctx, pattern3_0, expr3_0, &expr4_0)?; 11142 let expr6_0 = constructor_output_gpr(ctx, expr5_0)?; 11143 return Some(expr6_0); 11144 } 11145 _ => {} 11146 } 11147 } 11148 &InstructionData::Unary { 11149 opcode: ref pattern5_0, 11150 arg: pattern5_1, 11151 } => { 11152 match pattern5_0 { 11153 &Opcode::Clz => { 11154 // Rule at src/isa/x64/lower.isle line 1796. 11155 let expr0_0: Type = I32; 11156 let expr1_0: Type = I32; 11157 let expr2_0 = ExtendKind::Zero; 11158 let expr3_0 = 11159 constructor_extend_to_gpr(ctx, pattern5_1, expr1_0, &expr2_0)?; 11160 let expr4_0 = constructor_do_clz(ctx, expr0_0, pattern3_0, expr3_0)?; 11161 let expr5_0 = constructor_output_gpr(ctx, expr4_0)?; 11162 return Some(expr5_0); 11163 } 11164 &Opcode::Ctz => { 11165 // Rule at src/isa/x64/lower.isle line 1838. 11166 let expr0_0: Type = I32; 11167 let expr1_0: Type = I32; 11168 let expr2_0 = ExtendKind::Zero; 11169 let expr3_0 = 11170 constructor_extend_to_gpr(ctx, pattern5_1, expr1_0, &expr2_0)?; 11171 let expr4_0 = constructor_do_ctz(ctx, expr0_0, pattern3_0, expr3_0)?; 11172 let expr5_0 = constructor_output_gpr(ctx, expr4_0)?; 11173 return Some(expr5_0); 11174 } 11175 &Opcode::Popcnt => { 11176 // Rule at src/isa/x64/lower.isle line 1890. 11177 let expr0_0: Type = I32; 11178 let expr1_0: Type = I32; 11179 let expr2_0 = ExtendKind::Zero; 11180 let expr3_0 = 11181 constructor_extend_to_gpr(ctx, pattern5_1, expr1_0, &expr2_0)?; 11182 let expr4_0 = constructor_do_popcnt(ctx, expr0_0, expr3_0)?; 11183 let expr5_0 = constructor_output_gpr(ctx, expr4_0)?; 11184 return Some(expr5_0); 11185 } 11186 _ => {} 11187 } 11188 } 11189 _ => {} 11190 } 11191 } 11192 if let Some(pattern3_0) = C::ty_int_bool_ref_64(ctx, pattern2_0) { 11193 let pattern4_0 = C::inst_data(ctx, pattern0_0); 11194 if let &InstructionData::Load { 11195 opcode: ref pattern5_0, 11196 arg: pattern5_1, 11197 flags: pattern5_2, 11198 offset: pattern5_3, 11199 } = &pattern4_0 11200 { 11201 if let &Opcode::Load = pattern5_0 { 11202 // Rule at src/isa/x64/lower.isle line 2524. 11203 let expr0_0 = constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; 11204 let expr1_0 = constructor_x64_mov(ctx, &expr0_0)?; 11205 let expr2_0 = constructor_output_reg(ctx, expr1_0)?; 11206 return Some(expr2_0); 11207 } 11208 } 11209 } 11210 if let Some(pattern3_0) = C::ty_int_bool_128(ctx, pattern2_0) { 11211 let pattern4_0 = C::inst_data(ctx, pattern0_0); 11212 if let &InstructionData::Load { 11213 opcode: ref pattern5_0, 11214 arg: pattern5_1, 11215 flags: pattern5_2, 11216 offset: pattern5_3, 11217 } = &pattern4_0 11218 { 11219 if let &Opcode::Load = pattern5_0 { 11220 // Rule at src/isa/x64/lower.isle line 2558. 11221 let expr0_0 = constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; 11222 let expr1_0: u32 = 8; 11223 let expr2_0 = C::amode_offset(ctx, &expr0_0, expr1_0); 11224 let expr3_0 = constructor_x64_mov(ctx, &expr0_0)?; 11225 let expr4_0 = constructor_x64_mov(ctx, &expr2_0)?; 11226 let expr5_0 = C::value_regs(ctx, expr3_0, expr4_0); 11227 let expr6_0 = C::output(ctx, expr5_0); 11228 return Some(expr6_0); 11229 } 11230 } 11231 } 11232 if let Some(pattern3_0) = C::ty_vec128(ctx, pattern2_0) { 11233 let pattern4_0 = C::inst_data(ctx, pattern0_0); 11234 if let &InstructionData::Load { 11235 opcode: ref pattern5_0, 11236 arg: pattern5_1, 11237 flags: pattern5_2, 11238 offset: pattern5_3, 11239 } = &pattern4_0 11240 { 11241 if let &Opcode::Load = pattern5_0 { 11242 // Rule at src/isa/x64/lower.isle line 2554. 11243 let expr0_0 = constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; 11244 let expr1_0 = constructor_amode_to_xmm_mem(ctx, &expr0_0)?; 11245 let expr2_0 = constructor_x64_movdqu(ctx, &expr1_0)?; 11246 let expr3_0 = constructor_output_xmm(ctx, expr2_0)?; 11247 return Some(expr3_0); 11248 } 11249 } 11250 } 11251 if let Some(pattern3_0) = C::is_gpr_type(ctx, pattern2_0) { 11252 let pattern4_0 = C::inst_data(ctx, pattern0_0); 11253 if let &InstructionData::Load { 11254 opcode: ref pattern5_0, 11255 arg: pattern5_1, 11256 flags: pattern5_2, 11257 offset: pattern5_3, 11258 } = &pattern4_0 11259 { 11260 match pattern5_0 { 11261 &Opcode::Uload8 => { 11262 // Rule at src/isa/x64/lower.isle line 2529. 11263 let expr0_0 = ExtMode::BQ; 11264 let expr1_0 = 11265 constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; 11266 let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0)?; 11267 let expr3_0 = constructor_x64_movzx(ctx, &expr0_0, &expr2_0)?; 11268 let expr4_0 = constructor_output_gpr(ctx, expr3_0)?; 11269 return Some(expr4_0); 11270 } 11271 &Opcode::Sload8 => { 11272 // Rule at src/isa/x64/lower.isle line 2531. 11273 let expr0_0 = ExtMode::BQ; 11274 let expr1_0 = 11275 constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; 11276 let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0)?; 11277 let expr3_0 = constructor_x64_movsx(ctx, &expr0_0, &expr2_0)?; 11278 let expr4_0 = constructor_output_gpr(ctx, expr3_0)?; 11279 return Some(expr4_0); 11280 } 11281 &Opcode::Uload16 => { 11282 // Rule at src/isa/x64/lower.isle line 2533. 11283 let expr0_0 = ExtMode::WQ; 11284 let expr1_0 = 11285 constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; 11286 let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0)?; 11287 let expr3_0 = constructor_x64_movzx(ctx, &expr0_0, &expr2_0)?; 11288 let expr4_0 = constructor_output_gpr(ctx, expr3_0)?; 11289 return Some(expr4_0); 11290 } 11291 &Opcode::Sload16 => { 11292 // Rule at src/isa/x64/lower.isle line 2535. 11293 let expr0_0 = ExtMode::WQ; 11294 let expr1_0 = 11295 constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; 11296 let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0)?; 11297 let expr3_0 = constructor_x64_movsx(ctx, &expr0_0, &expr2_0)?; 11298 let expr4_0 = constructor_output_gpr(ctx, expr3_0)?; 11299 return Some(expr4_0); 11300 } 11301 &Opcode::Uload32 => { 11302 // Rule at src/isa/x64/lower.isle line 2537. 11303 let expr0_0 = ExtMode::LQ; 11304 let expr1_0 = 11305 constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; 11306 let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0)?; 11307 let expr3_0 = constructor_x64_movzx(ctx, &expr0_0, &expr2_0)?; 11308 let expr4_0 = constructor_output_gpr(ctx, expr3_0)?; 11309 return Some(expr4_0); 11310 } 11311 &Opcode::Sload32 => { 11312 // Rule at src/isa/x64/lower.isle line 2539. 11313 let expr0_0 = ExtMode::LQ; 11314 let expr1_0 = 11315 constructor_to_amode(ctx, pattern5_2, pattern5_1, pattern5_3)?; 11316 let expr2_0 = constructor_amode_to_gpr_mem(ctx, &expr1_0)?; 11317 let expr3_0 = constructor_x64_movsx(ctx, &expr0_0, &expr2_0)?; 11318 let expr4_0 = constructor_output_gpr(ctx, expr3_0)?; 11319 return Some(expr4_0); 11320 } 11321 _ => {} 11322 } 11323 } 11324 } 11325 } 11326 return None; 11327 } 11328 11329 // Generated as internal constructor for term output_ifcout. 11330 pub fn constructor_output_ifcout<C: Context>(ctx: &mut C, arg0: Reg) -> Option<InstOutput> { 11331 let pattern0_0 = arg0; 11332 // Rule at src/isa/x64/lower.isle line 157. 11333 let expr0_0 = C::value_reg(ctx, pattern0_0); 11334 let expr1_0 = C::value_regs_invalid(ctx); 11335 let expr2_0 = C::output_pair(ctx, expr0_0, expr1_0); 11336 return Some(expr2_0); 11337 } 11338 11339 // Generated as internal constructor for term sse_and. 11340 pub fn constructor_sse_and<C: Context>( 11341 ctx: &mut C, 11342 arg0: Type, 11343 arg1: Xmm, 11344 arg2: &XmmMem, 11345 ) -> Option<Xmm> { 11346 let pattern0_0 = arg0; 11347 if pattern0_0 == F32X4 { 11348 let pattern2_0 = arg1; 11349 let pattern3_0 = arg2; 11350 // Rule at src/isa/x64/lower.isle line 324. 11351 let expr0_0 = constructor_x64_andps(ctx, pattern2_0, pattern3_0)?; 11352 return Some(expr0_0); 11353 } 11354 if pattern0_0 == F64X2 { 11355 let pattern2_0 = arg1; 11356 let pattern3_0 = arg2; 11357 // Rule at src/isa/x64/lower.isle line 325. 11358 let expr0_0 = constructor_x64_andpd(ctx, pattern2_0, pattern3_0)?; 11359 return Some(expr0_0); 11360 } 11361 if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { 11362 let pattern2_0 = arg1; 11363 let pattern3_0 = arg2; 11364 // Rule at src/isa/x64/lower.isle line 326. 11365 let expr0_0 = constructor_x64_pand(ctx, pattern2_0, pattern3_0)?; 11366 return Some(expr0_0); 11367 } 11368 return None; 11369 } 11370 11371 // Generated as internal constructor for term sse_or. 11372 pub fn constructor_sse_or<C: Context>( 11373 ctx: &mut C, 11374 arg0: Type, 11375 arg1: Xmm, 11376 arg2: &XmmMem, 11377 ) -> Option<Xmm> { 11378 let pattern0_0 = arg0; 11379 if pattern0_0 == F32X4 { 11380 let pattern2_0 = arg1; 11381 let pattern3_0 = arg2; 11382 // Rule at src/isa/x64/lower.isle line 388. 11383 let expr0_0 = constructor_x64_orps(ctx, pattern2_0, pattern3_0)?; 11384 return Some(expr0_0); 11385 } 11386 if pattern0_0 == F64X2 { 11387 let pattern2_0 = arg1; 11388 let pattern3_0 = arg2; 11389 // Rule at src/isa/x64/lower.isle line 389. 11390 let expr0_0 = constructor_x64_orpd(ctx, pattern2_0, pattern3_0)?; 11391 return Some(expr0_0); 11392 } 11393 if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { 11394 let pattern2_0 = arg1; 11395 let pattern3_0 = arg2; 11396 // Rule at src/isa/x64/lower.isle line 390. 11397 let expr0_0 = constructor_x64_por(ctx, pattern2_0, pattern3_0)?; 11398 return Some(expr0_0); 11399 } 11400 return None; 11401 } 11402 11403 // Generated as internal constructor for term or_i128. 11404 pub fn constructor_or_i128<C: Context>( 11405 ctx: &mut C, 11406 arg0: ValueRegs, 11407 arg1: ValueRegs, 11408 ) -> Option<ValueRegs> { 11409 let pattern0_0 = arg0; 11410 let pattern1_0 = arg1; 11411 // Rule at src/isa/x64/lower.isle line 399. 11412 let expr0_0: usize = 0; 11413 let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?; 11414 let expr2_0: usize = 1; 11415 let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?; 11416 let expr4_0: usize = 0; 11417 let expr5_0 = constructor_value_regs_get_gpr(ctx, pattern1_0, expr4_0)?; 11418 let expr6_0: usize = 1; 11419 let expr7_0 = constructor_value_regs_get_gpr(ctx, pattern1_0, expr6_0)?; 11420 let expr8_0: Type = I64; 11421 let expr9_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0); 11422 let expr10_0 = constructor_x64_or(ctx, expr8_0, expr1_0, &expr9_0)?; 11423 let expr11_0: Type = I64; 11424 let expr12_0 = C::gpr_to_gpr_mem_imm(ctx, expr7_0); 11425 let expr13_0 = constructor_x64_or(ctx, expr11_0, expr3_0, &expr12_0)?; 11426 let expr14_0 = constructor_value_gprs(ctx, expr10_0, expr13_0)?; 11427 return Some(expr14_0); 11428 } 11429 11430 // Generated as internal constructor for term shl_i128. 11431 pub fn constructor_shl_i128<C: Context>( 11432 ctx: &mut C, 11433 arg0: ValueRegs, 11434 arg1: Gpr, 11435 ) -> Option<ValueRegs> { 11436 let pattern0_0 = arg0; 11437 let pattern1_0 = arg1; 11438 // Rule at src/isa/x64/lower.isle line 489. 11439 let expr0_0: usize = 0; 11440 let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?; 11441 let expr2_0: usize = 1; 11442 let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?; 11443 let expr4_0: Type = I64; 11444 let expr5_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0); 11445 let expr6_0 = constructor_x64_shl(ctx, expr4_0, expr1_0, &expr5_0)?; 11446 let expr7_0: Type = I64; 11447 let expr8_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0); 11448 let expr9_0 = constructor_x64_shl(ctx, expr7_0, expr3_0, &expr8_0)?; 11449 let expr10_0: Type = I64; 11450 let expr11_0: Type = I64; 11451 let expr12_0: Type = I64; 11452 let expr13_0: u64 = 64; 11453 let expr14_0 = constructor_imm(ctx, expr12_0, expr13_0)?; 11454 let expr15_0 = C::gpr_new(ctx, expr14_0); 11455 let expr16_0 = C::gpr_to_gpr_mem_imm(ctx, pattern1_0); 11456 let expr17_0 = constructor_x64_sub(ctx, expr11_0, expr15_0, &expr16_0)?; 11457 let expr18_0 = C::gpr_to_imm8_gpr(ctx, expr17_0); 11458 let expr19_0 = constructor_x64_shr(ctx, expr10_0, expr1_0, &expr18_0)?; 11459 let expr20_0: Type = I64; 11460 let expr21_0: u64 = 0; 11461 let expr22_0 = constructor_imm(ctx, expr20_0, expr21_0)?; 11462 let expr23_0 = C::gpr_new(ctx, expr22_0); 11463 let expr24_0 = OperandSize::Size64; 11464 let expr25_0: u32 = 127; 11465 let expr26_0 = RegMemImm::Imm { simm32: expr25_0 }; 11466 let expr27_0 = C::gpr_mem_imm_new(ctx, &expr26_0); 11467 let expr28_0 = constructor_x64_test(ctx, &expr24_0, &expr27_0, pattern1_0)?; 11468 let expr29_0: Type = I64; 11469 let expr30_0 = CC::Z; 11470 let expr31_0 = C::gpr_to_gpr_mem(ctx, expr23_0); 11471 let expr32_0 = constructor_cmove(ctx, expr29_0, &expr30_0, &expr31_0, expr19_0)?; 11472 let expr33_0 = constructor_with_flags_reg(ctx, &expr28_0, &expr32_0)?; 11473 let expr34_0 = C::gpr_new(ctx, expr33_0); 11474 let expr35_0: Type = I64; 11475 let expr36_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); 11476 let expr37_0 = constructor_x64_or(ctx, expr35_0, expr34_0, &expr36_0)?; 11477 let expr38_0 = OperandSize::Size64; 11478 let expr39_0: u32 = 64; 11479 let expr40_0 = RegMemImm::Imm { simm32: expr39_0 }; 11480 let expr41_0 = C::gpr_mem_imm_new(ctx, &expr40_0); 11481 let expr42_0 = constructor_x64_test(ctx, &expr38_0, &expr41_0, pattern1_0)?; 11482 let expr43_0: Type = I64; 11483 let expr44_0 = CC::Z; 11484 let expr45_0 = C::gpr_to_gpr_mem(ctx, expr6_0); 11485 let expr46_0 = constructor_cmove(ctx, expr43_0, &expr44_0, &expr45_0, expr23_0)?; 11486 let expr47_0: Type = I64; 11487 let expr48_0 = CC::Z; 11488 let expr49_0 = C::gpr_to_gpr_mem(ctx, expr37_0); 11489 let expr50_0 = constructor_cmove(ctx, expr47_0, &expr48_0, &expr49_0, expr6_0)?; 11490 let expr51_0 = constructor_consumes_flags_concat(ctx, &expr46_0, &expr50_0)?; 11491 let expr52_0 = constructor_with_flags(ctx, &expr42_0, &expr51_0)?; 11492 return Some(expr52_0); 11493 } 11494 11495 // Generated as internal constructor for term ishl_i8x16_mask. 11496 pub fn constructor_ishl_i8x16_mask<C: Context>( 11497 ctx: &mut C, 11498 arg0: &RegMemImm, 11499 ) -> Option<SyntheticAmode> { 11500 let pattern0_0 = arg0; 11501 match pattern0_0 { 11502 &RegMemImm::Imm { simm32: pattern1_0 } => { 11503 // Rule at src/isa/x64/lower.isle line 552. 11504 let expr0_0 = C::ishl_i8x16_mask_for_const(ctx, pattern1_0); 11505 return Some(expr0_0); 11506 } 11507 &RegMemImm::Reg { reg: pattern1_0 } => { 11508 // Rule at src/isa/x64/lower.isle line 561. 11509 let expr0_0 = C::ishl_i8x16_mask_table(ctx); 11510 let expr1_0 = constructor_x64_lea(ctx, &expr0_0)?; 11511 let expr2_0: Type = I64; 11512 let expr3_0 = C::gpr_new(ctx, pattern1_0); 11513 let expr4_0: u8 = 4; 11514 let expr5_0 = C::imm8_to_imm8_gpr(ctx, expr4_0); 11515 let expr6_0 = constructor_x64_shl(ctx, expr2_0, expr3_0, &expr5_0)?; 11516 let expr7_0: u32 = 0; 11517 let expr8_0: u8 = 0; 11518 let expr9_0 = C::amode_imm_reg_reg_shift(ctx, expr7_0, expr1_0, expr6_0, expr8_0); 11519 let expr10_0 = C::amode_to_synthetic_amode(ctx, &expr9_0); 11520 return Some(expr10_0); 11521 } 11522 &RegMemImm::Mem { 11523 addr: ref pattern1_0, 11524 } => { 11525 // Rule at src/isa/x64/lower.isle line 571. 11526 let expr0_0: Type = I64; 11527 let expr1_0 = ExtKind::None; 11528 let expr2_0 = constructor_x64_load(ctx, expr0_0, pattern1_0, &expr1_0)?; 11529 let expr3_0 = RegMemImm::Reg { reg: expr2_0 }; 11530 let expr4_0 = constructor_ishl_i8x16_mask(ctx, &expr3_0)?; 11531 return Some(expr4_0); 11532 } 11533 _ => {} 11534 } 11535 return None; 11536 } 11537 11538 // Generated as internal constructor for term shr_i128. 11539 pub fn constructor_shr_i128<C: Context>( 11540 ctx: &mut C, 11541 arg0: ValueRegs, 11542 arg1: Gpr, 11543 ) -> Option<ValueRegs> { 11544 let pattern0_0 = arg0; 11545 let pattern1_0 = arg1; 11546 // Rule at src/isa/x64/lower.isle line 596. 11547 let expr0_0: usize = 0; 11548 let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?; 11549 let expr2_0: usize = 1; 11550 let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?; 11551 let expr4_0: Type = I64; 11552 let expr5_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0); 11553 let expr6_0 = constructor_x64_shr(ctx, expr4_0, expr1_0, &expr5_0)?; 11554 let expr7_0: Type = I64; 11555 let expr8_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0); 11556 let expr9_0 = constructor_x64_shr(ctx, expr7_0, expr3_0, &expr8_0)?; 11557 let expr10_0: Type = I64; 11558 let expr11_0: Type = I64; 11559 let expr12_0: Type = I64; 11560 let expr13_0: u64 = 64; 11561 let expr14_0 = constructor_imm(ctx, expr12_0, expr13_0)?; 11562 let expr15_0 = C::gpr_new(ctx, expr14_0); 11563 let expr16_0 = C::gpr_to_gpr_mem_imm(ctx, pattern1_0); 11564 let expr17_0 = constructor_x64_sub(ctx, expr11_0, expr15_0, &expr16_0)?; 11565 let expr18_0 = C::gpr_to_imm8_gpr(ctx, expr17_0); 11566 let expr19_0 = constructor_x64_shl(ctx, expr10_0, expr3_0, &expr18_0)?; 11567 let expr20_0 = OperandSize::Size64; 11568 let expr21_0: u32 = 127; 11569 let expr22_0 = RegMemImm::Imm { simm32: expr21_0 }; 11570 let expr23_0 = C::gpr_mem_imm_new(ctx, &expr22_0); 11571 let expr24_0 = constructor_x64_test(ctx, &expr20_0, &expr23_0, pattern1_0)?; 11572 let expr25_0: Type = I64; 11573 let expr26_0 = CC::Z; 11574 let expr27_0: Type = I64; 11575 let expr28_0: u64 = 0; 11576 let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0)?; 11577 let expr30_0 = C::reg_to_gpr_mem(ctx, expr29_0); 11578 let expr31_0 = constructor_cmove(ctx, expr25_0, &expr26_0, &expr30_0, expr19_0)?; 11579 let expr32_0 = constructor_with_flags_reg(ctx, &expr24_0, &expr31_0)?; 11580 let expr33_0 = C::gpr_new(ctx, expr32_0); 11581 let expr34_0: Type = I64; 11582 let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr6_0); 11583 let expr36_0 = constructor_x64_or(ctx, expr34_0, expr33_0, &expr35_0)?; 11584 let expr37_0 = OperandSize::Size64; 11585 let expr38_0: u32 = 64; 11586 let expr39_0 = RegMemImm::Imm { simm32: expr38_0 }; 11587 let expr40_0 = C::gpr_mem_imm_new(ctx, &expr39_0); 11588 let expr41_0 = constructor_x64_test(ctx, &expr37_0, &expr40_0, pattern1_0)?; 11589 let expr42_0: Type = I64; 11590 let expr43_0 = CC::Z; 11591 let expr44_0 = C::gpr_to_gpr_mem(ctx, expr36_0); 11592 let expr45_0 = constructor_cmove(ctx, expr42_0, &expr43_0, &expr44_0, expr9_0)?; 11593 let expr46_0: Type = I64; 11594 let expr47_0 = CC::Z; 11595 let expr48_0 = C::gpr_to_gpr_mem(ctx, expr9_0); 11596 let expr49_0: Type = I64; 11597 let expr50_0: u64 = 0; 11598 let expr51_0 = constructor_imm(ctx, expr49_0, expr50_0)?; 11599 let expr52_0 = C::gpr_new(ctx, expr51_0); 11600 let expr53_0 = constructor_cmove(ctx, expr46_0, &expr47_0, &expr48_0, expr52_0)?; 11601 let expr54_0 = constructor_consumes_flags_concat(ctx, &expr45_0, &expr53_0)?; 11602 let expr55_0 = constructor_with_flags(ctx, &expr41_0, &expr54_0)?; 11603 return Some(expr55_0); 11604 } 11605 11606 // Generated as internal constructor for term ushr_i8x16_mask. 11607 pub fn constructor_ushr_i8x16_mask<C: Context>( 11608 ctx: &mut C, 11609 arg0: &RegMemImm, 11610 ) -> Option<SyntheticAmode> { 11611 let pattern0_0 = arg0; 11612 match pattern0_0 { 11613 &RegMemImm::Imm { simm32: pattern1_0 } => { 11614 // Rule at src/isa/x64/lower.isle line 653. 11615 let expr0_0 = C::ushr_i8x16_mask_for_const(ctx, pattern1_0); 11616 return Some(expr0_0); 11617 } 11618 &RegMemImm::Reg { reg: pattern1_0 } => { 11619 // Rule at src/isa/x64/lower.isle line 662. 11620 let expr0_0 = C::ushr_i8x16_mask_table(ctx); 11621 let expr1_0 = constructor_x64_lea(ctx, &expr0_0)?; 11622 let expr2_0: Type = I64; 11623 let expr3_0 = C::gpr_new(ctx, pattern1_0); 11624 let expr4_0: u8 = 4; 11625 let expr5_0 = C::imm8_to_imm8_gpr(ctx, expr4_0); 11626 let expr6_0 = constructor_x64_shl(ctx, expr2_0, expr3_0, &expr5_0)?; 11627 let expr7_0: u32 = 0; 11628 let expr8_0: u8 = 0; 11629 let expr9_0 = C::amode_imm_reg_reg_shift(ctx, expr7_0, expr1_0, expr6_0, expr8_0); 11630 let expr10_0 = C::amode_to_synthetic_amode(ctx, &expr9_0); 11631 return Some(expr10_0); 11632 } 11633 &RegMemImm::Mem { 11634 addr: ref pattern1_0, 11635 } => { 11636 // Rule at src/isa/x64/lower.isle line 673. 11637 let expr0_0: Type = I64; 11638 let expr1_0 = ExtKind::None; 11639 let expr2_0 = constructor_x64_load(ctx, expr0_0, pattern1_0, &expr1_0)?; 11640 let expr3_0 = RegMemImm::Reg { reg: expr2_0 }; 11641 let expr4_0 = constructor_ushr_i8x16_mask(ctx, &expr3_0)?; 11642 return Some(expr4_0); 11643 } 11644 _ => {} 11645 } 11646 return None; 11647 } 11648 11649 // Generated as internal constructor for term sar_i128. 11650 pub fn constructor_sar_i128<C: Context>( 11651 ctx: &mut C, 11652 arg0: ValueRegs, 11653 arg1: Gpr, 11654 ) -> Option<ValueRegs> { 11655 let pattern0_0 = arg0; 11656 let pattern1_0 = arg1; 11657 // Rule at src/isa/x64/lower.isle line 698. 11658 let expr0_0: usize = 0; 11659 let expr1_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr0_0)?; 11660 let expr2_0: usize = 1; 11661 let expr3_0 = constructor_value_regs_get_gpr(ctx, pattern0_0, expr2_0)?; 11662 let expr4_0: Type = I64; 11663 let expr5_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0); 11664 let expr6_0 = constructor_x64_shr(ctx, expr4_0, expr1_0, &expr5_0)?; 11665 let expr7_0: Type = I64; 11666 let expr8_0 = C::gpr_to_imm8_gpr(ctx, pattern1_0); 11667 let expr9_0 = constructor_x64_sar(ctx, expr7_0, expr3_0, &expr8_0)?; 11668 let expr10_0: Type = I64; 11669 let expr11_0: Type = I64; 11670 let expr12_0: Type = I64; 11671 let expr13_0: u64 = 64; 11672 let expr14_0 = constructor_imm(ctx, expr12_0, expr13_0)?; 11673 let expr15_0 = C::gpr_new(ctx, expr14_0); 11674 let expr16_0 = C::gpr_to_gpr_mem_imm(ctx, pattern1_0); 11675 let expr17_0 = constructor_x64_sub(ctx, expr11_0, expr15_0, &expr16_0)?; 11676 let expr18_0 = C::gpr_to_imm8_gpr(ctx, expr17_0); 11677 let expr19_0 = constructor_x64_shl(ctx, expr10_0, expr3_0, &expr18_0)?; 11678 let expr20_0 = OperandSize::Size64; 11679 let expr21_0: u32 = 127; 11680 let expr22_0 = RegMemImm::Imm { simm32: expr21_0 }; 11681 let expr23_0 = C::gpr_mem_imm_new(ctx, &expr22_0); 11682 let expr24_0 = constructor_x64_test(ctx, &expr20_0, &expr23_0, pattern1_0)?; 11683 let expr25_0: Type = I64; 11684 let expr26_0 = CC::Z; 11685 let expr27_0: Type = I64; 11686 let expr28_0: u64 = 0; 11687 let expr29_0 = constructor_imm(ctx, expr27_0, expr28_0)?; 11688 let expr30_0 = C::reg_to_gpr_mem(ctx, expr29_0); 11689 let expr31_0 = constructor_cmove(ctx, expr25_0, &expr26_0, &expr30_0, expr19_0)?; 11690 let expr32_0 = constructor_with_flags_reg(ctx, &expr24_0, &expr31_0)?; 11691 let expr33_0 = C::gpr_new(ctx, expr32_0); 11692 let expr34_0: Type = I64; 11693 let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr33_0); 11694 let expr36_0 = constructor_x64_or(ctx, expr34_0, expr6_0, &expr35_0)?; 11695 let expr37_0: Type = I64; 11696 let expr38_0: u8 = 63; 11697 let expr39_0 = C::imm8_to_imm8_gpr(ctx, expr38_0); 11698 let expr40_0 = constructor_x64_sar(ctx, expr37_0, expr3_0, &expr39_0)?; 11699 let expr41_0 = OperandSize::Size64; 11700 let expr42_0: u32 = 64; 11701 let expr43_0 = RegMemImm::Imm { simm32: expr42_0 }; 11702 let expr44_0 = C::gpr_mem_imm_new(ctx, &expr43_0); 11703 let expr45_0 = constructor_x64_test(ctx, &expr41_0, &expr44_0, pattern1_0)?; 11704 let expr46_0: Type = I64; 11705 let expr47_0 = CC::Z; 11706 let expr48_0 = C::gpr_to_gpr_mem(ctx, expr36_0); 11707 let expr49_0 = constructor_cmove(ctx, expr46_0, &expr47_0, &expr48_0, expr9_0)?; 11708 let expr50_0: Type = I64; 11709 let expr51_0 = CC::Z; 11710 let expr52_0 = C::gpr_to_gpr_mem(ctx, expr9_0); 11711 let expr53_0 = constructor_cmove(ctx, expr50_0, &expr51_0, &expr52_0, expr40_0)?; 11712 let expr54_0 = constructor_consumes_flags_concat(ctx, &expr49_0, &expr53_0)?; 11713 let expr55_0 = constructor_with_flags(ctx, &expr45_0, &expr54_0)?; 11714 return Some(expr55_0); 11715 } 11716 11717 // Generated as internal constructor for term sshr_i8x16_bigger_shift. 11718 pub fn constructor_sshr_i8x16_bigger_shift<C: Context>( 11719 ctx: &mut C, 11720 arg0: Type, 11721 arg1: &RegMemImm, 11722 ) -> Option<XmmMemImm> { 11723 let pattern0_0 = arg0; 11724 let pattern1_0 = arg1; 11725 match pattern1_0 { 11726 &RegMemImm::Imm { simm32: pattern2_0 } => { 11727 // Rule at src/isa/x64/lower.isle line 762. 11728 let expr0_0: u32 = 8; 11729 let expr1_0 = C::u32_add(ctx, pattern2_0, expr0_0); 11730 let expr2_0 = RegMemImm::Imm { simm32: expr1_0 }; 11731 let expr3_0 = C::xmm_mem_imm_new(ctx, &expr2_0); 11732 return Some(expr3_0); 11733 } 11734 &RegMemImm::Reg { reg: pattern2_0 } => { 11735 // Rule at src/isa/x64/lower.isle line 764. 11736 let expr0_0 = C::gpr_new(ctx, pattern2_0); 11737 let expr1_0: u32 = 8; 11738 let expr2_0 = RegMemImm::Imm { simm32: expr1_0 }; 11739 let expr3_0 = C::gpr_mem_imm_new(ctx, &expr2_0); 11740 let expr4_0 = constructor_x64_add(ctx, pattern0_0, expr0_0, &expr3_0)?; 11741 let expr5_0 = C::gpr_to_reg(ctx, expr4_0); 11742 let expr6_0 = RegMemImm::Reg { reg: expr5_0 }; 11743 let expr7_0 = constructor_mov_rmi_to_xmm(ctx, &expr6_0)?; 11744 return Some(expr7_0); 11745 } 11746 &RegMemImm::Mem { 11747 addr: ref pattern2_0, 11748 } => { 11749 // Rule at src/isa/x64/lower.isle line 768. 11750 let expr0_0: u64 = 8; 11751 let expr1_0 = constructor_imm(ctx, pattern0_0, expr0_0)?; 11752 let expr2_0 = C::gpr_new(ctx, expr1_0); 11753 let expr3_0 = C::gpr_mem_imm_new(ctx, pattern1_0); 11754 let expr4_0 = constructor_x64_add(ctx, pattern0_0, expr2_0, &expr3_0)?; 11755 let expr5_0 = C::gpr_to_reg(ctx, expr4_0); 11756 let expr6_0 = RegMemImm::Reg { reg: expr5_0 }; 11757 let expr7_0 = constructor_mov_rmi_to_xmm(ctx, &expr6_0)?; 11758 return Some(expr7_0); 11759 } 11760 _ => {} 11761 } 11762 return None; 11763 } 11764 11765 // Generated as internal constructor for term sse_and_not. 11766 pub fn constructor_sse_and_not<C: Context>( 11767 ctx: &mut C, 11768 arg0: Type, 11769 arg1: Xmm, 11770 arg2: &XmmMem, 11771 ) -> Option<Xmm> { 11772 let pattern0_0 = arg0; 11773 if pattern0_0 == F32X4 { 11774 let pattern2_0 = arg1; 11775 let pattern3_0 = arg2; 11776 // Rule at src/isa/x64/lower.isle line 1194. 11777 let expr0_0 = constructor_x64_andnps(ctx, pattern2_0, pattern3_0)?; 11778 return Some(expr0_0); 11779 } 11780 if pattern0_0 == F64X2 { 11781 let pattern2_0 = arg1; 11782 let pattern3_0 = arg2; 11783 // Rule at src/isa/x64/lower.isle line 1195. 11784 let expr0_0 = constructor_x64_andnpd(ctx, pattern2_0, pattern3_0)?; 11785 return Some(expr0_0); 11786 } 11787 if let Some((pattern1_0, pattern1_1)) = C::multi_lane(ctx, pattern0_0) { 11788 let pattern2_0 = arg1; 11789 let pattern3_0 = arg2; 11790 // Rule at src/isa/x64/lower.isle line 1196. 11791 let expr0_0 = constructor_x64_pandn(ctx, pattern2_0, pattern3_0)?; 11792 return Some(expr0_0); 11793 } 11794 return None; 11795 } 11796 11797 // Generated as internal constructor for term i128_not. 11798 pub fn constructor_i128_not<C: Context>(ctx: &mut C, arg0: Value) -> Option<ValueRegs> { 11799 let pattern0_0 = arg0; 11800 // Rule at src/isa/x64/lower.isle line 1259. 11801 let expr0_0 = C::put_in_regs(ctx, pattern0_0); 11802 let expr1_0: usize = 0; 11803 let expr2_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr1_0)?; 11804 let expr3_0: usize = 1; 11805 let expr4_0 = constructor_value_regs_get_gpr(ctx, expr0_0, expr3_0)?; 11806 let expr5_0: Type = I64; 11807 let expr6_0 = constructor_x64_not(ctx, expr5_0, expr2_0)?; 11808 let expr7_0: Type = I64; 11809 let expr8_0 = constructor_x64_not(ctx, expr7_0, expr4_0)?; 11810 let expr9_0 = constructor_value_gprs(ctx, expr6_0, expr8_0)?; 11811 return Some(expr9_0); 11812 } 11813 11814 // Generated as internal constructor for term vec_insert_lane. 11815 pub fn constructor_vec_insert_lane<C: Context>( 11816 ctx: &mut C, 11817 arg0: Type, 11818 arg1: Xmm, 11819 arg2: &RegMem, 11820 arg3: u8, 11821 ) -> Option<Xmm> { 11822 let pattern0_0 = arg0; 11823 if pattern0_0 == I8X16 { 11824 let pattern2_0 = arg1; 11825 let pattern3_0 = arg2; 11826 let pattern4_0 = arg3; 11827 // Rule at src/isa/x64/lower.isle line 1313. 11828 let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0); 11829 let expr1_0 = constructor_x64_pinsrb(ctx, pattern2_0, &expr0_0, pattern4_0)?; 11830 return Some(expr1_0); 11831 } 11832 if pattern0_0 == I16X8 { 11833 let pattern2_0 = arg1; 11834 let pattern3_0 = arg2; 11835 let pattern4_0 = arg3; 11836 // Rule at src/isa/x64/lower.isle line 1317. 11837 let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0); 11838 let expr1_0 = constructor_x64_pinsrw(ctx, pattern2_0, &expr0_0, pattern4_0)?; 11839 return Some(expr1_0); 11840 } 11841 if pattern0_0 == I32X4 { 11842 let pattern2_0 = arg1; 11843 let pattern3_0 = arg2; 11844 let pattern4_0 = arg3; 11845 // Rule at src/isa/x64/lower.isle line 1321. 11846 let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0); 11847 let expr1_0 = OperandSize::Size32; 11848 let expr2_0 = constructor_x64_pinsrd(ctx, pattern2_0, &expr0_0, pattern4_0, &expr1_0)?; 11849 return Some(expr2_0); 11850 } 11851 if pattern0_0 == I64X2 { 11852 let pattern2_0 = arg1; 11853 let pattern3_0 = arg2; 11854 let pattern4_0 = arg3; 11855 // Rule at src/isa/x64/lower.isle line 1325. 11856 let expr0_0 = C::reg_mem_to_gpr_mem(ctx, pattern3_0); 11857 let expr1_0 = OperandSize::Size64; 11858 let expr2_0 = constructor_x64_pinsrd(ctx, pattern2_0, &expr0_0, pattern4_0, &expr1_0)?; 11859 return Some(expr2_0); 11860 } 11861 if pattern0_0 == F32X4 { 11862 let pattern2_0 = arg1; 11863 let pattern3_0 = arg2; 11864 let pattern4_0 = arg3; 11865 // Rule at src/isa/x64/lower.isle line 1329. 11866 let expr0_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0); 11867 let expr1_0 = C::sse_insertps_lane_imm(ctx, pattern4_0); 11868 let expr2_0 = constructor_x64_insertps(ctx, pattern2_0, &expr0_0, expr1_0)?; 11869 return Some(expr2_0); 11870 } 11871 if pattern0_0 == F64X2 { 11872 let pattern2_0 = arg1; 11873 let pattern3_0 = arg2; 11874 if let &RegMem::Reg { reg: pattern4_0 } = pattern3_0 { 11875 let pattern5_0 = arg3; 11876 if pattern5_0 == 0 { 11877 // Rule at src/isa/x64/lower.isle line 1351. 11878 let expr0_0 = constructor_reg_to_xmm_mem(ctx, pattern4_0)?; 11879 let expr1_0 = constructor_x64_movsd_regmove(ctx, pattern2_0, &expr0_0)?; 11880 return Some(expr1_0); 11881 } 11882 } 11883 let pattern4_0 = arg3; 11884 if pattern4_0 == 0 { 11885 // Rule at src/isa/x64/lower.isle line 1353. 11886 let expr0_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0); 11887 let expr1_0 = constructor_x64_movsd_load(ctx, &expr0_0)?; 11888 let expr2_0 = C::xmm_to_xmm_mem(ctx, expr1_0); 11889 let expr3_0 = constructor_x64_movsd_regmove(ctx, pattern2_0, &expr2_0)?; 11890 return Some(expr3_0); 11891 } 11892 if pattern4_0 == 1 { 11893 // Rule at src/isa/x64/lower.isle line 1361. 11894 let expr0_0 = C::reg_mem_to_xmm_mem(ctx, pattern3_0); 11895 let expr1_0 = constructor_x64_movlhps(ctx, pattern2_0, &expr0_0)?; 11896 return Some(expr1_0); 11897 } 11898 } 11899 return None; 11900 } 11901 11902 // Generated as internal constructor for term cmp_and_choose. 11903 pub fn constructor_cmp_and_choose<C: Context>( 11904 ctx: &mut C, 11905 arg0: Type, 11906 arg1: &CC, 11907 arg2: Value, 11908 arg3: Value, 11909 ) -> Option<ValueRegs> { 11910 let pattern0_0 = arg0; 11911 if let Some(pattern1_0) = C::fits_in_64(ctx, pattern0_0) { 11912 let pattern2_0 = arg1; 11913 let pattern3_0 = arg2; 11914 let pattern4_0 = arg3; 11915 // Rule at src/isa/x64/lower.isle line 1369. 11916 let expr0_0 = C::raw_operand_size_of_type(ctx, pattern1_0); 11917 let expr1_0 = C::put_in_reg(ctx, pattern3_0); 11918 let expr2_0 = C::put_in_reg(ctx, pattern4_0); 11919 let expr3_0 = constructor_reg_to_gpr_mem_imm(ctx, expr1_0)?; 11920 let expr4_0 = C::gpr_new(ctx, expr2_0); 11921 let expr5_0 = constructor_x64_cmp(ctx, &expr0_0, &expr3_0, expr4_0)?; 11922 let expr6_0 = C::reg_to_gpr_mem(ctx, expr2_0); 11923 let expr7_0 = C::gpr_new(ctx, expr1_0); 11924 let expr8_0 = constructor_cmove(ctx, pattern1_0, pattern2_0, &expr6_0, expr7_0)?; 11925 let expr9_0 = constructor_with_flags_reg(ctx, &expr5_0, &expr8_0)?; 11926 let expr10_0 = C::value_reg(ctx, expr9_0); 11927 return Some(expr10_0); 11928 } 11929 return None; 11930 } 11931 11932 // Generated as internal constructor for term do_clz. 11933 pub fn constructor_do_clz<C: Context>( 11934 ctx: &mut C, 11935 arg0: Type, 11936 arg1: Type, 11937 arg2: Gpr, 11938 ) -> Option<Gpr> { 11939 let pattern0_0 = arg0; 11940 let pattern1_0 = arg1; 11941 let pattern2_0 = arg2; 11942 // Rule at src/isa/x64/lower.isle line 1816. 11943 let expr0_0: Type = I64; 11944 let expr1_0: i64 = -1; 11945 let expr2_0 = constructor_imm_i64(ctx, expr0_0, expr1_0)?; 11946 let expr3_0 = C::gpr_new(ctx, expr2_0); 11947 let expr4_0 = constructor_bsr_or_else(ctx, pattern0_0, pattern2_0, expr3_0)?; 11948 let expr5_0 = C::gpr_to_reg(ctx, expr4_0); 11949 let expr6_0 = C::ty_bits_u64(ctx, pattern1_0); 11950 let expr7_0: u64 = 1; 11951 let expr8_0 = C::u64_sub(ctx, expr6_0, expr7_0)?; 11952 let expr9_0 = constructor_imm(ctx, pattern0_0, expr8_0)?; 11953 let expr10_0 = C::gpr_new(ctx, expr9_0); 11954 let expr11_0 = constructor_reg_to_gpr_mem_imm(ctx, expr5_0)?; 11955 let expr12_0 = constructor_x64_sub(ctx, pattern0_0, expr10_0, &expr11_0)?; 11956 return Some(expr12_0); 11957 } 11958 11959 // Generated as internal constructor for term do_ctz. 11960 pub fn constructor_do_ctz<C: Context>( 11961 ctx: &mut C, 11962 arg0: Type, 11963 arg1: Type, 11964 arg2: Gpr, 11965 ) -> Option<Gpr> { 11966 let pattern0_0 = arg0; 11967 let pattern1_0 = arg1; 11968 let pattern2_0 = arg2; 11969 // Rule at src/isa/x64/lower.isle line 1857. 11970 let expr0_0: Type = I64; 11971 let expr1_0 = C::ty_bits_u64(ctx, pattern1_0); 11972 let expr2_0 = constructor_imm(ctx, expr0_0, expr1_0)?; 11973 let expr3_0 = C::gpr_new(ctx, expr2_0); 11974 let expr4_0 = constructor_bsf_or_else(ctx, pattern0_0, pattern2_0, expr3_0)?; 11975 return Some(expr4_0); 11976 } 11977 11978 // Generated as internal constructor for term do_popcnt. 11979 pub fn constructor_do_popcnt<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> { 11980 let pattern0_0 = arg0; 11981 if pattern0_0 == I32 { 11982 let pattern2_0 = arg1; 11983 // Rule at src/isa/x64/lower.isle line 1948. 11984 let expr0_0: Type = I32; 11985 let expr1_0: u8 = 1; 11986 let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 }; 11987 let expr3_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr2_0); 11988 let expr4_0 = constructor_x64_shr(ctx, expr0_0, pattern2_0, &expr3_0)?; 11989 let expr5_0: Type = I32; 11990 let expr6_0: u64 = 2004318071; 11991 let expr7_0 = constructor_imm(ctx, expr5_0, expr6_0)?; 11992 let expr8_0 = C::gpr_new(ctx, expr7_0); 11993 let expr9_0: Type = I32; 11994 let expr10_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0); 11995 let expr11_0 = constructor_x64_and(ctx, expr9_0, expr4_0, &expr10_0)?; 11996 let expr12_0: Type = I32; 11997 let expr13_0 = C::gpr_to_gpr_mem_imm(ctx, expr11_0); 11998 let expr14_0 = constructor_x64_sub(ctx, expr12_0, pattern2_0, &expr13_0)?; 11999 let expr15_0: Type = I32; 12000 let expr16_0: u8 = 1; 12001 let expr17_0 = Imm8Reg::Imm8 { imm: expr16_0 }; 12002 let expr18_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr17_0); 12003 let expr19_0 = constructor_x64_shr(ctx, expr15_0, expr11_0, &expr18_0)?; 12004 let expr20_0: Type = I32; 12005 let expr21_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0); 12006 let expr22_0 = constructor_x64_and(ctx, expr20_0, expr19_0, &expr21_0)?; 12007 let expr23_0: Type = I32; 12008 let expr24_0 = C::gpr_to_gpr_mem_imm(ctx, expr22_0); 12009 let expr25_0 = constructor_x64_sub(ctx, expr23_0, expr14_0, &expr24_0)?; 12010 let expr26_0: Type = I32; 12011 let expr27_0: u8 = 1; 12012 let expr28_0 = Imm8Reg::Imm8 { imm: expr27_0 }; 12013 let expr29_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr28_0); 12014 let expr30_0 = constructor_x64_shr(ctx, expr26_0, expr22_0, &expr29_0)?; 12015 let expr31_0: Type = I32; 12016 let expr32_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0); 12017 let expr33_0 = constructor_x64_and(ctx, expr31_0, expr30_0, &expr32_0)?; 12018 let expr34_0: Type = I32; 12019 let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr33_0); 12020 let expr36_0 = constructor_x64_sub(ctx, expr34_0, expr25_0, &expr35_0)?; 12021 let expr37_0: Type = I32; 12022 let expr38_0: Type = I32; 12023 let expr39_0: u8 = 4; 12024 let expr40_0 = Imm8Reg::Imm8 { imm: expr39_0 }; 12025 let expr41_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr40_0); 12026 let expr42_0 = constructor_x64_shr(ctx, expr38_0, expr36_0, &expr41_0)?; 12027 let expr43_0 = C::gpr_to_gpr_mem_imm(ctx, expr36_0); 12028 let expr44_0 = constructor_x64_add(ctx, expr37_0, expr42_0, &expr43_0)?; 12029 let expr45_0: Type = I32; 12030 let expr46_0: u32 = 252645135; 12031 let expr47_0 = RegMemImm::Imm { simm32: expr46_0 }; 12032 let expr48_0 = C::gpr_mem_imm_new(ctx, &expr47_0); 12033 let expr49_0 = constructor_x64_and(ctx, expr45_0, expr44_0, &expr48_0)?; 12034 let expr50_0: Type = I32; 12035 let expr51_0: u32 = 16843009; 12036 let expr52_0 = RegMemImm::Imm { simm32: expr51_0 }; 12037 let expr53_0 = C::gpr_mem_imm_new(ctx, &expr52_0); 12038 let expr54_0 = constructor_x64_mul(ctx, expr50_0, expr49_0, &expr53_0)?; 12039 let expr55_0: Type = I32; 12040 let expr56_0: u8 = 24; 12041 let expr57_0 = Imm8Reg::Imm8 { imm: expr56_0 }; 12042 let expr58_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr57_0); 12043 let expr59_0 = constructor_x64_shr(ctx, expr55_0, expr54_0, &expr58_0)?; 12044 return Some(expr59_0); 12045 } 12046 if pattern0_0 == I64 { 12047 let pattern2_0 = arg1; 12048 // Rule at src/isa/x64/lower.isle line 1905. 12049 let expr0_0: Type = I64; 12050 let expr1_0: u8 = 1; 12051 let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 }; 12052 let expr3_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr2_0); 12053 let expr4_0 = constructor_x64_shr(ctx, expr0_0, pattern2_0, &expr3_0)?; 12054 let expr5_0: Type = I64; 12055 let expr6_0: u64 = 8608480567731124087; 12056 let expr7_0 = constructor_imm(ctx, expr5_0, expr6_0)?; 12057 let expr8_0 = C::gpr_new(ctx, expr7_0); 12058 let expr9_0: Type = I64; 12059 let expr10_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0); 12060 let expr11_0 = constructor_x64_and(ctx, expr9_0, expr4_0, &expr10_0)?; 12061 let expr12_0: Type = I64; 12062 let expr13_0 = C::gpr_to_gpr_mem_imm(ctx, expr11_0); 12063 let expr14_0 = constructor_x64_sub(ctx, expr12_0, pattern2_0, &expr13_0)?; 12064 let expr15_0: Type = I64; 12065 let expr16_0: u8 = 1; 12066 let expr17_0 = Imm8Reg::Imm8 { imm: expr16_0 }; 12067 let expr18_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr17_0); 12068 let expr19_0 = constructor_x64_shr(ctx, expr15_0, expr11_0, &expr18_0)?; 12069 let expr20_0: Type = I64; 12070 let expr21_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0); 12071 let expr22_0 = constructor_x64_and(ctx, expr20_0, expr19_0, &expr21_0)?; 12072 let expr23_0: Type = I64; 12073 let expr24_0 = C::gpr_to_gpr_mem_imm(ctx, expr22_0); 12074 let expr25_0 = constructor_x64_sub(ctx, expr23_0, expr14_0, &expr24_0)?; 12075 let expr26_0: Type = I64; 12076 let expr27_0: u8 = 1; 12077 let expr28_0 = Imm8Reg::Imm8 { imm: expr27_0 }; 12078 let expr29_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr28_0); 12079 let expr30_0 = constructor_x64_shr(ctx, expr26_0, expr22_0, &expr29_0)?; 12080 let expr31_0: Type = I64; 12081 let expr32_0 = C::gpr_to_gpr_mem_imm(ctx, expr8_0); 12082 let expr33_0 = constructor_x64_and(ctx, expr31_0, expr30_0, &expr32_0)?; 12083 let expr34_0: Type = I64; 12084 let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr33_0); 12085 let expr36_0 = constructor_x64_sub(ctx, expr34_0, expr25_0, &expr35_0)?; 12086 let expr37_0: Type = I64; 12087 let expr38_0: Type = I64; 12088 let expr39_0: u8 = 4; 12089 let expr40_0 = Imm8Reg::Imm8 { imm: expr39_0 }; 12090 let expr41_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr40_0); 12091 let expr42_0 = constructor_x64_shr(ctx, expr38_0, expr36_0, &expr41_0)?; 12092 let expr43_0 = C::gpr_to_gpr_mem_imm(ctx, expr36_0); 12093 let expr44_0 = constructor_x64_add(ctx, expr37_0, expr42_0, &expr43_0)?; 12094 let expr45_0: Type = I64; 12095 let expr46_0: u64 = 1085102592571150095; 12096 let expr47_0 = constructor_imm(ctx, expr45_0, expr46_0)?; 12097 let expr48_0 = C::gpr_new(ctx, expr47_0); 12098 let expr49_0: Type = I64; 12099 let expr50_0 = C::gpr_to_gpr_mem_imm(ctx, expr48_0); 12100 let expr51_0 = constructor_x64_and(ctx, expr49_0, expr44_0, &expr50_0)?; 12101 let expr52_0: Type = I64; 12102 let expr53_0: u64 = 72340172838076673; 12103 let expr54_0 = constructor_imm(ctx, expr52_0, expr53_0)?; 12104 let expr55_0 = C::gpr_new(ctx, expr54_0); 12105 let expr56_0: Type = I64; 12106 let expr57_0 = C::gpr_to_gpr_mem_imm(ctx, expr55_0); 12107 let expr58_0 = constructor_x64_mul(ctx, expr56_0, expr51_0, &expr57_0)?; 12108 let expr59_0: Type = I64; 12109 let expr60_0: u8 = 56; 12110 let expr61_0 = Imm8Reg::Imm8 { imm: expr60_0 }; 12111 let expr62_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr61_0); 12112 let expr63_0 = constructor_x64_shr(ctx, expr59_0, expr58_0, &expr62_0)?; 12113 return Some(expr63_0); 12114 } 12115 return None; 12116 } 12117 12118 // Generated as internal constructor for term do_bitrev8. 12119 pub fn constructor_do_bitrev8<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> { 12120 let pattern0_0 = arg0; 12121 let pattern1_0 = arg1; 12122 // Rule at src/isa/x64/lower.isle line 2037. 12123 let expr0_0 = C::ty_mask(ctx, pattern0_0); 12124 let expr1_0: u64 = 6148914691236517205; 12125 let expr2_0 = C::u64_and(ctx, expr0_0, expr1_0)?; 12126 let expr3_0 = constructor_imm(ctx, pattern0_0, expr2_0)?; 12127 let expr4_0 = C::gpr_new(ctx, expr3_0); 12128 let expr5_0 = C::gpr_to_gpr_mem_imm(ctx, expr4_0); 12129 let expr6_0 = constructor_x64_and(ctx, pattern0_0, pattern1_0, &expr5_0)?; 12130 let expr7_0: u8 = 1; 12131 let expr8_0 = Imm8Reg::Imm8 { imm: expr7_0 }; 12132 let expr9_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr8_0); 12133 let expr10_0 = constructor_x64_shr(ctx, pattern0_0, pattern1_0, &expr9_0)?; 12134 let expr11_0 = C::gpr_to_gpr_mem_imm(ctx, expr4_0); 12135 let expr12_0 = constructor_x64_and(ctx, pattern0_0, expr10_0, &expr11_0)?; 12136 let expr13_0: u8 = 1; 12137 let expr14_0 = Imm8Reg::Imm8 { imm: expr13_0 }; 12138 let expr15_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr14_0); 12139 let expr16_0 = constructor_x64_shl(ctx, pattern0_0, expr6_0, &expr15_0)?; 12140 let expr17_0 = C::gpr_to_gpr_mem_imm(ctx, expr12_0); 12141 let expr18_0 = constructor_x64_or(ctx, pattern0_0, expr16_0, &expr17_0)?; 12142 let expr19_0: u64 = 3689348814741910323; 12143 let expr20_0 = C::u64_and(ctx, expr0_0, expr19_0)?; 12144 let expr21_0 = constructor_imm(ctx, pattern0_0, expr20_0)?; 12145 let expr22_0 = C::gpr_new(ctx, expr21_0); 12146 let expr23_0 = C::gpr_to_gpr_mem_imm(ctx, expr22_0); 12147 let expr24_0 = constructor_x64_and(ctx, pattern0_0, expr18_0, &expr23_0)?; 12148 let expr25_0: u8 = 2; 12149 let expr26_0 = Imm8Reg::Imm8 { imm: expr25_0 }; 12150 let expr27_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr26_0); 12151 let expr28_0 = constructor_x64_shr(ctx, pattern0_0, expr18_0, &expr27_0)?; 12152 let expr29_0 = C::gpr_to_gpr_mem_imm(ctx, expr22_0); 12153 let expr30_0 = constructor_x64_and(ctx, pattern0_0, expr28_0, &expr29_0)?; 12154 let expr31_0: u8 = 2; 12155 let expr32_0 = Imm8Reg::Imm8 { imm: expr31_0 }; 12156 let expr33_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr32_0); 12157 let expr34_0 = constructor_x64_shl(ctx, pattern0_0, expr24_0, &expr33_0)?; 12158 let expr35_0 = C::gpr_to_gpr_mem_imm(ctx, expr30_0); 12159 let expr36_0 = constructor_x64_or(ctx, pattern0_0, expr34_0, &expr35_0)?; 12160 let expr37_0: u64 = 1085102592571150095; 12161 let expr38_0 = C::u64_and(ctx, expr0_0, expr37_0)?; 12162 let expr39_0 = constructor_imm(ctx, pattern0_0, expr38_0)?; 12163 let expr40_0 = C::gpr_new(ctx, expr39_0); 12164 let expr41_0 = C::gpr_to_gpr_mem_imm(ctx, expr40_0); 12165 let expr42_0 = constructor_x64_and(ctx, pattern0_0, expr36_0, &expr41_0)?; 12166 let expr43_0: u8 = 4; 12167 let expr44_0 = Imm8Reg::Imm8 { imm: expr43_0 }; 12168 let expr45_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr44_0); 12169 let expr46_0 = constructor_x64_shr(ctx, pattern0_0, expr36_0, &expr45_0)?; 12170 let expr47_0 = C::gpr_to_gpr_mem_imm(ctx, expr40_0); 12171 let expr48_0 = constructor_x64_and(ctx, pattern0_0, expr46_0, &expr47_0)?; 12172 let expr49_0: u8 = 4; 12173 let expr50_0 = Imm8Reg::Imm8 { imm: expr49_0 }; 12174 let expr51_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr50_0); 12175 let expr52_0 = constructor_x64_shl(ctx, pattern0_0, expr42_0, &expr51_0)?; 12176 let expr53_0 = C::gpr_to_gpr_mem_imm(ctx, expr48_0); 12177 let expr54_0 = constructor_x64_or(ctx, pattern0_0, expr52_0, &expr53_0)?; 12178 return Some(expr54_0); 12179 } 12180 12181 // Generated as internal constructor for term do_bitrev16. 12182 pub fn constructor_do_bitrev16<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> { 12183 let pattern0_0 = arg0; 12184 let pattern1_0 = arg1; 12185 // Rule at src/isa/x64/lower.isle line 2060. 12186 let expr0_0 = constructor_do_bitrev8(ctx, pattern0_0, pattern1_0)?; 12187 let expr1_0 = C::ty_mask(ctx, pattern0_0); 12188 let expr2_0: u64 = 71777214294589695; 12189 let expr3_0 = C::u64_and(ctx, expr1_0, expr2_0)?; 12190 let expr4_0 = constructor_imm(ctx, pattern0_0, expr3_0)?; 12191 let expr5_0 = C::gpr_new(ctx, expr4_0); 12192 let expr6_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0); 12193 let expr7_0 = constructor_x64_and(ctx, pattern0_0, expr0_0, &expr6_0)?; 12194 let expr8_0: u8 = 8; 12195 let expr9_0 = Imm8Reg::Imm8 { imm: expr8_0 }; 12196 let expr10_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr9_0); 12197 let expr11_0 = constructor_x64_shr(ctx, pattern0_0, expr0_0, &expr10_0)?; 12198 let expr12_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0); 12199 let expr13_0 = constructor_x64_and(ctx, pattern0_0, expr11_0, &expr12_0)?; 12200 let expr14_0: u8 = 8; 12201 let expr15_0 = Imm8Reg::Imm8 { imm: expr14_0 }; 12202 let expr16_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr15_0); 12203 let expr17_0 = constructor_x64_shl(ctx, pattern0_0, expr7_0, &expr16_0)?; 12204 let expr18_0 = C::gpr_to_gpr_mem_imm(ctx, expr13_0); 12205 let expr19_0 = constructor_x64_or(ctx, pattern0_0, expr17_0, &expr18_0)?; 12206 return Some(expr19_0); 12207 } 12208 12209 // Generated as internal constructor for term do_bitrev32. 12210 pub fn constructor_do_bitrev32<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> { 12211 let pattern0_0 = arg0; 12212 let pattern1_0 = arg1; 12213 // Rule at src/isa/x64/lower.isle line 2072. 12214 let expr0_0 = constructor_do_bitrev16(ctx, pattern0_0, pattern1_0)?; 12215 let expr1_0 = C::ty_mask(ctx, pattern0_0); 12216 let expr2_0: u64 = 281470681808895; 12217 let expr3_0 = C::u64_and(ctx, expr1_0, expr2_0)?; 12218 let expr4_0 = constructor_imm(ctx, pattern0_0, expr3_0)?; 12219 let expr5_0 = C::gpr_new(ctx, expr4_0); 12220 let expr6_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0); 12221 let expr7_0 = constructor_x64_and(ctx, pattern0_0, expr0_0, &expr6_0)?; 12222 let expr8_0: u8 = 16; 12223 let expr9_0 = Imm8Reg::Imm8 { imm: expr8_0 }; 12224 let expr10_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr9_0); 12225 let expr11_0 = constructor_x64_shr(ctx, pattern0_0, expr0_0, &expr10_0)?; 12226 let expr12_0 = C::gpr_to_gpr_mem_imm(ctx, expr5_0); 12227 let expr13_0 = constructor_x64_and(ctx, pattern0_0, expr11_0, &expr12_0)?; 12228 let expr14_0: u8 = 16; 12229 let expr15_0 = Imm8Reg::Imm8 { imm: expr14_0 }; 12230 let expr16_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr15_0); 12231 let expr17_0 = constructor_x64_shl(ctx, pattern0_0, expr7_0, &expr16_0)?; 12232 let expr18_0 = C::gpr_to_gpr_mem_imm(ctx, expr13_0); 12233 let expr19_0 = constructor_x64_or(ctx, pattern0_0, expr17_0, &expr18_0)?; 12234 return Some(expr19_0); 12235 } 12236 12237 // Generated as internal constructor for term do_bitrev64. 12238 pub fn constructor_do_bitrev64<C: Context>(ctx: &mut C, arg0: Type, arg1: Gpr) -> Option<Gpr> { 12239 let pattern0_0 = arg0; 12240 if pattern0_0 == I64 { 12241 let pattern2_0 = arg1; 12242 // Rule at src/isa/x64/lower.isle line 2084. 12243 let expr0_0 = constructor_do_bitrev32(ctx, pattern0_0, pattern2_0)?; 12244 let expr1_0: u64 = 4294967295; 12245 let expr2_0 = constructor_imm(ctx, pattern0_0, expr1_0)?; 12246 let expr3_0 = C::gpr_new(ctx, expr2_0); 12247 let expr4_0 = C::gpr_to_gpr_mem_imm(ctx, expr3_0); 12248 let expr5_0 = constructor_x64_and(ctx, pattern0_0, expr0_0, &expr4_0)?; 12249 let expr6_0: u8 = 32; 12250 let expr7_0 = Imm8Reg::Imm8 { imm: expr6_0 }; 12251 let expr8_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr7_0); 12252 let expr9_0 = constructor_x64_shr(ctx, pattern0_0, expr0_0, &expr8_0)?; 12253 let expr10_0: u8 = 32; 12254 let expr11_0 = Imm8Reg::Imm8 { imm: expr10_0 }; 12255 let expr12_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr11_0); 12256 let expr13_0 = constructor_x64_shl(ctx, pattern0_0, expr5_0, &expr12_0)?; 12257 let expr14_0 = C::gpr_to_gpr_mem_imm(ctx, expr9_0); 12258 let expr15_0 = constructor_x64_or(ctx, pattern0_0, expr13_0, &expr14_0)?; 12259 return Some(expr15_0); 12260 } 12261 return None; 12262 } 12263 12264 // Generated as internal constructor for term generic_sextend. 12265 pub fn constructor_generic_sextend<C: Context>( 12266 ctx: &mut C, 12267 arg0: Value, 12268 arg1: Type, 12269 arg2: Type, 12270 ) -> Option<InstOutput> { 12271 let pattern0_0 = arg0; 12272 let pattern1_0 = arg1; 12273 if let Some(pattern2_0) = C::fits_in_32(ctx, pattern1_0) { 12274 let pattern3_0 = arg2; 12275 if let Some(pattern4_0) = C::fits_in_32(ctx, pattern3_0) { 12276 // Rule at src/isa/x64/lower.isle line 2204. 12277 let expr0_0: Type = I32; 12278 let expr1_0 = ExtendKind::Sign; 12279 let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?; 12280 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 12281 return Some(expr3_0); 12282 } 12283 if let Some(pattern4_0) = C::ty_int_bool_64(ctx, pattern3_0) { 12284 // Rule at src/isa/x64/lower.isle line 2200. 12285 let expr0_0: Type = I64; 12286 let expr1_0 = ExtendKind::Sign; 12287 let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?; 12288 let expr3_0 = constructor_output_gpr(ctx, expr2_0)?; 12289 return Some(expr3_0); 12290 } 12291 if let Some(pattern4_0) = C::ty_int_bool_128(ctx, pattern3_0) { 12292 // Rule at src/isa/x64/lower.isle line 2194. 12293 let expr0_0: Type = I64; 12294 let expr1_0 = ExtendKind::Sign; 12295 let expr2_0 = constructor_extend_to_gpr(ctx, pattern0_0, expr0_0, &expr1_0)?; 12296 let expr3_0 = constructor_spread_sign_bit(ctx, expr2_0)?; 12297 let expr4_0 = C::gpr_to_reg(ctx, expr2_0); 12298 let expr5_0 = C::gpr_to_reg(ctx, expr3_0); 12299 let expr6_0 = C::value_regs(ctx, expr4_0, expr5_0); 12300 let expr7_0 = C::output(ctx, expr6_0); 12301 return Some(expr7_0); 12302 } 12303 } 12304 if let Some(pattern2_0) = C::ty_int_bool_64(ctx, pattern1_0) { 12305 let pattern3_0 = arg2; 12306 if let Some(pattern4_0) = C::ty_int_bool_128(ctx, pattern3_0) { 12307 // Rule at src/isa/x64/lower.isle line 2190. 12308 let expr0_0 = C::put_in_reg(ctx, pattern0_0); 12309 let expr1_0 = constructor_put_in_gpr(ctx, pattern0_0)?; 12310 let expr2_0 = constructor_spread_sign_bit(ctx, expr1_0)?; 12311 let expr3_0 = C::gpr_to_reg(ctx, expr2_0); 12312 let expr4_0 = C::value_regs(ctx, expr0_0, expr3_0); 12313 let expr5_0 = C::output(ctx, expr4_0); 12314 return Some(expr5_0); 12315 } 12316 } 12317 let pattern2_0 = arg2; 12318 if pattern2_0 == pattern1_0 { 12319 // Rule at src/isa/x64/lower.isle line 2180. 12320 let expr0_0 = constructor_output_value(ctx, pattern0_0)?; 12321 return Some(expr0_0); 12322 } 12323 return None; 12324 } 12325 12326 // Generated as internal constructor for term spread_sign_bit. 12327 pub fn constructor_spread_sign_bit<C: Context>(ctx: &mut C, arg0: Gpr) -> Option<Gpr> { 12328 let pattern0_0 = arg0; 12329 // Rule at src/isa/x64/lower.isle line 2186. 12330 let expr0_0: Type = I64; 12331 let expr1_0: u8 = 63; 12332 let expr2_0 = Imm8Reg::Imm8 { imm: expr1_0 }; 12333 let expr3_0 = C::imm8_reg_to_imm8_gpr(ctx, &expr2_0); 12334 let expr4_0 = constructor_x64_sar(ctx, expr0_0, pattern0_0, &expr3_0)?; 12335 return Some(expr4_0); 12336 } 12337