Expand arith on machines without carry flags

llvm-svn: 57243
This commit is contained in:
Andrew Lenharth 2008-10-07 14:15:42 +00:00
parent 8ae3684aa9
commit 3a9be150be
3 changed files with 42 additions and 10 deletions

View File

@ -6431,7 +6431,6 @@ void SelectionDAGLegalize::ExpandOp(SDValue Op, SDValue &Lo, SDValue &Hi){
break;
}
}
// Expand the subcomponents.
SDValue LHSL, LHSH, RHSL, RHSH;
ExpandOp(Node->getOperand(0), LHSL, LHSH);
@ -6442,6 +6441,7 @@ void SelectionDAGLegalize::ExpandOp(SDValue Op, SDValue &Lo, SDValue &Hi){
LoOps[1] = RHSL;
HiOps[0] = LHSH;
HiOps[1] = RHSH;
if(TLI.isOperationLegal(ISD::ADDC, NVT)) {
if (Node->getOpcode() == ISD::ADD) {
Lo = DAG.getNode(ISD::ADDC, VTList, LoOps, 2);
HiOps[2] = Lo.getValue(1);
@ -6452,6 +6452,30 @@ void SelectionDAGLegalize::ExpandOp(SDValue Op, SDValue &Lo, SDValue &Hi){
Hi = DAG.getNode(ISD::SUBE, VTList, HiOps, 3);
}
break;
} else {
if (Node->getOpcode() == ISD::ADD) {
Lo = DAG.getNode(ISD::ADD, VTList, LoOps, 2);
Hi = DAG.getNode(ISD::ADD, VTList, HiOps, 2);
SDValue Cmp1 = DAG.getSetCC(NVT, Lo, LoOps[0], ISD::SETULT);
SDValue Carry1 = DAG.getNode(ISD::SELECT, NVT, Cmp1,
DAG.getConstant(1, NVT),
DAG.getConstant(0, NVT));
SDValue Cmp2 = DAG.getSetCC(NVT, Lo, LoOps[1], ISD::SETULT);
SDValue Carry2 = DAG.getNode(ISD::SELECT, NVT, Cmp2,
DAG.getConstant(1, NVT),
Carry1);
Hi = DAG.getNode(ISD::ADD, NVT, Hi, Carry2);
} else {
Lo = DAG.getNode(ISD::SUB, VTList, LoOps, 2);
Hi = DAG.getNode(ISD::SUB, VTList, HiOps, 2);
SDValue Cmp = DAG.getSetCC(NVT, LoOps[0], LoOps[1], ISD::SETULT);
SDValue Borrow = DAG.getNode(ISD::SELECT, NVT, Cmp,
DAG.getConstant(1, NVT),
DAG.getConstant(0, NVT));
Hi = DAG.getNode(ISD::SUB, NVT, Hi, Borrow);
}
break;
}
}
case ISD::ADDC:

View File

@ -1,7 +1,6 @@
;test for ADDC and ADDE expansion
;
; RUN: llvm-as < %s | llc -march=alpha
; XFAIL: *
define i128 @add128(i128 %x, i128 %y) {
entry:

View File

@ -0,0 +1,9 @@
;test for SUBC and SUBE expansion
;
; RUN: llvm-as < %s | llc -march=alpha
define i128 @sub128(i128 %x, i128 %y) {
entry:
%tmp = sub i128 %y, %x
ret i128 %tmp
}