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=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
      4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
      5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 --check-prefix=AVX2NOBW
      6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 --check-prefix=AVX512BW
      7 
      8 ;
      9 ; udiv by 7
     10 ;
     11 
     12 define <2 x i64> @test_div7_2i64(<2 x i64> %a) nounwind {
     13 ; SSE2-LABEL: test_div7_2i64:
     14 ; SSE2:       # %bb.0:
     15 ; SSE2-NEXT:    movq %xmm0, %rcx
     16 ; SSE2-NEXT:    movabsq $2635249153387078803, %rsi # imm = 0x2492492492492493
     17 ; SSE2-NEXT:    movq %rcx, %rax
     18 ; SSE2-NEXT:    mulq %rsi
     19 ; SSE2-NEXT:    subq %rdx, %rcx
     20 ; SSE2-NEXT:    shrq %rcx
     21 ; SSE2-NEXT:    addq %rdx, %rcx
     22 ; SSE2-NEXT:    shrq $2, %rcx
     23 ; SSE2-NEXT:    movq %rcx, %xmm1
     24 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
     25 ; SSE2-NEXT:    movq %xmm0, %rcx
     26 ; SSE2-NEXT:    movq %rcx, %rax
     27 ; SSE2-NEXT:    mulq %rsi
     28 ; SSE2-NEXT:    subq %rdx, %rcx
     29 ; SSE2-NEXT:    shrq %rcx
     30 ; SSE2-NEXT:    addq %rdx, %rcx
     31 ; SSE2-NEXT:    shrq $2, %rcx
     32 ; SSE2-NEXT:    movq %rcx, %xmm0
     33 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
     34 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
     35 ; SSE2-NEXT:    retq
     36 ;
     37 ; SSE41-LABEL: test_div7_2i64:
     38 ; SSE41:       # %bb.0:
     39 ; SSE41-NEXT:    pextrq $1, %xmm0, %rcx
     40 ; SSE41-NEXT:    movabsq $2635249153387078803, %rsi # imm = 0x2492492492492493
     41 ; SSE41-NEXT:    movq %rcx, %rax
     42 ; SSE41-NEXT:    mulq %rsi
     43 ; SSE41-NEXT:    subq %rdx, %rcx
     44 ; SSE41-NEXT:    shrq %rcx
     45 ; SSE41-NEXT:    addq %rdx, %rcx
     46 ; SSE41-NEXT:    shrq $2, %rcx
     47 ; SSE41-NEXT:    movq %rcx, %xmm1
     48 ; SSE41-NEXT:    movq %xmm0, %rcx
     49 ; SSE41-NEXT:    movq %rcx, %rax
     50 ; SSE41-NEXT:    mulq %rsi
     51 ; SSE41-NEXT:    subq %rdx, %rcx
     52 ; SSE41-NEXT:    shrq %rcx
     53 ; SSE41-NEXT:    addq %rdx, %rcx
     54 ; SSE41-NEXT:    shrq $2, %rcx
     55 ; SSE41-NEXT:    movq %rcx, %xmm0
     56 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
     57 ; SSE41-NEXT:    retq
     58 ;
     59 ; AVX-LABEL: test_div7_2i64:
     60 ; AVX:       # %bb.0:
     61 ; AVX-NEXT:    vpextrq $1, %xmm0, %rcx
     62 ; AVX-NEXT:    movabsq $2635249153387078803, %rsi # imm = 0x2492492492492493
     63 ; AVX-NEXT:    movq %rcx, %rax
     64 ; AVX-NEXT:    mulq %rsi
     65 ; AVX-NEXT:    subq %rdx, %rcx
     66 ; AVX-NEXT:    shrq %rcx
     67 ; AVX-NEXT:    addq %rdx, %rcx
     68 ; AVX-NEXT:    shrq $2, %rcx
     69 ; AVX-NEXT:    vmovq %rcx, %xmm1
     70 ; AVX-NEXT:    vmovq %xmm0, %rcx
     71 ; AVX-NEXT:    movq %rcx, %rax
     72 ; AVX-NEXT:    mulq %rsi
     73 ; AVX-NEXT:    subq %rdx, %rcx
     74 ; AVX-NEXT:    shrq %rcx
     75 ; AVX-NEXT:    addq %rdx, %rcx
     76 ; AVX-NEXT:    shrq $2, %rcx
     77 ; AVX-NEXT:    vmovq %rcx, %xmm0
     78 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
     79 ; AVX-NEXT:    retq
     80   %res = udiv <2 x i64> %a, <i64 7, i64 7>
     81   ret <2 x i64> %res
     82 }
     83 
     84 define <4 x i32> @test_div7_4i32(<4 x i32> %a) nounwind {
     85 ; SSE2-LABEL: test_div7_4i32:
     86 ; SSE2:       # %bb.0:
     87 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757]
     88 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
     89 ; SSE2-NEXT:    pmuludq %xmm1, %xmm2
     90 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
     91 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
     92 ; SSE2-NEXT:    pmuludq %xmm1, %xmm3
     93 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3]
     94 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
     95 ; SSE2-NEXT:    psubd %xmm2, %xmm0
     96 ; SSE2-NEXT:    psrld $1, %xmm0
     97 ; SSE2-NEXT:    paddd %xmm2, %xmm0
     98 ; SSE2-NEXT:    psrld $2, %xmm0
     99 ; SSE2-NEXT:    retq
    100 ;
    101 ; SSE41-LABEL: test_div7_4i32:
    102 ; SSE41:       # %bb.0:
    103 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
    104 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]
    105 ; SSE41-NEXT:    pmuludq %xmm2, %xmm1
    106 ; SSE41-NEXT:    pmuludq %xmm0, %xmm2
    107 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
    108 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
    109 ; SSE41-NEXT:    psubd %xmm2, %xmm0
    110 ; SSE41-NEXT:    psrld $1, %xmm0
    111 ; SSE41-NEXT:    paddd %xmm2, %xmm0
    112 ; SSE41-NEXT:    psrld $2, %xmm0
    113 ; SSE41-NEXT:    retq
    114 ;
    115 ; AVX1-LABEL: test_div7_4i32:
    116 ; AVX1:       # %bb.0:
    117 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
    118 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]
    119 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm1, %xmm1
    120 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm0, %xmm2
    121 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
    122 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
    123 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
    124 ; AVX1-NEXT:    vpsrld $1, %xmm0, %xmm0
    125 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
    126 ; AVX1-NEXT:    vpsrld $2, %xmm0, %xmm0
    127 ; AVX1-NEXT:    retq
    128 ;
    129 ; AVX2-LABEL: test_div7_4i32:
    130 ; AVX2:       # %bb.0:
    131 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757]
    132 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
    133 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
    134 ; AVX2-NEXT:    vpmuludq %xmm2, %xmm3, %xmm2
    135 ; AVX2-NEXT:    vpmuludq %xmm1, %xmm0, %xmm1
    136 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
    137 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]
    138 ; AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
    139 ; AVX2-NEXT:    vpsrld $1, %xmm0, %xmm0
    140 ; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
    141 ; AVX2-NEXT:    vpsrld $2, %xmm0, %xmm0
    142 ; AVX2-NEXT:    retq
    143   %res = udiv <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7>
    144   ret <4 x i32> %res
    145 }
    146 
    147 define <8 x i16> @test_div7_8i16(<8 x i16> %a) nounwind {
    148 ; SSE-LABEL: test_div7_8i16:
    149 ; SSE:       # %bb.0:
    150 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [9363,9363,9363,9363,9363,9363,9363,9363]
    151 ; SSE-NEXT:    pmulhuw %xmm0, %xmm1
    152 ; SSE-NEXT:    psubw %xmm1, %xmm0
    153 ; SSE-NEXT:    psrlw $1, %xmm0
    154 ; SSE-NEXT:    paddw %xmm1, %xmm0
    155 ; SSE-NEXT:    psrlw $2, %xmm0
    156 ; SSE-NEXT:    retq
    157 ;
    158 ; AVX-LABEL: test_div7_8i16:
    159 ; AVX:       # %bb.0:
    160 ; AVX-NEXT:    vpmulhuw {{.*}}(%rip), %xmm0, %xmm1
    161 ; AVX-NEXT:    vpsubw %xmm1, %xmm0, %xmm0
    162 ; AVX-NEXT:    vpsrlw $1, %xmm0, %xmm0
    163 ; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
    164 ; AVX-NEXT:    vpsrlw $2, %xmm0, %xmm0
    165 ; AVX-NEXT:    retq
    166   %res = udiv <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
    167   ret <8 x i16> %res
    168 }
    169 
    170 define <16 x i8> @test_div7_16i8(<16 x i8> %a) nounwind {
    171 ; SSE2-LABEL: test_div7_16i8:
    172 ; SSE2:       # %bb.0:
    173 ; SSE2-NEXT:    pxor %xmm1, %xmm1
    174 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
    175 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
    176 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0]
    177 ; SSE2-NEXT:    pmullw %xmm3, %xmm2
    178 ; SSE2-NEXT:    psrlw $8, %xmm2
    179 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
    180 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3],xmm4[4],xmm1[4],xmm4[5],xmm1[5],xmm4[6],xmm1[6],xmm4[7],xmm1[7]
    181 ; SSE2-NEXT:    pmullw %xmm3, %xmm4
    182 ; SSE2-NEXT:    psrlw $8, %xmm4
    183 ; SSE2-NEXT:    packuswb %xmm2, %xmm4
    184 ; SSE2-NEXT:    psubb %xmm4, %xmm0
    185 ; SSE2-NEXT:    psrlw $1, %xmm0
    186 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
    187 ; SSE2-NEXT:    paddb %xmm4, %xmm0
    188 ; SSE2-NEXT:    psrlw $2, %xmm0
    189 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
    190 ; SSE2-NEXT:    retq
    191 ;
    192 ; SSE41-LABEL: test_div7_16i8:
    193 ; SSE41:       # %bb.0:
    194 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
    195 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [37,37,37,37,37,37,37,37]
    196 ; SSE41-NEXT:    pmullw %xmm2, %xmm1
    197 ; SSE41-NEXT:    psrlw $8, %xmm1
    198 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,0,1]
    199 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
    200 ; SSE41-NEXT:    pmullw %xmm2, %xmm3
    201 ; SSE41-NEXT:    psrlw $8, %xmm3
    202 ; SSE41-NEXT:    packuswb %xmm3, %xmm1
    203 ; SSE41-NEXT:    psubb %xmm1, %xmm0
    204 ; SSE41-NEXT:    psrlw $1, %xmm0
    205 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm0
    206 ; SSE41-NEXT:    paddb %xmm1, %xmm0
    207 ; SSE41-NEXT:    psrlw $2, %xmm0
    208 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm0
    209 ; SSE41-NEXT:    retq
    210 ;
    211 ; AVX1-LABEL: test_div7_16i8:
    212 ; AVX1:       # %bb.0:
    213 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
    214 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [37,37,37,37,37,37,37,37]
    215 ; AVX1-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
    216 ; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1
    217 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[2,3,0,1]
    218 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
    219 ; AVX1-NEXT:    vpmullw %xmm2, %xmm3, %xmm2
    220 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
    221 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
    222 ; AVX1-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
    223 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm0
    224 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
    225 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
    226 ; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm0
    227 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
    228 ; AVX1-NEXT:    retq
    229 ;
    230 ; AVX2NOBW-LABEL: test_div7_16i8:
    231 ; AVX2NOBW:       # %bb.0:
    232 ; AVX2NOBW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
    233 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
    234 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm1, %ymm1
    235 ; AVX2NOBW-NEXT:    vextracti128 $1, %ymm1, %xmm2
    236 ; AVX2NOBW-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
    237 ; AVX2NOBW-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
    238 ; AVX2NOBW-NEXT:    vpsrlw $1, %xmm0, %xmm0
    239 ; AVX2NOBW-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
    240 ; AVX2NOBW-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
    241 ; AVX2NOBW-NEXT:    vpsrlw $2, %xmm0, %xmm0
    242 ; AVX2NOBW-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
    243 ; AVX2NOBW-NEXT:    vzeroupper
    244 ; AVX2NOBW-NEXT:    retq
    245 ;
    246 ; AVX512BW-LABEL: test_div7_16i8:
    247 ; AVX512BW:       # %bb.0:
    248 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
    249 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
    250 ; AVX512BW-NEXT:    vpsrlw $8, %ymm1, %ymm1
    251 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
    252 ; AVX512BW-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
    253 ; AVX512BW-NEXT:    vpsrlw $1, %xmm0, %xmm0
    254 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
    255 ; AVX512BW-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
    256 ; AVX512BW-NEXT:    vpsrlw $2, %xmm0, %xmm0
    257 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
    258 ; AVX512BW-NEXT:    vzeroupper
    259 ; AVX512BW-NEXT:    retq
    260   %res = udiv <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>
    261   ret <16 x i8> %res
    262 }
    263 
    264 ;
    265 ; urem by 7
    266 ;
    267 
    268 define <2 x i64> @test_rem7_2i64(<2 x i64> %a) nounwind {
    269 ; SSE2-LABEL: test_rem7_2i64:
    270 ; SSE2:       # %bb.0:
    271 ; SSE2-NEXT:    movq %xmm0, %rcx
    272 ; SSE2-NEXT:    movabsq $2635249153387078803, %rsi # imm = 0x2492492492492493
    273 ; SSE2-NEXT:    movq %rcx, %rax
    274 ; SSE2-NEXT:    mulq %rsi
    275 ; SSE2-NEXT:    movq %rcx, %rax
    276 ; SSE2-NEXT:    subq %rdx, %rax
    277 ; SSE2-NEXT:    shrq %rax
    278 ; SSE2-NEXT:    addq %rdx, %rax
    279 ; SSE2-NEXT:    shrq $2, %rax
    280 ; SSE2-NEXT:    leaq (,%rax,8), %rdx
    281 ; SSE2-NEXT:    subq %rdx, %rax
    282 ; SSE2-NEXT:    addq %rcx, %rax
    283 ; SSE2-NEXT:    movq %rax, %xmm1
    284 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
    285 ; SSE2-NEXT:    movq %xmm0, %rcx
    286 ; SSE2-NEXT:    movq %rcx, %rax
    287 ; SSE2-NEXT:    mulq %rsi
    288 ; SSE2-NEXT:    movq %rcx, %rax
    289 ; SSE2-NEXT:    subq %rdx, %rax
    290 ; SSE2-NEXT:    shrq %rax
    291 ; SSE2-NEXT:    addq %rdx, %rax
    292 ; SSE2-NEXT:    shrq $2, %rax
    293 ; SSE2-NEXT:    leaq (,%rax,8), %rdx
    294 ; SSE2-NEXT:    subq %rdx, %rax
    295 ; SSE2-NEXT:    addq %rcx, %rax
    296 ; SSE2-NEXT:    movq %rax, %xmm0
    297 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
    298 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
    299 ; SSE2-NEXT:    retq
    300 ;
    301 ; SSE41-LABEL: test_rem7_2i64:
    302 ; SSE41:       # %bb.0:
    303 ; SSE41-NEXT:    pextrq $1, %xmm0, %rcx
    304 ; SSE41-NEXT:    movabsq $2635249153387078803, %rsi # imm = 0x2492492492492493
    305 ; SSE41-NEXT:    movq %rcx, %rax
    306 ; SSE41-NEXT:    mulq %rsi
    307 ; SSE41-NEXT:    movq %rcx, %rax
    308 ; SSE41-NEXT:    subq %rdx, %rax
    309 ; SSE41-NEXT:    shrq %rax
    310 ; SSE41-NEXT:    addq %rdx, %rax
    311 ; SSE41-NEXT:    shrq $2, %rax
    312 ; SSE41-NEXT:    leaq (,%rax,8), %rdx
    313 ; SSE41-NEXT:    subq %rdx, %rax
    314 ; SSE41-NEXT:    addq %rcx, %rax
    315 ; SSE41-NEXT:    movq %rax, %xmm1
    316 ; SSE41-NEXT:    movq %xmm0, %rcx
    317 ; SSE41-NEXT:    movq %rcx, %rax
    318 ; SSE41-NEXT:    mulq %rsi
    319 ; SSE41-NEXT:    movq %rcx, %rax
    320 ; SSE41-NEXT:    subq %rdx, %rax
    321 ; SSE41-NEXT:    shrq %rax
    322 ; SSE41-NEXT:    addq %rdx, %rax
    323 ; SSE41-NEXT:    shrq $2, %rax
    324 ; SSE41-NEXT:    leaq (,%rax,8), %rdx
    325 ; SSE41-NEXT:    subq %rdx, %rax
    326 ; SSE41-NEXT:    addq %rcx, %rax
    327 ; SSE41-NEXT:    movq %rax, %xmm0
    328 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
    329 ; SSE41-NEXT:    retq
    330 ;
    331 ; AVX-LABEL: test_rem7_2i64:
    332 ; AVX:       # %bb.0:
    333 ; AVX-NEXT:    vpextrq $1, %xmm0, %rcx
    334 ; AVX-NEXT:    movabsq $2635249153387078803, %rsi # imm = 0x2492492492492493
    335 ; AVX-NEXT:    movq %rcx, %rax
    336 ; AVX-NEXT:    mulq %rsi
    337 ; AVX-NEXT:    movq %rcx, %rax
    338 ; AVX-NEXT:    subq %rdx, %rax
    339 ; AVX-NEXT:    shrq %rax
    340 ; AVX-NEXT:    addq %rdx, %rax
    341 ; AVX-NEXT:    shrq $2, %rax
    342 ; AVX-NEXT:    leaq (,%rax,8), %rdx
    343 ; AVX-NEXT:    subq %rdx, %rax
    344 ; AVX-NEXT:    addq %rcx, %rax
    345 ; AVX-NEXT:    vmovq %rax, %xmm1
    346 ; AVX-NEXT:    vmovq %xmm0, %rcx
    347 ; AVX-NEXT:    movq %rcx, %rax
    348 ; AVX-NEXT:    mulq %rsi
    349 ; AVX-NEXT:    movq %rcx, %rax
    350 ; AVX-NEXT:    subq %rdx, %rax
    351 ; AVX-NEXT:    shrq %rax
    352 ; AVX-NEXT:    addq %rdx, %rax
    353 ; AVX-NEXT:    shrq $2, %rax
    354 ; AVX-NEXT:    leaq (,%rax,8), %rdx
    355 ; AVX-NEXT:    subq %rdx, %rax
    356 ; AVX-NEXT:    addq %rcx, %rax
    357 ; AVX-NEXT:    vmovq %rax, %xmm0
    358 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
    359 ; AVX-NEXT:    retq
    360   %res = urem <2 x i64> %a, <i64 7, i64 7>
    361   ret <2 x i64> %res
    362 }
    363 
    364 define <4 x i32> @test_rem7_4i32(<4 x i32> %a) nounwind {
    365 ; SSE2-LABEL: test_rem7_4i32:
    366 ; SSE2:       # %bb.0:
    367 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757]
    368 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
    369 ; SSE2-NEXT:    pmuludq %xmm1, %xmm2
    370 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
    371 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
    372 ; SSE2-NEXT:    pmuludq %xmm1, %xmm3
    373 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3]
    374 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
    375 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
    376 ; SSE2-NEXT:    psubd %xmm2, %xmm1
    377 ; SSE2-NEXT:    psrld $1, %xmm1
    378 ; SSE2-NEXT:    paddd %xmm2, %xmm1
    379 ; SSE2-NEXT:    psrld $2, %xmm1
    380 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [7,7,7,7]
    381 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
    382 ; SSE2-NEXT:    pmuludq %xmm2, %xmm1
    383 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
    384 ; SSE2-NEXT:    pmuludq %xmm2, %xmm3
    385 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3]
    386 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
    387 ; SSE2-NEXT:    psubd %xmm1, %xmm0
    388 ; SSE2-NEXT:    retq
    389 ;
    390 ; SSE41-LABEL: test_rem7_4i32:
    391 ; SSE41:       # %bb.0:
    392 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
    393 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]
    394 ; SSE41-NEXT:    pmuludq %xmm2, %xmm1
    395 ; SSE41-NEXT:    pmuludq %xmm0, %xmm2
    396 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
    397 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
    398 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
    399 ; SSE41-NEXT:    psubd %xmm2, %xmm1
    400 ; SSE41-NEXT:    psrld $1, %xmm1
    401 ; SSE41-NEXT:    paddd %xmm2, %xmm1
    402 ; SSE41-NEXT:    psrld $2, %xmm1
    403 ; SSE41-NEXT:    pmulld {{.*}}(%rip), %xmm1
    404 ; SSE41-NEXT:    psubd %xmm1, %xmm0
    405 ; SSE41-NEXT:    retq
    406 ;
    407 ; AVX1-LABEL: test_rem7_4i32:
    408 ; AVX1:       # %bb.0:
    409 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
    410 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]
    411 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm1, %xmm1
    412 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm0, %xmm2
    413 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
    414 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
    415 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm2
    416 ; AVX1-NEXT:    vpsrld $1, %xmm2, %xmm2
    417 ; AVX1-NEXT:    vpaddd %xmm1, %xmm2, %xmm1
    418 ; AVX1-NEXT:    vpsrld $2, %xmm1, %xmm1
    419 ; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm1, %xmm1
    420 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
    421 ; AVX1-NEXT:    retq
    422 ;
    423 ; AVX2-LABEL: test_rem7_4i32:
    424 ; AVX2:       # %bb.0:
    425 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757]
    426 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
    427 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
    428 ; AVX2-NEXT:    vpmuludq %xmm2, %xmm3, %xmm2
    429 ; AVX2-NEXT:    vpmuludq %xmm1, %xmm0, %xmm1
    430 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
    431 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]
    432 ; AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm2
    433 ; AVX2-NEXT:    vpsrld $1, %xmm2, %xmm2
    434 ; AVX2-NEXT:    vpaddd %xmm1, %xmm2, %xmm1
    435 ; AVX2-NEXT:    vpsrld $2, %xmm1, %xmm1
    436 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [7,7,7,7]
    437 ; AVX2-NEXT:    vpmulld %xmm2, %xmm1, %xmm1
    438 ; AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
    439 ; AVX2-NEXT:    retq
    440   %res = urem <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7>
    441   ret <4 x i32> %res
    442 }
    443 
    444 define <8 x i16> @test_rem7_8i16(<8 x i16> %a) nounwind {
    445 ; SSE-LABEL: test_rem7_8i16:
    446 ; SSE:       # %bb.0:
    447 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [9363,9363,9363,9363,9363,9363,9363,9363]
    448 ; SSE-NEXT:    pmulhuw %xmm0, %xmm1
    449 ; SSE-NEXT:    movdqa %xmm0, %xmm2
    450 ; SSE-NEXT:    psubw %xmm1, %xmm2
    451 ; SSE-NEXT:    psrlw $1, %xmm2
    452 ; SSE-NEXT:    paddw %xmm1, %xmm2
    453 ; SSE-NEXT:    psrlw $2, %xmm2
    454 ; SSE-NEXT:    pmullw {{.*}}(%rip), %xmm2
    455 ; SSE-NEXT:    psubw %xmm2, %xmm0
    456 ; SSE-NEXT:    retq
    457 ;
    458 ; AVX-LABEL: test_rem7_8i16:
    459 ; AVX:       # %bb.0:
    460 ; AVX-NEXT:    vpmulhuw {{.*}}(%rip), %xmm0, %xmm1
    461 ; AVX-NEXT:    vpsubw %xmm1, %xmm0, %xmm2
    462 ; AVX-NEXT:    vpsrlw $1, %xmm2, %xmm2
    463 ; AVX-NEXT:    vpaddw %xmm1, %xmm2, %xmm1
    464 ; AVX-NEXT:    vpsrlw $2, %xmm1, %xmm1
    465 ; AVX-NEXT:    vpmullw {{.*}}(%rip), %xmm1, %xmm1
    466 ; AVX-NEXT:    vpsubw %xmm1, %xmm0, %xmm0
    467 ; AVX-NEXT:    retq
    468   %res = urem <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
    469   ret <8 x i16> %res
    470 }
    471 
    472 define <16 x i8> @test_rem7_16i8(<16 x i8> %a) nounwind {
    473 ; SSE2-LABEL: test_rem7_16i8:
    474 ; SSE2:       # %bb.0:
    475 ; SSE2-NEXT:    pxor %xmm1, %xmm1
    476 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
    477 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
    478 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0]
    479 ; SSE2-NEXT:    pmullw %xmm3, %xmm2
    480 ; SSE2-NEXT:    psrlw $8, %xmm2
    481 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
    482 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3],xmm4[4],xmm1[4],xmm4[5],xmm1[5],xmm4[6],xmm1[6],xmm4[7],xmm1[7]
    483 ; SSE2-NEXT:    pmullw %xmm3, %xmm4
    484 ; SSE2-NEXT:    psrlw $8, %xmm4
    485 ; SSE2-NEXT:    packuswb %xmm2, %xmm4
    486 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
    487 ; SSE2-NEXT:    psubb %xmm4, %xmm1
    488 ; SSE2-NEXT:    psrlw $1, %xmm1
    489 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
    490 ; SSE2-NEXT:    paddb %xmm4, %xmm1
    491 ; SSE2-NEXT:    psrlw $2, %xmm1
    492 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
    493 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
    494 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
    495 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
    496 ; SSE2-NEXT:    pmullw %xmm3, %xmm2
    497 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
    498 ; SSE2-NEXT:    pand %xmm4, %xmm2
    499 ; SSE2-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]
    500 ; SSE2-NEXT:    pmullw %xmm3, %xmm1
    501 ; SSE2-NEXT:    pand %xmm4, %xmm1
    502 ; SSE2-NEXT:    packuswb %xmm2, %xmm1
    503 ; SSE2-NEXT:    psubb %xmm1, %xmm0
    504 ; SSE2-NEXT:    retq
    505 ;
    506 ; SSE41-LABEL: test_rem7_16i8:
    507 ; SSE41:       # %bb.0:
    508 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
    509 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [37,37,37,37,37,37,37,37]
    510 ; SSE41-NEXT:    pmullw %xmm2, %xmm1
    511 ; SSE41-NEXT:    psrlw $8, %xmm1
    512 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,0,1]
    513 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
    514 ; SSE41-NEXT:    pmullw %xmm2, %xmm3
    515 ; SSE41-NEXT:    psrlw $8, %xmm3
    516 ; SSE41-NEXT:    packuswb %xmm3, %xmm1
    517 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
    518 ; SSE41-NEXT:    psubb %xmm1, %xmm2
    519 ; SSE41-NEXT:    psrlw $1, %xmm2
    520 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm2
    521 ; SSE41-NEXT:    paddb %xmm1, %xmm2
    522 ; SSE41-NEXT:    psrlw $2, %xmm2
    523 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm2
    524 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm1 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
    525 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    526 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
    527 ; SSE41-NEXT:    pmullw %xmm3, %xmm2
    528 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
    529 ; SSE41-NEXT:    pand %xmm4, %xmm2
    530 ; SSE41-NEXT:    pmullw %xmm3, %xmm1
    531 ; SSE41-NEXT:    pand %xmm4, %xmm1
    532 ; SSE41-NEXT:    packuswb %xmm2, %xmm1
    533 ; SSE41-NEXT:    psubb %xmm1, %xmm0
    534 ; SSE41-NEXT:    retq
    535 ;
    536 ; AVX1-LABEL: test_rem7_16i8:
    537 ; AVX1:       # %bb.0:
    538 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
    539 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [37,37,37,37,37,37,37,37]
    540 ; AVX1-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
    541 ; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1
    542 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[2,3,0,1]
    543 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
    544 ; AVX1-NEXT:    vpmullw %xmm2, %xmm3, %xmm2
    545 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
    546 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
    547 ; AVX1-NEXT:    vpsubb %xmm1, %xmm0, %xmm2
    548 ; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm2
    549 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
    550 ; AVX1-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
    551 ; AVX1-NEXT:    vpsrlw $2, %xmm1, %xmm1
    552 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
    553 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    554 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
    555 ; AVX1-NEXT:    vpmullw %xmm3, %xmm2, %xmm2
    556 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
    557 ; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
    558 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
    559 ; AVX1-NEXT:    vpmullw %xmm3, %xmm1, %xmm1
    560 ; AVX1-NEXT:    vpand %xmm4, %xmm1, %xmm1
    561 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
    562 ; AVX1-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
    563 ; AVX1-NEXT:    retq
    564 ;
    565 ; AVX2NOBW-LABEL: test_rem7_16i8:
    566 ; AVX2NOBW:       # %bb.0:
    567 ; AVX2NOBW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
    568 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
    569 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm1, %ymm1
    570 ; AVX2NOBW-NEXT:    vextracti128 $1, %ymm1, %xmm2
    571 ; AVX2NOBW-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
    572 ; AVX2NOBW-NEXT:    vpsubb %xmm1, %xmm0, %xmm2
    573 ; AVX2NOBW-NEXT:    vpsrlw $1, %xmm2, %xmm2
    574 ; AVX2NOBW-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
    575 ; AVX2NOBW-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
    576 ; AVX2NOBW-NEXT:    vpsrlw $2, %xmm1, %xmm1
    577 ; AVX2NOBW-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
    578 ; AVX2NOBW-NEXT:    vpmovsxbw %xmm1, %ymm1
    579 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
    580 ; AVX2NOBW-NEXT:    vextracti128 $1, %ymm1, %xmm2
    581 ; AVX2NOBW-NEXT:    vmovdqa {{.*#+}} xmm3 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
    582 ; AVX2NOBW-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
    583 ; AVX2NOBW-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
    584 ; AVX2NOBW-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
    585 ; AVX2NOBW-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
    586 ; AVX2NOBW-NEXT:    vzeroupper
    587 ; AVX2NOBW-NEXT:    retq
    588 ;
    589 ; AVX512BW-LABEL: test_rem7_16i8:
    590 ; AVX512BW:       # %bb.0:
    591 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
    592 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
    593 ; AVX512BW-NEXT:    vpsrlw $8, %ymm1, %ymm1
    594 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
    595 ; AVX512BW-NEXT:    vpsubb %xmm1, %xmm0, %xmm2
    596 ; AVX512BW-NEXT:    vpsrlw $1, %xmm2, %xmm2
    597 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
    598 ; AVX512BW-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
    599 ; AVX512BW-NEXT:    vpsrlw $2, %xmm1, %xmm1
    600 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
    601 ; AVX512BW-NEXT:    vpmovsxbw %xmm1, %ymm1
    602 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
    603 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
    604 ; AVX512BW-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
    605 ; AVX512BW-NEXT:    vzeroupper
    606 ; AVX512BW-NEXT:    retq
    607   %res = urem <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>
    608   ret <16 x i8> %res
    609 }
    610