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