[llvm] [RISCV][GISel] Lower G_SADDE (PR #156865)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 4 05:14:57 PDT 2025
================
@@ -9288,6 +9290,40 @@ LegalizerHelper::lowerSADDO_SSUBO(MachineInstr &MI) {
return Legalized;
}
+LegalizerHelper::LegalizeResult LegalizerHelper::lowerSADDE(MachineInstr &MI) {
+ auto [Res, OvOut, LHS, RHS, CarryIn] = MI.getFirst5Regs();
+ const LLT Ty = MRI.getType(Res);
+ const LLT BoolTy = MRI.getType(OvOut);
+
+ Register NewRes = MRI.cloneVirtualRegister(Res);
+
+ // Step 1: tmp = LHS + RHS
+ auto Tmp = MIRBuilder.buildAdd(Ty, LHS, RHS);
+
+ // ov0 = (tmp < lhs) XOR (rhs < 0)
+ auto TmpLtLHS = MIRBuilder.buildICmp(CmpInst::ICMP_SLT, BoolTy, Tmp, LHS);
+ auto Zero = MIRBuilder.buildConstant(Ty, 0);
+ auto RHSLt0 = MIRBuilder.buildICmp(CmpInst::ICMP_SLT, BoolTy, RHS, Zero);
+ auto Ov0 = MIRBuilder.buildXor(BoolTy, TmpLtLHS, RHSLt0);
+
+ // Step 2: sum = tmp + zext(CarryIn)
+ auto CarryInZ = MIRBuilder.buildZExt(Ty, CarryIn);
+ MIRBuilder.buildAdd(NewRes, Tmp, CarryInZ);
+
+ // ov1 = CarryIn & (sum < tmp)
+ auto SumLtTmp = MIRBuilder.buildICmp(CmpInst::ICMP_SLT, BoolTy, NewRes, Tmp);
+ auto Ov1 = MIRBuilder.buildAnd(BoolTy, SumLtTmp, CarryIn);
+
+ // ov = ov0 | ov1
+ auto Ov = MIRBuilder.buildOr(BoolTy, Ov0, Ov1);
+
+ MIRBuilder.buildCopy(OvOut, Ov);
+ MIRBuilder.buildCopy(Res, NewRes);
----------------
arsenm wrote:
This case should be simple to just directly use the original result registers for the new instructions without a new copy
https://github.com/llvm/llvm-project/pull/156865
More information about the llvm-commits
mailing list