shader: implement RDNA2 subrev borrow

This commit is contained in:
nmzik
2026-08-15 04:47:25 +02:00
parent 9c316e6988
commit 4a7bc55afa
8 changed files with 128 additions and 21 deletions
@@ -74,7 +74,8 @@ bool Translator::TranslateStateOperation(const IR::Instruction& inst) {
}
return true;
}
case IR::Opcode::ScalarSubBorrowCarryU32: {
case IR::Opcode::ScalarSubBorrowCarryU32:
case IR::Opcode::ISubBorrowCarryU32: {
const auto lhs = ReadU32(inst.src[0]);
const auto rhs = ReadU32(inst.src[1]);
const auto borrow_in = ConditionBit(inst.src[2]);
@@ -83,7 +84,12 @@ bool Translator::TranslateStateOperation(const IR::Instruction& inst) {
const auto borrow0 = ir.UGreaterThan(rhs, lhs);
const auto borrow1 = ir.UGreaterThan(borrow_in, partial);
WriteOperand(inst.dst, result);
ir.SetScc(ir.LogicalOr(borrow0, borrow1));
const auto borrow = ir.LogicalOr(borrow0, borrow1);
if (inst.op == IR::Opcode::ScalarSubBorrowCarryU32) {
ir.SetScc(borrow);
} else {
WriteMask(inst.dst2, borrow);
}
return true;
}
case IR::Opcode::ScalarSignedAddOverflowI32: