summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend/glsl/reg_alloc.cpp
diff options
context:
space:
mode:
authorGravatar ameerj2021-05-22 23:31:30 -0400
committerGravatar ameerj2021-07-22 21:51:36 -0400
commitcdde7302196d6642724d36e8ed5a523dce702b6b (patch)
tree2700fc87a4762486b84cc73d783542d97bb6a96a /src/shader_recompiler/backend/glsl/reg_alloc.cpp
parentglsl: More FP fixes (diff)
downloadyuzu-cdde7302196d6642724d36e8ed5a523dce702b6b.tar.gz
yuzu-cdde7302196d6642724d36e8ed5a523dce702b6b.tar.xz
yuzu-cdde7302196d6642724d36e8ed5a523dce702b6b.zip
glsl: Add a more robust fp formatter
Diffstat (limited to 'src/shader_recompiler/backend/glsl/reg_alloc.cpp')
-rw-r--r--src/shader_recompiler/backend/glsl/reg_alloc.cpp14
1 files changed, 10 insertions, 4 deletions
diff --git a/src/shader_recompiler/backend/glsl/reg_alloc.cpp b/src/shader_recompiler/backend/glsl/reg_alloc.cpp
index 73295a1e5..007f8c89d 100644
--- a/src/shader_recompiler/backend/glsl/reg_alloc.cpp
+++ b/src/shader_recompiler/backend/glsl/reg_alloc.cpp
@@ -10,10 +10,9 @@
10#include "shader_recompiler/backend/glsl/reg_alloc.h" 10#include "shader_recompiler/backend/glsl/reg_alloc.h"
11#include "shader_recompiler/exception.h" 11#include "shader_recompiler/exception.h"
12#include "shader_recompiler/frontend/ir/value.h" 12#include "shader_recompiler/frontend/ir/value.h"
13#pragma optimize("", off) 13
14namespace Shader::Backend::GLSL { 14namespace Shader::Backend::GLSL {
15namespace { 15namespace {
16
17std::string Representation(Id id) { 16std::string Representation(Id id) {
18 if (id.is_condition_code != 0) { 17 if (id.is_condition_code != 0) {
19 throw NotImplementedException("Condition code"); 18 throw NotImplementedException("Condition code");
@@ -25,6 +24,13 @@ std::string Representation(Id id) {
25 return fmt::format("R{}", index); 24 return fmt::format("R{}", index);
26} 25}
27 26
27std::string FormatFloat(std::string_view value, IR::Type type) {
28 const bool needs_dot = value.find_first_of('.') == std::string_view::npos;
29 const bool needs_suffix = !value.ends_with('f');
30 const auto suffix = type == IR::Type::F32 ? "f" : "lf";
31 return fmt::format("{}{}{}", value, needs_dot ? "." : "", needs_suffix ? suffix : "");
32}
33
28std::string MakeImm(const IR::Value& value) { 34std::string MakeImm(const IR::Value& value) {
29 switch (value.Type()) { 35 switch (value.Type()) {
30 case IR::Type::U1: 36 case IR::Type::U1:
@@ -32,11 +38,11 @@ std::string MakeImm(const IR::Value& value) {
32 case IR::Type::U32: 38 case IR::Type::U32:
33 return fmt::format("{}u", value.U32()); 39 return fmt::format("{}u", value.U32());
34 case IR::Type::F32: 40 case IR::Type::F32:
35 return fmt::format("{}f", value.F32()); 41 return FormatFloat(fmt::format("{}", value.F32()), IR::Type::F32);
36 case IR::Type::U64: 42 case IR::Type::U64:
37 return fmt::format("{}ul", value.U64()); 43 return fmt::format("{}ul", value.U64());
38 case IR::Type::F64: 44 case IR::Type::F64:
39 return fmt::format("{}lf", value.F64()); 45 return FormatFloat(fmt::format("{}", value.F64()), IR::Type::F64);
40 default: 46 default:
41 throw NotImplementedException("Immediate type {}", value.Type()); 47 throw NotImplementedException("Immediate type {}", value.Type());
42 } 48 }