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