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