diff options
| author | bunnei <bunneidev@gmail.com> | 2019-04-19 21:31:52 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-04-19 21:31:52 -0400 |
| commit | 650d9b1044352139cd7718a097fc4822e47ac3b0 (patch) | |
| tree | db5f74b09194640b25026e6de0e673baf2e2b230 /src/video_core/shader/decode/hfma2.cpp | |
| parent | 62c2404d3c2dc6b7684036e3c2477827aae7142a (diff) | |
| parent | ef8245bed21dbe9b496f7d06b0e1eb487e553dbf (diff) | |
Merge pull request #2409 from ReinUsesLisp/half-floats
shader_ir/decode: Miscellaneous fixes to half-float decompilation
Diffstat (limited to 'src/video_core/shader/decode/hfma2.cpp')
| -rw-r--r-- | src/video_core/shader/decode/hfma2.cpp | 12 |
1 files changed, 4 insertions, 8 deletions
diff --git a/src/video_core/shader/decode/hfma2.cpp b/src/video_core/shader/decode/hfma2.cpp index 7a07c5ec6..5c1becce5 100644 --- a/src/video_core/shader/decode/hfma2.cpp +++ b/src/video_core/shader/decode/hfma2.cpp @@ -27,10 +27,6 @@ u32 ShaderIR::DecodeHfma2(NodeBlock& bb, u32 pc) { } constexpr auto identity = HalfType::H0_H1; - - const HalfType type_a = instr.hfma2.type_a; - const Node op_a = GetRegister(instr.gpr8); - bool neg_b{}, neg_c{}; auto [saturate, type_b, op_b, type_c, op_c] = [&]() -> std::tuple<bool, HalfType, Node, HalfType, Node> { @@ -62,11 +58,11 @@ u32 ShaderIR::DecodeHfma2(NodeBlock& bb, u32 pc) { }(); UNIMPLEMENTED_IF_MSG(saturate, "HFMA2 saturation is not implemented"); - op_b = GetOperandAbsNegHalf(op_b, false, neg_b); - op_c = GetOperandAbsNegHalf(op_c, false, neg_c); + const Node op_a = UnpackHalfFloat(GetRegister(instr.gpr8), instr.hfma2.type_a); + op_b = GetOperandAbsNegHalf(UnpackHalfFloat(op_b, type_b), false, neg_b); + op_c = GetOperandAbsNegHalf(UnpackHalfFloat(op_c, type_c), false, neg_c); - MetaHalfArithmetic meta{true, {type_a, type_b, type_c}}; - Node value = Operation(OperationCode::HFma, meta, op_a, op_b, op_c); + Node value = Operation(OperationCode::HFma, PRECISE, op_a, op_b, op_c); value = HalfMerge(GetRegister(instr.gpr0), value, instr.hfma2.merge); SetRegister(bb, instr.gpr0, value); |
