diff options
Diffstat (limited to 'src/shader_recompiler/backend')
| -rw-r--r-- | src/shader_recompiler/backend/glasm/emit_glasm_integer.cpp | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_integer.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_integer.cpp index ba69c7a1b..ff353df8d 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm_integer.cpp +++ b/src/shader_recompiler/backend/glasm/emit_glasm_integer.cpp | |||
| @@ -9,7 +9,32 @@ | |||
| 9 | namespace Shader::Backend::GLASM { | 9 | namespace Shader::Backend::GLASM { |
| 10 | 10 | ||
| 11 | void EmitIAdd32(EmitContext& ctx, IR::Inst& inst, ScalarS32 a, ScalarS32 b) { | 11 | void EmitIAdd32(EmitContext& ctx, IR::Inst& inst, ScalarS32 a, ScalarS32 b) { |
| 12 | ctx.Add("ADD.S {}.x,{},{};", inst, a, b); | 12 | const bool cc{inst.HasAssociatedPseudoOperation()}; |
| 13 | const std::string_view cc_mod{cc ? ".CC" : ""}; | ||
| 14 | if (cc) { | ||
| 15 | ctx.reg_alloc.InvalidateConditionCodes(); | ||
| 16 | } | ||
| 17 | const auto ret{ctx.reg_alloc.Define(inst)}; | ||
| 18 | ctx.Add("ADD.S{} {}.x,{},{};", cc_mod, ret, a, b); | ||
| 19 | if (!cc) { | ||
| 20 | return; | ||
| 21 | } | ||
| 22 | static constexpr std::array<std::string_view, 4> masks{"EQ", "SF", "CF", "OF"}; | ||
| 23 | const std::array flags{ | ||
| 24 | inst.GetAssociatedPseudoOperation(IR::Opcode::GetZeroFromOp), | ||
| 25 | inst.GetAssociatedPseudoOperation(IR::Opcode::GetSignFromOp), | ||
| 26 | inst.GetAssociatedPseudoOperation(IR::Opcode::GetCarryFromOp), | ||
| 27 | inst.GetAssociatedPseudoOperation(IR::Opcode::GetOverflowFromOp), | ||
| 28 | }; | ||
| 29 | for (size_t i = 0; i < flags.size(); ++i) { | ||
| 30 | if (flags[i]) { | ||
| 31 | const auto flag_ret{ctx.reg_alloc.Define(*flags[i])}; | ||
| 32 | ctx.Add("MOV.S {},0;" | ||
| 33 | "MOV.S {}({}.x),-1;", | ||
| 34 | flag_ret, flag_ret, masks[i]); | ||
| 35 | flags[i]->Invalidate(); | ||
| 36 | } | ||
| 37 | } | ||
| 13 | } | 38 | } |
| 14 | 39 | ||
| 15 | void EmitIAdd64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register a, | 40 | void EmitIAdd64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register a, |