Skip to content

Commit 38ab47c

Browse files
committed
[DAG] Match USUBSAT patterns through zext/trunc
This patch handles usubsat patterns hidden through zext/trunc and uses the getTruncatedUSUBSAT helper to determine if the USUBSAT can be correctly performed in the truncated form: zext(x) >= y ? x - trunc(y) : 0 --> usubsat(x,trunc(umin(y,SatLimit))) zext(x) > y ? x - trunc(y) : 0 --> usubsat(x,trunc(umin(y,SatLimit))) Based on original examples: void foo(unsigned short *p, int max, int n) { int i; unsigned m; for (i = 0; i < n; i++) { m = *--p; *p = (unsigned short)(m >= max ? m-max : 0); } } Differential Revision: https://reviews.llvm.org/D25987
1 parent a6a258f commit 38ab47c

File tree

2 files changed

+127
-191
lines changed

2 files changed

+127
-191
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9881,6 +9881,19 @@ SDValue DAGCombiner::visitVSELECT(SDNode *N) {
98819881
SDValue CondRHS = RHS;
98829882
SDValue OpLHS = Other.getOperand(0), OpRHS = Other.getOperand(1);
98839883

9884+
if (Other.getOpcode() == ISD::SUB &&
9885+
LHS.getOpcode() == ISD::ZERO_EXTEND && LHS.getOperand(0) == OpLHS &&
9886+
OpRHS.getOpcode() == ISD::TRUNCATE && OpRHS.getOperand(0) == RHS) {
9887+
// Look for a general sub with unsigned saturation first.
9888+
// zext(x) >= y ? x - trunc(y) : 0
9889+
// --> usubsat(x,trunc(umin(y,SatLimit)))
9890+
// zext(x) > y ? x - trunc(y) : 0
9891+
// --> usubsat(x,trunc(umin(y,SatLimit)))
9892+
if (SatCC == ISD::SETUGE || SatCC == ISD::SETUGT)
9893+
return getTruncatedUSUBSAT(VT, LHS.getValueType(), LHS, RHS, DAG,
9894+
DL);
9895+
}
9896+
98849897
if (OpLHS == LHS) {
98859898
// Look for a general sub with unsigned saturation first.
98869899
// x >= y ? x-y : 0 --> usubsat x, y

llvm/test/CodeGen/X86/psubus.ll

Lines changed: 114 additions & 191 deletions
Original file line numberDiff line numberDiff line change
@@ -465,130 +465,90 @@ vector.ph:
465465
ret <32 x i8> %res
466466
}
467467

468-
; FIXME: match this to UMIN+TRUNC+PSUBUS
469468
define <8 x i16> @test13(<8 x i16> %x, <8 x i32> %y) nounwind {
470469
; SSE2-LABEL: test13:
471470
; SSE2: # %bb.0: # %vector.ph
472-
; SSE2-NEXT: pxor %xmm3, %xmm3
473-
; SSE2-NEXT: movdqa %xmm0, %xmm4
474-
; SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]
475-
; SSE2-NEXT: movdqa %xmm0, %xmm5
476-
; SSE2-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm3[4],xmm5[5],xmm3[5],xmm5[6],xmm3[6],xmm5[7],xmm3[7]
477-
; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
478-
; SSE2-NEXT: movdqa %xmm2, %xmm7
479-
; SSE2-NEXT: pxor %xmm6, %xmm7
480-
; SSE2-NEXT: por %xmm6, %xmm5
481-
; SSE2-NEXT: pcmpgtd %xmm5, %xmm7
482-
; SSE2-NEXT: movdqa %xmm1, %xmm3
483-
; SSE2-NEXT: pxor %xmm6, %xmm3
484-
; SSE2-NEXT: por %xmm6, %xmm4
485-
; SSE2-NEXT: pcmpgtd %xmm4, %xmm3
486-
; SSE2-NEXT: packssdw %xmm7, %xmm3
487-
; SSE2-NEXT: pslld $16, %xmm2
488-
; SSE2-NEXT: psrad $16, %xmm2
489-
; SSE2-NEXT: pslld $16, %xmm1
490-
; SSE2-NEXT: psrad $16, %xmm1
491-
; SSE2-NEXT: packssdw %xmm2, %xmm1
492-
; SSE2-NEXT: psubw %xmm1, %xmm0
493-
; SSE2-NEXT: pandn %xmm0, %xmm3
494-
; SSE2-NEXT: movdqa %xmm3, %xmm0
471+
; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
472+
; SSE2-NEXT: movdqa %xmm2, %xmm4
473+
; SSE2-NEXT: pxor %xmm3, %xmm4
474+
; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]
475+
; SSE2-NEXT: movdqa %xmm5, %xmm6
476+
; SSE2-NEXT: pcmpgtd %xmm4, %xmm6
477+
; SSE2-NEXT: pcmpeqd %xmm4, %xmm4
478+
; SSE2-NEXT: pand %xmm6, %xmm2
479+
; SSE2-NEXT: pxor %xmm4, %xmm6
480+
; SSE2-NEXT: por %xmm2, %xmm6
481+
; SSE2-NEXT: pslld $16, %xmm6
482+
; SSE2-NEXT: psrad $16, %xmm6
483+
; SSE2-NEXT: pxor %xmm1, %xmm3
484+
; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
485+
; SSE2-NEXT: pxor %xmm5, %xmm4
486+
; SSE2-NEXT: pand %xmm1, %xmm5
487+
; SSE2-NEXT: por %xmm4, %xmm5
488+
; SSE2-NEXT: pslld $16, %xmm5
489+
; SSE2-NEXT: psrad $16, %xmm5
490+
; SSE2-NEXT: packssdw %xmm6, %xmm5
491+
; SSE2-NEXT: psubusw %xmm5, %xmm0
495492
; SSE2-NEXT: retq
496493
;
497494
; SSSE3-LABEL: test13:
498495
; SSSE3: # %bb.0: # %vector.ph
499-
; SSSE3-NEXT: pxor %xmm3, %xmm3
500-
; SSSE3-NEXT: movdqa %xmm0, %xmm4
501-
; SSSE3-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]
502-
; SSSE3-NEXT: movdqa %xmm0, %xmm5
503-
; SSSE3-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm3[4],xmm5[5],xmm3[5],xmm5[6],xmm3[6],xmm5[7],xmm3[7]
504-
; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
505-
; SSSE3-NEXT: movdqa %xmm2, %xmm7
506-
; SSSE3-NEXT: pxor %xmm6, %xmm7
507-
; SSSE3-NEXT: por %xmm6, %xmm5
508-
; SSSE3-NEXT: pcmpgtd %xmm5, %xmm7
509-
; SSSE3-NEXT: movdqa %xmm1, %xmm3
510-
; SSSE3-NEXT: pxor %xmm6, %xmm3
511-
; SSSE3-NEXT: por %xmm6, %xmm4
512-
; SSSE3-NEXT: pcmpgtd %xmm4, %xmm3
513-
; SSSE3-NEXT: packssdw %xmm7, %xmm3
514-
; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
515-
; SSSE3-NEXT: pshufb %xmm4, %xmm2
516-
; SSSE3-NEXT: pshufb %xmm4, %xmm1
517-
; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
518-
; SSSE3-NEXT: psubw %xmm1, %xmm0
519-
; SSSE3-NEXT: pandn %xmm0, %xmm3
520-
; SSSE3-NEXT: movdqa %xmm3, %xmm0
496+
; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
497+
; SSSE3-NEXT: movdqa %xmm2, %xmm4
498+
; SSSE3-NEXT: pxor %xmm3, %xmm4
499+
; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]
500+
; SSSE3-NEXT: movdqa %xmm5, %xmm6
501+
; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
502+
; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [65535,65535,65535,65535]
503+
; SSSE3-NEXT: pand %xmm6, %xmm2
504+
; SSSE3-NEXT: pandn %xmm4, %xmm6
505+
; SSSE3-NEXT: por %xmm2, %xmm6
506+
; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
507+
; SSSE3-NEXT: pshufb %xmm2, %xmm6
508+
; SSSE3-NEXT: pxor %xmm1, %xmm3
509+
; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
510+
; SSSE3-NEXT: pand %xmm5, %xmm1
511+
; SSSE3-NEXT: pandn %xmm4, %xmm5
512+
; SSSE3-NEXT: por %xmm1, %xmm5
513+
; SSSE3-NEXT: pshufb %xmm2, %xmm5
514+
; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm6[0]
515+
; SSSE3-NEXT: psubusw %xmm5, %xmm0
521516
; SSSE3-NEXT: retq
522517
;
523518
; SSE41-LABEL: test13:
524519
; SSE41: # %bb.0: # %vector.ph
525-
; SSE41-NEXT: pxor %xmm4, %xmm4
526-
; SSE41-NEXT: movdqa %xmm0, %xmm3
527-
; SSE41-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
528-
; SSE41-NEXT: pmovzxwd {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
529-
; SSE41-NEXT: movdqa %xmm3, %xmm6
530-
; SSE41-NEXT: pmaxud %xmm2, %xmm6
531-
; SSE41-NEXT: pcmpeqd %xmm3, %xmm6
532-
; SSE41-NEXT: pcmpeqd %xmm7, %xmm7
533-
; SSE41-NEXT: pxor %xmm7, %xmm6
534-
; SSE41-NEXT: movdqa %xmm5, %xmm3
535-
; SSE41-NEXT: pmaxud %xmm1, %xmm3
536-
; SSE41-NEXT: pcmpeqd %xmm5, %xmm3
537-
; SSE41-NEXT: pxor %xmm7, %xmm3
538-
; SSE41-NEXT: packssdw %xmm6, %xmm3
539-
; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0],xmm4[1],xmm2[2],xmm4[3],xmm2[4],xmm4[5],xmm2[6],xmm4[7]
540-
; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1],xmm1[2],xmm4[3],xmm1[4],xmm4[5],xmm1[6],xmm4[7]
520+
; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [65535,65535,65535,65535]
521+
; SSE41-NEXT: pminud %xmm3, %xmm2
522+
; SSE41-NEXT: pminud %xmm3, %xmm1
541523
; SSE41-NEXT: packusdw %xmm2, %xmm1
542-
; SSE41-NEXT: psubw %xmm1, %xmm0
543-
; SSE41-NEXT: pandn %xmm0, %xmm3
544-
; SSE41-NEXT: movdqa %xmm3, %xmm0
524+
; SSE41-NEXT: psubusw %xmm1, %xmm0
545525
; SSE41-NEXT: retq
546526
;
547527
; AVX1-LABEL: test13:
548528
; AVX1: # %bb.0: # %vector.ph
549-
; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
550-
; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm2 = xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
551-
; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
552-
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
553-
; AVX1-NEXT: vpmaxud %xmm4, %xmm2, %xmm5
554-
; AVX1-NEXT: vpcmpeqd %xmm5, %xmm2, %xmm2
555-
; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5
556-
; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2
557-
; AVX1-NEXT: vpmaxud %xmm1, %xmm3, %xmm6
558-
; AVX1-NEXT: vpcmpeqd %xmm6, %xmm3, %xmm3
559-
; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3
560-
; AVX1-NEXT: vpackssdw %xmm2, %xmm3, %xmm2
561-
; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = <0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u>
562-
; AVX1-NEXT: vpshufb %xmm3, %xmm4, %xmm4
563-
; AVX1-NEXT: vpshufb %xmm3, %xmm1, %xmm1
564-
; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm4[0]
565-
; AVX1-NEXT: vpsubw %xmm1, %xmm0, %xmm0
566-
; AVX1-NEXT: vpandn %xmm0, %xmm2, %xmm0
529+
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
530+
; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [65535,65535,65535,65535]
531+
; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm2
532+
; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm1
533+
; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1
534+
; AVX1-NEXT: vpsubusw %xmm1, %xmm0, %xmm0
567535
; AVX1-NEXT: vzeroupper
568536
; AVX1-NEXT: retq
569537
;
570538
; AVX2-LABEL: test13:
571539
; AVX2: # %bb.0: # %vector.ph
572-
; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
573-
; AVX2-NEXT: vpmaxud %ymm1, %ymm2, %ymm3
574-
; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2
575-
; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
576-
; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
577-
; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm3
578-
; AVX2-NEXT: vpackssdw %xmm3, %xmm2, %xmm2
579-
; AVX2-NEXT: vpshufb {{.*#+}} ymm1 = ymm1[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
580-
; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
581-
; AVX2-NEXT: vpsubw %xmm1, %xmm0, %xmm0
582-
; AVX2-NEXT: vpandn %xmm0, %xmm2, %xmm0
540+
; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535]
541+
; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm1
542+
; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
543+
; AVX2-NEXT: vpackusdw %xmm2, %xmm1, %xmm1
544+
; AVX2-NEXT: vpsubusw %xmm1, %xmm0, %xmm0
583545
; AVX2-NEXT: vzeroupper
584546
; AVX2-NEXT: retq
585547
;
586548
; AVX512-LABEL: test13:
587549
; AVX512: # %bb.0: # %vector.ph
588-
; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
589-
; AVX512-NEXT: vpcmpnltud %ymm1, %ymm2, %k1
590-
; AVX512-NEXT: vpmovdw %ymm1, %xmm1
591-
; AVX512-NEXT: vpsubw %xmm1, %xmm0, %xmm0 {%k1} {z}
550+
; AVX512-NEXT: vpmovusdw %ymm1, %xmm1
551+
; AVX512-NEXT: vpsubusw %xmm1, %xmm0, %xmm0
592552
; AVX512-NEXT: vzeroupper
593553
; AVX512-NEXT: retq
594554
vector.ph:
@@ -773,127 +733,90 @@ vector.ph:
773733
ret <16 x i8> %res
774734
}
775735

776-
; FIXME: match this to UMIN+TRUNC+PSUBUS
777736
define <8 x i16> @test15(<8 x i16> %x, <8 x i32> %y) nounwind {
778737
; SSE2-LABEL: test15:
779738
; SSE2: # %bb.0: # %vector.ph
780-
; SSE2-NEXT: pxor %xmm3, %xmm3
781-
; SSE2-NEXT: movdqa %xmm0, %xmm4
782-
; SSE2-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]
783-
; SSE2-NEXT: movdqa %xmm0, %xmm5
784-
; SSE2-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm3[4],xmm5[5],xmm3[5],xmm5[6],xmm3[6],xmm5[7],xmm3[7]
785739
; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
786-
; SSE2-NEXT: movdqa %xmm2, %xmm6
787-
; SSE2-NEXT: pxor %xmm3, %xmm6
788-
; SSE2-NEXT: por %xmm3, %xmm5
789-
; SSE2-NEXT: pcmpgtd %xmm6, %xmm5
790-
; SSE2-NEXT: movdqa %xmm1, %xmm6
791-
; SSE2-NEXT: pxor %xmm3, %xmm6
792-
; SSE2-NEXT: por %xmm3, %xmm4
793-
; SSE2-NEXT: pcmpgtd %xmm6, %xmm4
794-
; SSE2-NEXT: packssdw %xmm5, %xmm4
795-
; SSE2-NEXT: pslld $16, %xmm2
796-
; SSE2-NEXT: psrad $16, %xmm2
797-
; SSE2-NEXT: pslld $16, %xmm1
798-
; SSE2-NEXT: psrad $16, %xmm1
799-
; SSE2-NEXT: packssdw %xmm2, %xmm1
800-
; SSE2-NEXT: psubw %xmm1, %xmm0
801-
; SSE2-NEXT: pand %xmm4, %xmm0
740+
; SSE2-NEXT: movdqa %xmm2, %xmm4
741+
; SSE2-NEXT: pxor %xmm3, %xmm4
742+
; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]
743+
; SSE2-NEXT: movdqa %xmm5, %xmm6
744+
; SSE2-NEXT: pcmpgtd %xmm4, %xmm6
745+
; SSE2-NEXT: pcmpeqd %xmm4, %xmm4
746+
; SSE2-NEXT: pand %xmm6, %xmm2
747+
; SSE2-NEXT: pxor %xmm4, %xmm6
748+
; SSE2-NEXT: por %xmm2, %xmm6
749+
; SSE2-NEXT: pslld $16, %xmm6
750+
; SSE2-NEXT: psrad $16, %xmm6
751+
; SSE2-NEXT: pxor %xmm1, %xmm3
752+
; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
753+
; SSE2-NEXT: pxor %xmm5, %xmm4
754+
; SSE2-NEXT: pand %xmm1, %xmm5
755+
; SSE2-NEXT: por %xmm4, %xmm5
756+
; SSE2-NEXT: pslld $16, %xmm5
757+
; SSE2-NEXT: psrad $16, %xmm5
758+
; SSE2-NEXT: packssdw %xmm6, %xmm5
759+
; SSE2-NEXT: psubusw %xmm5, %xmm0
802760
; SSE2-NEXT: retq
803761
;
804762
; SSSE3-LABEL: test15:
805763
; SSSE3: # %bb.0: # %vector.ph
806-
; SSSE3-NEXT: pxor %xmm3, %xmm3
807-
; SSSE3-NEXT: movdqa %xmm0, %xmm4
808-
; SSSE3-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]
809-
; SSSE3-NEXT: movdqa %xmm0, %xmm5
810-
; SSSE3-NEXT: punpckhwd {{.*#+}} xmm5 = xmm5[4],xmm3[4],xmm5[5],xmm3[5],xmm5[6],xmm3[6],xmm5[7],xmm3[7]
811764
; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
812-
; SSSE3-NEXT: movdqa %xmm2, %xmm6
813-
; SSSE3-NEXT: pxor %xmm3, %xmm6
814-
; SSSE3-NEXT: por %xmm3, %xmm5
815-
; SSSE3-NEXT: pcmpgtd %xmm6, %xmm5
816-
; SSSE3-NEXT: movdqa %xmm1, %xmm6
817-
; SSSE3-NEXT: pxor %xmm3, %xmm6
818-
; SSSE3-NEXT: por %xmm3, %xmm4
819-
; SSSE3-NEXT: pcmpgtd %xmm6, %xmm4
820-
; SSSE3-NEXT: packssdw %xmm5, %xmm4
821-
; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
822-
; SSSE3-NEXT: pshufb %xmm3, %xmm2
823-
; SSSE3-NEXT: pshufb %xmm3, %xmm1
824-
; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
825-
; SSSE3-NEXT: psubw %xmm1, %xmm0
826-
; SSSE3-NEXT: pand %xmm4, %xmm0
765+
; SSSE3-NEXT: movdqa %xmm2, %xmm4
766+
; SSSE3-NEXT: pxor %xmm3, %xmm4
767+
; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]
768+
; SSSE3-NEXT: movdqa %xmm5, %xmm6
769+
; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
770+
; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [65535,65535,65535,65535]
771+
; SSSE3-NEXT: pand %xmm6, %xmm2
772+
; SSSE3-NEXT: pandn %xmm4, %xmm6
773+
; SSSE3-NEXT: por %xmm2, %xmm6
774+
; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
775+
; SSSE3-NEXT: pshufb %xmm2, %xmm6
776+
; SSSE3-NEXT: pxor %xmm1, %xmm3
777+
; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
778+
; SSSE3-NEXT: pand %xmm5, %xmm1
779+
; SSSE3-NEXT: pandn %xmm4, %xmm5
780+
; SSSE3-NEXT: por %xmm1, %xmm5
781+
; SSSE3-NEXT: pshufb %xmm2, %xmm5
782+
; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm6[0]
783+
; SSSE3-NEXT: psubusw %xmm5, %xmm0
827784
; SSSE3-NEXT: retq
828785
;
829786
; SSE41-LABEL: test15:
830787
; SSE41: # %bb.0: # %vector.ph
831-
; SSE41-NEXT: pxor %xmm3, %xmm3
832-
; SSE41-NEXT: movdqa %xmm0, %xmm4
833-
; SSE41-NEXT: punpckhwd {{.*#+}} xmm4 = xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]
834-
; SSE41-NEXT: pmovzxwd {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
835-
; SSE41-NEXT: movdqa %xmm4, %xmm6
836-
; SSE41-NEXT: pminud %xmm2, %xmm6
837-
; SSE41-NEXT: pcmpeqd %xmm4, %xmm6
838-
; SSE41-NEXT: pcmpeqd %xmm4, %xmm4
839-
; SSE41-NEXT: pxor %xmm4, %xmm6
840-
; SSE41-NEXT: movdqa %xmm5, %xmm7
841-
; SSE41-NEXT: pminud %xmm1, %xmm7
842-
; SSE41-NEXT: pcmpeqd %xmm5, %xmm7
843-
; SSE41-NEXT: pxor %xmm4, %xmm7
844-
; SSE41-NEXT: packssdw %xmm6, %xmm7
845-
; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1],xmm2[2],xmm3[3],xmm2[4],xmm3[5],xmm2[6],xmm3[7]
846-
; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm3[1],xmm1[2],xmm3[3],xmm1[4],xmm3[5],xmm1[6],xmm3[7]
788+
; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [65535,65535,65535,65535]
789+
; SSE41-NEXT: pminud %xmm3, %xmm2
790+
; SSE41-NEXT: pminud %xmm3, %xmm1
847791
; SSE41-NEXT: packusdw %xmm2, %xmm1
848-
; SSE41-NEXT: psubw %xmm1, %xmm0
849-
; SSE41-NEXT: pand %xmm7, %xmm0
792+
; SSE41-NEXT: psubusw %xmm1, %xmm0
850793
; SSE41-NEXT: retq
851794
;
852795
; AVX1-LABEL: test15:
853796
; AVX1: # %bb.0: # %vector.ph
854-
; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
855-
; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm2 = xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
856-
; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
857-
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
858-
; AVX1-NEXT: vpminud %xmm4, %xmm2, %xmm5
859-
; AVX1-NEXT: vpcmpeqd %xmm5, %xmm2, %xmm2
860-
; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5
861-
; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2
862-
; AVX1-NEXT: vpminud %xmm1, %xmm3, %xmm6
863-
; AVX1-NEXT: vpcmpeqd %xmm6, %xmm3, %xmm3
864-
; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3
865-
; AVX1-NEXT: vpackssdw %xmm2, %xmm3, %xmm2
866-
; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = <0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u>
867-
; AVX1-NEXT: vpshufb %xmm3, %xmm4, %xmm4
868-
; AVX1-NEXT: vpshufb %xmm3, %xmm1, %xmm1
869-
; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm4[0]
870-
; AVX1-NEXT: vpsubw %xmm1, %xmm0, %xmm0
871-
; AVX1-NEXT: vpand %xmm0, %xmm2, %xmm0
797+
; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
798+
; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [65535,65535,65535,65535]
799+
; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm2
800+
; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm1
801+
; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1
802+
; AVX1-NEXT: vpsubusw %xmm1, %xmm0, %xmm0
872803
; AVX1-NEXT: vzeroupper
873804
; AVX1-NEXT: retq
874805
;
875806
; AVX2-LABEL: test15:
876807
; AVX2: # %bb.0: # %vector.ph
877-
; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
878-
; AVX2-NEXT: vpminud %ymm1, %ymm2, %ymm3
879-
; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2
880-
; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
881-
; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
882-
; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm3
883-
; AVX2-NEXT: vpackssdw %xmm3, %xmm2, %xmm2
884-
; AVX2-NEXT: vpshufb {{.*#+}} ymm1 = ymm1[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
885-
; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
886-
; AVX2-NEXT: vpsubw %xmm1, %xmm0, %xmm0
887-
; AVX2-NEXT: vpand %xmm0, %xmm2, %xmm0
808+
; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535]
809+
; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm1
810+
; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
811+
; AVX2-NEXT: vpackusdw %xmm2, %xmm1, %xmm1
812+
; AVX2-NEXT: vpsubusw %xmm1, %xmm0, %xmm0
888813
; AVX2-NEXT: vzeroupper
889814
; AVX2-NEXT: retq
890815
;
891816
; AVX512-LABEL: test15:
892817
; AVX512: # %bb.0: # %vector.ph
893-
; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
894-
; AVX512-NEXT: vpcmpnleud %ymm1, %ymm2, %k1
895-
; AVX512-NEXT: vpmovdw %ymm1, %xmm1
896-
; AVX512-NEXT: vpsubw %xmm1, %xmm0, %xmm0 {%k1} {z}
818+
; AVX512-NEXT: vpmovusdw %ymm1, %xmm1
819+
; AVX512-NEXT: vpsubusw %xmm1, %xmm0, %xmm0
897820
; AVX512-NEXT: vzeroupper
898821
; AVX512-NEXT: retq
899822
vector.ph:

0 commit comments

Comments
 (0)