Browse Source

glasm: Add fp min/max insts and fix store for fp64 on GLASM

ReinUsesLisp 5 năm trước cách đây
mục cha
commit
7703d65f23

+ 6 - 8
src/shader_recompiler/backend/glasm/emit_glasm_floating_point.cpp

@@ -75,22 +75,20 @@ void EmitFPFma64(EmitContext& ctx, IR::Inst& inst, ScalarF64 a, ScalarF64 b, Sca
     ctx.LongAdd("MAD.F64 {}.x,{},{},{};", inst, a, b, c);
 }
 
-void EmitFPMax32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] ScalarF32 a,
-                 [[maybe_unused]] ScalarF32 b) {
-    throw NotImplementedException("GLASM instruction");
+void EmitFPMax32(EmitContext& ctx, IR::Inst& inst, ScalarF32 a, ScalarF32 b) {
+    ctx.Add("MAX.F {}.x,{},{};", inst, a, b);
 }
 
 void EmitFPMax64(EmitContext& ctx, IR::Inst& inst, ScalarF64 a, ScalarF64 b) {
-    ctx.LongAdd("MAX.F64 {},{},{};", inst, a, b);
+    ctx.LongAdd("MAX.F64 {}.x,{},{};", inst, a, b);
 }
 
-void EmitFPMin32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] ScalarF32 a,
-                 [[maybe_unused]] ScalarF32 b) {
-    throw NotImplementedException("GLASM instruction");
+void EmitFPMin32(EmitContext& ctx, IR::Inst& inst, ScalarF32 a, ScalarF32 b) {
+    ctx.Add("MIN.F {}.x,{},{};", inst, a, b);
 }
 
 void EmitFPMin64(EmitContext& ctx, IR::Inst& inst, ScalarF64 a, ScalarF64 b) {
-    ctx.LongAdd("MIN.F64 {},{},{};", inst, a, b);
+    ctx.LongAdd("MIN.F64 {}.x,{},{};", inst, a, b);
 }
 
 void EmitFPMul16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst,

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

@@ -221,9 +221,9 @@ void EmitFPAdd64(EmitContext& ctx, IR::Inst& inst, ScalarF64 a, ScalarF64 b);
 void EmitFPFma16(EmitContext& ctx, IR::Inst& inst, Register a, Register b, Register c);
 void EmitFPFma32(EmitContext& ctx, IR::Inst& inst, ScalarF32 a, ScalarF32 b, ScalarF32 c);
 void EmitFPFma64(EmitContext& ctx, IR::Inst& inst, ScalarF64 a, ScalarF64 b, ScalarF64 c);
-void EmitFPMax32(EmitContext& ctx, ScalarF32 a, ScalarF32 b);
+void EmitFPMax32(EmitContext& ctx, IR::Inst& inst, ScalarF32 a, ScalarF32 b);
 void EmitFPMax64(EmitContext& ctx, IR::Inst& inst, ScalarF64 a, ScalarF64 b);
-void EmitFPMin32(EmitContext& ctx, ScalarF32 a, ScalarF32 b);
+void EmitFPMin32(EmitContext& ctx, IR::Inst& inst, ScalarF32 a, ScalarF32 b);
 void EmitFPMin64(EmitContext& ctx, IR::Inst& inst, ScalarF64 a, ScalarF64 b);
 void EmitFPMul16(EmitContext& ctx, IR::Inst& inst, Register a, Register b);
 void EmitFPMul32(EmitContext& ctx, IR::Inst& inst, ScalarF32 a, ScalarF32 b);