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-unknwon -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE41
      3 ; RUN: llc < %s -mtriple=x86_64-unknwon -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
      4 ; RUN: llc < %s -mtriple=x86_64-unknwon -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
      5 ; RUN: llc < %s -mtriple=i686-unknwon -mattr=+avx2 | FileCheck %s --check-prefix=X32-AVX2
      6 
      7 ; PR14887
      8 ; These tests inject a store into the chain to test the inreg versions of pmovsx
      9 
     10 define void @test1(<2 x i8>* %in, <2 x i64>* %out) nounwind {
     11 ; SSE41-LABEL: test1:
     12 ; SSE41:       # %bb.0:
     13 ; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
     14 ; SSE41-NEXT:    xorps %xmm1, %xmm1
     15 ; SSE41-NEXT:    movups %xmm1, (%rax)
     16 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
     17 ; SSE41-NEXT:    retq
     18 ;
     19 ; AVX-LABEL: test1:
     20 ; AVX:       # %bb.0:
     21 ; AVX-NEXT:    vpmovsxbq (%rdi), %xmm0
     22 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
     23 ; AVX-NEXT:    vmovups %xmm1, (%rax)
     24 ; AVX-NEXT:    vmovdqu %xmm0, (%rsi)
     25 ; AVX-NEXT:    retq
     26 ;
     27 ; X32-AVX2-LABEL: test1:
     28 ; X32-AVX2:       # %bb.0:
     29 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
     30 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
     31 ; X32-AVX2-NEXT:    vpmovsxbq (%ecx), %xmm0
     32 ; X32-AVX2-NEXT:    vxorps %xmm1, %xmm1, %xmm1
     33 ; X32-AVX2-NEXT:    vmovups %xmm1, (%eax)
     34 ; X32-AVX2-NEXT:    vmovdqu %xmm0, (%eax)
     35 ; X32-AVX2-NEXT:    retl
     36   %wide.load35 = load <2 x i8>, <2 x i8>* %in, align 1
     37   %sext = sext <2 x i8> %wide.load35 to <2 x i64>
     38   store <2 x i64> zeroinitializer, <2 x i64>* undef, align 8
     39   store <2 x i64> %sext, <2 x i64>* %out, align 8
     40   ret void
     41 }
     42 
     43 define void @test2(<4 x i8>* %in, <4 x i64>* %out) nounwind {
     44 ; SSE41-LABEL: test2:
     45 ; SSE41:       # %bb.0:
     46 ; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
     47 ; SSE41-NEXT:    pmovsxbq 2(%rdi), %xmm1
     48 ; SSE41-NEXT:    xorps %xmm2, %xmm2
     49 ; SSE41-NEXT:    movups %xmm2, (%rax)
     50 ; SSE41-NEXT:    movdqu %xmm1, 16(%rsi)
     51 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
     52 ; SSE41-NEXT:    retq
     53 ;
     54 ; AVX1-LABEL: test2:
     55 ; AVX1:       # %bb.0:
     56 ; AVX1-NEXT:    vpmovsxbd (%rdi), %xmm0
     57 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
     58 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
     59 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
     60 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
     61 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
     62 ; AVX1-NEXT:    vmovdqu %ymm1, (%rax)
     63 ; AVX1-NEXT:    vmovups %ymm0, (%rsi)
     64 ; AVX1-NEXT:    vzeroupper
     65 ; AVX1-NEXT:    retq
     66 ;
     67 ; AVX2-LABEL: test2:
     68 ; AVX2:       # %bb.0:
     69 ; AVX2-NEXT:    vpmovsxbq (%rdi), %ymm0
     70 ; AVX2-NEXT:    vxorps %xmm1, %xmm1, %xmm1
     71 ; AVX2-NEXT:    vmovups %ymm1, (%rax)
     72 ; AVX2-NEXT:    vmovdqu %ymm0, (%rsi)
     73 ; AVX2-NEXT:    vzeroupper
     74 ; AVX2-NEXT:    retq
     75 ;
     76 ; X32-AVX2-LABEL: test2:
     77 ; X32-AVX2:       # %bb.0:
     78 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
     79 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
     80 ; X32-AVX2-NEXT:    vpmovsxbq (%ecx), %ymm0
     81 ; X32-AVX2-NEXT:    vxorps %xmm1, %xmm1, %xmm1
     82 ; X32-AVX2-NEXT:    vmovups %ymm1, (%eax)
     83 ; X32-AVX2-NEXT:    vmovdqu %ymm0, (%eax)
     84 ; X32-AVX2-NEXT:    vzeroupper
     85 ; X32-AVX2-NEXT:    retl
     86   %wide.load35 = load <4 x i8>, <4 x i8>* %in, align 1
     87   %sext = sext <4 x i8> %wide.load35 to <4 x i64>
     88   store <4 x i64> zeroinitializer, <4 x i64>* undef, align 8
     89   store <4 x i64> %sext, <4 x i64>* %out, align 8
     90   ret void
     91 }
     92 
     93 define void @test3(<4 x i8>* %in, <4 x i32>* %out) nounwind {
     94 ; SSE41-LABEL: test3:
     95 ; SSE41:       # %bb.0:
     96 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
     97 ; SSE41-NEXT:    xorps %xmm1, %xmm1
     98 ; SSE41-NEXT:    movups %xmm1, (%rax)
     99 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
    100 ; SSE41-NEXT:    retq
    101 ;
    102 ; AVX-LABEL: test3:
    103 ; AVX:       # %bb.0:
    104 ; AVX-NEXT:    vpmovsxbd (%rdi), %xmm0
    105 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
    106 ; AVX-NEXT:    vmovups %xmm1, (%rax)
    107 ; AVX-NEXT:    vmovdqu %xmm0, (%rsi)
    108 ; AVX-NEXT:    retq
    109 ;
    110 ; X32-AVX2-LABEL: test3:
    111 ; X32-AVX2:       # %bb.0:
    112 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
    113 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    114 ; X32-AVX2-NEXT:    vpmovsxbd (%ecx), %xmm0
    115 ; X32-AVX2-NEXT:    vxorps %xmm1, %xmm1, %xmm1
    116 ; X32-AVX2-NEXT:    vmovups %xmm1, (%eax)
    117 ; X32-AVX2-NEXT:    vmovdqu %xmm0, (%eax)
    118 ; X32-AVX2-NEXT:    retl
    119   %wide.load35 = load <4 x i8>, <4 x i8>* %in, align 1
    120   %sext = sext <4 x i8> %wide.load35 to <4 x i32>
    121   store <4 x i32> zeroinitializer, <4 x i32>* undef, align 8
    122   store <4 x i32> %sext, <4 x i32>* %out, align 8
    123   ret void
    124 }
    125 
    126 define void @test4(<8 x i8>* %in, <8 x i32>* %out) nounwind {
    127 ; SSE41-LABEL: test4:
    128 ; SSE41:       # %bb.0:
    129 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
    130 ; SSE41-NEXT:    pmovsxbd 4(%rdi), %xmm1
    131 ; SSE41-NEXT:    xorps %xmm2, %xmm2
    132 ; SSE41-NEXT:    movups %xmm2, (%rax)
    133 ; SSE41-NEXT:    movdqu %xmm1, 16(%rsi)
    134 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
    135 ; SSE41-NEXT:    retq
    136 ;
    137 ; AVX1-LABEL: test4:
    138 ; AVX1:       # %bb.0:
    139 ; AVX1-NEXT:    vpmovsxbw (%rdi), %xmm0
    140 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm1
    141 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
    142 ; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
    143 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
    144 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
    145 ; AVX1-NEXT:    vmovdqu %ymm1, (%rax)
    146 ; AVX1-NEXT:    vmovups %ymm0, (%rsi)
    147 ; AVX1-NEXT:    vzeroupper
    148 ; AVX1-NEXT:    retq
    149 ;
    150 ; AVX2-LABEL: test4:
    151 ; AVX2:       # %bb.0:
    152 ; AVX2-NEXT:    vpmovsxbd (%rdi), %ymm0
    153 ; AVX2-NEXT:    vxorps %xmm1, %xmm1, %xmm1
    154 ; AVX2-NEXT:    vmovups %ymm1, (%rax)
    155 ; AVX2-NEXT:    vmovdqu %ymm0, (%rsi)
    156 ; AVX2-NEXT:    vzeroupper
    157 ; AVX2-NEXT:    retq
    158 ;
    159 ; X32-AVX2-LABEL: test4:
    160 ; X32-AVX2:       # %bb.0:
    161 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
    162 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    163 ; X32-AVX2-NEXT:    vpmovsxbd (%ecx), %ymm0
    164 ; X32-AVX2-NEXT:    vxorps %xmm1, %xmm1, %xmm1
    165 ; X32-AVX2-NEXT:    vmovups %ymm1, (%eax)
    166 ; X32-AVX2-NEXT:    vmovdqu %ymm0, (%eax)
    167 ; X32-AVX2-NEXT:    vzeroupper
    168 ; X32-AVX2-NEXT:    retl
    169   %wide.load35 = load <8 x i8>, <8 x i8>* %in, align 1
    170   %sext = sext <8 x i8> %wide.load35 to <8 x i32>
    171   store <8 x i32> zeroinitializer, <8 x i32>* undef, align 8
    172   store <8 x i32> %sext, <8 x i32>* %out, align 8
    173   ret void
    174 }
    175 
    176 define void @test5(<8 x i8>* %in, <8 x i16>* %out) nounwind {
    177 ; SSE41-LABEL: test5:
    178 ; SSE41:       # %bb.0:
    179 ; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
    180 ; SSE41-NEXT:    xorps %xmm1, %xmm1
    181 ; SSE41-NEXT:    movups %xmm1, (%rax)
    182 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
    183 ; SSE41-NEXT:    retq
    184 ;
    185 ; AVX-LABEL: test5:
    186 ; AVX:       # %bb.0:
    187 ; AVX-NEXT:    vpmovsxbw (%rdi), %xmm0
    188 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
    189 ; AVX-NEXT:    vmovups %xmm1, (%rax)
    190 ; AVX-NEXT:    vmovdqu %xmm0, (%rsi)
    191 ; AVX-NEXT:    retq
    192 ;
    193 ; X32-AVX2-LABEL: test5:
    194 ; X32-AVX2:       # %bb.0:
    195 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
    196 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    197 ; X32-AVX2-NEXT:    vpmovsxbw (%ecx), %xmm0
    198 ; X32-AVX2-NEXT:    vxorps %xmm1, %xmm1, %xmm1
    199 ; X32-AVX2-NEXT:    vmovups %xmm1, (%eax)
    200 ; X32-AVX2-NEXT:    vmovdqu %xmm0, (%eax)
    201 ; X32-AVX2-NEXT:    retl
    202   %wide.load35 = load <8 x i8>, <8 x i8>* %in, align 1
    203   %sext = sext <8 x i8> %wide.load35 to <8 x i16>
    204   store <8 x i16> zeroinitializer, <8 x i16>* undef, align 8
    205   store <8 x i16> %sext, <8 x i16>* %out, align 8
    206   ret void
    207 }
    208 
    209 define void @test6(<16 x i8>* %in, <16 x i16>* %out) nounwind {
    210 ; SSE41-LABEL: test6:
    211 ; SSE41:       # %bb.0:
    212 ; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
    213 ; SSE41-NEXT:    pmovsxbw 8(%rdi), %xmm1
    214 ; SSE41-NEXT:    xorps %xmm2, %xmm2
    215 ; SSE41-NEXT:    movups %xmm2, (%rax)
    216 ; SSE41-NEXT:    movdqu %xmm1, 16(%rsi)
    217 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
    218 ; SSE41-NEXT:    retq
    219 ;
    220 ; AVX1-LABEL: test6:
    221 ; AVX1:       # %bb.0:
    222 ; AVX1-NEXT:    vpmovsxbw 8(%rdi), %xmm0
    223 ; AVX1-NEXT:    vpmovsxbw (%rdi), %xmm1
    224 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
    225 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
    226 ; AVX1-NEXT:    vmovdqu %ymm1, (%rax)
    227 ; AVX1-NEXT:    vmovups %ymm0, (%rsi)
    228 ; AVX1-NEXT:    vzeroupper
    229 ; AVX1-NEXT:    retq
    230 ;
    231 ; AVX2-LABEL: test6:
    232 ; AVX2:       # %bb.0:
    233 ; AVX2-NEXT:    vpmovsxbw (%rdi), %ymm0
    234 ; AVX2-NEXT:    vxorps %xmm1, %xmm1, %xmm1
    235 ; AVX2-NEXT:    vmovups %ymm1, (%rax)
    236 ; AVX2-NEXT:    vmovdqu %ymm0, (%rsi)
    237 ; AVX2-NEXT:    vzeroupper
    238 ; AVX2-NEXT:    retq
    239 ;
    240 ; X32-AVX2-LABEL: test6:
    241 ; X32-AVX2:       # %bb.0:
    242 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
    243 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    244 ; X32-AVX2-NEXT:    vpmovsxbw (%ecx), %ymm0
    245 ; X32-AVX2-NEXT:    vxorps %xmm1, %xmm1, %xmm1
    246 ; X32-AVX2-NEXT:    vmovups %ymm1, (%eax)
    247 ; X32-AVX2-NEXT:    vmovdqu %ymm0, (%eax)
    248 ; X32-AVX2-NEXT:    vzeroupper
    249 ; X32-AVX2-NEXT:    retl
    250   %wide.load35 = load <16 x i8>, <16 x i8>* %in, align 1
    251   %sext = sext <16 x i8> %wide.load35 to <16 x i16>
    252   store <16 x i16> zeroinitializer, <16 x i16>* undef, align 8
    253   store <16 x i16> %sext, <16 x i16>* %out, align 8
    254   ret void
    255 }
    256 
    257 define void @test7(<2 x i16>* %in, <2 x i64>* %out) nounwind {
    258 ; SSE41-LABEL: test7:
    259 ; SSE41:       # %bb.0:
    260 ; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
    261 ; SSE41-NEXT:    xorps %xmm1, %xmm1
    262 ; SSE41-NEXT:    movups %xmm1, (%rax)
    263 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
    264 ; SSE41-NEXT:    retq
    265 ;
    266 ; AVX-LABEL: test7:
    267 ; AVX:       # %bb.0:
    268 ; AVX-NEXT:    vpmovsxwq (%rdi), %xmm0
    269 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
    270 ; AVX-NEXT:    vmovups %xmm1, (%rax)
    271 ; AVX-NEXT:    vmovdqu %xmm0, (%rsi)
    272 ; AVX-NEXT:    retq
    273 ;
    274 ; X32-AVX2-LABEL: test7:
    275 ; X32-AVX2:       # %bb.0:
    276 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
    277 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    278 ; X32-AVX2-NEXT:    vpmovsxwq (%ecx), %xmm0
    279 ; X32-AVX2-NEXT:    vxorps %xmm1, %xmm1, %xmm1
    280 ; X32-AVX2-NEXT:    vmovups %xmm1, (%eax)
    281 ; X32-AVX2-NEXT:    vmovdqu %xmm0, (%eax)
    282 ; X32-AVX2-NEXT:    retl
    283   %wide.load35 = load <2 x i16>, <2 x i16>* %in, align 1
    284   %sext = sext <2 x i16> %wide.load35 to <2 x i64>
    285   store <2 x i64> zeroinitializer, <2 x i64>* undef, align 8
    286   store <2 x i64> %sext, <2 x i64>* %out, align 8
    287   ret void
    288 }
    289 
    290 define void @test8(<4 x i16>* %in, <4 x i64>* %out) nounwind {
    291 ; SSE41-LABEL: test8:
    292 ; SSE41:       # %bb.0:
    293 ; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
    294 ; SSE41-NEXT:    pmovsxwq 4(%rdi), %xmm1
    295 ; SSE41-NEXT:    xorps %xmm2, %xmm2
    296 ; SSE41-NEXT:    movups %xmm2, (%rax)
    297 ; SSE41-NEXT:    movdqu %xmm1, 16(%rsi)
    298 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
    299 ; SSE41-NEXT:    retq
    300 ;
    301 ; AVX1-LABEL: test8:
    302 ; AVX1:       # %bb.0:
    303 ; AVX1-NEXT:    vpmovsxwd (%rdi), %xmm0
    304 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
    305 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
    306 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
    307 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
    308 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
    309 ; AVX1-NEXT:    vmovdqu %ymm1, (%rax)
    310 ; AVX1-NEXT:    vmovups %ymm0, (%rsi)
    311 ; AVX1-NEXT:    vzeroupper
    312 ; AVX1-NEXT:    retq
    313 ;
    314 ; AVX2-LABEL: test8:
    315 ; AVX2:       # %bb.0:
    316 ; AVX2-NEXT:    vpmovsxwq (%rdi), %ymm0
    317 ; AVX2-NEXT:    vxorps %xmm1, %xmm1, %xmm1
    318 ; AVX2-NEXT:    vmovups %ymm1, (%rax)
    319 ; AVX2-NEXT:    vmovdqu %ymm0, (%rsi)
    320 ; AVX2-NEXT:    vzeroupper
    321 ; AVX2-NEXT:    retq
    322 ;
    323 ; X32-AVX2-LABEL: test8:
    324 ; X32-AVX2:       # %bb.0:
    325 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
    326 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    327 ; X32-AVX2-NEXT:    vpmovsxwq (%ecx), %ymm0
    328 ; X32-AVX2-NEXT:    vxorps %xmm1, %xmm1, %xmm1
    329 ; X32-AVX2-NEXT:    vmovups %ymm1, (%eax)
    330 ; X32-AVX2-NEXT:    vmovdqu %ymm0, (%eax)
    331 ; X32-AVX2-NEXT:    vzeroupper
    332 ; X32-AVX2-NEXT:    retl
    333   %wide.load35 = load <4 x i16>, <4 x i16>* %in, align 1
    334   %sext = sext <4 x i16> %wide.load35 to <4 x i64>
    335   store <4 x i64> zeroinitializer, <4 x i64>* undef, align 8
    336   store <4 x i64> %sext, <4 x i64>* %out, align 8
    337   ret void
    338 }
    339 
    340 define void @test9(<4 x i16>* %in, <4 x i32>* %out) nounwind {
    341 ; SSE41-LABEL: test9:
    342 ; SSE41:       # %bb.0:
    343 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
    344 ; SSE41-NEXT:    xorps %xmm1, %xmm1
    345 ; SSE41-NEXT:    movups %xmm1, (%rax)
    346 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
    347 ; SSE41-NEXT:    retq
    348 ;
    349 ; AVX-LABEL: test9:
    350 ; AVX:       # %bb.0:
    351 ; AVX-NEXT:    vpmovsxwd (%rdi), %xmm0
    352 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
    353 ; AVX-NEXT:    vmovups %xmm1, (%rax)
    354 ; AVX-NEXT:    vmovdqu %xmm0, (%rsi)
    355 ; AVX-NEXT:    retq
    356 ;
    357 ; X32-AVX2-LABEL: test9:
    358 ; X32-AVX2:       # %bb.0:
    359 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
    360 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    361 ; X32-AVX2-NEXT:    vpmovsxwd (%ecx), %xmm0
    362 ; X32-AVX2-NEXT:    vxorps %xmm1, %xmm1, %xmm1
    363 ; X32-AVX2-NEXT:    vmovups %xmm1, (%eax)
    364 ; X32-AVX2-NEXT:    vmovdqu %xmm0, (%eax)
    365 ; X32-AVX2-NEXT:    retl
    366   %wide.load35 = load <4 x i16>, <4 x i16>* %in, align 1
    367   %sext = sext <4 x i16> %wide.load35 to <4 x i32>
    368   store <4 x i32> zeroinitializer, <4 x i32>* undef, align 8
    369   store <4 x i32> %sext, <4 x i32>* %out, align 8
    370   ret void
    371 }
    372 
    373 define void @test10(<8 x i16>* %in, <8 x i32>* %out) nounwind {
    374 ; SSE41-LABEL: test10:
    375 ; SSE41:       # %bb.0:
    376 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
    377 ; SSE41-NEXT:    pmovsxwd 8(%rdi), %xmm1
    378 ; SSE41-NEXT:    xorps %xmm2, %xmm2
    379 ; SSE41-NEXT:    movups %xmm2, (%rax)
    380 ; SSE41-NEXT:    movdqu %xmm1, 16(%rsi)
    381 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
    382 ; SSE41-NEXT:    retq
    383 ;
    384 ; AVX1-LABEL: test10:
    385 ; AVX1:       # %bb.0:
    386 ; AVX1-NEXT:    vpmovsxwd 8(%rdi), %xmm0
    387 ; AVX1-NEXT:    vpmovsxwd (%rdi), %xmm1
    388 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
    389 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
    390 ; AVX1-NEXT:    vmovdqu %ymm1, (%rax)
    391 ; AVX1-NEXT:    vmovups %ymm0, (%rsi)
    392 ; AVX1-NEXT:    vzeroupper
    393 ; AVX1-NEXT:    retq
    394 ;
    395 ; AVX2-LABEL: test10:
    396 ; AVX2:       # %bb.0:
    397 ; AVX2-NEXT:    vpmovsxwd (%rdi), %ymm0
    398 ; AVX2-NEXT:    vxorps %xmm1, %xmm1, %xmm1
    399 ; AVX2-NEXT:    vmovups %ymm1, (%rax)
    400 ; AVX2-NEXT:    vmovdqu %ymm0, (%rsi)
    401 ; AVX2-NEXT:    vzeroupper
    402 ; AVX2-NEXT:    retq
    403 ;
    404 ; X32-AVX2-LABEL: test10:
    405 ; X32-AVX2:       # %bb.0:
    406 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
    407 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    408 ; X32-AVX2-NEXT:    vpmovsxwd (%ecx), %ymm0
    409 ; X32-AVX2-NEXT:    vxorps %xmm1, %xmm1, %xmm1
    410 ; X32-AVX2-NEXT:    vmovups %ymm1, (%eax)
    411 ; X32-AVX2-NEXT:    vmovdqu %ymm0, (%eax)
    412 ; X32-AVX2-NEXT:    vzeroupper
    413 ; X32-AVX2-NEXT:    retl
    414   %wide.load35 = load <8 x i16>, <8 x i16>* %in, align 1
    415   %sext = sext <8 x i16> %wide.load35 to <8 x i32>
    416   store <8 x i32> zeroinitializer, <8 x i32>* undef, align 8
    417   store <8 x i32> %sext, <8 x i32>* %out, align 8
    418   ret void
    419 }
    420 
    421 define void @test11(<2 x i32>* %in, <2 x i64>* %out) nounwind {
    422 ; SSE41-LABEL: test11:
    423 ; SSE41:       # %bb.0:
    424 ; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
    425 ; SSE41-NEXT:    xorps %xmm1, %xmm1
    426 ; SSE41-NEXT:    movups %xmm1, (%rax)
    427 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
    428 ; SSE41-NEXT:    retq
    429 ;
    430 ; AVX-LABEL: test11:
    431 ; AVX:       # %bb.0:
    432 ; AVX-NEXT:    vpmovsxdq (%rdi), %xmm0
    433 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
    434 ; AVX-NEXT:    vmovups %xmm1, (%rax)
    435 ; AVX-NEXT:    vmovdqu %xmm0, (%rsi)
    436 ; AVX-NEXT:    retq
    437 ;
    438 ; X32-AVX2-LABEL: test11:
    439 ; X32-AVX2:       # %bb.0:
    440 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
    441 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    442 ; X32-AVX2-NEXT:    vpmovsxdq (%ecx), %xmm0
    443 ; X32-AVX2-NEXT:    vxorps %xmm1, %xmm1, %xmm1
    444 ; X32-AVX2-NEXT:    vmovups %xmm1, (%eax)
    445 ; X32-AVX2-NEXT:    vmovdqu %xmm0, (%eax)
    446 ; X32-AVX2-NEXT:    retl
    447   %wide.load35 = load <2 x i32>, <2 x i32>* %in, align 1
    448   %sext = sext <2 x i32> %wide.load35 to <2 x i64>
    449   store <2 x i64> zeroinitializer, <2 x i64>* undef, align 8
    450   store <2 x i64> %sext, <2 x i64>* %out, align 8
    451   ret void
    452 }
    453 
    454 define void @test12(<4 x i32>* %in, <4 x i64>* %out) nounwind {
    455 ; SSE41-LABEL: test12:
    456 ; SSE41:       # %bb.0:
    457 ; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
    458 ; SSE41-NEXT:    pmovsxdq 8(%rdi), %xmm1
    459 ; SSE41-NEXT:    xorps %xmm2, %xmm2
    460 ; SSE41-NEXT:    movups %xmm2, (%rax)
    461 ; SSE41-NEXT:    movdqu %xmm1, 16(%rsi)
    462 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
    463 ; SSE41-NEXT:    retq
    464 ;
    465 ; AVX1-LABEL: test12:
    466 ; AVX1:       # %bb.0:
    467 ; AVX1-NEXT:    vpmovsxdq 8(%rdi), %xmm0
    468 ; AVX1-NEXT:    vpmovsxdq (%rdi), %xmm1
    469 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
    470 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
    471 ; AVX1-NEXT:    vmovdqu %ymm1, (%rax)
    472 ; AVX1-NEXT:    vmovups %ymm0, (%rsi)
    473 ; AVX1-NEXT:    vzeroupper
    474 ; AVX1-NEXT:    retq
    475 ;
    476 ; AVX2-LABEL: test12:
    477 ; AVX2:       # %bb.0:
    478 ; AVX2-NEXT:    vpmovsxdq (%rdi), %ymm0
    479 ; AVX2-NEXT:    vxorps %xmm1, %xmm1, %xmm1
    480 ; AVX2-NEXT:    vmovups %ymm1, (%rax)
    481 ; AVX2-NEXT:    vmovdqu %ymm0, (%rsi)
    482 ; AVX2-NEXT:    vzeroupper
    483 ; AVX2-NEXT:    retq
    484 ;
    485 ; X32-AVX2-LABEL: test12:
    486 ; X32-AVX2:       # %bb.0:
    487 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
    488 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    489 ; X32-AVX2-NEXT:    vpmovsxdq (%ecx), %ymm0
    490 ; X32-AVX2-NEXT:    vxorps %xmm1, %xmm1, %xmm1
    491 ; X32-AVX2-NEXT:    vmovups %ymm1, (%eax)
    492 ; X32-AVX2-NEXT:    vmovdqu %ymm0, (%eax)
    493 ; X32-AVX2-NEXT:    vzeroupper
    494 ; X32-AVX2-NEXT:    retl
    495   %wide.load35 = load <4 x i32>, <4 x i32>* %in, align 1
    496   %sext = sext <4 x i32> %wide.load35 to <4 x i64>
    497   store <4 x i64> zeroinitializer, <4 x i64>* undef, align 8
    498   store <4 x i64> %sext, <4 x i64>* %out, align 8
    499   ret void
    500 }
    501