summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2013-04-14 05:10:36 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2013-04-14 05:10:36 +0000
commitc3c28f8599f56c91974000f8044bf392beb753e5 (patch)
tree1d97cd9ad39e01ef60d117f2d8a80662bcbd0ab2 /llvm/lib
parentc8fc76b0788357e3e0f1ba6a29f25458dc18e696 (diff)
downloadbcm5719-llvm-c3c28f8599f56c91974000f8044bf392beb753e5.tar.gz
bcm5719-llvm-c3c28f8599f56c91974000f8044bf392beb753e5.zip
Add support for the abs64 SPARC v9 code model.
For when 16 TB just isn't enough. llvm-svn: 179474
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/Sparc/SparcISelLowering.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/llvm/lib/Target/Sparc/SparcISelLowering.cpp b/llvm/lib/Target/Sparc/SparcISelLowering.cpp
index 33003684f04..198d194a3c9 100644
--- a/llvm/lib/Target/Sparc/SparcISelLowering.cpp
+++ b/llvm/lib/Target/Sparc/SparcISelLowering.cpp
@@ -1410,14 +1410,23 @@ SDValue SparcTargetLowering::makeAddress(SDValue Op, SelectionDAG &DAG) const {
default:
llvm_unreachable("Unsupported absolute code model");
case CodeModel::Small:
+ // abs32.
return makeHiLoPair(Op, SPII::MO_HI, SPII::MO_LO, DAG);
case CodeModel::Medium: {
+ // abs44.
SDValue H44 = makeHiLoPair(Op, SPII::MO_H44, SPII::MO_M44, DAG);
H44 = DAG.getNode(ISD::SHL, DL, VT, H44, DAG.getIntPtrConstant(12));
SDValue L44 = withTargetFlags(Op, SPII::MO_L44, DAG);
L44 = DAG.getNode(SPISD::Lo, DL, VT, L44);
return DAG.getNode(ISD::ADD, DL, VT, H44, L44);
}
+ case CodeModel::Large: {
+ // abs64.
+ SDValue Hi = makeHiLoPair(Op, SPII::MO_HH, SPII::MO_HM, DAG);
+ Hi = DAG.getNode(ISD::SHL, DL, VT, Hi, DAG.getIntPtrConstant(32));
+ SDValue Lo = makeHiLoPair(Op, SPII::MO_HI, SPII::MO_LO, DAG);
+ return DAG.getNode(ISD::ADD, DL, VT, Hi, Lo);
+ }
}
}
OpenPOWER on IntegriCloud