DXIL Debugger support for DXOp::Dot4AddI8Packed, DXOp::Dot4AddU8Packed

This commit is contained in:
Jake Turner
2024-12-15 15:38:28 +00:00
parent 219474f7e0
commit 3da14721a1
2 changed files with 41 additions and 8 deletions
+41 -6
View File
@@ -3627,6 +3627,47 @@ bool ThreadState::ExecuteInstruction(DebugAPIWrapper *apiWrapper,
result.value.f32v[0] = acc + ax * bx + ay * by;
break;
}
case DXOp::Dot4AddI8Packed:
case DXOp::Dot4AddU8Packed:
{
// SM6.4
// Dot4AddI8Packed(acc,a,b)
// signed dot product of 4 x i8 vectors packed into i32, with accumulate to i32
// Dot4AddU8Packed(acc,a,b)
// unsigned dot product of 4 x u8 vectors packed into i32, with accumulate to i32
RDCASSERTEQUAL(inst.args[1]->type->type, Type::TypeKind::Scalar);
RDCASSERTEQUAL(inst.args[1]->type->scalarType, Type::Int);
RDCASSERTEQUAL(inst.args[1]->type->bitWidth, 32);
RDCASSERTEQUAL(inst.args[2]->type->type, Type::TypeKind::Scalar);
RDCASSERTEQUAL(inst.args[2]->type->scalarType, Type::Int);
RDCASSERTEQUAL(inst.args[2]->type->bitWidth, 32);
RDCASSERTEQUAL(inst.args[3]->type->type, Type::TypeKind::Scalar);
RDCASSERTEQUAL(inst.args[3]->type->scalarType, Type::Int);
RDCASSERTEQUAL(inst.args[3]->type->bitWidth, 32);
ShaderVariable acc;
RDCASSERT(GetShaderVariable(inst.args[1], opCode, dxOpCode, acc));
ShaderVariable a;
RDCASSERT(GetShaderVariable(inst.args[2], opCode, dxOpCode, a));
ShaderVariable b;
RDCASSERT(GetShaderVariable(inst.args[3], opCode, dxOpCode, b));
if(dxOpCode == DXOp::Dot4AddI8Packed)
{
int32_t res = acc.value.s32v[0];
for(uint32_t col = 0; col < 4; ++col)
res += (int32_t)a.value.s8v[col] * (int32_t)b.value.s8v[col];
result.value.s32v[0] = res;
}
else
{
uint32_t res = acc.value.u32v[0];
for(uint32_t col = 0; col < 4; ++col)
res += (uint32_t)a.value.u8v[col] * (uint32_t)b.value.u8v[col];
result.value.u32v[0] = res;
}
break;
}
// Likely to implement when required
// SM6.7
case DXOp::QuadVote:
@@ -3650,12 +3691,6 @@ bool ThreadState::ExecuteInstruction(DebugAPIWrapper *apiWrapper,
// For UAV buffer with counter: must be RWRawBuffer
// atomically increments/decrements the hidden 32-bit counter stored with a Count or Append UAV
// SM6.4
case DXOp::Dot4AddI8Packed:
// signed dot product of 4 x i8 vectors packed into i32, with accumulate to i32
case DXOp::Dot4AddU8Packed:
// unsigned dot product of 4 x u8 vectors packed into i32, with accumulate to i32
// SM6.6
case DXOp::Unpack4x8:
// unpacks 4 8-bit signed or unsigned values into int32 or int16 vector
@@ -1876,8 +1876,6 @@ rdcstr Program::GetDebugStatus()
case DXOp::CallShader:
case DXOp::CreateHandleForLib:
case DXOp::PrimitiveIndex:
case DXOp::Dot4AddI8Packed:
case DXOp::Dot4AddU8Packed:
case DXOp::WaveMatch:
case DXOp::WaveMultiPrefixOp:
case DXOp::WaveMultiPrefixBitCount: