diff options
Diffstat (limited to 'src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp')
| -rw-r--r-- | src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp | 15 |
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 | ||
| 91 | IR::F32 TranslatorVisitor::GetFloatImm20(u64 insn) { | 94 | IR::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 | ||
| 102 | IR::U32 TranslatorVisitor::GetImm32(u64 insn) { | 105 | IR::U32 TranslatorVisitor::GetImm32(u64 insn) { |