Skip to content

Commit b47b3f2

Browse files
committed
[X86][SSE] Add support for lowering v8i16 binary shuffles to PACKSS/PACKUS
Missed in D38472 llvm-svn: 314916
1 parent 954b94f commit b47b3f2

File tree

6 files changed

+96
-167
lines changed

6 files changed

+96
-167
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11511,6 +11511,11 @@ static SDValue lowerV8I16VectorShuffle(const SDLoc &DL, ArrayRef<int> Mask,
1151111511
lowerVectorShuffleWithUNPCK(DL, MVT::v8i16, Mask, V1, V2, DAG))
1151211512
return V;
1151311513

11514+
// Use dedicated pack instructions for masks that match their pattern.
11515+
if (SDValue V = lowerVectorShuffleWithPACK(DL, MVT::v8i16, Mask, V1, V2, DAG,
11516+
Subtarget))
11517+
return V;
11518+
1151411519
// Try to use byte rotation instructions.
1151511520
if (SDValue Rotate = lowerVectorShuffleAsByteRotate(
1151611521
DL, MVT::v8i16, V1, V2, Mask, Subtarget, DAG))

llvm/test/CodeGen/X86/bitcast-and-setcc-256.ll

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -213,15 +213,11 @@ define i8 @v8i32(<8 x i32> %a, <8 x i32> %b, <8 x i32> %c, <8 x i32> %d) {
213213
; SSE2-LABEL: v8i32:
214214
; SSE2: # BB#0:
215215
; SSE2-NEXT: pcmpgtd %xmm3, %xmm1
216-
; SSE2-NEXT: packssdw %xmm0, %xmm1
217216
; SSE2-NEXT: pcmpgtd %xmm2, %xmm0
218-
; SSE2-NEXT: packssdw %xmm0, %xmm0
219-
; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
217+
; SSE2-NEXT: packssdw %xmm1, %xmm0
220218
; SSE2-NEXT: pcmpgtd %xmm7, %xmm5
221-
; SSE2-NEXT: packssdw %xmm0, %xmm5
222219
; SSE2-NEXT: pcmpgtd %xmm6, %xmm4
223-
; SSE2-NEXT: packssdw %xmm0, %xmm4
224-
; SSE2-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm5[0]
220+
; SSE2-NEXT: packssdw %xmm5, %xmm4
225221
; SSE2-NEXT: pand %xmm0, %xmm4
226222
; SSE2-NEXT: pand {{.*}}(%rip), %xmm4
227223
; SSE2-NEXT: packuswb %xmm4, %xmm4
@@ -232,15 +228,11 @@ define i8 @v8i32(<8 x i32> %a, <8 x i32> %b, <8 x i32> %c, <8 x i32> %d) {
232228
; SSSE3-LABEL: v8i32:
233229
; SSSE3: # BB#0:
234230
; SSSE3-NEXT: pcmpgtd %xmm3, %xmm1
235-
; SSSE3-NEXT: packssdw %xmm0, %xmm1
236231
; SSSE3-NEXT: pcmpgtd %xmm2, %xmm0
237-
; SSSE3-NEXT: packssdw %xmm0, %xmm0
238-
; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
232+
; SSSE3-NEXT: packssdw %xmm1, %xmm0
239233
; SSSE3-NEXT: pcmpgtd %xmm7, %xmm5
240-
; SSSE3-NEXT: packssdw %xmm0, %xmm5
241234
; SSSE3-NEXT: pcmpgtd %xmm6, %xmm4
242-
; SSSE3-NEXT: packssdw %xmm0, %xmm4
243-
; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm5[0]
235+
; SSSE3-NEXT: packssdw %xmm5, %xmm4
244236
; SSSE3-NEXT: pand %xmm0, %xmm4
245237
; SSSE3-NEXT: pshufb {{.*#+}} xmm4 = xmm4[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
246238
; SSSE3-NEXT: pmovmskb %xmm4, %eax

llvm/test/CodeGen/X86/bitcast-and-setcc-512.ll

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -625,31 +625,23 @@ define i16 @v16i32(<16 x i32> %a, <16 x i32> %b, <16 x i32> %c, <16 x i32> %d) {
625625
; SSE-LABEL: v16i32:
626626
; SSE: # BB#0:
627627
; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm8
628-
; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm10
629628
; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm9
629+
; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm10
630630
; SSE-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm11
631631
; SSE-NEXT: pcmpgtd %xmm7, %xmm3
632-
; SSE-NEXT: packssdw %xmm0, %xmm3
633632
; SSE-NEXT: pcmpgtd %xmm6, %xmm2
634-
; SSE-NEXT: packssdw %xmm0, %xmm2
635-
; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
633+
; SSE-NEXT: packssdw %xmm3, %xmm2
636634
; SSE-NEXT: pcmpgtd %xmm5, %xmm1
637-
; SSE-NEXT: packssdw %xmm0, %xmm1
638635
; SSE-NEXT: pcmpgtd %xmm4, %xmm0
639-
; SSE-NEXT: packssdw %xmm0, %xmm0
640-
; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
636+
; SSE-NEXT: packssdw %xmm1, %xmm0
641637
; SSE-NEXT: packsswb %xmm2, %xmm0
642638
; SSE-NEXT: pcmpgtd {{[0-9]+}}(%rsp), %xmm11
643-
; SSE-NEXT: packssdw %xmm0, %xmm11
644-
; SSE-NEXT: pcmpgtd {{[0-9]+}}(%rsp), %xmm9
645-
; SSE-NEXT: packssdw %xmm0, %xmm9
646-
; SSE-NEXT: punpcklqdq {{.*#+}} xmm9 = xmm9[0],xmm11[0]
647639
; SSE-NEXT: pcmpgtd {{[0-9]+}}(%rsp), %xmm10
648-
; SSE-NEXT: packssdw %xmm0, %xmm10
640+
; SSE-NEXT: packssdw %xmm11, %xmm10
641+
; SSE-NEXT: pcmpgtd {{[0-9]+}}(%rsp), %xmm9
649642
; SSE-NEXT: pcmpgtd {{[0-9]+}}(%rsp), %xmm8
650-
; SSE-NEXT: packssdw %xmm0, %xmm8
651-
; SSE-NEXT: punpcklqdq {{.*#+}} xmm8 = xmm8[0],xmm10[0]
652-
; SSE-NEXT: packsswb %xmm9, %xmm8
643+
; SSE-NEXT: packssdw %xmm9, %xmm8
644+
; SSE-NEXT: packsswb %xmm10, %xmm8
653645
; SSE-NEXT: pand %xmm0, %xmm8
654646
; SSE-NEXT: pmovmskb %xmm8, %eax
655647
; SSE-NEXT: # kill: %AX<def> %AX<kill> %EAX<kill>

llvm/test/CodeGen/X86/psubus.ll

Lines changed: 32 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -468,13 +468,11 @@ define <8 x i16> @test13(<8 x i16> %x, <8 x i32> %y) nounwind {
468468
; SSE2-NEXT: pxor %xmm4, %xmm6
469469
; SSE2-NEXT: pxor %xmm4, %xmm5
470470
; SSE2-NEXT: pcmpgtd %xmm5, %xmm6
471-
; SSE2-NEXT: packssdw %xmm0, %xmm6
472471
; SSE2-NEXT: movdqa %xmm1, %xmm2
473472
; SSE2-NEXT: pxor %xmm4, %xmm2
474473
; SSE2-NEXT: pxor %xmm3, %xmm4
475474
; SSE2-NEXT: pcmpgtd %xmm4, %xmm2
476-
; SSE2-NEXT: packssdw %xmm0, %xmm2
477-
; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm6[0]
475+
; SSE2-NEXT: packssdw %xmm6, %xmm2
478476
; SSE2-NEXT: psubd %xmm1, %xmm3
479477
; SSE2-NEXT: pslld $16, %xmm0
480478
; SSE2-NEXT: psrad $16, %xmm0
@@ -487,58 +485,54 @@ define <8 x i16> @test13(<8 x i16> %x, <8 x i32> %y) nounwind {
487485
;
488486
; SSSE3-LABEL: test13:
489487
; SSSE3: # BB#0: # %vector.ph
490-
; SSSE3-NEXT: pxor %xmm4, %xmm4
491-
; SSSE3-NEXT: movdqa %xmm0, %xmm3
492-
; SSSE3-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3]
493-
; SSSE3-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
494-
; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
488+
; SSSE3-NEXT: pxor %xmm3, %xmm3
489+
; SSSE3-NEXT: movdqa %xmm0, %xmm4
490+
; SSSE3-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]
491+
; SSSE3-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
492+
; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
495493
; SSSE3-NEXT: movdqa %xmm0, %xmm5
496494
; SSSE3-NEXT: psubd %xmm2, %xmm0
497495
; SSSE3-NEXT: movdqa %xmm2, %xmm6
498-
; SSSE3-NEXT: pxor %xmm4, %xmm6
499-
; SSSE3-NEXT: pxor %xmm4, %xmm5
496+
; SSSE3-NEXT: pxor %xmm3, %xmm6
497+
; SSSE3-NEXT: pxor %xmm3, %xmm5
500498
; SSSE3-NEXT: pcmpgtd %xmm5, %xmm6
501-
; SSSE3-NEXT: packssdw %xmm0, %xmm6
502499
; SSSE3-NEXT: movdqa %xmm1, %xmm2
503-
; SSSE3-NEXT: pxor %xmm4, %xmm2
504-
; SSSE3-NEXT: pxor %xmm3, %xmm4
505-
; SSSE3-NEXT: pcmpgtd %xmm4, %xmm2
506-
; SSSE3-NEXT: packssdw %xmm0, %xmm2
507-
; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm6[0]
508-
; SSSE3-NEXT: psubd %xmm1, %xmm3
500+
; SSSE3-NEXT: pxor %xmm3, %xmm2
501+
; SSSE3-NEXT: pxor %xmm4, %xmm3
502+
; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2
503+
; SSSE3-NEXT: packssdw %xmm6, %xmm2
504+
; SSSE3-NEXT: psubd %xmm1, %xmm4
509505
; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
510506
; SSSE3-NEXT: pshufb %xmm1, %xmm0
511-
; SSSE3-NEXT: pshufb %xmm1, %xmm3
512-
; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]
513-
; SSSE3-NEXT: pandn %xmm3, %xmm2
507+
; SSSE3-NEXT: pshufb %xmm1, %xmm4
508+
; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm0[0]
509+
; SSSE3-NEXT: pandn %xmm4, %xmm2
514510
; SSSE3-NEXT: movdqa %xmm2, %xmm0
515511
; SSSE3-NEXT: retq
516512
;
517513
; SSE41-LABEL: test13:
518514
; SSE41: # BB#0: # %vector.ph
519515
; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,3,0,1]
520-
; SSE41-NEXT: pmovzxwd {{.*#+}} xmm4 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero
521-
; SSE41-NEXT: pmovzxwd {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
516+
; SSE41-NEXT: pmovzxwd {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero
517+
; SSE41-NEXT: pmovzxwd {{.*#+}} xmm4 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
522518
; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]
523-
; SSE41-NEXT: movdqa %xmm3, %xmm6
524-
; SSE41-NEXT: psubd %xmm1, %xmm3
519+
; SSE41-NEXT: movdqa %xmm4, %xmm6
520+
; SSE41-NEXT: psubd %xmm1, %xmm4
525521
; SSE41-NEXT: movdqa %xmm1, %xmm0
526522
; SSE41-NEXT: pxor %xmm5, %xmm0
527523
; SSE41-NEXT: pxor %xmm5, %xmm6
528524
; SSE41-NEXT: pcmpgtd %xmm6, %xmm0
529-
; SSE41-NEXT: packssdw %xmm0, %xmm0
530525
; SSE41-NEXT: movdqa %xmm2, %xmm1
531526
; SSE41-NEXT: pxor %xmm5, %xmm1
532-
; SSE41-NEXT: pxor %xmm4, %xmm5
527+
; SSE41-NEXT: pxor %xmm3, %xmm5
533528
; SSE41-NEXT: pcmpgtd %xmm5, %xmm1
534-
; SSE41-NEXT: packssdw %xmm0, %xmm1
535-
; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
536-
; SSE41-NEXT: psubd %xmm2, %xmm4
529+
; SSE41-NEXT: packssdw %xmm1, %xmm0
530+
; SSE41-NEXT: psubd %xmm2, %xmm3
537531
; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
538-
; SSE41-NEXT: pshufb %xmm1, %xmm3
539532
; SSE41-NEXT: pshufb %xmm1, %xmm4
540-
; SSE41-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm4[0]
541-
; SSE41-NEXT: pandn %xmm3, %xmm0
533+
; SSE41-NEXT: pshufb %xmm1, %xmm3
534+
; SSE41-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm3[0]
535+
; SSE41-NEXT: pandn %xmm4, %xmm0
542536
; SSE41-NEXT: retq
543537
;
544538
; AVX1-LABEL: test13:
@@ -861,13 +855,11 @@ define <8 x i16> @test15(<8 x i16> %x, <8 x i32> %y) nounwind {
861855
; SSE2-NEXT: pxor %xmm4, %xmm2
862856
; SSE2-NEXT: pxor %xmm4, %xmm5
863857
; SSE2-NEXT: pcmpgtd %xmm2, %xmm5
864-
; SSE2-NEXT: packssdw %xmm0, %xmm5
865858
; SSE2-NEXT: movdqa %xmm1, %xmm2
866859
; SSE2-NEXT: pxor %xmm4, %xmm2
867860
; SSE2-NEXT: pxor %xmm0, %xmm4
868861
; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
869-
; SSE2-NEXT: packssdw %xmm0, %xmm4
870-
; SSE2-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm5[0]
862+
; SSE2-NEXT: packssdw %xmm5, %xmm4
871863
; SSE2-NEXT: psubd %xmm1, %xmm0
872864
; SSE2-NEXT: pslld $16, %xmm3
873865
; SSE2-NEXT: psrad $16, %xmm3
@@ -889,13 +881,11 @@ define <8 x i16> @test15(<8 x i16> %x, <8 x i32> %y) nounwind {
889881
; SSSE3-NEXT: pxor %xmm4, %xmm2
890882
; SSSE3-NEXT: pxor %xmm4, %xmm5
891883
; SSSE3-NEXT: pcmpgtd %xmm2, %xmm5
892-
; SSSE3-NEXT: packssdw %xmm0, %xmm5
893884
; SSSE3-NEXT: movdqa %xmm1, %xmm2
894885
; SSSE3-NEXT: pxor %xmm4, %xmm2
895886
; SSSE3-NEXT: pxor %xmm3, %xmm4
896887
; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
897-
; SSSE3-NEXT: packssdw %xmm0, %xmm4
898-
; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm5[0]
888+
; SSSE3-NEXT: packssdw %xmm5, %xmm4
899889
; SSSE3-NEXT: psubd %xmm1, %xmm3
900890
; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
901891
; SSSE3-NEXT: pshufb %xmm1, %xmm0
@@ -916,13 +906,11 @@ define <8 x i16> @test15(<8 x i16> %x, <8 x i32> %y) nounwind {
916906
; SSE41-NEXT: pxor %xmm4, %xmm1
917907
; SSE41-NEXT: pxor %xmm4, %xmm5
918908
; SSE41-NEXT: pcmpgtd %xmm1, %xmm5
919-
; SSE41-NEXT: packssdw %xmm0, %xmm5
920909
; SSE41-NEXT: movdqa %xmm2, %xmm1
921910
; SSE41-NEXT: pxor %xmm4, %xmm1
922911
; SSE41-NEXT: pxor %xmm3, %xmm4
923912
; SSE41-NEXT: pcmpgtd %xmm1, %xmm4
924-
; SSE41-NEXT: packssdw %xmm0, %xmm4
925-
; SSE41-NEXT: punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm4[0]
913+
; SSE41-NEXT: packssdw %xmm4, %xmm5
926914
; SSE41-NEXT: psubd %xmm2, %xmm3
927915
; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
928916
; SSE41-NEXT: pshufb %xmm1, %xmm0
@@ -1001,13 +989,11 @@ define <8 x i16> @test16(<8 x i16> %x, <8 x i32> %y) nounwind {
1001989
; SSE2-NEXT: pxor %xmm4, %xmm2
1002990
; SSE2-NEXT: pxor %xmm4, %xmm5
1003991
; SSE2-NEXT: pcmpgtd %xmm2, %xmm5
1004-
; SSE2-NEXT: packssdw %xmm0, %xmm5
1005992
; SSE2-NEXT: movdqa %xmm1, %xmm2
1006993
; SSE2-NEXT: pxor %xmm4, %xmm2
1007994
; SSE2-NEXT: pxor %xmm0, %xmm4
1008995
; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
1009-
; SSE2-NEXT: packssdw %xmm0, %xmm4
1010-
; SSE2-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm5[0]
996+
; SSE2-NEXT: packssdw %xmm5, %xmm4
1011997
; SSE2-NEXT: psubd %xmm1, %xmm0
1012998
; SSE2-NEXT: pslld $16, %xmm3
1013999
; SSE2-NEXT: psrad $16, %xmm3
@@ -1029,13 +1015,11 @@ define <8 x i16> @test16(<8 x i16> %x, <8 x i32> %y) nounwind {
10291015
; SSSE3-NEXT: pxor %xmm4, %xmm2
10301016
; SSSE3-NEXT: pxor %xmm4, %xmm5
10311017
; SSSE3-NEXT: pcmpgtd %xmm2, %xmm5
1032-
; SSSE3-NEXT: packssdw %xmm0, %xmm5
10331018
; SSSE3-NEXT: movdqa %xmm1, %xmm2
10341019
; SSSE3-NEXT: pxor %xmm4, %xmm2
10351020
; SSSE3-NEXT: pxor %xmm3, %xmm4
10361021
; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
1037-
; SSSE3-NEXT: packssdw %xmm0, %xmm4
1038-
; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm5[0]
1022+
; SSSE3-NEXT: packssdw %xmm5, %xmm4
10391023
; SSSE3-NEXT: psubd %xmm1, %xmm3
10401024
; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
10411025
; SSSE3-NEXT: pshufb %xmm1, %xmm0
@@ -1056,13 +1040,11 @@ define <8 x i16> @test16(<8 x i16> %x, <8 x i32> %y) nounwind {
10561040
; SSE41-NEXT: pxor %xmm4, %xmm1
10571041
; SSE41-NEXT: pxor %xmm4, %xmm5
10581042
; SSE41-NEXT: pcmpgtd %xmm1, %xmm5
1059-
; SSE41-NEXT: packssdw %xmm0, %xmm5
10601043
; SSE41-NEXT: movdqa %xmm2, %xmm1
10611044
; SSE41-NEXT: pxor %xmm4, %xmm1
10621045
; SSE41-NEXT: pxor %xmm3, %xmm4
10631046
; SSE41-NEXT: pcmpgtd %xmm1, %xmm4
1064-
; SSE41-NEXT: packssdw %xmm0, %xmm4
1065-
; SSE41-NEXT: punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm4[0]
1047+
; SSE41-NEXT: packssdw %xmm4, %xmm5
10661048
; SSE41-NEXT: psubd %xmm2, %xmm3
10671049
; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
10681050
; SSE41-NEXT: pshufb %xmm1, %xmm0

0 commit comments

Comments
 (0)