summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-02-21 23:42:38 -0300
committerGravatar ameerj2021-07-22 21:51:22 -0400
commit274897dfd59b4d08029ab7e93be4f84654abcdc8 (patch)
tree083336a4d665476a87b888368878a311a7edab2a /src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp
parentshader: Rename, implement FADD.SAT and P2R (imm) (diff)
downloadyuzu-274897dfd59b4d08029ab7e93be4f84654abcdc8.tar.gz
yuzu-274897dfd59b4d08029ab7e93be4f84654abcdc8.tar.xz
yuzu-274897dfd59b4d08029ab7e93be4f84654abcdc8.zip
spirv: Fixes and Intel specific workarounds
Diffstat (limited to 'src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp')
-rw-r--r--src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp
index be17bb0d9..165d475b9 100644
--- a/src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp
+++ b/src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp
@@ -83,9 +83,12 @@ IR::U32 TranslatorVisitor::GetImm20(u64 insn) {
83 BitField<20, 19, u64> value; 83 BitField<20, 19, u64> value;
84 BitField<56, 1, u64> is_negative; 84 BitField<56, 1, u64> is_negative;
85 } const imm{insn}; 85 } const imm{insn};
86 const s32 positive_value{static_cast<s32>(imm.value)}; 86 if (imm.is_negative != 0) {
87 const s32 value{imm.is_negative != 0 ? -positive_value : positive_value}; 87 const s64 raw{static_cast<s64>(imm.value)};
88 return ir.Imm32(value); 88 return ir.Imm32(static_cast<s32>(-(1LL << 19) + raw));
89 } else {
90 return ir.Imm32(static_cast<u32>(imm.value));
91 }
89} 92}
90 93
91IR::F32 TranslatorVisitor::GetFloatImm20(u64 insn) { 94IR::F32 TranslatorVisitor::GetFloatImm20(u64 insn) {
@@ -94,9 +97,9 @@ IR::F32 TranslatorVisitor::GetFloatImm20(u64 insn) {
94 BitField<20, 19, u64> value; 97 BitField<20, 19, u64> value;
95 BitField<56, 1, u64> is_negative; 98 BitField<56, 1, u64> is_negative;
96 } const imm{insn}; 99 } const imm{insn};
97 const f32 positive_value{Common::BitCast<f32>(static_cast<u32>(imm.value) << 12)}; 100 const u32 sign_bit{imm.is_negative != 0 ? (1ULL << 31) : 0};
98 const f32 value{imm.is_negative != 0 ? -positive_value : positive_value}; 101 const u32 value{static_cast<u32>(imm.value) << 12};
99 return ir.Imm32(value); 102 return ir.Imm32(Common::BitCast<f32>(value | sign_bit));
100} 103}
101 104
102IR::U32 TranslatorVisitor::GetImm32(u64 insn) { 105IR::U32 TranslatorVisitor::GetImm32(u64 insn) {