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 | 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=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
      5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F
      6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512BW
      7 
      8 define <16 x i8> @mul_v16i8c(<16 x i8> %i) nounwind  {
      9 ; SSE2-LABEL: mul_v16i8c:
     10 ; SSE2:       # %bb.0: # %entry
     11 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
     12 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
     13 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117]
     14 ; SSE2-NEXT:    pmullw %xmm2, %xmm1
     15 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
     16 ; SSE2-NEXT:    pand %xmm3, %xmm1
     17 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
     18 ; SSE2-NEXT:    pmullw %xmm2, %xmm0
     19 ; SSE2-NEXT:    pand %xmm3, %xmm0
     20 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
     21 ; SSE2-NEXT:    retq
     22 ;
     23 ; SSE41-LABEL: mul_v16i8c:
     24 ; SSE41:       # %bb.0: # %entry
     25 ; 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
     26 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
     27 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117]
     28 ; SSE41-NEXT:    pmullw %xmm2, %xmm0
     29 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
     30 ; SSE41-NEXT:    pand %xmm3, %xmm0
     31 ; SSE41-NEXT:    pmullw %xmm2, %xmm1
     32 ; SSE41-NEXT:    pand %xmm3, %xmm1
     33 ; SSE41-NEXT:    packuswb %xmm0, %xmm1
     34 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
     35 ; SSE41-NEXT:    retq
     36 ;
     37 ; AVX2-LABEL: mul_v16i8c:
     38 ; AVX2:       # %bb.0: # %entry
     39 ; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm0
     40 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
     41 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
     42 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
     43 ; AVX2-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
     44 ; AVX2-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
     45 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
     46 ; AVX2-NEXT:    vzeroupper
     47 ; AVX2-NEXT:    retq
     48 ;
     49 ; AVX512F-LABEL: mul_v16i8c:
     50 ; AVX512F:       # %bb.0: # %entry
     51 ; AVX512F-NEXT:    vpmovsxbw %xmm0, %ymm0
     52 ; AVX512F-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
     53 ; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0
     54 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
     55 ; AVX512F-NEXT:    vzeroupper
     56 ; AVX512F-NEXT:    retq
     57 ;
     58 ; AVX512BW-LABEL: mul_v16i8c:
     59 ; AVX512BW:       # %bb.0: # %entry
     60 ; AVX512BW-NEXT:    vpmovsxbw %xmm0, %ymm0
     61 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
     62 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
     63 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
     64 ; AVX512BW-NEXT:    vzeroupper
     65 ; AVX512BW-NEXT:    retq
     66 entry:
     67   %A = mul <16 x i8> %i, < i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117 >
     68   ret <16 x i8> %A
     69 }
     70 
     71 define <8 x i16> @mul_v8i16c(<8 x i16> %i) nounwind  {
     72 ; SSE-LABEL: mul_v8i16c:
     73 ; SSE:       # %bb.0: # %entry
     74 ; SSE-NEXT:    pmullw {{.*}}(%rip), %xmm0
     75 ; SSE-NEXT:    retq
     76 ;
     77 ; AVX-LABEL: mul_v8i16c:
     78 ; AVX:       # %bb.0: # %entry
     79 ; AVX-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
     80 ; AVX-NEXT:    retq
     81 entry:
     82   %A = mul <8 x i16> %i, < i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117 >
     83   ret <8 x i16> %A
     84 }
     85 
     86 define <4 x i32> @mul_v4i32c(<4 x i32> %i) nounwind  {
     87 ; SSE2-LABEL: mul_v4i32c:
     88 ; SSE2:       # %bb.0: # %entry
     89 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [117,117,117,117]
     90 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
     91 ; SSE2-NEXT:    pmuludq %xmm1, %xmm0
     92 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
     93 ; SSE2-NEXT:    pmuludq %xmm1, %xmm2
     94 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
     95 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
     96 ; SSE2-NEXT:    retq
     97 ;
     98 ; SSE41-LABEL: mul_v4i32c:
     99 ; SSE41:       # %bb.0: # %entry
    100 ; SSE41-NEXT:    pmulld {{.*}}(%rip), %xmm0
    101 ; SSE41-NEXT:    retq
    102 ;
    103 ; AVX-LABEL: mul_v4i32c:
    104 ; AVX:       # %bb.0: # %entry
    105 ; AVX-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [117,117,117,117]
    106 ; AVX-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
    107 ; AVX-NEXT:    retq
    108 entry:
    109   %A = mul <4 x i32> %i, < i32 117, i32 117, i32 117, i32 117 >
    110   ret <4 x i32> %A
    111 }
    112 
    113 define <2 x i64> @mul_v2i64c(<2 x i64> %i) nounwind  {
    114 ; SSE-LABEL: mul_v2i64c:
    115 ; SSE:       # %bb.0: # %entry
    116 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [117,117]
    117 ; SSE-NEXT:    movdqa %xmm0, %xmm2
    118 ; SSE-NEXT:    pmuludq %xmm1, %xmm2
    119 ; SSE-NEXT:    psrlq $32, %xmm0
    120 ; SSE-NEXT:    pmuludq %xmm1, %xmm0
    121 ; SSE-NEXT:    psllq $32, %xmm0
    122 ; SSE-NEXT:    paddq %xmm2, %xmm0
    123 ; SSE-NEXT:    retq
    124 ;
    125 ; AVX-LABEL: mul_v2i64c:
    126 ; AVX:       # %bb.0: # %entry
    127 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [117,117]
    128 ; AVX-NEXT:    vpmuludq %xmm1, %xmm0, %xmm2
    129 ; AVX-NEXT:    vpsrlq $32, %xmm0, %xmm0
    130 ; AVX-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
    131 ; AVX-NEXT:    vpsllq $32, %xmm0, %xmm0
    132 ; AVX-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
    133 ; AVX-NEXT:    retq
    134 entry:
    135   %A = mul <2 x i64> %i, < i64 117, i64 117 >
    136   ret <2 x i64> %A
    137 }
    138 
    139 define <16 x i8> @mul_v16i8(<16 x i8> %i, <16 x i8> %j) nounwind  {
    140 ; SSE2-LABEL: mul_v16i8:
    141 ; SSE2:       # %bb.0: # %entry
    142 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
    143 ; 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]
    144 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
    145 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm0[8],xmm3[9],xmm0[9],xmm3[10],xmm0[10],xmm3[11],xmm0[11],xmm3[12],xmm0[12],xmm3[13],xmm0[13],xmm3[14],xmm0[14],xmm3[15],xmm0[15]
    146 ; SSE2-NEXT:    pmullw %xmm2, %xmm3
    147 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
    148 ; SSE2-NEXT:    pand %xmm2, %xmm3
    149 ; 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]
    150 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
    151 ; SSE2-NEXT:    pmullw %xmm1, %xmm0
    152 ; SSE2-NEXT:    pand %xmm2, %xmm0
    153 ; SSE2-NEXT:    packuswb %xmm3, %xmm0
    154 ; SSE2-NEXT:    retq
    155 ;
    156 ; SSE41-LABEL: mul_v16i8:
    157 ; SSE41:       # %bb.0: # %entry
    158 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
    159 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    160 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
    161 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    162 ; SSE41-NEXT:    pmullw %xmm1, %xmm0
    163 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
    164 ; SSE41-NEXT:    pand %xmm1, %xmm0
    165 ; SSE41-NEXT:    pmullw %xmm3, %xmm2
    166 ; SSE41-NEXT:    pand %xmm1, %xmm2
    167 ; SSE41-NEXT:    packuswb %xmm0, %xmm2
    168 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
    169 ; SSE41-NEXT:    retq
    170 ;
    171 ; AVX2-LABEL: mul_v16i8:
    172 ; AVX2:       # %bb.0: # %entry
    173 ; AVX2-NEXT:    vpmovsxbw %xmm1, %ymm1
    174 ; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm0
    175 ; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
    176 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
    177 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
    178 ; AVX2-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
    179 ; AVX2-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
    180 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
    181 ; AVX2-NEXT:    vzeroupper
    182 ; AVX2-NEXT:    retq
    183 ;
    184 ; AVX512F-LABEL: mul_v16i8:
    185 ; AVX512F:       # %bb.0: # %entry
    186 ; AVX512F-NEXT:    vpmovsxbw %xmm1, %ymm1
    187 ; AVX512F-NEXT:    vpmovsxbw %xmm0, %ymm0
    188 ; AVX512F-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
    189 ; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0
    190 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
    191 ; AVX512F-NEXT:    vzeroupper
    192 ; AVX512F-NEXT:    retq
    193 ;
    194 ; AVX512BW-LABEL: mul_v16i8:
    195 ; AVX512BW:       # %bb.0: # %entry
    196 ; AVX512BW-NEXT:    vpmovsxbw %xmm1, %ymm1
    197 ; AVX512BW-NEXT:    vpmovsxbw %xmm0, %ymm0
    198 ; AVX512BW-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
    199 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
    200 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
    201 ; AVX512BW-NEXT:    vzeroupper
    202 ; AVX512BW-NEXT:    retq
    203 entry:
    204   %A = mul <16 x i8> %i, %j
    205   ret <16 x i8> %A
    206 }
    207 
    208 define <8 x i16> @mul_v8i16(<8 x i16> %i, <8 x i16> %j) nounwind  {
    209 ; SSE-LABEL: mul_v8i16:
    210 ; SSE:       # %bb.0: # %entry
    211 ; SSE-NEXT:    pmullw %xmm1, %xmm0
    212 ; SSE-NEXT:    retq
    213 ;
    214 ; AVX-LABEL: mul_v8i16:
    215 ; AVX:       # %bb.0: # %entry
    216 ; AVX-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
    217 ; AVX-NEXT:    retq
    218 entry:
    219   %A = mul <8 x i16> %i, %j
    220   ret <8 x i16> %A
    221 }
    222 
    223 define <4 x i32> @mul_v4i32(<4 x i32> %i, <4 x i32> %j) nounwind  {
    224 ; SSE2-LABEL: mul_v4i32:
    225 ; SSE2:       # %bb.0: # %entry
    226 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
    227 ; SSE2-NEXT:    pmuludq %xmm1, %xmm0
    228 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
    229 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
    230 ; SSE2-NEXT:    pmuludq %xmm2, %xmm1
    231 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
    232 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
    233 ; SSE2-NEXT:    retq
    234 ;
    235 ; SSE41-LABEL: mul_v4i32:
    236 ; SSE41:       # %bb.0: # %entry
    237 ; SSE41-NEXT:    pmulld %xmm1, %xmm0
    238 ; SSE41-NEXT:    retq
    239 ;
    240 ; AVX-LABEL: mul_v4i32:
    241 ; AVX:       # %bb.0: # %entry
    242 ; AVX-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
    243 ; AVX-NEXT:    retq
    244 entry:
    245   %A = mul <4 x i32> %i, %j
    246   ret <4 x i32> %A
    247 }
    248 
    249 define <2 x i64> @mul_v2i64(<2 x i64> %i, <2 x i64> %j) nounwind  {
    250 ; SSE-LABEL: mul_v2i64:
    251 ; SSE:       # %bb.0: # %entry
    252 ; SSE-NEXT:    movdqa %xmm0, %xmm2
    253 ; SSE-NEXT:    psrlq $32, %xmm2
    254 ; SSE-NEXT:    pmuludq %xmm1, %xmm2
    255 ; SSE-NEXT:    movdqa %xmm1, %xmm3
    256 ; SSE-NEXT:    psrlq $32, %xmm3
    257 ; SSE-NEXT:    pmuludq %xmm0, %xmm3
    258 ; SSE-NEXT:    paddq %xmm2, %xmm3
    259 ; SSE-NEXT:    psllq $32, %xmm3
    260 ; SSE-NEXT:    pmuludq %xmm1, %xmm0
    261 ; SSE-NEXT:    paddq %xmm3, %xmm0
    262 ; SSE-NEXT:    retq
    263 ;
    264 ; AVX-LABEL: mul_v2i64:
    265 ; AVX:       # %bb.0: # %entry
    266 ; AVX-NEXT:    vpsrlq $32, %xmm0, %xmm2
    267 ; AVX-NEXT:    vpmuludq %xmm1, %xmm2, %xmm2
    268 ; AVX-NEXT:    vpsrlq $32, %xmm1, %xmm3
    269 ; AVX-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
    270 ; AVX-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
    271 ; AVX-NEXT:    vpsllq $32, %xmm2, %xmm2
    272 ; AVX-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
    273 ; AVX-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
    274 ; AVX-NEXT:    retq
    275 entry:
    276   %A = mul <2 x i64> %i, %j
    277   ret <2 x i64> %A
    278 }
    279 
    280 declare void @foo()
    281 
    282 define <4 x i32> @mul_v4i32spill(<4 x i32> %i, <4 x i32> %j) nounwind  {
    283 ; SSE2-LABEL: mul_v4i32spill:
    284 ; SSE2:       # %bb.0: # %entry
    285 ; SSE2-NEXT:    subq $40, %rsp
    286 ; SSE2-NEXT:    movaps %xmm1, {{[0-9]+}}(%rsp) # 16-byte Spill
    287 ; SSE2-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
    288 ; SSE2-NEXT:    callq foo
    289 ; SSE2-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
    290 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
    291 ; SSE2-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm2 # 16-byte Reload
    292 ; SSE2-NEXT:    pmuludq %xmm2, %xmm0
    293 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
    294 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
    295 ; SSE2-NEXT:    pmuludq %xmm1, %xmm2
    296 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
    297 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
    298 ; SSE2-NEXT:    addq $40, %rsp
    299 ; SSE2-NEXT:    retq
    300 ;
    301 ; SSE41-LABEL: mul_v4i32spill:
    302 ; SSE41:       # %bb.0: # %entry
    303 ; SSE41-NEXT:    subq $40, %rsp
    304 ; SSE41-NEXT:    movaps %xmm1, {{[0-9]+}}(%rsp) # 16-byte Spill
    305 ; SSE41-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
    306 ; SSE41-NEXT:    callq foo
    307 ; SSE41-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
    308 ; SSE41-NEXT:    pmulld {{[0-9]+}}(%rsp), %xmm0 # 16-byte Folded Reload
    309 ; SSE41-NEXT:    addq $40, %rsp
    310 ; SSE41-NEXT:    retq
    311 ;
    312 ; AVX-LABEL: mul_v4i32spill:
    313 ; AVX:       # %bb.0: # %entry
    314 ; AVX-NEXT:    subq $40, %rsp
    315 ; AVX-NEXT:    vmovaps %xmm1, {{[0-9]+}}(%rsp) # 16-byte Spill
    316 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
    317 ; AVX-NEXT:    callq foo
    318 ; AVX-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
    319 ; AVX-NEXT:    vpmulld {{[0-9]+}}(%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
    320 ; AVX-NEXT:    addq $40, %rsp
    321 ; AVX-NEXT:    retq
    322 entry:
    323   ; Use a call to force spills.
    324   call void @foo()
    325   %A = mul <4 x i32> %i, %j
    326   ret <4 x i32> %A
    327 }
    328 
    329 define <2 x i64> @mul_v2i64spill(<2 x i64> %i, <2 x i64> %j) nounwind  {
    330 ; SSE-LABEL: mul_v2i64spill:
    331 ; SSE:       # %bb.0: # %entry
    332 ; SSE-NEXT:    subq $40, %rsp
    333 ; SSE-NEXT:    movaps %xmm1, {{[0-9]+}}(%rsp) # 16-byte Spill
    334 ; SSE-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
    335 ; SSE-NEXT:    callq foo
    336 ; SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
    337 ; SSE-NEXT:    movdqa %xmm0, %xmm2
    338 ; SSE-NEXT:    psrlq $32, %xmm2
    339 ; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm3 # 16-byte Reload
    340 ; SSE-NEXT:    pmuludq %xmm3, %xmm2
    341 ; SSE-NEXT:    movdqa %xmm3, %xmm1
    342 ; SSE-NEXT:    psrlq $32, %xmm1
    343 ; SSE-NEXT:    pmuludq %xmm0, %xmm1
    344 ; SSE-NEXT:    paddq %xmm2, %xmm1
    345 ; SSE-NEXT:    psllq $32, %xmm1
    346 ; SSE-NEXT:    pmuludq %xmm3, %xmm0
    347 ; SSE-NEXT:    paddq %xmm1, %xmm0
    348 ; SSE-NEXT:    addq $40, %rsp
    349 ; SSE-NEXT:    retq
    350 ;
    351 ; AVX-LABEL: mul_v2i64spill:
    352 ; AVX:       # %bb.0: # %entry
    353 ; AVX-NEXT:    subq $40, %rsp
    354 ; AVX-NEXT:    vmovaps %xmm1, {{[0-9]+}}(%rsp) # 16-byte Spill
    355 ; AVX-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
    356 ; AVX-NEXT:    callq foo
    357 ; AVX-NEXT:    vmovdqa (%rsp), %xmm3 # 16-byte Reload
    358 ; AVX-NEXT:    vpsrlq $32, %xmm3, %xmm0
    359 ; AVX-NEXT:    vmovdqa {{[0-9]+}}(%rsp), %xmm2 # 16-byte Reload
    360 ; AVX-NEXT:    vpmuludq %xmm2, %xmm0, %xmm0
    361 ; AVX-NEXT:    vpsrlq $32, %xmm2, %xmm1
    362 ; AVX-NEXT:    vpmuludq %xmm1, %xmm3, %xmm1
    363 ; AVX-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
    364 ; AVX-NEXT:    vpsllq $32, %xmm0, %xmm0
    365 ; AVX-NEXT:    vpmuludq %xmm2, %xmm3, %xmm1
    366 ; AVX-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
    367 ; AVX-NEXT:    addq $40, %rsp
    368 ; AVX-NEXT:    retq
    369 entry:
    370   ; Use a call to force spills.
    371   call void @foo()
    372   %A = mul <2 x i64> %i, %j
    373   ret <2 x i64> %A
    374 }
    375 
    376 define <32 x i8> @mul_v32i8c(<32 x i8> %i) nounwind  {
    377 ; SSE2-LABEL: mul_v32i8c:
    378 ; SSE2:       # %bb.0: # %entry
    379 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
    380 ; 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]
    381 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117]
    382 ; SSE2-NEXT:    pmullw %xmm3, %xmm2
    383 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
    384 ; SSE2-NEXT:    pand %xmm4, %xmm2
    385 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
    386 ; SSE2-NEXT:    pmullw %xmm3, %xmm0
    387 ; SSE2-NEXT:    pand %xmm4, %xmm0
    388 ; SSE2-NEXT:    packuswb %xmm2, %xmm0
    389 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
    390 ; 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]
    391 ; SSE2-NEXT:    pmullw %xmm3, %xmm2
    392 ; SSE2-NEXT:    pand %xmm4, %xmm2
    393 ; 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]
    394 ; SSE2-NEXT:    pmullw %xmm3, %xmm1
    395 ; SSE2-NEXT:    pand %xmm4, %xmm1
    396 ; SSE2-NEXT:    packuswb %xmm2, %xmm1
    397 ; SSE2-NEXT:    retq
    398 ;
    399 ; SSE41-LABEL: mul_v32i8c:
    400 ; SSE41:       # %bb.0: # %entry
    401 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
    402 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    403 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117]
    404 ; SSE41-NEXT:    pmullw %xmm4, %xmm0
    405 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255]
    406 ; SSE41-NEXT:    pand %xmm5, %xmm0
    407 ; SSE41-NEXT:    pmullw %xmm4, %xmm2
    408 ; SSE41-NEXT:    pand %xmm5, %xmm2
    409 ; SSE41-NEXT:    packuswb %xmm0, %xmm2
    410 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
    411 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    412 ; SSE41-NEXT:    pmullw %xmm4, %xmm1
    413 ; SSE41-NEXT:    pand %xmm5, %xmm1
    414 ; SSE41-NEXT:    pmullw %xmm4, %xmm3
    415 ; SSE41-NEXT:    pand %xmm5, %xmm3
    416 ; SSE41-NEXT:    packuswb %xmm1, %xmm3
    417 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
    418 ; SSE41-NEXT:    movdqa %xmm3, %xmm1
    419 ; SSE41-NEXT:    retq
    420 ;
    421 ; AVX2-LABEL: mul_v32i8c:
    422 ; AVX2:       # %bb.0: # %entry
    423 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
    424 ; AVX2-NEXT:    vpmovsxbw %xmm1, %ymm1
    425 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117]
    426 ; AVX2-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
    427 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm3
    428 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm4 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
    429 ; AVX2-NEXT:    vpshufb %xmm4, %xmm3, %xmm3
    430 ; AVX2-NEXT:    vpshufb %xmm4, %xmm1, %xmm1
    431 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
    432 ; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm0
    433 ; AVX2-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
    434 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
    435 ; AVX2-NEXT:    vpshufb %xmm4, %xmm2, %xmm2
    436 ; AVX2-NEXT:    vpshufb %xmm4, %xmm0, %xmm0
    437 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
    438 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
    439 ; AVX2-NEXT:    retq
    440 ;
    441 ; AVX512F-LABEL: mul_v32i8c:
    442 ; AVX512F:       # %bb.0: # %entry
    443 ; AVX512F-NEXT:    vpmovsxbw %xmm0, %ymm1
    444 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm2 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117]
    445 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
    446 ; AVX512F-NEXT:    vpmovsxwd %ymm1, %zmm1
    447 ; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
    448 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm0
    449 ; AVX512F-NEXT:    vpmovsxbw %xmm0, %ymm0
    450 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
    451 ; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0
    452 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
    453 ; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
    454 ; AVX512F-NEXT:    retq
    455 ;
    456 ; AVX512BW-LABEL: mul_v32i8c:
    457 ; AVX512BW:       # %bb.0: # %entry
    458 ; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm0
    459 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %zmm0, %zmm0
    460 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
    461 ; AVX512BW-NEXT:    retq
    462 entry:
    463   %A = mul <32 x i8> %i, < i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117 >
    464   ret <32 x i8> %A
    465 }
    466 
    467 define <16 x i16> @mul_v16i16c(<16 x i16> %i) nounwind  {
    468 ; SSE-LABEL: mul_v16i16c:
    469 ; SSE:       # %bb.0: # %entry
    470 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [117,117,117,117,117,117,117,117]
    471 ; SSE-NEXT:    pmullw %xmm2, %xmm0
    472 ; SSE-NEXT:    pmullw %xmm2, %xmm1
    473 ; SSE-NEXT:    retq
    474 ;
    475 ; AVX-LABEL: mul_v16i16c:
    476 ; AVX:       # %bb.0: # %entry
    477 ; AVX-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
    478 ; AVX-NEXT:    retq
    479 entry:
    480   %A = mul <16 x i16> %i, < i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117 >
    481   ret <16 x i16> %A
    482 }
    483 
    484 define <8 x i32> @mul_v8i32c(<8 x i32> %i) nounwind  {
    485 ; SSE2-LABEL: mul_v8i32c:
    486 ; SSE2:       # %bb.0: # %entry
    487 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [117,117,117,117]
    488 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
    489 ; SSE2-NEXT:    pmuludq %xmm2, %xmm0
    490 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
    491 ; SSE2-NEXT:    pmuludq %xmm2, %xmm3
    492 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
    493 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
    494 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
    495 ; SSE2-NEXT:    pmuludq %xmm2, %xmm1
    496 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
    497 ; SSE2-NEXT:    pmuludq %xmm2, %xmm3
    498 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3]
    499 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
    500 ; SSE2-NEXT:    retq
    501 ;
    502 ; SSE41-LABEL: mul_v8i32c:
    503 ; SSE41:       # %bb.0: # %entry
    504 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [117,117,117,117]
    505 ; SSE41-NEXT:    pmulld %xmm2, %xmm0
    506 ; SSE41-NEXT:    pmulld %xmm2, %xmm1
    507 ; SSE41-NEXT:    retq
    508 ;
    509 ; AVX-LABEL: mul_v8i32c:
    510 ; AVX:       # %bb.0: # %entry
    511 ; AVX-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [117,117,117,117,117,117,117,117]
    512 ; AVX-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
    513 ; AVX-NEXT:    retq
    514 entry:
    515   %A = mul <8 x i32> %i, < i32 117, i32 117, i32 117, i32 117, i32 117, i32 117, i32 117, i32 117 >
    516   ret <8 x i32> %A
    517 }
    518 
    519 define <4 x i64> @mul_v4i64c(<4 x i64> %i) nounwind  {
    520 ; SSE-LABEL: mul_v4i64c:
    521 ; SSE:       # %bb.0: # %entry
    522 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [117,117]
    523 ; SSE-NEXT:    movdqa %xmm0, %xmm3
    524 ; SSE-NEXT:    pmuludq %xmm2, %xmm3
    525 ; SSE-NEXT:    psrlq $32, %xmm0
    526 ; SSE-NEXT:    pmuludq %xmm2, %xmm0
    527 ; SSE-NEXT:    psllq $32, %xmm0
    528 ; SSE-NEXT:    paddq %xmm3, %xmm0
    529 ; SSE-NEXT:    movdqa %xmm1, %xmm3
    530 ; SSE-NEXT:    pmuludq %xmm2, %xmm3
    531 ; SSE-NEXT:    psrlq $32, %xmm1
    532 ; SSE-NEXT:    pmuludq %xmm2, %xmm1
    533 ; SSE-NEXT:    psllq $32, %xmm1
    534 ; SSE-NEXT:    paddq %xmm3, %xmm1
    535 ; SSE-NEXT:    retq
    536 ;
    537 ; AVX-LABEL: mul_v4i64c:
    538 ; AVX:       # %bb.0: # %entry
    539 ; AVX-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [117,117,117,117]
    540 ; AVX-NEXT:    vpmuludq %ymm1, %ymm0, %ymm2
    541 ; AVX-NEXT:    vpsrlq $32, %ymm0, %ymm0
    542 ; AVX-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
    543 ; AVX-NEXT:    vpsllq $32, %ymm0, %ymm0
    544 ; AVX-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
    545 ; AVX-NEXT:    retq
    546 entry:
    547   %A = mul <4 x i64> %i, < i64 117, i64 117, i64 117, i64 117 >
    548   ret <4 x i64> %A
    549 }
    550 
    551 define <32 x i8> @mul_v32i8(<32 x i8> %i, <32 x i8> %j) nounwind  {
    552 ; SSE2-LABEL: mul_v32i8:
    553 ; SSE2:       # %bb.0: # %entry
    554 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
    555 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15]
    556 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
    557 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
    558 ; SSE2-NEXT:    pmullw %xmm4, %xmm5
    559 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
    560 ; SSE2-NEXT:    pand %xmm4, %xmm5
    561 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
    562 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
    563 ; SSE2-NEXT:    pmullw %xmm2, %xmm0
    564 ; SSE2-NEXT:    pand %xmm4, %xmm0
    565 ; SSE2-NEXT:    packuswb %xmm5, %xmm0
    566 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
    567 ; 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]
    568 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
    569 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
    570 ; SSE2-NEXT:    pmullw %xmm2, %xmm5
    571 ; SSE2-NEXT:    pand %xmm4, %xmm5
    572 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
    573 ; 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]
    574 ; SSE2-NEXT:    pmullw %xmm3, %xmm1
    575 ; SSE2-NEXT:    pand %xmm4, %xmm1
    576 ; SSE2-NEXT:    packuswb %xmm5, %xmm1
    577 ; SSE2-NEXT:    retq
    578 ;
    579 ; SSE41-LABEL: mul_v32i8:
    580 ; SSE41:       # %bb.0: # %entry
    581 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm5 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
    582 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    583 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm4 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
    584 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    585 ; SSE41-NEXT:    pmullw %xmm2, %xmm0
    586 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [255,255,255,255,255,255,255,255]
    587 ; SSE41-NEXT:    pand %xmm6, %xmm0
    588 ; SSE41-NEXT:    pmullw %xmm5, %xmm4
    589 ; SSE41-NEXT:    pand %xmm6, %xmm4
    590 ; SSE41-NEXT:    packuswb %xmm0, %xmm4
    591 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
    592 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    593 ; SSE41-NEXT:    pmovzxbw {{.*#+}} 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
    594 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    595 ; SSE41-NEXT:    pmullw %xmm3, %xmm1
    596 ; SSE41-NEXT:    pand %xmm6, %xmm1
    597 ; SSE41-NEXT:    pmullw %xmm0, %xmm2
    598 ; SSE41-NEXT:    pand %xmm6, %xmm2
    599 ; SSE41-NEXT:    packuswb %xmm1, %xmm2
    600 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
    601 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
    602 ; SSE41-NEXT:    retq
    603 ;
    604 ; AVX2-LABEL: mul_v32i8:
    605 ; AVX2:       # %bb.0: # %entry
    606 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
    607 ; AVX2-NEXT:    vpmovsxbw %xmm2, %ymm2
    608 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
    609 ; AVX2-NEXT:    vpmovsxbw %xmm3, %ymm3
    610 ; AVX2-NEXT:    vpmullw %ymm2, %ymm3, %ymm2
    611 ; AVX2-NEXT:    vextracti128 $1, %ymm2, %xmm3
    612 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm4 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
    613 ; AVX2-NEXT:    vpshufb %xmm4, %xmm3, %xmm3
    614 ; AVX2-NEXT:    vpshufb %xmm4, %xmm2, %xmm2
    615 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
    616 ; AVX2-NEXT:    vpmovsxbw %xmm1, %ymm1
    617 ; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm0
    618 ; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
    619 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
    620 ; AVX2-NEXT:    vpshufb %xmm4, %xmm1, %xmm1
    621 ; AVX2-NEXT:    vpshufb %xmm4, %xmm0, %xmm0
    622 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
    623 ; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
    624 ; AVX2-NEXT:    retq
    625 ;
    626 ; AVX512F-LABEL: mul_v32i8:
    627 ; AVX512F:       # %bb.0: # %entry
    628 ; AVX512F-NEXT:    vpmovsxbw %xmm1, %ymm2
    629 ; AVX512F-NEXT:    vpmovsxbw %xmm0, %ymm3
    630 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm3, %ymm2
    631 ; AVX512F-NEXT:    vpmovsxwd %ymm2, %zmm2
    632 ; AVX512F-NEXT:    vpmovdb %zmm2, %xmm2
    633 ; AVX512F-NEXT:    vextracti128 $1, %ymm1, %xmm1
    634 ; AVX512F-NEXT:    vpmovsxbw %xmm1, %ymm1
    635 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm0
    636 ; AVX512F-NEXT:    vpmovsxbw %xmm0, %ymm0
    637 ; AVX512F-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
    638 ; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0
    639 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
    640 ; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm2, %ymm0
    641 ; AVX512F-NEXT:    retq
    642 ;
    643 ; AVX512BW-LABEL: mul_v32i8:
    644 ; AVX512BW:       # %bb.0: # %entry
    645 ; AVX512BW-NEXT:    vpmovsxbw %ymm1, %zmm1
    646 ; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm0
    647 ; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
    648 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
    649 ; AVX512BW-NEXT:    retq
    650 entry:
    651   %A = mul <32 x i8> %i, %j
    652   ret <32 x i8> %A
    653 }
    654 
    655 define <16 x i16> @mul_v16i16(<16 x i16> %i, <16 x i16> %j) nounwind  {
    656 ; SSE-LABEL: mul_v16i16:
    657 ; SSE:       # %bb.0: # %entry
    658 ; SSE-NEXT:    pmullw %xmm2, %xmm0
    659 ; SSE-NEXT:    pmullw %xmm3, %xmm1
    660 ; SSE-NEXT:    retq
    661 ;
    662 ; AVX-LABEL: mul_v16i16:
    663 ; AVX:       # %bb.0: # %entry
    664 ; AVX-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
    665 ; AVX-NEXT:    retq
    666 entry:
    667   %A = mul <16 x i16> %i, %j
    668   ret <16 x i16> %A
    669 }
    670 
    671 define <8 x i32> @mul_v8i32(<8 x i32> %i, <8 x i32> %j) nounwind  {
    672 ; SSE2-LABEL: mul_v8i32:
    673 ; SSE2:       # %bb.0: # %entry
    674 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
    675 ; SSE2-NEXT:    pmuludq %xmm2, %xmm0
    676 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
    677 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
    678 ; SSE2-NEXT:    pmuludq %xmm4, %xmm2
    679 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
    680 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
    681 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
    682 ; SSE2-NEXT:    pmuludq %xmm3, %xmm1
    683 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
    684 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
    685 ; SSE2-NEXT:    pmuludq %xmm2, %xmm3
    686 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3]
    687 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
    688 ; SSE2-NEXT:    retq
    689 ;
    690 ; SSE41-LABEL: mul_v8i32:
    691 ; SSE41:       # %bb.0: # %entry
    692 ; SSE41-NEXT:    pmulld %xmm2, %xmm0
    693 ; SSE41-NEXT:    pmulld %xmm3, %xmm1
    694 ; SSE41-NEXT:    retq
    695 ;
    696 ; AVX-LABEL: mul_v8i32:
    697 ; AVX:       # %bb.0: # %entry
    698 ; AVX-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
    699 ; AVX-NEXT:    retq
    700 entry:
    701   %A = mul <8 x i32> %i, %j
    702   ret <8 x i32> %A
    703 }
    704 
    705 define <4 x i64> @mul_v4i64(<4 x i64> %i, <4 x i64> %j) nounwind  {
    706 ; SSE-LABEL: mul_v4i64:
    707 ; SSE:       # %bb.0: # %entry
    708 ; SSE-NEXT:    movdqa %xmm0, %xmm4
    709 ; SSE-NEXT:    psrlq $32, %xmm4
    710 ; SSE-NEXT:    pmuludq %xmm2, %xmm4
    711 ; SSE-NEXT:    movdqa %xmm2, %xmm5
    712 ; SSE-NEXT:    psrlq $32, %xmm5
    713 ; SSE-NEXT:    pmuludq %xmm0, %xmm5
    714 ; SSE-NEXT:    paddq %xmm4, %xmm5
    715 ; SSE-NEXT:    psllq $32, %xmm5
    716 ; SSE-NEXT:    pmuludq %xmm2, %xmm0
    717 ; SSE-NEXT:    paddq %xmm5, %xmm0
    718 ; SSE-NEXT:    movdqa %xmm1, %xmm2
    719 ; SSE-NEXT:    psrlq $32, %xmm2
    720 ; SSE-NEXT:    pmuludq %xmm3, %xmm2
    721 ; SSE-NEXT:    movdqa %xmm3, %xmm4
    722 ; SSE-NEXT:    psrlq $32, %xmm4
    723 ; SSE-NEXT:    pmuludq %xmm1, %xmm4
    724 ; SSE-NEXT:    paddq %xmm2, %xmm4
    725 ; SSE-NEXT:    psllq $32, %xmm4
    726 ; SSE-NEXT:    pmuludq %xmm3, %xmm1
    727 ; SSE-NEXT:    paddq %xmm4, %xmm1
    728 ; SSE-NEXT:    retq
    729 ;
    730 ; AVX-LABEL: mul_v4i64:
    731 ; AVX:       # %bb.0: # %entry
    732 ; AVX-NEXT:    vpsrlq $32, %ymm0, %ymm2
    733 ; AVX-NEXT:    vpmuludq %ymm1, %ymm2, %ymm2
    734 ; AVX-NEXT:    vpsrlq $32, %ymm1, %ymm3
    735 ; AVX-NEXT:    vpmuludq %ymm3, %ymm0, %ymm3
    736 ; AVX-NEXT:    vpaddq %ymm2, %ymm3, %ymm2
    737 ; AVX-NEXT:    vpsllq $32, %ymm2, %ymm2
    738 ; AVX-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
    739 ; AVX-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
    740 ; AVX-NEXT:    retq
    741 entry:
    742   %A = mul <4 x i64> %i, %j
    743   ret <4 x i64> %A
    744 }
    745 
    746 define <64 x i8> @mul_v64i8c(<64 x i8> %i) nounwind  {
    747 ; SSE2-LABEL: mul_v64i8c:
    748 ; SSE2:       # %bb.0: # %entry
    749 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
    750 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
    751 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117]
    752 ; SSE2-NEXT:    pmullw %xmm4, %xmm6
    753 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255]
    754 ; SSE2-NEXT:    pand %xmm5, %xmm6
    755 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
    756 ; SSE2-NEXT:    pmullw %xmm4, %xmm0
    757 ; SSE2-NEXT:    pand %xmm5, %xmm0
    758 ; SSE2-NEXT:    packuswb %xmm6, %xmm0
    759 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
    760 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
    761 ; SSE2-NEXT:    pmullw %xmm4, %xmm6
    762 ; SSE2-NEXT:    pand %xmm5, %xmm6
    763 ; 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]
    764 ; SSE2-NEXT:    pmullw %xmm4, %xmm1
    765 ; SSE2-NEXT:    pand %xmm5, %xmm1
    766 ; SSE2-NEXT:    packuswb %xmm6, %xmm1
    767 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
    768 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
    769 ; SSE2-NEXT:    pmullw %xmm4, %xmm6
    770 ; SSE2-NEXT:    pand %xmm5, %xmm6
    771 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
    772 ; SSE2-NEXT:    pmullw %xmm4, %xmm2
    773 ; SSE2-NEXT:    pand %xmm5, %xmm2
    774 ; SSE2-NEXT:    packuswb %xmm6, %xmm2
    775 ; SSE2-NEXT:    movdqa %xmm3, %xmm6
    776 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
    777 ; SSE2-NEXT:    pmullw %xmm4, %xmm6
    778 ; SSE2-NEXT:    pand %xmm5, %xmm6
    779 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
    780 ; SSE2-NEXT:    pmullw %xmm4, %xmm3
    781 ; SSE2-NEXT:    pand %xmm5, %xmm3
    782 ; SSE2-NEXT:    packuswb %xmm6, %xmm3
    783 ; SSE2-NEXT:    retq
    784 ;
    785 ; SSE41-LABEL: mul_v64i8c:
    786 ; SSE41:       # %bb.0: # %entry
    787 ; SSE41-NEXT:    movdqa %xmm1, %xmm4
    788 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
    789 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
    790 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    791 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117]
    792 ; SSE41-NEXT:    pmullw %xmm6, %xmm1
    793 ; SSE41-NEXT:    movdqa {{.*#+}} xmm7 = [255,255,255,255,255,255,255,255]
    794 ; SSE41-NEXT:    pand %xmm7, %xmm1
    795 ; SSE41-NEXT:    pmullw %xmm6, %xmm0
    796 ; SSE41-NEXT:    pand %xmm7, %xmm0
    797 ; SSE41-NEXT:    packuswb %xmm1, %xmm0
    798 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm1 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
    799 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    800 ; SSE41-NEXT:    pmullw %xmm6, %xmm4
    801 ; SSE41-NEXT:    pand %xmm7, %xmm4
    802 ; SSE41-NEXT:    pmullw %xmm6, %xmm1
    803 ; SSE41-NEXT:    pand %xmm7, %xmm1
    804 ; SSE41-NEXT:    packuswb %xmm4, %xmm1
    805 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm4 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
    806 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    807 ; SSE41-NEXT:    pmullw %xmm6, %xmm2
    808 ; SSE41-NEXT:    pand %xmm7, %xmm2
    809 ; SSE41-NEXT:    pmullw %xmm6, %xmm4
    810 ; SSE41-NEXT:    pand %xmm7, %xmm4
    811 ; SSE41-NEXT:    packuswb %xmm2, %xmm4
    812 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm5 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
    813 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    814 ; SSE41-NEXT:    pmullw %xmm6, %xmm3
    815 ; SSE41-NEXT:    pand %xmm7, %xmm3
    816 ; SSE41-NEXT:    pmullw %xmm6, %xmm5
    817 ; SSE41-NEXT:    pand %xmm7, %xmm5
    818 ; SSE41-NEXT:    packuswb %xmm3, %xmm5
    819 ; SSE41-NEXT:    movdqa %xmm4, %xmm2
    820 ; SSE41-NEXT:    movdqa %xmm5, %xmm3
    821 ; SSE41-NEXT:    retq
    822 ;
    823 ; AVX2-LABEL: mul_v64i8c:
    824 ; AVX2:       # %bb.0: # %entry
    825 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
    826 ; AVX2-NEXT:    vpmovsxbw %xmm2, %ymm2
    827 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117]
    828 ; AVX2-NEXT:    vpmullw %ymm3, %ymm2, %ymm2
    829 ; AVX2-NEXT:    vextracti128 $1, %ymm2, %xmm4
    830 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm5 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
    831 ; AVX2-NEXT:    vpshufb %xmm5, %xmm4, %xmm4
    832 ; AVX2-NEXT:    vpshufb %xmm5, %xmm2, %xmm2
    833 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm4[0]
    834 ; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm0
    835 ; AVX2-NEXT:    vpmullw %ymm3, %ymm0, %ymm0
    836 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
    837 ; AVX2-NEXT:    vpshufb %xmm5, %xmm4, %xmm4
    838 ; AVX2-NEXT:    vpshufb %xmm5, %xmm0, %xmm0
    839 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm4[0]
    840 ; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
    841 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
    842 ; AVX2-NEXT:    vpmovsxbw %xmm2, %ymm2
    843 ; AVX2-NEXT:    vpmullw %ymm3, %ymm2, %ymm2
    844 ; AVX2-NEXT:    vextracti128 $1, %ymm2, %xmm4
    845 ; AVX2-NEXT:    vpshufb %xmm5, %xmm4, %xmm4
    846 ; AVX2-NEXT:    vpshufb %xmm5, %xmm2, %xmm2
    847 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm4[0]
    848 ; AVX2-NEXT:    vpmovsxbw %xmm1, %ymm1
    849 ; AVX2-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
    850 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm3
    851 ; AVX2-NEXT:    vpshufb %xmm5, %xmm3, %xmm3
    852 ; AVX2-NEXT:    vpshufb %xmm5, %xmm1, %xmm1
    853 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
    854 ; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
    855 ; AVX2-NEXT:    retq
    856 ;
    857 ; AVX512F-LABEL: mul_v64i8c:
    858 ; AVX512F:       # %bb.0: # %entry
    859 ; AVX512F-NEXT:    vpmovsxbw %xmm0, %ymm2
    860 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm3 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117]
    861 ; AVX512F-NEXT:    vpmullw %ymm3, %ymm2, %ymm2
    862 ; AVX512F-NEXT:    vpmovsxwd %ymm2, %zmm2
    863 ; AVX512F-NEXT:    vpmovdb %zmm2, %xmm2
    864 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm0
    865 ; AVX512F-NEXT:    vpmovsxbw %xmm0, %ymm0
    866 ; AVX512F-NEXT:    vpmullw %ymm3, %ymm0, %ymm0
    867 ; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0
    868 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
    869 ; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm2, %ymm0
    870 ; AVX512F-NEXT:    vpmovsxbw %xmm1, %ymm2
    871 ; AVX512F-NEXT:    vpmullw %ymm3, %ymm2, %ymm2
    872 ; AVX512F-NEXT:    vpmovsxwd %ymm2, %zmm2
    873 ; AVX512F-NEXT:    vpmovdb %zmm2, %xmm2
    874 ; AVX512F-NEXT:    vextracti128 $1, %ymm1, %xmm1
    875 ; AVX512F-NEXT:    vpmovsxbw %xmm1, %ymm1
    876 ; AVX512F-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
    877 ; AVX512F-NEXT:    vpmovsxwd %ymm1, %zmm1
    878 ; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
    879 ; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm2, %ymm1
    880 ; AVX512F-NEXT:    retq
    881 ;
    882 ; AVX512BW-LABEL: mul_v64i8c:
    883 ; AVX512BW:       # %bb.0: # %entry
    884 ; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm1
    885 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117]
    886 ; AVX512BW-NEXT:    vpmullw %zmm2, %zmm1, %zmm1
    887 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
    888 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm0
    889 ; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm0
    890 ; AVX512BW-NEXT:    vpmullw %zmm2, %zmm0, %zmm0
    891 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
    892 ; AVX512BW-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
    893 ; AVX512BW-NEXT:    retq
    894 entry:
    895   %A = mul <64 x i8> %i, < i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117 >
    896   ret <64 x i8> %A
    897 }
    898 
    899 define <64 x i8> @mul_v64i8(<64 x i8> %i, <64 x i8> %j) nounwind  {
    900 ; SSE2-LABEL: mul_v64i8:
    901 ; SSE2:       # %bb.0: # %entry
    902 ; SSE2-NEXT:    movdqa %xmm4, %xmm8
    903 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm0[8],xmm8[9],xmm0[9],xmm8[10],xmm0[10],xmm8[11],xmm0[11],xmm8[12],xmm0[12],xmm8[13],xmm0[13],xmm8[14],xmm0[14],xmm8[15],xmm0[15]
    904 ; SSE2-NEXT:    movdqa %xmm0, %xmm9
    905 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm9 = xmm9[8],xmm0[8],xmm9[9],xmm0[9],xmm9[10],xmm0[10],xmm9[11],xmm0[11],xmm9[12],xmm0[12],xmm9[13],xmm0[13],xmm9[14],xmm0[14],xmm9[15],xmm0[15]
    906 ; SSE2-NEXT:    pmullw %xmm8, %xmm9
    907 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255,255,255,255,255,255,255]
    908 ; SSE2-NEXT:    pand %xmm8, %xmm9
    909 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]
    910 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
    911 ; SSE2-NEXT:    pmullw %xmm4, %xmm0
    912 ; SSE2-NEXT:    pand %xmm8, %xmm0
    913 ; SSE2-NEXT:    packuswb %xmm9, %xmm0
    914 ; SSE2-NEXT:    movdqa %xmm5, %xmm9
    915 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm9 = xmm9[8],xmm0[8],xmm9[9],xmm0[9],xmm9[10],xmm0[10],xmm9[11],xmm0[11],xmm9[12],xmm0[12],xmm9[13],xmm0[13],xmm9[14],xmm0[14],xmm9[15],xmm0[15]
    916 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
    917 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15]
    918 ; SSE2-NEXT:    pmullw %xmm9, %xmm4
    919 ; SSE2-NEXT:    pand %xmm8, %xmm4
    920 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1],xmm5[2],xmm0[2],xmm5[3],xmm0[3],xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7]
    921 ; 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]
    922 ; SSE2-NEXT:    pmullw %xmm5, %xmm1
    923 ; SSE2-NEXT:    pand %xmm8, %xmm1
    924 ; SSE2-NEXT:    packuswb %xmm4, %xmm1
    925 ; SSE2-NEXT:    movdqa %xmm6, %xmm4
    926 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15]
    927 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
    928 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
    929 ; SSE2-NEXT:    pmullw %xmm4, %xmm5
    930 ; SSE2-NEXT:    pand %xmm8, %xmm5
    931 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm0[0],xmm6[1],xmm0[1],xmm6[2],xmm0[2],xmm6[3],xmm0[3],xmm6[4],xmm0[4],xmm6[5],xmm0[5],xmm6[6],xmm0[6],xmm6[7],xmm0[7]
    932 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
    933 ; SSE2-NEXT:    pmullw %xmm6, %xmm2
    934 ; SSE2-NEXT:    pand %xmm8, %xmm2
    935 ; SSE2-NEXT:    packuswb %xmm5, %xmm2
    936 ; SSE2-NEXT:    movdqa %xmm7, %xmm4
    937 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm0[8],xmm4[9],xmm0[9],xmm4[10],xmm0[10],xmm4[11],xmm0[11],xmm4[12],xmm0[12],xmm4[13],xmm0[13],xmm4[14],xmm0[14],xmm4[15],xmm0[15]
    938 ; SSE2-NEXT:    movdqa %xmm3, %xmm5
    939 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
    940 ; SSE2-NEXT:    pmullw %xmm4, %xmm5
    941 ; SSE2-NEXT:    pand %xmm8, %xmm5
    942 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm0[0],xmm7[1],xmm0[1],xmm7[2],xmm0[2],xmm7[3],xmm0[3],xmm7[4],xmm0[4],xmm7[5],xmm0[5],xmm7[6],xmm0[6],xmm7[7],xmm0[7]
    943 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
    944 ; SSE2-NEXT:    pmullw %xmm7, %xmm3
    945 ; SSE2-NEXT:    pand %xmm8, %xmm3
    946 ; SSE2-NEXT:    packuswb %xmm5, %xmm3
    947 ; SSE2-NEXT:    retq
    948 ;
    949 ; SSE41-LABEL: mul_v64i8:
    950 ; SSE41:       # %bb.0: # %entry
    951 ; SSE41-NEXT:    movdqa %xmm1, %xmm8
    952 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
    953 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm10 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
    954 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    955 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
    956 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    957 ; SSE41-NEXT:    pmullw %xmm4, %xmm1
    958 ; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [255,255,255,255,255,255,255,255]
    959 ; SSE41-NEXT:    pand %xmm9, %xmm1
    960 ; SSE41-NEXT:    pmullw %xmm10, %xmm0
    961 ; SSE41-NEXT:    pand %xmm9, %xmm0
    962 ; SSE41-NEXT:    packuswb %xmm1, %xmm0
    963 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm4 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
    964 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    965 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm1 = xmm8[0],zero,xmm8[1],zero,xmm8[2],zero,xmm8[3],zero,xmm8[4],zero,xmm8[5],zero,xmm8[6],zero,xmm8[7],zero
    966 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm8 = xmm8[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    967 ; SSE41-NEXT:    pmullw %xmm5, %xmm8
    968 ; SSE41-NEXT:    pand %xmm9, %xmm8
    969 ; SSE41-NEXT:    pmullw %xmm4, %xmm1
    970 ; SSE41-NEXT:    pand %xmm9, %xmm1
    971 ; SSE41-NEXT:    packuswb %xmm8, %xmm1
    972 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm5 = xmm6[0],zero,xmm6[1],zero,xmm6[2],zero,xmm6[3],zero,xmm6[4],zero,xmm6[5],zero,xmm6[6],zero,xmm6[7],zero
    973 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    974 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm4 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
    975 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    976 ; SSE41-NEXT:    pmullw %xmm6, %xmm2
    977 ; SSE41-NEXT:    pand %xmm9, %xmm2
    978 ; SSE41-NEXT:    pmullw %xmm5, %xmm4
    979 ; SSE41-NEXT:    pand %xmm9, %xmm4
    980 ; SSE41-NEXT:    packuswb %xmm2, %xmm4
    981 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm2 = xmm7[0],zero,xmm7[1],zero,xmm7[2],zero,xmm7[3],zero,xmm7[4],zero,xmm7[5],zero,xmm7[6],zero,xmm7[7],zero
    982 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm7 = xmm7[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    983 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm5 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
    984 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
    985 ; SSE41-NEXT:    pmullw %xmm7, %xmm3
    986 ; SSE41-NEXT:    pand %xmm9, %xmm3
    987 ; SSE41-NEXT:    pmullw %xmm2, %xmm5
    988 ; SSE41-NEXT:    pand %xmm9, %xmm5
    989 ; SSE41-NEXT:    packuswb %xmm3, %xmm5
    990 ; SSE41-NEXT:    movdqa %xmm4, %xmm2
    991 ; SSE41-NEXT:    movdqa %xmm5, %xmm3
    992 ; SSE41-NEXT:    retq
    993 ;
    994 ; AVX2-LABEL: mul_v64i8:
    995 ; AVX2:       # %bb.0: # %entry
    996 ; AVX2-NEXT:    vextracti128 $1, %ymm2, %xmm4
    997 ; AVX2-NEXT:    vpmovsxbw %xmm4, %ymm4
    998 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm5
    999 ; AVX2-NEXT:    vpmovsxbw %xmm5, %ymm5
   1000 ; AVX2-NEXT:    vpmullw %ymm4, %ymm5, %ymm5
   1001 ; AVX2-NEXT:    vextracti128 $1, %ymm5, %xmm6
   1002 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm4 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
   1003 ; AVX2-NEXT:    vpshufb %xmm4, %xmm6, %xmm6
   1004 ; AVX2-NEXT:    vpshufb %xmm4, %xmm5, %xmm5
   1005 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm6[0]
   1006 ; AVX2-NEXT:    vpmovsxbw %xmm2, %ymm2
   1007 ; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm0
   1008 ; AVX2-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
   1009 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
   1010 ; AVX2-NEXT:    vpshufb %xmm4, %xmm2, %xmm2
   1011 ; AVX2-NEXT:    vpshufb %xmm4, %xmm0, %xmm0
   1012 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
   1013 ; AVX2-NEXT:    vinserti128 $1, %xmm5, %ymm0, %ymm0
   1014 ; AVX2-NEXT:    vextracti128 $1, %ymm3, %xmm2
   1015 ; AVX2-NEXT:    vpmovsxbw %xmm2, %ymm2
   1016 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm5
   1017 ; AVX2-NEXT:    vpmovsxbw %xmm5, %ymm5
   1018 ; AVX2-NEXT:    vpmullw %ymm2, %ymm5, %ymm2
   1019 ; AVX2-NEXT:    vextracti128 $1, %ymm2, %xmm5
   1020 ; AVX2-NEXT:    vpshufb %xmm4, %xmm5, %xmm5
   1021 ; AVX2-NEXT:    vpshufb %xmm4, %xmm2, %xmm2
   1022 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm5[0]
   1023 ; AVX2-NEXT:    vpmovsxbw %xmm3, %ymm3
   1024 ; AVX2-NEXT:    vpmovsxbw %xmm1, %ymm1
   1025 ; AVX2-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
   1026 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm3
   1027 ; AVX2-NEXT:    vpshufb %xmm4, %xmm3, %xmm3
   1028 ; AVX2-NEXT:    vpshufb %xmm4, %xmm1, %xmm1
   1029 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
   1030 ; AVX2-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
   1031 ; AVX2-NEXT:    retq
   1032 ;
   1033 ; AVX512F-LABEL: mul_v64i8:
   1034 ; AVX512F:       # %bb.0: # %entry
   1035 ; AVX512F-NEXT:    vpmovsxbw %xmm2, %ymm4
   1036 ; AVX512F-NEXT:    vpmovsxbw %xmm0, %ymm5
   1037 ; AVX512F-NEXT:    vpmullw %ymm4, %ymm5, %ymm4
   1038 ; AVX512F-NEXT:    vpmovsxwd %ymm4, %zmm4
   1039 ; AVX512F-NEXT:    vpmovdb %zmm4, %xmm4
   1040 ; AVX512F-NEXT:    vextracti128 $1, %ymm2, %xmm2
   1041 ; AVX512F-NEXT:    vpmovsxbw %xmm2, %ymm2
   1042 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm0
   1043 ; AVX512F-NEXT:    vpmovsxbw %xmm0, %ymm0
   1044 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm0, %ymm0
   1045 ; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0
   1046 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
   1047 ; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm4, %ymm0
   1048 ; AVX512F-NEXT:    vpmovsxbw %xmm3, %ymm2
   1049 ; AVX512F-NEXT:    vpmovsxbw %xmm1, %ymm4
   1050 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm4, %ymm2
   1051 ; AVX512F-NEXT:    vpmovsxwd %ymm2, %zmm2
   1052 ; AVX512F-NEXT:    vpmovdb %zmm2, %xmm2
   1053 ; AVX512F-NEXT:    vextracti128 $1, %ymm3, %xmm3
   1054 ; AVX512F-NEXT:    vpmovsxbw %xmm3, %ymm3
   1055 ; AVX512F-NEXT:    vextracti128 $1, %ymm1, %xmm1
   1056 ; AVX512F-NEXT:    vpmovsxbw %xmm1, %ymm1
   1057 ; AVX512F-NEXT:    vpmullw %ymm3, %ymm1, %ymm1
   1058 ; AVX512F-NEXT:    vpmovsxwd %ymm1, %zmm1
   1059 ; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
   1060 ; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm2, %ymm1
   1061 ; AVX512F-NEXT:    retq
   1062 ;
   1063 ; AVX512BW-LABEL: mul_v64i8:
   1064 ; AVX512BW:       # %bb.0: # %entry
   1065 ; AVX512BW-NEXT:    vpmovsxbw %ymm1, %zmm2
   1066 ; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm3
   1067 ; AVX512BW-NEXT:    vpmullw %zmm2, %zmm3, %zmm2
   1068 ; AVX512BW-NEXT:    vpmovwb %zmm2, %ymm2
   1069 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
   1070 ; AVX512BW-NEXT:    vpmovsxbw %ymm1, %zmm1
   1071 ; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm0
   1072 ; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm0
   1073 ; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm0
   1074 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
   1075 ; AVX512BW-NEXT:    vinserti64x4 $1, %ymm0, %zmm2, %zmm0
   1076 ; AVX512BW-NEXT:    retq
   1077 entry:
   1078   %A = mul <64 x i8> %i, %j
   1079   ret <64 x i8> %A
   1080 }
   1081 
   1082 ; PR30845
   1083 define <4 x i32> @mul_v4i64_zero_upper(<4 x i32> %val1, <4 x i32> %val2) {
   1084 ; SSE2-LABEL: mul_v4i64_zero_upper:
   1085 ; SSE2:       # %bb.0: # %entry
   1086 ; SSE2-NEXT:    pxor %xmm3, %xmm3
   1087 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
   1088 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
   1089 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm3[2],xmm0[3],xmm3[3]
   1090 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
   1091 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
   1092 ; SSE2-NEXT:    pmuludq %xmm4, %xmm2
   1093 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]
   1094 ; SSE2-NEXT:    pmuludq %xmm0, %xmm1
   1095 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm1[1,3]
   1096 ; SSE2-NEXT:    movaps %xmm2, %xmm0
   1097 ; SSE2-NEXT:    retq
   1098 ;
   1099 ; SSE41-LABEL: mul_v4i64_zero_upper:
   1100 ; SSE41:       # %bb.0: # %entry
   1101 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
   1102 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero
   1103 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero
   1104 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
   1105 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm4 = xmm0[0],zero,xmm0[1],zero
   1106 ; SSE41-NEXT:    pmuludq %xmm2, %xmm4
   1107 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero
   1108 ; SSE41-NEXT:    pmuludq %xmm3, %xmm0
   1109 ; SSE41-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3],xmm4[1,3]
   1110 ; SSE41-NEXT:    retq
   1111 ;
   1112 ; AVX-LABEL: mul_v4i64_zero_upper:
   1113 ; AVX:       # %bb.0: # %entry
   1114 ; AVX-NEXT:    vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
   1115 ; AVX-NEXT:    vpmovzxdq {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
   1116 ; AVX-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
   1117 ; AVX-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1118 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]
   1119 ; AVX-NEXT:    vzeroupper
   1120 ; AVX-NEXT:    retq
   1121 entry:
   1122   %val1a = zext <4 x i32> %val1 to <4 x i64>
   1123   %val2a = zext <4 x i32> %val2 to <4 x i64>
   1124   %res64 = mul <4 x i64> %val1a, %val2a
   1125   %rescast = bitcast <4 x i64> %res64 to <8 x i32>
   1126   %res = shufflevector <8 x i32> %rescast, <8 x i32> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
   1127   ret <4 x i32> %res
   1128 }
   1129 
   1130 define <4 x i32> @mul_v4i64_zero_upper_left(<4 x i32> %val1, <4 x i64> %val2) {
   1131 ; SSE2-LABEL: mul_v4i64_zero_upper_left:
   1132 ; SSE2:       # %bb.0: # %entry
   1133 ; SSE2-NEXT:    pxor %xmm3, %xmm3
   1134 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
   1135 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
   1136 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm3[2],xmm0[3],xmm3[3]
   1137 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
   1138 ; SSE2-NEXT:    pmuludq %xmm2, %xmm3
   1139 ; SSE2-NEXT:    psrlq $32, %xmm2
   1140 ; SSE2-NEXT:    pmuludq %xmm0, %xmm2
   1141 ; SSE2-NEXT:    psllq $32, %xmm2
   1142 ; SSE2-NEXT:    paddq %xmm3, %xmm2
   1143 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
   1144 ; SSE2-NEXT:    pmuludq %xmm1, %xmm0
   1145 ; SSE2-NEXT:    psrlq $32, %xmm1
   1146 ; SSE2-NEXT:    pmuludq %xmm4, %xmm1
   1147 ; SSE2-NEXT:    psllq $32, %xmm1
   1148 ; SSE2-NEXT:    paddq %xmm1, %xmm0
   1149 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3],xmm2[1,3]
   1150 ; SSE2-NEXT:    retq
   1151 ;
   1152 ; SSE41-LABEL: mul_v4i64_zero_upper_left:
   1153 ; SSE41:       # %bb.0: # %entry
   1154 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,0,1]
   1155 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero
   1156 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm4 = xmm0[0],zero,xmm0[1],zero
   1157 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
   1158 ; SSE41-NEXT:    pmuludq %xmm1, %xmm0
   1159 ; SSE41-NEXT:    psrlq $32, %xmm1
   1160 ; SSE41-NEXT:    pmuludq %xmm4, %xmm1
   1161 ; SSE41-NEXT:    psllq $32, %xmm1
   1162 ; SSE41-NEXT:    paddq %xmm1, %xmm0
   1163 ; SSE41-NEXT:    movdqa %xmm3, %xmm1
   1164 ; SSE41-NEXT:    pmuludq %xmm2, %xmm1
   1165 ; SSE41-NEXT:    psrlq $32, %xmm2
   1166 ; SSE41-NEXT:    pmuludq %xmm3, %xmm2
   1167 ; SSE41-NEXT:    psllq $32, %xmm2
   1168 ; SSE41-NEXT:    paddq %xmm1, %xmm2
   1169 ; SSE41-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3],xmm2[1,3]
   1170 ; SSE41-NEXT:    retq
   1171 ;
   1172 ; AVX-LABEL: mul_v4i64_zero_upper_left:
   1173 ; AVX:       # %bb.0: # %entry
   1174 ; AVX-NEXT:    vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
   1175 ; AVX-NEXT:    vpmuludq %ymm1, %ymm0, %ymm2
   1176 ; AVX-NEXT:    vpsrlq $32, %ymm1, %ymm1
   1177 ; AVX-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
   1178 ; AVX-NEXT:    vpsllq $32, %ymm0, %ymm0
   1179 ; AVX-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
   1180 ; AVX-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1181 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]
   1182 ; AVX-NEXT:    vzeroupper
   1183 ; AVX-NEXT:    retq
   1184 entry:
   1185   %val1a = zext <4 x i32> %val1 to <4 x i64>
   1186   %res64 = mul <4 x i64> %val1a, %val2
   1187   %rescast = bitcast <4 x i64> %res64 to <8 x i32>
   1188   %res = shufflevector <8 x i32> %rescast, <8 x i32> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
   1189   ret <4 x i32> %res
   1190 }
   1191 
   1192 define <4 x i32> @mul_v4i64_zero_lower(<4 x i32> %val1, <4 x i64> %val2) {
   1193 ; SSE2-LABEL: mul_v4i64_zero_lower:
   1194 ; SSE2:       # %bb.0: # %entry
   1195 ; SSE2-NEXT:    pxor %xmm4, %xmm4
   1196 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
   1197 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
   1198 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm4[2],xmm0[3],xmm4[3]
   1199 ; SSE2-NEXT:    psrlq $32, %xmm2
   1200 ; SSE2-NEXT:    pmuludq %xmm0, %xmm2
   1201 ; SSE2-NEXT:    psrlq $32, %xmm1
   1202 ; SSE2-NEXT:    pmuludq %xmm1, %xmm3
   1203 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,2],xmm2[0,2]
   1204 ; SSE2-NEXT:    movaps %xmm3, %xmm0
   1205 ; SSE2-NEXT:    retq
   1206 ;
   1207 ; SSE41-LABEL: mul_v4i64_zero_lower:
   1208 ; SSE41:       # %bb.0: # %entry
   1209 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,0,1]
   1210 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero
   1211 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
   1212 ; SSE41-NEXT:    psrlq $32, %xmm1
   1213 ; SSE41-NEXT:    pmuludq %xmm1, %xmm0
   1214 ; SSE41-NEXT:    psrlq $32, %xmm2
   1215 ; SSE41-NEXT:    pmuludq %xmm3, %xmm2
   1216 ; SSE41-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
   1217 ; SSE41-NEXT:    retq
   1218 ;
   1219 ; AVX-LABEL: mul_v4i64_zero_lower:
   1220 ; AVX:       # %bb.0: # %entry
   1221 ; AVX-NEXT:    vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
   1222 ; AVX-NEXT:    vpsrlq $32, %ymm1, %ymm1
   1223 ; AVX-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
   1224 ; AVX-NEXT:    vpsllq $32, %ymm0, %ymm0
   1225 ; AVX-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1226 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]
   1227 ; AVX-NEXT:    vzeroupper
   1228 ; AVX-NEXT:    retq
   1229 entry:
   1230   %val1a = zext <4 x i32> %val1 to <4 x i64>
   1231   %val2a = and <4 x i64> %val2, <i64 -4294967296, i64 -4294967296, i64 -4294967296, i64 -4294967296>
   1232   %res64 = mul <4 x i64> %val1a, %val2a
   1233   %rescast = bitcast <4 x i64> %res64 to <8 x i32>
   1234   %res = shufflevector <8 x i32> %rescast, <8 x i32> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
   1235   ret <4 x i32> %res
   1236 }
   1237 
   1238 define <8 x i32> @mul_v8i64_zero_upper(<8 x i32> %val1, <8 x i32> %val2) {
   1239 ; SSE2-LABEL: mul_v8i64_zero_upper:
   1240 ; SSE2:       # %bb.0: # %entry
   1241 ; SSE2-NEXT:    pxor %xmm6, %xmm6
   1242 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
   1243 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
   1244 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm6[2],xmm0[3],xmm6[3]
   1245 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
   1246 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm6[0],xmm5[1],xmm6[1]
   1247 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm6[2],xmm1[3],xmm6[3]
   1248 ; SSE2-NEXT:    movdqa %xmm2, %xmm7
   1249 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm7 = xmm7[0],xmm6[0],xmm7[1],xmm6[1]
   1250 ; SSE2-NEXT:    pmuludq %xmm7, %xmm4
   1251 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm6[2],xmm2[3],xmm6[3]
   1252 ; SSE2-NEXT:    pmuludq %xmm0, %xmm2
   1253 ; SSE2-NEXT:    shufps {{.*#+}} xmm4 = xmm4[1,3],xmm2[1,3]
   1254 ; SSE2-NEXT:    movdqa %xmm3, %xmm0
   1255 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm6[0],xmm0[1],xmm6[1]
   1256 ; SSE2-NEXT:    pmuludq %xmm0, %xmm5
   1257 ; SSE2-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm6[2],xmm3[3],xmm6[3]
   1258 ; SSE2-NEXT:    pmuludq %xmm1, %xmm3
   1259 ; SSE2-NEXT:    shufps {{.*#+}} xmm5 = xmm5[1,3],xmm3[1,3]
   1260 ; SSE2-NEXT:    movaps %xmm4, %xmm0
   1261 ; SSE2-NEXT:    movaps %xmm5, %xmm1
   1262 ; SSE2-NEXT:    retq
   1263 ;
   1264 ; SSE41-LABEL: mul_v8i64_zero_upper:
   1265 ; SSE41:       # %bb.0: # %entry
   1266 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[2,3,0,1]
   1267 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
   1268 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero
   1269 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
   1270 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm6 = xmm0[0],zero,xmm0[1],zero
   1271 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm7 = xmm1[0],zero,xmm1[1],zero
   1272 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
   1273 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero
   1274 ; SSE41-NEXT:    pmuludq %xmm4, %xmm1
   1275 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm2[0],zero,xmm2[1],zero
   1276 ; SSE41-NEXT:    pmuludq %xmm5, %xmm0
   1277 ; SSE41-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]
   1278 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,0,1]
   1279 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero
   1280 ; SSE41-NEXT:    pmuludq %xmm6, %xmm2
   1281 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm1 = xmm3[0],zero,xmm3[1],zero
   1282 ; SSE41-NEXT:    pmuludq %xmm7, %xmm1
   1283 ; SSE41-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,3],xmm2[1,3]
   1284 ; SSE41-NEXT:    retq
   1285 ;
   1286 ; AVX2-LABEL: mul_v8i64_zero_upper:
   1287 ; AVX2:       # %bb.0: # %entry
   1288 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} ymm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
   1289 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
   1290 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
   1291 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} ymm3 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
   1292 ; AVX2-NEXT:    vpmuludq %ymm3, %ymm2, %ymm2
   1293 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm1
   1294 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
   1295 ; AVX2-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
   1296 ; AVX2-NEXT:    vshufps {{.*#+}} ymm0 = ymm2[1,3],ymm0[1,3],ymm2[5,7],ymm0[5,7]
   1297 ; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]
   1298 ; AVX2-NEXT:    retq
   1299 ;
   1300 ; AVX512-LABEL: mul_v8i64_zero_upper:
   1301 ; AVX512:       # %bb.0: # %entry
   1302 ; AVX512-NEXT:    vpmovzxdq {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero
   1303 ; AVX512-NEXT:    vpmovzxdq {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero
   1304 ; AVX512-NEXT:    vpmuludq %zmm1, %zmm0, %zmm0
   1305 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
   1306 ; AVX512-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm1[1,3],ymm0[5,7],ymm1[5,7]
   1307 ; AVX512-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,2,1,3]
   1308 ; AVX512-NEXT:    retq
   1309 entry:
   1310   %val1a = zext <8 x i32> %val1 to <8 x i64>
   1311   %val2a = zext <8 x i32> %val2 to <8 x i64>
   1312   %res64 = mul <8 x i64> %val1a, %val2a
   1313   %rescast = bitcast <8 x i64> %res64 to <16 x i32>
   1314   %res = shufflevector <16 x i32> %rescast, <16 x i32> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7,i32 9, i32 11, i32 13, i32 15 >
   1315   ret <8 x i32> %res
   1316 }
   1317 
   1318 define <8 x i64> @mul_v8i64_sext(<8 x i16> %val1, <8 x i32> %val2) {
   1319 ; SSE2-LABEL: mul_v8i64_sext:
   1320 ; SSE2:       # %bb.0:
   1321 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
   1322 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
   1323 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm9 = xmm9[4],xmm0[4],xmm9[5],xmm0[5],xmm9[6],xmm0[6],xmm9[7],xmm0[7]
   1324 ; SSE2-NEXT:    movdqa %xmm9, %xmm0
   1325 ; SSE2-NEXT:    psrad $31, %xmm0
   1326 ; SSE2-NEXT:    psrad $16, %xmm9
   1327 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm9 = xmm9[0],xmm0[0],xmm9[1],xmm0[1]
   1328 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
   1329 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
   1330 ; SSE2-NEXT:    psrad $31, %xmm3
   1331 ; SSE2-NEXT:    psrad $16, %xmm0
   1332 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
   1333 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,0,1]
   1334 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm8 = xmm3[0,2,2,3,4,5,6,7]
   1335 ; SSE2-NEXT:    movdqa %xmm8, %xmm3
   1336 ; SSE2-NEXT:    psrad $31, %xmm3
   1337 ; SSE2-NEXT:    psrad $16, %xmm8
   1338 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm8 = xmm8[0],xmm3[0],xmm8[1],xmm3[1]
   1339 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm7 = xmm1[0,2,2,3,4,5,6,7]
   1340 ; SSE2-NEXT:    movdqa %xmm7, %xmm1
   1341 ; SSE2-NEXT:    psrad $31, %xmm1
   1342 ; SSE2-NEXT:    psrad $16, %xmm7
   1343 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm7 = xmm7[0],xmm1[0],xmm7[1],xmm1[1]
   1344 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[2,3,0,1]
   1345 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
   1346 ; SSE2-NEXT:    psrad $31, %xmm1
   1347 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
   1348 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
   1349 ; SSE2-NEXT:    psrad $31, %xmm1
   1350 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
   1351 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[2,3,0,1]
   1352 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
   1353 ; SSE2-NEXT:    psrad $31, %xmm5
   1354 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm5[0],xmm1[1],xmm5[1]
   1355 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
   1356 ; SSE2-NEXT:    psrad $31, %xmm5
   1357 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1]
   1358 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
   1359 ; SSE2-NEXT:    psrlq $32, %xmm5
   1360 ; SSE2-NEXT:    pmuludq %xmm0, %xmm5
   1361 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
   1362 ; SSE2-NEXT:    psrlq $32, %xmm6
   1363 ; SSE2-NEXT:    pmuludq %xmm4, %xmm6
   1364 ; SSE2-NEXT:    paddq %xmm5, %xmm6
   1365 ; SSE2-NEXT:    psllq $32, %xmm6
   1366 ; SSE2-NEXT:    pmuludq %xmm4, %xmm0
   1367 ; SSE2-NEXT:    paddq %xmm6, %xmm0
   1368 ; SSE2-NEXT:    movdqa %xmm7, %xmm4
   1369 ; SSE2-NEXT:    psrlq $32, %xmm4
   1370 ; SSE2-NEXT:    pmuludq %xmm1, %xmm4
   1371 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
   1372 ; SSE2-NEXT:    psrlq $32, %xmm5
   1373 ; SSE2-NEXT:    pmuludq %xmm7, %xmm5
   1374 ; SSE2-NEXT:    paddq %xmm4, %xmm5
   1375 ; SSE2-NEXT:    psllq $32, %xmm5
   1376 ; SSE2-NEXT:    pmuludq %xmm7, %xmm1
   1377 ; SSE2-NEXT:    paddq %xmm5, %xmm1
   1378 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
   1379 ; SSE2-NEXT:    psrlq $32, %xmm4
   1380 ; SSE2-NEXT:    pmuludq %xmm9, %xmm4
   1381 ; SSE2-NEXT:    movdqa %xmm9, %xmm5
   1382 ; SSE2-NEXT:    psrlq $32, %xmm5
   1383 ; SSE2-NEXT:    pmuludq %xmm2, %xmm5
   1384 ; SSE2-NEXT:    paddq %xmm4, %xmm5
   1385 ; SSE2-NEXT:    psllq $32, %xmm5
   1386 ; SSE2-NEXT:    pmuludq %xmm9, %xmm2
   1387 ; SSE2-NEXT:    paddq %xmm5, %xmm2
   1388 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
   1389 ; SSE2-NEXT:    psrlq $32, %xmm4
   1390 ; SSE2-NEXT:    pmuludq %xmm8, %xmm4
   1391 ; SSE2-NEXT:    movdqa %xmm8, %xmm5
   1392 ; SSE2-NEXT:    psrlq $32, %xmm5
   1393 ; SSE2-NEXT:    pmuludq %xmm3, %xmm5
   1394 ; SSE2-NEXT:    paddq %xmm4, %xmm5
   1395 ; SSE2-NEXT:    psllq $32, %xmm5
   1396 ; SSE2-NEXT:    pmuludq %xmm8, %xmm3
   1397 ; SSE2-NEXT:    paddq %xmm5, %xmm3
   1398 ; SSE2-NEXT:    retq
   1399 ;
   1400 ; SSE41-LABEL: mul_v8i64_sext:
   1401 ; SSE41:       # %bb.0:
   1402 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[3,1,2,3]
   1403 ; SSE41-NEXT:    pmovsxwq %xmm3, %xmm4
   1404 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,0,1]
   1405 ; SSE41-NEXT:    pmovsxwq %xmm3, %xmm5
   1406 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,2,3]
   1407 ; SSE41-NEXT:    pmovsxwq %xmm3, %xmm6
   1408 ; SSE41-NEXT:    pmovsxwq %xmm0, %xmm7
   1409 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
   1410 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm3
   1411 ; SSE41-NEXT:    pmuldq %xmm4, %xmm3
   1412 ; SSE41-NEXT:    pmovsxdq %xmm2, %xmm2
   1413 ; SSE41-NEXT:    pmuldq %xmm5, %xmm2
   1414 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
   1415 ; SSE41-NEXT:    pmovsxdq %xmm0, %xmm4
   1416 ; SSE41-NEXT:    pmuldq %xmm6, %xmm4
   1417 ; SSE41-NEXT:    pmovsxdq %xmm1, %xmm0
   1418 ; SSE41-NEXT:    pmuldq %xmm7, %xmm0
   1419 ; SSE41-NEXT:    movdqa %xmm4, %xmm1
   1420 ; SSE41-NEXT:    retq
   1421 ;
   1422 ; AVX2-LABEL: mul_v8i64_sext:
   1423 ; AVX2:       # %bb.0:
   1424 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
   1425 ; AVX2-NEXT:    vpmovsxwq %xmm2, %ymm2
   1426 ; AVX2-NEXT:    vpmovsxwq %xmm0, %ymm0
   1427 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm3
   1428 ; AVX2-NEXT:    vpmovsxdq %xmm3, %ymm3
   1429 ; AVX2-NEXT:    vpmuldq %ymm3, %ymm2, %ymm2
   1430 ; AVX2-NEXT:    vpmovsxdq %xmm1, %ymm1
   1431 ; AVX2-NEXT:    vpmuldq %ymm1, %ymm0, %ymm0
   1432 ; AVX2-NEXT:    vmovdqa %ymm2, %ymm1
   1433 ; AVX2-NEXT:    retq
   1434 ;
   1435 ; AVX512-LABEL: mul_v8i64_sext:
   1436 ; AVX512:       # %bb.0:
   1437 ; AVX512-NEXT:    vpmovsxwq %xmm0, %zmm0
   1438 ; AVX512-NEXT:    vpmovzxdq {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero
   1439 ; AVX512-NEXT:    vpmuldq %zmm1, %zmm0, %zmm0
   1440 ; AVX512-NEXT:    retq
   1441   %1 = sext <8 x i16> %val1 to <8 x i64>
   1442   %2 = sext <8 x i32> %val2 to <8 x i64>
   1443   %3 = mul <8 x i64> %1, %2
   1444   ret <8 x i64> %3
   1445 }
   1446