@@ -1214,19 +1214,19 @@ let Predicates = [HasBMI], Defs = [EFLAGS] in {
1214
1214
1215
1215
multiclass bmi_bls<string mnemonic, Format RegMRM, Format MemMRM,
1216
1216
RegisterClass RC, X86MemOperand x86memop,
1217
- X86FoldableSchedWrite sched> {
1217
+ X86FoldableSchedWrite sched, string Suffix = "" > {
1218
1218
let hasSideEffects = 0 in {
1219
- def rr : I<0xF3, RegMRM, (outs RC:$dst), (ins RC:$src),
1220
- !strconcat(mnemonic, "\t{$src, $dst|$dst, $src}"), []>,
1221
- T8PS, VEX_4V, Sched<[sched]>;
1219
+ def rr#Suffix : I<0xF3, RegMRM, (outs RC:$dst), (ins RC:$src),
1220
+ !strconcat(mnemonic, "\t{$src, $dst|$dst, $src}"), []>,
1221
+ T8PS, VEX_4V, Sched<[sched]>;
1222
1222
let mayLoad = 1 in
1223
- def rm : I<0xF3, MemMRM, (outs RC:$dst), (ins x86memop:$src),
1224
- !strconcat(mnemonic, "\t{$src, $dst|$dst, $src}"), []>,
1225
- T8PS, VEX_4V, Sched<[sched.Folded]>;
1223
+ def rm#Suffix : I<0xF3, MemMRM, (outs RC:$dst), (ins x86memop:$src),
1224
+ !strconcat(mnemonic, "\t{$src, $dst|$dst, $src}"), []>,
1225
+ T8PS, VEX_4V, Sched<[sched.Folded]>;
1226
1226
}
1227
1227
}
1228
1228
1229
- let Predicates = [HasBMI], Defs = [EFLAGS] in {
1229
+ let Predicates = [HasBMI, NoEGPR ], Defs = [EFLAGS] in {
1230
1230
defm BLSR32 : bmi_bls<"blsr{l}", MRM1r, MRM1m, GR32, i32mem, WriteBLS>;
1231
1231
defm BLSR64 : bmi_bls<"blsr{q}", MRM1r, MRM1m, GR64, i64mem, WriteBLS>, REX_W;
1232
1232
defm BLSMSK32 : bmi_bls<"blsmsk{l}", MRM2r, MRM2m, GR32, i32mem, WriteBLS>;
@@ -1235,6 +1235,15 @@ let Predicates = [HasBMI], Defs = [EFLAGS] in {
1235
1235
defm BLSI64 : bmi_bls<"blsi{q}", MRM3r, MRM3m, GR64, i64mem, WriteBLS>, REX_W;
1236
1236
}
1237
1237
1238
+ let Predicates = [HasBMI, HasEGPR], Defs = [EFLAGS] in {
1239
+ defm BLSR32 : bmi_bls<"blsr{l}", MRM1r, MRM1m, GR32, i32mem, WriteBLS, "_EVEX">, EVEX;
1240
+ defm BLSR64 : bmi_bls<"blsr{q}", MRM1r, MRM1m, GR64, i64mem, WriteBLS, "_EVEX">, REX_W, EVEX;
1241
+ defm BLSMSK32 : bmi_bls<"blsmsk{l}", MRM2r, MRM2m, GR32, i32mem, WriteBLS, "_EVEX">, EVEX;
1242
+ defm BLSMSK64 : bmi_bls<"blsmsk{q}", MRM2r, MRM2m, GR64, i64mem, WriteBLS, "_EVEX">, REX_W, EVEX;
1243
+ defm BLSI32 : bmi_bls<"blsi{l}", MRM3r, MRM3m, GR32, i32mem, WriteBLS, "_EVEX">, EVEX;
1244
+ defm BLSI64 : bmi_bls<"blsi{q}", MRM3r, MRM3m, GR64, i64mem, WriteBLS, "_EVEX">, REX_W, EVEX;
1245
+ }
1246
+
1238
1247
//===----------------------------------------------------------------------===//
1239
1248
// Pattern fragments to auto generate BMI instructions.
1240
1249
//===----------------------------------------------------------------------===//
@@ -1292,56 +1301,50 @@ let Predicates = [HasBMI] in {
1292
1301
(BLSI64rr GR64:$src)>;
1293
1302
}
1294
1303
1295
- multiclass bmi_bextr<bits<8> opc, string mnemonic, RegisterClass RC,
1296
- X86MemOperand x86memop, SDNode OpNode,
1297
- PatFrag ld_frag, X86FoldableSchedWrite Sched> {
1298
- def rr : I<opc, MRMSrcReg4VOp3, (outs RC:$dst), (ins RC:$src1, RC:$src2),
1299
- !strconcat(mnemonic, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
1300
- [(set RC:$dst, (OpNode RC:$src1, RC:$src2)), (implicit EFLAGS)]>,
1301
- T8PS, VEX, Sched<[Sched]>;
1302
- def rm : I<opc, MRMSrcMem4VOp3, (outs RC:$dst), (ins x86memop:$src1, RC:$src2),
1303
- !strconcat(mnemonic, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
1304
- [(set RC:$dst, (OpNode (ld_frag addr:$src1), RC:$src2)),
1305
- (implicit EFLAGS)]>, T8PS, VEX,
1306
- Sched<[Sched.Folded,
1307
- // x86memop:$src1
1308
- ReadDefault, ReadDefault, ReadDefault, ReadDefault,
1309
- ReadDefault,
1310
- // RC:$src2
1311
- Sched.ReadAfterFold]>;
1304
+ multiclass bmi4VOp3_base<bits<8> opc, string mnemonic, RegisterClass RC,
1305
+ X86MemOperand x86memop, SDPatternOperator OpNode,
1306
+ PatFrag ld_frag, X86FoldableSchedWrite Sched,
1307
+ string Suffix = ""> {
1308
+ def rr#Suffix : I<opc, MRMSrcReg4VOp3, (outs RC:$dst), (ins RC:$src1, RC:$src2),
1309
+ !strconcat(mnemonic, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
1310
+ [(set RC:$dst, (OpNode RC:$src1, RC:$src2)), (implicit EFLAGS)]>,
1311
+ T8PS, VEX, Sched<[Sched]>;
1312
+ let mayLoad = 1 in
1313
+ def rm#Suffix : I<opc, MRMSrcMem4VOp3, (outs RC:$dst), (ins x86memop:$src1, RC:$src2),
1314
+ !strconcat(mnemonic, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
1315
+ [(set RC:$dst, (OpNode (ld_frag addr:$src1), RC:$src2)),
1316
+ (implicit EFLAGS)]>, T8PS, VEX,
1317
+ Sched<[Sched.Folded,
1318
+ // x86memop:$src1
1319
+ ReadDefault, ReadDefault, ReadDefault, ReadDefault,
1320
+ ReadDefault,
1321
+ // RC:$src2
1322
+ Sched.ReadAfterFold]>;
1312
1323
}
1313
1324
1314
- let Predicates = [HasBMI], Defs = [EFLAGS] in {
1315
- defm BEXTR32 : bmi_bextr<0xF7, "bextr{l}", GR32, i32mem,
1316
- X86bextr, loadi32, WriteBEXTR>;
1317
- defm BEXTR64 : bmi_bextr<0xF7, "bextr{q}", GR64, i64mem,
1318
- X86bextr, loadi64, WriteBEXTR>, REX_W;
1319
- }
1320
-
1321
- multiclass bmi_bzhi<bits<8> opc, string mnemonic, RegisterClass RC,
1322
- X86MemOperand x86memop, SDNode Int,
1323
- PatFrag ld_frag, X86FoldableSchedWrite Sched> {
1324
- def rr : I<opc, MRMSrcReg4VOp3, (outs RC:$dst), (ins RC:$src1, RC:$src2),
1325
- !strconcat(mnemonic, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
1326
- [(set RC:$dst, (Int RC:$src1, RC:$src2)), (implicit EFLAGS)]>,
1327
- T8PS, VEX, Sched<[Sched]>;
1328
- def rm : I<opc, MRMSrcMem4VOp3, (outs RC:$dst), (ins x86memop:$src1, RC:$src2),
1329
- !strconcat(mnemonic, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
1330
- [(set RC:$dst, (Int (ld_frag addr:$src1), RC:$src2)),
1331
- (implicit EFLAGS)]>, T8PS, VEX,
1332
- Sched<[Sched.Folded,
1333
- // x86memop:$src1
1334
- ReadDefault, ReadDefault, ReadDefault, ReadDefault,
1335
- ReadDefault,
1336
- // RC:$src2
1337
- Sched.ReadAfterFold]>;
1338
- }
1339
-
1340
- let Predicates = [HasBMI2], Defs = [EFLAGS] in {
1341
- defm BZHI32 : bmi_bzhi<0xF5, "bzhi{l}", GR32, i32mem,
1342
- X86bzhi, loadi32, WriteBZHI>;
1343
- defm BZHI64 : bmi_bzhi<0xF5, "bzhi{q}", GR64, i64mem,
1344
- X86bzhi, loadi64, WriteBZHI>, REX_W;
1325
+ let Predicates = [HasBMI, NoEGPR], Defs = [EFLAGS] in {
1326
+ defm BEXTR32 : bmi4VOp3_base<0xF7, "bextr{l}", GR32, i32mem,
1327
+ X86bextr, loadi32, WriteBEXTR>;
1328
+ defm BEXTR64 : bmi4VOp3_base<0xF7, "bextr{q}", GR64, i64mem,
1329
+ X86bextr, loadi64, WriteBEXTR>, REX_W;
1330
+ }
1331
+ let Predicates = [HasBMI2, NoEGPR], Defs = [EFLAGS] in {
1332
+ defm BZHI32 : bmi4VOp3_base<0xF5, "bzhi{l}", GR32, i32mem,
1333
+ X86bzhi, loadi32, WriteBZHI>;
1334
+ defm BZHI64 : bmi4VOp3_base<0xF5, "bzhi{q}", GR64, i64mem,
1335
+ X86bzhi, loadi64, WriteBZHI>, REX_W;
1336
+ }
1337
+ let Predicates = [HasBMI, HasEGPR], Defs = [EFLAGS] in {
1338
+ defm BEXTR32 : bmi4VOp3_base<0xF7, "bextr{l}", GR32, i32mem,
1339
+ X86bextr, loadi32, WriteBEXTR, "_EVEX">, EVEX;
1340
+ defm BEXTR64 : bmi4VOp3_base<0xF7, "bextr{q}", GR64, i64mem,
1341
+ X86bextr, loadi64, WriteBEXTR, "_EVEX">, EVEX, REX_W;
1342
+ }
1343
+ let Predicates = [HasBMI2, HasEGPR], Defs = [EFLAGS] in {
1344
+ defm BZHI32 : bmi4VOp3_base<0xF5, "bzhi{l}", GR32, i32mem,
1345
+ X86bzhi, loadi32, WriteBZHI, "_EVEX">, EVEX;
1346
+ defm BZHI64 : bmi4VOp3_base<0xF5, "bzhi{q}", GR64, i64mem,
1347
+ X86bzhi, loadi64, WriteBZHI, "_EVEX">, EVEX, REX_W;
1345
1348
}
1346
1349
1347
1350
def CountTrailingOnes : SDNodeXForm<imm, [{
@@ -1383,19 +1386,19 @@ let Predicates = [HasBMI2, NoTBM] in {
1383
1386
}
1384
1387
1385
1388
multiclass bmi_pdep_pext<string mnemonic, RegisterClass RC,
1386
- X86MemOperand x86memop, SDNode OpNode,
1387
- PatFrag ld_frag> {
1388
- def rr : I<0xF5, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, RC:$src2),
1389
- !strconcat(mnemonic, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
1390
- [(set RC:$dst, (OpNode RC:$src1, RC:$src2))]>,
1391
- VEX_4V, Sched<[WriteALU]>;
1392
- def rm : I<0xF5, MRMSrcMem, (outs RC:$dst), (ins RC:$src1, x86memop:$src2),
1393
- !strconcat(mnemonic, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
1394
- [(set RC:$dst, (OpNode RC:$src1, (ld_frag addr:$src2)))]>,
1395
- VEX_4V, Sched<[WriteALU.Folded, WriteALU.ReadAfterFold]>;
1396
- }
1397
-
1398
- let Predicates = [HasBMI2] in {
1389
+ X86MemOperand x86memop, SDPatternOperator OpNode,
1390
+ PatFrag ld_frag, string Suffix = "" > {
1391
+ def rr#Suffix : I<0xF5, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, RC:$src2),
1392
+ !strconcat(mnemonic, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
1393
+ [(set RC:$dst, (OpNode RC:$src1, RC:$src2))]>,
1394
+ VEX_4V, Sched<[WriteALU]>;
1395
+ def rm#Suffix : I<0xF5, MRMSrcMem, (outs RC:$dst), (ins RC:$src1, x86memop:$src2),
1396
+ !strconcat(mnemonic, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
1397
+ [(set RC:$dst, (OpNode RC:$src1, (ld_frag addr:$src2)))]>,
1398
+ VEX_4V, Sched<[WriteALU.Folded, WriteALU.ReadAfterFold]>;
1399
+ }
1400
+
1401
+ let Predicates = [HasBMI2, NoEGPR ] in {
1399
1402
defm PDEP32 : bmi_pdep_pext<"pdep{l}", GR32, i32mem,
1400
1403
X86pdep, loadi32>, T8XD;
1401
1404
defm PDEP64 : bmi_pdep_pext<"pdep{q}", GR64, i64mem,
@@ -1406,6 +1409,17 @@ let Predicates = [HasBMI2] in {
1406
1409
X86pext, loadi64>, T8XS, REX_W;
1407
1410
}
1408
1411
1412
+ let Predicates = [HasBMI2, HasEGPR] in {
1413
+ defm PDEP32 : bmi_pdep_pext<"pdep{l}", GR32, i32mem,
1414
+ X86pdep, loadi32, "_EVEX">, T8XD, EVEX;
1415
+ defm PDEP64 : bmi_pdep_pext<"pdep{q}", GR64, i64mem,
1416
+ X86pdep, loadi64, "_EVEX">, T8XD, REX_W, EVEX;
1417
+ defm PEXT32 : bmi_pdep_pext<"pext{l}", GR32, i32mem,
1418
+ X86pext, loadi32, "_EVEX">, T8XS, EVEX;
1419
+ defm PEXT64 : bmi_pdep_pext<"pext{q}", GR64, i64mem,
1420
+ X86pext, loadi64, "_EVEX">, T8XS, REX_W, EVEX;
1421
+ }
1422
+
1409
1423
//===----------------------------------------------------------------------===//
1410
1424
// Lightweight Profiling Instructions
1411
1425
0 commit comments