summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/ARM/ARMISelLowering.cpp
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2011-11-15 02:12:34 +0000
committerEvan Cheng <evan.cheng@apple.com>2011-11-15 02:12:34 +0000
commit7ca4b6eb5cf95f0c33a6997af4bfb30103b0b08a (patch)
treee904b4b2e00f72725067780db3c5c0fee6323c34 /llvm/lib/Target/ARM/ARMISelLowering.cpp
parentd5c17edb04b4260fbbaca8e9a9b5e18f86964799 (diff)
downloadbcm5719-llvm-7ca4b6eb5cf95f0c33a6997af4bfb30103b0b08a.tar.gz
bcm5719-llvm-7ca4b6eb5cf95f0c33a6997af4bfb30103b0b08a.zip
Add vmov.f32 to materialize f32 immediate splats which cannot be handled by
integer variants. rdar://10437054 llvm-svn: 144608
Diffstat (limited to 'llvm/lib/Target/ARM/ARMISelLowering.cpp')
-rw-r--r--llvm/lib/Target/ARM/ARMISelLowering.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp
index b55ef700f5c..e35a570b5e4 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -912,6 +912,7 @@ const char *ARMTargetLowering::getTargetNodeName(unsigned Opcode) const {
case ARMISD::VGETLANEs: return "ARMISD::VGETLANEs";
case ARMISD::VMOVIMM: return "ARMISD::VMOVIMM";
case ARMISD::VMVNIMM: return "ARMISD::VMVNIMM";
+ case ARMISD::VMOVFPIMM: return "ARMISD::VMOVFPIMM";
case ARMISD::VDUP: return "ARMISD::VDUP";
case ARMISD::VDUPLANE: return "ARMISD::VDUPLANE";
case ARMISD::VEXT: return "ARMISD::VEXT";
@@ -3986,6 +3987,16 @@ SDValue ARMTargetLowering::LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG,
SDValue Vmov = DAG.getNode(ARMISD::VMVNIMM, dl, VmovVT, Val);
return DAG.getNode(ISD::BITCAST, dl, VT, Vmov);
}
+
+ // Use vmov.f32 to materialize other v2f32 and v4f32 splats.
+ if (VT == MVT::v2f32 || VT == MVT::v4f32) {
+ ConstantFPSDNode *C = cast<ConstantFPSDNode>(Op.getOperand(0));
+ int ImmVal = ARM_AM::getFP32Imm(C->getValueAPF());
+ if (ImmVal != -1) {
+ SDValue Val = DAG.getTargetConstant(ImmVal, MVT::i32);
+ return DAG.getNode(ARMISD::VMOVFPIMM, dl, VT, Val);
+ }
+ }
}
}
OpenPOWER on IntegriCloud