From ad61b47f80b96436ef675abcf1123668d9c1180d Mon Sep 17 00:00:00 2001
From: ReinUsesLisp <reinuseslisp@airmail.cc>
Date: Sun, 9 May 2021 22:43:29 -0300
Subject: glasm: Add conversion instructions to GLASM

---
 src/shader_recompiler/backend/glasm/reg_alloc.h | 13 +++++++++++++
 1 file changed, 13 insertions(+)

(limited to 'src/shader_recompiler/backend/glasm/reg_alloc.h')

diff --git a/src/shader_recompiler/backend/glasm/reg_alloc.h b/src/shader_recompiler/backend/glasm/reg_alloc.h
index f1899eae16..200c51610c 100644
--- a/src/shader_recompiler/backend/glasm/reg_alloc.h
+++ b/src/shader_recompiler/backend/glasm/reg_alloc.h
@@ -27,6 +27,7 @@ enum class Type : u32 {
     U32,
     S32,
     F32,
+    U64,
     F64,
 };
 
@@ -55,6 +56,7 @@ struct Value {
         u32 imm_u32;
         s32 imm_s32;
         f32 imm_f32;
+        u64 imm_u64;
         f64 imm_f64;
     };
 
@@ -71,6 +73,8 @@ struct Value {
             return imm_s32 == rhs.imm_s32;
         case Type::F32:
             return Common::BitCast<u32>(imm_f32) == Common::BitCast<u32>(rhs.imm_f32);
+        case Type::U64:
+            return imm_u64 == rhs.imm_u64;
         case Type::F64:
             return Common::BitCast<u64>(imm_f64) == Common::BitCast<u64>(rhs.imm_f64);
         }
@@ -103,6 +107,10 @@ public:
 
     void FreeReg(Register reg);
 
+    void InvalidateConditionCodes() {
+        // This does nothing for now
+    }
+
     [[nodiscard]] size_t NumUsedRegisters() const noexcept {
         return num_used_registers;
     }
@@ -210,6 +218,7 @@ struct fmt::formatter<Shader::Backend::GLASM::ScalarU32> {
             return fmt::format_to(ctx.out(), "{}", static_cast<u32>(value.imm_s32));
         case Shader::Backend::GLASM::Type::F32:
             return fmt::format_to(ctx.out(), "{}", Common::BitCast<u32>(value.imm_f32));
+        case Shader::Backend::GLASM::Type::U64:
         case Shader::Backend::GLASM::Type::F64:
             break;
         }
@@ -233,6 +242,7 @@ struct fmt::formatter<Shader::Backend::GLASM::ScalarS32> {
             return fmt::format_to(ctx.out(), "{}", value.imm_s32);
         case Shader::Backend::GLASM::Type::F32:
             return fmt::format_to(ctx.out(), "{}", Common::BitCast<s32>(value.imm_f32));
+        case Shader::Backend::GLASM::Type::U64:
         case Shader::Backend::GLASM::Type::F64:
             break;
         }
@@ -256,6 +266,7 @@ struct fmt::formatter<Shader::Backend::GLASM::ScalarF32> {
             return fmt::format_to(ctx.out(), "{}", Common::BitCast<s32>(value.imm_s32));
         case Shader::Backend::GLASM::Type::F32:
             return fmt::format_to(ctx.out(), "{}", value.imm_f32);
+        case Shader::Backend::GLASM::Type::U64:
         case Shader::Backend::GLASM::Type::F64:
             break;
         }
@@ -277,6 +288,8 @@ struct fmt::formatter<Shader::Backend::GLASM::ScalarF64> {
         case Shader::Backend::GLASM::Type::S32:
         case Shader::Backend::GLASM::Type::F32:
             break;
+        case Shader::Backend::GLASM::Type::U64:
+            return format_to(ctx.out(), "{}", Common::BitCast<f64>(value.imm_u64));
         case Shader::Backend::GLASM::Type::F64:
             return format_to(ctx.out(), "{}", value.imm_f64);
         }
-- 
cgit v1.2.3-70-g09d2