Skip to content

Commit 89ddd94

Browse files
committed
[X86][NFC] Simplify definitions of BLSR/BLSMSK/BEXTR/BZHI
This patch is to extract the NFC in #76709 into a separate commit.
1 parent 3bcee85 commit 89ddd94

File tree

1 file changed

+47
-65
lines changed

1 file changed

+47
-65
lines changed

llvm/lib/Target/X86/X86InstrMisc.td

+47-65
Original file line numberDiff line numberDiff line change
@@ -1212,36 +1212,33 @@ let Predicates = [HasBMI], Defs = [EFLAGS] in {
12121212
(implicit EFLAGS)]>, TB, XS, Sched<[WriteTZCNTLd]>;
12131213
}
12141214

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;
12271224
}
12281225

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;
12361233
}
12371234

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;
12451242
}
12461243

12471244
let Predicates = [HasBMI] in {
@@ -1281,50 +1278,35 @@ let Predicates = [HasBMI] in {
12811278
(BLSI64rr GR64:$src)>;
12821279
}
12831280

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;
13031293
}
13041294

13051295
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;
13101298
}
13111299
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;
13281310
}
13291311

13301312
def CountTrailingOnes : SDNodeXForm<imm, [{

0 commit comments

Comments
 (0)