Specific DXIL disassembly handling for QuadVote

After
  bool _QuadVote2 = QuadAny(_32);
  bool _QuadVote = QuadAll(_37);

Before
  bool _QuadVote2 = QuadVote(/*cond*/ _32, /*op*/ 0);
  bool _QuadVote = QuadVote(/*cond*/ _37, /*op*/ 1);
This commit is contained in:
Jake Turner
2025-04-12 11:23:48 +01:00
parent 89d131ab3a
commit 4c72fdfd8a
3 changed files with 35 additions and 0 deletions
@@ -663,6 +663,12 @@ enum class QuadOpKind : uint32_t
// horizontal and vertical direction
};
enum class QuadVoteOpKind : uint32_t
{
All = 1, // true if all conditions are true in this quad
Any = 0, // true if any condition is true in this quad
};
// Packing/unpacking intrinsics
enum class UnpackMode : uint32_t
{
@@ -1855,6 +1861,7 @@ DECLARE_STRINGISE_TYPE(DXIL::WaveBitOpCode);
DECLARE_STRINGISE_TYPE(DXIL::WaveMultiPrefixOpCode);
DECLARE_STRINGISE_TYPE(DXIL::SignedOpKind);
DECLARE_STRINGISE_TYPE(DXIL::QuadOpKind);
DECLARE_STRINGISE_TYPE(DXIL::QuadVoteOpKind);
DECLARE_STRINGISE_TYPE(DXIL::PackMode);
DECLARE_STRINGISE_TYPE(DXIL::UnpackMode);
DECLARE_STRINGISE_TYPE(DXIL::Operation);
@@ -4324,6 +4324,23 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
}
break;
}
case DXOp::QuadVote:
{
// SM6.7 QuadVote(cond,op)
QuadVoteOpKind quadVoteOpKind;
if(getival<QuadVoteOpKind>(inst.args[2], quadVoteOpKind))
{
lineStr += "Quad" + ToStr(quadVoteOpKind);
lineStr += "(";
lineStr += GetArgId(inst, 1);
lineStr += ")";
}
else
{
showDxFuncName = true;
}
break;
}
case DXOp::Dot2:
case DXOp::Dot3:
case DXOp::Dot4:
@@ -139,6 +139,17 @@ rdcstr DoStringise(const DXIL::QuadOpKind &el)
END_ENUM_STRINGISE();
};
template <>
rdcstr DoStringise(const DXIL::QuadVoteOpKind &el)
{
BEGIN_ENUM_STRINGISE(DXIL::QuadVoteOpKind)
{
STRINGISE_ENUM_CLASS(All)
STRINGISE_ENUM_CLASS(Any)
}
END_ENUM_STRINGISE();
};
template <>
rdcstr DoStringise(const DXIL::PackMode &el)
{