Skip to content

Commit affd9e8

Browse files
authored
AMDGPU: Break vop3p handling out of vop3 base patterns (#77472)
Add the vop3p op_sel fields in getInsVOP3P instead of getInsVOP3Base. Also start using defvar for some of the intermediate fields. let overrides of all the visible fields are really difficult to follow.
1 parent c19995e commit affd9e8

File tree

2 files changed

+20
-15
lines changed

2 files changed

+20
-15
lines changed

llvm/lib/Target/AMDGPU/SIInstrInfo.td

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1773,28 +1773,27 @@ class getIns64 <RegisterOperand Src0RC, RegisterOperand Src1RC,
17731773
class getInsVOP3Base<RegisterOperand Src0RC, RegisterOperand Src1RC,
17741774
RegisterOperand Src2RC, int NumSrcArgs,
17751775
bit HasClamp, bit HasModifiers, bit HasSrc2Mods, bit HasOMod,
1776-
Operand Src0Mod, Operand Src1Mod, Operand Src2Mod, bit HasOpSel,
1777-
bit IsVOP3P> {
1776+
Operand Src0Mod, Operand Src1Mod, Operand Src2Mod, bit HasOpSel> {
17781777
// getInst64 handles clamp and omod. implicit mutex between vop3p and omod
17791778
dag base = getIns64 <Src0RC, Src1RC, Src2RC, NumSrcArgs,
17801779
HasClamp, HasModifiers, HasSrc2Mods, HasOMod,
17811780
Src0Mod, Src1Mod, Src2Mod>.ret;
17821781
dag opsel = (ins op_sel0:$op_sel);
1783-
dag vop3pOpsel = (ins op_sel_hi0:$op_sel_hi);
1784-
dag vop3pFields = !con(!if(HasOpSel, vop3pOpsel, (ins)), (ins neg_lo0:$neg_lo, neg_hi0:$neg_hi));
1785-
1786-
dag ret = !con(base,
1787-
!if(HasOpSel, opsel,(ins)),
1788-
!if(IsVOP3P, vop3pFields,(ins)));
1782+
dag ret = !con(base, !if(HasOpSel, opsel, (ins)));
17891783
}
17901784

17911785
class getInsVOP3P <RegisterOperand Src0RC, RegisterOperand Src1RC,
17921786
RegisterOperand Src2RC, int NumSrcArgs, bit HasClamp, bit HasOpSel,
17931787
Operand Src0Mod, Operand Src1Mod, Operand Src2Mod> {
1794-
dag ret = getInsVOP3Base<Src0RC, Src1RC, Src2RC, NumSrcArgs,
1788+
dag base = getInsVOP3Base<Src0RC, Src1RC, Src2RC, NumSrcArgs,
17951789
HasClamp, 1/*HasModifiers*/, 1/*HasSrc2Mods*/,
1796-
0/*HasOMod*/, Src0Mod, Src1Mod, Src2Mod,
1797-
HasOpSel, 1/*IsVOP3P*/>.ret;
1790+
0/*HasOMod*/, Src0Mod, Src1Mod, Src2Mod, HasOpSel>.ret;
1791+
1792+
dag vop3pOpsel = (ins op_sel_hi0:$op_sel_hi);
1793+
dag vop3p_neg = (ins neg_lo0:$neg_lo, neg_hi0:$neg_hi);
1794+
1795+
dag vop3pFields = !con(!if(HasOpSel, vop3pOpsel, (ins)), vop3p_neg);
1796+
dag ret = !con(base, vop3pFields);
17981797
}
17991798

18001799
class getInsVOP3OpSel <RegisterOperand Src0RC, RegisterOperand Src1RC,
@@ -1804,7 +1803,7 @@ class getInsVOP3OpSel <RegisterOperand Src0RC, RegisterOperand Src1RC,
18041803
dag ret = getInsVOP3Base<Src0RC, Src1RC,
18051804
Src2RC, NumSrcArgs,
18061805
HasClamp, 1/*HasModifiers*/, 1/*HasSrc2Mods*/, HasOMod,
1807-
Src0Mod, Src1Mod, Src2Mod, 1/*HasOpSel*/, 0>.ret;
1806+
Src0Mod, Src1Mod, Src2Mod, /*HasOpSel=*/1>.ret;
18081807
}
18091808

18101809
class getInsDPPBase <RegisterOperand OldRC, RegisterClass Src0RC, RegisterClass Src1RC,
@@ -2390,9 +2389,15 @@ class VOPProfile <list<ValueType> _ArgVT, bit _EnableClamp = 0> {
23902389
field dag InsDPP8 = getInsDPP8<DstRCDPP, Src0DPP, Src1DPP, Src2DPP,
23912390
NumSrcArgs, HasModifiers,
23922391
Src0ModDPP, Src1ModDPP, Src2ModDPP>.ret;
2393-
field dag InsVOP3Base = getInsVOP3Base<Src0VOP3DPP, Src1VOP3DPP,
2392+
defvar InsVOP3DPPBase = getInsVOP3Base<Src0VOP3DPP, Src1VOP3DPP,
23942393
Src2VOP3DPP, NumSrcArgs, HasClamp, HasModifiers, HasSrc2Mods, HasOMod,
2395-
Src0ModVOP3DPP, Src1ModVOP3DPP, Src2ModVOP3DPP, HasOpSel, IsVOP3P>.ret;
2394+
Src0ModVOP3DPP, Src1ModVOP3DPP, Src2ModVOP3DPP, HasOpSel>.ret;
2395+
defvar InsVOP3PDPPBase = getInsVOP3P<Src0VOP3DPP, Src1VOP3DPP,
2396+
Src2VOP3DPP, NumSrcArgs, HasClamp, HasOpSel,
2397+
Src0ModVOP3DPP, Src1ModVOP3DPP, Src2ModVOP3DPP>.ret;
2398+
2399+
field dag InsVOP3Base = !if(IsVOP3P, InsVOP3PDPPBase, InsVOP3DPPBase);
2400+
23962401
field dag InsVOP3DPP = getInsVOP3DPP<InsVOP3Base, DstRCVOP3DPP, NumSrcArgs>.ret;
23972402
field dag InsVOP3DPP16 = getInsVOP3DPP16<InsVOP3Base, DstRCVOP3DPP, NumSrcArgs>.ret;
23982403
field dag InsVOP3DPP8 = getInsVOP3DPP8<InsVOP3Base, DstRCVOP3DPP, NumSrcArgs>.ret;

llvm/lib/Target/AMDGPU/VOP2Instructions.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ class VOP_MAC <ValueType vt0, ValueType vt1=vt0> : VOPProfile <[vt0, vt1, vt1, v
437437
let InsDPP16 = !con(InsDPP, (ins FI:$fi));
438438
let InsVOP3Base = getInsVOP3Base<Src0VOP3DPP, Src1VOP3DPP, RegisterOperand<VGPR_32>, 3,
439439
0, HasModifiers, HasModifiers, HasOMod,
440-
Src0ModVOP3DPP, Src1ModVOP3DPP, Src2Mod, HasOpSel, 0/*IsVOP3P*/>.ret;
440+
Src0ModVOP3DPP, Src1ModVOP3DPP, Src2Mod, HasOpSel>.ret;
441441
// We need a dummy src2 tied to dst to track the use of that register for s_delay_alu
442442
let InsVOPDX = (ins Src0RC32:$src0X, Src1RC32:$vsrc1X, VGPRSrc_32:$src2X);
443443
let InsVOPDXDeferred =

0 commit comments

Comments
 (0)