Просмотр исходного кода

glasm: Use CMP.S for Select32

also fixes ADD and SUB to use U modifier
ameerj 5 лет назад
Родитель
Сommit
934d300246

+ 2 - 2
src/shader_recompiler/backend/glasm/emit_glasm_instructions.h

@@ -214,8 +214,8 @@ void EmitSelectU64(EmitContext& ctx, std::string_view cond, std::string_view tru
                    std::string_view false_value);
 void EmitSelectF16(EmitContext& ctx, std::string_view cond, std::string_view true_value,
                    std::string_view false_value);
-void EmitSelectF32(EmitContext& ctx, std::string_view cond, std::string_view true_value,
-                   std::string_view false_value);
+void EmitSelectF32(EmitContext& ctx, IR::Inst& inst, std::string_view cond,
+                   std::string_view true_value, std::string_view false_value);
 void EmitSelectF64(EmitContext& ctx, std::string_view cond, std::string_view true_value,
                    std::string_view false_value);
 void EmitBitCastU16F16(EmitContext& ctx, IR::Inst& inst, const IR::Value& value);

+ 2 - 2
src/shader_recompiler/backend/glasm/emit_glasm_integer.cpp

@@ -12,7 +12,7 @@ namespace Shader::Backend::GLASM {
 
 void EmitIAdd32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst,
                 [[maybe_unused]] std::string_view a, [[maybe_unused]] std::string_view b) {
-    ctx.Add("ADD {},{},{};", inst, a, b);
+    ctx.Add("ADD.U {},{},{};", inst, a, b);
 }
 
 void EmitIAdd64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst,
@@ -22,7 +22,7 @@ void EmitIAdd64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& in
 
 void EmitISub32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst,
                 [[maybe_unused]] std::string_view a, [[maybe_unused]] std::string_view b) {
-    ctx.Add("SUB {},{},{};", inst, a, b);
+    ctx.Add("SUB.U {},{},{};", inst, a, b);
 }
 
 void EmitISub64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst,

+ 4 - 8
src/shader_recompiler/backend/glasm/emit_glasm_select.cpp

@@ -24,12 +24,7 @@ void EmitSelectU16(EmitContext&, std::string_view, std::string_view, std::string
 
 void EmitSelectU32(EmitContext& ctx, IR::Inst& inst, std::string_view cond,
                    std::string_view true_value, std::string_view false_value) {
-    ctx.Add("MOV.U.CC RC,{};", cond);
-    ctx.Add("IF NE.x;");
-    ctx.Add("MOV.U {},{};", inst, true_value);
-    ctx.Add("ELSE;");
-    ctx.Add("MOV.U {},{};", inst, false_value);
-    ctx.Add("ENDIF;");
+    ctx.Add("CMP.S {},{},{},{};", inst, cond, true_value, false_value);
 }
 
 void EmitSelectU64(EmitContext&, std::string_view, std::string_view, std::string_view) {
@@ -40,8 +35,9 @@ void EmitSelectF16(EmitContext&, std::string_view, std::string_view, std::string
     throw NotImplementedException("GLASM instruction");
 }
 
-void EmitSelectF32(EmitContext&, std::string_view, std::string_view, std::string_view) {
-    throw NotImplementedException("GLASM instruction");
+void EmitSelectF32(EmitContext& ctx, IR::Inst& inst, std::string_view cond,
+                   std::string_view true_value, std::string_view false_value) {
+    ctx.Add("CMP.S {},{},{},{};", inst, cond, true_value, false_value);
 }
 
 void EmitSelectF64(EmitContext&, std::string_view, std::string_view, std::string_view) {