diff options
| author | Craig Topper <craig.topper@intel.com> | 2017-11-04 06:44:47 +0000 |
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2017-11-04 06:44:47 +0000 |
| commit | a96d62b360b873046035ba439053cd4de2ff1470 (patch) | |
| tree | 511ab85f17361886809e25757046c6dcf193c208 /llvm/lib/Target/X86 | |
| parent | 965429ee522b01b94a9a9d01b46ac10e804029f1 (diff) | |
| download | bcm5719-llvm-a96d62b360b873046035ba439053cd4de2ff1470.tar.gz bcm5719-llvm-a96d62b360b873046035ba439053cd4de2ff1470.zip | |
[X86] Teach shuffle lowering to use 256-bit SHUF128 when possible.
This allows masked operations to be used and allows the register allocator to use YMM16-31 if necessary.
As a follow up I'll look into teaching EVEX->VEX how to turn this back into PERM2X128 if any of the additional features don't work out.
llvm-svn: 317403
Diffstat (limited to 'llvm/lib/Target/X86')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index ea97dc2dccd..3883415501b 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -12384,6 +12384,16 @@ static SDValue lowerV2X128VectorShuffle(const SDLoc &DL, MVT VT, SDValue V1, return DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, LoV, HiV); } } + + // Try to use SHUF128 if possible. + if (Subtarget.hasVLX()) { + if (WidenedMask[0] < 2 && WidenedMask[1] >= 2) { + unsigned PermMask = ((WidenedMask[0] % 2) << 0) | + ((WidenedMask[1] % 2) << 1); + return DAG.getNode(X86ISD::SHUF128, DL, VT, V1, V2, + DAG.getConstant(PermMask, DL, MVT::i8)); + } + } } // Otherwise form a 128-bit permutation. After accounting for undefs, |

