Browse Source

shader/arithmetic_integer: Implement IADD.X

IADD.X takes the carry flag and adds it to the result. This is generally
used to emulate 64-bit operations with 32-bit registers.
pull/15/merge
ReinUsesLisp 6 years ago
parent
commit
c788f9c0bd
  1. 4
      src/video_core/engines/shader_bytecode.h
  2. 6
      src/video_core/shader/decode/arithmetic_integer.cpp

4
src/video_core/engines/shader_bytecode.h

@ -813,6 +813,10 @@ union Instruction {
BitField<49, 1, u64> negate_a;
} alu_integer;
union {
BitField<43, 1, u64> x;
} iadd;
union {
BitField<39, 1, u64> ftz;
BitField<32, 1, u64> saturate;

6
src/video_core/shader/decode/arithmetic_integer.cpp

@ -42,6 +42,12 @@ u32 ShaderIR::DecodeArithmeticInteger(NodeBlock& bb, u32 pc) {
Node value = Operation(OperationCode::IAdd, 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));
}
if (instr.generates_cc) {
const Node i0 = Immediate(0);

Loading…
Cancel
Save