summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorSanjay Patel <spatel@rotateright.com>2015-10-26 21:24:09 +0000
committerSanjay Patel <spatel@rotateright.com>2015-10-26 21:24:09 +0000
commitfdf75452e4e2ba88a2f228dde6256887746db247 (patch)
tree9e6cf57e6294aa7c7593b07a33a83762e79fd5aa /llvm/lib/Target
parent277bfaefaf92dbf602d1a77ea9dec69ded1107cb (diff)
downloadbcm5719-llvm-fdf75452e4e2ba88a2f228dde6256887746db247.tar.gz
bcm5719-llvm-fdf75452e4e2ba88a2f228dde6256887746db247.zip
reorganize logic; NFCI
This is a preliminary step before adding another optimization to PerformBITCASTCombine(). llvm-svn: 251349
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp47
1 files changed, 33 insertions, 14 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 63c2b9a21dc..49fd42c0629 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -23123,21 +23123,40 @@ static SDValue XFormVExtractWithShuffleIntoLoad(SDNode *N, SelectionDAG &DAG,
EltNo);
}
-/// \brief Detect bitcasts between i32 to x86mmx low word. Since MMX types are
-/// special and don't usually play with other vector types, it's better to
-/// handle them early to be sure we emit efficient code by avoiding
-/// store-load conversions.
-static SDValue PerformBITCASTCombine(SDNode *N, SelectionDAG &DAG) {
- if (N->getValueType(0) != MVT::x86mmx ||
- N->getOperand(0)->getOpcode() != ISD::BUILD_VECTOR ||
- N->getOperand(0)->getValueType(0) != MVT::v2i32)
- return SDValue();
+static SDValue PerformBITCASTCombine(SDNode *N, SelectionDAG &DAG,
+ const X86Subtarget *Subtarget) {
+ SDValue N0 = N->getOperand(0);
+ EVT VT = N->getValueType(0);
- SDValue V = N->getOperand(0);
- ConstantSDNode *C = dyn_cast<ConstantSDNode>(V.getOperand(1));
- if (C && C->getZExtValue() == 0 && V.getOperand(0).getValueType() == MVT::i32)
- return DAG.getNode(X86ISD::MMX_MOVW2D, SDLoc(V.getOperand(0)),
- N->getValueType(0), V.getOperand(0));
+ // Detect bitcasts between i32 to x86mmx low word. Since MMX types are
+ // special and don't usually play with other vector types, it's better to
+ // handle them early to be sure we emit efficient code by avoiding
+ // store-load conversions.
+ if (VT == MVT::x86mmx && N0.getOpcode() == ISD::BUILD_VECTOR &&
+ N0.getValueType() == MVT::v2i32 &&
+ isa<ConstantSDNode>(N0.getOperand(1))) {
+ SDValue N00 = N0->getOperand(0);
+ if (N0.getConstantOperandVal(1) == 0 && N00.getValueType() == MVT::i32)
+ return DAG.getNode(X86ISD::MMX_MOVW2D, SDLoc(N00), VT, N00);
+ }
+
+ if ((Subtarget->hasSSE1() && VT == MVT::f32) ||
+ (Subtarget->hasSSE2() && VT == MVT::f64)) {
+ if (N0.getOpcode() == ISD::AND) {
+ if (isa<ConstantSDNode>(N0.getOperand(1))) {
+ SDValue N00 = N0.getOperand(0);
+ if (N00.getOpcode() == ISD::BITCAST) {
+ SDValue N000 = N00.getOperand(0);
+ if (N00.getOperand(0).getValueType() == VT) {
+ unsigned FPOpcode = X86ISD::FAND;
+ SDValue FPConst = DAG.getBitcast(VT, N0.getOperand(1));
+ SDValue FPLogic = DAG.getNode(FPOpcode, SDLoc(N0), VT, N000, FPConst);
+ return FPLogic;
+ }
+ }
+ }
+ }
+ }
return SDValue();
}
OpenPOWER on IntegriCloud