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