Просмотр исходного кода

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.
ReinUsesLisp 6 лет назад
Родитель
Сommit
c788f9c0bd

+ 4 - 0
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 - 0
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);