forked from OSchip/llvm-project
[X86][SSE2] Fix zero/any extension shuffles that don't start from the first element
Fix for D12561 - we weren't correctly ensuring that the base element for extension was moved to start on a boundary suitable for UNPCKL/H llvm-svn: 248536
This commit is contained in:
parent
da95a4a7c7
commit
68d0050c6a
|
@ -7485,13 +7485,15 @@ static SDValue lowerVectorShuffleAsSpecificZeroOrAnyExtend(
|
|||
MVT::v16i8, PSHUFBMask)));
|
||||
}
|
||||
|
||||
// If we are extending from an (odd)offset, shuffle them by 1 element.
|
||||
if (Offset & 1) {
|
||||
// If we are extending from an offset, ensure we start on a boundary that
|
||||
// we can unpack from.
|
||||
int AlignToUnpack = Offset % (NumElements / Scale);
|
||||
if (AlignToUnpack) {
|
||||
SmallVector<int, 8> ShMask((unsigned)NumElements, -1);
|
||||
for (int i = 1; i < NumElements; ++i)
|
||||
ShMask[i - 1] = i;
|
||||
for (int i = AlignToUnpack; i < NumElements; ++i)
|
||||
ShMask[i - AlignToUnpack] = i;
|
||||
InputV = DAG.getVectorShuffle(VT, DL, InputV, DAG.getUNDEF(VT), ShMask);
|
||||
Offset--;
|
||||
Offset -= AlignToUnpack;
|
||||
}
|
||||
|
||||
// Otherwise emit a sequence of unpacks.
|
||||
|
|
|
@ -1283,7 +1283,7 @@ define <8 x i32> @shuf_zext_8i16_to_8i32_offset3(<8 x i16> %A) nounwind uwtable
|
|||
; SSE2-LABEL: shuf_zext_8i16_to_8i32_offset3:
|
||||
; SSE2: # BB#0: # %entry
|
||||
; SSE2-NEXT: movdqa %xmm0, %xmm1
|
||||
; SSE2-NEXT: psrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
|
||||
; SSE2-NEXT: psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
|
||||
; SSE2-NEXT: pxor %xmm2, %xmm2
|
||||
; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
|
||||
; SSE2-NEXT: psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
|
||||
|
@ -1292,7 +1292,7 @@ define <8 x i32> @shuf_zext_8i16_to_8i32_offset3(<8 x i16> %A) nounwind uwtable
|
|||
; SSSE3-LABEL: shuf_zext_8i16_to_8i32_offset3:
|
||||
; SSSE3: # BB#0: # %entry
|
||||
; SSSE3-NEXT: movdqa %xmm0, %xmm1
|
||||
; SSSE3-NEXT: psrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
|
||||
; SSSE3-NEXT: psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
|
||||
; SSSE3-NEXT: pxor %xmm2, %xmm2
|
||||
; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
|
||||
; SSSE3-NEXT: psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
|
||||
|
|
Loading…
Reference in New Issue