glasm: Add floating-point comparisons on GLASM
This commit is contained in:
		| @@ -10,6 +10,31 @@ | |||||||
|  |  | ||||||
| namespace Shader::Backend::GLASM { | namespace Shader::Backend::GLASM { | ||||||
|  |  | ||||||
|  | template <typename InputType> | ||||||
|  | static void Compare(EmitContext& ctx, IR::Inst& inst, InputType lhs, InputType rhs, | ||||||
|  |                     std::string_view op, std::string_view type, bool ordered, | ||||||
|  |                     bool inequality = false) { | ||||||
|  |     const Register ret{ctx.reg_alloc.Define(inst)}; | ||||||
|  |     ctx.Add("{}.{} RC.x,{},{};", op, type, lhs, rhs); | ||||||
|  |     if (ordered && inequality) { | ||||||
|  |         ctx.Add("SEQ.{} RC.y,{},{};" | ||||||
|  |                 "SEQ.{} RC.z,{},{};" | ||||||
|  |                 "AND.U RC.x,RC.x,RC.y;" | ||||||
|  |                 "AND.U RC.x,RC.x,RC.z;" | ||||||
|  |                 "SNE.S {}.x,RC.x,0;", | ||||||
|  |                 type, lhs, lhs, type, rhs, rhs, ret); | ||||||
|  |     } else if (ordered) { | ||||||
|  |         ctx.Add("SNE.S {}.x,RC.x,0;", ret); | ||||||
|  |     } else { | ||||||
|  |         ctx.Add("SNE.{} RC.y,{},{};" | ||||||
|  |                 "SNE.{} RC.z,{},{};" | ||||||
|  |                 "OR.U RC.x,RC.x,RC.y;" | ||||||
|  |                 "OR.U RC.x,RC.x,RC.z;" | ||||||
|  |                 "SNE.S {}.x,RC.x,0;", | ||||||
|  |                 type, lhs, lhs, type, rhs, rhs, ret); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| void EmitFPAbs16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, | void EmitFPAbs16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, | ||||||
|                  [[maybe_unused]] Register value) { |                  [[maybe_unused]] Register value) { | ||||||
|     throw NotImplementedException("GLASM instruction"); |     throw NotImplementedException("GLASM instruction"); | ||||||
| @@ -46,10 +71,8 @@ void EmitFPFma32(EmitContext& ctx, IR::Inst& inst, ScalarF32 a, ScalarF32 b, Sca | |||||||
|     ctx.Add("MAD.F {}.x,{},{},{};", inst, a, b, c); |     ctx.Add("MAD.F {}.x,{},{},{};", inst, a, b, c); | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPFma64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, | void EmitFPFma64(EmitContext& ctx, IR::Inst& inst, ScalarF64 a, ScalarF64 b, ScalarF64 c) { | ||||||
|                  [[maybe_unused]] Register a, [[maybe_unused]] Register b, |     ctx.LongAdd("MAD.F64 {}.x,{},{},{};", inst, a, b, c); | ||||||
|                  [[maybe_unused]] Register c) { |  | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPMax32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] ScalarF32 a, | void EmitFPMax32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] ScalarF32 a, | ||||||
| @@ -57,9 +80,8 @@ void EmitFPMax32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] ScalarF32 a | |||||||
|     throw NotImplementedException("GLASM instruction"); |     throw NotImplementedException("GLASM instruction"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPMax64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register a, | void EmitFPMax64(EmitContext& ctx, IR::Inst& inst, ScalarF64 a, ScalarF64 b) { | ||||||
|                  [[maybe_unused]] Register b) { |     ctx.LongAdd("MAX.F64 {},{},{};", inst, a, b); | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPMin32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] ScalarF32 a, | void EmitFPMin32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] ScalarF32 a, | ||||||
| @@ -67,9 +89,8 @@ void EmitFPMin32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] ScalarF32 a | |||||||
|     throw NotImplementedException("GLASM instruction"); |     throw NotImplementedException("GLASM instruction"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPMin64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register a, | void EmitFPMin64(EmitContext& ctx, IR::Inst& inst, ScalarF64 a, ScalarF64 b) { | ||||||
|                  [[maybe_unused]] Register b) { |     ctx.LongAdd("MIN.F64 {},{},{};", inst, a, b); | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPMul16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, | void EmitFPMul16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, | ||||||
| @@ -81,9 +102,8 @@ void EmitFPMul32(EmitContext& ctx, IR::Inst& inst, ScalarF32 a, ScalarF32 b) { | |||||||
|     ctx.Add("MUL.F {}.x,{},{};", inst, a, b); |     ctx.Add("MUL.F {}.x,{},{};", inst, a, b); | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPMul64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, | void EmitFPMul64(EmitContext& ctx, IR::Inst& inst, ScalarF64 a, ScalarF64 b) { | ||||||
|                  [[maybe_unused]] Register a, [[maybe_unused]] Register b) { |     ctx.LongAdd("MUL.F64 {}.x,{},{};", inst, a, b); | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPNeg16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register value) { | void EmitFPNeg16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register value) { | ||||||
| @@ -215,13 +235,11 @@ void EmitFPOrdEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Regist | |||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPOrdEqual32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs) { | void EmitFPOrdEqual32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs) { | ||||||
|     const Register ret{ctx.reg_alloc.Define(inst)}; |     Compare(ctx, inst, lhs, rhs, "SEQ", "F", true); | ||||||
|     ctx.Add("SEQ.F {}.x,{},{};SNE.S {}.x,{},0;", ret, lhs, rhs, ret, ret); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPOrdEqual64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPOrdEqual64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs) { | ||||||
|                       [[maybe_unused]] Register rhs) { |     Compare(ctx, inst, lhs, rhs, "SEQ", "F64", true); | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPUnordEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPUnordEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | ||||||
| @@ -229,14 +247,12 @@ void EmitFPUnordEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Regi | |||||||
|     throw NotImplementedException("GLASM instruction"); |     throw NotImplementedException("GLASM instruction"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPUnordEqual32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] ScalarF32 lhs, | void EmitFPUnordEqual32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs) { | ||||||
|                         [[maybe_unused]] ScalarF32 rhs) { |     Compare(ctx, inst, lhs, rhs, "SEQ", "F", false); | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPUnordEqual64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPUnordEqual64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs) { | ||||||
|                         [[maybe_unused]] Register rhs) { |     Compare(ctx, inst, lhs, rhs, "SEQ", "F64", false); | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPOrdNotEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPOrdNotEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | ||||||
| @@ -244,14 +260,12 @@ void EmitFPOrdNotEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Reg | |||||||
|     throw NotImplementedException("GLASM instruction"); |     throw NotImplementedException("GLASM instruction"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPOrdNotEqual32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] ScalarF32 lhs, | void EmitFPOrdNotEqual32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs) { | ||||||
|                          [[maybe_unused]] ScalarF32 rhs) { |     Compare(ctx, inst, lhs, rhs, "SNE", "F", true, true); | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPOrdNotEqual64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPOrdNotEqual64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs) { | ||||||
|                          [[maybe_unused]] Register rhs) { |     Compare(ctx, inst, lhs, rhs, "SNE", "F64", true, true); | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPUnordNotEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPUnordNotEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | ||||||
| @@ -259,14 +273,12 @@ void EmitFPUnordNotEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] R | |||||||
|     throw NotImplementedException("GLASM instruction"); |     throw NotImplementedException("GLASM instruction"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPUnordNotEqual32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] ScalarF32 lhs, | void EmitFPUnordNotEqual32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs) { | ||||||
|                            [[maybe_unused]] ScalarF32 rhs) { |     Compare(ctx, inst, lhs, rhs, "SNE", "F", false, true); | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPUnordNotEqual64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPUnordNotEqual64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs) { | ||||||
|                            [[maybe_unused]] Register rhs) { |     Compare(ctx, inst, lhs, rhs, "SNE", "F64", false, true); | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPOrdLessThan16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPOrdLessThan16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | ||||||
| @@ -275,13 +287,11 @@ void EmitFPOrdLessThan16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Reg | |||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPOrdLessThan32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs) { | void EmitFPOrdLessThan32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs) { | ||||||
|     const Register ret{ctx.reg_alloc.Define(inst)}; |     Compare(ctx, inst, lhs, rhs, "SLT", "F", true); | ||||||
|     ctx.Add("SLT.F {}.x,{},{};SNE.S {}.x,{}.x,0;", ret, lhs, rhs, ret, ret); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPOrdLessThan64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPOrdLessThan64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs) { | ||||||
|                          [[maybe_unused]] Register rhs) { |     Compare(ctx, inst, lhs, rhs, "SLT", "F64", true); | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPUnordLessThan16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPUnordLessThan16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | ||||||
| @@ -289,14 +299,12 @@ void EmitFPUnordLessThan16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] R | |||||||
|     throw NotImplementedException("GLASM instruction"); |     throw NotImplementedException("GLASM instruction"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPUnordLessThan32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] ScalarF32 lhs, | void EmitFPUnordLessThan32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs) { | ||||||
|                            [[maybe_unused]] ScalarF32 rhs) { |     Compare(ctx, inst, lhs, rhs, "SLT", "F", false); | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPUnordLessThan64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPUnordLessThan64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs) { | ||||||
|                            [[maybe_unused]] Register rhs) { |     Compare(ctx, inst, lhs, rhs, "SLT", "F64", false); | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPOrdGreaterThan16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPOrdGreaterThan16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | ||||||
| @@ -304,14 +312,12 @@ void EmitFPOrdGreaterThan16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] | |||||||
|     throw NotImplementedException("GLASM instruction"); |     throw NotImplementedException("GLASM instruction"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPOrdGreaterThan32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] ScalarF32 lhs, | void EmitFPOrdGreaterThan32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs) { | ||||||
|                             [[maybe_unused]] ScalarF32 rhs) { |     Compare(ctx, inst, lhs, rhs, "SGT", "F", true); | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPOrdGreaterThan64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPOrdGreaterThan64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs) { | ||||||
|                             [[maybe_unused]] Register rhs) { |     Compare(ctx, inst, lhs, rhs, "SGT", "F64", true); | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPUnordGreaterThan16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPUnordGreaterThan16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | ||||||
| @@ -319,14 +325,12 @@ void EmitFPUnordGreaterThan16([[maybe_unused]] EmitContext& ctx, [[maybe_unused] | |||||||
|     throw NotImplementedException("GLASM instruction"); |     throw NotImplementedException("GLASM instruction"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPUnordGreaterThan32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] ScalarF32 lhs, | void EmitFPUnordGreaterThan32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs) { | ||||||
|                               [[maybe_unused]] ScalarF32 rhs) { |     Compare(ctx, inst, lhs, rhs, "SGT", "F", false); | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPUnordGreaterThan64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPUnordGreaterThan64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs) { | ||||||
|                               [[maybe_unused]] Register rhs) { |     Compare(ctx, inst, lhs, rhs, "SGT", "F64", false); | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPOrdLessThanEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPOrdLessThanEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | ||||||
| @@ -335,13 +339,11 @@ void EmitFPOrdLessThanEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused] | |||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPOrdLessThanEqual32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs) { | void EmitFPOrdLessThanEqual32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs) { | ||||||
|     const Register ret{ctx.reg_alloc.Define(inst)}; |     Compare(ctx, inst, lhs, rhs, "SLE", "F", true); | ||||||
|     ctx.Add("SLE.F {}.x,{},{};SNE.S {}.x,{}.x,0;", ret, lhs, rhs, ret, ret); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPOrdLessThanEqual64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPOrdLessThanEqual64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs) { | ||||||
|                               [[maybe_unused]] Register rhs) { |     Compare(ctx, inst, lhs, rhs, "SLE", "F64", true); | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPUnordLessThanEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPUnordLessThanEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | ||||||
| @@ -349,14 +351,12 @@ void EmitFPUnordLessThanEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unuse | |||||||
|     throw NotImplementedException("GLASM instruction"); |     throw NotImplementedException("GLASM instruction"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPUnordLessThanEqual32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] ScalarF32 lhs, | void EmitFPUnordLessThanEqual32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs) { | ||||||
|                                 [[maybe_unused]] ScalarF32 rhs) { |     Compare(ctx, inst, lhs, rhs, "SLE", "F", false); | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPUnordLessThanEqual64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPUnordLessThanEqual64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs) { | ||||||
|                                 [[maybe_unused]] Register rhs) { |     Compare(ctx, inst, lhs, rhs, "SLE", "F64", false); | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPOrdGreaterThanEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPOrdGreaterThanEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | ||||||
| @@ -364,14 +364,12 @@ void EmitFPOrdGreaterThanEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unus | |||||||
|     throw NotImplementedException("GLASM instruction"); |     throw NotImplementedException("GLASM instruction"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPOrdGreaterThanEqual32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] ScalarF32 lhs, | void EmitFPOrdGreaterThanEqual32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs) { | ||||||
|                                  [[maybe_unused]] ScalarF32 rhs) { |     Compare(ctx, inst, lhs, rhs, "SGE", "F", true); | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPOrdGreaterThanEqual64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPOrdGreaterThanEqual64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs) { | ||||||
|                                  [[maybe_unused]] Register rhs) { |     Compare(ctx, inst, lhs, rhs, "SGE", "F64", true); | ||||||
|     throw NotImplementedException("GLASM instruction"); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPUnordGreaterThanEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPUnordGreaterThanEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | ||||||
| @@ -379,14 +377,24 @@ void EmitFPUnordGreaterThanEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_un | |||||||
|     throw NotImplementedException("GLASM instruction"); |     throw NotImplementedException("GLASM instruction"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPUnordGreaterThanEqual32([[maybe_unused]] EmitContext& ctx, | void EmitFPUnordGreaterThanEqual32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs) { | ||||||
|                                    [[maybe_unused]] ScalarF32 lhs, [[maybe_unused]] ScalarF32 rhs) { |     Compare(ctx, inst, lhs, rhs, "SGE", "F", false); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void EmitFPUnordGreaterThanEqual64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs) { | ||||||
|  |     Compare(ctx, inst, lhs, rhs, "SGE", "F64", false); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void EmitFPIsNan16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register value) { | ||||||
|     throw NotImplementedException("GLASM instruction"); |     throw NotImplementedException("GLASM instruction"); | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPUnordGreaterThanEqual64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Register lhs, | void EmitFPIsNan32(EmitContext& ctx, IR::Inst& inst, ScalarF32 value) { | ||||||
|                                    [[maybe_unused]] Register rhs) { |     Compare(ctx, inst, value, value, "SNE", "F", true, false); | ||||||
|     throw NotImplementedException("GLASM instruction"); | } | ||||||
|  |  | ||||||
|  | void EmitFPIsNan64(EmitContext& ctx, IR::Inst& inst, ScalarF64 value) { | ||||||
|  |     Compare(ctx, inst, value, value, "SNE", "F64", true, false); | ||||||
| } | } | ||||||
|  |  | ||||||
| } // namespace Shader::Backend::GLASM | } // namespace Shader::Backend::GLASM | ||||||
|   | |||||||
| @@ -220,14 +220,14 @@ void EmitFPAdd32(EmitContext& ctx, IR::Inst& inst, ScalarF32 a, ScalarF32 b); | |||||||
| void EmitFPAdd64(EmitContext& ctx, IR::Inst& inst, ScalarF64 a, ScalarF64 b); | 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 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 EmitFPFma32(EmitContext& ctx, IR::Inst& inst, ScalarF32 a, ScalarF32 b, ScalarF32 c); | ||||||
| void EmitFPFma64(EmitContext& ctx, IR::Inst& inst, Register a, Register b, Register 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, ScalarF32 a, ScalarF32 b); | ||||||
| void EmitFPMax64(EmitContext& ctx, Register a, Register b); | void EmitFPMax64(EmitContext& ctx, IR::Inst& inst, ScalarF64 a, ScalarF64 b); | ||||||
| void EmitFPMin32(EmitContext& ctx, ScalarF32 a, ScalarF32 b); | void EmitFPMin32(EmitContext& ctx, ScalarF32 a, ScalarF32 b); | ||||||
| void EmitFPMin64(EmitContext& ctx, Register a, Register b); | void EmitFPMin64(EmitContext& ctx, IR::Inst& inst, ScalarF64 a, ScalarF64 b); | ||||||
| void EmitFPMul16(EmitContext& ctx, IR::Inst& inst, Register a, Register b); | void EmitFPMul16(EmitContext& ctx, IR::Inst& inst, Register a, Register b); | ||||||
| void EmitFPMul32(EmitContext& ctx, IR::Inst& inst, ScalarF32 a, ScalarF32 b); | void EmitFPMul32(EmitContext& ctx, IR::Inst& inst, ScalarF32 a, ScalarF32 b); | ||||||
| void EmitFPMul64(EmitContext& ctx, IR::Inst& inst, Register a, Register b); | void EmitFPMul64(EmitContext& ctx, IR::Inst& inst, ScalarF64 a, ScalarF64 b); | ||||||
| void EmitFPNeg16(EmitContext& ctx, Register value); | void EmitFPNeg16(EmitContext& ctx, Register value); | ||||||
| void EmitFPNeg32(EmitContext& ctx, IR::Inst& inst, ScalarRegister value); | void EmitFPNeg32(EmitContext& ctx, IR::Inst& inst, ScalarRegister value); | ||||||
| void EmitFPNeg64(EmitContext& ctx, IR::Inst& inst, Register value); | void EmitFPNeg64(EmitContext& ctx, IR::Inst& inst, Register value); | ||||||
| @@ -260,43 +260,43 @@ void EmitFPTrunc32(EmitContext& ctx, ScalarF32 value); | |||||||
| void EmitFPTrunc64(EmitContext& ctx, Register value); | void EmitFPTrunc64(EmitContext& ctx, Register value); | ||||||
| void EmitFPOrdEqual16(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPOrdEqual16(EmitContext& ctx, Register lhs, Register rhs); | ||||||
| void EmitFPOrdEqual32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs); | void EmitFPOrdEqual32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs); | ||||||
| void EmitFPOrdEqual64(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPOrdEqual64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs); | ||||||
| void EmitFPUnordEqual16(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPUnordEqual16(EmitContext& ctx, Register lhs, Register rhs); | ||||||
| void EmitFPUnordEqual32(EmitContext& ctx, ScalarF32 lhs, ScalarF32 rhs); | void EmitFPUnordEqual32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs); | ||||||
| void EmitFPUnordEqual64(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPUnordEqual64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs); | ||||||
| void EmitFPOrdNotEqual16(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPOrdNotEqual16(EmitContext& ctx, Register lhs, Register rhs); | ||||||
| void EmitFPOrdNotEqual32(EmitContext& ctx, ScalarF32 lhs, ScalarF32 rhs); | void EmitFPOrdNotEqual32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs); | ||||||
| void EmitFPOrdNotEqual64(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPOrdNotEqual64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs); | ||||||
| void EmitFPUnordNotEqual16(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPUnordNotEqual16(EmitContext& ctx, Register lhs, Register rhs); | ||||||
| void EmitFPUnordNotEqual32(EmitContext& ctx, ScalarF32 lhs, ScalarF32 rhs); | void EmitFPUnordNotEqual32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs); | ||||||
| void EmitFPUnordNotEqual64(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPUnordNotEqual64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs); | ||||||
| void EmitFPOrdLessThan16(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPOrdLessThan16(EmitContext& ctx, Register lhs, Register rhs); | ||||||
| void EmitFPOrdLessThan32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs); | void EmitFPOrdLessThan32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs); | ||||||
| void EmitFPOrdLessThan64(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPOrdLessThan64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs); | ||||||
| void EmitFPUnordLessThan16(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPUnordLessThan16(EmitContext& ctx, Register lhs, Register rhs); | ||||||
| void EmitFPUnordLessThan32(EmitContext& ctx, ScalarF32 lhs, ScalarF32 rhs); | void EmitFPUnordLessThan32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs); | ||||||
| void EmitFPUnordLessThan64(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPUnordLessThan64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs); | ||||||
| void EmitFPOrdGreaterThan16(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPOrdGreaterThan16(EmitContext& ctx, Register lhs, Register rhs); | ||||||
| void EmitFPOrdGreaterThan32(EmitContext& ctx, ScalarF32 lhs, ScalarF32 rhs); | void EmitFPOrdGreaterThan32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs); | ||||||
| void EmitFPOrdGreaterThan64(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPOrdGreaterThan64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs); | ||||||
| void EmitFPUnordGreaterThan16(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPUnordGreaterThan16(EmitContext& ctx, Register lhs, Register rhs); | ||||||
| void EmitFPUnordGreaterThan32(EmitContext& ctx, ScalarF32 lhs, ScalarF32 rhs); | void EmitFPUnordGreaterThan32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs); | ||||||
| void EmitFPUnordGreaterThan64(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPUnordGreaterThan64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs); | ||||||
| void EmitFPOrdLessThanEqual16(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPOrdLessThanEqual16(EmitContext& ctx, Register lhs, Register rhs); | ||||||
| void EmitFPOrdLessThanEqual32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs); | void EmitFPOrdLessThanEqual32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs); | ||||||
| void EmitFPOrdLessThanEqual64(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPOrdLessThanEqual64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs); | ||||||
| void EmitFPUnordLessThanEqual16(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPUnordLessThanEqual16(EmitContext& ctx, Register lhs, Register rhs); | ||||||
| void EmitFPUnordLessThanEqual32(EmitContext& ctx, ScalarF32 lhs, ScalarF32 rhs); | void EmitFPUnordLessThanEqual32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs); | ||||||
| void EmitFPUnordLessThanEqual64(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPUnordLessThanEqual64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs); | ||||||
| void EmitFPOrdGreaterThanEqual16(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPOrdGreaterThanEqual16(EmitContext& ctx, Register lhs, Register rhs); | ||||||
| void EmitFPOrdGreaterThanEqual32(EmitContext& ctx, ScalarF32 lhs, ScalarF32 rhs); | void EmitFPOrdGreaterThanEqual32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs); | ||||||
| void EmitFPOrdGreaterThanEqual64(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPOrdGreaterThanEqual64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs); | ||||||
| void EmitFPUnordGreaterThanEqual16(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPUnordGreaterThanEqual16(EmitContext& ctx, Register lhs, Register rhs); | ||||||
| void EmitFPUnordGreaterThanEqual32(EmitContext& ctx, ScalarF32 lhs, ScalarF32 rhs); | void EmitFPUnordGreaterThanEqual32(EmitContext& ctx, IR::Inst& inst, ScalarF32 lhs, ScalarF32 rhs); | ||||||
| void EmitFPUnordGreaterThanEqual64(EmitContext& ctx, Register lhs, Register rhs); | void EmitFPUnordGreaterThanEqual64(EmitContext& ctx, IR::Inst& inst, ScalarF64 lhs, ScalarF64 rhs); | ||||||
| void EmitFPIsNan16(EmitContext& ctx, Register value); | void EmitFPIsNan16(EmitContext& ctx, Register value); | ||||||
| void EmitFPIsNan32(EmitContext& ctx, ScalarF32 value); | void EmitFPIsNan32(EmitContext& ctx, IR::Inst& inst, ScalarF32 value); | ||||||
| void EmitFPIsNan64(EmitContext& ctx, Register value); | void EmitFPIsNan64(EmitContext& ctx, IR::Inst& inst, ScalarF64 value); | ||||||
| void EmitIAdd32(EmitContext& ctx, IR::Inst& inst, ScalarS32 a, ScalarS32 b); | void EmitIAdd32(EmitContext& ctx, IR::Inst& inst, ScalarS32 a, ScalarS32 b); | ||||||
| void EmitIAdd64(EmitContext& ctx, Register a, Register b); | void EmitIAdd64(EmitContext& ctx, Register a, Register b); | ||||||
| void EmitISub32(EmitContext& ctx, IR::Inst& inst, ScalarS32 a, ScalarS32 b); | void EmitISub32(EmitContext& ctx, IR::Inst& inst, ScalarS32 a, ScalarS32 b); | ||||||
|   | |||||||
| @@ -281,18 +281,6 @@ void EmitGetInBoundsFromOp(EmitContext& ctx) { | |||||||
|     NotImplemented(); |     NotImplemented(); | ||||||
| } | } | ||||||
|  |  | ||||||
| void EmitFPIsNan16(EmitContext& ctx, Register value) { |  | ||||||
|     NotImplemented(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void EmitFPIsNan32(EmitContext& ctx, ScalarF32 value) { |  | ||||||
|     NotImplemented(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void EmitFPIsNan64(EmitContext& ctx, Register value) { |  | ||||||
|     NotImplemented(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void EmitSharedAtomicIAdd32(EmitContext& ctx, ScalarU32 pointer_offset, ScalarU32 value) { | void EmitSharedAtomicIAdd32(EmitContext& ctx, ScalarU32 pointer_offset, ScalarU32 value) { | ||||||
|     NotImplemented(); |     NotImplemented(); | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user