@@ -2357,16 +2357,16 @@ let Predicates = [HasBMI] in {
2357
2357
(BLSI64rr GR64:$src)>;
2358
2358
}
2359
2359
2360
- multiclass bmi_bextr_bzhi <bits<8> opc, string mnemonic, RegisterClass RC,
2361
- X86MemOperand x86memop, Intrinsic Int ,
2362
- PatFrag ld_frag, X86FoldableSchedWrite Sched> {
2360
+ multiclass bmi_bextr <bits<8> opc, string mnemonic, RegisterClass RC,
2361
+ X86MemOperand x86memop, SDNode OpNode ,
2362
+ PatFrag ld_frag, X86FoldableSchedWrite Sched> {
2363
2363
def rr : I<opc, MRMSrcReg4VOp3, (outs RC:$dst), (ins RC:$src1, RC:$src2),
2364
2364
!strconcat(mnemonic, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
2365
- [(set RC:$dst, (Int RC:$src1, RC:$src2)), (implicit EFLAGS)]>,
2365
+ [(set RC:$dst, (OpNode RC:$src1, RC:$src2)), (implicit EFLAGS)]>,
2366
2366
T8PS, VEX, Sched<[Sched]>;
2367
2367
def rm : I<opc, MRMSrcMem4VOp3, (outs RC:$dst), (ins x86memop:$src1, RC:$src2),
2368
2368
!strconcat(mnemonic, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
2369
- [(set RC:$dst, (Int (ld_frag addr:$src1), RC:$src2)),
2369
+ [(set RC:$dst, (OpNode (ld_frag addr:$src1), RC:$src2)),
2370
2370
(implicit EFLAGS)]>, T8PS, VEX,
2371
2371
Sched<[Sched.Folded,
2372
2372
// x86memop:$src1
@@ -2377,17 +2377,36 @@ multiclass bmi_bextr_bzhi<bits<8> opc, string mnemonic, RegisterClass RC,
2377
2377
}
2378
2378
2379
2379
let Predicates = [HasBMI], Defs = [EFLAGS] in {
2380
- defm BEXTR32 : bmi_bextr_bzhi<0xF7, "bextr{l}", GR32, i32mem,
2381
- int_x86_bmi_bextr_32, loadi32, WriteBEXTR>;
2382
- defm BEXTR64 : bmi_bextr_bzhi<0xF7, "bextr{q}", GR64, i64mem,
2383
- int_x86_bmi_bextr_64, loadi64, WriteBEXTR>, VEX_W;
2380
+ defm BEXTR32 : bmi_bextr<0xF7, "bextr{l}", GR32, i32mem,
2381
+ X86bextr, loadi32, WriteBEXTR>;
2382
+ defm BEXTR64 : bmi_bextr<0xF7, "bextr{q}", GR64, i64mem,
2383
+ X86bextr, loadi64, WriteBEXTR>, VEX_W;
2384
+ }
2385
+
2386
+ multiclass bmi_bzhi<bits<8> opc, string mnemonic, RegisterClass RC,
2387
+ X86MemOperand x86memop, Intrinsic Int,
2388
+ PatFrag ld_frag, X86FoldableSchedWrite Sched> {
2389
+ def rr : I<opc, MRMSrcReg4VOp3, (outs RC:$dst), (ins RC:$src1, RC:$src2),
2390
+ !strconcat(mnemonic, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
2391
+ [(set RC:$dst, (Int RC:$src1, RC:$src2)), (implicit EFLAGS)]>,
2392
+ T8PS, VEX, Sched<[Sched]>;
2393
+ def rm : I<opc, MRMSrcMem4VOp3, (outs RC:$dst), (ins x86memop:$src1, RC:$src2),
2394
+ !strconcat(mnemonic, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
2395
+ [(set RC:$dst, (Int (ld_frag addr:$src1), RC:$src2)),
2396
+ (implicit EFLAGS)]>, T8PS, VEX,
2397
+ Sched<[Sched.Folded,
2398
+ // x86memop:$src1
2399
+ ReadDefault, ReadDefault, ReadDefault, ReadDefault,
2400
+ ReadDefault,
2401
+ // RC:$src2
2402
+ ReadAfterLd]>;
2384
2403
}
2385
2404
2386
2405
let Predicates = [HasBMI2], Defs = [EFLAGS] in {
2387
- defm BZHI32 : bmi_bextr_bzhi <0xF5, "bzhi{l}", GR32, i32mem,
2388
- int_x86_bmi_bzhi_32, loadi32, WriteBZHI>;
2389
- defm BZHI64 : bmi_bextr_bzhi <0xF5, "bzhi{q}", GR64, i64mem,
2390
- int_x86_bmi_bzhi_64, loadi64, WriteBZHI>, VEX_W;
2406
+ defm BZHI32 : bmi_bzhi <0xF5, "bzhi{l}", GR32, i32mem,
2407
+ int_x86_bmi_bzhi_32, loadi32, WriteBZHI>;
2408
+ defm BZHI64 : bmi_bzhi <0xF5, "bzhi{q}", GR64, i64mem,
2409
+ int_x86_bmi_bzhi_64, loadi64, WriteBZHI>, VEX_W;
2391
2410
}
2392
2411
2393
2412
def CountTrailingOnes : SDNodeXForm<imm, [{
@@ -2507,31 +2526,30 @@ let Predicates = [HasBMI2] in {
2507
2526
//
2508
2527
let Predicates = [HasTBM], Defs = [EFLAGS] in {
2509
2528
2510
- multiclass tbm_ternary_imm_intr <bits<8> opc, RegisterClass RC, string OpcodeStr,
2511
- X86MemOperand x86memop, PatFrag ld_frag,
2512
- Intrinsic Int , Operand immtype,
2513
- SDPatternOperator immoperator,
2514
- X86FoldableSchedWrite Sched> {
2529
+ multiclass tbm_ternary_imm <bits<8> opc, RegisterClass RC, string OpcodeStr,
2530
+ X86MemOperand x86memop, PatFrag ld_frag,
2531
+ SDNode OpNode , Operand immtype,
2532
+ SDPatternOperator immoperator,
2533
+ X86FoldableSchedWrite Sched> {
2515
2534
def ri : Ii32<opc, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, immtype:$cntl),
2516
2535
!strconcat(OpcodeStr,
2517
2536
"\t{$cntl, $src1, $dst|$dst, $src1, $cntl}"),
2518
- [(set RC:$dst, (Int RC:$src1, immoperator:$cntl))]>,
2537
+ [(set RC:$dst, (OpNode RC:$src1, immoperator:$cntl))]>,
2519
2538
XOP, XOPA, Sched<[Sched]>;
2520
2539
def mi : Ii32<opc, MRMSrcMem, (outs RC:$dst),
2521
2540
(ins x86memop:$src1, immtype:$cntl),
2522
2541
!strconcat(OpcodeStr,
2523
2542
"\t{$cntl, $src1, $dst|$dst, $src1, $cntl}"),
2524
- [(set RC:$dst, (Int (ld_frag addr:$src1), immoperator:$cntl))]>,
2543
+ [(set RC:$dst, (OpNode (ld_frag addr:$src1), immoperator:$cntl))]>,
2525
2544
XOP, XOPA, Sched<[Sched.Folded]>;
2526
2545
}
2527
2546
2528
- defm BEXTRI32 : tbm_ternary_imm_intr<0x10, GR32, "bextr{l}", i32mem, loadi32,
2529
- int_x86_tbm_bextri_u32, i32imm, imm,
2530
- WriteBEXTR>;
2547
+ defm BEXTRI32 : tbm_ternary_imm<0x10, GR32, "bextr{l}", i32mem, loadi32,
2548
+ X86bextr, i32imm, imm, WriteBEXTR>;
2531
2549
let ImmT = Imm32S in
2532
- defm BEXTRI64 : tbm_ternary_imm_intr <0x10, GR64, "bextr{q}", i64mem, loadi64,
2533
- int_x86_tbm_bextri_u64 , i64i32imm,
2534
- i64immSExt32, WriteBEXTR>, VEX_W;
2550
+ defm BEXTRI64 : tbm_ternary_imm <0x10, GR64, "bextr{q}", i64mem, loadi64,
2551
+ X86bextr , i64i32imm,
2552
+ i64immSExt32, WriteBEXTR>, VEX_W;
2535
2553
2536
2554
multiclass tbm_binary_rm<bits<8> opc, Format FormReg, Format FormMem,
2537
2555
RegisterClass RC, string OpcodeStr,
0 commit comments