mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 02:47:02 +02:00
shader: implement V_SIN_F16 (#399)
Co-authored-by: nmzik <Nmzik@mail.ru>
This commit is contained in:
@@ -11896,6 +11896,7 @@ CoverageClass ClassifyOpcode(ShaderOpcode opcode,
|
||||
case Opcode::V_RSQ_F16:
|
||||
case Opcode::V_LOG_F16:
|
||||
case Opcode::V_EXP_F16:
|
||||
case Opcode::V_SIN_F16:
|
||||
case Opcode::V_COS_F16:
|
||||
case Opcode::V_MAD_MIXLO_F16:
|
||||
case Opcode::V_MAD_MIXHI_F16:
|
||||
@@ -14529,6 +14530,52 @@ TestCase VectorCosF16CapturedSdwaAndEdges() {
|
||||
return test;
|
||||
}
|
||||
|
||||
TestCase VectorSinF16SdwaAndEdges() {
|
||||
using O = ShaderOpcode;
|
||||
|
||||
std::vector<u32> code;
|
||||
AppendVMovLiteral(&code, 4, 0x34001234u); // high=+0.25h, low sentinel
|
||||
code.push_back(0x7e08c0f9u);
|
||||
code.push_back(0x00051504u); // v_sin_f16 v4.word1, v4.word1
|
||||
AppendVMovLiteral(&code, 5, 0x00008000u); // -0.0h
|
||||
code.push_back(EncodeVop1(0x60, 6, Vgpr(5)));
|
||||
AppendVMovLiteral(&code, 7, 0x00007bffu); // max finite
|
||||
code.push_back(EncodeVop1(0x60, 8, Vgpr(7)));
|
||||
AppendVMovLiteral(&code, 9, 0x0000fbffu); // minimum finite
|
||||
code.push_back(EncodeVop1(0x60, 10, Vgpr(9)));
|
||||
AppendVMovLiteral(&code, 11, 0x00007c00u); // +inf
|
||||
code.push_back(EncodeVop1(0x60, 12, Vgpr(11)));
|
||||
AppendVMovLiteral(&code, 13, 0x0000fc00u); // -inf
|
||||
code.push_back(EncodeVop1(0x60, 14, Vgpr(13)));
|
||||
AppendVMovLiteral(&code, 15, 0x00003800u); // +0.5h
|
||||
code.push_back(EncodeVop1(0x60, 16, Vgpr(15)));
|
||||
AppendVMovLiteral(&code, 17, 0x00003a00u); // +0.75h
|
||||
code.push_back(EncodeVop1(0x60, 18, Vgpr(17)));
|
||||
AppendVMovLiteral(&code, 19, 0x00003400u); // +0.25h
|
||||
AppendVop3(&code, 0x1e0, 20, Vgpr(19), 0);
|
||||
for (u32 i = 0; i < 9; i++) {
|
||||
AppendStoreVgpr(&code, 4 + i * 2, i);
|
||||
}
|
||||
AppendEnd(&code);
|
||||
|
||||
TestCase test{"VectorSinF16SdwaAndEdges",
|
||||
code,
|
||||
{},
|
||||
{0x3c001234u, 0x00008000u, 0x00000000u, 0x00000000u,
|
||||
0x0000fe00u, 0x0000fe00u, 0x00000000u, 0x0000bc00u,
|
||||
0x00003c00u},
|
||||
{O::V_MOV_B32, O::V_SIN_F16, O::BUFFER_STORE_DWORD,
|
||||
O::S_ENDPGM}};
|
||||
test.decoded_counts = {{"V_SIN_F16", 9},
|
||||
{"V_SIN_F16 v4.sdwa(sel=5,sext=0), "
|
||||
"v4.sdwa(sel=5,sext=0)",
|
||||
1}};
|
||||
test.ir_counts = {{" = FPSin ", 9}};
|
||||
test.required_spirv = {" Fract ", " Sin ", " PackHalf2x16 "};
|
||||
test.forbidden_spirv = {"OpCapability Float16"};
|
||||
return test;
|
||||
}
|
||||
|
||||
TestCase VectorWritelaneIgnoresExecMask() {
|
||||
using O = ShaderOpcode;
|
||||
|
||||
@@ -20729,6 +20776,7 @@ std::vector<TestCase> MakeCases() {
|
||||
AddCase(VectorMinMaxMed3F16Ops);
|
||||
AddCase(VectorSpecialF16Ops);
|
||||
AddCase(VectorCosF16CapturedSdwaAndEdges);
|
||||
AddCase(VectorSinF16SdwaAndEdges);
|
||||
AddCase(VectorWritelaneIgnoresExecMask);
|
||||
AddCase(VectorReadlaneFromInactiveWrittenLane);
|
||||
AddCase(VectorLaneWave32RuntimeSelectorWraps);
|
||||
|
||||
@@ -4047,6 +4047,22 @@ void TestNewShaderDecoderArchitecture() {
|
||||
!cos_f16.src0.absolute,
|
||||
"decoder rejected the captured VOP1 SDWA V_COS_F16 instruction");
|
||||
|
||||
const uint32_t sin_f16_code[] = {0x7e08c0f9u, 0x00051504u};
|
||||
Instruction sin_f16;
|
||||
Check(DecodeInstruction(sin_f16_code, 0u, sin_f16, &error), error.c_str());
|
||||
Check(sin_f16.family == Family::VOP1 &&
|
||||
sin_f16.opcode == Opcode::V_SIN_F16 &&
|
||||
sin_f16.word_count == 2u && sin_f16.src_count == 1u &&
|
||||
sin_f16.dst.kind == OperandKind::Vgpr && sin_f16.dst.reg == 4u &&
|
||||
sin_f16.dst.sdwa_sel == 5u &&
|
||||
sin_f16.dst.sdwa_dst_unused == 2u && !sin_f16.dst.clamp &&
|
||||
sin_f16.dst.omod == 0u &&
|
||||
sin_f16.src0.kind == OperandKind::Vgpr &&
|
||||
sin_f16.src0.reg == 4u && sin_f16.src0.sdwa_sel == 5u &&
|
||||
!sin_f16.src0.sdwa_sext && !sin_f16.src0.negate &&
|
||||
!sin_f16.src0.absolute,
|
||||
"decoder rejected the VOP1 SDWA V_SIN_F16 instruction");
|
||||
|
||||
const uint32_t literal_code[] = {EncodeVop1(0x01, 2, 255u), 0x12345678u};
|
||||
Instruction literal;
|
||||
Check(DecodeInstruction(literal_code, 0u, literal, &error), error.c_str());
|
||||
|
||||
Reference in New Issue
Block a user