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-apple-darwin -mattr=+avx512f | FileCheck %s --check-prefix=ALL --check-prefix=KNL
      3 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f -mattr=+avx512vl -mattr=+avx512bw -mattr=+avx512dq | FileCheck %s --check-prefix=ALL --check-prefix=SKX
      4 
      5  attributes #0 = { nounwind }
      6 
      7 define <16 x i8> @trunc_16x32_to_16x8(<16 x i32> %i) #0 {
      8 ; ALL-LABEL: trunc_16x32_to_16x8:
      9 ; ALL:       ## BB#0:
     10 ; ALL-NEXT:    vpmovdb %zmm0, %xmm0
     11 ; ALL-NEXT:    retq
     12   %x = trunc <16 x i32> %i to <16 x i8>
     13   ret <16 x i8> %x
     14 }
     15 
     16 define <8 x i16> @trunc_8x64_to_8x16(<8 x i64> %i) #0 {
     17 ; ALL-LABEL: trunc_8x64_to_8x16:
     18 ; ALL:       ## BB#0:
     19 ; ALL-NEXT:    vpmovqw %zmm0, %xmm0
     20 ; ALL-NEXT:    retq
     21   %x = trunc <8 x i64> %i to <8 x i16>
     22   ret <8 x i16> %x
     23 }
     24 
     25 define <16 x i16> @trunc_v16i32_to_v16i16(<16 x i32> %x) #0 {
     26 ; ALL-LABEL: trunc_v16i32_to_v16i16:
     27 ; ALL:       ## BB#0:
     28 ; ALL-NEXT:    vpmovdw %zmm0, %ymm0
     29 ; ALL-NEXT:    retq
     30   %1 = trunc <16 x i32> %x to <16 x i16>
     31   ret <16 x i16> %1
     32 }
     33 
     34 define <8 x i8> @trunc_qb_512(<8 x i64> %i) #0 {
     35 ; ALL-LABEL: trunc_qb_512:
     36 ; ALL:       ## BB#0:
     37 ; ALL-NEXT:    vpmovqw %zmm0, %xmm0
     38 ; ALL-NEXT:    retq
     39   %x = trunc <8 x i64> %i to <8 x i8>
     40   ret <8 x i8> %x
     41 }
     42 
     43 define void @trunc_qb_512_mem(<8 x i64> %i, <8 x i8>* %res) #0 {
     44 ; ALL-LABEL: trunc_qb_512_mem:
     45 ; ALL:       ## BB#0:
     46 ; ALL-NEXT:    vpmovqb %zmm0, (%rdi)
     47 ; ALL-NEXT:    retq
     48     %x = trunc <8 x i64> %i to <8 x i8>
     49     store <8 x i8> %x, <8 x i8>* %res
     50     ret void
     51 }
     52 
     53 define <4 x i8> @trunc_qb_256(<4 x i64> %i) #0 {
     54 ; KNL-LABEL: trunc_qb_256:
     55 ; KNL:       ## BB#0:
     56 ; KNL-NEXT:    vpmovqd %zmm0, %ymm0
     57 ; KNL-NEXT:    retq
     58 ;
     59 ; SKX-LABEL: trunc_qb_256:
     60 ; SKX:       ## BB#0:
     61 ; SKX-NEXT:    vpmovqd %ymm0, %xmm0
     62 ; SKX-NEXT:    retq
     63   %x = trunc <4 x i64> %i to <4 x i8>
     64   ret <4 x i8> %x
     65 }
     66 
     67 define void @trunc_qb_256_mem(<4 x i64> %i, <4 x i8>* %res) #0 {
     68 ; KNL-LABEL: trunc_qb_256_mem:
     69 ; KNL:       ## BB#0:
     70 ; KNL-NEXT:    vpmovqd %zmm0, %ymm0
     71 ; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
     72 ; KNL-NEXT:    vmovd %xmm0, (%rdi)
     73 ; KNL-NEXT:    retq
     74 ;
     75 ; SKX-LABEL: trunc_qb_256_mem:
     76 ; SKX:       ## BB#0:
     77 ; SKX-NEXT:    vpmovqb %ymm0, (%rdi)
     78 ; SKX-NEXT:    retq
     79     %x = trunc <4 x i64> %i to <4 x i8>
     80     store <4 x i8> %x, <4 x i8>* %res
     81     ret void
     82 }
     83 
     84 define <2 x i8> @trunc_qb_128(<2 x i64> %i) #0 {
     85 ; ALL-LABEL: trunc_qb_128:
     86 ; ALL:       ## BB#0:
     87 ; ALL-NEXT:    retq
     88   %x = trunc <2 x i64> %i to <2 x i8>
     89   ret <2 x i8> %x
     90 }
     91 
     92 define void @trunc_qb_128_mem(<2 x i64> %i, <2 x i8>* %res) #0 {
     93 ; KNL-LABEL: trunc_qb_128_mem:
     94 ; KNL:       ## BB#0:
     95 ; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
     96 ; KNL-NEXT:    vmovd %xmm0, %eax
     97 ; KNL-NEXT:    movw %ax, (%rdi)
     98 ; KNL-NEXT:    retq
     99 ;
    100 ; SKX-LABEL: trunc_qb_128_mem:
    101 ; SKX:       ## BB#0:
    102 ; SKX-NEXT:    vpmovqb %xmm0, (%rdi)
    103 ; SKX-NEXT:    retq
    104     %x = trunc <2 x i64> %i to <2 x i8>
    105     store <2 x i8> %x, <2 x i8>* %res
    106     ret void
    107 }
    108 
    109 define <8 x i16> @trunc_qw_512(<8 x i64> %i) #0 {
    110 ; ALL-LABEL: trunc_qw_512:
    111 ; ALL:       ## BB#0:
    112 ; ALL-NEXT:    vpmovqw %zmm0, %xmm0
    113 ; ALL-NEXT:    retq
    114   %x = trunc <8 x i64> %i to <8 x i16>
    115   ret <8 x i16> %x
    116 }
    117 
    118 define void @trunc_qw_512_mem(<8 x i64> %i, <8 x i16>* %res) #0 {
    119 ; ALL-LABEL: trunc_qw_512_mem:
    120 ; ALL:       ## BB#0:
    121 ; ALL-NEXT:    vpmovqw %zmm0, (%rdi)
    122 ; ALL-NEXT:    retq
    123     %x = trunc <8 x i64> %i to <8 x i16>
    124     store <8 x i16> %x, <8 x i16>* %res
    125     ret void
    126 }
    127 
    128 define <4 x i16> @trunc_qw_256(<4 x i64> %i) #0 {
    129 ; KNL-LABEL: trunc_qw_256:
    130 ; KNL:       ## BB#0:
    131 ; KNL-NEXT:    vpmovqd %zmm0, %ymm0
    132 ; KNL-NEXT:    retq
    133 ;
    134 ; SKX-LABEL: trunc_qw_256:
    135 ; SKX:       ## BB#0:
    136 ; SKX-NEXT:    vpmovqd %ymm0, %xmm0
    137 ; SKX-NEXT:    retq
    138   %x = trunc <4 x i64> %i to <4 x i16>
    139   ret <4 x i16> %x
    140 }
    141 
    142 define void @trunc_qw_256_mem(<4 x i64> %i, <4 x i16>* %res) #0 {
    143 ; KNL-LABEL: trunc_qw_256_mem:
    144 ; KNL:       ## BB#0:
    145 ; KNL-NEXT:    vpmovqd %zmm0, %ymm0
    146 ; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
    147 ; KNL-NEXT:    vmovq %xmm0, (%rdi)
    148 ; KNL-NEXT:    retq
    149 ;
    150 ; SKX-LABEL: trunc_qw_256_mem:
    151 ; SKX:       ## BB#0:
    152 ; SKX-NEXT:    vpmovqw %ymm0, (%rdi)
    153 ; SKX-NEXT:    retq
    154     %x = trunc <4 x i64> %i to <4 x i16>
    155     store <4 x i16> %x, <4 x i16>* %res
    156     ret void
    157 }
    158 
    159 define <2 x i16> @trunc_qw_128(<2 x i64> %i) #0 {
    160 ; ALL-LABEL: trunc_qw_128:
    161 ; ALL:       ## BB#0:
    162 ; ALL-NEXT:    retq
    163   %x = trunc <2 x i64> %i to <2 x i16>
    164   ret <2 x i16> %x
    165 }
    166 
    167 define void @trunc_qw_128_mem(<2 x i64> %i, <2 x i16>* %res) #0 {
    168 ; KNL-LABEL: trunc_qw_128_mem:
    169 ; KNL:       ## BB#0:
    170 ; KNL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
    171 ; KNL-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
    172 ; KNL-NEXT:    vmovd %xmm0, (%rdi)
    173 ; KNL-NEXT:    retq
    174 ;
    175 ; SKX-LABEL: trunc_qw_128_mem:
    176 ; SKX:       ## BB#0:
    177 ; SKX-NEXT:    vpmovqw %xmm0, (%rdi)
    178 ; SKX-NEXT:    retq
    179     %x = trunc <2 x i64> %i to <2 x i16>
    180     store <2 x i16> %x, <2 x i16>* %res
    181     ret void
    182 }
    183 
    184 define <8 x i32> @trunc_qd_512(<8 x i64> %i) #0 {
    185 ; ALL-LABEL: trunc_qd_512:
    186 ; ALL:       ## BB#0:
    187 ; ALL-NEXT:    vpmovqd %zmm0, %ymm0
    188 ; ALL-NEXT:    retq
    189   %x = trunc <8 x i64> %i to <8 x i32>
    190   ret <8 x i32> %x
    191 }
    192 
    193 define void @trunc_qd_512_mem(<8 x i64> %i, <8 x i32>* %res) #0 {
    194 ; ALL-LABEL: trunc_qd_512_mem:
    195 ; ALL:       ## BB#0:
    196 ; ALL-NEXT:    vpmovqd %zmm0, (%rdi)
    197 ; ALL-NEXT:    retq
    198     %x = trunc <8 x i64> %i to <8 x i32>
    199     store <8 x i32> %x, <8 x i32>* %res
    200     ret void
    201 }
    202 
    203 define <4 x i32> @trunc_qd_256(<4 x i64> %i) #0 {
    204 ; KNL-LABEL: trunc_qd_256:
    205 ; KNL:       ## BB#0:
    206 ; KNL-NEXT:    vpmovqd %zmm0, %ymm0
    207 ; KNL-NEXT:    retq
    208 ;
    209 ; SKX-LABEL: trunc_qd_256:
    210 ; SKX:       ## BB#0:
    211 ; SKX-NEXT:    vpmovqd %ymm0, %xmm0
    212 ; SKX-NEXT:    retq
    213   %x = trunc <4 x i64> %i to <4 x i32>
    214   ret <4 x i32> %x
    215 }
    216 
    217 define void @trunc_qd_256_mem(<4 x i64> %i, <4 x i32>* %res) #0 {
    218 ; KNL-LABEL: trunc_qd_256_mem:
    219 ; KNL:       ## BB#0:
    220 ; KNL-NEXT:    vpmovqd %zmm0, %ymm0
    221 ; KNL-NEXT:    vmovaps %xmm0, (%rdi)
    222 ; KNL-NEXT:    retq
    223 ;
    224 ; SKX-LABEL: trunc_qd_256_mem:
    225 ; SKX:       ## BB#0:
    226 ; SKX-NEXT:    vpmovqd %ymm0, (%rdi)
    227 ; SKX-NEXT:    retq
    228     %x = trunc <4 x i64> %i to <4 x i32>
    229     store <4 x i32> %x, <4 x i32>* %res
    230     ret void
    231 }
    232 
    233 define <2 x i32> @trunc_qd_128(<2 x i64> %i) #0 {
    234 ; ALL-LABEL: trunc_qd_128:
    235 ; ALL:       ## BB#0:
    236 ; ALL-NEXT:    retq
    237   %x = trunc <2 x i64> %i to <2 x i32>
    238   ret <2 x i32> %x
    239 }
    240 
    241 define void @trunc_qd_128_mem(<2 x i64> %i, <2 x i32>* %res) #0 {
    242 ; KNL-LABEL: trunc_qd_128_mem:
    243 ; KNL:       ## BB#0:
    244 ; KNL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
    245 ; KNL-NEXT:    vmovq %xmm0, (%rdi)
    246 ; KNL-NEXT:    retq
    247 ;
    248 ; SKX-LABEL: trunc_qd_128_mem:
    249 ; SKX:       ## BB#0:
    250 ; SKX-NEXT:    vpmovqd %xmm0, (%rdi)
    251 ; SKX-NEXT:    retq
    252     %x = trunc <2 x i64> %i to <2 x i32>
    253     store <2 x i32> %x, <2 x i32>* %res
    254     ret void
    255 }
    256 
    257 define <16 x i8> @trunc_db_512(<16 x i32> %i) #0 {
    258 ; ALL-LABEL: trunc_db_512:
    259 ; ALL:       ## BB#0:
    260 ; ALL-NEXT:    vpmovdb %zmm0, %xmm0
    261 ; ALL-NEXT:    retq
    262   %x = trunc <16 x i32> %i to <16 x i8>
    263   ret <16 x i8> %x
    264 }
    265 
    266 define void @trunc_db_512_mem(<16 x i32> %i, <16 x i8>* %res) #0 {
    267 ; ALL-LABEL: trunc_db_512_mem:
    268 ; ALL:       ## BB#0:
    269 ; ALL-NEXT:    vpmovdb %zmm0, (%rdi)
    270 ; ALL-NEXT:    retq
    271     %x = trunc <16 x i32> %i to <16 x i8>
    272     store <16 x i8> %x, <16 x i8>* %res
    273     ret void
    274 }
    275 
    276 define <8 x i8> @trunc_db_256(<8 x i32> %i) #0 {
    277 ; KNL-LABEL: trunc_db_256:
    278 ; KNL:       ## BB#0:
    279 ; KNL-NEXT:    vpmovdw %zmm0, %ymm0
    280 ; KNL-NEXT:    retq
    281 ;
    282 ; SKX-LABEL: trunc_db_256:
    283 ; SKX:       ## BB#0:
    284 ; SKX-NEXT:    vpmovdw %ymm0, %xmm0
    285 ; SKX-NEXT:    retq
    286   %x = trunc <8 x i32> %i to <8 x i8>
    287   ret <8 x i8> %x
    288 }
    289 
    290 define void @trunc_db_256_mem(<8 x i32> %i, <8 x i8>* %res) #0 {
    291 ; KNL-LABEL: trunc_db_256_mem:
    292 ; KNL:       ## BB#0:
    293 ; KNL-NEXT:    vpmovdw %zmm0, %ymm0
    294 ; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
    295 ; KNL-NEXT:    vmovq %xmm0, (%rdi)
    296 ; KNL-NEXT:    retq
    297 ;
    298 ; SKX-LABEL: trunc_db_256_mem:
    299 ; SKX:       ## BB#0:
    300 ; SKX-NEXT:    vpmovdb %ymm0, (%rdi)
    301 ; SKX-NEXT:    retq
    302     %x = trunc <8 x i32> %i to <8 x i8>
    303     store <8 x i8> %x, <8 x i8>* %res
    304     ret void
    305 }
    306 
    307 define <4 x i8> @trunc_db_128(<4 x i32> %i) #0 {
    308 ; ALL-LABEL: trunc_db_128:
    309 ; ALL:       ## BB#0:
    310 ; ALL-NEXT:    retq
    311   %x = trunc <4 x i32> %i to <4 x i8>
    312   ret <4 x i8> %x
    313 }
    314 
    315 define void @trunc_db_128_mem(<4 x i32> %i, <4 x i8>* %res) #0 {
    316 ; KNL-LABEL: trunc_db_128_mem:
    317 ; KNL:       ## BB#0:
    318 ; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
    319 ; KNL-NEXT:    vmovd %xmm0, (%rdi)
    320 ; KNL-NEXT:    retq
    321 ;
    322 ; SKX-LABEL: trunc_db_128_mem:
    323 ; SKX:       ## BB#0:
    324 ; SKX-NEXT:    vpmovdb %xmm0, (%rdi)
    325 ; SKX-NEXT:    retq
    326     %x = trunc <4 x i32> %i to <4 x i8>
    327     store <4 x i8> %x, <4 x i8>* %res
    328     ret void
    329 }
    330 
    331 define <16 x i16> @trunc_dw_512(<16 x i32> %i) #0 {
    332 ; ALL-LABEL: trunc_dw_512:
    333 ; ALL:       ## BB#0:
    334 ; ALL-NEXT:    vpmovdw %zmm0, %ymm0
    335 ; ALL-NEXT:    retq
    336   %x = trunc <16 x i32> %i to <16 x i16>
    337   ret <16 x i16> %x
    338 }
    339 
    340 define void @trunc_dw_512_mem(<16 x i32> %i, <16 x i16>* %res) #0 {
    341 ; ALL-LABEL: trunc_dw_512_mem:
    342 ; ALL:       ## BB#0:
    343 ; ALL-NEXT:    vpmovdw %zmm0, (%rdi)
    344 ; ALL-NEXT:    retq
    345     %x = trunc <16 x i32> %i to <16 x i16>
    346     store <16 x i16> %x, <16 x i16>* %res
    347     ret void
    348 }
    349 
    350 define <8 x i16> @trunc_dw_256(<8 x i32> %i) #0 {
    351 ; KNL-LABEL: trunc_dw_256:
    352 ; KNL:       ## BB#0:
    353 ; KNL-NEXT:    vpmovdw %zmm0, %ymm0
    354 ; KNL-NEXT:    retq
    355 ;
    356 ; SKX-LABEL: trunc_dw_256:
    357 ; SKX:       ## BB#0:
    358 ; SKX-NEXT:    vpmovdw %ymm0, %xmm0
    359 ; SKX-NEXT:    retq
    360   %x = trunc <8 x i32> %i to <8 x i16>
    361   ret <8 x i16> %x
    362 }
    363 
    364 define void @trunc_dw_256_mem(<8 x i32> %i, <8 x i16>* %res) #0 {
    365 ; KNL-LABEL: trunc_dw_256_mem:
    366 ; KNL:       ## BB#0:
    367 ; KNL-NEXT:    vpmovdw %zmm0, %ymm0
    368 ; KNL-NEXT:    vmovaps %xmm0, (%rdi)
    369 ; KNL-NEXT:    retq
    370 ;
    371 ; SKX-LABEL: trunc_dw_256_mem:
    372 ; SKX:       ## BB#0:
    373 ; SKX-NEXT:    vpmovdw %ymm0, (%rdi)
    374 ; SKX-NEXT:    retq
    375     %x = trunc <8 x i32> %i to <8 x i16>
    376     store <8 x i16> %x, <8 x i16>* %res
    377     ret void
    378 }
    379 
    380 define void @trunc_dw_128_mem(<4 x i32> %i, <4 x i16>* %res) #0 {
    381 ; KNL-LABEL: trunc_dw_128_mem:
    382 ; KNL:       ## BB#0:
    383 ; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
    384 ; KNL-NEXT:    vmovq %xmm0, (%rdi)
    385 ; KNL-NEXT:    retq
    386 ;
    387 ; SKX-LABEL: trunc_dw_128_mem:
    388 ; SKX:       ## BB#0:
    389 ; SKX-NEXT:    vpmovdw %xmm0, (%rdi)
    390 ; SKX-NEXT:    retq
    391     %x = trunc <4 x i32> %i to <4 x i16>
    392     store <4 x i16> %x, <4 x i16>* %res
    393     ret void
    394 }
    395 
    396 define <32 x i8> @trunc_wb_512(<32 x i16> %i) #0 {
    397 ; KNL-LABEL: trunc_wb_512:
    398 ; KNL:       ## BB#0:
    399 ; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0
    400 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
    401 ; KNL-NEXT:    vpmovsxwd %ymm1, %zmm1
    402 ; KNL-NEXT:    vpmovdb %zmm1, %xmm1
    403 ; KNL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
    404 ; KNL-NEXT:    retq
    405 ;
    406 ; SKX-LABEL: trunc_wb_512:
    407 ; SKX:       ## BB#0:
    408 ; SKX-NEXT:    vpmovwb %zmm0, %ymm0
    409 ; SKX-NEXT:    retq
    410   %x = trunc <32 x i16> %i to <32 x i8>
    411   ret <32 x i8> %x
    412 }
    413 
    414 define void @trunc_wb_512_mem(<32 x i16> %i, <32 x i8>* %res) #0 {
    415 ; KNL-LABEL: trunc_wb_512_mem:
    416 ; KNL:       ## BB#0:
    417 ; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0
    418 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
    419 ; KNL-NEXT:    vpmovsxwd %ymm1, %zmm1
    420 ; KNL-NEXT:    vpmovdb %zmm1, %xmm1
    421 ; KNL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
    422 ; KNL-NEXT:    vmovaps %ymm0, (%rdi)
    423 ; KNL-NEXT:    retq
    424 ;
    425 ; SKX-LABEL: trunc_wb_512_mem:
    426 ; SKX:       ## BB#0:
    427 ; SKX-NEXT:    vpmovwb %zmm0, (%rdi)
    428 ; SKX-NEXT:    retq
    429     %x = trunc <32 x i16> %i to <32 x i8>
    430     store <32 x i8> %x, <32 x i8>* %res
    431     ret void
    432 }
    433 
    434 define <16 x i8> @trunc_wb_256(<16 x i16> %i) #0 {
    435 ; KNL-LABEL: trunc_wb_256:
    436 ; KNL:       ## BB#0:
    437 ; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0
    438 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
    439 ; KNL-NEXT:    retq
    440 ;
    441 ; SKX-LABEL: trunc_wb_256:
    442 ; SKX:       ## BB#0:
    443 ; SKX-NEXT:    vpmovwb %ymm0, %xmm0
    444 ; SKX-NEXT:    retq
    445   %x = trunc <16 x i16> %i to <16 x i8>
    446   ret <16 x i8> %x
    447 }
    448 
    449 define void @trunc_wb_256_mem(<16 x i16> %i, <16 x i8>* %res) #0 {
    450 ; KNL-LABEL: trunc_wb_256_mem:
    451 ; KNL:       ## BB#0:
    452 ; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0
    453 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
    454 ; KNL-NEXT:    vmovaps %xmm0, (%rdi)
    455 ; KNL-NEXT:    retq
    456 ;
    457 ; SKX-LABEL: trunc_wb_256_mem:
    458 ; SKX:       ## BB#0:
    459 ; SKX-NEXT:    vpmovwb %ymm0, (%rdi)
    460 ; SKX-NEXT:    retq
    461     %x = trunc <16 x i16> %i to <16 x i8>
    462     store <16 x i8> %x, <16 x i8>* %res
    463     ret void
    464 }
    465 
    466 define <8 x i8> @trunc_wb_128(<8 x i16> %i) #0 {
    467 ; ALL-LABEL: trunc_wb_128:
    468 ; ALL:       ## BB#0:
    469 ; ALL-NEXT:    retq
    470   %x = trunc <8 x i16> %i to <8 x i8>
    471   ret <8 x i8> %x
    472 }
    473 
    474 define void @trunc_wb_128_mem(<8 x i16> %i, <8 x i8>* %res) #0 {
    475 ; KNL-LABEL: trunc_wb_128_mem:
    476 ; KNL:       ## BB#0:
    477 ; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
    478 ; KNL-NEXT:    vmovq %xmm0, (%rdi)
    479 ; KNL-NEXT:    retq
    480 ;
    481 ; SKX-LABEL: trunc_wb_128_mem:
    482 ; SKX:       ## BB#0:
    483 ; SKX-NEXT:    vpmovwb %xmm0, (%rdi)
    484 ; SKX-NEXT:    retq
    485     %x = trunc <8 x i16> %i to <8 x i8>
    486     store <8 x i8> %x, <8 x i8>* %res
    487     ret void
    488 }
    489