mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-04 17:58:22 +00:00
Expand arith on machines without carry flags
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@57243 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
cb73d19a4c
commit
40d513960a
@ -6431,7 +6431,6 @@ void SelectionDAGLegalize::ExpandOp(SDValue Op, SDValue &Lo, SDValue &Hi){
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Expand the subcomponents.
|
// Expand the subcomponents.
|
||||||
SDValue LHSL, LHSH, RHSL, RHSH;
|
SDValue LHSL, LHSH, RHSL, RHSH;
|
||||||
ExpandOp(Node->getOperand(0), LHSL, LHSH);
|
ExpandOp(Node->getOperand(0), LHSL, LHSH);
|
||||||
@ -6442,16 +6441,41 @@ void SelectionDAGLegalize::ExpandOp(SDValue Op, SDValue &Lo, SDValue &Hi){
|
|||||||
LoOps[1] = RHSL;
|
LoOps[1] = RHSL;
|
||||||
HiOps[0] = LHSH;
|
HiOps[0] = LHSH;
|
||||||
HiOps[1] = RHSH;
|
HiOps[1] = RHSH;
|
||||||
if (Node->getOpcode() == ISD::ADD) {
|
if(TLI.isOperationLegal(ISD::ADDC, NVT)) {
|
||||||
Lo = DAG.getNode(ISD::ADDC, VTList, LoOps, 2);
|
if (Node->getOpcode() == ISD::ADD) {
|
||||||
HiOps[2] = Lo.getValue(1);
|
Lo = DAG.getNode(ISD::ADDC, VTList, LoOps, 2);
|
||||||
Hi = DAG.getNode(ISD::ADDE, VTList, HiOps, 3);
|
HiOps[2] = Lo.getValue(1);
|
||||||
|
Hi = DAG.getNode(ISD::ADDE, VTList, HiOps, 3);
|
||||||
|
} else {
|
||||||
|
Lo = DAG.getNode(ISD::SUBC, VTList, LoOps, 2);
|
||||||
|
HiOps[2] = Lo.getValue(1);
|
||||||
|
Hi = DAG.getNode(ISD::SUBE, VTList, HiOps, 3);
|
||||||
|
}
|
||||||
|
break;
|
||||||
} else {
|
} else {
|
||||||
Lo = DAG.getNode(ISD::SUBC, VTList, LoOps, 2);
|
if (Node->getOpcode() == ISD::ADD) {
|
||||||
HiOps[2] = Lo.getValue(1);
|
Lo = DAG.getNode(ISD::ADD, VTList, LoOps, 2);
|
||||||
Hi = DAG.getNode(ISD::SUBE, VTList, HiOps, 3);
|
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;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case ISD::ADDC:
|
case ISD::ADDC:
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
;test for ADDC and ADDE expansion
|
;test for ADDC and ADDE expansion
|
||||||
;
|
;
|
||||||
; RUN: llvm-as < %s | llc -march=alpha
|
; RUN: llvm-as < %s | llc -march=alpha
|
||||||
; XFAIL: *
|
|
||||||
|
|
||||||
define i128 @add128(i128 %x, i128 %y) {
|
define i128 @add128(i128 %x, i128 %y) {
|
||||||
entry:
|
entry:
|
||||||
|
9
test/CodeGen/Alpha/sub128.ll
Normal file
9
test/CodeGen/Alpha/sub128.ll
Normal 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
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user