diff options
Diffstat (limited to '')
| -rw-r--r-- | src/shader_recompiler/backend/glasm/emit_glasm.cpp | 12 | ||||
| -rw-r--r-- | src/shader_recompiler/backend/glasm/reg_alloc.cpp | 8 | ||||
| -rw-r--r-- | src/shader_recompiler/backend/glasm/reg_alloc.h | 33 |
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 | ||
| 35 | struct Id { | 32 | struct 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 | } |