summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend/glasm/emit_glasm_integer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader_recompiler/backend/glasm/emit_glasm_integer.cpp')
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm_integer.cpp27
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 @@
9namespace Shader::Backend::GLASM { 9namespace Shader::Backend::GLASM {
10 10
11void EmitIAdd32(EmitContext& ctx, IR::Inst& inst, ScalarS32 a, ScalarS32 b) { 11void 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
15void EmitIAdd64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register a, 40void EmitIAdd64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register a,