Home | History | Annotate | Download | only in X86
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
      3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=SSE --check-prefix=SSSE3
      4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
      5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
      6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-SLOW
      7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST
      8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512F
      9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VL
     10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BW
     11 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL
     12 
     13 ;
     14 ; Unsigned saturation truncation to vXi32
     15 ;
     16 
     17 define <4 x i32> @trunc_usat_v4i64_v4i32(<4 x i64> %a0) {
     18 ; SSE2-LABEL: trunc_usat_v4i64_v4i32:
     19 ; SSE2:       # %bb.0:
     20 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
     21 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
     22 ; SSE2-NEXT:    pxor %xmm2, %xmm3
     23 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259455,9223372039002259455]
     24 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
     25 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
     26 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
     27 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm3
     28 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
     29 ; SSE2-NEXT:    pand %xmm6, %xmm3
     30 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
     31 ; SSE2-NEXT:    por %xmm3, %xmm5
     32 ; SSE2-NEXT:    pxor %xmm1, %xmm2
     33 ; SSE2-NEXT:    movdqa %xmm4, %xmm3
     34 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
     35 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
     36 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm2
     37 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
     38 ; SSE2-NEXT:    pand %xmm6, %xmm2
     39 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
     40 ; SSE2-NEXT:    por %xmm2, %xmm3
     41 ; SSE2-NEXT:    pand %xmm3, %xmm1
     42 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm3
     43 ; SSE2-NEXT:    por %xmm1, %xmm3
     44 ; SSE2-NEXT:    pand %xmm5, %xmm0
     45 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm5
     46 ; SSE2-NEXT:    por %xmm5, %xmm0
     47 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
     48 ; SSE2-NEXT:    retq
     49 ;
     50 ; SSSE3-LABEL: trunc_usat_v4i64_v4i32:
     51 ; SSSE3:       # %bb.0:
     52 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
     53 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
     54 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
     55 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259455,9223372039002259455]
     56 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
     57 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
     58 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
     59 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm3
     60 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
     61 ; SSSE3-NEXT:    pand %xmm6, %xmm3
     62 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
     63 ; SSSE3-NEXT:    por %xmm3, %xmm5
     64 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
     65 ; SSSE3-NEXT:    movdqa %xmm4, %xmm3
     66 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
     67 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
     68 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm2
     69 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
     70 ; SSSE3-NEXT:    pand %xmm6, %xmm2
     71 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
     72 ; SSSE3-NEXT:    por %xmm2, %xmm3
     73 ; SSSE3-NEXT:    pand %xmm3, %xmm1
     74 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm3
     75 ; SSSE3-NEXT:    por %xmm1, %xmm3
     76 ; SSSE3-NEXT:    pand %xmm5, %xmm0
     77 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm5
     78 ; SSSE3-NEXT:    por %xmm5, %xmm0
     79 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
     80 ; SSSE3-NEXT:    retq
     81 ;
     82 ; SSE41-LABEL: trunc_usat_v4i64_v4i32:
     83 ; SSE41:       # %bb.0:
     84 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
     85 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
     86 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
     87 ; SSE41-NEXT:    pxor %xmm0, %xmm3
     88 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259455,9223372039002259455]
     89 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
     90 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm5
     91 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
     92 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm3
     93 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
     94 ; SSE41-NEXT:    pand %xmm6, %xmm7
     95 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3]
     96 ; SSE41-NEXT:    por %xmm7, %xmm3
     97 ; SSE41-NEXT:    pxor %xmm1, %xmm0
     98 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
     99 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
    100 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
    101 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm0
    102 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
    103 ; SSE41-NEXT:    pand %xmm6, %xmm4
    104 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
    105 ; SSE41-NEXT:    por %xmm4, %xmm0
    106 ; SSE41-NEXT:    movapd {{.*#+}} xmm4 = [4294967295,4294967295]
    107 ; SSE41-NEXT:    movapd {{.*#+}} xmm5 = [4294967295,429496729]
    108 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
    109 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
    110 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
    111 ; SSE41-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,2],xmm5[0,2]
    112 ; SSE41-NEXT:    movaps %xmm4, %xmm0
    113 ; SSE41-NEXT:    retq
    114 ;
    115 ; AVX1-LABEL: trunc_usat_v4i64_v4i32:
    116 ; AVX1:       # %bb.0:
    117 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
    118 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
    119 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm1
    120 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372041149743103,9223372041149743103]
    121 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm1
    122 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm2
    123 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
    124 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
    125 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,429496729]
    126 ; AVX1-NEXT:    vblendvpd %ymm1, %ymm0, %ymm2, %ymm0
    127 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
    128 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
    129 ; AVX1-NEXT:    vzeroupper
    130 ; AVX1-NEXT:    retq
    131 ;
    132 ; AVX2-SLOW-LABEL: trunc_usat_v4i64_v4i32:
    133 ; AVX2-SLOW:       # %bb.0:
    134 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
    135 ; AVX2-SLOW-NEXT:    vpxor %ymm1, %ymm0, %ymm1
    136 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
    137 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm1
    138 ; AVX2-SLOW-NEXT:    vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,429496729]
    139 ; AVX2-SLOW-NEXT:    vblendvpd %ymm1, %ymm0, %ymm2, %ymm0
    140 ; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} ymm0 = ymm0[0,2,2,3,4,6,6,7]
    141 ; AVX2-SLOW-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,2,2,3]
    142 ; AVX2-SLOW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
    143 ; AVX2-SLOW-NEXT:    vzeroupper
    144 ; AVX2-SLOW-NEXT:    retq
    145 ;
    146 ; AVX2-FAST-LABEL: trunc_usat_v4i64_v4i32:
    147 ; AVX2-FAST:       # %bb.0:
    148 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
    149 ; AVX2-FAST-NEXT:    vpxor %ymm1, %ymm0, %ymm1
    150 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
    151 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm1
    152 ; AVX2-FAST-NEXT:    vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,429496729]
    153 ; AVX2-FAST-NEXT:    vblendvpd %ymm1, %ymm0, %ymm2, %ymm0
    154 ; AVX2-FAST-NEXT:    vmovapd {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7]
    155 ; AVX2-FAST-NEXT:    vpermps %ymm0, %ymm1, %ymm0
    156 ; AVX2-FAST-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
    157 ; AVX2-FAST-NEXT:    vzeroupper
    158 ; AVX2-FAST-NEXT:    retq
    159 ;
    160 ; AVX512F-LABEL: trunc_usat_v4i64_v4i32:
    161 ; AVX512F:       # %bb.0:
    162 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
    163 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]
    164 ; AVX512F-NEXT:    vpcmpltuq %zmm1, %zmm0, %k1
    165 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
    166 ; AVX512F-NEXT:    vmovdqa64 %zmm0, %zmm1 {%k1}
    167 ; AVX512F-NEXT:    vpmovqd %zmm1, %ymm0
    168 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
    169 ; AVX512F-NEXT:    vzeroupper
    170 ; AVX512F-NEXT:    retq
    171 ;
    172 ; AVX512VL-LABEL: trunc_usat_v4i64_v4i32:
    173 ; AVX512VL:       # %bb.0:
    174 ; AVX512VL-NEXT:    vpcmpltuq {{.*}}(%rip){1to4}, %ymm0, %k1
    175 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
    176 ; AVX512VL-NEXT:    vmovdqa64 %ymm0, %ymm1 {%k1}
    177 ; AVX512VL-NEXT:    vpmovqd %ymm1, %xmm0
    178 ; AVX512VL-NEXT:    vzeroupper
    179 ; AVX512VL-NEXT:    retq
    180 ;
    181 ; AVX512BW-LABEL: trunc_usat_v4i64_v4i32:
    182 ; AVX512BW:       # %bb.0:
    183 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
    184 ; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]
    185 ; AVX512BW-NEXT:    vpcmpltuq %zmm1, %zmm0, %k1
    186 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
    187 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, %zmm1 {%k1}
    188 ; AVX512BW-NEXT:    vpmovqd %zmm1, %ymm0
    189 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
    190 ; AVX512BW-NEXT:    vzeroupper
    191 ; AVX512BW-NEXT:    retq
    192 ;
    193 ; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i32:
    194 ; AVX512BWVL:       # %bb.0:
    195 ; AVX512BWVL-NEXT:    vpcmpltuq {{.*}}(%rip){1to4}, %ymm0, %k1
    196 ; AVX512BWVL-NEXT:    vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
    197 ; AVX512BWVL-NEXT:    vmovdqa64 %ymm0, %ymm1 {%k1}
    198 ; AVX512BWVL-NEXT:    vpmovqd %ymm1, %xmm0
    199 ; AVX512BWVL-NEXT:    vzeroupper
    200 ; AVX512BWVL-NEXT:    retq
    201   %1 = icmp ult <4 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
    202   %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 429496729>
    203   %3 = trunc <4 x i64> %2 to <4 x i32>
    204   ret <4 x i32> %3
    205 }
    206 
    207 define <8 x i32> @trunc_usat_v8i64_v8i32(<8 x i64> %a0) {
    208 ; SSE2-LABEL: trunc_usat_v8i64_v8i32:
    209 ; SSE2:       # %bb.0:
    210 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [4294967295,4294967295]
    211 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]
    212 ; SSE2-NEXT:    movdqa %xmm3, %xmm7
    213 ; SSE2-NEXT:    pxor %xmm5, %xmm7
    214 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002259455,9223372039002259455]
    215 ; SSE2-NEXT:    movdqa %xmm9, %xmm6
    216 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm6
    217 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
    218 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm7
    219 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
    220 ; SSE2-NEXT:    pand %xmm4, %xmm7
    221 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
    222 ; SSE2-NEXT:    por %xmm7, %xmm4
    223 ; SSE2-NEXT:    pand %xmm4, %xmm3
    224 ; SSE2-NEXT:    pandn %xmm8, %xmm4
    225 ; SSE2-NEXT:    por %xmm3, %xmm4
    226 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
    227 ; SSE2-NEXT:    pxor %xmm5, %xmm3
    228 ; SSE2-NEXT:    movdqa %xmm9, %xmm6
    229 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm6
    230 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
    231 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm3
    232 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
    233 ; SSE2-NEXT:    pand %xmm10, %xmm7
    234 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
    235 ; SSE2-NEXT:    por %xmm7, %xmm3
    236 ; SSE2-NEXT:    pand %xmm3, %xmm2
    237 ; SSE2-NEXT:    pandn %xmm8, %xmm3
    238 ; SSE2-NEXT:    por %xmm2, %xmm3
    239 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,2],xmm4[0,2]
    240 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
    241 ; SSE2-NEXT:    pxor %xmm5, %xmm2
    242 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
    243 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
    244 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
    245 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm2
    246 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
    247 ; SSE2-NEXT:    pand %xmm6, %xmm2
    248 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
    249 ; SSE2-NEXT:    por %xmm2, %xmm4
    250 ; SSE2-NEXT:    pand %xmm4, %xmm1
    251 ; SSE2-NEXT:    pandn %xmm8, %xmm4
    252 ; SSE2-NEXT:    por %xmm1, %xmm4
    253 ; SSE2-NEXT:    pxor %xmm0, %xmm5
    254 ; SSE2-NEXT:    movdqa %xmm9, %xmm1
    255 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm1
    256 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
    257 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm5
    258 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
    259 ; SSE2-NEXT:    pand %xmm2, %xmm5
    260 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
    261 ; SSE2-NEXT:    por %xmm5, %xmm1
    262 ; SSE2-NEXT:    pand %xmm1, %xmm0
    263 ; SSE2-NEXT:    pandn %xmm8, %xmm1
    264 ; SSE2-NEXT:    por %xmm1, %xmm0
    265 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm4[0,2]
    266 ; SSE2-NEXT:    movaps %xmm3, %xmm1
    267 ; SSE2-NEXT:    retq
    268 ;
    269 ; SSSE3-LABEL: trunc_usat_v8i64_v8i32:
    270 ; SSSE3:       # %bb.0:
    271 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [4294967295,4294967295]
    272 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]
    273 ; SSSE3-NEXT:    movdqa %xmm3, %xmm7
    274 ; SSSE3-NEXT:    pxor %xmm5, %xmm7
    275 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002259455,9223372039002259455]
    276 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
    277 ; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm6
    278 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
    279 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm7
    280 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
    281 ; SSSE3-NEXT:    pand %xmm4, %xmm7
    282 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
    283 ; SSSE3-NEXT:    por %xmm7, %xmm4
    284 ; SSSE3-NEXT:    pand %xmm4, %xmm3
    285 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
    286 ; SSSE3-NEXT:    por %xmm3, %xmm4
    287 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
    288 ; SSSE3-NEXT:    pxor %xmm5, %xmm3
    289 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
    290 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm6
    291 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
    292 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm3
    293 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
    294 ; SSSE3-NEXT:    pand %xmm10, %xmm7
    295 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
    296 ; SSSE3-NEXT:    por %xmm7, %xmm3
    297 ; SSSE3-NEXT:    pand %xmm3, %xmm2
    298 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
    299 ; SSSE3-NEXT:    por %xmm2, %xmm3
    300 ; SSSE3-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,2],xmm4[0,2]
    301 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
    302 ; SSSE3-NEXT:    pxor %xmm5, %xmm2
    303 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
    304 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
    305 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
    306 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm2
    307 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
    308 ; SSSE3-NEXT:    pand %xmm6, %xmm2
    309 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
    310 ; SSSE3-NEXT:    por %xmm2, %xmm4
    311 ; SSSE3-NEXT:    pand %xmm4, %xmm1
    312 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
    313 ; SSSE3-NEXT:    por %xmm1, %xmm4
    314 ; SSSE3-NEXT:    pxor %xmm0, %xmm5
    315 ; SSSE3-NEXT:    movdqa %xmm9, %xmm1
    316 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm1
    317 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
    318 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm5
    319 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
    320 ; SSSE3-NEXT:    pand %xmm2, %xmm5
    321 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
    322 ; SSSE3-NEXT:    por %xmm5, %xmm1
    323 ; SSSE3-NEXT:    pand %xmm1, %xmm0
    324 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
    325 ; SSSE3-NEXT:    por %xmm1, %xmm0
    326 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm4[0,2]
    327 ; SSSE3-NEXT:    movaps %xmm3, %xmm1
    328 ; SSSE3-NEXT:    retq
    329 ;
    330 ; SSE41-LABEL: trunc_usat_v8i64_v8i32:
    331 ; SSE41:       # %bb.0:
    332 ; SSE41-NEXT:    movdqa %xmm0, %xmm8
    333 ; SSE41-NEXT:    movapd {{.*#+}} xmm6 = [4294967295,4294967295]
    334 ; SSE41-NEXT:    movdqa {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648]
    335 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
    336 ; SSE41-NEXT:    pxor %xmm7, %xmm0
    337 ; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002259455,9223372039002259455]
    338 ; SSE41-NEXT:    movdqa %xmm9, %xmm4
    339 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
    340 ; SSE41-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
    341 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
    342 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
    343 ; SSE41-NEXT:    pand %xmm10, %xmm5
    344 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
    345 ; SSE41-NEXT:    por %xmm5, %xmm0
    346 ; SSE41-NEXT:    movapd %xmm6, %xmm5
    347 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm5
    348 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
    349 ; SSE41-NEXT:    pxor %xmm7, %xmm0
    350 ; SSE41-NEXT:    movdqa %xmm9, %xmm3
    351 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
    352 ; SSE41-NEXT:    pshufd {{.*#+}} xmm10 = xmm3[0,0,2,2]
    353 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
    354 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
    355 ; SSE41-NEXT:    pand %xmm10, %xmm4
    356 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
    357 ; SSE41-NEXT:    por %xmm4, %xmm0
    358 ; SSE41-NEXT:    movapd %xmm6, %xmm4
    359 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
    360 ; SSE41-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,2],xmm5[0,2]
    361 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    362 ; SSE41-NEXT:    pxor %xmm7, %xmm0
    363 ; SSE41-NEXT:    movdqa %xmm9, %xmm2
    364 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
    365 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
    366 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
    367 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
    368 ; SSE41-NEXT:    pand %xmm3, %xmm5
    369 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
    370 ; SSE41-NEXT:    por %xmm5, %xmm0
    371 ; SSE41-NEXT:    movapd %xmm6, %xmm2
    372 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
    373 ; SSE41-NEXT:    pxor %xmm8, %xmm7
    374 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
    375 ; SSE41-NEXT:    pcmpgtd %xmm7, %xmm0
    376 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,2,2]
    377 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm7
    378 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm7[1,1,3,3]
    379 ; SSE41-NEXT:    pand %xmm1, %xmm3
    380 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
    381 ; SSE41-NEXT:    por %xmm3, %xmm0
    382 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm6
    383 ; SSE41-NEXT:    shufps {{.*#+}} xmm6 = xmm6[0,2],xmm2[0,2]
    384 ; SSE41-NEXT:    movaps %xmm6, %xmm0
    385 ; SSE41-NEXT:    movaps %xmm4, %xmm1
    386 ; SSE41-NEXT:    retq
    387 ;
    388 ; AVX1-LABEL: trunc_usat_v8i64_v8i32:
    389 ; AVX1:       # %bb.0:
    390 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
    391 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
    392 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
    393 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
    394 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [9223372041149743103,9223372041149743103]
    395 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm5, %xmm3
    396 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm6
    397 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm5, %xmm6
    398 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm6, %ymm3
    399 ; AVX1-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
    400 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
    401 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
    402 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm5, %xmm3
    403 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm4
    404 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
    405 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
    406 ; AVX1-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
    407 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
    408 ; AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
    409 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
    410 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
    411 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
    412 ; AVX1-NEXT:    retq
    413 ;
    414 ; AVX2-SLOW-LABEL: trunc_usat_v8i64_v8i32:
    415 ; AVX2-SLOW:       # %bb.0:
    416 ; AVX2-SLOW-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
    417 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
    418 ; AVX2-SLOW-NEXT:    vpxor %ymm3, %ymm1, %ymm4
    419 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
    420 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
    421 ; AVX2-SLOW-NEXT:    vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
    422 ; AVX2-SLOW-NEXT:    vpxor %ymm3, %ymm0, %ymm3
    423 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm3, %ymm5, %ymm3
    424 ; AVX2-SLOW-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
    425 ; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} ymm0 = ymm0[0,2,2,3,4,6,6,7]
    426 ; AVX2-SLOW-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,2,2,3]
    427 ; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} ymm1 = ymm1[0,2,2,3,4,6,6,7]
    428 ; AVX2-SLOW-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[0,2,2,3]
    429 ; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
    430 ; AVX2-SLOW-NEXT:    retq
    431 ;
    432 ; AVX2-FAST-LABEL: trunc_usat_v8i64_v8i32:
    433 ; AVX2-FAST:       # %bb.0:
    434 ; AVX2-FAST-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
    435 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
    436 ; AVX2-FAST-NEXT:    vpxor %ymm3, %ymm1, %ymm4
    437 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
    438 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
    439 ; AVX2-FAST-NEXT:    vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
    440 ; AVX2-FAST-NEXT:    vpxor %ymm3, %ymm0, %ymm3
    441 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm3, %ymm5, %ymm3
    442 ; AVX2-FAST-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
    443 ; AVX2-FAST-NEXT:    vmovapd {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
    444 ; AVX2-FAST-NEXT:    vpermps %ymm0, %ymm2, %ymm0
    445 ; AVX2-FAST-NEXT:    vpermps %ymm1, %ymm2, %ymm1
    446 ; AVX2-FAST-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
    447 ; AVX2-FAST-NEXT:    retq
    448 ;
    449 ; AVX512-LABEL: trunc_usat_v8i64_v8i32:
    450 ; AVX512:       # %bb.0:
    451 ; AVX512-NEXT:    vpmovusqd %zmm0, %ymm0
    452 ; AVX512-NEXT:    retq
    453   %1 = icmp ult <8 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
    454   %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
    455   %3 = trunc <8 x i64> %2 to <8 x i32>
    456   ret <8 x i32> %3
    457 }
    458 
    459 ;
    460 ; Unsigned saturation truncation to vXi16
    461 ;
    462 
    463 define <8 x i16> @trunc_usat_v8i64_v8i16(<8 x i64> %a0) {
    464 ; SSE2-LABEL: trunc_usat_v8i64_v8i16:
    465 ; SSE2:       # %bb.0:
    466 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [65535,65535]
    467 ; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
    468 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
    469 ; SSE2-NEXT:    pxor %xmm6, %xmm5
    470 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002324991,9223372039002324991]
    471 ; SSE2-NEXT:    movdqa %xmm9, %xmm7
    472 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
    473 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
    474 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm5
    475 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
    476 ; SSE2-NEXT:    pand %xmm10, %xmm4
    477 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
    478 ; SSE2-NEXT:    por %xmm4, %xmm5
    479 ; SSE2-NEXT:    pand %xmm5, %xmm2
    480 ; SSE2-NEXT:    pandn %xmm8, %xmm5
    481 ; SSE2-NEXT:    por %xmm2, %xmm5
    482 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
    483 ; SSE2-NEXT:    pxor %xmm6, %xmm2
    484 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
    485 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
    486 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
    487 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm2
    488 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
    489 ; SSE2-NEXT:    pand %xmm10, %xmm7
    490 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
    491 ; SSE2-NEXT:    por %xmm7, %xmm2
    492 ; SSE2-NEXT:    pand %xmm2, %xmm3
    493 ; SSE2-NEXT:    pandn %xmm8, %xmm2
    494 ; SSE2-NEXT:    por %xmm3, %xmm2
    495 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
    496 ; SSE2-NEXT:    pxor %xmm6, %xmm3
    497 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
    498 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
    499 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
    500 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm3
    501 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
    502 ; SSE2-NEXT:    pand %xmm7, %xmm3
    503 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
    504 ; SSE2-NEXT:    por %xmm3, %xmm4
    505 ; SSE2-NEXT:    pand %xmm4, %xmm0
    506 ; SSE2-NEXT:    pandn %xmm8, %xmm4
    507 ; SSE2-NEXT:    por %xmm0, %xmm4
    508 ; SSE2-NEXT:    pxor %xmm1, %xmm6
    509 ; SSE2-NEXT:    movdqa %xmm9, %xmm0
    510 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm0
    511 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2]
    512 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm6
    513 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
    514 ; SSE2-NEXT:    pand %xmm3, %xmm6
    515 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
    516 ; SSE2-NEXT:    por %xmm6, %xmm0
    517 ; SSE2-NEXT:    pand %xmm0, %xmm1
    518 ; SSE2-NEXT:    pandn %xmm8, %xmm0
    519 ; SSE2-NEXT:    por %xmm1, %xmm0
    520 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
    521 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
    522 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[0,2,2,3]
    523 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
    524 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
    525 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
    526 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm0[0,1,0,2,4,5,6,7]
    527 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
    528 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
    529 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
    530 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
    531 ; SSE2-NEXT:    retq
    532 ;
    533 ; SSSE3-LABEL: trunc_usat_v8i64_v8i16:
    534 ; SSSE3:       # %bb.0:
    535 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [65535,65535]
    536 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
    537 ; SSSE3-NEXT:    movdqa %xmm2, %xmm5
    538 ; SSSE3-NEXT:    pxor %xmm6, %xmm5
    539 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002324991,9223372039002324991]
    540 ; SSSE3-NEXT:    movdqa %xmm9, %xmm7
    541 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm7
    542 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
    543 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm5
    544 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
    545 ; SSSE3-NEXT:    pand %xmm10, %xmm4
    546 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
    547 ; SSSE3-NEXT:    por %xmm4, %xmm5
    548 ; SSSE3-NEXT:    pand %xmm5, %xmm2
    549 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
    550 ; SSSE3-NEXT:    por %xmm2, %xmm5
    551 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
    552 ; SSSE3-NEXT:    pxor %xmm6, %xmm2
    553 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
    554 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
    555 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
    556 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm2
    557 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
    558 ; SSSE3-NEXT:    pand %xmm10, %xmm7
    559 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
    560 ; SSSE3-NEXT:    por %xmm7, %xmm2
    561 ; SSSE3-NEXT:    pand %xmm2, %xmm3
    562 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
    563 ; SSSE3-NEXT:    por %xmm3, %xmm2
    564 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
    565 ; SSSE3-NEXT:    pxor %xmm6, %xmm3
    566 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
    567 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
    568 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
    569 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm3
    570 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
    571 ; SSSE3-NEXT:    pand %xmm7, %xmm3
    572 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
    573 ; SSSE3-NEXT:    por %xmm3, %xmm4
    574 ; SSSE3-NEXT:    pand %xmm4, %xmm0
    575 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
    576 ; SSSE3-NEXT:    por %xmm0, %xmm4
    577 ; SSSE3-NEXT:    pxor %xmm1, %xmm6
    578 ; SSSE3-NEXT:    movdqa %xmm9, %xmm0
    579 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm0
    580 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2]
    581 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm6
    582 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
    583 ; SSSE3-NEXT:    pand %xmm3, %xmm6
    584 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
    585 ; SSSE3-NEXT:    por %xmm6, %xmm0
    586 ; SSSE3-NEXT:    pand %xmm0, %xmm1
    587 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
    588 ; SSSE3-NEXT:    por %xmm1, %xmm0
    589 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
    590 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
    591 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[0,2,2,3]
    592 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
    593 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
    594 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
    595 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm2 = xmm0[0,1,0,2,4,5,6,7]
    596 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
    597 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
    598 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
    599 ; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
    600 ; SSSE3-NEXT:    retq
    601 ;
    602 ; SSE41-LABEL: trunc_usat_v8i64_v8i16:
    603 ; SSE41:       # %bb.0:
    604 ; SSE41-NEXT:    movdqa %xmm0, %xmm8
    605 ; SSE41-NEXT:    movapd {{.*#+}} xmm5 = [65535,65535]
    606 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
    607 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    608 ; SSE41-NEXT:    pxor %xmm6, %xmm0
    609 ; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002324991,9223372039002324991]
    610 ; SSE41-NEXT:    movdqa %xmm9, %xmm7
    611 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
    612 ; SSE41-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
    613 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
    614 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
    615 ; SSE41-NEXT:    pand %xmm10, %xmm4
    616 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
    617 ; SSE41-NEXT:    por %xmm4, %xmm0
    618 ; SSE41-NEXT:    movapd %xmm5, %xmm4
    619 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
    620 ; SSE41-NEXT:    movdqa %xmm8, %xmm0
    621 ; SSE41-NEXT:    pxor %xmm6, %xmm0
    622 ; SSE41-NEXT:    movdqa %xmm9, %xmm1
    623 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
    624 ; SSE41-NEXT:    pshufd {{.*#+}} xmm10 = xmm1[0,0,2,2]
    625 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
    626 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
    627 ; SSE41-NEXT:    pand %xmm10, %xmm7
    628 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
    629 ; SSE41-NEXT:    por %xmm7, %xmm0
    630 ; SSE41-NEXT:    movapd %xmm5, %xmm1
    631 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm1
    632 ; SSE41-NEXT:    packusdw %xmm4, %xmm1
    633 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
    634 ; SSE41-NEXT:    pxor %xmm6, %xmm0
    635 ; SSE41-NEXT:    movdqa %xmm9, %xmm4
    636 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
    637 ; SSE41-NEXT:    pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2]
    638 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
    639 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
    640 ; SSE41-NEXT:    pand %xmm8, %xmm7
    641 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
    642 ; SSE41-NEXT:    por %xmm7, %xmm0
    643 ; SSE41-NEXT:    movapd %xmm5, %xmm4
    644 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm4
    645 ; SSE41-NEXT:    pxor %xmm2, %xmm6
    646 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
    647 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm0
    648 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2]
    649 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm6
    650 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
    651 ; SSE41-NEXT:    pand %xmm3, %xmm6
    652 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
    653 ; SSE41-NEXT:    por %xmm6, %xmm0
    654 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
    655 ; SSE41-NEXT:    packusdw %xmm4, %xmm5
    656 ; SSE41-NEXT:    packusdw %xmm5, %xmm1
    657 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    658 ; SSE41-NEXT:    retq
    659 ;
    660 ; AVX1-LABEL: trunc_usat_v8i64_v8i16:
    661 ; AVX1:       # %bb.0:
    662 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm2 = [65535,65535,65535,65535]
    663 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
    664 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
    665 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
    666 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [9223372036854841343,9223372036854841343]
    667 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm5, %xmm3
    668 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm6
    669 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm5, %xmm6
    670 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm6, %ymm3
    671 ; AVX1-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
    672 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
    673 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
    674 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm5, %xmm3
    675 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm4
    676 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
    677 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
    678 ; AVX1-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
    679 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
    680 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
    681 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
    682 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
    683 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
    684 ; AVX1-NEXT:    vzeroupper
    685 ; AVX1-NEXT:    retq
    686 ;
    687 ; AVX2-LABEL: trunc_usat_v8i64_v8i16:
    688 ; AVX2:       # %bb.0:
    689 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [65535,65535,65535,65535]
    690 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
    691 ; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm4
    692 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343]
    693 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
    694 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
    695 ; AVX2-NEXT:    vpxor %ymm3, %ymm0, %ymm3
    696 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm5, %ymm3
    697 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
    698 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
    699 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
    700 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
    701 ; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
    702 ; AVX2-NEXT:    vzeroupper
    703 ; AVX2-NEXT:    retq
    704 ;
    705 ; AVX512-LABEL: trunc_usat_v8i64_v8i16:
    706 ; AVX512:       # %bb.0:
    707 ; AVX512-NEXT:    vpmovusqw %zmm0, %xmm0
    708 ; AVX512-NEXT:    vzeroupper
    709 ; AVX512-NEXT:    retq
    710   %1 = icmp ult <8 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>
    711   %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>
    712   %3 = trunc <8 x i64> %2 to <8 x i16>
    713   ret <8 x i16> %3
    714 }
    715 
    716 define <8 x i16> @trunc_usat_v8i32_v8i16(<8 x i32> %a0) {
    717 ; SSE2-LABEL: trunc_usat_v8i32_v8i16:
    718 ; SSE2:       # %bb.0:
    719 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
    720 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
    721 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
    722 ; SSE2-NEXT:    pxor %xmm3, %xmm4
    723 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]
    724 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
    725 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
    726 ; SSE2-NEXT:    pand %xmm6, %xmm0
    727 ; SSE2-NEXT:    pandn %xmm2, %xmm6
    728 ; SSE2-NEXT:    por %xmm6, %xmm0
    729 ; SSE2-NEXT:    pxor %xmm1, %xmm3
    730 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
    731 ; SSE2-NEXT:    pand %xmm5, %xmm1
    732 ; SSE2-NEXT:    pandn %xmm2, %xmm5
    733 ; SSE2-NEXT:    por %xmm1, %xmm5
    734 ; SSE2-NEXT:    pslld $16, %xmm5
    735 ; SSE2-NEXT:    psrad $16, %xmm5
    736 ; SSE2-NEXT:    pslld $16, %xmm0
    737 ; SSE2-NEXT:    psrad $16, %xmm0
    738 ; SSE2-NEXT:    packssdw %xmm5, %xmm0
    739 ; SSE2-NEXT:    retq
    740 ;
    741 ; SSSE3-LABEL: trunc_usat_v8i32_v8i16:
    742 ; SSSE3:       # %bb.0:
    743 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
    744 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
    745 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
    746 ; SSSE3-NEXT:    pxor %xmm3, %xmm4
    747 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]
    748 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
    749 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
    750 ; SSSE3-NEXT:    pand %xmm6, %xmm0
    751 ; SSSE3-NEXT:    pandn %xmm2, %xmm6
    752 ; SSSE3-NEXT:    por %xmm6, %xmm0
    753 ; SSSE3-NEXT:    pxor %xmm1, %xmm3
    754 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
    755 ; SSSE3-NEXT:    pand %xmm5, %xmm1
    756 ; SSSE3-NEXT:    pandn %xmm2, %xmm5
    757 ; SSSE3-NEXT:    por %xmm1, %xmm5
    758 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
    759 ; SSSE3-NEXT:    pshufb %xmm1, %xmm5
    760 ; SSSE3-NEXT:    pshufb %xmm1, %xmm0
    761 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm5[0]
    762 ; SSSE3-NEXT:    retq
    763 ;
    764 ; SSE41-LABEL: trunc_usat_v8i32_v8i16:
    765 ; SSE41:       # %bb.0:
    766 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
    767 ; SSE41-NEXT:    pminud %xmm2, %xmm1
    768 ; SSE41-NEXT:    pminud %xmm2, %xmm0
    769 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
    770 ; SSE41-NEXT:    retq
    771 ;
    772 ; AVX1-LABEL: trunc_usat_v8i32_v8i16:
    773 ; AVX1:       # %bb.0:
    774 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
    775 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
    776 ; AVX1-NEXT:    vpminud %xmm2, %xmm1, %xmm1
    777 ; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
    778 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
    779 ; AVX1-NEXT:    vzeroupper
    780 ; AVX1-NEXT:    retq
    781 ;
    782 ; AVX2-LABEL: trunc_usat_v8i32_v8i16:
    783 ; AVX2:       # %bb.0:
    784 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535]
    785 ; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
    786 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
    787 ; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
    788 ; AVX2-NEXT:    vzeroupper
    789 ; AVX2-NEXT:    retq
    790 ;
    791 ; AVX512F-LABEL: trunc_usat_v8i32_v8i16:
    792 ; AVX512F:       # %bb.0:
    793 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535]
    794 ; AVX512F-NEXT:    vpminud %ymm1, %ymm0, %ymm0
    795 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
    796 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
    797 ; AVX512F-NEXT:    vzeroupper
    798 ; AVX512F-NEXT:    retq
    799 ;
    800 ; AVX512VL-LABEL: trunc_usat_v8i32_v8i16:
    801 ; AVX512VL:       # %bb.0:
    802 ; AVX512VL-NEXT:    vpmovusdw %ymm0, %xmm0
    803 ; AVX512VL-NEXT:    vzeroupper
    804 ; AVX512VL-NEXT:    retq
    805 ;
    806 ; AVX512BW-LABEL: trunc_usat_v8i32_v8i16:
    807 ; AVX512BW:       # %bb.0:
    808 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535]
    809 ; AVX512BW-NEXT:    vpminud %ymm1, %ymm0, %ymm0
    810 ; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0
    811 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
    812 ; AVX512BW-NEXT:    vzeroupper
    813 ; AVX512BW-NEXT:    retq
    814 ;
    815 ; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i16:
    816 ; AVX512BWVL:       # %bb.0:
    817 ; AVX512BWVL-NEXT:    vpmovusdw %ymm0, %xmm0
    818 ; AVX512BWVL-NEXT:    vzeroupper
    819 ; AVX512BWVL-NEXT:    retq
    820   %1 = icmp ult <8 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
    821   %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
    822   %3 = trunc <8 x i32> %2 to <8 x i16>
    823   ret <8 x i16> %3
    824 }
    825 
    826 define <16 x i16> @trunc_usat_v16i32_v16i16(<16 x i32> %a0) {
    827 ; SSE2-LABEL: trunc_usat_v16i32_v16i16:
    828 ; SSE2:       # %bb.0:
    829 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
    830 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [65535,65535,65535,65535]
    831 ; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648]
    832 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
    833 ; SSE2-NEXT:    pxor %xmm7, %xmm6
    834 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]
    835 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
    836 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm1
    837 ; SSE2-NEXT:    pand %xmm1, %xmm2
    838 ; SSE2-NEXT:    pandn %xmm8, %xmm1
    839 ; SSE2-NEXT:    por %xmm2, %xmm1
    840 ; SSE2-NEXT:    movdqa %xmm3, %xmm6
    841 ; SSE2-NEXT:    pxor %xmm7, %xmm6
    842 ; SSE2-NEXT:    movdqa %xmm5, %xmm2
    843 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm2
    844 ; SSE2-NEXT:    pand %xmm2, %xmm3
    845 ; SSE2-NEXT:    pandn %xmm8, %xmm2
    846 ; SSE2-NEXT:    por %xmm3, %xmm2
    847 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
    848 ; SSE2-NEXT:    pxor %xmm7, %xmm3
    849 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
    850 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm6
    851 ; SSE2-NEXT:    pand %xmm6, %xmm0
    852 ; SSE2-NEXT:    pandn %xmm8, %xmm6
    853 ; SSE2-NEXT:    por %xmm6, %xmm0
    854 ; SSE2-NEXT:    pxor %xmm4, %xmm7
    855 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm5
    856 ; SSE2-NEXT:    pand %xmm5, %xmm4
    857 ; SSE2-NEXT:    pandn %xmm8, %xmm5
    858 ; SSE2-NEXT:    por %xmm4, %xmm5
    859 ; SSE2-NEXT:    pslld $16, %xmm5
    860 ; SSE2-NEXT:    psrad $16, %xmm5
    861 ; SSE2-NEXT:    pslld $16, %xmm0
    862 ; SSE2-NEXT:    psrad $16, %xmm0
    863 ; SSE2-NEXT:    packssdw %xmm5, %xmm0
    864 ; SSE2-NEXT:    pslld $16, %xmm2
    865 ; SSE2-NEXT:    psrad $16, %xmm2
    866 ; SSE2-NEXT:    pslld $16, %xmm1
    867 ; SSE2-NEXT:    psrad $16, %xmm1
    868 ; SSE2-NEXT:    packssdw %xmm2, %xmm1
    869 ; SSE2-NEXT:    retq
    870 ;
    871 ; SSSE3-LABEL: trunc_usat_v16i32_v16i16:
    872 ; SSSE3:       # %bb.0:
    873 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
    874 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [65535,65535,65535,65535]
    875 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648]
    876 ; SSSE3-NEXT:    movdqa %xmm2, %xmm6
    877 ; SSSE3-NEXT:    pxor %xmm7, %xmm6
    878 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]
    879 ; SSSE3-NEXT:    movdqa %xmm5, %xmm1
    880 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm1
    881 ; SSSE3-NEXT:    pand %xmm1, %xmm2
    882 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
    883 ; SSSE3-NEXT:    por %xmm2, %xmm1
    884 ; SSSE3-NEXT:    movdqa %xmm3, %xmm6
    885 ; SSSE3-NEXT:    pxor %xmm7, %xmm6
    886 ; SSSE3-NEXT:    movdqa %xmm5, %xmm2
    887 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm2
    888 ; SSSE3-NEXT:    pand %xmm2, %xmm3
    889 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
    890 ; SSSE3-NEXT:    por %xmm3, %xmm2
    891 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
    892 ; SSSE3-NEXT:    pxor %xmm7, %xmm3
    893 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
    894 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm6
    895 ; SSSE3-NEXT:    pand %xmm6, %xmm0
    896 ; SSSE3-NEXT:    pandn %xmm8, %xmm6
    897 ; SSSE3-NEXT:    por %xmm6, %xmm0
    898 ; SSSE3-NEXT:    pxor %xmm4, %xmm7
    899 ; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm5
    900 ; SSSE3-NEXT:    pand %xmm5, %xmm4
    901 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
    902 ; SSSE3-NEXT:    por %xmm4, %xmm5
    903 ; SSSE3-NEXT:    pslld $16, %xmm5
    904 ; SSSE3-NEXT:    psrad $16, %xmm5
    905 ; SSSE3-NEXT:    pslld $16, %xmm0
    906 ; SSSE3-NEXT:    psrad $16, %xmm0
    907 ; SSSE3-NEXT:    packssdw %xmm5, %xmm0
    908 ; SSSE3-NEXT:    pslld $16, %xmm2
    909 ; SSSE3-NEXT:    psrad $16, %xmm2
    910 ; SSSE3-NEXT:    pslld $16, %xmm1
    911 ; SSSE3-NEXT:    psrad $16, %xmm1
    912 ; SSSE3-NEXT:    packssdw %xmm2, %xmm1
    913 ; SSSE3-NEXT:    retq
    914 ;
    915 ; SSE41-LABEL: trunc_usat_v16i32_v16i16:
    916 ; SSE41:       # %bb.0:
    917 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [65535,65535,65535,65535]
    918 ; SSE41-NEXT:    pminud %xmm4, %xmm3
    919 ; SSE41-NEXT:    pminud %xmm4, %xmm2
    920 ; SSE41-NEXT:    packusdw %xmm3, %xmm2
    921 ; SSE41-NEXT:    pminud %xmm4, %xmm1
    922 ; SSE41-NEXT:    pminud %xmm4, %xmm0
    923 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
    924 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
    925 ; SSE41-NEXT:    retq
    926 ;
    927 ; AVX1-LABEL: trunc_usat_v16i32_v16i16:
    928 ; AVX1:       # %bb.0:
    929 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
    930 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [65535,65535,65535,65535]
    931 ; AVX1-NEXT:    vpminud %xmm3, %xmm2, %xmm2
    932 ; AVX1-NEXT:    vpminud %xmm3, %xmm0, %xmm0
    933 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
    934 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
    935 ; AVX1-NEXT:    vpminud %xmm3, %xmm2, %xmm2
    936 ; AVX1-NEXT:    vpminud %xmm3, %xmm1, %xmm1
    937 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
    938 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
    939 ; AVX1-NEXT:    retq
    940 ;
    941 ; AVX2-LABEL: trunc_usat_v16i32_v16i16:
    942 ; AVX2:       # %bb.0:
    943 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535]
    944 ; AVX2-NEXT:    vpminud %ymm2, %ymm1, %ymm1
    945 ; AVX2-NEXT:    vpminud %ymm2, %ymm0, %ymm0
    946 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
    947 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
    948 ; AVX2-NEXT:    retq
    949 ;
    950 ; AVX512-LABEL: trunc_usat_v16i32_v16i16:
    951 ; AVX512:       # %bb.0:
    952 ; AVX512-NEXT:    vpmovusdw %zmm0, %ymm0
    953 ; AVX512-NEXT:    retq
    954   %1 = icmp ult <16 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
    955   %2 = select <16 x i1> %1, <16 x i32> %a0, <16 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
    956   %3 = trunc <16 x i32> %2 to <16 x i16>
    957   ret <16 x i16> %3
    958 }
    959 
    960 ;
    961 ; Unsigned saturation truncation to v16i8
    962 ;
    963 
    964 define <8 x i8> @trunc_usat_v8i64_v8i8(<8 x i64> %a0) {
    965 ; SSE2-LABEL: trunc_usat_v8i64_v8i8:
    966 ; SSE2:       # %bb.0:
    967 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
    968 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]
    969 ; SSE2-NEXT:    movdqa %xmm1, %xmm7
    970 ; SSE2-NEXT:    pxor %xmm5, %xmm7
    971 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
    972 ; SSE2-NEXT:    movdqa %xmm9, %xmm6
    973 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm6
    974 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
    975 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm7
    976 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
    977 ; SSE2-NEXT:    pand %xmm4, %xmm7
    978 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
    979 ; SSE2-NEXT:    por %xmm7, %xmm4
    980 ; SSE2-NEXT:    pand %xmm4, %xmm1
    981 ; SSE2-NEXT:    pandn %xmm8, %xmm4
    982 ; SSE2-NEXT:    por %xmm1, %xmm4
    983 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
    984 ; SSE2-NEXT:    pxor %xmm5, %xmm1
    985 ; SSE2-NEXT:    movdqa %xmm9, %xmm6
    986 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm6
    987 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
    988 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
    989 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
    990 ; SSE2-NEXT:    pand %xmm7, %xmm1
    991 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
    992 ; SSE2-NEXT:    por %xmm1, %xmm6
    993 ; SSE2-NEXT:    pand %xmm6, %xmm0
    994 ; SSE2-NEXT:    pandn %xmm8, %xmm6
    995 ; SSE2-NEXT:    por %xmm6, %xmm0
    996 ; SSE2-NEXT:    packuswb %xmm4, %xmm0
    997 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
    998 ; SSE2-NEXT:    pxor %xmm5, %xmm1
    999 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
   1000 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
   1001 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
   1002 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
   1003 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
   1004 ; SSE2-NEXT:    pand %xmm6, %xmm1
   1005 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
   1006 ; SSE2-NEXT:    por %xmm1, %xmm4
   1007 ; SSE2-NEXT:    pand %xmm4, %xmm3
   1008 ; SSE2-NEXT:    pandn %xmm8, %xmm4
   1009 ; SSE2-NEXT:    por %xmm3, %xmm4
   1010 ; SSE2-NEXT:    pxor %xmm2, %xmm5
   1011 ; SSE2-NEXT:    movdqa %xmm9, %xmm1
   1012 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm1
   1013 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]
   1014 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm5
   1015 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
   1016 ; SSE2-NEXT:    pand %xmm3, %xmm5
   1017 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
   1018 ; SSE2-NEXT:    por %xmm5, %xmm1
   1019 ; SSE2-NEXT:    pand %xmm1, %xmm2
   1020 ; SSE2-NEXT:    pandn %xmm8, %xmm1
   1021 ; SSE2-NEXT:    por %xmm2, %xmm1
   1022 ; SSE2-NEXT:    packuswb %xmm4, %xmm1
   1023 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
   1024 ; SSE2-NEXT:    retq
   1025 ;
   1026 ; SSSE3-LABEL: trunc_usat_v8i64_v8i8:
   1027 ; SSSE3:       # %bb.0:
   1028 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
   1029 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]
   1030 ; SSSE3-NEXT:    movdqa %xmm1, %xmm7
   1031 ; SSSE3-NEXT:    pxor %xmm5, %xmm7
   1032 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
   1033 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
   1034 ; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm6
   1035 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
   1036 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm7
   1037 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
   1038 ; SSSE3-NEXT:    pand %xmm4, %xmm7
   1039 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
   1040 ; SSSE3-NEXT:    por %xmm7, %xmm4
   1041 ; SSSE3-NEXT:    pand %xmm4, %xmm1
   1042 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
   1043 ; SSSE3-NEXT:    por %xmm1, %xmm4
   1044 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
   1045 ; SSSE3-NEXT:    pxor %xmm5, %xmm1
   1046 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
   1047 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm6
   1048 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
   1049 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
   1050 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
   1051 ; SSSE3-NEXT:    pand %xmm7, %xmm1
   1052 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
   1053 ; SSSE3-NEXT:    por %xmm1, %xmm6
   1054 ; SSSE3-NEXT:    pand %xmm6, %xmm0
   1055 ; SSSE3-NEXT:    pandn %xmm8, %xmm6
   1056 ; SSSE3-NEXT:    por %xmm6, %xmm0
   1057 ; SSSE3-NEXT:    packuswb %xmm4, %xmm0
   1058 ; SSSE3-NEXT:    movdqa %xmm3, %xmm1
   1059 ; SSSE3-NEXT:    pxor %xmm5, %xmm1
   1060 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
   1061 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
   1062 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
   1063 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
   1064 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
   1065 ; SSSE3-NEXT:    pand %xmm6, %xmm1
   1066 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
   1067 ; SSSE3-NEXT:    por %xmm1, %xmm4
   1068 ; SSSE3-NEXT:    pand %xmm4, %xmm3
   1069 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
   1070 ; SSSE3-NEXT:    por %xmm3, %xmm4
   1071 ; SSSE3-NEXT:    pxor %xmm2, %xmm5
   1072 ; SSSE3-NEXT:    movdqa %xmm9, %xmm1
   1073 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm1
   1074 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]
   1075 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm5
   1076 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
   1077 ; SSSE3-NEXT:    pand %xmm3, %xmm5
   1078 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
   1079 ; SSSE3-NEXT:    por %xmm5, %xmm1
   1080 ; SSSE3-NEXT:    pand %xmm1, %xmm2
   1081 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
   1082 ; SSSE3-NEXT:    por %xmm2, %xmm1
   1083 ; SSSE3-NEXT:    packuswb %xmm4, %xmm1
   1084 ; SSSE3-NEXT:    packuswb %xmm1, %xmm0
   1085 ; SSSE3-NEXT:    retq
   1086 ;
   1087 ; SSE41-LABEL: trunc_usat_v8i64_v8i8:
   1088 ; SSE41:       # %bb.0:
   1089 ; SSE41-NEXT:    movdqa %xmm0, %xmm8
   1090 ; SSE41-NEXT:    movapd {{.*#+}} xmm5 = [255,255]
   1091 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
   1092 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
   1093 ; SSE41-NEXT:    pxor %xmm6, %xmm0
   1094 ; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
   1095 ; SSE41-NEXT:    movdqa %xmm9, %xmm7
   1096 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
   1097 ; SSE41-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
   1098 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
   1099 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
   1100 ; SSE41-NEXT:    pand %xmm10, %xmm4
   1101 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
   1102 ; SSE41-NEXT:    por %xmm4, %xmm0
   1103 ; SSE41-NEXT:    movapd %xmm5, %xmm4
   1104 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
   1105 ; SSE41-NEXT:    movdqa %xmm8, %xmm0
   1106 ; SSE41-NEXT:    pxor %xmm6, %xmm0
   1107 ; SSE41-NEXT:    movdqa %xmm9, %xmm1
   1108 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
   1109 ; SSE41-NEXT:    pshufd {{.*#+}} xmm10 = xmm1[0,0,2,2]
   1110 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
   1111 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
   1112 ; SSE41-NEXT:    pand %xmm10, %xmm7
   1113 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
   1114 ; SSE41-NEXT:    por %xmm7, %xmm0
   1115 ; SSE41-NEXT:    movapd %xmm5, %xmm1
   1116 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm1
   1117 ; SSE41-NEXT:    packusdw %xmm4, %xmm1
   1118 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
   1119 ; SSE41-NEXT:    pxor %xmm6, %xmm0
   1120 ; SSE41-NEXT:    movdqa %xmm9, %xmm4
   1121 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
   1122 ; SSE41-NEXT:    pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2]
   1123 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
   1124 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
   1125 ; SSE41-NEXT:    pand %xmm8, %xmm7
   1126 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
   1127 ; SSE41-NEXT:    por %xmm7, %xmm0
   1128 ; SSE41-NEXT:    movapd %xmm5, %xmm4
   1129 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm4
   1130 ; SSE41-NEXT:    pxor %xmm2, %xmm6
   1131 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
   1132 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm0
   1133 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2]
   1134 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm6
   1135 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
   1136 ; SSE41-NEXT:    pand %xmm3, %xmm6
   1137 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
   1138 ; SSE41-NEXT:    por %xmm6, %xmm0
   1139 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
   1140 ; SSE41-NEXT:    packusdw %xmm4, %xmm5
   1141 ; SSE41-NEXT:    packusdw %xmm5, %xmm1
   1142 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
   1143 ; SSE41-NEXT:    retq
   1144 ;
   1145 ; AVX1-LABEL: trunc_usat_v8i64_v8i8:
   1146 ; AVX1:       # %bb.0:
   1147 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm2 = [255,255,255,255]
   1148 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
   1149 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
   1150 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
   1151 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [9223372036854776063,9223372036854776063]
   1152 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm5, %xmm3
   1153 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm6
   1154 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm5, %xmm6
   1155 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm6, %ymm3
   1156 ; AVX1-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
   1157 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
   1158 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
   1159 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm5, %xmm3
   1160 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm4
   1161 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
   1162 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
   1163 ; AVX1-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
   1164 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
   1165 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
   1166 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
   1167 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
   1168 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
   1169 ; AVX1-NEXT:    vzeroupper
   1170 ; AVX1-NEXT:    retq
   1171 ;
   1172 ; AVX2-LABEL: trunc_usat_v8i64_v8i8:
   1173 ; AVX2:       # %bb.0:
   1174 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [255,255,255,255]
   1175 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
   1176 ; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm4
   1177 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
   1178 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
   1179 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
   1180 ; AVX2-NEXT:    vpxor %ymm3, %ymm0, %ymm3
   1181 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm5, %ymm3
   1182 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
   1183 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
   1184 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
   1185 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1186 ; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
   1187 ; AVX2-NEXT:    vzeroupper
   1188 ; AVX2-NEXT:    retq
   1189 ;
   1190 ; AVX512-LABEL: trunc_usat_v8i64_v8i8:
   1191 ; AVX512:       # %bb.0:
   1192 ; AVX512-NEXT:    vpminuq {{.*}}(%rip){1to8}, %zmm0, %zmm0
   1193 ; AVX512-NEXT:    vpmovqw %zmm0, %xmm0
   1194 ; AVX512-NEXT:    vzeroupper
   1195 ; AVX512-NEXT:    retq
   1196   %1 = icmp ult <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
   1197   %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
   1198   %3 = trunc <8 x i64> %2 to <8 x i8>
   1199   ret <8 x i8> %3
   1200 }
   1201 
   1202 define void @trunc_usat_v8i64_v8i8_store(<8 x i64> %a0, <8 x i8> *%p1) {
   1203 ; SSE2-LABEL: trunc_usat_v8i64_v8i8_store:
   1204 ; SSE2:       # %bb.0:
   1205 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
   1206 ; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
   1207 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
   1208 ; SSE2-NEXT:    pxor %xmm6, %xmm5
   1209 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
   1210 ; SSE2-NEXT:    movdqa %xmm9, %xmm7
   1211 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
   1212 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
   1213 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm5
   1214 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
   1215 ; SSE2-NEXT:    pand %xmm10, %xmm4
   1216 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
   1217 ; SSE2-NEXT:    por %xmm4, %xmm5
   1218 ; SSE2-NEXT:    pand %xmm5, %xmm0
   1219 ; SSE2-NEXT:    pandn %xmm8, %xmm5
   1220 ; SSE2-NEXT:    por %xmm0, %xmm5
   1221 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
   1222 ; SSE2-NEXT:    pxor %xmm6, %xmm0
   1223 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
   1224 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
   1225 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
   1226 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
   1227 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
   1228 ; SSE2-NEXT:    pand %xmm10, %xmm7
   1229 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
   1230 ; SSE2-NEXT:    por %xmm7, %xmm0
   1231 ; SSE2-NEXT:    pand %xmm0, %xmm1
   1232 ; SSE2-NEXT:    pandn %xmm8, %xmm0
   1233 ; SSE2-NEXT:    por %xmm1, %xmm0
   1234 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
   1235 ; SSE2-NEXT:    pxor %xmm6, %xmm1
   1236 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
   1237 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
   1238 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
   1239 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
   1240 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
   1241 ; SSE2-NEXT:    pand %xmm10, %xmm7
   1242 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
   1243 ; SSE2-NEXT:    por %xmm7, %xmm1
   1244 ; SSE2-NEXT:    pand %xmm1, %xmm2
   1245 ; SSE2-NEXT:    pandn %xmm8, %xmm1
   1246 ; SSE2-NEXT:    por %xmm2, %xmm1
   1247 ; SSE2-NEXT:    pxor %xmm3, %xmm6
   1248 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
   1249 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm2
   1250 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
   1251 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm6
   1252 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
   1253 ; SSE2-NEXT:    pand %xmm4, %xmm6
   1254 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
   1255 ; SSE2-NEXT:    por %xmm6, %xmm2
   1256 ; SSE2-NEXT:    pand %xmm2, %xmm3
   1257 ; SSE2-NEXT:    pandn %xmm8, %xmm2
   1258 ; SSE2-NEXT:    por %xmm3, %xmm2
   1259 ; SSE2-NEXT:    pand %xmm8, %xmm2
   1260 ; SSE2-NEXT:    pand %xmm8, %xmm1
   1261 ; SSE2-NEXT:    packuswb %xmm2, %xmm1
   1262 ; SSE2-NEXT:    pand %xmm8, %xmm0
   1263 ; SSE2-NEXT:    pand %xmm8, %xmm5
   1264 ; SSE2-NEXT:    packuswb %xmm0, %xmm5
   1265 ; SSE2-NEXT:    packuswb %xmm1, %xmm5
   1266 ; SSE2-NEXT:    packuswb %xmm5, %xmm5
   1267 ; SSE2-NEXT:    movq %xmm5, (%rdi)
   1268 ; SSE2-NEXT:    retq
   1269 ;
   1270 ; SSSE3-LABEL: trunc_usat_v8i64_v8i8_store:
   1271 ; SSSE3:       # %bb.0:
   1272 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
   1273 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
   1274 ; SSSE3-NEXT:    movdqa %xmm0, %xmm5
   1275 ; SSSE3-NEXT:    pxor %xmm6, %xmm5
   1276 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
   1277 ; SSSE3-NEXT:    movdqa %xmm9, %xmm7
   1278 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm7
   1279 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
   1280 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm5
   1281 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
   1282 ; SSSE3-NEXT:    pand %xmm10, %xmm4
   1283 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
   1284 ; SSSE3-NEXT:    por %xmm4, %xmm5
   1285 ; SSSE3-NEXT:    pand %xmm5, %xmm0
   1286 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
   1287 ; SSSE3-NEXT:    por %xmm0, %xmm5
   1288 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
   1289 ; SSSE3-NEXT:    pxor %xmm6, %xmm0
   1290 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
   1291 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm4
   1292 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
   1293 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
   1294 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
   1295 ; SSSE3-NEXT:    pand %xmm10, %xmm7
   1296 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
   1297 ; SSSE3-NEXT:    por %xmm7, %xmm0
   1298 ; SSSE3-NEXT:    pand %xmm0, %xmm1
   1299 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
   1300 ; SSSE3-NEXT:    por %xmm1, %xmm0
   1301 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
   1302 ; SSSE3-NEXT:    pxor %xmm6, %xmm1
   1303 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
   1304 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
   1305 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
   1306 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
   1307 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
   1308 ; SSSE3-NEXT:    pand %xmm10, %xmm7
   1309 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
   1310 ; SSSE3-NEXT:    por %xmm7, %xmm1
   1311 ; SSSE3-NEXT:    pand %xmm1, %xmm2
   1312 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
   1313 ; SSSE3-NEXT:    por %xmm2, %xmm1
   1314 ; SSSE3-NEXT:    pxor %xmm3, %xmm6
   1315 ; SSSE3-NEXT:    movdqa %xmm9, %xmm2
   1316 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm2
   1317 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
   1318 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm6
   1319 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
   1320 ; SSSE3-NEXT:    pand %xmm4, %xmm6
   1321 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
   1322 ; SSSE3-NEXT:    por %xmm6, %xmm2
   1323 ; SSSE3-NEXT:    pand %xmm2, %xmm3
   1324 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
   1325 ; SSSE3-NEXT:    por %xmm3, %xmm2
   1326 ; SSSE3-NEXT:    pand %xmm8, %xmm2
   1327 ; SSSE3-NEXT:    pand %xmm8, %xmm1
   1328 ; SSSE3-NEXT:    packuswb %xmm2, %xmm1
   1329 ; SSSE3-NEXT:    pand %xmm8, %xmm0
   1330 ; SSSE3-NEXT:    pand %xmm8, %xmm5
   1331 ; SSSE3-NEXT:    packuswb %xmm0, %xmm5
   1332 ; SSSE3-NEXT:    packuswb %xmm1, %xmm5
   1333 ; SSSE3-NEXT:    packuswb %xmm5, %xmm5
   1334 ; SSSE3-NEXT:    movq %xmm5, (%rdi)
   1335 ; SSSE3-NEXT:    retq
   1336 ;
   1337 ; SSE41-LABEL: trunc_usat_v8i64_v8i8_store:
   1338 ; SSE41:       # %bb.0:
   1339 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
   1340 ; SSE41-NEXT:    movapd {{.*#+}} xmm8 = [255,255]
   1341 ; SSE41-NEXT:    movdqa {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648]
   1342 ; SSE41-NEXT:    pxor %xmm7, %xmm0
   1343 ; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
   1344 ; SSE41-NEXT:    movdqa %xmm9, %xmm6
   1345 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
   1346 ; SSE41-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
   1347 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
   1348 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
   1349 ; SSE41-NEXT:    pand %xmm10, %xmm5
   1350 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
   1351 ; SSE41-NEXT:    por %xmm5, %xmm0
   1352 ; SSE41-NEXT:    movapd %xmm8, %xmm6
   1353 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm6
   1354 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
   1355 ; SSE41-NEXT:    pxor %xmm7, %xmm0
   1356 ; SSE41-NEXT:    movdqa %xmm9, %xmm4
   1357 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
   1358 ; SSE41-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
   1359 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
   1360 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
   1361 ; SSE41-NEXT:    pand %xmm10, %xmm5
   1362 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
   1363 ; SSE41-NEXT:    por %xmm5, %xmm0
   1364 ; SSE41-NEXT:    movapd %xmm8, %xmm4
   1365 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
   1366 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
   1367 ; SSE41-NEXT:    pxor %xmm7, %xmm0
   1368 ; SSE41-NEXT:    movdqa %xmm9, %xmm1
   1369 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
   1370 ; SSE41-NEXT:    pshufd {{.*#+}} xmm10 = xmm1[0,0,2,2]
   1371 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
   1372 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
   1373 ; SSE41-NEXT:    pand %xmm10, %xmm5
   1374 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
   1375 ; SSE41-NEXT:    por %xmm5, %xmm0
   1376 ; SSE41-NEXT:    movapd %xmm8, %xmm1
   1377 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
   1378 ; SSE41-NEXT:    pxor %xmm3, %xmm7
   1379 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
   1380 ; SSE41-NEXT:    pcmpgtd %xmm7, %xmm0
   1381 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
   1382 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm7
   1383 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
   1384 ; SSE41-NEXT:    pand %xmm2, %xmm5
   1385 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
   1386 ; SSE41-NEXT:    por %xmm5, %xmm0
   1387 ; SSE41-NEXT:    movapd %xmm8, %xmm2
   1388 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
   1389 ; SSE41-NEXT:    andpd %xmm8, %xmm2
   1390 ; SSE41-NEXT:    andpd %xmm8, %xmm1
   1391 ; SSE41-NEXT:    packusdw %xmm2, %xmm1
   1392 ; SSE41-NEXT:    andpd %xmm8, %xmm4
   1393 ; SSE41-NEXT:    andpd %xmm8, %xmm6
   1394 ; SSE41-NEXT:    packusdw %xmm4, %xmm6
   1395 ; SSE41-NEXT:    packusdw %xmm1, %xmm6
   1396 ; SSE41-NEXT:    packuswb %xmm6, %xmm6
   1397 ; SSE41-NEXT:    movq %xmm6, (%rdi)
   1398 ; SSE41-NEXT:    retq
   1399 ;
   1400 ; AVX1-LABEL: trunc_usat_v8i64_v8i8_store:
   1401 ; AVX1:       # %bb.0:
   1402 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm2 = [255,255,255,255]
   1403 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
   1404 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
   1405 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
   1406 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [9223372036854776063,9223372036854776063]
   1407 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm5, %xmm3
   1408 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm6
   1409 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm5, %xmm6
   1410 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm6, %ymm3
   1411 ; AVX1-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
   1412 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
   1413 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
   1414 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm5, %xmm3
   1415 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm4
   1416 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
   1417 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
   1418 ; AVX1-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
   1419 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
   1420 ; AVX1-NEXT:    vmovapd {{.*#+}} xmm3 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
   1421 ; AVX1-NEXT:    vandpd %xmm3, %xmm2, %xmm2
   1422 ; AVX1-NEXT:    vandpd %xmm3, %xmm1, %xmm1
   1423 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
   1424 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
   1425 ; AVX1-NEXT:    vandpd %xmm3, %xmm2, %xmm2
   1426 ; AVX1-NEXT:    vandpd %xmm3, %xmm0, %xmm0
   1427 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
   1428 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
   1429 ; AVX1-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
   1430 ; AVX1-NEXT:    vmovq %xmm0, (%rdi)
   1431 ; AVX1-NEXT:    vzeroupper
   1432 ; AVX1-NEXT:    retq
   1433 ;
   1434 ; AVX2-LABEL: trunc_usat_v8i64_v8i8_store:
   1435 ; AVX2:       # %bb.0:
   1436 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [255,255,255,255]
   1437 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
   1438 ; AVX2-NEXT:    vpxor %ymm3, %ymm0, %ymm4
   1439 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
   1440 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
   1441 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm0, %ymm2, %ymm0
   1442 ; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm3
   1443 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm5, %ymm3
   1444 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
   1445 ; AVX2-NEXT:    vextractf128 $1, %ymm1, %xmm2
   1446 ; AVX2-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
   1447 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
   1448 ; AVX2-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
   1449 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm3
   1450 ; AVX2-NEXT:    vpackusdw %xmm3, %xmm0, %xmm0
   1451 ; AVX2-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
   1452 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
   1453 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
   1454 ; AVX2-NEXT:    vmovq %xmm0, (%rdi)
   1455 ; AVX2-NEXT:    vzeroupper
   1456 ; AVX2-NEXT:    retq
   1457 ;
   1458 ; AVX512-LABEL: trunc_usat_v8i64_v8i8_store:
   1459 ; AVX512:       # %bb.0:
   1460 ; AVX512-NEXT:    vpmovusqb %zmm0, (%rdi)
   1461 ; AVX512-NEXT:    vzeroupper
   1462 ; AVX512-NEXT:    retq
   1463   %1 = icmp ult <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
   1464   %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
   1465   %3 = trunc <8 x i64> %2 to <8 x i8>
   1466   store <8 x i8> %3, <8 x i8> *%p1
   1467   ret void
   1468 }
   1469 
   1470 define <16 x i8> @trunc_usat_v16i64_v16i8(<16 x i64> %a0) {
   1471 ; SSE2-LABEL: trunc_usat_v16i64_v16i8:
   1472 ; SSE2:       # %bb.0:
   1473 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
   1474 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648,2147483648,2147483648]
   1475 ; SSE2-NEXT:    movdqa %xmm1, %xmm11
   1476 ; SSE2-NEXT:    pxor %xmm9, %xmm11
   1477 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [9223372039002259711,9223372039002259711]
   1478 ; SSE2-NEXT:    movdqa %xmm10, %xmm12
   1479 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm12
   1480 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
   1481 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm11
   1482 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3]
   1483 ; SSE2-NEXT:    pand %xmm13, %xmm11
   1484 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3]
   1485 ; SSE2-NEXT:    por %xmm11, %xmm12
   1486 ; SSE2-NEXT:    pand %xmm12, %xmm1
   1487 ; SSE2-NEXT:    pandn %xmm8, %xmm12
   1488 ; SSE2-NEXT:    por %xmm1, %xmm12
   1489 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
   1490 ; SSE2-NEXT:    pxor %xmm9, %xmm1
   1491 ; SSE2-NEXT:    movdqa %xmm10, %xmm11
   1492 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm11
   1493 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm11[0,0,2,2]
   1494 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
   1495 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm1[1,1,3,3]
   1496 ; SSE2-NEXT:    pand %xmm13, %xmm14
   1497 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3]
   1498 ; SSE2-NEXT:    por %xmm14, %xmm1
   1499 ; SSE2-NEXT:    pand %xmm1, %xmm0
   1500 ; SSE2-NEXT:    pandn %xmm8, %xmm1
   1501 ; SSE2-NEXT:    por %xmm1, %xmm0
   1502 ; SSE2-NEXT:    packuswb %xmm12, %xmm0
   1503 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
   1504 ; SSE2-NEXT:    pxor %xmm9, %xmm1
   1505 ; SSE2-NEXT:    movdqa %xmm10, %xmm11
   1506 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm11
   1507 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
   1508 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
   1509 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm1[1,1,3,3]
   1510 ; SSE2-NEXT:    pand %xmm12, %xmm13
   1511 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3]
   1512 ; SSE2-NEXT:    por %xmm13, %xmm1
   1513 ; SSE2-NEXT:    pand %xmm1, %xmm3
   1514 ; SSE2-NEXT:    pandn %xmm8, %xmm1
   1515 ; SSE2-NEXT:    por %xmm3, %xmm1
   1516 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
   1517 ; SSE2-NEXT:    pxor %xmm9, %xmm3
   1518 ; SSE2-NEXT:    movdqa %xmm10, %xmm11
   1519 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm11
   1520 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
   1521 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm3
   1522 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm3[1,1,3,3]
   1523 ; SSE2-NEXT:    pand %xmm12, %xmm13
   1524 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm11[1,1,3,3]
   1525 ; SSE2-NEXT:    por %xmm13, %xmm3
   1526 ; SSE2-NEXT:    pand %xmm3, %xmm2
   1527 ; SSE2-NEXT:    pandn %xmm8, %xmm3
   1528 ; SSE2-NEXT:    por %xmm2, %xmm3
   1529 ; SSE2-NEXT:    packuswb %xmm1, %xmm3
   1530 ; SSE2-NEXT:    packuswb %xmm3, %xmm0
   1531 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
   1532 ; SSE2-NEXT:    pxor %xmm9, %xmm1
   1533 ; SSE2-NEXT:    movdqa %xmm10, %xmm2
   1534 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
   1535 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
   1536 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
   1537 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
   1538 ; SSE2-NEXT:    pand %xmm3, %xmm1
   1539 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
   1540 ; SSE2-NEXT:    por %xmm1, %xmm2
   1541 ; SSE2-NEXT:    pand %xmm2, %xmm5
   1542 ; SSE2-NEXT:    pandn %xmm8, %xmm2
   1543 ; SSE2-NEXT:    por %xmm5, %xmm2
   1544 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
   1545 ; SSE2-NEXT:    pxor %xmm9, %xmm1
   1546 ; SSE2-NEXT:    movdqa %xmm10, %xmm3
   1547 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
   1548 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm3[0,0,2,2]
   1549 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
   1550 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
   1551 ; SSE2-NEXT:    pand %xmm11, %xmm5
   1552 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
   1553 ; SSE2-NEXT:    por %xmm5, %xmm1
   1554 ; SSE2-NEXT:    pand %xmm1, %xmm4
   1555 ; SSE2-NEXT:    pandn %xmm8, %xmm1
   1556 ; SSE2-NEXT:    por %xmm4, %xmm1
   1557 ; SSE2-NEXT:    packuswb %xmm2, %xmm1
   1558 ; SSE2-NEXT:    movdqa %xmm7, %xmm2
   1559 ; SSE2-NEXT:    pxor %xmm9, %xmm2
   1560 ; SSE2-NEXT:    movdqa %xmm10, %xmm3
   1561 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
   1562 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
   1563 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm2
   1564 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
   1565 ; SSE2-NEXT:    pand %xmm4, %xmm2
   1566 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
   1567 ; SSE2-NEXT:    por %xmm2, %xmm3
   1568 ; SSE2-NEXT:    pand %xmm3, %xmm7
   1569 ; SSE2-NEXT:    pandn %xmm8, %xmm3
   1570 ; SSE2-NEXT:    por %xmm7, %xmm3
   1571 ; SSE2-NEXT:    pxor %xmm6, %xmm9
   1572 ; SSE2-NEXT:    movdqa %xmm10, %xmm2
   1573 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm2
   1574 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
   1575 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm9
   1576 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm9[1,1,3,3]
   1577 ; SSE2-NEXT:    pand %xmm4, %xmm5
   1578 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
   1579 ; SSE2-NEXT:    por %xmm5, %xmm2
   1580 ; SSE2-NEXT:    pand %xmm2, %xmm6
   1581 ; SSE2-NEXT:    pandn %xmm8, %xmm2
   1582 ; SSE2-NEXT:    por %xmm6, %xmm2
   1583 ; SSE2-NEXT:    packuswb %xmm3, %xmm2
   1584 ; SSE2-NEXT:    packuswb %xmm2, %xmm1
   1585 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
   1586 ; SSE2-NEXT:    retq
   1587 ;
   1588 ; SSSE3-LABEL: trunc_usat_v16i64_v16i8:
   1589 ; SSSE3:       # %bb.0:
   1590 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
   1591 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648,2147483648,2147483648]
   1592 ; SSSE3-NEXT:    movdqa %xmm1, %xmm11
   1593 ; SSSE3-NEXT:    pxor %xmm9, %xmm11
   1594 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [9223372039002259711,9223372039002259711]
   1595 ; SSSE3-NEXT:    movdqa %xmm10, %xmm12
   1596 ; SSSE3-NEXT:    pcmpgtd %xmm11, %xmm12
   1597 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
   1598 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm11
   1599 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3]
   1600 ; SSSE3-NEXT:    pand %xmm13, %xmm11
   1601 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3]
   1602 ; SSSE3-NEXT:    por %xmm11, %xmm12
   1603 ; SSSE3-NEXT:    pand %xmm12, %xmm1
   1604 ; SSSE3-NEXT:    pandn %xmm8, %xmm12
   1605 ; SSSE3-NEXT:    por %xmm1, %xmm12
   1606 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
   1607 ; SSSE3-NEXT:    pxor %xmm9, %xmm1
   1608 ; SSSE3-NEXT:    movdqa %xmm10, %xmm11
   1609 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm11
   1610 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm11[0,0,2,2]
   1611 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm1
   1612 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm14 = xmm1[1,1,3,3]
   1613 ; SSSE3-NEXT:    pand %xmm13, %xmm14
   1614 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3]
   1615 ; SSSE3-NEXT:    por %xmm14, %xmm1
   1616 ; SSSE3-NEXT:    pand %xmm1, %xmm0
   1617 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
   1618 ; SSSE3-NEXT:    por %xmm1, %xmm0
   1619 ; SSSE3-NEXT:    packuswb %xmm12, %xmm0
   1620 ; SSSE3-NEXT:    movdqa %xmm3, %xmm1
   1621 ; SSSE3-NEXT:    pxor %xmm9, %xmm1
   1622 ; SSSE3-NEXT:    movdqa %xmm10, %xmm11
   1623 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm11
   1624 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
   1625 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm1
   1626 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm1[1,1,3,3]
   1627 ; SSSE3-NEXT:    pand %xmm12, %xmm13
   1628 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3]
   1629 ; SSSE3-NEXT:    por %xmm13, %xmm1
   1630 ; SSSE3-NEXT:    pand %xmm1, %xmm3
   1631 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
   1632 ; SSSE3-NEXT:    por %xmm3, %xmm1
   1633 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
   1634 ; SSSE3-NEXT:    pxor %xmm9, %xmm3
   1635 ; SSSE3-NEXT:    movdqa %xmm10, %xmm11
   1636 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm11
   1637 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
   1638 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm3
   1639 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm3[1,1,3,3]
   1640 ; SSSE3-NEXT:    pand %xmm12, %xmm13
   1641 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm11[1,1,3,3]
   1642 ; SSSE3-NEXT:    por %xmm13, %xmm3
   1643 ; SSSE3-NEXT:    pand %xmm3, %xmm2
   1644 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
   1645 ; SSSE3-NEXT:    por %xmm2, %xmm3
   1646 ; SSSE3-NEXT:    packuswb %xmm1, %xmm3
   1647 ; SSSE3-NEXT:    packuswb %xmm3, %xmm0
   1648 ; SSSE3-NEXT:    movdqa %xmm5, %xmm1
   1649 ; SSSE3-NEXT:    pxor %xmm9, %xmm1
   1650 ; SSSE3-NEXT:    movdqa %xmm10, %xmm2
   1651 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
   1652 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
   1653 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm1
   1654 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
   1655 ; SSSE3-NEXT:    pand %xmm3, %xmm1
   1656 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
   1657 ; SSSE3-NEXT:    por %xmm1, %xmm2
   1658 ; SSSE3-NEXT:    pand %xmm2, %xmm5
   1659 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
   1660 ; SSSE3-NEXT:    por %xmm5, %xmm2
   1661 ; SSSE3-NEXT:    movdqa %xmm4, %xmm1
   1662 ; SSSE3-NEXT:    pxor %xmm9, %xmm1
   1663 ; SSSE3-NEXT:    movdqa %xmm10, %xmm3
   1664 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
   1665 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm3[0,0,2,2]
   1666 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm1
   1667 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
   1668 ; SSSE3-NEXT:    pand %xmm11, %xmm5
   1669 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
   1670 ; SSSE3-NEXT:    por %xmm5, %xmm1
   1671 ; SSSE3-NEXT:    pand %xmm1, %xmm4
   1672 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
   1673 ; SSSE3-NEXT:    por %xmm4, %xmm1
   1674 ; SSSE3-NEXT:    packuswb %xmm2, %xmm1
   1675 ; SSSE3-NEXT:    movdqa %xmm7, %xmm2
   1676 ; SSSE3-NEXT:    pxor %xmm9, %xmm2
   1677 ; SSSE3-NEXT:    movdqa %xmm10, %xmm3
   1678 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
   1679 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
   1680 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm2
   1681 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
   1682 ; SSSE3-NEXT:    pand %xmm4, %xmm2
   1683 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
   1684 ; SSSE3-NEXT:    por %xmm2, %xmm3
   1685 ; SSSE3-NEXT:    pand %xmm3, %xmm7
   1686 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
   1687 ; SSSE3-NEXT:    por %xmm7, %xmm3
   1688 ; SSSE3-NEXT:    pxor %xmm6, %xmm9
   1689 ; SSSE3-NEXT:    movdqa %xmm10, %xmm2
   1690 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm2
   1691 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
   1692 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm9
   1693 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm9[1,1,3,3]
   1694 ; SSSE3-NEXT:    pand %xmm4, %xmm5
   1695 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
   1696 ; SSSE3-NEXT:    por %xmm5, %xmm2
   1697 ; SSSE3-NEXT:    pand %xmm2, %xmm6
   1698 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
   1699 ; SSSE3-NEXT:    por %xmm6, %xmm2
   1700 ; SSSE3-NEXT:    packuswb %xmm3, %xmm2
   1701 ; SSSE3-NEXT:    packuswb %xmm2, %xmm1
   1702 ; SSSE3-NEXT:    packuswb %xmm1, %xmm0
   1703 ; SSSE3-NEXT:    retq
   1704 ;
   1705 ; SSE41-LABEL: trunc_usat_v16i64_v16i8:
   1706 ; SSE41:       # %bb.0:
   1707 ; SSE41-NEXT:    movdqa %xmm0, %xmm8
   1708 ; SSE41-NEXT:    movapd {{.*#+}} xmm9 = [255,255]
   1709 ; SSE41-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,2147483648,2147483648,2147483648]
   1710 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
   1711 ; SSE41-NEXT:    pxor %xmm10, %xmm0
   1712 ; SSE41-NEXT:    movdqa {{.*#+}} xmm11 = [9223372039002259711,9223372039002259711]
   1713 ; SSE41-NEXT:    movdqa %xmm11, %xmm12
   1714 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm12
   1715 ; SSE41-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
   1716 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
   1717 ; SSE41-NEXT:    pshufd {{.*#+}} xmm14 = xmm0[1,1,3,3]
   1718 ; SSE41-NEXT:    pand %xmm13, %xmm14
   1719 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm12[1,1,3,3]
   1720 ; SSE41-NEXT:    por %xmm14, %xmm0
   1721 ; SSE41-NEXT:    movapd %xmm9, %xmm12
   1722 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm12
   1723 ; SSE41-NEXT:    movdqa %xmm8, %xmm0
   1724 ; SSE41-NEXT:    pxor %xmm10, %xmm0
   1725 ; SSE41-NEXT:    movdqa %xmm11, %xmm1
   1726 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
   1727 ; SSE41-NEXT:    pshufd {{.*#+}} xmm13 = xmm1[0,0,2,2]
   1728 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
   1729 ; SSE41-NEXT:    pshufd {{.*#+}} xmm14 = xmm0[1,1,3,3]
   1730 ; SSE41-NEXT:    pand %xmm13, %xmm14
   1731 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
   1732 ; SSE41-NEXT:    por %xmm14, %xmm0
   1733 ; SSE41-NEXT:    movapd %xmm9, %xmm13
   1734 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm13
   1735 ; SSE41-NEXT:    packusdw %xmm12, %xmm13
   1736 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
   1737 ; SSE41-NEXT:    pxor %xmm10, %xmm0
   1738 ; SSE41-NEXT:    movdqa %xmm11, %xmm1
   1739 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
   1740 ; SSE41-NEXT:    pshufd {{.*#+}} xmm8 = xmm1[0,0,2,2]
   1741 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
   1742 ; SSE41-NEXT:    pshufd {{.*#+}} xmm12 = xmm0[1,1,3,3]
   1743 ; SSE41-NEXT:    pand %xmm8, %xmm12
   1744 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
   1745 ; SSE41-NEXT:    por %xmm12, %xmm0
   1746 ; SSE41-NEXT:    movapd %xmm9, %xmm12
   1747 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm12
   1748 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
   1749 ; SSE41-NEXT:    pxor %xmm10, %xmm0
   1750 ; SSE41-NEXT:    movdqa %xmm11, %xmm3
   1751 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
   1752 ; SSE41-NEXT:    pshufd {{.*#+}} xmm8 = xmm3[0,0,2,2]
   1753 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
   1754 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
   1755 ; SSE41-NEXT:    pand %xmm8, %xmm1
   1756 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
   1757 ; SSE41-NEXT:    por %xmm1, %xmm0
   1758 ; SSE41-NEXT:    movapd %xmm9, %xmm1
   1759 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
   1760 ; SSE41-NEXT:    packusdw %xmm12, %xmm1
   1761 ; SSE41-NEXT:    packusdw %xmm1, %xmm13
   1762 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
   1763 ; SSE41-NEXT:    pxor %xmm10, %xmm0
   1764 ; SSE41-NEXT:    movdqa %xmm11, %xmm1
   1765 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
   1766 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
   1767 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
   1768 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
   1769 ; SSE41-NEXT:    pand %xmm2, %xmm3
   1770 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
   1771 ; SSE41-NEXT:    por %xmm3, %xmm0
   1772 ; SSE41-NEXT:    movapd %xmm9, %xmm1
   1773 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
   1774 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
   1775 ; SSE41-NEXT:    pxor %xmm10, %xmm0
   1776 ; SSE41-NEXT:    movdqa %xmm11, %xmm2
   1777 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
   1778 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
   1779 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
   1780 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
   1781 ; SSE41-NEXT:    pand %xmm3, %xmm5
   1782 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
   1783 ; SSE41-NEXT:    por %xmm5, %xmm0
   1784 ; SSE41-NEXT:    movapd %xmm9, %xmm2
   1785 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
   1786 ; SSE41-NEXT:    packusdw %xmm1, %xmm2
   1787 ; SSE41-NEXT:    movdqa %xmm7, %xmm0
   1788 ; SSE41-NEXT:    pxor %xmm10, %xmm0
   1789 ; SSE41-NEXT:    movdqa %xmm11, %xmm1
   1790 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
   1791 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]
   1792 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
   1793 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
   1794 ; SSE41-NEXT:    pand %xmm3, %xmm4
   1795 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
   1796 ; SSE41-NEXT:    por %xmm4, %xmm0
   1797 ; SSE41-NEXT:    movapd %xmm9, %xmm1
   1798 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
   1799 ; SSE41-NEXT:    pxor %xmm6, %xmm10
   1800 ; SSE41-NEXT:    movdqa %xmm11, %xmm0
   1801 ; SSE41-NEXT:    pcmpgtd %xmm10, %xmm0
   1802 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2]
   1803 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm10
   1804 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm10[1,1,3,3]
   1805 ; SSE41-NEXT:    pand %xmm3, %xmm4
   1806 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
   1807 ; SSE41-NEXT:    por %xmm4, %xmm0
   1808 ; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm9
   1809 ; SSE41-NEXT:    packusdw %xmm1, %xmm9
   1810 ; SSE41-NEXT:    packusdw %xmm9, %xmm2
   1811 ; SSE41-NEXT:    packuswb %xmm2, %xmm13
   1812 ; SSE41-NEXT:    movdqa %xmm13, %xmm0
   1813 ; SSE41-NEXT:    retq
   1814 ;
   1815 ; AVX1-LABEL: trunc_usat_v16i64_v16i8:
   1816 ; AVX1:       # %bb.0:
   1817 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm8 = [255,255,255,255]
   1818 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
   1819 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [9223372036854775808,9223372036854775808]
   1820 ; AVX1-NEXT:    vpxor %xmm6, %xmm5, %xmm5
   1821 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [9223372036854776063,9223372036854776063]
   1822 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm7, %xmm5
   1823 ; AVX1-NEXT:    vpxor %xmm6, %xmm0, %xmm4
   1824 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm7, %xmm4
   1825 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm4, %ymm4
   1826 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm0, %ymm8, %ymm0
   1827 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
   1828 ; AVX1-NEXT:    vpxor %xmm6, %xmm4, %xmm4
   1829 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm7, %xmm4
   1830 ; AVX1-NEXT:    vpxor %xmm6, %xmm1, %xmm5
   1831 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm7, %xmm5
   1832 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm5, %ymm4
   1833 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm1, %ymm8, %ymm1
   1834 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
   1835 ; AVX1-NEXT:    vpxor %xmm6, %xmm4, %xmm4
   1836 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm7, %xmm4
   1837 ; AVX1-NEXT:    vpxor %xmm6, %xmm2, %xmm5
   1838 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm7, %xmm5
   1839 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm5, %ymm4
   1840 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm2, %ymm8, %ymm2
   1841 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
   1842 ; AVX1-NEXT:    vpxor %xmm6, %xmm4, %xmm4
   1843 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm7, %xmm4
   1844 ; AVX1-NEXT:    vpxor %xmm6, %xmm3, %xmm5
   1845 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm7, %xmm5
   1846 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm5, %ymm4
   1847 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm3, %ymm8, %ymm3
   1848 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
   1849 ; AVX1-NEXT:    vpackusdw %xmm4, %xmm3, %xmm3
   1850 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
   1851 ; AVX1-NEXT:    vpackusdw %xmm4, %xmm2, %xmm2
   1852 ; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
   1853 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
   1854 ; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
   1855 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
   1856 ; AVX1-NEXT:    vpackusdw %xmm3, %xmm0, %xmm0
   1857 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
   1858 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
   1859 ; AVX1-NEXT:    vzeroupper
   1860 ; AVX1-NEXT:    retq
   1861 ;
   1862 ; AVX2-LABEL: trunc_usat_v16i64_v16i8:
   1863 ; AVX2:       # %bb.0:
   1864 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm4 = [255,255,255,255]
   1865 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
   1866 ; AVX2-NEXT:    vpxor %ymm5, %ymm1, %ymm6
   1867 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm7 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
   1868 ; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm7, %ymm6
   1869 ; AVX2-NEXT:    vblendvpd %ymm6, %ymm1, %ymm4, %ymm1
   1870 ; AVX2-NEXT:    vpxor %ymm5, %ymm0, %ymm6
   1871 ; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm7, %ymm6
   1872 ; AVX2-NEXT:    vblendvpd %ymm6, %ymm0, %ymm4, %ymm0
   1873 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
   1874 ; AVX2-NEXT:    vpxor %ymm5, %ymm3, %ymm1
   1875 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm7, %ymm1
   1876 ; AVX2-NEXT:    vblendvpd %ymm1, %ymm3, %ymm4, %ymm1
   1877 ; AVX2-NEXT:    vpxor %ymm5, %ymm2, %ymm3
   1878 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm7, %ymm3
   1879 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm2, %ymm4, %ymm2
   1880 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm2, %ymm1
   1881 ; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
   1882 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
   1883 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
   1884 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
   1885 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1886 ; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
   1887 ; AVX2-NEXT:    vzeroupper
   1888 ; AVX2-NEXT:    retq
   1889 ;
   1890 ; AVX512-LABEL: trunc_usat_v16i64_v16i8:
   1891 ; AVX512:       # %bb.0:
   1892 ; AVX512-NEXT:    vpbroadcastq {{.*#+}} zmm2 = [255,255,255,255,255,255,255,255]
   1893 ; AVX512-NEXT:    vpminuq %zmm2, %zmm1, %zmm1
   1894 ; AVX512-NEXT:    vpminuq %zmm2, %zmm0, %zmm0
   1895 ; AVX512-NEXT:    vpmovqd %zmm0, %ymm0
   1896 ; AVX512-NEXT:    vpmovqd %zmm1, %ymm1
   1897 ; AVX512-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
   1898 ; AVX512-NEXT:    vpmovdb %zmm0, %xmm0
   1899 ; AVX512-NEXT:    vzeroupper
   1900 ; AVX512-NEXT:    retq
   1901   %1 = icmp ult <16 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
   1902   %2 = select <16 x i1> %1, <16 x i64> %a0, <16 x i64> <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
   1903   %3 = trunc <16 x i64> %2 to <16 x i8>
   1904   ret <16 x i8> %3
   1905 }
   1906 
   1907 define <8 x i8> @trunc_usat_v8i32_v8i8(<8 x i32> %a0) {
   1908 ; SSE2-LABEL: trunc_usat_v8i32_v8i8:
   1909 ; SSE2:       # %bb.0:
   1910 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
   1911 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
   1912 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
   1913 ; SSE2-NEXT:    pxor %xmm3, %xmm4
   1914 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
   1915 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
   1916 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
   1917 ; SSE2-NEXT:    pand %xmm6, %xmm1
   1918 ; SSE2-NEXT:    pandn %xmm2, %xmm6
   1919 ; SSE2-NEXT:    por %xmm1, %xmm6
   1920 ; SSE2-NEXT:    pxor %xmm0, %xmm3
   1921 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
   1922 ; SSE2-NEXT:    pand %xmm5, %xmm0
   1923 ; SSE2-NEXT:    pandn %xmm2, %xmm5
   1924 ; SSE2-NEXT:    por %xmm5, %xmm0
   1925 ; SSE2-NEXT:    packuswb %xmm6, %xmm0
   1926 ; SSE2-NEXT:    retq
   1927 ;
   1928 ; SSSE3-LABEL: trunc_usat_v8i32_v8i8:
   1929 ; SSSE3:       # %bb.0:
   1930 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
   1931 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
   1932 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
   1933 ; SSSE3-NEXT:    pxor %xmm3, %xmm4
   1934 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
   1935 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
   1936 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
   1937 ; SSSE3-NEXT:    pand %xmm6, %xmm1
   1938 ; SSSE3-NEXT:    pandn %xmm2, %xmm6
   1939 ; SSSE3-NEXT:    por %xmm1, %xmm6
   1940 ; SSSE3-NEXT:    pxor %xmm0, %xmm3
   1941 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
   1942 ; SSSE3-NEXT:    pand %xmm5, %xmm0
   1943 ; SSSE3-NEXT:    pandn %xmm2, %xmm5
   1944 ; SSSE3-NEXT:    por %xmm5, %xmm0
   1945 ; SSSE3-NEXT:    packuswb %xmm6, %xmm0
   1946 ; SSSE3-NEXT:    retq
   1947 ;
   1948 ; SSE41-LABEL: trunc_usat_v8i32_v8i8:
   1949 ; SSE41:       # %bb.0:
   1950 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
   1951 ; SSE41-NEXT:    pminud %xmm2, %xmm1
   1952 ; SSE41-NEXT:    pminud %xmm2, %xmm0
   1953 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
   1954 ; SSE41-NEXT:    retq
   1955 ;
   1956 ; AVX1-LABEL: trunc_usat_v8i32_v8i8:
   1957 ; AVX1:       # %bb.0:
   1958 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
   1959 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,255,255,255]
   1960 ; AVX1-NEXT:    vpminud %xmm2, %xmm1, %xmm1
   1961 ; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
   1962 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
   1963 ; AVX1-NEXT:    vzeroupper
   1964 ; AVX1-NEXT:    retq
   1965 ;
   1966 ; AVX2-LABEL: trunc_usat_v8i32_v8i8:
   1967 ; AVX2:       # %bb.0:
   1968 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
   1969 ; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
   1970 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1971 ; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
   1972 ; AVX2-NEXT:    vzeroupper
   1973 ; AVX2-NEXT:    retq
   1974 ;
   1975 ; AVX512F-LABEL: trunc_usat_v8i32_v8i8:
   1976 ; AVX512F:       # %bb.0:
   1977 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
   1978 ; AVX512F-NEXT:    vpminud %ymm1, %ymm0, %ymm0
   1979 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
   1980 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
   1981 ; AVX512F-NEXT:    vzeroupper
   1982 ; AVX512F-NEXT:    retq
   1983 ;
   1984 ; AVX512VL-LABEL: trunc_usat_v8i32_v8i8:
   1985 ; AVX512VL:       # %bb.0:
   1986 ; AVX512VL-NEXT:    vpminud {{.*}}(%rip){1to8}, %ymm0, %ymm0
   1987 ; AVX512VL-NEXT:    vpmovdw %ymm0, %xmm0
   1988 ; AVX512VL-NEXT:    vzeroupper
   1989 ; AVX512VL-NEXT:    retq
   1990 ;
   1991 ; AVX512BW-LABEL: trunc_usat_v8i32_v8i8:
   1992 ; AVX512BW:       # %bb.0:
   1993 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
   1994 ; AVX512BW-NEXT:    vpminud %ymm1, %ymm0, %ymm0
   1995 ; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0
   1996 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
   1997 ; AVX512BW-NEXT:    vzeroupper
   1998 ; AVX512BW-NEXT:    retq
   1999 ;
   2000 ; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i8:
   2001 ; AVX512BWVL:       # %bb.0:
   2002 ; AVX512BWVL-NEXT:    vpminud {{.*}}(%rip){1to8}, %ymm0, %ymm0
   2003 ; AVX512BWVL-NEXT:    vpmovdw %ymm0, %xmm0
   2004 ; AVX512BWVL-NEXT:    vzeroupper
   2005 ; AVX512BWVL-NEXT:    retq
   2006   %1 = icmp ult <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
   2007   %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
   2008   %3 = trunc <8 x i32> %2 to <8 x i8>
   2009   ret <8 x i8> %3
   2010 }
   2011 
   2012 define void @trunc_usat_v8i32_v8i8_store(<8 x i32> %a0, <8 x i8> *%p1) {
   2013 ; SSE2-LABEL: trunc_usat_v8i32_v8i8_store:
   2014 ; SSE2:       # %bb.0:
   2015 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
   2016 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
   2017 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
   2018 ; SSE2-NEXT:    pxor %xmm3, %xmm4
   2019 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
   2020 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
   2021 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
   2022 ; SSE2-NEXT:    pand %xmm6, %xmm0
   2023 ; SSE2-NEXT:    pandn %xmm2, %xmm6
   2024 ; SSE2-NEXT:    por %xmm0, %xmm6
   2025 ; SSE2-NEXT:    pxor %xmm1, %xmm3
   2026 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
   2027 ; SSE2-NEXT:    pand %xmm5, %xmm1
   2028 ; SSE2-NEXT:    pandn %xmm2, %xmm5
   2029 ; SSE2-NEXT:    por %xmm1, %xmm5
   2030 ; SSE2-NEXT:    pand %xmm2, %xmm5
   2031 ; SSE2-NEXT:    pand %xmm2, %xmm6
   2032 ; SSE2-NEXT:    packuswb %xmm5, %xmm6
   2033 ; SSE2-NEXT:    packuswb %xmm6, %xmm6
   2034 ; SSE2-NEXT:    movq %xmm6, (%rdi)
   2035 ; SSE2-NEXT:    retq
   2036 ;
   2037 ; SSSE3-LABEL: trunc_usat_v8i32_v8i8_store:
   2038 ; SSSE3:       # %bb.0:
   2039 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
   2040 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
   2041 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
   2042 ; SSSE3-NEXT:    pxor %xmm3, %xmm4
   2043 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
   2044 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
   2045 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
   2046 ; SSSE3-NEXT:    pand %xmm6, %xmm0
   2047 ; SSSE3-NEXT:    pandn %xmm2, %xmm6
   2048 ; SSSE3-NEXT:    por %xmm0, %xmm6
   2049 ; SSSE3-NEXT:    pxor %xmm1, %xmm3
   2050 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
   2051 ; SSSE3-NEXT:    pand %xmm5, %xmm1
   2052 ; SSSE3-NEXT:    pandn %xmm2, %xmm5
   2053 ; SSSE3-NEXT:    por %xmm1, %xmm5
   2054 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
   2055 ; SSSE3-NEXT:    pshufb %xmm0, %xmm5
   2056 ; SSSE3-NEXT:    pshufb %xmm0, %xmm6
   2057 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm6 = xmm6[0],xmm5[0]
   2058 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm6 = xmm6[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
   2059 ; SSSE3-NEXT:    movq %xmm6, (%rdi)
   2060 ; SSSE3-NEXT:    retq
   2061 ;
   2062 ; SSE41-LABEL: trunc_usat_v8i32_v8i8_store:
   2063 ; SSE41:       # %bb.0:
   2064 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
   2065 ; SSE41-NEXT:    pminud %xmm2, %xmm1
   2066 ; SSE41-NEXT:    pminud %xmm2, %xmm0
   2067 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
   2068 ; SSE41-NEXT:    packuswb %xmm0, %xmm0
   2069 ; SSE41-NEXT:    movq %xmm0, (%rdi)
   2070 ; SSE41-NEXT:    retq
   2071 ;
   2072 ; AVX1-LABEL: trunc_usat_v8i32_v8i8_store:
   2073 ; AVX1:       # %bb.0:
   2074 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
   2075 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,255,255,255]
   2076 ; AVX1-NEXT:    vpminud %xmm2, %xmm1, %xmm1
   2077 ; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
   2078 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
   2079 ; AVX1-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
   2080 ; AVX1-NEXT:    vmovq %xmm0, (%rdi)
   2081 ; AVX1-NEXT:    vzeroupper
   2082 ; AVX1-NEXT:    retq
   2083 ;
   2084 ; AVX2-LABEL: trunc_usat_v8i32_v8i8_store:
   2085 ; AVX2:       # %bb.0:
   2086 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
   2087 ; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
   2088 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
   2089 ; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
   2090 ; AVX2-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
   2091 ; AVX2-NEXT:    vmovq %xmm0, (%rdi)
   2092 ; AVX2-NEXT:    vzeroupper
   2093 ; AVX2-NEXT:    retq
   2094 ;
   2095 ; AVX512F-LABEL: trunc_usat_v8i32_v8i8_store:
   2096 ; AVX512F:       # %bb.0:
   2097 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
   2098 ; AVX512F-NEXT:    vpminud %ymm1, %ymm0, %ymm0
   2099 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
   2100 ; AVX512F-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
   2101 ; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
   2102 ; AVX512F-NEXT:    vzeroupper
   2103 ; AVX512F-NEXT:    retq
   2104 ;
   2105 ; AVX512VL-LABEL: trunc_usat_v8i32_v8i8_store:
   2106 ; AVX512VL:       # %bb.0:
   2107 ; AVX512VL-NEXT:    vpmovusdb %ymm0, (%rdi)
   2108 ; AVX512VL-NEXT:    vzeroupper
   2109 ; AVX512VL-NEXT:    retq
   2110 ;
   2111 ; AVX512BW-LABEL: trunc_usat_v8i32_v8i8_store:
   2112 ; AVX512BW:       # %bb.0:
   2113 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
   2114 ; AVX512BW-NEXT:    vpminud %ymm1, %ymm0, %ymm0
   2115 ; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0
   2116 ; AVX512BW-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
   2117 ; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
   2118 ; AVX512BW-NEXT:    vzeroupper
   2119 ; AVX512BW-NEXT:    retq
   2120 ;
   2121 ; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i8_store:
   2122 ; AVX512BWVL:       # %bb.0:
   2123 ; AVX512BWVL-NEXT:    vpmovusdb %ymm0, (%rdi)
   2124 ; AVX512BWVL-NEXT:    vzeroupper
   2125 ; AVX512BWVL-NEXT:    retq
   2126   %1 = icmp ult <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
   2127   %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
   2128   %3 = trunc <8 x i32> %2 to <8 x i8>
   2129   store <8 x i8> %3, <8 x i8> *%p1
   2130   ret void
   2131 }
   2132 
   2133 define <16 x i8> @trunc_usat_v16i32_v16i8(<16 x i32> %a0) {
   2134 ; SSE2-LABEL: trunc_usat_v16i32_v16i8:
   2135 ; SSE2:       # %bb.0:
   2136 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255,255,255]
   2137 ; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
   2138 ; SSE2-NEXT:    movdqa %xmm1, %xmm7
   2139 ; SSE2-NEXT:    pxor %xmm6, %xmm7
   2140 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
   2141 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
   2142 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm4
   2143 ; SSE2-NEXT:    pand %xmm4, %xmm1
   2144 ; SSE2-NEXT:    pandn %xmm8, %xmm4
   2145 ; SSE2-NEXT:    por %xmm1, %xmm4
   2146 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
   2147 ; SSE2-NEXT:    pxor %xmm6, %xmm1
   2148 ; SSE2-NEXT:    movdqa %xmm5, %xmm7
   2149 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm7
   2150 ; SSE2-NEXT:    pand %xmm7, %xmm0
   2151 ; SSE2-NEXT:    pandn %xmm8, %xmm7
   2152 ; SSE2-NEXT:    por %xmm7, %xmm0
   2153 ; SSE2-NEXT:    packuswb %xmm4, %xmm0
   2154 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
   2155 ; SSE2-NEXT:    pxor %xmm6, %xmm1
   2156 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
   2157 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
   2158 ; SSE2-NEXT:    pand %xmm4, %xmm3
   2159 ; SSE2-NEXT:    pandn %xmm8, %xmm4
   2160 ; SSE2-NEXT:    por %xmm3, %xmm4
   2161 ; SSE2-NEXT:    pxor %xmm2, %xmm6
   2162 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
   2163 ; SSE2-NEXT:    pand %xmm5, %xmm2
   2164 ; SSE2-NEXT:    pandn %xmm8, %xmm5
   2165 ; SSE2-NEXT:    por %xmm2, %xmm5
   2166 ; SSE2-NEXT:    packuswb %xmm4, %xmm5
   2167 ; SSE2-NEXT:    packuswb %xmm5, %xmm0
   2168 ; SSE2-NEXT:    retq
   2169 ;
   2170 ; SSSE3-LABEL: trunc_usat_v16i32_v16i8:
   2171 ; SSSE3:       # %bb.0:
   2172 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255,255,255]
   2173 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
   2174 ; SSSE3-NEXT:    movdqa %xmm1, %xmm7
   2175 ; SSSE3-NEXT:    pxor %xmm6, %xmm7
   2176 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
   2177 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
   2178 ; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm4
   2179 ; SSSE3-NEXT:    pand %xmm4, %xmm1
   2180 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
   2181 ; SSSE3-NEXT:    por %xmm1, %xmm4
   2182 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
   2183 ; SSSE3-NEXT:    pxor %xmm6, %xmm1
   2184 ; SSSE3-NEXT:    movdqa %xmm5, %xmm7
   2185 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm7
   2186 ; SSSE3-NEXT:    pand %xmm7, %xmm0
   2187 ; SSSE3-NEXT:    pandn %xmm8, %xmm7
   2188 ; SSSE3-NEXT:    por %xmm7, %xmm0
   2189 ; SSSE3-NEXT:    packuswb %xmm4, %xmm0
   2190 ; SSSE3-NEXT:    movdqa %xmm3, %xmm1
   2191 ; SSSE3-NEXT:    pxor %xmm6, %xmm1
   2192 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
   2193 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
   2194 ; SSSE3-NEXT:    pand %xmm4, %xmm3
   2195 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
   2196 ; SSSE3-NEXT:    por %xmm3, %xmm4
   2197 ; SSSE3-NEXT:    pxor %xmm2, %xmm6
   2198 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm5
   2199 ; SSSE3-NEXT:    pand %xmm5, %xmm2
   2200 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
   2201 ; SSSE3-NEXT:    por %xmm2, %xmm5
   2202 ; SSSE3-NEXT:    packuswb %xmm4, %xmm5
   2203 ; SSSE3-NEXT:    packuswb %xmm5, %xmm0
   2204 ; SSSE3-NEXT:    retq
   2205 ;
   2206 ; SSE41-LABEL: trunc_usat_v16i32_v16i8:
   2207 ; SSE41:       # %bb.0:
   2208 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [255,255,255,255]
   2209 ; SSE41-NEXT:    pminud %xmm4, %xmm1
   2210 ; SSE41-NEXT:    pminud %xmm4, %xmm0
   2211 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
   2212 ; SSE41-NEXT:    pminud %xmm4, %xmm3
   2213 ; SSE41-NEXT:    pminud %xmm4, %xmm2
   2214 ; SSE41-NEXT:    packusdw %xmm3, %xmm2
   2215 ; SSE41-NEXT:    packuswb %xmm2, %xmm0
   2216 ; SSE41-NEXT:    retq
   2217 ;
   2218 ; AVX1-LABEL: trunc_usat_v16i32_v16i8:
   2219 ; AVX1:       # %bb.0:
   2220 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
   2221 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255]
   2222 ; AVX1-NEXT:    vpminud %xmm3, %xmm2, %xmm2
   2223 ; AVX1-NEXT:    vpminud %xmm3, %xmm0, %xmm0
   2224 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
   2225 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
   2226 ; AVX1-NEXT:    vpminud %xmm3, %xmm2, %xmm2
   2227 ; AVX1-NEXT:    vpminud %xmm3, %xmm1, %xmm1
   2228 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
   2229 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
   2230 ; AVX1-NEXT:    vzeroupper
   2231 ; AVX1-NEXT:    retq
   2232 ;
   2233 ; AVX2-LABEL: trunc_usat_v16i32_v16i8:
   2234 ; AVX2:       # %bb.0:
   2235 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]
   2236 ; AVX2-NEXT:    vpminud %ymm2, %ymm1, %ymm1
   2237 ; AVX2-NEXT:    vpminud %ymm2, %ymm0, %ymm0
   2238 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
   2239 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
   2240 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
   2241 ; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
   2242 ; AVX2-NEXT:    vzeroupper
   2243 ; AVX2-NEXT:    retq
   2244 ;
   2245 ; AVX512-LABEL: trunc_usat_v16i32_v16i8:
   2246 ; AVX512:       # %bb.0:
   2247 ; AVX512-NEXT:    vpmovusdb %zmm0, %xmm0
   2248 ; AVX512-NEXT:    vzeroupper
   2249 ; AVX512-NEXT:    retq
   2250   %1 = icmp ult <16 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
   2251   %2 = select <16 x i1> %1, <16 x i32> %a0, <16 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
   2252   %3 = trunc <16 x i32> %2 to <16 x i8>
   2253   ret <16 x i8> %3
   2254 }
   2255 
   2256 define <16 x i8> @trunc_usat_v16i16_v16i8(<16 x i16> %a0) {
   2257 ; SSE2-LABEL: trunc_usat_v16i16_v16i8:
   2258 ; SSE2:       # %bb.0:
   2259 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
   2260 ; SSE2-NEXT:    pxor %xmm2, %xmm1
   2261 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [33023,33023,33023,33023,33023,33023,33023,33023]
   2262 ; SSE2-NEXT:    pminsw %xmm3, %xmm1
   2263 ; SSE2-NEXT:    pxor %xmm2, %xmm1
   2264 ; SSE2-NEXT:    pxor %xmm2, %xmm0
   2265 ; SSE2-NEXT:    pminsw %xmm3, %xmm0
   2266 ; SSE2-NEXT:    pxor %xmm2, %xmm0
   2267 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
   2268 ; SSE2-NEXT:    retq
   2269 ;
   2270 ; SSSE3-LABEL: trunc_usat_v16i16_v16i8:
   2271 ; SSSE3:       # %bb.0:
   2272 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
   2273 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
   2274 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [33023,33023,33023,33023,33023,33023,33023,33023]
   2275 ; SSSE3-NEXT:    pminsw %xmm3, %xmm1
   2276 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
   2277 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
   2278 ; SSSE3-NEXT:    pminsw %xmm3, %xmm0
   2279 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
   2280 ; SSSE3-NEXT:    packuswb %xmm1, %xmm0
   2281 ; SSSE3-NEXT:    retq
   2282 ;
   2283 ; SSE41-LABEL: trunc_usat_v16i16_v16i8:
   2284 ; SSE41:       # %bb.0:
   2285 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
   2286 ; SSE41-NEXT:    pminuw %xmm2, %xmm1
   2287 ; SSE41-NEXT:    pminuw %xmm2, %xmm0
   2288 ; SSE41-NEXT:    packuswb %xmm1, %xmm0
   2289 ; SSE41-NEXT:    retq
   2290 ;
   2291 ; AVX1-LABEL: trunc_usat_v16i16_v16i8:
   2292 ; AVX1:       # %bb.0:
   2293 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
   2294 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
   2295 ; AVX1-NEXT:    vpminuw %xmm2, %xmm1, %xmm1
   2296 ; AVX1-NEXT:    vpminuw %xmm2, %xmm0, %xmm0
   2297 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
   2298 ; AVX1-NEXT:    vzeroupper
   2299 ; AVX1-NEXT:    retq
   2300 ;
   2301 ; AVX2-LABEL: trunc_usat_v16i16_v16i8:
   2302 ; AVX2:       # %bb.0:
   2303 ; AVX2-NEXT:    vpminuw {{.*}}(%rip), %ymm0, %ymm0
   2304 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
   2305 ; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
   2306 ; AVX2-NEXT:    vzeroupper
   2307 ; AVX2-NEXT:    retq
   2308 ;
   2309 ; AVX512F-LABEL: trunc_usat_v16i16_v16i8:
   2310 ; AVX512F:       # %bb.0:
   2311 ; AVX512F-NEXT:    vpminuw {{.*}}(%rip), %ymm0, %ymm0
   2312 ; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0
   2313 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
   2314 ; AVX512F-NEXT:    vzeroupper
   2315 ; AVX512F-NEXT:    retq
   2316 ;
   2317 ; AVX512VL-LABEL: trunc_usat_v16i16_v16i8:
   2318 ; AVX512VL:       # %bb.0:
   2319 ; AVX512VL-NEXT:    vpminuw {{.*}}(%rip), %ymm0, %ymm0
   2320 ; AVX512VL-NEXT:    vpmovsxwd %ymm0, %zmm0
   2321 ; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
   2322 ; AVX512VL-NEXT:    vzeroupper
   2323 ; AVX512VL-NEXT:    retq
   2324 ;
   2325 ; AVX512BW-LABEL: trunc_usat_v16i16_v16i8:
   2326 ; AVX512BW:       # %bb.0:
   2327 ; AVX512BW-NEXT:    vpminuw {{.*}}(%rip), %ymm0, %ymm0
   2328 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
   2329 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
   2330 ; AVX512BW-NEXT:    vzeroupper
   2331 ; AVX512BW-NEXT:    retq
   2332 ;
   2333 ; AVX512BWVL-LABEL: trunc_usat_v16i16_v16i8:
   2334 ; AVX512BWVL:       # %bb.0:
   2335 ; AVX512BWVL-NEXT:    vpmovuswb %ymm0, %xmm0
   2336 ; AVX512BWVL-NEXT:    vzeroupper
   2337 ; AVX512BWVL-NEXT:    retq
   2338   %1 = icmp ult <16 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
   2339   %2 = select <16 x i1> %1, <16 x i16> %a0, <16 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
   2340   %3 = trunc <16 x i16> %2 to <16 x i8>
   2341   ret <16 x i8> %3
   2342 }
   2343 
   2344 define <32 x i8> @trunc_usat_v32i16_v32i8(<32 x i16> %a0) {
   2345 ; SSE2-LABEL: trunc_usat_v32i16_v32i8:
   2346 ; SSE2:       # %bb.0:
   2347 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
   2348 ; SSE2-NEXT:    pxor %xmm4, %xmm3
   2349 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [33023,33023,33023,33023,33023,33023,33023,33023]
   2350 ; SSE2-NEXT:    pminsw %xmm5, %xmm3
   2351 ; SSE2-NEXT:    pxor %xmm4, %xmm3
   2352 ; SSE2-NEXT:    pxor %xmm4, %xmm2
   2353 ; SSE2-NEXT:    pminsw %xmm5, %xmm2
   2354 ; SSE2-NEXT:    pxor %xmm4, %xmm2
   2355 ; SSE2-NEXT:    packuswb %xmm3, %xmm2
   2356 ; SSE2-NEXT:    pxor %xmm4, %xmm1
   2357 ; SSE2-NEXT:    pminsw %xmm5, %xmm1
   2358 ; SSE2-NEXT:    pxor %xmm4, %xmm1
   2359 ; SSE2-NEXT:    pxor %xmm4, %xmm0
   2360 ; SSE2-NEXT:    pminsw %xmm5, %xmm0
   2361 ; SSE2-NEXT:    pxor %xmm4, %xmm0
   2362 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
   2363 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
   2364 ; SSE2-NEXT:    retq
   2365 ;
   2366 ; SSSE3-LABEL: trunc_usat_v32i16_v32i8:
   2367 ; SSSE3:       # %bb.0:
   2368 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
   2369 ; SSSE3-NEXT:    pxor %xmm4, %xmm3
   2370 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [33023,33023,33023,33023,33023,33023,33023,33023]
   2371 ; SSSE3-NEXT:    pminsw %xmm5, %xmm3
   2372 ; SSSE3-NEXT:    pxor %xmm4, %xmm3
   2373 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
   2374 ; SSSE3-NEXT:    pminsw %xmm5, %xmm2
   2375 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
   2376 ; SSSE3-NEXT:    packuswb %xmm3, %xmm2
   2377 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
   2378 ; SSSE3-NEXT:    pminsw %xmm5, %xmm1
   2379 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
   2380 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
   2381 ; SSSE3-NEXT:    pminsw %xmm5, %xmm0
   2382 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
   2383 ; SSSE3-NEXT:    packuswb %xmm1, %xmm0
   2384 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
   2385 ; SSSE3-NEXT:    retq
   2386 ;
   2387 ; SSE41-LABEL: trunc_usat_v32i16_v32i8:
   2388 ; SSE41:       # %bb.0:
   2389 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
   2390 ; SSE41-NEXT:    pminuw %xmm4, %xmm3
   2391 ; SSE41-NEXT:    pminuw %xmm4, %xmm2
   2392 ; SSE41-NEXT:    packuswb %xmm3, %xmm2
   2393 ; SSE41-NEXT:    pminuw %xmm4, %xmm1
   2394 ; SSE41-NEXT:    pminuw %xmm4, %xmm0
   2395 ; SSE41-NEXT:    packuswb %xmm1, %xmm0
   2396 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
   2397 ; SSE41-NEXT:    retq
   2398 ;
   2399 ; AVX1-LABEL: trunc_usat_v32i16_v32i8:
   2400 ; AVX1:       # %bb.0:
   2401 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
   2402 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
   2403 ; AVX1-NEXT:    vpminuw %xmm3, %xmm2, %xmm2
   2404 ; AVX1-NEXT:    vpminuw %xmm3, %xmm0, %xmm0
   2405 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
   2406 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
   2407 ; AVX1-NEXT:    vpminuw %xmm3, %xmm2, %xmm2
   2408 ; AVX1-NEXT:    vpminuw %xmm3, %xmm1, %xmm1
   2409 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
   2410 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
   2411 ; AVX1-NEXT:    retq
   2412 ;
   2413 ; AVX2-LABEL: trunc_usat_v32i16_v32i8:
   2414 ; AVX2:       # %bb.0:
   2415 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
   2416 ; AVX2-NEXT:    vpminuw %ymm2, %ymm1, %ymm1
   2417 ; AVX2-NEXT:    vpminuw %ymm2, %ymm0, %ymm0
   2418 ; AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
   2419 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
   2420 ; AVX2-NEXT:    retq
   2421 ;
   2422 ; AVX512F-LABEL: trunc_usat_v32i16_v32i8:
   2423 ; AVX512F:       # %bb.0:
   2424 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
   2425 ; AVX512F-NEXT:    vpminuw %ymm2, %ymm1, %ymm1
   2426 ; AVX512F-NEXT:    vpminuw %ymm2, %ymm0, %ymm0
   2427 ; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0
   2428 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
   2429 ; AVX512F-NEXT:    vpmovsxwd %ymm1, %zmm1
   2430 ; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
   2431 ; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
   2432 ; AVX512F-NEXT:    retq
   2433 ;
   2434 ; AVX512VL-LABEL: trunc_usat_v32i16_v32i8:
   2435 ; AVX512VL:       # %bb.0:
   2436 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
   2437 ; AVX512VL-NEXT:    vpminuw %ymm2, %ymm1, %ymm1
   2438 ; AVX512VL-NEXT:    vpminuw %ymm2, %ymm0, %ymm0
   2439 ; AVX512VL-NEXT:    vpmovsxwd %ymm0, %zmm0
   2440 ; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
   2441 ; AVX512VL-NEXT:    vpmovsxwd %ymm1, %zmm1
   2442 ; AVX512VL-NEXT:    vpmovdb %zmm1, %xmm1
   2443 ; AVX512VL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
   2444 ; AVX512VL-NEXT:    retq
   2445 ;
   2446 ; AVX512BW-LABEL: trunc_usat_v32i16_v32i8:
   2447 ; AVX512BW:       # %bb.0:
   2448 ; AVX512BW-NEXT:    vpmovuswb %zmm0, %ymm0
   2449 ; AVX512BW-NEXT:    retq
   2450 ;
   2451 ; AVX512BWVL-LABEL: trunc_usat_v32i16_v32i8:
   2452 ; AVX512BWVL:       # %bb.0:
   2453 ; AVX512BWVL-NEXT:    vpmovuswb %zmm0, %ymm0
   2454 ; AVX512BWVL-NEXT:    retq
   2455   %1 = icmp ult <32 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
   2456   %2 = select <32 x i1> %1, <32 x i16> %a0, <32 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
   2457   %3 = trunc <32 x i16> %2 to <32 x i8>
   2458   ret <32 x i8> %3
   2459 }
   2460