aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target/ARM/ARMISelDAGToDAG.cpp
diff options
context:
space:
mode:
authorBob Wilson <bob.wilson@apple.com>2009-08-08 05:53:00 +0000
committerBob Wilson <bob.wilson@apple.com>2009-08-08 05:53:00 +0000
commit64efd90f8c878214abc29afa3d1c1e7bfe854a49 (patch)
tree9be36b26d6b2d9f2b20600577471d4b6d4d02bd6 /lib/Target/ARM/ARMISelDAGToDAG.cpp
parentb7479c035534b1c240117cd0aea8342393160da8 (diff)
downloadexternal_llvm-64efd90f8c878214abc29afa3d1c1e7bfe854a49.zip
external_llvm-64efd90f8c878214abc29afa3d1c1e7bfe854a49.tar.gz
external_llvm-64efd90f8c878214abc29afa3d1c1e7bfe854a49.tar.bz2
Implement Neon VTRN instructions. For now, anyway, these are selected
directly from the intrinsics produced by the frontend. If it is more convenient to have a custom DAG node for using these to implement shuffles, we can add that later. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78459 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM/ARMISelDAGToDAG.cpp')
-rw-r--r--lib/Target/ARM/ARMISelDAGToDAG.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/lib/Target/ARM/ARMISelDAGToDAG.cpp b/lib/Target/ARM/ARMISelDAGToDAG.cpp
index 04f4dd3..bfaf678 100644
--- a/lib/Target/ARM/ARMISelDAGToDAG.cpp
+++ b/lib/Target/ARM/ARMISelDAGToDAG.cpp
@@ -1448,6 +1448,33 @@ SDNode *ARMDAGToDAGISel::Select(SDValue Op) {
N->getOperand(4), N->getOperand(5) };
return CurDAG->getTargetNode(Opc, dl, MVT::Other, Ops, 7);
}
+
+ case ISD::INTRINSIC_WO_CHAIN: {
+ unsigned IntNo = cast<ConstantSDNode>(N->getOperand(0))->getZExtValue();
+ MVT VT = N->getValueType(0);
+ unsigned Opc = 0;
+
+ // Match intrinsics that return multiple values.
+ switch (IntNo) {
+ default: break;
+
+ case Intrinsic::arm_neon_vtrni:
+ switch (VT.getSimpleVT()) {
+ default: return NULL;
+ case MVT::v8i8: Opc = ARM::VTRNd8; break;
+ case MVT::v4i16: Opc = ARM::VTRNd16; break;
+ case MVT::v2f32:
+ case MVT::v2i32: Opc = ARM::VTRNd32; break;
+ case MVT::v16i8: Opc = ARM::VTRNq8; break;
+ case MVT::v8i16: Opc = ARM::VTRNq16; break;
+ case MVT::v4f32:
+ case MVT::v4i32: Opc = ARM::VTRNq32; break;
+ }
+ return CurDAG->getTargetNode(Opc, dl, VT, VT, N->getOperand(1),
+ N->getOperand(2));
+ }
+ break;
+ }
}
return SelectCode(Op);