diff options
author | ameerj <52414509+ameerj@users.noreply.github.com> | 2021-03-16 05:57:07 +0100 |
---|---|---|
committer | ameerj <52414509+ameerj@users.noreply.github.com> | 2021-07-23 03:51:23 +0200 |
commit | fa2f6e38f4d465ba6e5efe6c6bd23d8ef39b080d (patch) | |
tree | df19f729a6814bcdb9bd59446e87971642053da1 /src/shader_recompiler/frontend/maxwell/translate/impl/common_funcs.cpp | |
parent | shader: Implement TEXS (diff) | |
download | yuzu-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.cpp | 48 |
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 |