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