summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm.cpp12
-rw-r--r--src/shader_recompiler/backend/glasm/reg_alloc.cpp8
-rw-r--r--src/shader_recompiler/backend/glasm/reg_alloc.h33
3 files changed, 6 insertions, 47 deletions
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm.cpp b/src/shader_recompiler/backend/glasm/emit_glasm.cpp
index 0e9dc06a6..5ffefaad2 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm.cpp
@@ -49,8 +49,7 @@ public:
49 inst = ir_value.InstRecursive(); 49 inst = ir_value.InstRecursive();
50 reg = Register{value}; 50 reg = Register{value};
51 } else { 51 } else {
52 const bool is_long{value.type == Type::F64 || value.type == Type::U64}; 52 reg = value.type == Type::U64 ? reg_alloc.AllocLongReg() : reg_alloc.AllocReg();
53 reg = is_long ? reg_alloc.AllocLongReg() : reg_alloc.AllocReg();
54 } 53 }
55 switch (value.type) { 54 switch (value.type) {
56 case Type::Register: 55 case Type::Register:
@@ -59,18 +58,9 @@ public:
59 case Type::U32: 58 case Type::U32:
60 ctx.Add("MOV.U {}.x,{};", reg, value.imm_u32); 59 ctx.Add("MOV.U {}.x,{};", reg, value.imm_u32);
61 break; 60 break;
62 case Type::S32:
63 ctx.Add("MOV.S {}.x,{};", reg, value.imm_s32);
64 break;
65 case Type::F32:
66 ctx.Add("MOV.F {}.x,{};", reg, value.imm_f32);
67 break;
68 case Type::U64: 61 case Type::U64:
69 ctx.Add("MOV.U64 {}.x,{};", reg, value.imm_u64); 62 ctx.Add("MOV.U64 {}.x,{};", reg, value.imm_u64);
70 break; 63 break;
71 case Type::F64:
72 ctx.Add("MOV.F64 {}.x,{};", reg, value.imm_f64);
73 break;
74 } 64 }
75 } 65 }
76 66
diff --git a/src/shader_recompiler/backend/glasm/reg_alloc.cpp b/src/shader_recompiler/backend/glasm/reg_alloc.cpp
index c55a833c6..4c046db6e 100644
--- a/src/shader_recompiler/backend/glasm/reg_alloc.cpp
+++ b/src/shader_recompiler/backend/glasm/reg_alloc.cpp
@@ -78,16 +78,16 @@ Value RegAlloc::MakeImm(const IR::Value& value) {
78 ret.imm_u32 = value.U32(); 78 ret.imm_u32 = value.U32();
79 break; 79 break;
80 case IR::Type::F32: 80 case IR::Type::F32:
81 ret.type = Type::F32; 81 ret.type = Type::U32;
82 ret.imm_f32 = value.F32(); 82 ret.imm_u32 = Common::BitCast<u32>(value.F32());
83 break; 83 break;
84 case IR::Type::U64: 84 case IR::Type::U64:
85 ret.type = Type::U64; 85 ret.type = Type::U64;
86 ret.imm_u64 = value.U64(); 86 ret.imm_u64 = value.U64();
87 break; 87 break;
88 case IR::Type::F64: 88 case IR::Type::F64:
89 ret.type = Type::F64; 89 ret.type = Type::U64;
90 ret.imm_f64 = value.F64(); 90 ret.imm_u64 = Common::BitCast<u64>(value.F64());
91 break; 91 break;
92 default: 92 default:
93 throw NotImplementedException("Immediate type {}", value.Type()); 93 throw NotImplementedException("Immediate type {}", value.Type());
diff --git a/src/shader_recompiler/backend/glasm/reg_alloc.h b/src/shader_recompiler/backend/glasm/reg_alloc.h
index 019e1bc0f..5a703daf2 100644
--- a/src/shader_recompiler/backend/glasm/reg_alloc.h
+++ b/src/shader_recompiler/backend/glasm/reg_alloc.h
@@ -26,10 +26,7 @@ enum class Type : u32 {
26 Void, 26 Void,
27 Register, 27 Register,
28 U32, 28 U32,
29 S32,
30 F32,
31 U64, 29 U64,
32 F64,
33}; 30};
34 31
35struct Id { 32struct Id {
@@ -57,10 +54,7 @@ struct Value {
57 union { 54 union {
58 Id id; 55 Id id;
59 u32 imm_u32; 56 u32 imm_u32;
60 s32 imm_s32;
61 f32 imm_f32;
62 u64 imm_u64; 57 u64 imm_u64;
63 f64 imm_f64;
64 }; 58 };
65 59
66 bool operator==(const Value& rhs) const noexcept { 60 bool operator==(const Value& rhs) const noexcept {
@@ -74,14 +68,8 @@ struct Value {
74 return id == rhs.id; 68 return id == rhs.id;
75 case Type::U32: 69 case Type::U32:
76 return imm_u32 == rhs.imm_u32; 70 return imm_u32 == rhs.imm_u32;
77 case Type::S32:
78 return imm_s32 == rhs.imm_s32;
79 case Type::F32:
80 return Common::BitCast<u32>(imm_f32) == Common::BitCast<u32>(rhs.imm_f32);
81 case Type::U64: 71 case Type::U64:
82 return imm_u64 == rhs.imm_u64; 72 return imm_u64 == rhs.imm_u64;
83 case Type::F64:
84 return Common::BitCast<u64>(imm_f64) == Common::BitCast<u64>(rhs.imm_f64);
85 } 73 }
86 return false; 74 return false;
87 } 75 }
@@ -245,12 +233,7 @@ struct fmt::formatter<Shader::Backend::GLASM::ScalarU32> {
245 return Shader::Backend::GLASM::FormatTo<true>(ctx, value.id); 233 return Shader::Backend::GLASM::FormatTo<true>(ctx, value.id);
246 case Shader::Backend::GLASM::Type::U32: 234 case Shader::Backend::GLASM::Type::U32:
247 return fmt::format_to(ctx.out(), "{}", value.imm_u32); 235 return fmt::format_to(ctx.out(), "{}", value.imm_u32);
248 case Shader::Backend::GLASM::Type::S32:
249 return fmt::format_to(ctx.out(), "{}", static_cast<u32>(value.imm_s32));
250 case Shader::Backend::GLASM::Type::F32:
251 return fmt::format_to(ctx.out(), "{}", Common::BitCast<u32>(value.imm_f32));
252 case Shader::Backend::GLASM::Type::U64: 236 case Shader::Backend::GLASM::Type::U64:
253 case Shader::Backend::GLASM::Type::F64:
254 break; 237 break;
255 } 238 }
256 throw Shader::InvalidArgument("Invalid value type {}", value.type); 239 throw Shader::InvalidArgument("Invalid value type {}", value.type);
@@ -271,12 +254,7 @@ struct fmt::formatter<Shader::Backend::GLASM::ScalarS32> {
271 return Shader::Backend::GLASM::FormatTo<true>(ctx, value.id); 254 return Shader::Backend::GLASM::FormatTo<true>(ctx, value.id);
272 case Shader::Backend::GLASM::Type::U32: 255 case Shader::Backend::GLASM::Type::U32:
273 return fmt::format_to(ctx.out(), "{}", static_cast<s32>(value.imm_u32)); 256 return fmt::format_to(ctx.out(), "{}", static_cast<s32>(value.imm_u32));
274 case Shader::Backend::GLASM::Type::S32:
275 return fmt::format_to(ctx.out(), "{}", value.imm_s32);
276 case Shader::Backend::GLASM::Type::F32:
277 return fmt::format_to(ctx.out(), "{}", Common::BitCast<s32>(value.imm_f32));
278 case Shader::Backend::GLASM::Type::U64: 257 case Shader::Backend::GLASM::Type::U64:
279 case Shader::Backend::GLASM::Type::F64:
280 break; 258 break;
281 } 259 }
282 throw Shader::InvalidArgument("Invalid value type {}", value.type); 260 throw Shader::InvalidArgument("Invalid value type {}", value.type);
@@ -296,13 +274,8 @@ struct fmt::formatter<Shader::Backend::GLASM::ScalarF32> {
296 case Shader::Backend::GLASM::Type::Register: 274 case Shader::Backend::GLASM::Type::Register:
297 return Shader::Backend::GLASM::FormatTo<true>(ctx, value.id); 275 return Shader::Backend::GLASM::FormatTo<true>(ctx, value.id);
298 case Shader::Backend::GLASM::Type::U32: 276 case Shader::Backend::GLASM::Type::U32:
299 return fmt::format_to(ctx.out(), "{}", Common::BitCast<u32>(value.imm_u32)); 277 return fmt::format_to(ctx.out(), "{}", Common::BitCast<f32>(value.imm_u32));
300 case Shader::Backend::GLASM::Type::S32:
301 return fmt::format_to(ctx.out(), "{}", Common::BitCast<s32>(value.imm_s32));
302 case Shader::Backend::GLASM::Type::F32:
303 return fmt::format_to(ctx.out(), "{}", value.imm_f32);
304 case Shader::Backend::GLASM::Type::U64: 278 case Shader::Backend::GLASM::Type::U64:
305 case Shader::Backend::GLASM::Type::F64:
306 break; 279 break;
307 } 280 }
308 throw Shader::InvalidArgument("Invalid value type {}", value.type); 281 throw Shader::InvalidArgument("Invalid value type {}", value.type);
@@ -322,13 +295,9 @@ struct fmt::formatter<Shader::Backend::GLASM::ScalarF64> {
322 case Shader::Backend::GLASM::Type::Register: 295 case Shader::Backend::GLASM::Type::Register:
323 return Shader::Backend::GLASM::FormatTo<true>(ctx, value.id); 296 return Shader::Backend::GLASM::FormatTo<true>(ctx, value.id);
324 case Shader::Backend::GLASM::Type::U32: 297 case Shader::Backend::GLASM::Type::U32:
325 case Shader::Backend::GLASM::Type::S32:
326 case Shader::Backend::GLASM::Type::F32:
327 break; 298 break;
328 case Shader::Backend::GLASM::Type::U64: 299 case Shader::Backend::GLASM::Type::U64:
329 return fmt::format_to(ctx.out(), "{}", Common::BitCast<f64>(value.imm_u64)); 300 return fmt::format_to(ctx.out(), "{}", Common::BitCast<f64>(value.imm_u64));
330 case Shader::Backend::GLASM::Type::F64:
331 return fmt::format_to(ctx.out(), "{}", value.imm_f64);
332 } 301 }
333 throw Shader::InvalidArgument("Invalid value type {}", value.type); 302 throw Shader::InvalidArgument("Invalid value type {}", value.type);
334 } 303 }