Specific DXIL disassembly handling for WaveMultiPrefixOp

After
int _WaveMultiPrefixOp12 = WaveMultiPrefixSum(_WaveGetLaneIndex, {_92,_93,_94,_95}); // Unsigned
int _WaveMultiPrefixOp10 = WaveMultiPrefixBitAnd(_127, {_117,_118,_119,_120}); // Signed
int _WaveMultiPrefixOp9 = WaveMultiPrefixBitOr(_WaveGetLaneIndex, {_117,_118,_119,_120}); // Signed
int _WaveMultiPrefixOp = WaveMultiPrefixBitXor(_WaveGetLaneIndex, {_117,_118,_119,_120}); // Signed
int _WaveMultiPrefixOp11 = WaveMultiPrefixProduct(_WaveGetLaneIndex, {_92,_93,_94,_95}); // Unsigned

Before
int _WaveMultiPrefixOp12 = WaveMultiPrefixOp(/*value*/ _WaveGetLaneIndex, /*mask0*/ _92, /*mask1*/ _93, /*mask2*/ _94, /*mask3*/ _95, /*op*/ 0, /*sop*/ 1);
int _WaveMultiPrefixOp10 = WaveMultiPrefixOp(/*value*/ _127, /*mask0*/ _117, /*mask1*/ _118, /*mask2*/ _119, /*mask3*/ _120, /*op*/ 1, /*sop*/ 0);
int _WaveMultiPrefixOp9 = WaveMultiPrefixOp(/*value*/ _WaveGetLaneIndex, /*mask0*/ _117, /*mask1*/ _118, /*mask2*/ _119, /*mask3*/ _120, /*op*/ 2, /*sop*/ 0);
int _WaveMultiPrefixOp = WaveMultiPrefixOp(/*value*/ _WaveGetLaneIndex, /*mask0*/ _117, /*mask1*/ _118, /*mask2*/ _119, /*mask3*/ _120, /*op*/ 3, /*sop*/ 0);
int _WaveMultiPrefixOp11 = WaveMultiPrefixOp(/*value*/ _WaveGetLaneIndex, /*mask0*/ _92, /*mask1*/ _93, /*mask2*/ _94, /*mask3*/ _95, /*op*/ 4, /*sop*/ 1);
This commit is contained in:
Jake Turner
2025-04-10 07:40:45 +01:00
parent def9422163
commit fcb688124f
3 changed files with 51 additions and 0 deletions
@@ -1852,6 +1852,7 @@ DECLARE_STRINGISE_TYPE(DXIL::InstructionFlags);
DECLARE_STRINGISE_TYPE(DXIL::AtomicBinOpCode);
DECLARE_STRINGISE_TYPE(DXIL::WaveOpCode);
DECLARE_STRINGISE_TYPE(DXIL::WaveBitOpCode);
DECLARE_STRINGISE_TYPE(DXIL::WaveMultiPrefixOpCode);
DECLARE_STRINGISE_TYPE(DXIL::SignedOpKind);
DECLARE_STRINGISE_TYPE(DXIL::QuadOpKind);
DECLARE_STRINGISE_TYPE(DXIL::PackMode);
@@ -4198,6 +4198,42 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
}
break;
}
case DXOp::WaveMultiPrefixOp:
{
// WaveMultiPrefixOp(value,mask0,mask1,mask2,mask3,op,sop)
SignedOpKind sop;
if(getival<SignedOpKind>(inst.args[7], sop))
commentStr += ToStr(sop);
WaveMultiPrefixOpCode waveMultiOpCode;
if(getival<WaveMultiPrefixOpCode>(inst.args[6], waveMultiOpCode))
{
lineStr += "WaveMultiPrefix";
if((waveMultiOpCode == WaveMultiPrefixOpCode::And) ||
(waveMultiOpCode == WaveMultiPrefixOpCode::Or) ||
(waveMultiOpCode == WaveMultiPrefixOpCode::Xor))
lineStr += "Bit";
lineStr += ToStr(waveMultiOpCode);
lineStr += "(";
lineStr += GetArgId(inst, 1);
lineStr += ", {";
lineStr += GetArgId(inst, 2);
lineStr += ",";
lineStr += GetArgId(inst, 3);
lineStr += ",";
lineStr += GetArgId(inst, 4);
lineStr += ",";
lineStr += GetArgId(inst, 5);
lineStr += "}";
lineStr += ")";
}
else
{
showDxFuncName = true;
}
break;
}
case DXOp::Pack4x8:
{
// Pack4x8(packMode,x,y,z,w)
@@ -864,3 +864,17 @@ rdcstr DoStringise(const DXIL::WaveBitOpCode &el)
}
END_ENUM_STRINGISE();
}
template <>
rdcstr DoStringise(const DXIL::WaveMultiPrefixOpCode &el)
{
BEGIN_ENUM_STRINGISE(DXIL::WaveMultiPrefixOpCode)
{
STRINGISE_ENUM_CLASS(Sum)
STRINGISE_ENUM_CLASS(And)
STRINGISE_ENUM_CLASS(Or)
STRINGISE_ENUM_CLASS(Xor)
STRINGISE_ENUM_CLASS(Product)
}
END_ENUM_STRINGISE();
}