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.
This commit is contained in:
ReinUsesLisp 2020-04-25 22:41:20 -03:00
parent 255197e643
commit c788f9c0bd
2 changed files with 10 additions and 0 deletions

View file

@ -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;

View file

@ -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);