2
1
Fork 0
mirror of https://github.com/yuzu-emu/yuzu.git synced 2024-07-04 23:31:19 +01:00

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; BitField<49, 1, u64> negate_a;
} alu_integer; } alu_integer;
union {
BitField<43, 1, u64> x;
} iadd;
union { union {
BitField<39, 1, u64> ftz; BitField<39, 1, u64> ftz;
BitField<32, 1, u64> saturate; 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); 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) { if (instr.generates_cc) {
const Node i0 = Immediate(0); const Node i0 = Immediate(0);