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