summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2020-04-25 22:42:33 -0300
committerReinUsesLisp <reinuseslisp@airmail.cc>2020-04-25 22:57:54 -0300
commit2a96bea6a7efd9efaaa8d1d72f1eb8ca27cb81f8 (patch)
tree6cd0335814b5dacb81ac60d1ffba9caa22164e67 /src
parentc788f9c0bd9cb0b0cb66f7424a65032cca3731cc (diff)
shader/arithmetic_integer: Change IAdd to UAdd to avoid signed overflow
Signed integer addition overflow might be undefined behavior. It's free to change operations to UAdd and use unsigned integers to avoid potential bugs.
Diffstat (limited to 'src')
-rw-r--r--src/video_core/shader/decode/arithmetic_integer.cpp4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/video_core/shader/decode/arithmetic_integer.cpp b/src/video_core/shader/decode/arithmetic_integer.cpp
index 2a3311cb8..addd7f533 100644
--- a/src/video_core/shader/decode/arithmetic_integer.cpp
+++ b/src/video_core/shader/decode/arithmetic_integer.cpp
@@ -40,12 +40,12 @@ u32 ShaderIR::DecodeArithmeticInteger(NodeBlock& bb, u32 pc) {
op_a = GetOperandAbsNegInteger(op_a, false, instr.alu_integer.negate_a, true);
op_b = GetOperandAbsNegInteger(op_b, false, instr.alu_integer.negate_b, true);
- Node value = Operation(OperationCode::IAdd, op_a, op_b);
+ Node value = Operation(OperationCode::UAdd, op_a, op_b);
if (instr.iadd.x) {
Node carry = GetInternalFlag(InternalFlag::Carry);
Node x = Operation(OperationCode::Select, std::move(carry), Immediate(1), Immediate(0));
- value = Operation(OperationCode::IAdd, std::move(value), std::move(x));
+ value = Operation(OperationCode::UAdd, std::move(value), std::move(x));
}
if (instr.generates_cc) {