summaryrefslogtreecommitdiffstats
path: root/src/shader_recompiler/frontend/maxwell/translate/impl/integer_set_predicate.cpp
diff options
context:
space:
mode:
authorameerj <52414509+ameerj@users.noreply.github.com>2021-07-13 01:56:14 +0200
committerameerj <52414509+ameerj@users.noreply.github.com>2021-07-23 03:51:40 +0200
commitfc7bed21b539aac4fdde74a41217066eaf8ed3f9 (patch)
treeb76c4c93772f468d44e065cb3cae468060454b08 /src/shader_recompiler/frontend/maxwell/translate/impl/integer_set_predicate.cpp
parentshader: Avoid usage of C++20 ranges to build in clang (diff)
downloadyuzu-fc7bed21b539aac4fdde74a41217066eaf8ed3f9.tar
yuzu-fc7bed21b539aac4fdde74a41217066eaf8ed3f9.tar.gz
yuzu-fc7bed21b539aac4fdde74a41217066eaf8ed3f9.tar.bz2
yuzu-fc7bed21b539aac4fdde74a41217066eaf8ed3f9.tar.lz
yuzu-fc7bed21b539aac4fdde74a41217066eaf8ed3f9.tar.xz
yuzu-fc7bed21b539aac4fdde74a41217066eaf8ed3f9.tar.zst
yuzu-fc7bed21b539aac4fdde74a41217066eaf8ed3f9.zip
Diffstat (limited to '')
-rw-r--r--src/shader_recompiler/frontend/maxwell/translate/impl/integer_set_predicate.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/integer_set_predicate.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/integer_set_predicate.cpp
index 7743701d0..bee10e5b9 100644
--- a/src/shader_recompiler/frontend/maxwell/translate/impl/integer_set_predicate.cpp
+++ b/src/shader_recompiler/frontend/maxwell/translate/impl/integer_set_predicate.cpp
@@ -9,6 +9,12 @@
namespace Shader::Maxwell {
namespace {
+IR::U1 IsetpCompare(IR::IREmitter& ir, const IR::U32& operand_1, const IR::U32& operand_2,
+ CompareOp compare_op, bool is_signed, bool x) {
+ return x ? ExtendedIntegerCompare(ir, operand_1, operand_2, compare_op, is_signed)
+ : IntegerCompare(ir, operand_1, operand_2, compare_op, is_signed);
+}
+
void ISETP(TranslatorVisitor& v, u64 insn, const IR::U32& op_b) {
union {
u64 raw;
@@ -17,15 +23,18 @@ void ISETP(TranslatorVisitor& v, u64 insn, const IR::U32& op_b) {
BitField<8, 8, IR::Reg> src_reg_a;
BitField<39, 3, IR::Pred> bop_pred;
BitField<42, 1, u64> neg_bop_pred;
+ BitField<43, 1, u64> x;
BitField<45, 2, BooleanOp> bop;
BitField<48, 1, u64> is_signed;
BitField<49, 3, CompareOp> compare_op;
} const isetp{insn};
+ const bool is_signed{isetp.is_signed != 0};
+ const bool x{isetp.x != 0};
const BooleanOp bop{isetp.bop};
const CompareOp compare_op{isetp.compare_op};
const IR::U32 op_a{v.X(isetp.src_reg_a)};
- const IR::U1 comparison{IntegerCompare(v.ir, op_a, op_b, compare_op, isetp.is_signed != 0)};
+ const IR::U1 comparison{IsetpCompare(v.ir, op_a, op_b, compare_op, is_signed, x)};
const IR::U1 bop_pred{v.ir.GetPred(isetp.bop_pred, isetp.neg_bop_pred != 0)};
const IR::U1 result_a{PredicateCombine(v.ir, comparison, bop_pred, bop)};
const IR::U1 result_b{PredicateCombine(v.ir, v.ir.LogicalNot(comparison), bop_pred, bop)};