summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2018-02-02 05:59:33 +0000
committerCraig Topper <craig.topper@intel.com>2018-02-02 05:59:33 +0000
commit76c5ce518493669e23c73c02e616b4a5ca46ef63 (patch)
treed4f862adc6a081ed50c8005ad5d1c30121fd6edf /llvm/lib/Target
parent5570e03b21e9304e51f63d75e9028c100a1b4c6a (diff)
downloadbcm5719-llvm-76c5ce518493669e23c73c02e616b4a5ca46ef63.tar.gz
bcm5719-llvm-76c5ce518493669e23c73c02e616b4a5ca46ef63.zip
[X86] Legalize (v64i1 (bitcast (i64 X))) on 32-bit targets by extracting 32-bit halves from i32, bitcasting each to v32i1, and concatenating.
This prevents the scalarization that would otherwise occur. llvm-svn: 324057
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index a55770ae2f1..9d9ee212bbf 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -23602,6 +23602,22 @@ static SDValue LowerBITCAST(SDValue Op, const X86Subtarget &Subtarget,
MVT SrcVT = Op.getOperand(0).getSimpleValueType();
MVT DstVT = Op.getSimpleValueType();
+ // Legalize (v64i1 (bitcast i64 (X))) by splitting the i64, bitcasting each
+ // half to v32i1 and concatenating the result.
+ if (SrcVT == MVT::i64 && DstVT == MVT::v64i1) {
+ assert(!Subtarget.is64Bit() && "Expected 32-bit mode");
+ assert(Subtarget.hasBWI() && "Expected BWI target");
+ SDValue Op0 = Op->getOperand(0);
+ SDLoc dl(Op);
+ SDValue Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32, Op0,
+ DAG.getIntPtrConstant(0, dl));
+ Lo = DAG.getBitcast(MVT::v32i1, Lo);
+ SDValue Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32, Op0,
+ DAG.getIntPtrConstant(1, dl));
+ Hi = DAG.getBitcast(MVT::v32i1, Hi);
+ return DAG.getNode(ISD::CONCAT_VECTORS, dl, MVT::v64i1, Lo, Hi);
+ }
+
if (SrcVT == MVT::v2i32 || SrcVT == MVT::v4i16 || SrcVT == MVT::v8i8 ||
SrcVT == MVT::i64) {
assert(Subtarget.hasSSE2() && "Requires at least SSE2!");
OpenPOWER on IntegriCloud