diff --git a/src/shader_recompiler/frontend/translate/vector_alu.cpp b/src/shader_recompiler/frontend/translate/vector_alu.cpp index 2aa19ab81..bfbb84f52 100644 --- a/src/shader_recompiler/frontend/translate/vector_alu.cpp +++ b/src/shader_recompiler/frontend/translate/vector_alu.cpp @@ -665,8 +665,13 @@ void Translator::V_SUBREV_F32(const GcnInst& inst) { void Translator::V_SUBREV_I32(const GcnInst& inst) { const IR::U32 src0{GetSrc(inst.src[0])}; const IR::U32 src1{GetSrc(inst.src[1])}; - SetDst(inst.dst[0], ir.ISub(src1, src0)); - // TODO: Carry-out + const IR::U32 result{ir.ISub(src1, src0)}; + SetDst(inst.dst[0], result); + const IR::U32 sign_mask{ir.Imm32(1 << 31)}; + const IR::U32 sign0{ir.BitwiseAnd(src0, sign_mask)}; + const IR::U32 sign1{ir.BitwiseAnd(src1, sign_mask)}; + const IR::U32 signr{ir.BitwiseAnd(result, sign_mask)}; + ir.SetVcc(ir.LogicalAnd(ir.INotEqual(sign0, sign1), ir.INotEqual(sign0, signr))); } void Translator::V_MAD_U64_U32(const GcnInst& inst) {