1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2 3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41 4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1 5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512F 7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512BW 8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512VL 9 10 define <4 x float> @test_v4f32(<4 x float>* %src) { 11 ; SSE2-LABEL: test_v4f32: 12 ; SSE2: # BB#0: 13 ; SSE2-NEXT: movaps (%rdi), %xmm0 14 ; SSE2-NEXT: retq 15 ; 16 ; SSE41-LABEL: test_v4f32: 17 ; SSE41: # BB#0: 18 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 19 ; SSE41-NEXT: retq 20 ; 21 ; AVX-LABEL: test_v4f32: 22 ; AVX: # BB#0: 23 ; AVX-NEXT: vmovntdqa (%rdi), %xmm0 24 ; AVX-NEXT: retq 25 ; 26 ; AVX512-LABEL: test_v4f32: 27 ; AVX512: # BB#0: 28 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm0 29 ; AVX512-NEXT: retq 30 %1 = load <4 x float>, <4 x float>* %src, align 16, !nontemporal !1 31 ret <4 x float> %1 32 } 33 34 define <4 x i32> @test_v4i32(<4 x i32>* %src) { 35 ; SSE2-LABEL: test_v4i32: 36 ; SSE2: # BB#0: 37 ; SSE2-NEXT: movaps (%rdi), %xmm0 38 ; SSE2-NEXT: retq 39 ; 40 ; SSE41-LABEL: test_v4i32: 41 ; SSE41: # BB#0: 42 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 43 ; SSE41-NEXT: retq 44 ; 45 ; AVX-LABEL: test_v4i32: 46 ; AVX: # BB#0: 47 ; AVX-NEXT: vmovntdqa (%rdi), %xmm0 48 ; AVX-NEXT: retq 49 ; 50 ; AVX512F-LABEL: test_v4i32: 51 ; AVX512F: # BB#0: 52 ; AVX512F-NEXT: vmovntdqa (%rdi), %xmm0 53 ; AVX512F-NEXT: retq 54 ; 55 ; AVX512BW-LABEL: test_v4i32: 56 ; AVX512BW: # BB#0: 57 ; AVX512BW-NEXT: vmovntdqa (%rdi), %xmm0 58 ; AVX512BW-NEXT: retq 59 ; 60 ; AVX512VL-LABEL: test_v4i32: 61 ; AVX512VL: # BB#0: 62 ; AVX512VL-NEXT: vmovdqa32 (%rdi), %xmm0 63 ; AVX512VL-NEXT: retq 64 %1 = load <4 x i32>, <4 x i32>* %src, align 16, !nontemporal !1 65 ret <4 x i32> %1 66 } 67 68 define <2 x double> @test_v2f64(<2 x double>* %src) { 69 ; SSE2-LABEL: test_v2f64: 70 ; SSE2: # BB#0: 71 ; SSE2-NEXT: movaps (%rdi), %xmm0 72 ; SSE2-NEXT: retq 73 ; 74 ; SSE41-LABEL: test_v2f64: 75 ; SSE41: # BB#0: 76 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 77 ; SSE41-NEXT: retq 78 ; 79 ; AVX-LABEL: test_v2f64: 80 ; AVX: # BB#0: 81 ; AVX-NEXT: vmovntdqa (%rdi), %xmm0 82 ; AVX-NEXT: retq 83 ; 84 ; AVX512-LABEL: test_v2f64: 85 ; AVX512: # BB#0: 86 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm0 87 ; AVX512-NEXT: retq 88 %1 = load <2 x double>, <2 x double>* %src, align 16, !nontemporal !1 89 ret <2 x double> %1 90 } 91 92 define <2 x i64> @test_v2i64(<2 x i64>* %src) { 93 ; SSE2-LABEL: test_v2i64: 94 ; SSE2: # BB#0: 95 ; SSE2-NEXT: movaps (%rdi), %xmm0 96 ; SSE2-NEXT: retq 97 ; 98 ; SSE41-LABEL: test_v2i64: 99 ; SSE41: # BB#0: 100 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 101 ; SSE41-NEXT: retq 102 ; 103 ; AVX-LABEL: test_v2i64: 104 ; AVX: # BB#0: 105 ; AVX-NEXT: vmovntdqa (%rdi), %xmm0 106 ; AVX-NEXT: retq 107 ; 108 ; AVX512-LABEL: test_v2i64: 109 ; AVX512: # BB#0: 110 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm0 111 ; AVX512-NEXT: retq 112 %1 = load <2 x i64>, <2 x i64>* %src, align 16, !nontemporal !1 113 ret <2 x i64> %1 114 } 115 116 define <8 x i16> @test_v8i16(<8 x i16>* %src) { 117 ; SSE2-LABEL: test_v8i16: 118 ; SSE2: # BB#0: 119 ; SSE2-NEXT: movaps (%rdi), %xmm0 120 ; SSE2-NEXT: retq 121 ; 122 ; SSE41-LABEL: test_v8i16: 123 ; SSE41: # BB#0: 124 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 125 ; SSE41-NEXT: retq 126 ; 127 ; AVX-LABEL: test_v8i16: 128 ; AVX: # BB#0: 129 ; AVX-NEXT: vmovntdqa (%rdi), %xmm0 130 ; AVX-NEXT: retq 131 ; 132 ; AVX512-LABEL: test_v8i16: 133 ; AVX512: # BB#0: 134 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm0 135 ; AVX512-NEXT: retq 136 %1 = load <8 x i16>, <8 x i16>* %src, align 16, !nontemporal !1 137 ret <8 x i16> %1 138 } 139 140 define <16 x i8> @test_v16i8(<16 x i8>* %src) { 141 ; SSE2-LABEL: test_v16i8: 142 ; SSE2: # BB#0: 143 ; SSE2-NEXT: movaps (%rdi), %xmm0 144 ; SSE2-NEXT: retq 145 ; 146 ; SSE41-LABEL: test_v16i8: 147 ; SSE41: # BB#0: 148 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 149 ; SSE41-NEXT: retq 150 ; 151 ; AVX-LABEL: test_v16i8: 152 ; AVX: # BB#0: 153 ; AVX-NEXT: vmovntdqa (%rdi), %xmm0 154 ; AVX-NEXT: retq 155 ; 156 ; AVX512-LABEL: test_v16i8: 157 ; AVX512: # BB#0: 158 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm0 159 ; AVX512-NEXT: retq 160 %1 = load <16 x i8>, <16 x i8>* %src, align 16, !nontemporal !1 161 ret <16 x i8> %1 162 } 163 164 ; And now YMM versions. 165 166 define <8 x float> @test_v8f32(<8 x float>* %src) { 167 ; SSE2-LABEL: test_v8f32: 168 ; SSE2: # BB#0: 169 ; SSE2-NEXT: movaps (%rdi), %xmm0 170 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 171 ; SSE2-NEXT: retq 172 ; 173 ; SSE41-LABEL: test_v8f32: 174 ; SSE41: # BB#0: 175 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 176 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 177 ; SSE41-NEXT: retq 178 ; 179 ; AVX1-LABEL: test_v8f32: 180 ; AVX1: # BB#0: 181 ; AVX1-NEXT: vmovaps (%rdi), %ymm0 182 ; AVX1-NEXT: retq 183 ; 184 ; AVX2-LABEL: test_v8f32: 185 ; AVX2: # BB#0: 186 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 187 ; AVX2-NEXT: retq 188 ; 189 ; AVX512-LABEL: test_v8f32: 190 ; AVX512: # BB#0: 191 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0 192 ; AVX512-NEXT: retq 193 %1 = load <8 x float>, <8 x float>* %src, align 32, !nontemporal !1 194 ret <8 x float> %1 195 } 196 197 define <8 x i32> @test_v8i32(<8 x i32>* %src) { 198 ; SSE2-LABEL: test_v8i32: 199 ; SSE2: # BB#0: 200 ; SSE2-NEXT: movaps (%rdi), %xmm0 201 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 202 ; SSE2-NEXT: retq 203 ; 204 ; SSE41-LABEL: test_v8i32: 205 ; SSE41: # BB#0: 206 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 207 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 208 ; SSE41-NEXT: retq 209 ; 210 ; AVX1-LABEL: test_v8i32: 211 ; AVX1: # BB#0: 212 ; AVX1-NEXT: vmovaps (%rdi), %ymm0 213 ; AVX1-NEXT: retq 214 ; 215 ; AVX2-LABEL: test_v8i32: 216 ; AVX2: # BB#0: 217 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 218 ; AVX2-NEXT: retq 219 ; 220 ; AVX512F-LABEL: test_v8i32: 221 ; AVX512F: # BB#0: 222 ; AVX512F-NEXT: vmovntdqa (%rdi), %ymm0 223 ; AVX512F-NEXT: retq 224 ; 225 ; AVX512BW-LABEL: test_v8i32: 226 ; AVX512BW: # BB#0: 227 ; AVX512BW-NEXT: vmovntdqa (%rdi), %ymm0 228 ; AVX512BW-NEXT: retq 229 ; 230 ; AVX512VL-LABEL: test_v8i32: 231 ; AVX512VL: # BB#0: 232 ; AVX512VL-NEXT: vmovdqa32 (%rdi), %ymm0 233 ; AVX512VL-NEXT: retq 234 %1 = load <8 x i32>, <8 x i32>* %src, align 32, !nontemporal !1 235 ret <8 x i32> %1 236 } 237 238 define <4 x double> @test_v4f64(<4 x double>* %src) { 239 ; SSE2-LABEL: test_v4f64: 240 ; SSE2: # BB#0: 241 ; SSE2-NEXT: movaps (%rdi), %xmm0 242 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 243 ; SSE2-NEXT: retq 244 ; 245 ; SSE41-LABEL: test_v4f64: 246 ; SSE41: # BB#0: 247 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 248 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 249 ; SSE41-NEXT: retq 250 ; 251 ; AVX1-LABEL: test_v4f64: 252 ; AVX1: # BB#0: 253 ; AVX1-NEXT: vmovaps (%rdi), %ymm0 254 ; AVX1-NEXT: retq 255 ; 256 ; AVX2-LABEL: test_v4f64: 257 ; AVX2: # BB#0: 258 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 259 ; AVX2-NEXT: retq 260 ; 261 ; AVX512-LABEL: test_v4f64: 262 ; AVX512: # BB#0: 263 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0 264 ; AVX512-NEXT: retq 265 %1 = load <4 x double>, <4 x double>* %src, align 32, !nontemporal !1 266 ret <4 x double> %1 267 } 268 269 define <4 x i64> @test_v4i64(<4 x i64>* %src) { 270 ; SSE2-LABEL: test_v4i64: 271 ; SSE2: # BB#0: 272 ; SSE2-NEXT: movaps (%rdi), %xmm0 273 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 274 ; SSE2-NEXT: retq 275 ; 276 ; SSE41-LABEL: test_v4i64: 277 ; SSE41: # BB#0: 278 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 279 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 280 ; SSE41-NEXT: retq 281 ; 282 ; AVX1-LABEL: test_v4i64: 283 ; AVX1: # BB#0: 284 ; AVX1-NEXT: vmovaps (%rdi), %ymm0 285 ; AVX1-NEXT: retq 286 ; 287 ; AVX2-LABEL: test_v4i64: 288 ; AVX2: # BB#0: 289 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 290 ; AVX2-NEXT: retq 291 ; 292 ; AVX512-LABEL: test_v4i64: 293 ; AVX512: # BB#0: 294 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0 295 ; AVX512-NEXT: retq 296 %1 = load <4 x i64>, <4 x i64>* %src, align 32, !nontemporal !1 297 ret <4 x i64> %1 298 } 299 300 define <16 x i16> @test_v16i16(<16 x i16>* %src) { 301 ; SSE2-LABEL: test_v16i16: 302 ; SSE2: # BB#0: 303 ; SSE2-NEXT: movaps (%rdi), %xmm0 304 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 305 ; SSE2-NEXT: retq 306 ; 307 ; SSE41-LABEL: test_v16i16: 308 ; SSE41: # BB#0: 309 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 310 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 311 ; SSE41-NEXT: retq 312 ; 313 ; AVX1-LABEL: test_v16i16: 314 ; AVX1: # BB#0: 315 ; AVX1-NEXT: vmovaps (%rdi), %ymm0 316 ; AVX1-NEXT: retq 317 ; 318 ; AVX2-LABEL: test_v16i16: 319 ; AVX2: # BB#0: 320 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 321 ; AVX2-NEXT: retq 322 ; 323 ; AVX512-LABEL: test_v16i16: 324 ; AVX512: # BB#0: 325 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0 326 ; AVX512-NEXT: retq 327 %1 = load <16 x i16>, <16 x i16>* %src, align 32, !nontemporal !1 328 ret <16 x i16> %1 329 } 330 331 define <32 x i8> @test_v32i8(<32 x i8>* %src) { 332 ; SSE2-LABEL: test_v32i8: 333 ; SSE2: # BB#0: 334 ; SSE2-NEXT: movaps (%rdi), %xmm0 335 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 336 ; SSE2-NEXT: retq 337 ; 338 ; SSE41-LABEL: test_v32i8: 339 ; SSE41: # BB#0: 340 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 341 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 342 ; SSE41-NEXT: retq 343 ; 344 ; AVX1-LABEL: test_v32i8: 345 ; AVX1: # BB#0: 346 ; AVX1-NEXT: vmovaps (%rdi), %ymm0 347 ; AVX1-NEXT: retq 348 ; 349 ; AVX2-LABEL: test_v32i8: 350 ; AVX2: # BB#0: 351 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 352 ; AVX2-NEXT: retq 353 ; 354 ; AVX512-LABEL: test_v32i8: 355 ; AVX512: # BB#0: 356 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0 357 ; AVX512-NEXT: retq 358 %1 = load <32 x i8>, <32 x i8>* %src, align 32, !nontemporal !1 359 ret <32 x i8> %1 360 } 361 362 ; And now ZMM versions. 363 364 define <16 x float> @test_v16f32(<16 x float>* %src) { 365 ; SSE2-LABEL: test_v16f32: 366 ; SSE2: # BB#0: 367 ; SSE2-NEXT: movaps (%rdi), %xmm0 368 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 369 ; SSE2-NEXT: movaps 32(%rdi), %xmm2 370 ; SSE2-NEXT: movaps 48(%rdi), %xmm3 371 ; SSE2-NEXT: retq 372 ; 373 ; SSE41-LABEL: test_v16f32: 374 ; SSE41: # BB#0: 375 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 376 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 377 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2 378 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3 379 ; SSE41-NEXT: retq 380 ; 381 ; AVX1-LABEL: test_v16f32: 382 ; AVX1: # BB#0: 383 ; AVX1-NEXT: vmovaps (%rdi), %ymm0 384 ; AVX1-NEXT: vmovaps 32(%rdi), %ymm1 385 ; AVX1-NEXT: retq 386 ; 387 ; AVX2-LABEL: test_v16f32: 388 ; AVX2: # BB#0: 389 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 390 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1 391 ; AVX2-NEXT: retq 392 ; 393 ; AVX512-LABEL: test_v16f32: 394 ; AVX512: # BB#0: 395 ; AVX512-NEXT: vmovntdqa (%rdi), %zmm0 396 ; AVX512-NEXT: retq 397 %1 = load <16 x float>, <16 x float>* %src, align 64, !nontemporal !1 398 ret <16 x float> %1 399 } 400 401 define <16 x i32> @test_v16i32(<16 x i32>* %src) { 402 ; SSE2-LABEL: test_v16i32: 403 ; SSE2: # BB#0: 404 ; SSE2-NEXT: movaps (%rdi), %xmm0 405 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 406 ; SSE2-NEXT: movaps 32(%rdi), %xmm2 407 ; SSE2-NEXT: movaps 48(%rdi), %xmm3 408 ; SSE2-NEXT: retq 409 ; 410 ; SSE41-LABEL: test_v16i32: 411 ; SSE41: # BB#0: 412 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 413 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 414 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2 415 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3 416 ; SSE41-NEXT: retq 417 ; 418 ; AVX1-LABEL: test_v16i32: 419 ; AVX1: # BB#0: 420 ; AVX1-NEXT: vmovaps (%rdi), %ymm0 421 ; AVX1-NEXT: vmovaps 32(%rdi), %ymm1 422 ; AVX1-NEXT: retq 423 ; 424 ; AVX2-LABEL: test_v16i32: 425 ; AVX2: # BB#0: 426 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 427 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1 428 ; AVX2-NEXT: retq 429 ; 430 ; AVX512-LABEL: test_v16i32: 431 ; AVX512: # BB#0: 432 ; AVX512-NEXT: vmovntdqa (%rdi), %zmm0 433 ; AVX512-NEXT: retq 434 %1 = load <16 x i32>, <16 x i32>* %src, align 64, !nontemporal !1 435 ret <16 x i32> %1 436 } 437 438 define <8 x double> @test_v8f64(<8 x double>* %src) { 439 ; SSE2-LABEL: test_v8f64: 440 ; SSE2: # BB#0: 441 ; SSE2-NEXT: movaps (%rdi), %xmm0 442 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 443 ; SSE2-NEXT: movaps 32(%rdi), %xmm2 444 ; SSE2-NEXT: movaps 48(%rdi), %xmm3 445 ; SSE2-NEXT: retq 446 ; 447 ; SSE41-LABEL: test_v8f64: 448 ; SSE41: # BB#0: 449 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 450 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 451 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2 452 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3 453 ; SSE41-NEXT: retq 454 ; 455 ; AVX1-LABEL: test_v8f64: 456 ; AVX1: # BB#0: 457 ; AVX1-NEXT: vmovaps (%rdi), %ymm0 458 ; AVX1-NEXT: vmovaps 32(%rdi), %ymm1 459 ; AVX1-NEXT: retq 460 ; 461 ; AVX2-LABEL: test_v8f64: 462 ; AVX2: # BB#0: 463 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 464 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1 465 ; AVX2-NEXT: retq 466 ; 467 ; AVX512-LABEL: test_v8f64: 468 ; AVX512: # BB#0: 469 ; AVX512-NEXT: vmovntdqa (%rdi), %zmm0 470 ; AVX512-NEXT: retq 471 %1 = load <8 x double>, <8 x double>* %src, align 64, !nontemporal !1 472 ret <8 x double> %1 473 } 474 475 define <8 x i64> @test_v8i64(<8 x i64>* %src) { 476 ; SSE2-LABEL: test_v8i64: 477 ; SSE2: # BB#0: 478 ; SSE2-NEXT: movaps (%rdi), %xmm0 479 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 480 ; SSE2-NEXT: movaps 32(%rdi), %xmm2 481 ; SSE2-NEXT: movaps 48(%rdi), %xmm3 482 ; SSE2-NEXT: retq 483 ; 484 ; SSE41-LABEL: test_v8i64: 485 ; SSE41: # BB#0: 486 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 487 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 488 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2 489 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3 490 ; SSE41-NEXT: retq 491 ; 492 ; AVX1-LABEL: test_v8i64: 493 ; AVX1: # BB#0: 494 ; AVX1-NEXT: vmovaps (%rdi), %ymm0 495 ; AVX1-NEXT: vmovaps 32(%rdi), %ymm1 496 ; AVX1-NEXT: retq 497 ; 498 ; AVX2-LABEL: test_v8i64: 499 ; AVX2: # BB#0: 500 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 501 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1 502 ; AVX2-NEXT: retq 503 ; 504 ; AVX512-LABEL: test_v8i64: 505 ; AVX512: # BB#0: 506 ; AVX512-NEXT: vmovntdqa (%rdi), %zmm0 507 ; AVX512-NEXT: retq 508 %1 = load <8 x i64>, <8 x i64>* %src, align 64, !nontemporal !1 509 ret <8 x i64> %1 510 } 511 512 define <32 x i16> @test_v32i16(<32 x i16>* %src) { 513 ; SSE2-LABEL: test_v32i16: 514 ; SSE2: # BB#0: 515 ; SSE2-NEXT: movaps (%rdi), %xmm0 516 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 517 ; SSE2-NEXT: movaps 32(%rdi), %xmm2 518 ; SSE2-NEXT: movaps 48(%rdi), %xmm3 519 ; SSE2-NEXT: retq 520 ; 521 ; SSE41-LABEL: test_v32i16: 522 ; SSE41: # BB#0: 523 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 524 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 525 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2 526 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3 527 ; SSE41-NEXT: retq 528 ; 529 ; AVX1-LABEL: test_v32i16: 530 ; AVX1: # BB#0: 531 ; AVX1-NEXT: vmovaps (%rdi), %ymm0 532 ; AVX1-NEXT: vmovaps 32(%rdi), %ymm1 533 ; AVX1-NEXT: retq 534 ; 535 ; AVX2-LABEL: test_v32i16: 536 ; AVX2: # BB#0: 537 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 538 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1 539 ; AVX2-NEXT: retq 540 ; 541 ; AVX512F-LABEL: test_v32i16: 542 ; AVX512F: # BB#0: 543 ; AVX512F-NEXT: vmovntdqa (%rdi), %ymm0 544 ; AVX512F-NEXT: vmovntdqa 32(%rdi), %ymm1 545 ; AVX512F-NEXT: retq 546 ; 547 ; AVX512BW-LABEL: test_v32i16: 548 ; AVX512BW: # BB#0: 549 ; AVX512BW-NEXT: vmovntdqa (%rdi), %zmm0 550 ; AVX512BW-NEXT: retq 551 ; 552 ; AVX512VL-LABEL: test_v32i16: 553 ; AVX512VL: # BB#0: 554 ; AVX512VL-NEXT: vmovntdqa (%rdi), %ymm0 555 ; AVX512VL-NEXT: vmovntdqa 32(%rdi), %ymm1 556 ; AVX512VL-NEXT: retq 557 %1 = load <32 x i16>, <32 x i16>* %src, align 64, !nontemporal !1 558 ret <32 x i16> %1 559 } 560 561 define <64 x i8> @test_v64i8(<64 x i8>* %src) { 562 ; SSE2-LABEL: test_v64i8: 563 ; SSE2: # BB#0: 564 ; SSE2-NEXT: movaps (%rdi), %xmm0 565 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 566 ; SSE2-NEXT: movaps 32(%rdi), %xmm2 567 ; SSE2-NEXT: movaps 48(%rdi), %xmm3 568 ; SSE2-NEXT: retq 569 ; 570 ; SSE41-LABEL: test_v64i8: 571 ; SSE41: # BB#0: 572 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 573 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 574 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2 575 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3 576 ; SSE41-NEXT: retq 577 ; 578 ; AVX1-LABEL: test_v64i8: 579 ; AVX1: # BB#0: 580 ; AVX1-NEXT: vmovaps (%rdi), %ymm0 581 ; AVX1-NEXT: vmovaps 32(%rdi), %ymm1 582 ; AVX1-NEXT: retq 583 ; 584 ; AVX2-LABEL: test_v64i8: 585 ; AVX2: # BB#0: 586 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 587 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1 588 ; AVX2-NEXT: retq 589 ; 590 ; AVX512F-LABEL: test_v64i8: 591 ; AVX512F: # BB#0: 592 ; AVX512F-NEXT: vmovntdqa (%rdi), %ymm0 593 ; AVX512F-NEXT: vmovntdqa 32(%rdi), %ymm1 594 ; AVX512F-NEXT: retq 595 ; 596 ; AVX512BW-LABEL: test_v64i8: 597 ; AVX512BW: # BB#0: 598 ; AVX512BW-NEXT: vmovntdqa (%rdi), %zmm0 599 ; AVX512BW-NEXT: retq 600 ; 601 ; AVX512VL-LABEL: test_v64i8: 602 ; AVX512VL: # BB#0: 603 ; AVX512VL-NEXT: vmovntdqa (%rdi), %ymm0 604 ; AVX512VL-NEXT: vmovntdqa 32(%rdi), %ymm1 605 ; AVX512VL-NEXT: retq 606 %1 = load <64 x i8>, <64 x i8>* %src, align 64, !nontemporal !1 607 ret <64 x i8> %1 608 } 609 610 611 ; Check cases where the load would be folded. 612 613 define <4 x float> @test_arg_v4f32(<4 x float> %arg, <4 x float>* %src) { 614 ; SSE-LABEL: test_arg_v4f32: 615 ; SSE: # BB#0: 616 ; SSE-NEXT: addps (%rdi), %xmm0 617 ; SSE-NEXT: retq 618 ; 619 ; AVX-LABEL: test_arg_v4f32: 620 ; AVX: # BB#0: 621 ; AVX-NEXT: vaddps (%rdi), %xmm0, %xmm0 622 ; AVX-NEXT: retq 623 ; 624 ; AVX512-LABEL: test_arg_v4f32: 625 ; AVX512: # BB#0: 626 ; AVX512-NEXT: vaddps (%rdi), %xmm0, %xmm0 627 ; AVX512-NEXT: retq 628 %1 = load <4 x float>, <4 x float>* %src, align 16, !nontemporal !1 629 %2 = fadd <4 x float> %arg, %1 630 ret <4 x float> %2 631 } 632 633 define <4 x i32> @test_arg_v4i32(<4 x i32> %arg, <4 x i32>* %src) { 634 ; SSE-LABEL: test_arg_v4i32: 635 ; SSE: # BB#0: 636 ; SSE-NEXT: paddd (%rdi), %xmm0 637 ; SSE-NEXT: retq 638 ; 639 ; AVX-LABEL: test_arg_v4i32: 640 ; AVX: # BB#0: 641 ; AVX-NEXT: vpaddd (%rdi), %xmm0, %xmm0 642 ; AVX-NEXT: retq 643 ; 644 ; AVX512-LABEL: test_arg_v4i32: 645 ; AVX512: # BB#0: 646 ; AVX512-NEXT: vpaddd (%rdi), %xmm0, %xmm0 647 ; AVX512-NEXT: retq 648 %1 = load <4 x i32>, <4 x i32>* %src, align 16, !nontemporal !1 649 %2 = add <4 x i32> %arg, %1 650 ret <4 x i32> %2 651 } 652 653 define <2 x double> @test_arg_v2f64(<2 x double> %arg, <2 x double>* %src) { 654 ; SSE-LABEL: test_arg_v2f64: 655 ; SSE: # BB#0: 656 ; SSE-NEXT: addpd (%rdi), %xmm0 657 ; SSE-NEXT: retq 658 ; 659 ; AVX-LABEL: test_arg_v2f64: 660 ; AVX: # BB#0: 661 ; AVX-NEXT: vaddpd (%rdi), %xmm0, %xmm0 662 ; AVX-NEXT: retq 663 ; 664 ; AVX512-LABEL: test_arg_v2f64: 665 ; AVX512: # BB#0: 666 ; AVX512-NEXT: vaddpd (%rdi), %xmm0, %xmm0 667 ; AVX512-NEXT: retq 668 %1 = load <2 x double>, <2 x double>* %src, align 16, !nontemporal !1 669 %2 = fadd <2 x double> %arg, %1 670 ret <2 x double> %2 671 } 672 673 define <2 x i64> @test_arg_v2i64(<2 x i64> %arg, <2 x i64>* %src) { 674 ; SSE-LABEL: test_arg_v2i64: 675 ; SSE: # BB#0: 676 ; SSE-NEXT: paddq (%rdi), %xmm0 677 ; SSE-NEXT: retq 678 ; 679 ; AVX-LABEL: test_arg_v2i64: 680 ; AVX: # BB#0: 681 ; AVX-NEXT: vpaddq (%rdi), %xmm0, %xmm0 682 ; AVX-NEXT: retq 683 ; 684 ; AVX512-LABEL: test_arg_v2i64: 685 ; AVX512: # BB#0: 686 ; AVX512-NEXT: vpaddq (%rdi), %xmm0, %xmm0 687 ; AVX512-NEXT: retq 688 %1 = load <2 x i64>, <2 x i64>* %src, align 16, !nontemporal !1 689 %2 = add <2 x i64> %arg, %1 690 ret <2 x i64> %2 691 } 692 693 define <8 x i16> @test_arg_v8i16(<8 x i16> %arg, <8 x i16>* %src) { 694 ; SSE-LABEL: test_arg_v8i16: 695 ; SSE: # BB#0: 696 ; SSE-NEXT: paddw (%rdi), %xmm0 697 ; SSE-NEXT: retq 698 ; 699 ; AVX-LABEL: test_arg_v8i16: 700 ; AVX: # BB#0: 701 ; AVX-NEXT: vpaddw (%rdi), %xmm0, %xmm0 702 ; AVX-NEXT: retq 703 ; 704 ; AVX512-LABEL: test_arg_v8i16: 705 ; AVX512: # BB#0: 706 ; AVX512-NEXT: vpaddw (%rdi), %xmm0, %xmm0 707 ; AVX512-NEXT: retq 708 %1 = load <8 x i16>, <8 x i16>* %src, align 16, !nontemporal !1 709 %2 = add <8 x i16> %arg, %1 710 ret <8 x i16> %2 711 } 712 713 define <16 x i8> @test_arg_v16i8(<16 x i8> %arg, <16 x i8>* %src) { 714 ; SSE-LABEL: test_arg_v16i8: 715 ; SSE: # BB#0: 716 ; SSE-NEXT: paddb (%rdi), %xmm0 717 ; SSE-NEXT: retq 718 ; 719 ; AVX-LABEL: test_arg_v16i8: 720 ; AVX: # BB#0: 721 ; AVX-NEXT: vpaddb (%rdi), %xmm0, %xmm0 722 ; AVX-NEXT: retq 723 ; 724 ; AVX512-LABEL: test_arg_v16i8: 725 ; AVX512: # BB#0: 726 ; AVX512-NEXT: vpaddb (%rdi), %xmm0, %xmm0 727 ; AVX512-NEXT: retq 728 %1 = load <16 x i8>, <16 x i8>* %src, align 16, !nontemporal !1 729 %2 = add <16 x i8> %arg, %1 730 ret <16 x i8> %2 731 } 732 733 ; And now YMM versions. 734 735 define <8 x float> @test_arg_v8f32(<8 x float> %arg, <8 x float>* %src) { 736 ; SSE-LABEL: test_arg_v8f32: 737 ; SSE: # BB#0: 738 ; SSE-NEXT: addps (%rdi), %xmm0 739 ; SSE-NEXT: addps 16(%rdi), %xmm1 740 ; SSE-NEXT: retq 741 ; 742 ; AVX-LABEL: test_arg_v8f32: 743 ; AVX: # BB#0: 744 ; AVX-NEXT: vaddps (%rdi), %ymm0, %ymm0 745 ; AVX-NEXT: retq 746 ; 747 ; AVX512-LABEL: test_arg_v8f32: 748 ; AVX512: # BB#0: 749 ; AVX512-NEXT: vaddps (%rdi), %ymm0, %ymm0 750 ; AVX512-NEXT: retq 751 %1 = load <8 x float>, <8 x float>* %src, align 32, !nontemporal !1 752 %2 = fadd <8 x float> %arg, %1 753 ret <8 x float> %2 754 } 755 756 define <8 x i32> @test_arg_v8i32(<8 x i32> %arg, <8 x i32>* %src) { 757 ; SSE-LABEL: test_arg_v8i32: 758 ; SSE: # BB#0: 759 ; SSE-NEXT: paddd (%rdi), %xmm0 760 ; SSE-NEXT: paddd 16(%rdi), %xmm1 761 ; SSE-NEXT: retq 762 ; 763 ; AVX1-LABEL: test_arg_v8i32: 764 ; AVX1: # BB#0: 765 ; AVX1-NEXT: vmovaps (%rdi), %ymm1 766 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 767 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 768 ; AVX1-NEXT: vpaddd %xmm3, %xmm2, %xmm2 769 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0 770 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 771 ; AVX1-NEXT: retq 772 ; 773 ; AVX2-LABEL: test_arg_v8i32: 774 ; AVX2: # BB#0: 775 ; AVX2-NEXT: vpaddd (%rdi), %ymm0, %ymm0 776 ; AVX2-NEXT: retq 777 ; 778 ; AVX512-LABEL: test_arg_v8i32: 779 ; AVX512: # BB#0: 780 ; AVX512-NEXT: vpaddd (%rdi), %ymm0, %ymm0 781 ; AVX512-NEXT: retq 782 %1 = load <8 x i32>, <8 x i32>* %src, align 32, !nontemporal !1 783 %2 = add <8 x i32> %arg, %1 784 ret <8 x i32> %2 785 } 786 787 define <4 x double> @test_arg_v4f64(<4 x double> %arg, <4 x double>* %src) { 788 ; SSE-LABEL: test_arg_v4f64: 789 ; SSE: # BB#0: 790 ; SSE-NEXT: addpd (%rdi), %xmm0 791 ; SSE-NEXT: addpd 16(%rdi), %xmm1 792 ; SSE-NEXT: retq 793 ; 794 ; AVX-LABEL: test_arg_v4f64: 795 ; AVX: # BB#0: 796 ; AVX-NEXT: vaddpd (%rdi), %ymm0, %ymm0 797 ; AVX-NEXT: retq 798 ; 799 ; AVX512-LABEL: test_arg_v4f64: 800 ; AVX512: # BB#0: 801 ; AVX512-NEXT: vaddpd (%rdi), %ymm0, %ymm0 802 ; AVX512-NEXT: retq 803 %1 = load <4 x double>, <4 x double>* %src, align 32, !nontemporal !1 804 %2 = fadd <4 x double> %arg, %1 805 ret <4 x double> %2 806 } 807 808 define <4 x i64> @test_arg_v4i64(<4 x i64> %arg, <4 x i64>* %src) { 809 ; SSE-LABEL: test_arg_v4i64: 810 ; SSE: # BB#0: 811 ; SSE-NEXT: paddq (%rdi), %xmm0 812 ; SSE-NEXT: paddq 16(%rdi), %xmm1 813 ; SSE-NEXT: retq 814 ; 815 ; AVX1-LABEL: test_arg_v4i64: 816 ; AVX1: # BB#0: 817 ; AVX1-NEXT: vmovaps (%rdi), %ymm1 818 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 819 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 820 ; AVX1-NEXT: vpaddq %xmm3, %xmm2, %xmm2 821 ; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0 822 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 823 ; AVX1-NEXT: retq 824 ; 825 ; AVX2-LABEL: test_arg_v4i64: 826 ; AVX2: # BB#0: 827 ; AVX2-NEXT: vpaddq (%rdi), %ymm0, %ymm0 828 ; AVX2-NEXT: retq 829 ; 830 ; AVX512-LABEL: test_arg_v4i64: 831 ; AVX512: # BB#0: 832 ; AVX512-NEXT: vpaddq (%rdi), %ymm0, %ymm0 833 ; AVX512-NEXT: retq 834 %1 = load <4 x i64>, <4 x i64>* %src, align 32, !nontemporal !1 835 %2 = add <4 x i64> %arg, %1 836 ret <4 x i64> %2 837 } 838 839 define <16 x i16> @test_arg_v16i16(<16 x i16> %arg, <16 x i16>* %src) { 840 ; SSE-LABEL: test_arg_v16i16: 841 ; SSE: # BB#0: 842 ; SSE-NEXT: paddw (%rdi), %xmm0 843 ; SSE-NEXT: paddw 16(%rdi), %xmm1 844 ; SSE-NEXT: retq 845 ; 846 ; AVX1-LABEL: test_arg_v16i16: 847 ; AVX1: # BB#0: 848 ; AVX1-NEXT: vmovaps (%rdi), %ymm1 849 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 850 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 851 ; AVX1-NEXT: vpaddw %xmm3, %xmm2, %xmm2 852 ; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm0 853 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 854 ; AVX1-NEXT: retq 855 ; 856 ; AVX2-LABEL: test_arg_v16i16: 857 ; AVX2: # BB#0: 858 ; AVX2-NEXT: vpaddw (%rdi), %ymm0, %ymm0 859 ; AVX2-NEXT: retq 860 ; 861 ; AVX512-LABEL: test_arg_v16i16: 862 ; AVX512: # BB#0: 863 ; AVX512-NEXT: vpaddw (%rdi), %ymm0, %ymm0 864 ; AVX512-NEXT: retq 865 %1 = load <16 x i16>, <16 x i16>* %src, align 32, !nontemporal !1 866 %2 = add <16 x i16> %arg, %1 867 ret <16 x i16> %2 868 } 869 870 define <32 x i8> @test_arg_v32i8(<32 x i8> %arg, <32 x i8>* %src) { 871 ; SSE-LABEL: test_arg_v32i8: 872 ; SSE: # BB#0: 873 ; SSE-NEXT: paddb (%rdi), %xmm0 874 ; SSE-NEXT: paddb 16(%rdi), %xmm1 875 ; SSE-NEXT: retq 876 ; 877 ; AVX1-LABEL: test_arg_v32i8: 878 ; AVX1: # BB#0: 879 ; AVX1-NEXT: vmovaps (%rdi), %ymm1 880 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 881 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 882 ; AVX1-NEXT: vpaddb %xmm3, %xmm2, %xmm2 883 ; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm0 884 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 885 ; AVX1-NEXT: retq 886 ; 887 ; AVX2-LABEL: test_arg_v32i8: 888 ; AVX2: # BB#0: 889 ; AVX2-NEXT: vpaddb (%rdi), %ymm0, %ymm0 890 ; AVX2-NEXT: retq 891 ; 892 ; AVX512-LABEL: test_arg_v32i8: 893 ; AVX512: # BB#0: 894 ; AVX512-NEXT: vpaddb (%rdi), %ymm0, %ymm0 895 ; AVX512-NEXT: retq 896 %1 = load <32 x i8>, <32 x i8>* %src, align 32, !nontemporal !1 897 %2 = add <32 x i8> %arg, %1 898 ret <32 x i8> %2 899 } 900 901 ; And now ZMM versions. 902 903 define <16 x float> @test_arg_v16f32(<16 x float> %arg, <16 x float>* %src) { 904 ; SSE-LABEL: test_arg_v16f32: 905 ; SSE: # BB#0: 906 ; SSE-NEXT: addps (%rdi), %xmm0 907 ; SSE-NEXT: addps 16(%rdi), %xmm1 908 ; SSE-NEXT: addps 32(%rdi), %xmm2 909 ; SSE-NEXT: addps 48(%rdi), %xmm3 910 ; SSE-NEXT: retq 911 ; 912 ; AVX-LABEL: test_arg_v16f32: 913 ; AVX: # BB#0: 914 ; AVX-NEXT: vaddps (%rdi), %ymm0, %ymm0 915 ; AVX-NEXT: vaddps 32(%rdi), %ymm1, %ymm1 916 ; AVX-NEXT: retq 917 ; 918 ; AVX512-LABEL: test_arg_v16f32: 919 ; AVX512: # BB#0: 920 ; AVX512-NEXT: vaddps (%rdi), %zmm0, %zmm0 921 ; AVX512-NEXT: retq 922 %1 = load <16 x float>, <16 x float>* %src, align 64, !nontemporal !1 923 %2 = fadd <16 x float> %arg, %1 924 ret <16 x float> %2 925 } 926 927 define <16 x i32> @test_arg_v16i32(<16 x i32> %arg, <16 x i32>* %src) { 928 ; SSE-LABEL: test_arg_v16i32: 929 ; SSE: # BB#0: 930 ; SSE-NEXT: paddd (%rdi), %xmm0 931 ; SSE-NEXT: paddd 16(%rdi), %xmm1 932 ; SSE-NEXT: paddd 32(%rdi), %xmm2 933 ; SSE-NEXT: paddd 48(%rdi), %xmm3 934 ; SSE-NEXT: retq 935 ; 936 ; AVX1-LABEL: test_arg_v16i32: 937 ; AVX1: # BB#0: 938 ; AVX1-NEXT: vmovaps (%rdi), %ymm2 939 ; AVX1-NEXT: vmovaps 32(%rdi), %ymm3 940 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 941 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 942 ; AVX1-NEXT: vpaddd %xmm5, %xmm4, %xmm4 943 ; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm0 944 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 945 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 946 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 947 ; AVX1-NEXT: vpaddd %xmm4, %xmm2, %xmm2 948 ; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1 949 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 950 ; AVX1-NEXT: retq 951 ; 952 ; AVX2-LABEL: test_arg_v16i32: 953 ; AVX2: # BB#0: 954 ; AVX2-NEXT: vpaddd (%rdi), %ymm0, %ymm0 955 ; AVX2-NEXT: vpaddd 32(%rdi), %ymm1, %ymm1 956 ; AVX2-NEXT: retq 957 ; 958 ; AVX512-LABEL: test_arg_v16i32: 959 ; AVX512: # BB#0: 960 ; AVX512-NEXT: vpaddd (%rdi), %zmm0, %zmm0 961 ; AVX512-NEXT: retq 962 %1 = load <16 x i32>, <16 x i32>* %src, align 64, !nontemporal !1 963 %2 = add <16 x i32> %arg, %1 964 ret <16 x i32> %2 965 } 966 967 define <8 x double> @test_arg_v8f64(<8 x double> %arg, <8 x double>* %src) { 968 ; SSE-LABEL: test_arg_v8f64: 969 ; SSE: # BB#0: 970 ; SSE-NEXT: addpd (%rdi), %xmm0 971 ; SSE-NEXT: addpd 16(%rdi), %xmm1 972 ; SSE-NEXT: addpd 32(%rdi), %xmm2 973 ; SSE-NEXT: addpd 48(%rdi), %xmm3 974 ; SSE-NEXT: retq 975 ; 976 ; AVX-LABEL: test_arg_v8f64: 977 ; AVX: # BB#0: 978 ; AVX-NEXT: vaddpd (%rdi), %ymm0, %ymm0 979 ; AVX-NEXT: vaddpd 32(%rdi), %ymm1, %ymm1 980 ; AVX-NEXT: retq 981 ; 982 ; AVX512-LABEL: test_arg_v8f64: 983 ; AVX512: # BB#0: 984 ; AVX512-NEXT: vaddpd (%rdi), %zmm0, %zmm0 985 ; AVX512-NEXT: retq 986 %1 = load <8 x double>, <8 x double>* %src, align 64, !nontemporal !1 987 %2 = fadd <8 x double> %arg, %1 988 ret <8 x double> %2 989 } 990 991 define <8 x i64> @test_arg_v8i64(<8 x i64> %arg, <8 x i64>* %src) { 992 ; SSE-LABEL: test_arg_v8i64: 993 ; SSE: # BB#0: 994 ; SSE-NEXT: paddq (%rdi), %xmm0 995 ; SSE-NEXT: paddq 16(%rdi), %xmm1 996 ; SSE-NEXT: paddq 32(%rdi), %xmm2 997 ; SSE-NEXT: paddq 48(%rdi), %xmm3 998 ; SSE-NEXT: retq 999 ; 1000 ; AVX1-LABEL: test_arg_v8i64: 1001 ; AVX1: # BB#0: 1002 ; AVX1-NEXT: vmovaps (%rdi), %ymm2 1003 ; AVX1-NEXT: vmovaps 32(%rdi), %ymm3 1004 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 1005 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 1006 ; AVX1-NEXT: vpaddq %xmm5, %xmm4, %xmm4 1007 ; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm0 1008 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 1009 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1010 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 1011 ; AVX1-NEXT: vpaddq %xmm4, %xmm2, %xmm2 1012 ; AVX1-NEXT: vpaddq %xmm3, %xmm1, %xmm1 1013 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1014 ; AVX1-NEXT: retq 1015 ; 1016 ; AVX2-LABEL: test_arg_v8i64: 1017 ; AVX2: # BB#0: 1018 ; AVX2-NEXT: vpaddq (%rdi), %ymm0, %ymm0 1019 ; AVX2-NEXT: vpaddq 32(%rdi), %ymm1, %ymm1 1020 ; AVX2-NEXT: retq 1021 ; 1022 ; AVX512-LABEL: test_arg_v8i64: 1023 ; AVX512: # BB#0: 1024 ; AVX512-NEXT: vpaddq (%rdi), %zmm0, %zmm0 1025 ; AVX512-NEXT: retq 1026 %1 = load <8 x i64>, <8 x i64>* %src, align 64, !nontemporal !1 1027 %2 = add <8 x i64> %arg, %1 1028 ret <8 x i64> %2 1029 } 1030 1031 define <32 x i16> @test_arg_v32i16(<32 x i16> %arg, <32 x i16>* %src) { 1032 ; SSE-LABEL: test_arg_v32i16: 1033 ; SSE: # BB#0: 1034 ; SSE-NEXT: paddw (%rdi), %xmm0 1035 ; SSE-NEXT: paddw 16(%rdi), %xmm1 1036 ; SSE-NEXT: paddw 32(%rdi), %xmm2 1037 ; SSE-NEXT: paddw 48(%rdi), %xmm3 1038 ; SSE-NEXT: retq 1039 ; 1040 ; AVX1-LABEL: test_arg_v32i16: 1041 ; AVX1: # BB#0: 1042 ; AVX1-NEXT: vmovaps (%rdi), %ymm2 1043 ; AVX1-NEXT: vmovaps 32(%rdi), %ymm3 1044 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 1045 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 1046 ; AVX1-NEXT: vpaddw %xmm5, %xmm4, %xmm4 1047 ; AVX1-NEXT: vpaddw %xmm2, %xmm0, %xmm0 1048 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 1049 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1050 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 1051 ; AVX1-NEXT: vpaddw %xmm4, %xmm2, %xmm2 1052 ; AVX1-NEXT: vpaddw %xmm3, %xmm1, %xmm1 1053 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1054 ; AVX1-NEXT: retq 1055 ; 1056 ; AVX2-LABEL: test_arg_v32i16: 1057 ; AVX2: # BB#0: 1058 ; AVX2-NEXT: vpaddw (%rdi), %ymm0, %ymm0 1059 ; AVX2-NEXT: vpaddw 32(%rdi), %ymm1, %ymm1 1060 ; AVX2-NEXT: retq 1061 ; 1062 ; AVX512F-LABEL: test_arg_v32i16: 1063 ; AVX512F: # BB#0: 1064 ; AVX512F-NEXT: vpaddw (%rdi), %ymm0, %ymm0 1065 ; AVX512F-NEXT: vpaddw 32(%rdi), %ymm1, %ymm1 1066 ; AVX512F-NEXT: retq 1067 ; 1068 ; AVX512BW-LABEL: test_arg_v32i16: 1069 ; AVX512BW: # BB#0: 1070 ; AVX512BW-NEXT: vpaddw (%rdi), %zmm0, %zmm0 1071 ; AVX512BW-NEXT: retq 1072 ; 1073 ; AVX512VL-LABEL: test_arg_v32i16: 1074 ; AVX512VL: # BB#0: 1075 ; AVX512VL-NEXT: vpaddw (%rdi), %ymm0, %ymm0 1076 ; AVX512VL-NEXT: vpaddw 32(%rdi), %ymm1, %ymm1 1077 ; AVX512VL-NEXT: retq 1078 %1 = load <32 x i16>, <32 x i16>* %src, align 64, !nontemporal !1 1079 %2 = add <32 x i16> %arg, %1 1080 ret <32 x i16> %2 1081 } 1082 1083 define <64 x i8> @test_arg_v64i8(<64 x i8> %arg, <64 x i8>* %src) { 1084 ; SSE-LABEL: test_arg_v64i8: 1085 ; SSE: # BB#0: 1086 ; SSE-NEXT: paddb (%rdi), %xmm0 1087 ; SSE-NEXT: paddb 16(%rdi), %xmm1 1088 ; SSE-NEXT: paddb 32(%rdi), %xmm2 1089 ; SSE-NEXT: paddb 48(%rdi), %xmm3 1090 ; SSE-NEXT: retq 1091 ; 1092 ; AVX1-LABEL: test_arg_v64i8: 1093 ; AVX1: # BB#0: 1094 ; AVX1-NEXT: vmovaps (%rdi), %ymm2 1095 ; AVX1-NEXT: vmovaps 32(%rdi), %ymm3 1096 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 1097 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 1098 ; AVX1-NEXT: vpaddb %xmm5, %xmm4, %xmm4 1099 ; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0 1100 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 1101 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1102 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 1103 ; AVX1-NEXT: vpaddb %xmm4, %xmm2, %xmm2 1104 ; AVX1-NEXT: vpaddb %xmm3, %xmm1, %xmm1 1105 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1106 ; AVX1-NEXT: retq 1107 ; 1108 ; AVX2-LABEL: test_arg_v64i8: 1109 ; AVX2: # BB#0: 1110 ; AVX2-NEXT: vpaddb (%rdi), %ymm0, %ymm0 1111 ; AVX2-NEXT: vpaddb 32(%rdi), %ymm1, %ymm1 1112 ; AVX2-NEXT: retq 1113 ; 1114 ; AVX512F-LABEL: test_arg_v64i8: 1115 ; AVX512F: # BB#0: 1116 ; AVX512F-NEXT: vpaddb (%rdi), %ymm0, %ymm0 1117 ; AVX512F-NEXT: vpaddb 32(%rdi), %ymm1, %ymm1 1118 ; AVX512F-NEXT: retq 1119 ; 1120 ; AVX512BW-LABEL: test_arg_v64i8: 1121 ; AVX512BW: # BB#0: 1122 ; AVX512BW-NEXT: vpaddb (%rdi), %zmm0, %zmm0 1123 ; AVX512BW-NEXT: retq 1124 ; 1125 ; AVX512VL-LABEL: test_arg_v64i8: 1126 ; AVX512VL: # BB#0: 1127 ; AVX512VL-NEXT: vpaddb (%rdi), %ymm0, %ymm0 1128 ; AVX512VL-NEXT: vpaddb 32(%rdi), %ymm1, %ymm1 1129 ; AVX512VL-NEXT: retq 1130 %1 = load <64 x i8>, <64 x i8>* %src, align 64, !nontemporal !1 1131 %2 = add <64 x i8> %arg, %1 1132 ret <64 x i8> %2 1133 } 1134 1135 1136 ; Unaligned non-temporal loads (not supported) 1137 1138 define <4 x float> @test_unaligned_v4f32(<4 x float>* %src) { 1139 ; SSE-LABEL: test_unaligned_v4f32: 1140 ; SSE: # BB#0: 1141 ; SSE-NEXT: movups (%rdi), %xmm0 1142 ; SSE-NEXT: retq 1143 ; 1144 ; AVX-LABEL: test_unaligned_v4f32: 1145 ; AVX: # BB#0: 1146 ; AVX-NEXT: vmovups (%rdi), %xmm0 1147 ; AVX-NEXT: retq 1148 ; 1149 ; AVX512-LABEL: test_unaligned_v4f32: 1150 ; AVX512: # BB#0: 1151 ; AVX512-NEXT: vmovups (%rdi), %xmm0 1152 ; AVX512-NEXT: retq 1153 %1 = load <4 x float>, <4 x float>* %src, align 1, !nontemporal !1 1154 ret <4 x float> %1 1155 } 1156 1157 define <4 x i32> @test_unaligned_v4i32(<4 x i32>* %src) { 1158 ; SSE-LABEL: test_unaligned_v4i32: 1159 ; SSE: # BB#0: 1160 ; SSE-NEXT: movups (%rdi), %xmm0 1161 ; SSE-NEXT: retq 1162 ; 1163 ; AVX-LABEL: test_unaligned_v4i32: 1164 ; AVX: # BB#0: 1165 ; AVX-NEXT: vmovups (%rdi), %xmm0 1166 ; AVX-NEXT: retq 1167 ; 1168 ; AVX512F-LABEL: test_unaligned_v4i32: 1169 ; AVX512F: # BB#0: 1170 ; AVX512F-NEXT: vmovups (%rdi), %xmm0 1171 ; AVX512F-NEXT: retq 1172 ; 1173 ; AVX512BW-LABEL: test_unaligned_v4i32: 1174 ; AVX512BW: # BB#0: 1175 ; AVX512BW-NEXT: vmovups (%rdi), %xmm0 1176 ; AVX512BW-NEXT: retq 1177 ; 1178 ; AVX512VL-LABEL: test_unaligned_v4i32: 1179 ; AVX512VL: # BB#0: 1180 ; AVX512VL-NEXT: vmovdqu32 (%rdi), %xmm0 1181 ; AVX512VL-NEXT: retq 1182 %1 = load <4 x i32>, <4 x i32>* %src, align 1, !nontemporal !1 1183 ret <4 x i32> %1 1184 } 1185 1186 define <2 x double> @test_unaligned_v2f64(<2 x double>* %src) { 1187 ; SSE-LABEL: test_unaligned_v2f64: 1188 ; SSE: # BB#0: 1189 ; SSE-NEXT: movups (%rdi), %xmm0 1190 ; SSE-NEXT: retq 1191 ; 1192 ; AVX-LABEL: test_unaligned_v2f64: 1193 ; AVX: # BB#0: 1194 ; AVX-NEXT: vmovups (%rdi), %xmm0 1195 ; AVX-NEXT: retq 1196 ; 1197 ; AVX512F-LABEL: test_unaligned_v2f64: 1198 ; AVX512F: # BB#0: 1199 ; AVX512F-NEXT: vmovups (%rdi), %xmm0 1200 ; AVX512F-NEXT: retq 1201 ; 1202 ; AVX512BW-LABEL: test_unaligned_v2f64: 1203 ; AVX512BW: # BB#0: 1204 ; AVX512BW-NEXT: vmovups (%rdi), %xmm0 1205 ; AVX512BW-NEXT: retq 1206 ; 1207 ; AVX512VL-LABEL: test_unaligned_v2f64: 1208 ; AVX512VL: # BB#0: 1209 ; AVX512VL-NEXT: vmovupd (%rdi), %xmm0 1210 ; AVX512VL-NEXT: retq 1211 %1 = load <2 x double>, <2 x double>* %src, align 1, !nontemporal !1 1212 ret <2 x double> %1 1213 } 1214 1215 define <2 x i64> @test_unaligned_v2i64(<2 x i64>* %src) { 1216 ; SSE-LABEL: test_unaligned_v2i64: 1217 ; SSE: # BB#0: 1218 ; SSE-NEXT: movups (%rdi), %xmm0 1219 ; SSE-NEXT: retq 1220 ; 1221 ; AVX-LABEL: test_unaligned_v2i64: 1222 ; AVX: # BB#0: 1223 ; AVX-NEXT: vmovups (%rdi), %xmm0 1224 ; AVX-NEXT: retq 1225 ; 1226 ; AVX512F-LABEL: test_unaligned_v2i64: 1227 ; AVX512F: # BB#0: 1228 ; AVX512F-NEXT: vmovups (%rdi), %xmm0 1229 ; AVX512F-NEXT: retq 1230 ; 1231 ; AVX512BW-LABEL: test_unaligned_v2i64: 1232 ; AVX512BW: # BB#0: 1233 ; AVX512BW-NEXT: vmovups (%rdi), %xmm0 1234 ; AVX512BW-NEXT: retq 1235 ; 1236 ; AVX512VL-LABEL: test_unaligned_v2i64: 1237 ; AVX512VL: # BB#0: 1238 ; AVX512VL-NEXT: vmovdqu64 (%rdi), %xmm0 1239 ; AVX512VL-NEXT: retq 1240 %1 = load <2 x i64>, <2 x i64>* %src, align 1, !nontemporal !1 1241 ret <2 x i64> %1 1242 } 1243 1244 define <8 x i16> @test_unaligned_v8i16(<8 x i16>* %src) { 1245 ; SSE-LABEL: test_unaligned_v8i16: 1246 ; SSE: # BB#0: 1247 ; SSE-NEXT: movups (%rdi), %xmm0 1248 ; SSE-NEXT: retq 1249 ; 1250 ; AVX-LABEL: test_unaligned_v8i16: 1251 ; AVX: # BB#0: 1252 ; AVX-NEXT: vmovups (%rdi), %xmm0 1253 ; AVX-NEXT: retq 1254 ; 1255 ; AVX512F-LABEL: test_unaligned_v8i16: 1256 ; AVX512F: # BB#0: 1257 ; AVX512F-NEXT: vmovups (%rdi), %xmm0 1258 ; AVX512F-NEXT: retq 1259 ; 1260 ; AVX512BW-LABEL: test_unaligned_v8i16: 1261 ; AVX512BW: # BB#0: 1262 ; AVX512BW-NEXT: vmovups (%rdi), %xmm0 1263 ; AVX512BW-NEXT: retq 1264 ; 1265 ; AVX512VL-LABEL: test_unaligned_v8i16: 1266 ; AVX512VL: # BB#0: 1267 ; AVX512VL-NEXT: vmovdqu64 (%rdi), %xmm0 1268 ; AVX512VL-NEXT: retq 1269 %1 = load <8 x i16>, <8 x i16>* %src, align 1, !nontemporal !1 1270 ret <8 x i16> %1 1271 } 1272 1273 define <16 x i8> @test_unaligned_v16i8(<16 x i8>* %src) { 1274 ; SSE-LABEL: test_unaligned_v16i8: 1275 ; SSE: # BB#0: 1276 ; SSE-NEXT: movups (%rdi), %xmm0 1277 ; SSE-NEXT: retq 1278 ; 1279 ; AVX-LABEL: test_unaligned_v16i8: 1280 ; AVX: # BB#0: 1281 ; AVX-NEXT: vmovups (%rdi), %xmm0 1282 ; AVX-NEXT: retq 1283 ; 1284 ; AVX512F-LABEL: test_unaligned_v16i8: 1285 ; AVX512F: # BB#0: 1286 ; AVX512F-NEXT: vmovups (%rdi), %xmm0 1287 ; AVX512F-NEXT: retq 1288 ; 1289 ; AVX512BW-LABEL: test_unaligned_v16i8: 1290 ; AVX512BW: # BB#0: 1291 ; AVX512BW-NEXT: vmovups (%rdi), %xmm0 1292 ; AVX512BW-NEXT: retq 1293 ; 1294 ; AVX512VL-LABEL: test_unaligned_v16i8: 1295 ; AVX512VL: # BB#0: 1296 ; AVX512VL-NEXT: vmovdqu64 (%rdi), %xmm0 1297 ; AVX512VL-NEXT: retq 1298 %1 = load <16 x i8>, <16 x i8>* %src, align 1, !nontemporal !1 1299 ret <16 x i8> %1 1300 } 1301 1302 ; And now YMM versions. 1303 1304 define <8 x float> @test_unaligned_v8f32(<8 x float>* %src) { 1305 ; SSE-LABEL: test_unaligned_v8f32: 1306 ; SSE: # BB#0: 1307 ; SSE-NEXT: movups (%rdi), %xmm0 1308 ; SSE-NEXT: movups 16(%rdi), %xmm1 1309 ; SSE-NEXT: retq 1310 ; 1311 ; AVX-LABEL: test_unaligned_v8f32: 1312 ; AVX: # BB#0: 1313 ; AVX-NEXT: vmovups (%rdi), %ymm0 1314 ; AVX-NEXT: retq 1315 ; 1316 ; AVX512-LABEL: test_unaligned_v8f32: 1317 ; AVX512: # BB#0: 1318 ; AVX512-NEXT: vmovups (%rdi), %ymm0 1319 ; AVX512-NEXT: retq 1320 %1 = load <8 x float>, <8 x float>* %src, align 1, !nontemporal !1 1321 ret <8 x float> %1 1322 } 1323 1324 define <8 x i32> @test_unaligned_v8i32(<8 x i32>* %src) { 1325 ; SSE-LABEL: test_unaligned_v8i32: 1326 ; SSE: # BB#0: 1327 ; SSE-NEXT: movups (%rdi), %xmm0 1328 ; SSE-NEXT: movups 16(%rdi), %xmm1 1329 ; SSE-NEXT: retq 1330 ; 1331 ; AVX-LABEL: test_unaligned_v8i32: 1332 ; AVX: # BB#0: 1333 ; AVX-NEXT: vmovups (%rdi), %ymm0 1334 ; AVX-NEXT: retq 1335 ; 1336 ; AVX512F-LABEL: test_unaligned_v8i32: 1337 ; AVX512F: # BB#0: 1338 ; AVX512F-NEXT: vmovups (%rdi), %ymm0 1339 ; AVX512F-NEXT: retq 1340 ; 1341 ; AVX512BW-LABEL: test_unaligned_v8i32: 1342 ; AVX512BW: # BB#0: 1343 ; AVX512BW-NEXT: vmovups (%rdi), %ymm0 1344 ; AVX512BW-NEXT: retq 1345 ; 1346 ; AVX512VL-LABEL: test_unaligned_v8i32: 1347 ; AVX512VL: # BB#0: 1348 ; AVX512VL-NEXT: vmovdqu32 (%rdi), %ymm0 1349 ; AVX512VL-NEXT: retq 1350 %1 = load <8 x i32>, <8 x i32>* %src, align 1, !nontemporal !1 1351 ret <8 x i32> %1 1352 } 1353 1354 define <4 x double> @test_unaligned_v4f64(<4 x double>* %src) { 1355 ; SSE-LABEL: test_unaligned_v4f64: 1356 ; SSE: # BB#0: 1357 ; SSE-NEXT: movups (%rdi), %xmm0 1358 ; SSE-NEXT: movups 16(%rdi), %xmm1 1359 ; SSE-NEXT: retq 1360 ; 1361 ; AVX-LABEL: test_unaligned_v4f64: 1362 ; AVX: # BB#0: 1363 ; AVX-NEXT: vmovups (%rdi), %ymm0 1364 ; AVX-NEXT: retq 1365 ; 1366 ; AVX512F-LABEL: test_unaligned_v4f64: 1367 ; AVX512F: # BB#0: 1368 ; AVX512F-NEXT: vmovups (%rdi), %ymm0 1369 ; AVX512F-NEXT: retq 1370 ; 1371 ; AVX512BW-LABEL: test_unaligned_v4f64: 1372 ; AVX512BW: # BB#0: 1373 ; AVX512BW-NEXT: vmovups (%rdi), %ymm0 1374 ; AVX512BW-NEXT: retq 1375 ; 1376 ; AVX512VL-LABEL: test_unaligned_v4f64: 1377 ; AVX512VL: # BB#0: 1378 ; AVX512VL-NEXT: vmovupd (%rdi), %ymm0 1379 ; AVX512VL-NEXT: retq 1380 %1 = load <4 x double>, <4 x double>* %src, align 1, !nontemporal !1 1381 ret <4 x double> %1 1382 } 1383 1384 define <4 x i64> @test_unaligned_v4i64(<4 x i64>* %src) { 1385 ; SSE-LABEL: test_unaligned_v4i64: 1386 ; SSE: # BB#0: 1387 ; SSE-NEXT: movups (%rdi), %xmm0 1388 ; SSE-NEXT: movups 16(%rdi), %xmm1 1389 ; SSE-NEXT: retq 1390 ; 1391 ; AVX-LABEL: test_unaligned_v4i64: 1392 ; AVX: # BB#0: 1393 ; AVX-NEXT: vmovups (%rdi), %ymm0 1394 ; AVX-NEXT: retq 1395 ; 1396 ; AVX512F-LABEL: test_unaligned_v4i64: 1397 ; AVX512F: # BB#0: 1398 ; AVX512F-NEXT: vmovups (%rdi), %ymm0 1399 ; AVX512F-NEXT: retq 1400 ; 1401 ; AVX512BW-LABEL: test_unaligned_v4i64: 1402 ; AVX512BW: # BB#0: 1403 ; AVX512BW-NEXT: vmovups (%rdi), %ymm0 1404 ; AVX512BW-NEXT: retq 1405 ; 1406 ; AVX512VL-LABEL: test_unaligned_v4i64: 1407 ; AVX512VL: # BB#0: 1408 ; AVX512VL-NEXT: vmovdqu64 (%rdi), %ymm0 1409 ; AVX512VL-NEXT: retq 1410 %1 = load <4 x i64>, <4 x i64>* %src, align 1, !nontemporal !1 1411 ret <4 x i64> %1 1412 } 1413 1414 define <16 x i16> @test_unaligned_v16i16(<16 x i16>* %src) { 1415 ; SSE-LABEL: test_unaligned_v16i16: 1416 ; SSE: # BB#0: 1417 ; SSE-NEXT: movups (%rdi), %xmm0 1418 ; SSE-NEXT: movups 16(%rdi), %xmm1 1419 ; SSE-NEXT: retq 1420 ; 1421 ; AVX-LABEL: test_unaligned_v16i16: 1422 ; AVX: # BB#0: 1423 ; AVX-NEXT: vmovups (%rdi), %ymm0 1424 ; AVX-NEXT: retq 1425 ; 1426 ; AVX512F-LABEL: test_unaligned_v16i16: 1427 ; AVX512F: # BB#0: 1428 ; AVX512F-NEXT: vmovups (%rdi), %ymm0 1429 ; AVX512F-NEXT: retq 1430 ; 1431 ; AVX512BW-LABEL: test_unaligned_v16i16: 1432 ; AVX512BW: # BB#0: 1433 ; AVX512BW-NEXT: vmovups (%rdi), %ymm0 1434 ; AVX512BW-NEXT: retq 1435 ; 1436 ; AVX512VL-LABEL: test_unaligned_v16i16: 1437 ; AVX512VL: # BB#0: 1438 ; AVX512VL-NEXT: vmovdqu64 (%rdi), %ymm0 1439 ; AVX512VL-NEXT: retq 1440 %1 = load <16 x i16>, <16 x i16>* %src, align 1, !nontemporal !1 1441 ret <16 x i16> %1 1442 } 1443 1444 define <32 x i8> @test_unaligned_v32i8(<32 x i8>* %src) { 1445 ; SSE-LABEL: test_unaligned_v32i8: 1446 ; SSE: # BB#0: 1447 ; SSE-NEXT: movups (%rdi), %xmm0 1448 ; SSE-NEXT: movups 16(%rdi), %xmm1 1449 ; SSE-NEXT: retq 1450 ; 1451 ; AVX-LABEL: test_unaligned_v32i8: 1452 ; AVX: # BB#0: 1453 ; AVX-NEXT: vmovups (%rdi), %ymm0 1454 ; AVX-NEXT: retq 1455 ; 1456 ; AVX512F-LABEL: test_unaligned_v32i8: 1457 ; AVX512F: # BB#0: 1458 ; AVX512F-NEXT: vmovups (%rdi), %ymm0 1459 ; AVX512F-NEXT: retq 1460 ; 1461 ; AVX512BW-LABEL: test_unaligned_v32i8: 1462 ; AVX512BW: # BB#0: 1463 ; AVX512BW-NEXT: vmovups (%rdi), %ymm0 1464 ; AVX512BW-NEXT: retq 1465 ; 1466 ; AVX512VL-LABEL: test_unaligned_v32i8: 1467 ; AVX512VL: # BB#0: 1468 ; AVX512VL-NEXT: vmovdqu64 (%rdi), %ymm0 1469 ; AVX512VL-NEXT: retq 1470 %1 = load <32 x i8>, <32 x i8>* %src, align 1, !nontemporal !1 1471 ret <32 x i8> %1 1472 } 1473 1474 ; And now ZMM versions. 1475 1476 define <16 x float> @test_unaligned_v16f32(<16 x float>* %src) { 1477 ; SSE-LABEL: test_unaligned_v16f32: 1478 ; SSE: # BB#0: 1479 ; SSE-NEXT: movups (%rdi), %xmm0 1480 ; SSE-NEXT: movups 16(%rdi), %xmm1 1481 ; SSE-NEXT: movups 32(%rdi), %xmm2 1482 ; SSE-NEXT: movups 48(%rdi), %xmm3 1483 ; SSE-NEXT: retq 1484 ; 1485 ; AVX-LABEL: test_unaligned_v16f32: 1486 ; AVX: # BB#0: 1487 ; AVX-NEXT: vmovups (%rdi), %ymm0 1488 ; AVX-NEXT: vmovups 32(%rdi), %ymm1 1489 ; AVX-NEXT: retq 1490 ; 1491 ; AVX512-LABEL: test_unaligned_v16f32: 1492 ; AVX512: # BB#0: 1493 ; AVX512-NEXT: vmovups (%rdi), %zmm0 1494 ; AVX512-NEXT: retq 1495 %1 = load <16 x float>, <16 x float>* %src, align 1, !nontemporal !1 1496 ret <16 x float> %1 1497 } 1498 1499 define <16 x i32> @test_unaligned_v16i32(<16 x i32>* %src) { 1500 ; SSE-LABEL: test_unaligned_v16i32: 1501 ; SSE: # BB#0: 1502 ; SSE-NEXT: movups (%rdi), %xmm0 1503 ; SSE-NEXT: movups 16(%rdi), %xmm1 1504 ; SSE-NEXT: movups 32(%rdi), %xmm2 1505 ; SSE-NEXT: movups 48(%rdi), %xmm3 1506 ; SSE-NEXT: retq 1507 ; 1508 ; AVX-LABEL: test_unaligned_v16i32: 1509 ; AVX: # BB#0: 1510 ; AVX-NEXT: vmovups (%rdi), %ymm0 1511 ; AVX-NEXT: vmovups 32(%rdi), %ymm1 1512 ; AVX-NEXT: retq 1513 ; 1514 ; AVX512-LABEL: test_unaligned_v16i32: 1515 ; AVX512: # BB#0: 1516 ; AVX512-NEXT: vmovdqu32 (%rdi), %zmm0 1517 ; AVX512-NEXT: retq 1518 %1 = load <16 x i32>, <16 x i32>* %src, align 1, !nontemporal !1 1519 ret <16 x i32> %1 1520 } 1521 1522 define <8 x double> @test_unaligned_v8f64(<8 x double>* %src) { 1523 ; SSE-LABEL: test_unaligned_v8f64: 1524 ; SSE: # BB#0: 1525 ; SSE-NEXT: movups (%rdi), %xmm0 1526 ; SSE-NEXT: movups 16(%rdi), %xmm1 1527 ; SSE-NEXT: movups 32(%rdi), %xmm2 1528 ; SSE-NEXT: movups 48(%rdi), %xmm3 1529 ; SSE-NEXT: retq 1530 ; 1531 ; AVX-LABEL: test_unaligned_v8f64: 1532 ; AVX: # BB#0: 1533 ; AVX-NEXT: vmovups (%rdi), %ymm0 1534 ; AVX-NEXT: vmovups 32(%rdi), %ymm1 1535 ; AVX-NEXT: retq 1536 ; 1537 ; AVX512-LABEL: test_unaligned_v8f64: 1538 ; AVX512: # BB#0: 1539 ; AVX512-NEXT: vmovupd (%rdi), %zmm0 1540 ; AVX512-NEXT: retq 1541 %1 = load <8 x double>, <8 x double>* %src, align 1, !nontemporal !1 1542 ret <8 x double> %1 1543 } 1544 1545 define <8 x i64> @test_unaligned_v8i64(<8 x i64>* %src) { 1546 ; SSE-LABEL: test_unaligned_v8i64: 1547 ; SSE: # BB#0: 1548 ; SSE-NEXT: movups (%rdi), %xmm0 1549 ; SSE-NEXT: movups 16(%rdi), %xmm1 1550 ; SSE-NEXT: movups 32(%rdi), %xmm2 1551 ; SSE-NEXT: movups 48(%rdi), %xmm3 1552 ; SSE-NEXT: retq 1553 ; 1554 ; AVX-LABEL: test_unaligned_v8i64: 1555 ; AVX: # BB#0: 1556 ; AVX-NEXT: vmovups (%rdi), %ymm0 1557 ; AVX-NEXT: vmovups 32(%rdi), %ymm1 1558 ; AVX-NEXT: retq 1559 ; 1560 ; AVX512-LABEL: test_unaligned_v8i64: 1561 ; AVX512: # BB#0: 1562 ; AVX512-NEXT: vmovdqu64 (%rdi), %zmm0 1563 ; AVX512-NEXT: retq 1564 %1 = load <8 x i64>, <8 x i64>* %src, align 1, !nontemporal !1 1565 ret <8 x i64> %1 1566 } 1567 1568 define <32 x i16> @test_unaligned_v32i16(<32 x i16>* %src) { 1569 ; SSE-LABEL: test_unaligned_v32i16: 1570 ; SSE: # BB#0: 1571 ; SSE-NEXT: movups (%rdi), %xmm0 1572 ; SSE-NEXT: movups 16(%rdi), %xmm1 1573 ; SSE-NEXT: movups 32(%rdi), %xmm2 1574 ; SSE-NEXT: movups 48(%rdi), %xmm3 1575 ; SSE-NEXT: retq 1576 ; 1577 ; AVX-LABEL: test_unaligned_v32i16: 1578 ; AVX: # BB#0: 1579 ; AVX-NEXT: vmovups (%rdi), %ymm0 1580 ; AVX-NEXT: vmovups 32(%rdi), %ymm1 1581 ; AVX-NEXT: retq 1582 ; 1583 ; AVX512F-LABEL: test_unaligned_v32i16: 1584 ; AVX512F: # BB#0: 1585 ; AVX512F-NEXT: vmovups (%rdi), %ymm0 1586 ; AVX512F-NEXT: vmovups 32(%rdi), %ymm1 1587 ; AVX512F-NEXT: retq 1588 ; 1589 ; AVX512BW-LABEL: test_unaligned_v32i16: 1590 ; AVX512BW: # BB#0: 1591 ; AVX512BW-NEXT: vmovdqu16 (%rdi), %zmm0 1592 ; AVX512BW-NEXT: retq 1593 ; 1594 ; AVX512VL-LABEL: test_unaligned_v32i16: 1595 ; AVX512VL: # BB#0: 1596 ; AVX512VL-NEXT: vmovdqu64 (%rdi), %ymm0 1597 ; AVX512VL-NEXT: vmovdqu64 32(%rdi), %ymm1 1598 ; AVX512VL-NEXT: retq 1599 %1 = load <32 x i16>, <32 x i16>* %src, align 1, !nontemporal !1 1600 ret <32 x i16> %1 1601 } 1602 1603 define <64 x i8> @test_unaligned_v64i8(<64 x i8>* %src) { 1604 ; SSE-LABEL: test_unaligned_v64i8: 1605 ; SSE: # BB#0: 1606 ; SSE-NEXT: movups (%rdi), %xmm0 1607 ; SSE-NEXT: movups 16(%rdi), %xmm1 1608 ; SSE-NEXT: movups 32(%rdi), %xmm2 1609 ; SSE-NEXT: movups 48(%rdi), %xmm3 1610 ; SSE-NEXT: retq 1611 ; 1612 ; AVX-LABEL: test_unaligned_v64i8: 1613 ; AVX: # BB#0: 1614 ; AVX-NEXT: vmovups (%rdi), %ymm0 1615 ; AVX-NEXT: vmovups 32(%rdi), %ymm1 1616 ; AVX-NEXT: retq 1617 ; 1618 ; AVX512F-LABEL: test_unaligned_v64i8: 1619 ; AVX512F: # BB#0: 1620 ; AVX512F-NEXT: vmovups (%rdi), %ymm0 1621 ; AVX512F-NEXT: vmovups 32(%rdi), %ymm1 1622 ; AVX512F-NEXT: retq 1623 ; 1624 ; AVX512BW-LABEL: test_unaligned_v64i8: 1625 ; AVX512BW: # BB#0: 1626 ; AVX512BW-NEXT: vmovdqu8 (%rdi), %zmm0 1627 ; AVX512BW-NEXT: retq 1628 ; 1629 ; AVX512VL-LABEL: test_unaligned_v64i8: 1630 ; AVX512VL: # BB#0: 1631 ; AVX512VL-NEXT: vmovdqu64 (%rdi), %ymm0 1632 ; AVX512VL-NEXT: vmovdqu64 32(%rdi), %ymm1 1633 ; AVX512VL-NEXT: retq 1634 %1 = load <64 x i8>, <64 x i8>* %src, align 1, !nontemporal !1 1635 ret <64 x i8> %1 1636 } 1637 1638 !1 = !{i32 1} 1639