@@ -1212,36 +1212,33 @@ let Predicates = [HasBMI], Defs = [EFLAGS] in {
1212
1212
(implicit EFLAGS)]>, TB, XS, Sched<[WriteTZCNTLd]>;
1213
1213
}
1214
1214
1215
- multiclass bmi_bls<string mnemonic, Format RegMRM, Format MemMRM,
1216
- RegisterClass RC, X86MemOperand x86memop,
1217
- X86FoldableSchedWrite sched, string Suffix = ""> {
1218
- let hasSideEffects = 0 in {
1219
- def rr#Suffix : I<0xF3, RegMRM, (outs RC:$dst), (ins RC:$src),
1220
- !strconcat(mnemonic, "\t{$src, $dst|$dst, $src}"), []>,
1221
- T8, VEX, VVVV, Sched<[sched]>;
1222
- let mayLoad = 1 in
1223
- def rm#Suffix : I<0xF3, MemMRM, (outs RC:$dst), (ins x86memop:$src),
1224
- !strconcat(mnemonic, "\t{$src, $dst|$dst, $src}"), []>,
1225
- T8, VEX, VVVV, Sched<[sched.Folded]>;
1226
- }
1215
+ multiclass Bls<string m, Format RegMRM, Format MemMRM, X86TypeInfo t, string Suffix = ""> {
1216
+ let SchedRW = [WriteBLS] in {
1217
+ def rr#Suffix : UnaryOpR<0xF3, RegMRM, m, unaryop_ndd_args, t,
1218
+ (outs t.RegClass:$dst), []>, T8, VVVV;
1219
+ }
1220
+
1221
+ let SchedRW = [WriteBLS.Folded] in
1222
+ def rm#Suffix : UnaryOpM<0xF3, MemMRM, m, unaryop_ndd_args, t,
1223
+ (outs t.RegClass:$dst), []>, T8, VVVV;
1227
1224
}
1228
1225
1229
- let Predicates = [HasBMI, NoEGPR ], Defs = [EFLAGS] in {
1230
- defm BLSR32 : bmi_bls <"blsr{l} ", MRM1r, MRM1m, GR32, i32mem, WriteBLS> ;
1231
- defm BLSR64 : bmi_bls <"blsr{q} ", MRM1r, MRM1m, GR64, i64mem, WriteBLS >, REX_W ;
1232
- defm BLSMSK32 : bmi_bls <"blsmsk{l} ", MRM2r, MRM2m, GR32, i32mem, WriteBLS> ;
1233
- defm BLSMSK64 : bmi_bls <"blsmsk{q} ", MRM2r, MRM2m, GR64, i64mem, WriteBLS >, REX_W ;
1234
- defm BLSI32 : bmi_bls <"blsi{l} ", MRM3r, MRM3m, GR32, i32mem, WriteBLS> ;
1235
- defm BLSI64 : bmi_bls <"blsi{q} ", MRM3r, MRM3m, GR64, i64mem, WriteBLS >, REX_W ;
1226
+ let Predicates = [HasBMI], Defs = [EFLAGS] in {
1227
+ defm BLSR32 : Bls <"blsr", MRM1r, MRM1m, Xi32>, VEX ;
1228
+ defm BLSR64 : Bls <"blsr", MRM1r, MRM1m, Xi64 >, VEX ;
1229
+ defm BLSMSK32 : Bls <"blsmsk", MRM2r, MRM2m, Xi32>, VEX ;
1230
+ defm BLSMSK64 : Bls <"blsmsk", MRM2r, MRM2m, Xi64 >, VEX ;
1231
+ defm BLSI32 : Bls <"blsi", MRM3r, MRM3m, Xi32>, VEX ;
1232
+ defm BLSI64 : Bls <"blsi", MRM3r, MRM3m, Xi64 >, VEX ;
1236
1233
}
1237
1234
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;
1235
+ let Predicates = [HasBMI, In64BitMode ], Defs = [EFLAGS] in {
1236
+ defm BLSR32 : Bls <"blsr", MRM1r, MRM1m, Xi32 , "_EVEX">, EVEX;
1237
+ defm BLSR64 : Bls <"blsr", MRM1r, MRM1m, Xi64, "_EVEX">, EVEX;
1238
+ defm BLSMSK32 : Bls <"blsmsk", MRM2r, MRM2m, Xi32 , "_EVEX">, EVEX;
1239
+ defm BLSMSK64 : Bls <"blsmsk", MRM2r, MRM2m, Xi64, "_EVEX">, EVEX;
1240
+ defm BLSI32 : Bls <"blsi", MRM3r, MRM3m, Xi32 , "_EVEX">, EVEX;
1241
+ defm BLSI64 : Bls <"blsi", MRM3r, MRM3m, Xi64, "_EVEX">, EVEX;
1245
1242
}
1246
1243
1247
1244
let Predicates = [HasBMI] in {
@@ -1281,50 +1278,35 @@ let Predicates = [HasBMI] in {
1281
1278
(BLSI64rr GR64:$src)>;
1282
1279
}
1283
1280
1284
- multiclass bmi4VOp3_base<bits<8> opc, string mnemonic, RegisterClass RC,
1285
- X86MemOperand x86memop, SDPatternOperator OpNode,
1286
- PatFrag ld_frag, X86FoldableSchedWrite Sched,
1287
- string Suffix = ""> {
1288
- def rr#Suffix : I<opc, MRMSrcReg4VOp3, (outs RC:$dst), (ins RC:$src1, RC:$src2),
1289
- !strconcat(mnemonic, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
1290
- [(set RC:$dst, (OpNode RC:$src1, RC:$src2)), (implicit EFLAGS)]>,
1291
- T8, VEX, Sched<[Sched]>;
1292
- let mayLoad = 1 in
1293
- def rm#Suffix : I<opc, MRMSrcMem4VOp3, (outs RC:$dst), (ins x86memop:$src1, RC:$src2),
1294
- !strconcat(mnemonic, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
1295
- [(set RC:$dst, (OpNode (ld_frag addr:$src1), RC:$src2)),
1296
- (implicit EFLAGS)]>, T8, VEX,
1297
- Sched<[Sched.Folded,
1298
- // x86memop:$src1
1299
- ReadDefault, ReadDefault, ReadDefault, ReadDefault,
1300
- ReadDefault,
1301
- // RC:$src2
1302
- Sched.ReadAfterFold]>;
1281
+ multiclass Bmi4VOp3<bits<8> o, string m, X86TypeInfo t, SDPatternOperator node,
1282
+ X86FoldableSchedWrite sched, string Suffix = ""> {
1283
+ let SchedRW = [sched], Form = MRMSrcReg4VOp3 in
1284
+ def rr#Suffix : BinOpRR<o, m, binop_ndd_args, t, (outs t.RegClass:$dst),
1285
+ [(set t.RegClass:$dst, EFLAGS,
1286
+ (node t.RegClass:$src1, t.RegClass:$src2))]>, T8;
1287
+ let SchedRW = [sched.Folded,
1288
+ ReadDefault, ReadDefault, ReadDefault, ReadDefault, ReadDefault,
1289
+ sched.ReadAfterFold], Form = MRMSrcMem4VOp3 in
1290
+ def rm#Suffix : BinOpMR<o, m, binop_ndd_args, t, (outs t.RegClass:$dst),
1291
+ [(set t.RegClass:$dst, EFLAGS, (node (t.LoadNode addr:$src1),
1292
+ t.RegClass:$src2))]>, T8;
1303
1293
}
1304
1294
1305
1295
let Predicates = [HasBMI, NoEGPR], Defs = [EFLAGS] in {
1306
- defm BEXTR32 : bmi4VOp3_base<0xF7, "bextr{l}", GR32, i32mem,
1307
- X86bextr, loadi32, WriteBEXTR>;
1308
- defm BEXTR64 : bmi4VOp3_base<0xF7, "bextr{q}", GR64, i64mem,
1309
- X86bextr, loadi64, WriteBEXTR>, REX_W;
1296
+ defm BEXTR32 : Bmi4VOp3<0xF7, "bextr", Xi32, X86bextr, WriteBEXTR>, VEX;
1297
+ defm BEXTR64 : Bmi4VOp3<0xF7, "bextr", Xi64, X86bextr, WriteBEXTR>, VEX;
1310
1298
}
1311
1299
let Predicates = [HasBMI2, NoEGPR], Defs = [EFLAGS] in {
1312
- defm BZHI32 : bmi4VOp3_base<0xF5, "bzhi{l}", GR32, i32mem,
1313
- X86bzhi, loadi32, WriteBZHI>;
1314
- defm BZHI64 : bmi4VOp3_base<0xF5, "bzhi{q}", GR64, i64mem,
1315
- X86bzhi, loadi64, WriteBZHI>, REX_W;
1316
- }
1317
- let Predicates = [HasBMI, HasEGPR], Defs = [EFLAGS] in {
1318
- defm BEXTR32 : bmi4VOp3_base<0xF7, "bextr{l}", GR32, i32mem,
1319
- X86bextr, loadi32, WriteBEXTR, "_EVEX">, EVEX;
1320
- defm BEXTR64 : bmi4VOp3_base<0xF7, "bextr{q}", GR64, i64mem,
1321
- X86bextr, loadi64, WriteBEXTR, "_EVEX">, EVEX, REX_W;
1322
- }
1323
- let Predicates = [HasBMI2, HasEGPR], Defs = [EFLAGS] in {
1324
- defm BZHI32 : bmi4VOp3_base<0xF5, "bzhi{l}", GR32, i32mem,
1325
- X86bzhi, loadi32, WriteBZHI, "_EVEX">, EVEX;
1326
- defm BZHI64 : bmi4VOp3_base<0xF5, "bzhi{q}", GR64, i64mem,
1327
- X86bzhi, loadi64, WriteBZHI, "_EVEX">, EVEX, REX_W;
1300
+ defm BZHI32 : Bmi4VOp3<0xF5, "bzhi", Xi32, X86bzhi, WriteBZHI>, VEX;
1301
+ defm BZHI64 : Bmi4VOp3<0xF5, "bzhi", Xi64, X86bzhi, WriteBZHI>, VEX;
1302
+ }
1303
+ let Predicates = [HasBMI, HasEGPR, In64BitMode], Defs = [EFLAGS] in {
1304
+ defm BEXTR32 : Bmi4VOp3<0xF7, "bextr", Xi32, X86bextr, WriteBEXTR, "_EVEX">, EVEX;
1305
+ defm BEXTR64 : Bmi4VOp3<0xF7, "bextr", Xi64, X86bextr, WriteBEXTR, "_EVEX">, EVEX;
1306
+ }
1307
+ let Predicates = [HasBMI2, HasEGPR, In64BitMode], Defs = [EFLAGS] in {
1308
+ defm BZHI32 : Bmi4VOp3<0xF5, "bzhi", Xi32, X86bzhi, WriteBZHI, "_EVEX">, EVEX;
1309
+ defm BZHI64 : Bmi4VOp3<0xF5, "bzhi", Xi64, X86bzhi, WriteBZHI, "_EVEX">, EVEX;
1328
1310
}
1329
1311
1330
1312
def CountTrailingOnes : SDNodeXForm<imm, [{
0 commit comments