Home | History | Annotate | Download | only in X86
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; RUN: llc -march=x86-64 -mcpu=core2 -mattr=+sse4.1 < %s | FileCheck %s --check-prefix=SSE41
      3 ; RUN: llc -march=x86-64 -mcpu=core2 < %s | FileCheck %s --check-prefix=SSE
      4 ; RUN: llc -march=x86-64 -mcpu=core-avx2 < %s | FileCheck %s --check-prefix=AVX
      5 
      6 target triple = "x86_64-unknown-unknown"
      7 
      8 define <4 x i32> @test1(<4 x i32> %a) #0 {
      9 ; SSE41-LABEL: test1:
     10 ; SSE41:       # BB#0:
     11 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757]
     12 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
     13 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
     14 ; SSE41-NEXT:    pmuludq %xmm2, %xmm3
     15 ; SSE41-NEXT:    pmuludq %xmm0, %xmm1
     16 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
     17 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]
     18 ; SSE41-NEXT:    psubd %xmm1, %xmm0
     19 ; SSE41-NEXT:    psrld $1, %xmm0
     20 ; SSE41-NEXT:    paddd %xmm1, %xmm0
     21 ; SSE41-NEXT:    psrld $2, %xmm0
     22 ; SSE41-NEXT:    retq
     23 ;
     24 ; SSE-LABEL: test1:
     25 ; SSE:       # BB#0:
     26 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757]
     27 ; SSE-NEXT:    movdqa %xmm0, %xmm2
     28 ; SSE-NEXT:    pmuludq %xmm1, %xmm2
     29 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
     30 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
     31 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
     32 ; SSE-NEXT:    pmuludq %xmm1, %xmm3
     33 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3]
     34 ; SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
     35 ; SSE-NEXT:    psubd %xmm2, %xmm0
     36 ; SSE-NEXT:    psrld $1, %xmm0
     37 ; SSE-NEXT:    paddd %xmm2, %xmm0
     38 ; SSE-NEXT:    psrld $2, %xmm0
     39 ; SSE-NEXT:    retq
     40 ;
     41 ; AVX-LABEL: test1:
     42 ; AVX:       # BB#0:
     43 ; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm1
     44 ; AVX-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
     45 ; AVX-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
     46 ; AVX-NEXT:    vpmuludq %xmm2, %xmm3, %xmm2
     47 ; AVX-NEXT:    vpmuludq %xmm1, %xmm0, %xmm1
     48 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
     49 ; AVX-NEXT:    vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]
     50 ; AVX-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
     51 ; AVX-NEXT:    vpsrld $1, %xmm0, %xmm0
     52 ; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
     53 ; AVX-NEXT:    vpsrld $2, %xmm0, %xmm0
     54 ; AVX-NEXT:    retq
     55   %div = udiv <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7>
     56   ret <4 x i32> %div
     57 }
     58 
     59 define <8 x i32> @test2(<8 x i32> %a) #0 {
     60 ; SSE41-LABEL: test2:
     61 ; SSE41:       # BB#0:
     62 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]
     63 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
     64 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
     65 ; SSE41-NEXT:    pmuludq %xmm3, %xmm4
     66 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
     67 ; SSE41-NEXT:    pmuludq %xmm2, %xmm5
     68 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
     69 ; SSE41-NEXT:    pblendw {{.*#+}} xmm5 = xmm5[0,1],xmm4[2,3],xmm5[4,5],xmm4[6,7]
     70 ; SSE41-NEXT:    psubd %xmm5, %xmm0
     71 ; SSE41-NEXT:    psrld $1, %xmm0
     72 ; SSE41-NEXT:    paddd %xmm5, %xmm0
     73 ; SSE41-NEXT:    psrld $2, %xmm0
     74 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
     75 ; SSE41-NEXT:    pmuludq %xmm3, %xmm4
     76 ; SSE41-NEXT:    pmuludq %xmm1, %xmm2
     77 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
     78 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]
     79 ; SSE41-NEXT:    psubd %xmm2, %xmm1
     80 ; SSE41-NEXT:    psrld $1, %xmm1
     81 ; SSE41-NEXT:    paddd %xmm2, %xmm1
     82 ; SSE41-NEXT:    psrld $2, %xmm1
     83 ; SSE41-NEXT:    retq
     84 ;
     85 ; SSE-LABEL: test2:
     86 ; SSE:       # BB#0:
     87 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]
     88 ; SSE-NEXT:    movdqa %xmm0, %xmm3
     89 ; SSE-NEXT:    pmuludq %xmm2, %xmm3
     90 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]
     91 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
     92 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
     93 ; SSE-NEXT:    pmuludq %xmm4, %xmm5
     94 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,3,2,3]
     95 ; SSE-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1]
     96 ; SSE-NEXT:    psubd %xmm3, %xmm0
     97 ; SSE-NEXT:    psrld $1, %xmm0
     98 ; SSE-NEXT:    paddd %xmm3, %xmm0
     99 ; SSE-NEXT:    psrld $2, %xmm0
    100 ; SSE-NEXT:    pmuludq %xmm1, %xmm2
    101 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
    102 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
    103 ; SSE-NEXT:    pmuludq %xmm4, %xmm3
    104 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]
    105 ; SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
    106 ; SSE-NEXT:    psubd %xmm2, %xmm1
    107 ; SSE-NEXT:    psrld $1, %xmm1
    108 ; SSE-NEXT:    paddd %xmm2, %xmm1
    109 ; SSE-NEXT:    psrld $2, %xmm1
    110 ; SSE-NEXT:    retq
    111 ;
    112 ; AVX-LABEL: test2:
    113 ; AVX:       # BB#0:
    114 ; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm1
    115 ; AVX-NEXT:    vpshufd {{.*#+}} ymm2 = ymm1[1,1,3,3,5,5,7,7]
    116 ; AVX-NEXT:    vpshufd {{.*#+}} ymm3 = ymm0[1,1,3,3,5,5,7,7]
    117 ; AVX-NEXT:    vpmuludq %ymm2, %ymm3, %ymm2
    118 ; AVX-NEXT:    vpmuludq %ymm1, %ymm0, %ymm1
    119 ; AVX-NEXT:    vpshufd {{.*#+}} ymm1 = ymm1[1,1,3,3,5,5,7,7]
    120 ; AVX-NEXT:    vpblendd {{.*#+}} ymm1 = ymm1[0],ymm2[1],ymm1[2],ymm2[3],ymm1[4],ymm2[5],ymm1[6],ymm2[7]
    121 ; AVX-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
    122 ; AVX-NEXT:    vpsrld $1, %ymm0, %ymm0
    123 ; AVX-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
    124 ; AVX-NEXT:    vpsrld $2, %ymm0, %ymm0
    125 ; AVX-NEXT:    retq
    126   %div = udiv <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7>
    127   ret <8 x i32> %div
    128 }
    129 
    130 define <8 x i16> @test3(<8 x i16> %a) #0 {
    131 ; SSE41-LABEL: test3:
    132 ; SSE41:       # BB#0:
    133 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [9363,9363,9363,9363,9363,9363,9363,9363]
    134 ; SSE41-NEXT:    pmulhuw %xmm0, %xmm1
    135 ; SSE41-NEXT:    psubw %xmm1, %xmm0
    136 ; SSE41-NEXT:    psrlw $1, %xmm0
    137 ; SSE41-NEXT:    paddw %xmm1, %xmm0
    138 ; SSE41-NEXT:    psrlw $2, %xmm0
    139 ; SSE41-NEXT:    retq
    140 ;
    141 ; SSE-LABEL: test3:
    142 ; SSE:       # BB#0:
    143 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [9363,9363,9363,9363,9363,9363,9363,9363]
    144 ; SSE-NEXT:    pmulhuw %xmm0, %xmm1
    145 ; SSE-NEXT:    psubw %xmm1, %xmm0
    146 ; SSE-NEXT:    psrlw $1, %xmm0
    147 ; SSE-NEXT:    paddw %xmm1, %xmm0
    148 ; SSE-NEXT:    psrlw $2, %xmm0
    149 ; SSE-NEXT:    retq
    150 ;
    151 ; AVX-LABEL: test3:
    152 ; AVX:       # BB#0:
    153 ; AVX-NEXT:    vpmulhuw {{.*}}(%rip), %xmm0, %xmm1
    154 ; AVX-NEXT:    vpsubw %xmm1, %xmm0, %xmm0
    155 ; AVX-NEXT:    vpsrlw $1, %xmm0, %xmm0
    156 ; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
    157 ; AVX-NEXT:    vpsrlw $2, %xmm0, %xmm0
    158 ; AVX-NEXT:    retq
    159   %div = udiv <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
    160   ret <8 x i16> %div
    161 }
    162 
    163 define <16 x i16> @test4(<16 x i16> %a) #0 {
    164 ; SSE41-LABEL: test4:
    165 ; SSE41:       # BB#0:
    166 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [9363,9363,9363,9363,9363,9363,9363,9363]
    167 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
    168 ; SSE41-NEXT:    pmulhuw %xmm2, %xmm3
    169 ; SSE41-NEXT:    psubw %xmm3, %xmm0
    170 ; SSE41-NEXT:    psrlw $1, %xmm0
    171 ; SSE41-NEXT:    paddw %xmm3, %xmm0
    172 ; SSE41-NEXT:    psrlw $2, %xmm0
    173 ; SSE41-NEXT:    pmulhuw %xmm1, %xmm2
    174 ; SSE41-NEXT:    psubw %xmm2, %xmm1
    175 ; SSE41-NEXT:    psrlw $1, %xmm1
    176 ; SSE41-NEXT:    paddw %xmm2, %xmm1
    177 ; SSE41-NEXT:    psrlw $2, %xmm1
    178 ; SSE41-NEXT:    retq
    179 ;
    180 ; SSE-LABEL: test4:
    181 ; SSE:       # BB#0:
    182 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [9363,9363,9363,9363,9363,9363,9363,9363]
    183 ; SSE-NEXT:    movdqa %xmm0, %xmm3
    184 ; SSE-NEXT:    pmulhuw %xmm2, %xmm3
    185 ; SSE-NEXT:    psubw %xmm3, %xmm0
    186 ; SSE-NEXT:    psrlw $1, %xmm0
    187 ; SSE-NEXT:    paddw %xmm3, %xmm0
    188 ; SSE-NEXT:    psrlw $2, %xmm0
    189 ; SSE-NEXT:    pmulhuw %xmm1, %xmm2
    190 ; SSE-NEXT:    psubw %xmm2, %xmm1
    191 ; SSE-NEXT:    psrlw $1, %xmm1
    192 ; SSE-NEXT:    paddw %xmm2, %xmm1
    193 ; SSE-NEXT:    psrlw $2, %xmm1
    194 ; SSE-NEXT:    retq
    195 ;
    196 ; AVX-LABEL: test4:
    197 ; AVX:       # BB#0:
    198 ; AVX-NEXT:    vpmulhuw {{.*}}(%rip), %ymm0, %ymm1
    199 ; AVX-NEXT:    vpsubw %ymm1, %ymm0, %ymm0
    200 ; AVX-NEXT:    vpsrlw $1, %ymm0, %ymm0
    201 ; AVX-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
    202 ; AVX-NEXT:    vpsrlw $2, %ymm0, %ymm0
    203 ; AVX-NEXT:    retq
    204   %div = udiv <16 x i16> %a, <i16 7, i16 7, i16 7, i16 7,i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7,i16 7, i16 7, i16 7, i16 7>
    205   ret <16 x i16> %div
    206 }
    207 
    208 define <8 x i16> @test5(<8 x i16> %a) #0 {
    209 ; SSE41-LABEL: test5:
    210 ; SSE41:       # BB#0:
    211 ; SSE41-NEXT:    pmulhw {{.*}}(%rip), %xmm0
    212 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
    213 ; SSE41-NEXT:    psrlw $15, %xmm1
    214 ; SSE41-NEXT:    psraw $1, %xmm0
    215 ; SSE41-NEXT:    paddw %xmm1, %xmm0
    216 ; SSE41-NEXT:    retq
    217 ;
    218 ; SSE-LABEL: test5:
    219 ; SSE:       # BB#0:
    220 ; SSE-NEXT:    pmulhw {{.*}}(%rip), %xmm0
    221 ; SSE-NEXT:    movdqa %xmm0, %xmm1
    222 ; SSE-NEXT:    psrlw $15, %xmm1
    223 ; SSE-NEXT:    psraw $1, %xmm0
    224 ; SSE-NEXT:    paddw %xmm1, %xmm0
    225 ; SSE-NEXT:    retq
    226 ;
    227 ; AVX-LABEL: test5:
    228 ; AVX:       # BB#0:
    229 ; AVX-NEXT:    vpmulhw {{.*}}(%rip), %xmm0, %xmm0
    230 ; AVX-NEXT:    vpsrlw $15, %xmm0, %xmm1
    231 ; AVX-NEXT:    vpsraw $1, %xmm0, %xmm0
    232 ; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
    233 ; AVX-NEXT:    retq
    234   %div = sdiv <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
    235   ret <8 x i16> %div
    236 }
    237 
    238 define <16 x i16> @test6(<16 x i16> %a) #0 {
    239 ; SSE41-LABEL: test6:
    240 ; SSE41:       # BB#0:
    241 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [18725,18725,18725,18725,18725,18725,18725,18725]
    242 ; SSE41-NEXT:    pmulhw %xmm2, %xmm0
    243 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
    244 ; SSE41-NEXT:    psrlw $15, %xmm3
    245 ; SSE41-NEXT:    psraw $1, %xmm0
    246 ; SSE41-NEXT:    paddw %xmm3, %xmm0
    247 ; SSE41-NEXT:    pmulhw %xmm2, %xmm1
    248 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
    249 ; SSE41-NEXT:    psrlw $15, %xmm2
    250 ; SSE41-NEXT:    psraw $1, %xmm1
    251 ; SSE41-NEXT:    paddw %xmm2, %xmm1
    252 ; SSE41-NEXT:    retq
    253 ;
    254 ; SSE-LABEL: test6:
    255 ; SSE:       # BB#0:
    256 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [18725,18725,18725,18725,18725,18725,18725,18725]
    257 ; SSE-NEXT:    pmulhw %xmm2, %xmm0
    258 ; SSE-NEXT:    movdqa %xmm0, %xmm3
    259 ; SSE-NEXT:    psrlw $15, %xmm3
    260 ; SSE-NEXT:    psraw $1, %xmm0
    261 ; SSE-NEXT:    paddw %xmm3, %xmm0
    262 ; SSE-NEXT:    pmulhw %xmm2, %xmm1
    263 ; SSE-NEXT:    movdqa %xmm1, %xmm2
    264 ; SSE-NEXT:    psrlw $15, %xmm2
    265 ; SSE-NEXT:    psraw $1, %xmm1
    266 ; SSE-NEXT:    paddw %xmm2, %xmm1
    267 ; SSE-NEXT:    retq
    268 ;
    269 ; AVX-LABEL: test6:
    270 ; AVX:       # BB#0:
    271 ; AVX-NEXT:    vpmulhw {{.*}}(%rip), %ymm0, %ymm0
    272 ; AVX-NEXT:    vpsrlw $15, %ymm0, %ymm1
    273 ; AVX-NEXT:    vpsraw $1, %ymm0, %ymm0
    274 ; AVX-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
    275 ; AVX-NEXT:    retq
    276   %div = sdiv <16 x i16> %a, <i16 7, i16 7, i16 7, i16 7,i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7,i16 7, i16 7, i16 7, i16 7>
    277   ret <16 x i16> %div
    278 }
    279 
    280 define <16 x i8> @test7(<16 x i8> %a) #0 {
    281 ; SSE41-LABEL: test7:
    282 ; SSE41:       # BB#0:
    283 ; SSE41-NEXT:    pextrb $1, %xmm0, %eax
    284 ; SSE41-NEXT:    movsbl %al, %eax
    285 ; SSE41-NEXT:    imull $-109, %eax, %ecx
    286 ; SSE41-NEXT:    shrl $8, %ecx
    287 ; SSE41-NEXT:    addb %cl, %al
    288 ; SSE41-NEXT:    movb %al, %cl
    289 ; SSE41-NEXT:    shrb $7, %cl
    290 ; SSE41-NEXT:    sarb $2, %al
    291 ; SSE41-NEXT:    addb %cl, %al
    292 ; SSE41-NEXT:    movzbl %al, %eax
    293 ; SSE41-NEXT:    pextrb $0, %xmm0, %ecx
    294 ; SSE41-NEXT:    movsbl %cl, %ecx
    295 ; SSE41-NEXT:    imull $-109, %ecx, %edx
    296 ; SSE41-NEXT:    shrl $8, %edx
    297 ; SSE41-NEXT:    addb %dl, %cl
    298 ; SSE41-NEXT:    movb %cl, %dl
    299 ; SSE41-NEXT:    shrb $7, %dl
    300 ; SSE41-NEXT:    sarb $2, %cl
    301 ; SSE41-NEXT:    addb %dl, %cl
    302 ; SSE41-NEXT:    movzbl %cl, %ecx
    303 ; SSE41-NEXT:    movd %ecx, %xmm1
    304 ; SSE41-NEXT:    pinsrb $1, %eax, %xmm1
    305 ; SSE41-NEXT:    pextrb $2, %xmm0, %eax
    306 ; SSE41-NEXT:    movsbl %al, %eax
    307 ; SSE41-NEXT:    imull $-109, %eax, %ecx
    308 ; SSE41-NEXT:    shrl $8, %ecx
    309 ; SSE41-NEXT:    addb %cl, %al
    310 ; SSE41-NEXT:    movb %al, %cl
    311 ; SSE41-NEXT:    shrb $7, %cl
    312 ; SSE41-NEXT:    sarb $2, %al
    313 ; SSE41-NEXT:    addb %cl, %al
    314 ; SSE41-NEXT:    movzbl %al, %eax
    315 ; SSE41-NEXT:    pinsrb $2, %eax, %xmm1
    316 ; SSE41-NEXT:    pextrb $3, %xmm0, %eax
    317 ; SSE41-NEXT:    movsbl %al, %eax
    318 ; SSE41-NEXT:    imull $-109, %eax, %ecx
    319 ; SSE41-NEXT:    shrl $8, %ecx
    320 ; SSE41-NEXT:    addb %cl, %al
    321 ; SSE41-NEXT:    movb %al, %cl
    322 ; SSE41-NEXT:    shrb $7, %cl
    323 ; SSE41-NEXT:    sarb $2, %al
    324 ; SSE41-NEXT:    addb %cl, %al
    325 ; SSE41-NEXT:    movzbl %al, %eax
    326 ; SSE41-NEXT:    pinsrb $3, %eax, %xmm1
    327 ; SSE41-NEXT:    pextrb $4, %xmm0, %eax
    328 ; SSE41-NEXT:    movsbl %al, %eax
    329 ; SSE41-NEXT:    imull $-109, %eax, %ecx
    330 ; SSE41-NEXT:    shrl $8, %ecx
    331 ; SSE41-NEXT:    addb %cl, %al
    332 ; SSE41-NEXT:    movb %al, %cl
    333 ; SSE41-NEXT:    shrb $7, %cl
    334 ; SSE41-NEXT:    sarb $2, %al
    335 ; SSE41-NEXT:    addb %cl, %al
    336 ; SSE41-NEXT:    movzbl %al, %eax
    337 ; SSE41-NEXT:    pinsrb $4, %eax, %xmm1
    338 ; SSE41-NEXT:    pextrb $5, %xmm0, %eax
    339 ; SSE41-NEXT:    movsbl %al, %eax
    340 ; SSE41-NEXT:    imull $-109, %eax, %ecx
    341 ; SSE41-NEXT:    shrl $8, %ecx
    342 ; SSE41-NEXT:    addb %cl, %al
    343 ; SSE41-NEXT:    movb %al, %cl
    344 ; SSE41-NEXT:    shrb $7, %cl
    345 ; SSE41-NEXT:    sarb $2, %al
    346 ; SSE41-NEXT:    addb %cl, %al
    347 ; SSE41-NEXT:    movzbl %al, %eax
    348 ; SSE41-NEXT:    pinsrb $5, %eax, %xmm1
    349 ; SSE41-NEXT:    pextrb $6, %xmm0, %eax
    350 ; SSE41-NEXT:    movsbl %al, %eax
    351 ; SSE41-NEXT:    imull $-109, %eax, %ecx
    352 ; SSE41-NEXT:    shrl $8, %ecx
    353 ; SSE41-NEXT:    addb %cl, %al
    354 ; SSE41-NEXT:    movb %al, %cl
    355 ; SSE41-NEXT:    shrb $7, %cl
    356 ; SSE41-NEXT:    sarb $2, %al
    357 ; SSE41-NEXT:    addb %cl, %al
    358 ; SSE41-NEXT:    movzbl %al, %eax
    359 ; SSE41-NEXT:    pinsrb $6, %eax, %xmm1
    360 ; SSE41-NEXT:    pextrb $7, %xmm0, %eax
    361 ; SSE41-NEXT:    movsbl %al, %eax
    362 ; SSE41-NEXT:    imull $-109, %eax, %ecx
    363 ; SSE41-NEXT:    shrl $8, %ecx
    364 ; SSE41-NEXT:    addb %cl, %al
    365 ; SSE41-NEXT:    movb %al, %cl
    366 ; SSE41-NEXT:    shrb $7, %cl
    367 ; SSE41-NEXT:    sarb $2, %al
    368 ; SSE41-NEXT:    addb %cl, %al
    369 ; SSE41-NEXT:    movzbl %al, %eax
    370 ; SSE41-NEXT:    pinsrb $7, %eax, %xmm1
    371 ; SSE41-NEXT:    pextrb $8, %xmm0, %eax
    372 ; SSE41-NEXT:    movsbl %al, %eax
    373 ; SSE41-NEXT:    imull $-109, %eax, %ecx
    374 ; SSE41-NEXT:    shrl $8, %ecx
    375 ; SSE41-NEXT:    addb %cl, %al
    376 ; SSE41-NEXT:    movb %al, %cl
    377 ; SSE41-NEXT:    shrb $7, %cl
    378 ; SSE41-NEXT:    sarb $2, %al
    379 ; SSE41-NEXT:    addb %cl, %al
    380 ; SSE41-NEXT:    movzbl %al, %eax
    381 ; SSE41-NEXT:    pinsrb $8, %eax, %xmm1
    382 ; SSE41-NEXT:    pextrb $9, %xmm0, %eax
    383 ; SSE41-NEXT:    movsbl %al, %eax
    384 ; SSE41-NEXT:    imull $-109, %eax, %ecx
    385 ; SSE41-NEXT:    shrl $8, %ecx
    386 ; SSE41-NEXT:    addb %cl, %al
    387 ; SSE41-NEXT:    movb %al, %cl
    388 ; SSE41-NEXT:    shrb $7, %cl
    389 ; SSE41-NEXT:    sarb $2, %al
    390 ; SSE41-NEXT:    addb %cl, %al
    391 ; SSE41-NEXT:    movzbl %al, %eax
    392 ; SSE41-NEXT:    pinsrb $9, %eax, %xmm1
    393 ; SSE41-NEXT:    pextrb $10, %xmm0, %eax
    394 ; SSE41-NEXT:    movsbl %al, %eax
    395 ; SSE41-NEXT:    imull $-109, %eax, %ecx
    396 ; SSE41-NEXT:    shrl $8, %ecx
    397 ; SSE41-NEXT:    addb %cl, %al
    398 ; SSE41-NEXT:    movb %al, %cl
    399 ; SSE41-NEXT:    shrb $7, %cl
    400 ; SSE41-NEXT:    sarb $2, %al
    401 ; SSE41-NEXT:    addb %cl, %al
    402 ; SSE41-NEXT:    movzbl %al, %eax
    403 ; SSE41-NEXT:    pinsrb $10, %eax, %xmm1
    404 ; SSE41-NEXT:    pextrb $11, %xmm0, %eax
    405 ; SSE41-NEXT:    movsbl %al, %eax
    406 ; SSE41-NEXT:    imull $-109, %eax, %ecx
    407 ; SSE41-NEXT:    shrl $8, %ecx
    408 ; SSE41-NEXT:    addb %cl, %al
    409 ; SSE41-NEXT:    movb %al, %cl
    410 ; SSE41-NEXT:    shrb $7, %cl
    411 ; SSE41-NEXT:    sarb $2, %al
    412 ; SSE41-NEXT:    addb %cl, %al
    413 ; SSE41-NEXT:    movzbl %al, %eax
    414 ; SSE41-NEXT:    pinsrb $11, %eax, %xmm1
    415 ; SSE41-NEXT:    pextrb $12, %xmm0, %eax
    416 ; SSE41-NEXT:    movsbl %al, %eax
    417 ; SSE41-NEXT:    imull $-109, %eax, %ecx
    418 ; SSE41-NEXT:    shrl $8, %ecx
    419 ; SSE41-NEXT:    addb %cl, %al
    420 ; SSE41-NEXT:    movb %al, %cl
    421 ; SSE41-NEXT:    shrb $7, %cl
    422 ; SSE41-NEXT:    sarb $2, %al
    423 ; SSE41-NEXT:    addb %cl, %al
    424 ; SSE41-NEXT:    movzbl %al, %eax
    425 ; SSE41-NEXT:    pinsrb $12, %eax, %xmm1
    426 ; SSE41-NEXT:    pextrb $13, %xmm0, %eax
    427 ; SSE41-NEXT:    movsbl %al, %eax
    428 ; SSE41-NEXT:    imull $-109, %eax, %ecx
    429 ; SSE41-NEXT:    shrl $8, %ecx
    430 ; SSE41-NEXT:    addb %cl, %al
    431 ; SSE41-NEXT:    movb %al, %cl
    432 ; SSE41-NEXT:    shrb $7, %cl
    433 ; SSE41-NEXT:    sarb $2, %al
    434 ; SSE41-NEXT:    addb %cl, %al
    435 ; SSE41-NEXT:    movzbl %al, %eax
    436 ; SSE41-NEXT:    pinsrb $13, %eax, %xmm1
    437 ; SSE41-NEXT:    pextrb $14, %xmm0, %eax
    438 ; SSE41-NEXT:    movsbl %al, %eax
    439 ; SSE41-NEXT:    imull $-109, %eax, %ecx
    440 ; SSE41-NEXT:    shrl $8, %ecx
    441 ; SSE41-NEXT:    addb %cl, %al
    442 ; SSE41-NEXT:    movb %al, %cl
    443 ; SSE41-NEXT:    shrb $7, %cl
    444 ; SSE41-NEXT:    sarb $2, %al
    445 ; SSE41-NEXT:    addb %cl, %al
    446 ; SSE41-NEXT:    movzbl %al, %eax
    447 ; SSE41-NEXT:    pinsrb $14, %eax, %xmm1
    448 ; SSE41-NEXT:    pextrb $15, %xmm0, %eax
    449 ; SSE41-NEXT:    movsbl %al, %eax
    450 ; SSE41-NEXT:    imull $-109, %eax, %ecx
    451 ; SSE41-NEXT:    shrl $8, %ecx
    452 ; SSE41-NEXT:    addb %cl, %al
    453 ; SSE41-NEXT:    movb %al, %cl
    454 ; SSE41-NEXT:    shrb $7, %cl
    455 ; SSE41-NEXT:    sarb $2, %al
    456 ; SSE41-NEXT:    addb %cl, %al
    457 ; SSE41-NEXT:    movzbl %al, %eax
    458 ; SSE41-NEXT:    pinsrb $15, %eax, %xmm1
    459 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    460 ; SSE41-NEXT:    retq
    461 ;
    462 ; SSE-LABEL: test7:
    463 ; SSE:       # BB#0:
    464 ; SSE-NEXT:    pushq %rbp
    465 ; SSE-NEXT:    pushq %r14
    466 ; SSE-NEXT:    pushq %rbx
    467 ; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
    468 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
    469 ; SSE-NEXT:    imull $-109, %eax, %ecx
    470 ; SSE-NEXT:    shrl $8, %ecx
    471 ; SSE-NEXT:    addb %al, %cl
    472 ; SSE-NEXT:    movb %cl, %al
    473 ; SSE-NEXT:    shrb $7, %al
    474 ; SSE-NEXT:    sarb $2, %cl
    475 ; SSE-NEXT:    addb %al, %cl
    476 ; SSE-NEXT:    movzbl %cl, %eax
    477 ; SSE-NEXT:    movd %eax, %xmm0
    478 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %r14d
    479 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %edx
    480 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %r9d
    481 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
    482 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %r11d
    483 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %ecx
    484 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %r8d
    485 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %esi
    486 ; SSE-NEXT:    imull $-109, %esi, %edi
    487 ; SSE-NEXT:    shrl $8, %edi
    488 ; SSE-NEXT:    addb %sil, %dil
    489 ; SSE-NEXT:    movb %dil, %bl
    490 ; SSE-NEXT:    shrb $7, %bl
    491 ; SSE-NEXT:    sarb $2, %dil
    492 ; SSE-NEXT:    addb %bl, %dil
    493 ; SSE-NEXT:    movzbl %dil, %esi
    494 ; SSE-NEXT:    movd %esi, %xmm1
    495 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
    496 ; SSE-NEXT:    imull $-109, %eax, %esi
    497 ; SSE-NEXT:    shrl $8, %esi
    498 ; SSE-NEXT:    addb %al, %sil
    499 ; SSE-NEXT:    movb %sil, %al
    500 ; SSE-NEXT:    shrb $7, %al
    501 ; SSE-NEXT:    sarb $2, %sil
    502 ; SSE-NEXT:    addb %al, %sil
    503 ; SSE-NEXT:    movzbl %sil, %eax
    504 ; SSE-NEXT:    movd %eax, %xmm2
    505 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %ebp
    506 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %esi
    507 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %r10d
    508 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %edi
    509 ; SSE-NEXT:    imull $-109, %edi, %ebx
    510 ; SSE-NEXT:    shrl $8, %ebx
    511 ; SSE-NEXT:    addb %dil, %bl
    512 ; SSE-NEXT:    movb %bl, %al
    513 ; SSE-NEXT:    shrb $7, %al
    514 ; SSE-NEXT:    sarb $2, %bl
    515 ; SSE-NEXT:    addb %al, %bl
    516 ; SSE-NEXT:    movzbl %bl, %eax
    517 ; SSE-NEXT:    movd %eax, %xmm0
    518 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
    519 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
    520 ; SSE-NEXT:    imull $-109, %edx, %eax
    521 ; SSE-NEXT:    shrl $8, %eax
    522 ; SSE-NEXT:    addb %dl, %al
    523 ; SSE-NEXT:    movb %al, %dl
    524 ; SSE-NEXT:    shrb $7, %dl
    525 ; SSE-NEXT:    sarb $2, %al
    526 ; SSE-NEXT:    addb %dl, %al
    527 ; SSE-NEXT:    movzbl %al, %eax
    528 ; SSE-NEXT:    movd %eax, %xmm1
    529 ; SSE-NEXT:    imull $-109, %esi, %eax
    530 ; SSE-NEXT:    shrl $8, %eax
    531 ; SSE-NEXT:    addb %sil, %al
    532 ; SSE-NEXT:    movb %al, %dl
    533 ; SSE-NEXT:    shrb $7, %dl
    534 ; SSE-NEXT:    sarb $2, %al
    535 ; SSE-NEXT:    addb %dl, %al
    536 ; SSE-NEXT:    movzbl %al, %eax
    537 ; SSE-NEXT:    movd %eax, %xmm2
    538 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
    539 ; SSE-NEXT:    imull $-109, %ecx, %eax
    540 ; SSE-NEXT:    shrl $8, %eax
    541 ; SSE-NEXT:    addb %cl, %al
    542 ; SSE-NEXT:    movb %al, %cl
    543 ; SSE-NEXT:    shrb $7, %cl
    544 ; SSE-NEXT:    sarb $2, %al
    545 ; SSE-NEXT:    addb %cl, %al
    546 ; SSE-NEXT:    movzbl %al, %eax
    547 ; SSE-NEXT:    movd %eax, %xmm3
    548 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %ecx
    549 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
    550 ; SSE-NEXT:    imull $-109, %eax, %edx
    551 ; SSE-NEXT:    shrl $8, %edx
    552 ; SSE-NEXT:    addb %al, %dl
    553 ; SSE-NEXT:    movb %dl, %al
    554 ; SSE-NEXT:    shrb $7, %al
    555 ; SSE-NEXT:    sarb $2, %dl
    556 ; SSE-NEXT:    addb %al, %dl
    557 ; SSE-NEXT:    movzbl %dl, %eax
    558 ; SSE-NEXT:    movd %eax, %xmm1
    559 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
    560 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
    561 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
    562 ; SSE-NEXT:    imull $-109, %r14d, %eax
    563 ; SSE-NEXT:    shrl $8, %eax
    564 ; SSE-NEXT:    addb %r14b, %al
    565 ; SSE-NEXT:    movb %al, %dl
    566 ; SSE-NEXT:    shrb $7, %dl
    567 ; SSE-NEXT:    sarb $2, %al
    568 ; SSE-NEXT:    addb %dl, %al
    569 ; SSE-NEXT:    movzbl %al, %eax
    570 ; SSE-NEXT:    movd %eax, %xmm2
    571 ; SSE-NEXT:    imull $-109, %ebp, %eax
    572 ; SSE-NEXT:    shrl $8, %eax
    573 ; SSE-NEXT:    addb %bpl, %al
    574 ; SSE-NEXT:    movb %al, %dl
    575 ; SSE-NEXT:    shrb $7, %dl
    576 ; SSE-NEXT:    sarb $2, %al
    577 ; SSE-NEXT:    addb %dl, %al
    578 ; SSE-NEXT:    movzbl %al, %eax
    579 ; SSE-NEXT:    movd %eax, %xmm0
    580 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
    581 ; SSE-NEXT:    imull $-109, %r11d, %eax
    582 ; SSE-NEXT:    shrl $8, %eax
    583 ; SSE-NEXT:    addb %r11b, %al
    584 ; SSE-NEXT:    movb %al, %dl
    585 ; SSE-NEXT:    shrb $7, %dl
    586 ; SSE-NEXT:    sarb $2, %al
    587 ; SSE-NEXT:    addb %dl, %al
    588 ; SSE-NEXT:    movzbl %al, %eax
    589 ; SSE-NEXT:    movd %eax, %xmm3
    590 ; SSE-NEXT:    imull $-109, %ecx, %eax
    591 ; SSE-NEXT:    shrl $8, %eax
    592 ; SSE-NEXT:    addb %cl, %al
    593 ; SSE-NEXT:    movb %al, %cl
    594 ; SSE-NEXT:    shrb $7, %cl
    595 ; SSE-NEXT:    sarb $2, %al
    596 ; SSE-NEXT:    addb %cl, %al
    597 ; SSE-NEXT:    movzbl %al, %eax
    598 ; SSE-NEXT:    movd %eax, %xmm2
    599 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
    600 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
    601 ; SSE-NEXT:    imull $-109, %r9d, %eax
    602 ; SSE-NEXT:    shrl $8, %eax
    603 ; SSE-NEXT:    addb %r9b, %al
    604 ; SSE-NEXT:    movb %al, %cl
    605 ; SSE-NEXT:    shrb $7, %cl
    606 ; SSE-NEXT:    sarb $2, %al
    607 ; SSE-NEXT:    addb %cl, %al
    608 ; SSE-NEXT:    movzbl %al, %eax
    609 ; SSE-NEXT:    movd %eax, %xmm0
    610 ; SSE-NEXT:    imull $-109, %r10d, %eax
    611 ; SSE-NEXT:    shrl $8, %eax
    612 ; SSE-NEXT:    addb %r10b, %al
    613 ; SSE-NEXT:    movb %al, %cl
    614 ; SSE-NEXT:    shrb $7, %cl
    615 ; SSE-NEXT:    sarb $2, %al
    616 ; SSE-NEXT:    addb %cl, %al
    617 ; SSE-NEXT:    movzbl %al, %eax
    618 ; SSE-NEXT:    movd %eax, %xmm3
    619 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
    620 ; SSE-NEXT:    imull $-109, %r8d, %eax
    621 ; SSE-NEXT:    shrl $8, %eax
    622 ; SSE-NEXT:    addb %r8b, %al
    623 ; SSE-NEXT:    movb %al, %cl
    624 ; SSE-NEXT:    shrb $7, %cl
    625 ; SSE-NEXT:    sarb $2, %al
    626 ; SSE-NEXT:    addb %cl, %al
    627 ; SSE-NEXT:    movzbl %al, %eax
    628 ; SSE-NEXT:    movd %eax, %xmm4
    629 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
    630 ; SSE-NEXT:    imull $-109, %eax, %ecx
    631 ; SSE-NEXT:    shrl $8, %ecx
    632 ; SSE-NEXT:    addb %al, %cl
    633 ; SSE-NEXT:    movb %cl, %al
    634 ; SSE-NEXT:    shrb $7, %al
    635 ; SSE-NEXT:    sarb $2, %cl
    636 ; SSE-NEXT:    addb %al, %cl
    637 ; SSE-NEXT:    movzbl %cl, %eax
    638 ; SSE-NEXT:    movd %eax, %xmm0
    639 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
    640 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
    641 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
    642 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
    643 ; SSE-NEXT:    popq %rbx
    644 ; SSE-NEXT:    popq %r14
    645 ; SSE-NEXT:    popq %rbp
    646 ; SSE-NEXT:    retq
    647 ;
    648 ; AVX-LABEL: test7:
    649 ; AVX:       # BB#0:
    650 ; AVX-NEXT:    vpextrb $1, %xmm0, %eax
    651 ; AVX-NEXT:    movsbl %al, %eax
    652 ; AVX-NEXT:    imull $-109, %eax, %ecx
    653 ; AVX-NEXT:    shrl $8, %ecx
    654 ; AVX-NEXT:    addb %cl, %al
    655 ; AVX-NEXT:    movb %al, %cl
    656 ; AVX-NEXT:    shrb $7, %cl
    657 ; AVX-NEXT:    sarb $2, %al
    658 ; AVX-NEXT:    addb %cl, %al
    659 ; AVX-NEXT:    movzbl %al, %eax
    660 ; AVX-NEXT:    vpextrb $0, %xmm0, %ecx
    661 ; AVX-NEXT:    movsbl %cl, %ecx
    662 ; AVX-NEXT:    imull $-109, %ecx, %edx
    663 ; AVX-NEXT:    shrl $8, %edx
    664 ; AVX-NEXT:    addb %dl, %cl
    665 ; AVX-NEXT:    movb %cl, %dl
    666 ; AVX-NEXT:    shrb $7, %dl
    667 ; AVX-NEXT:    sarb $2, %cl
    668 ; AVX-NEXT:    addb %dl, %cl
    669 ; AVX-NEXT:    movzbl %cl, %ecx
    670 ; AVX-NEXT:    vmovd %ecx, %xmm1
    671 ; AVX-NEXT:    vpextrb $2, %xmm0, %ecx
    672 ; AVX-NEXT:    movsbl %cl, %ecx
    673 ; AVX-NEXT:    imull $-109, %ecx, %edx
    674 ; AVX-NEXT:    vpinsrb $1, %eax, %xmm1, %xmm1
    675 ; AVX-NEXT:    shrl $8, %edx
    676 ; AVX-NEXT:    addb %dl, %cl
    677 ; AVX-NEXT:    movb %cl, %al
    678 ; AVX-NEXT:    shrb $7, %al
    679 ; AVX-NEXT:    sarb $2, %cl
    680 ; AVX-NEXT:    addb %al, %cl
    681 ; AVX-NEXT:    movzbl %cl, %eax
    682 ; AVX-NEXT:    vpextrb $3, %xmm0, %ecx
    683 ; AVX-NEXT:    movsbl %cl, %ecx
    684 ; AVX-NEXT:    imull $-109, %ecx, %edx
    685 ; AVX-NEXT:    vpinsrb $2, %eax, %xmm1, %xmm1
    686 ; AVX-NEXT:    shrl $8, %edx
    687 ; AVX-NEXT:    addb %dl, %cl
    688 ; AVX-NEXT:    movb %cl, %al
    689 ; AVX-NEXT:    shrb $7, %al
    690 ; AVX-NEXT:    sarb $2, %cl
    691 ; AVX-NEXT:    addb %al, %cl
    692 ; AVX-NEXT:    movzbl %cl, %eax
    693 ; AVX-NEXT:    vpextrb $4, %xmm0, %ecx
    694 ; AVX-NEXT:    movsbl %cl, %ecx
    695 ; AVX-NEXT:    imull $-109, %ecx, %edx
    696 ; AVX-NEXT:    vpinsrb $3, %eax, %xmm1, %xmm1
    697 ; AVX-NEXT:    shrl $8, %edx
    698 ; AVX-NEXT:    addb %dl, %cl
    699 ; AVX-NEXT:    movb %cl, %al
    700 ; AVX-NEXT:    shrb $7, %al
    701 ; AVX-NEXT:    sarb $2, %cl
    702 ; AVX-NEXT:    addb %al, %cl
    703 ; AVX-NEXT:    movzbl %cl, %eax
    704 ; AVX-NEXT:    vpextrb $5, %xmm0, %ecx
    705 ; AVX-NEXT:    movsbl %cl, %ecx
    706 ; AVX-NEXT:    imull $-109, %ecx, %edx
    707 ; AVX-NEXT:    vpinsrb $4, %eax, %xmm1, %xmm1
    708 ; AVX-NEXT:    shrl $8, %edx
    709 ; AVX-NEXT:    addb %dl, %cl
    710 ; AVX-NEXT:    movb %cl, %al
    711 ; AVX-NEXT:    shrb $7, %al
    712 ; AVX-NEXT:    sarb $2, %cl
    713 ; AVX-NEXT:    addb %al, %cl
    714 ; AVX-NEXT:    movzbl %cl, %eax
    715 ; AVX-NEXT:    vpextrb $6, %xmm0, %ecx
    716 ; AVX-NEXT:    movsbl %cl, %ecx
    717 ; AVX-NEXT:    imull $-109, %ecx, %edx
    718 ; AVX-NEXT:    vpinsrb $5, %eax, %xmm1, %xmm1
    719 ; AVX-NEXT:    shrl $8, %edx
    720 ; AVX-NEXT:    addb %dl, %cl
    721 ; AVX-NEXT:    movb %cl, %al
    722 ; AVX-NEXT:    shrb $7, %al
    723 ; AVX-NEXT:    sarb $2, %cl
    724 ; AVX-NEXT:    addb %al, %cl
    725 ; AVX-NEXT:    movzbl %cl, %eax
    726 ; AVX-NEXT:    vpextrb $7, %xmm0, %ecx
    727 ; AVX-NEXT:    movsbl %cl, %ecx
    728 ; AVX-NEXT:    imull $-109, %ecx, %edx
    729 ; AVX-NEXT:    vpinsrb $6, %eax, %xmm1, %xmm1
    730 ; AVX-NEXT:    shrl $8, %edx
    731 ; AVX-NEXT:    addb %dl, %cl
    732 ; AVX-NEXT:    movb %cl, %al
    733 ; AVX-NEXT:    shrb $7, %al
    734 ; AVX-NEXT:    sarb $2, %cl
    735 ; AVX-NEXT:    addb %al, %cl
    736 ; AVX-NEXT:    movzbl %cl, %eax
    737 ; AVX-NEXT:    vpextrb $8, %xmm0, %ecx
    738 ; AVX-NEXT:    movsbl %cl, %ecx
    739 ; AVX-NEXT:    imull $-109, %ecx, %edx
    740 ; AVX-NEXT:    vpinsrb $7, %eax, %xmm1, %xmm1
    741 ; AVX-NEXT:    shrl $8, %edx
    742 ; AVX-NEXT:    addb %dl, %cl
    743 ; AVX-NEXT:    movb %cl, %al
    744 ; AVX-NEXT:    shrb $7, %al
    745 ; AVX-NEXT:    sarb $2, %cl
    746 ; AVX-NEXT:    addb %al, %cl
    747 ; AVX-NEXT:    movzbl %cl, %eax
    748 ; AVX-NEXT:    vpextrb $9, %xmm0, %ecx
    749 ; AVX-NEXT:    movsbl %cl, %ecx
    750 ; AVX-NEXT:    imull $-109, %ecx, %edx
    751 ; AVX-NEXT:    vpinsrb $8, %eax, %xmm1, %xmm1
    752 ; AVX-NEXT:    shrl $8, %edx
    753 ; AVX-NEXT:    addb %dl, %cl
    754 ; AVX-NEXT:    movb %cl, %al
    755 ; AVX-NEXT:    shrb $7, %al
    756 ; AVX-NEXT:    sarb $2, %cl
    757 ; AVX-NEXT:    addb %al, %cl
    758 ; AVX-NEXT:    movzbl %cl, %eax
    759 ; AVX-NEXT:    vpextrb $10, %xmm0, %ecx
    760 ; AVX-NEXT:    movsbl %cl, %ecx
    761 ; AVX-NEXT:    imull $-109, %ecx, %edx
    762 ; AVX-NEXT:    vpinsrb $9, %eax, %xmm1, %xmm1
    763 ; AVX-NEXT:    shrl $8, %edx
    764 ; AVX-NEXT:    addb %dl, %cl
    765 ; AVX-NEXT:    movb %cl, %al
    766 ; AVX-NEXT:    shrb $7, %al
    767 ; AVX-NEXT:    sarb $2, %cl
    768 ; AVX-NEXT:    addb %al, %cl
    769 ; AVX-NEXT:    movzbl %cl, %eax
    770 ; AVX-NEXT:    vpextrb $11, %xmm0, %ecx
    771 ; AVX-NEXT:    movsbl %cl, %ecx
    772 ; AVX-NEXT:    imull $-109, %ecx, %edx
    773 ; AVX-NEXT:    vpinsrb $10, %eax, %xmm1, %xmm1
    774 ; AVX-NEXT:    shrl $8, %edx
    775 ; AVX-NEXT:    addb %dl, %cl
    776 ; AVX-NEXT:    movb %cl, %al
    777 ; AVX-NEXT:    shrb $7, %al
    778 ; AVX-NEXT:    sarb $2, %cl
    779 ; AVX-NEXT:    addb %al, %cl
    780 ; AVX-NEXT:    movzbl %cl, %eax
    781 ; AVX-NEXT:    vpextrb $12, %xmm0, %ecx
    782 ; AVX-NEXT:    movsbl %cl, %ecx
    783 ; AVX-NEXT:    imull $-109, %ecx, %edx
    784 ; AVX-NEXT:    vpinsrb $11, %eax, %xmm1, %xmm1
    785 ; AVX-NEXT:    shrl $8, %edx
    786 ; AVX-NEXT:    addb %dl, %cl
    787 ; AVX-NEXT:    movb %cl, %al
    788 ; AVX-NEXT:    shrb $7, %al
    789 ; AVX-NEXT:    sarb $2, %cl
    790 ; AVX-NEXT:    addb %al, %cl
    791 ; AVX-NEXT:    movzbl %cl, %eax
    792 ; AVX-NEXT:    vpextrb $13, %xmm0, %ecx
    793 ; AVX-NEXT:    movsbl %cl, %ecx
    794 ; AVX-NEXT:    imull $-109, %ecx, %edx
    795 ; AVX-NEXT:    vpinsrb $12, %eax, %xmm1, %xmm1
    796 ; AVX-NEXT:    shrl $8, %edx
    797 ; AVX-NEXT:    addb %dl, %cl
    798 ; AVX-NEXT:    movb %cl, %al
    799 ; AVX-NEXT:    shrb $7, %al
    800 ; AVX-NEXT:    sarb $2, %cl
    801 ; AVX-NEXT:    addb %al, %cl
    802 ; AVX-NEXT:    movzbl %cl, %eax
    803 ; AVX-NEXT:    vpextrb $14, %xmm0, %ecx
    804 ; AVX-NEXT:    movsbl %cl, %ecx
    805 ; AVX-NEXT:    imull $-109, %ecx, %edx
    806 ; AVX-NEXT:    vpinsrb $13, %eax, %xmm1, %xmm1
    807 ; AVX-NEXT:    shrl $8, %edx
    808 ; AVX-NEXT:    addb %dl, %cl
    809 ; AVX-NEXT:    movb %cl, %al
    810 ; AVX-NEXT:    shrb $7, %al
    811 ; AVX-NEXT:    sarb $2, %cl
    812 ; AVX-NEXT:    addb %al, %cl
    813 ; AVX-NEXT:    movzbl %cl, %eax
    814 ; AVX-NEXT:    vpextrb $15, %xmm0, %ecx
    815 ; AVX-NEXT:    movsbl %cl, %ecx
    816 ; AVX-NEXT:    imull $-109, %ecx, %edx
    817 ; AVX-NEXT:    vpinsrb $14, %eax, %xmm1, %xmm0
    818 ; AVX-NEXT:    shrl $8, %edx
    819 ; AVX-NEXT:    addb %dl, %cl
    820 ; AVX-NEXT:    movb %cl, %al
    821 ; AVX-NEXT:    shrb $7, %al
    822 ; AVX-NEXT:    sarb $2, %cl
    823 ; AVX-NEXT:    addb %al, %cl
    824 ; AVX-NEXT:    movzbl %cl, %eax
    825 ; AVX-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
    826 ; AVX-NEXT:    retq
    827   %div = sdiv <16 x i8> %a, <i8 7, i8 7, i8 7, i8 7,i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7,i8 7, i8 7, i8 7, i8 7>
    828   ret <16 x i8> %div
    829 }
    830 
    831 define <4 x i32> @test8(<4 x i32> %a) #0 {
    832 ; SSE41-LABEL: test8:
    833 ; SSE41:       # BB#0:
    834 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027]
    835 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
    836 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
    837 ; SSE41-NEXT:    pmuldq %xmm2, %xmm3
    838 ; SSE41-NEXT:    pmuldq %xmm0, %xmm1
    839 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
    840 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]
    841 ; SSE41-NEXT:    paddd %xmm0, %xmm1
    842 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    843 ; SSE41-NEXT:    psrld $31, %xmm0
    844 ; SSE41-NEXT:    psrad $2, %xmm1
    845 ; SSE41-NEXT:    paddd %xmm0, %xmm1
    846 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    847 ; SSE41-NEXT:    retq
    848 ;
    849 ; SSE-LABEL: test8:
    850 ; SSE:       # BB#0:
    851 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027]
    852 ; SSE-NEXT:    movdqa %xmm0, %xmm2
    853 ; SSE-NEXT:    psrad $31, %xmm2
    854 ; SSE-NEXT:    pand %xmm1, %xmm2
    855 ; SSE-NEXT:    movdqa %xmm0, %xmm3
    856 ; SSE-NEXT:    pmuludq %xmm1, %xmm3
    857 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
    858 ; SSE-NEXT:    psrad $31, %xmm1
    859 ; SSE-NEXT:    pand %xmm0, %xmm1
    860 ; SSE-NEXT:    paddd %xmm1, %xmm2
    861 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3]
    862 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
    863 ; SSE-NEXT:    pmuludq %xmm4, %xmm3
    864 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]
    865 ; SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
    866 ; SSE-NEXT:    psubd %xmm2, %xmm1
    867 ; SSE-NEXT:    paddd %xmm0, %xmm1
    868 ; SSE-NEXT:    movdqa %xmm1, %xmm0
    869 ; SSE-NEXT:    psrld $31, %xmm0
    870 ; SSE-NEXT:    psrad $2, %xmm1
    871 ; SSE-NEXT:    paddd %xmm0, %xmm1
    872 ; SSE-NEXT:    movdqa %xmm1, %xmm0
    873 ; SSE-NEXT:    retq
    874 ;
    875 ; AVX-LABEL: test8:
    876 ; AVX:       # BB#0:
    877 ; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm1
    878 ; AVX-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
    879 ; AVX-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
    880 ; AVX-NEXT:    vpmuldq %xmm2, %xmm3, %xmm2
    881 ; AVX-NEXT:    vpmuldq %xmm1, %xmm0, %xmm1
    882 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
    883 ; AVX-NEXT:    vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]
    884 ; AVX-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
    885 ; AVX-NEXT:    vpsrld $31, %xmm0, %xmm1
    886 ; AVX-NEXT:    vpsrad $2, %xmm0, %xmm0
    887 ; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
    888 ; AVX-NEXT:    retq
    889   %div = sdiv <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7>
    890   ret <4 x i32> %div
    891 }
    892 
    893 define <8 x i32> @test9(<8 x i32> %a) #0 {
    894 ; SSE41-LABEL: test9:
    895 ; SSE41:       # BB#0:
    896 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2454267027,2454267027,2454267027,2454267027]
    897 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
    898 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
    899 ; SSE41-NEXT:    pmuldq %xmm4, %xmm5
    900 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
    901 ; SSE41-NEXT:    pmuldq %xmm3, %xmm2
    902 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
    903 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm5[2,3],xmm2[4,5],xmm5[6,7]
    904 ; SSE41-NEXT:    paddd %xmm0, %xmm2
    905 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
    906 ; SSE41-NEXT:    psrld $31, %xmm0
    907 ; SSE41-NEXT:    psrad $2, %xmm2
    908 ; SSE41-NEXT:    paddd %xmm0, %xmm2
    909 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
    910 ; SSE41-NEXT:    pmuldq %xmm4, %xmm0
    911 ; SSE41-NEXT:    pmuldq %xmm1, %xmm3
    912 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
    913 ; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm0[2,3],xmm3[4,5],xmm0[6,7]
    914 ; SSE41-NEXT:    paddd %xmm1, %xmm3
    915 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
    916 ; SSE41-NEXT:    psrld $31, %xmm0
    917 ; SSE41-NEXT:    psrad $2, %xmm3
    918 ; SSE41-NEXT:    paddd %xmm0, %xmm3
    919 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
    920 ; SSE41-NEXT:    movdqa %xmm3, %xmm1
    921 ; SSE41-NEXT:    retq
    922 ;
    923 ; SSE-LABEL: test9:
    924 ; SSE:       # BB#0:
    925 ; SSE-NEXT:    movdqa %xmm0, %xmm2
    926 ; SSE-NEXT:    movdqa {{.*#+}} xmm3 = [2454267027,2454267027,2454267027,2454267027]
    927 ; SSE-NEXT:    movdqa %xmm3, %xmm4
    928 ; SSE-NEXT:    psrad $31, %xmm4
    929 ; SSE-NEXT:    movdqa %xmm4, %xmm0
    930 ; SSE-NEXT:    pand %xmm2, %xmm0
    931 ; SSE-NEXT:    movdqa %xmm2, %xmm5
    932 ; SSE-NEXT:    psrad $31, %xmm5
    933 ; SSE-NEXT:    pand %xmm3, %xmm5
    934 ; SSE-NEXT:    paddd %xmm0, %xmm5
    935 ; SSE-NEXT:    movdqa %xmm2, %xmm0
    936 ; SSE-NEXT:    pmuludq %xmm3, %xmm0
    937 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
    938 ; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[1,1,3,3]
    939 ; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
    940 ; SSE-NEXT:    pmuludq %xmm6, %xmm7
    941 ; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,3,2,3]
    942 ; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1]
    943 ; SSE-NEXT:    psubd %xmm5, %xmm0
    944 ; SSE-NEXT:    paddd %xmm2, %xmm0
    945 ; SSE-NEXT:    movdqa %xmm0, %xmm2
    946 ; SSE-NEXT:    psrld $31, %xmm2
    947 ; SSE-NEXT:    psrad $2, %xmm0
    948 ; SSE-NEXT:    paddd %xmm2, %xmm0
    949 ; SSE-NEXT:    pand %xmm1, %xmm4
    950 ; SSE-NEXT:    movdqa %xmm1, %xmm5
    951 ; SSE-NEXT:    psrad $31, %xmm5
    952 ; SSE-NEXT:    pand %xmm3, %xmm5
    953 ; SSE-NEXT:    paddd %xmm4, %xmm5
    954 ; SSE-NEXT:    pmuludq %xmm1, %xmm3
    955 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,3,2,3]
    956 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
    957 ; SSE-NEXT:    pmuludq %xmm6, %xmm3
    958 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]
    959 ; SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
    960 ; SSE-NEXT:    psubd %xmm5, %xmm2
    961 ; SSE-NEXT:    paddd %xmm1, %xmm2
    962 ; SSE-NEXT:    movdqa %xmm2, %xmm1
    963 ; SSE-NEXT:    psrld $31, %xmm1
    964 ; SSE-NEXT:    psrad $2, %xmm2
    965 ; SSE-NEXT:    paddd %xmm1, %xmm2
    966 ; SSE-NEXT:    movdqa %xmm2, %xmm1
    967 ; SSE-NEXT:    retq
    968 ;
    969 ; AVX-LABEL: test9:
    970 ; AVX:       # BB#0:
    971 ; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm1
    972 ; AVX-NEXT:    vpshufd {{.*#+}} ymm2 = ymm1[1,1,3,3,5,5,7,7]
    973 ; AVX-NEXT:    vpshufd {{.*#+}} ymm3 = ymm0[1,1,3,3,5,5,7,7]
    974 ; AVX-NEXT:    vpmuldq %ymm2, %ymm3, %ymm2
    975 ; AVX-NEXT:    vpmuldq %ymm1, %ymm0, %ymm1
    976 ; AVX-NEXT:    vpshufd {{.*#+}} ymm1 = ymm1[1,1,3,3,5,5,7,7]
    977 ; AVX-NEXT:    vpblendd {{.*#+}} ymm1 = ymm1[0],ymm2[1],ymm1[2],ymm2[3],ymm1[4],ymm2[5],ymm1[6],ymm2[7]
    978 ; AVX-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
    979 ; AVX-NEXT:    vpsrld $31, %ymm0, %ymm1
    980 ; AVX-NEXT:    vpsrad $2, %ymm0, %ymm0
    981 ; AVX-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
    982 ; AVX-NEXT:    retq
    983   %div = sdiv <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7>
    984   ret <8 x i32> %div
    985 }
    986 
    987 define <8 x i32> @test10(<8 x i32> %a) #0 {
    988 ; SSE41-LABEL: test10:
    989 ; SSE41:       # BB#0:
    990 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]
    991 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
    992 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
    993 ; SSE41-NEXT:    pmuludq %xmm3, %xmm4
    994 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
    995 ; SSE41-NEXT:    pmuludq %xmm2, %xmm5
    996 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
    997 ; SSE41-NEXT:    pblendw {{.*#+}} xmm5 = xmm5[0,1],xmm4[2,3],xmm5[4,5],xmm4[6,7]
    998 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
    999 ; SSE41-NEXT:    psubd %xmm5, %xmm4
   1000 ; SSE41-NEXT:    psrld $1, %xmm4
   1001 ; SSE41-NEXT:    paddd %xmm5, %xmm4
   1002 ; SSE41-NEXT:    psrld $2, %xmm4
   1003 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [7,7,7,7]
   1004 ; SSE41-NEXT:    pmulld %xmm5, %xmm4
   1005 ; SSE41-NEXT:    psubd %xmm4, %xmm0
   1006 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
   1007 ; SSE41-NEXT:    pmuludq %xmm3, %xmm4
   1008 ; SSE41-NEXT:    pmuludq %xmm1, %xmm2
   1009 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
   1010 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]
   1011 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
   1012 ; SSE41-NEXT:    psubd %xmm2, %xmm3
   1013 ; SSE41-NEXT:    psrld $1, %xmm3
   1014 ; SSE41-NEXT:    paddd %xmm2, %xmm3
   1015 ; SSE41-NEXT:    psrld $2, %xmm3
   1016 ; SSE41-NEXT:    pmulld %xmm5, %xmm3
   1017 ; SSE41-NEXT:    psubd %xmm3, %xmm1
   1018 ; SSE41-NEXT:    retq
   1019 ;
   1020 ; SSE-LABEL: test10:
   1021 ; SSE:       # BB#0:
   1022 ; SSE-NEXT:    movdqa {{.*#+}} xmm3 = [613566757,613566757,613566757,613566757]
   1023 ; SSE-NEXT:    movdqa %xmm0, %xmm2
   1024 ; SSE-NEXT:    pmuludq %xmm3, %xmm2
   1025 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
   1026 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
   1027 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
   1028 ; SSE-NEXT:    pmuludq %xmm4, %xmm5
   1029 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,3,2,3]
   1030 ; SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
   1031 ; SSE-NEXT:    movdqa %xmm0, %xmm5
   1032 ; SSE-NEXT:    psubd %xmm2, %xmm5
   1033 ; SSE-NEXT:    psrld $1, %xmm5
   1034 ; SSE-NEXT:    paddd %xmm2, %xmm5
   1035 ; SSE-NEXT:    psrld $2, %xmm5
   1036 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [7,7,7,7]
   1037 ; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
   1038 ; SSE-NEXT:    pmuludq %xmm2, %xmm5
   1039 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
   1040 ; SSE-NEXT:    pmuludq %xmm2, %xmm6
   1041 ; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
   1042 ; SSE-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm6[0],xmm5[1],xmm6[1]
   1043 ; SSE-NEXT:    psubd %xmm5, %xmm0
   1044 ; SSE-NEXT:    pmuludq %xmm1, %xmm3
   1045 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]
   1046 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
   1047 ; SSE-NEXT:    pmuludq %xmm4, %xmm5
   1048 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,3,2,3]
   1049 ; SSE-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
   1050 ; SSE-NEXT:    movdqa %xmm1, %xmm4
   1051 ; SSE-NEXT:    psubd %xmm3, %xmm4
   1052 ; SSE-NEXT:    psrld $1, %xmm4
   1053 ; SSE-NEXT:    paddd %xmm3, %xmm4
   1054 ; SSE-NEXT:    psrld $2, %xmm4
   1055 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
   1056 ; SSE-NEXT:    pmuludq %xmm2, %xmm4
   1057 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
   1058 ; SSE-NEXT:    pmuludq %xmm2, %xmm3
   1059 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3]
   1060 ; SSE-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
   1061 ; SSE-NEXT:    psubd %xmm4, %xmm1
   1062 ; SSE-NEXT:    retq
   1063 ;
   1064 ; AVX-LABEL: test10:
   1065 ; AVX:       # BB#0:
   1066 ; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm1
   1067 ; AVX-NEXT:    vpshufd {{.*#+}} ymm2 = ymm1[1,1,3,3,5,5,7,7]
   1068 ; AVX-NEXT:    vpshufd {{.*#+}} ymm3 = ymm0[1,1,3,3,5,5,7,7]
   1069 ; AVX-NEXT:    vpmuludq %ymm2, %ymm3, %ymm2
   1070 ; AVX-NEXT:    vpmuludq %ymm1, %ymm0, %ymm1
   1071 ; AVX-NEXT:    vpshufd {{.*#+}} ymm1 = ymm1[1,1,3,3,5,5,7,7]
   1072 ; AVX-NEXT:    vpblendd {{.*#+}} ymm1 = ymm1[0],ymm2[1],ymm1[2],ymm2[3],ymm1[4],ymm2[5],ymm1[6],ymm2[7]
   1073 ; AVX-NEXT:    vpsubd %ymm1, %ymm0, %ymm2
   1074 ; AVX-NEXT:    vpsrld $1, %ymm2, %ymm2
   1075 ; AVX-NEXT:    vpaddd %ymm1, %ymm2, %ymm1
   1076 ; AVX-NEXT:    vpsrld $2, %ymm1, %ymm1
   1077 ; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm2
   1078 ; AVX-NEXT:    vpmulld %ymm2, %ymm1, %ymm1
   1079 ; AVX-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
   1080 ; AVX-NEXT:    retq
   1081   %rem = urem <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7>
   1082   ret <8 x i32> %rem
   1083 }
   1084 
   1085 define <8 x i32> @test11(<8 x i32> %a) #0 {
   1086 ; SSE41-LABEL: test11:
   1087 ; SSE41:       # BB#0:
   1088 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027]
   1089 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
   1090 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
   1091 ; SSE41-NEXT:    pmuldq %xmm3, %xmm4
   1092 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
   1093 ; SSE41-NEXT:    pmuldq %xmm2, %xmm5
   1094 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
   1095 ; SSE41-NEXT:    pblendw {{.*#+}} xmm5 = xmm5[0,1],xmm4[2,3],xmm5[4,5],xmm4[6,7]
   1096 ; SSE41-NEXT:    paddd %xmm0, %xmm5
   1097 ; SSE41-NEXT:    movdqa %xmm5, %xmm4
   1098 ; SSE41-NEXT:    psrld $31, %xmm4
   1099 ; SSE41-NEXT:    psrad $2, %xmm5
   1100 ; SSE41-NEXT:    paddd %xmm4, %xmm5
   1101 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [7,7,7,7]
   1102 ; SSE41-NEXT:    pmulld %xmm4, %xmm5
   1103 ; SSE41-NEXT:    psubd %xmm5, %xmm0
   1104 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
   1105 ; SSE41-NEXT:    pmuldq %xmm3, %xmm5
   1106 ; SSE41-NEXT:    pmuldq %xmm1, %xmm2
   1107 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
   1108 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm5[2,3],xmm2[4,5],xmm5[6,7]
   1109 ; SSE41-NEXT:    paddd %xmm1, %xmm2
   1110 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
   1111 ; SSE41-NEXT:    psrld $31, %xmm3
   1112 ; SSE41-NEXT:    psrad $2, %xmm2
   1113 ; SSE41-NEXT:    paddd %xmm3, %xmm2
   1114 ; SSE41-NEXT:    pmulld %xmm4, %xmm2
   1115 ; SSE41-NEXT:    psubd %xmm2, %xmm1
   1116 ; SSE41-NEXT:    retq
   1117 ;
   1118 ; SSE-LABEL: test11:
   1119 ; SSE:       # BB#0:
   1120 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027]
   1121 ; SSE-NEXT:    movdqa %xmm2, %xmm3
   1122 ; SSE-NEXT:    psrad $31, %xmm3
   1123 ; SSE-NEXT:    movdqa %xmm3, %xmm4
   1124 ; SSE-NEXT:    pand %xmm0, %xmm4
   1125 ; SSE-NEXT:    movdqa %xmm0, %xmm6
   1126 ; SSE-NEXT:    psrad $31, %xmm6
   1127 ; SSE-NEXT:    pand %xmm2, %xmm6
   1128 ; SSE-NEXT:    paddd %xmm4, %xmm6
   1129 ; SSE-NEXT:    movdqa %xmm0, %xmm4
   1130 ; SSE-NEXT:    pmuludq %xmm2, %xmm4
   1131 ; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[1,3,2,3]
   1132 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]
   1133 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
   1134 ; SSE-NEXT:    pmuludq %xmm5, %xmm4
   1135 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,3,2,3]
   1136 ; SSE-NEXT:    punpckldq {{.*#+}} xmm7 = xmm7[0],xmm4[0],xmm7[1],xmm4[1]
   1137 ; SSE-NEXT:    psubd %xmm6, %xmm7
   1138 ; SSE-NEXT:    paddd %xmm0, %xmm7
   1139 ; SSE-NEXT:    movdqa %xmm7, %xmm4
   1140 ; SSE-NEXT:    psrld $31, %xmm4
   1141 ; SSE-NEXT:    psrad $2, %xmm7
   1142 ; SSE-NEXT:    paddd %xmm4, %xmm7
   1143 ; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [7,7,7,7]
   1144 ; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
   1145 ; SSE-NEXT:    pmuludq %xmm4, %xmm7
   1146 ; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
   1147 ; SSE-NEXT:    pmuludq %xmm4, %xmm6
   1148 ; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
   1149 ; SSE-NEXT:    punpckldq {{.*#+}} xmm7 = xmm7[0],xmm6[0],xmm7[1],xmm6[1]
   1150 ; SSE-NEXT:    psubd %xmm7, %xmm0
   1151 ; SSE-NEXT:    pand %xmm1, %xmm3
   1152 ; SSE-NEXT:    movdqa %xmm1, %xmm6
   1153 ; SSE-NEXT:    psrad $31, %xmm6
   1154 ; SSE-NEXT:    pand %xmm2, %xmm6
   1155 ; SSE-NEXT:    paddd %xmm3, %xmm6
   1156 ; SSE-NEXT:    pmuludq %xmm1, %xmm2
   1157 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
   1158 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
   1159 ; SSE-NEXT:    pmuludq %xmm5, %xmm3
   1160 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]
   1161 ; SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
   1162 ; SSE-NEXT:    psubd %xmm6, %xmm2
   1163 ; SSE-NEXT:    paddd %xmm1, %xmm2
   1164 ; SSE-NEXT:    movdqa %xmm2, %xmm3
   1165 ; SSE-NEXT:    psrld $31, %xmm3
   1166 ; SSE-NEXT:    psrad $2, %xmm2
   1167 ; SSE-NEXT:    paddd %xmm3, %xmm2
   1168 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
   1169 ; SSE-NEXT:    pmuludq %xmm4, %xmm2
   1170 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
   1171 ; SSE-NEXT:    pmuludq %xmm4, %xmm3
   1172 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
   1173 ; SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
   1174 ; SSE-NEXT:    psubd %xmm2, %xmm1
   1175 ; SSE-NEXT:    retq
   1176 ;
   1177 ; AVX-LABEL: test11:
   1178 ; AVX:       # BB#0:
   1179 ; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm1
   1180 ; AVX-NEXT:    vpshufd {{.*#+}} ymm2 = ymm1[1,1,3,3,5,5,7,7]
   1181 ; AVX-NEXT:    vpshufd {{.*#+}} ymm3 = ymm0[1,1,3,3,5,5,7,7]
   1182 ; AVX-NEXT:    vpmuldq %ymm2, %ymm3, %ymm2
   1183 ; AVX-NEXT:    vpmuldq %ymm1, %ymm0, %ymm1
   1184 ; AVX-NEXT:    vpshufd {{.*#+}} ymm1 = ymm1[1,1,3,3,5,5,7,7]
   1185 ; AVX-NEXT:    vpblendd {{.*#+}} ymm1 = ymm1[0],ymm2[1],ymm1[2],ymm2[3],ymm1[4],ymm2[5],ymm1[6],ymm2[7]
   1186 ; AVX-NEXT:    vpaddd %ymm0, %ymm1, %ymm1
   1187 ; AVX-NEXT:    vpsrld $31, %ymm1, %ymm2
   1188 ; AVX-NEXT:    vpsrad $2, %ymm1, %ymm1
   1189 ; AVX-NEXT:    vpaddd %ymm2, %ymm1, %ymm1
   1190 ; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm2
   1191 ; AVX-NEXT:    vpmulld %ymm2, %ymm1, %ymm1
   1192 ; AVX-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
   1193 ; AVX-NEXT:    retq
   1194   %rem = srem <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7>
   1195   ret <8 x i32> %rem
   1196 }
   1197 
   1198 define <2 x i16> @test12() #0 {
   1199 ; SSE41-LABEL: test12:
   1200 ; SSE41:       # BB#0:
   1201 ; SSE41-NEXT:    xorps %xmm0, %xmm0
   1202 ; SSE41-NEXT:    retq
   1203 ;
   1204 ; SSE-LABEL: test12:
   1205 ; SSE:       # BB#0:
   1206 ; SSE-NEXT:    xorps %xmm0, %xmm0
   1207 ; SSE-NEXT:    retq
   1208 ;
   1209 ; AVX-LABEL: test12:
   1210 ; AVX:       # BB#0:
   1211 ; AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
   1212 ; AVX-NEXT:    retq
   1213   %I8 = insertelement <2 x i16> zeroinitializer, i16 -1, i32 0
   1214   %I9 = insertelement <2 x i16> %I8, i16 -1, i32 1
   1215   %B9 = urem <2 x i16> %I9, %I9
   1216   ret <2 x i16> %B9
   1217 }
   1218 
   1219 define <4 x i32> @PR20355(<4 x i32> %a) #0 {
   1220 ; SSE41-LABEL: PR20355:
   1221 ; SSE41:       # BB#0: # %entry
   1222 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [1431655766,1431655766,1431655766,1431655766]
   1223 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
   1224 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
   1225 ; SSE41-NEXT:    pmuldq %xmm2, %xmm3
   1226 ; SSE41-NEXT:    pmuldq %xmm1, %xmm0
   1227 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
   1228 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]
   1229 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
   1230 ; SSE41-NEXT:    psrld $31, %xmm0
   1231 ; SSE41-NEXT:    paddd %xmm1, %xmm0
   1232 ; SSE41-NEXT:    retq
   1233 ;
   1234 ; SSE-LABEL: PR20355:
   1235 ; SSE:       # BB#0: # %entry
   1236 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [1431655766,1431655766,1431655766,1431655766]
   1237 ; SSE-NEXT:    movdqa %xmm1, %xmm2
   1238 ; SSE-NEXT:    psrad $31, %xmm2
   1239 ; SSE-NEXT:    pand %xmm0, %xmm2
   1240 ; SSE-NEXT:    movdqa %xmm0, %xmm3
   1241 ; SSE-NEXT:    psrad $31, %xmm3
   1242 ; SSE-NEXT:    pand %xmm1, %xmm3
   1243 ; SSE-NEXT:    paddd %xmm2, %xmm3
   1244 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
   1245 ; SSE-NEXT:    pmuludq %xmm1, %xmm0
   1246 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,3,2,3]
   1247 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
   1248 ; SSE-NEXT:    pmuludq %xmm2, %xmm0
   1249 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
   1250 ; SSE-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1]
   1251 ; SSE-NEXT:    psubd %xmm3, %xmm4
   1252 ; SSE-NEXT:    movdqa %xmm4, %xmm0
   1253 ; SSE-NEXT:    psrld $31, %xmm0
   1254 ; SSE-NEXT:    paddd %xmm4, %xmm0
   1255 ; SSE-NEXT:    retq
   1256 ;
   1257 ; AVX-LABEL: PR20355:
   1258 ; AVX:       # BB#0: # %entry
   1259 ; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm1
   1260 ; AVX-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
   1261 ; AVX-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
   1262 ; AVX-NEXT:    vpmuldq %xmm2, %xmm3, %xmm2
   1263 ; AVX-NEXT:    vpmuldq %xmm1, %xmm0, %xmm0
   1264 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
   1265 ; AVX-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
   1266 ; AVX-NEXT:    vpsrld $31, %xmm0, %xmm1
   1267 ; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
   1268 ; AVX-NEXT:    retq
   1269 entry:
   1270   %sdiv = sdiv <4 x i32> %a, <i32 3, i32 3, i32 3, i32 3>
   1271   ret <4 x i32> %sdiv
   1272 }
   1273 
   1274 attributes #0 = { nounwind }
   1275