diff options
author | Thomas Lively <tlively@google.com> | 2019-09-23 20:42:12 +0000 |
---|---|---|
committer | Thomas Lively <tlively@google.com> | 2019-09-23 20:42:12 +0000 |
commit | 99d3dd287adfc16a26570b250fafb0031ed7c350 (patch) | |
tree | 462c9fef58577b4b0157341400b008ce03c6739b /llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp | |
parent | 23aac95a32c477efeba055a0ce194024cc8784e9 (diff) | |
download | bcm5719-llvm-99d3dd287adfc16a26570b250fafb0031ed7c350.tar.gz bcm5719-llvm-99d3dd287adfc16a26570b250fafb0031ed7c350.zip |
[WebAssembly] vNxM.load_splat instructions
Summary:
Adds the new load_splat instructions as specified at
https://github.com/WebAssembly/simd/blob/master/proposals/simd/SIMD.md#load-and-splat.
DAGISel does not allow matching multiple copies of the same load in a
single pattern, so we use a new node in WebAssemblyISD to wrap loads
that should be splatted.
Depends on D67783.
Reviewers: aheejin
Subscribers: dschuff, sbc100, jgravelle-google, hiraditya, sunfish, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D67784
llvm-svn: 372655
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp')
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp index 49a9fb0c619..8528d930d21 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp @@ -1358,7 +1358,16 @@ SDValue WebAssemblyTargetLowering::LowerBUILD_VECTOR(SDValue Op, } } // Use a splat for the initial vector - SDValue Result = DAG.getSplatBuildVector(VecT, DL, SplatValue); + SDValue Result; + // Possibly a load_splat + LoadSDNode *SplattedLoad; + if (Subtarget->hasUnimplementedSIMD128() && + (SplattedLoad = dyn_cast<LoadSDNode>(SplatValue)) && + SplattedLoad->getMemoryVT() == VecT.getVectorElementType()) { + Result = DAG.getNode(WebAssemblyISD::LOAD_SPLAT, DL, VecT, SplatValue); + } else { + Result = DAG.getSplatBuildVector(VecT, DL, SplatValue); + } // Add replace_lane instructions for other values for (size_t I = 0; I < Lanes; ++I) { const SDValue &Lane = Op->getOperand(I); |