summaryrefslogtreecommitdiffstats
path: root/src/shader_recompiler/frontend/maxwell/translate/impl/common_funcs.cpp
diff options
context:
space:
mode:
authorameerj <52414509+ameerj@users.noreply.github.com>2021-03-16 05:57:07 +0100
committerameerj <52414509+ameerj@users.noreply.github.com>2021-07-23 03:51:23 +0200
commitfa2f6e38f4d465ba6e5efe6c6bd23d8ef39b080d (patch)
treedf19f729a6814bcdb9bd59446e87971642053da1 /src/shader_recompiler/frontend/maxwell/translate/impl/common_funcs.cpp
parentshader: Implement TEXS (diff)
downloadyuzu-fa2f6e38f4d465ba6e5efe6c6bd23d8ef39b080d.tar
yuzu-fa2f6e38f4d465ba6e5efe6c6bd23d8ef39b080d.tar.gz
yuzu-fa2f6e38f4d465ba6e5efe6c6bd23d8ef39b080d.tar.bz2
yuzu-fa2f6e38f4d465ba6e5efe6c6bd23d8ef39b080d.tar.lz
yuzu-fa2f6e38f4d465ba6e5efe6c6bd23d8ef39b080d.tar.xz
yuzu-fa2f6e38f4d465ba6e5efe6c6bd23d8ef39b080d.tar.zst
yuzu-fa2f6e38f4d465ba6e5efe6c6bd23d8ef39b080d.zip
Diffstat (limited to 'src/shader_recompiler/frontend/maxwell/translate/impl/common_funcs.cpp')
-rw-r--r--src/shader_recompiler/frontend/maxwell/translate/impl/common_funcs.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/common_funcs.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/common_funcs.cpp
index 9d4ac2e36..af9a8f82c 100644
--- a/src/shader_recompiler/frontend/maxwell/translate/impl/common_funcs.cpp
+++ b/src/shader_recompiler/frontend/maxwell/translate/impl/common_funcs.cpp
@@ -58,4 +58,52 @@ IR::U1 PredicateOperation(IR::IREmitter& ir, const IR::U32& result, PredicateOp
}
}
+bool IsCompareOpOrdered(FPCompareOp op) {
+ switch (op) {
+ case FPCompareOp::LTU:
+ case FPCompareOp::EQU:
+ case FPCompareOp::LEU:
+ case FPCompareOp::GTU:
+ case FPCompareOp::NEU:
+ case FPCompareOp::GEU:
+ return false;
+ default:
+ return true;
+ }
+}
+
+IR::U1 FloatingPointCompare(IR::IREmitter& ir, const IR::F32& operand_1, const IR::F32& operand_2,
+ FPCompareOp compare_op, IR::FpControl control) {
+ const bool ordered{IsCompareOpOrdered(compare_op)};
+ switch (compare_op) {
+ case FPCompareOp::F:
+ return ir.Imm1(false);
+ case FPCompareOp::LT:
+ case FPCompareOp::LTU:
+ return ir.FPLessThan(operand_1, operand_2, control, ordered);
+ case FPCompareOp::EQ:
+ case FPCompareOp::EQU:
+ return ir.FPEqual(operand_1, operand_2, control, ordered);
+ case FPCompareOp::LE:
+ case FPCompareOp::LEU:
+ return ir.FPLessThanEqual(operand_1, operand_2, control, ordered);
+ case FPCompareOp::GT:
+ case FPCompareOp::GTU:
+ return ir.FPGreaterThan(operand_1, operand_2, control, ordered);
+ case FPCompareOp::NE:
+ case FPCompareOp::NEU:
+ return ir.FPNotEqual(operand_1, operand_2, control, ordered);
+ case FPCompareOp::GE:
+ case FPCompareOp::GEU:
+ return ir.FPGreaterThanEqual(operand_1, operand_2, control, ordered);
+ case FPCompareOp::NUM:
+ return ir.FPOrdered(operand_1, operand_2);
+ case FPCompareOp::Nan:
+ return ir.FPUnordered(operand_1, operand_2);
+ case FPCompareOp::T:
+ return ir.Imm1(true);
+ default:
+ throw NotImplementedException("Invalid FP compare op {}", compare_op);
+ }
+}
} // namespace Shader::Maxwell