summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/ARM64/ARM64ISelDAGToDAG.cpp
diff options
context:
space:
mode:
authorTim Northover <tnorthover@apple.com>2014-04-17 20:00:24 +0000
committerTim Northover <tnorthover@apple.com>2014-04-17 20:00:24 +0000
commit0129f298c49d2361143d55a5d4408ad9da29b549 (patch)
tree6ef66800542b99864f630b041594c780889cacbd /llvm/lib/Target/ARM64/ARM64ISelDAGToDAG.cpp
parent6e4dea2bb79471e5ff6d1caa95efc0bed5c37de3 (diff)
downloadbcm5719-llvm-0129f298c49d2361143d55a5d4408ad9da29b549.tar.gz
bcm5719-llvm-0129f298c49d2361143d55a5d4408ad9da29b549.zip
ARM64: add acquire/release versions of the existing atomic intrinsics.
These will be needed to support IR-level lowering of atomic operations. llvm-svn: 206489
Diffstat (limited to 'llvm/lib/Target/ARM64/ARM64ISelDAGToDAG.cpp')
-rw-r--r--llvm/lib/Target/ARM64/ARM64ISelDAGToDAG.cpp11
1 files changed, 8 insertions, 3 deletions
diff --git a/llvm/lib/Target/ARM64/ARM64ISelDAGToDAG.cpp b/llvm/lib/Target/ARM64/ARM64ISelDAGToDAG.cpp
index 956f61148ee..9e5b5af0d92 100644
--- a/llvm/lib/Target/ARM64/ARM64ISelDAGToDAG.cpp
+++ b/llvm/lib/Target/ARM64/ARM64ISelDAGToDAG.cpp
@@ -1969,12 +1969,15 @@ SDNode *ARM64DAGToDAGISel::Select(SDNode *Node) {
switch (IntNo) {
default:
break;
+ case Intrinsic::arm64_ldaxp:
case Intrinsic::arm64_ldxp: {
+ unsigned Op =
+ IntNo == Intrinsic::arm64_ldaxp ? ARM64::LDAXPX : ARM64::LDXPX;
SDValue MemAddr = Node->getOperand(2);
SDLoc DL(Node);
SDValue Chain = Node->getOperand(0);
- SDNode *Ld = CurDAG->getMachineNode(ARM64::LDXPX, DL, MVT::i64, MVT::i64,
+ SDNode *Ld = CurDAG->getMachineNode(Op, DL, MVT::i64, MVT::i64,
MVT::Other, MemAddr, Chain);
// Transfer memoperands.
@@ -1983,7 +1986,10 @@ SDNode *ARM64DAGToDAGISel::Select(SDNode *Node) {
cast<MachineSDNode>(Ld)->setMemRefs(MemOp, MemOp + 1);
return Ld;
}
+ case Intrinsic::arm64_stlxp:
case Intrinsic::arm64_stxp: {
+ unsigned Op =
+ IntNo == Intrinsic::arm64_stlxp ? ARM64::STLXPX : ARM64::STXPX;
SDLoc DL(Node);
SDValue Chain = Node->getOperand(0);
SDValue ValLo = Node->getOperand(2);
@@ -1997,8 +2003,7 @@ SDNode *ARM64DAGToDAGISel::Select(SDNode *Node) {
Ops.push_back(MemAddr);
Ops.push_back(Chain);
- SDNode *St =
- CurDAG->getMachineNode(ARM64::STXPX, DL, MVT::i32, MVT::Other, Ops);
+ SDNode *St = CurDAG->getMachineNode(Op, DL, MVT::i32, MVT::Other, Ops);
// Transfer memoperands.
MachineSDNode::mmo_iterator MemOp = MF->allocateMemRefsArray(1);
MemOp[0] = cast<MemIntrinsicSDNode>(Node)->getMemOperand();
OpenPOWER on IntegriCloud