1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+mmx,+sse2 -fast-isel -O0 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2 3 ; RUN: llc < %s -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+mmx,+sse4a -fast-isel -O0 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE4A 4 ; RUN: llc < %s -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+mmx,+sse4.1 -fast-isel -O0 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41 5 ; RUN: llc < %s -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+mmx,+avx -fast-isel -O0 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1 6 ; RUN: llc < %s -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+mmx,+avx2 -fast-isel -O0 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2 7 ; RUN: llc < %s -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+mmx,+avx512vl -fast-isel -O0 | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512VL 8 ; RUN: llc < %s -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+mmx,+avx512f -fast-isel -O0 | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512F 9 ; RUN: llc < %s -verify-machineinstrs -mtriple=x86_64-unknown-unknown -mattr=+mmx,+avx512bw -fast-isel -O0 | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW 10 11 ; 12 ; Scalar Stores 13 ; 14 15 define void @test_nti32(i32* nocapture %ptr, i32 %X) { 16 ; ALL-LABEL: test_nti32: 17 ; ALL: # %bb.0: # %entry 18 ; ALL-NEXT: movntil %esi, (%rdi) 19 ; ALL-NEXT: retq 20 entry: 21 store i32 %X, i32* %ptr, align 4, !nontemporal !1 22 ret void 23 } 24 25 define void @test_nti64(i64* nocapture %ptr, i64 %X) { 26 ; ALL-LABEL: test_nti64: 27 ; ALL: # %bb.0: # %entry 28 ; ALL-NEXT: movntiq %rsi, (%rdi) 29 ; ALL-NEXT: retq 30 entry: 31 store i64 %X, i64* %ptr, align 8, !nontemporal !1 32 ret void 33 } 34 35 define void @test_ntfloat(float* nocapture %ptr, float %X) { 36 ; SSE2-LABEL: test_ntfloat: 37 ; SSE2: # %bb.0: # %entry 38 ; SSE2-NEXT: movss %xmm0, (%rdi) 39 ; SSE2-NEXT: retq 40 ; 41 ; SSE4A-LABEL: test_ntfloat: 42 ; SSE4A: # %bb.0: # %entry 43 ; SSE4A-NEXT: movntss %xmm0, (%rdi) 44 ; SSE4A-NEXT: retq 45 ; 46 ; SSE41-LABEL: test_ntfloat: 47 ; SSE41: # %bb.0: # %entry 48 ; SSE41-NEXT: movss %xmm0, (%rdi) 49 ; SSE41-NEXT: retq 50 ; 51 ; AVX-LABEL: test_ntfloat: 52 ; AVX: # %bb.0: # %entry 53 ; AVX-NEXT: vmovss %xmm0, (%rdi) 54 ; AVX-NEXT: retq 55 ; 56 ; AVX512-LABEL: test_ntfloat: 57 ; AVX512: # %bb.0: # %entry 58 ; AVX512-NEXT: vmovss %xmm0, (%rdi) 59 ; AVX512-NEXT: retq 60 entry: 61 store float %X, float* %ptr, align 4, !nontemporal !1 62 ret void 63 } 64 65 define void @test_ntdouble(double* nocapture %ptr, double %X) { 66 ; SSE2-LABEL: test_ntdouble: 67 ; SSE2: # %bb.0: # %entry 68 ; SSE2-NEXT: movsd %xmm0, (%rdi) 69 ; SSE2-NEXT: retq 70 ; 71 ; SSE4A-LABEL: test_ntdouble: 72 ; SSE4A: # %bb.0: # %entry 73 ; SSE4A-NEXT: movntsd %xmm0, (%rdi) 74 ; SSE4A-NEXT: retq 75 ; 76 ; SSE41-LABEL: test_ntdouble: 77 ; SSE41: # %bb.0: # %entry 78 ; SSE41-NEXT: movsd %xmm0, (%rdi) 79 ; SSE41-NEXT: retq 80 ; 81 ; AVX-LABEL: test_ntdouble: 82 ; AVX: # %bb.0: # %entry 83 ; AVX-NEXT: vmovsd %xmm0, (%rdi) 84 ; AVX-NEXT: retq 85 ; 86 ; AVX512-LABEL: test_ntdouble: 87 ; AVX512: # %bb.0: # %entry 88 ; AVX512-NEXT: vmovsd %xmm0, (%rdi) 89 ; AVX512-NEXT: retq 90 entry: 91 store double %X, double* %ptr, align 8, !nontemporal !1 92 ret void 93 } 94 95 ; 96 ; MMX Store 97 ; 98 99 define void @test_mmx(x86_mmx* nocapture %a0, x86_mmx* nocapture %a1) { 100 ; ALL-LABEL: test_mmx: 101 ; ALL: # %bb.0: # %entry 102 ; ALL-NEXT: movq (%rdi), %mm0 103 ; ALL-NEXT: psrlq $3, %mm0 104 ; ALL-NEXT: movntq %mm0, (%rsi) 105 ; ALL-NEXT: retq 106 entry: 107 %0 = load x86_mmx, x86_mmx* %a0 108 %1 = call x86_mmx @llvm.x86.mmx.psrli.q(x86_mmx %0, i32 3) 109 store x86_mmx %1, x86_mmx* %a1, align 8, !nontemporal !1 110 ret void 111 } 112 declare x86_mmx @llvm.x86.mmx.psrli.q(x86_mmx, i32) nounwind readnone 113 114 ; 115 ; 128-bit Vector Stores 116 ; 117 118 define void @test_nt4xfloat(<4 x float>* nocapture %ptr, <4 x float> %X) { 119 ; SSE-LABEL: test_nt4xfloat: 120 ; SSE: # %bb.0: # %entry 121 ; SSE-NEXT: movntps %xmm0, (%rdi) 122 ; SSE-NEXT: retq 123 ; 124 ; AVX-LABEL: test_nt4xfloat: 125 ; AVX: # %bb.0: # %entry 126 ; AVX-NEXT: vmovntps %xmm0, (%rdi) 127 ; AVX-NEXT: retq 128 ; 129 ; AVX512-LABEL: test_nt4xfloat: 130 ; AVX512: # %bb.0: # %entry 131 ; AVX512-NEXT: vmovntps %xmm0, (%rdi) 132 ; AVX512-NEXT: retq 133 entry: 134 store <4 x float> %X, <4 x float>* %ptr, align 16, !nontemporal !1 135 ret void 136 } 137 138 define void @test_nt2xdouble(<2 x double>* nocapture %ptr, <2 x double> %X) { 139 ; SSE-LABEL: test_nt2xdouble: 140 ; SSE: # %bb.0: # %entry 141 ; SSE-NEXT: movntpd %xmm0, (%rdi) 142 ; SSE-NEXT: retq 143 ; 144 ; AVX-LABEL: test_nt2xdouble: 145 ; AVX: # %bb.0: # %entry 146 ; AVX-NEXT: vmovntpd %xmm0, (%rdi) 147 ; AVX-NEXT: retq 148 ; 149 ; AVX512-LABEL: test_nt2xdouble: 150 ; AVX512: # %bb.0: # %entry 151 ; AVX512-NEXT: vmovntpd %xmm0, (%rdi) 152 ; AVX512-NEXT: retq 153 entry: 154 store <2 x double> %X, <2 x double>* %ptr, align 16, !nontemporal !1 155 ret void 156 } 157 158 define void @test_nt16xi8(<16 x i8>* nocapture %ptr, <16 x i8> %X) { 159 ; SSE-LABEL: test_nt16xi8: 160 ; SSE: # %bb.0: # %entry 161 ; SSE-NEXT: movntdq %xmm0, (%rdi) 162 ; SSE-NEXT: retq 163 ; 164 ; AVX-LABEL: test_nt16xi8: 165 ; AVX: # %bb.0: # %entry 166 ; AVX-NEXT: vmovntdq %xmm0, (%rdi) 167 ; AVX-NEXT: retq 168 ; 169 ; AVX512-LABEL: test_nt16xi8: 170 ; AVX512: # %bb.0: # %entry 171 ; AVX512-NEXT: vmovntdq %xmm0, (%rdi) 172 ; AVX512-NEXT: retq 173 entry: 174 store <16 x i8> %X, <16 x i8>* %ptr, align 16, !nontemporal !1 175 ret void 176 } 177 178 define void @test_nt8xi16(<8 x i16>* nocapture %ptr, <8 x i16> %X) { 179 ; SSE-LABEL: test_nt8xi16: 180 ; SSE: # %bb.0: # %entry 181 ; SSE-NEXT: movntdq %xmm0, (%rdi) 182 ; SSE-NEXT: retq 183 ; 184 ; AVX-LABEL: test_nt8xi16: 185 ; AVX: # %bb.0: # %entry 186 ; AVX-NEXT: vmovntdq %xmm0, (%rdi) 187 ; AVX-NEXT: retq 188 ; 189 ; AVX512-LABEL: test_nt8xi16: 190 ; AVX512: # %bb.0: # %entry 191 ; AVX512-NEXT: vmovntdq %xmm0, (%rdi) 192 ; AVX512-NEXT: retq 193 entry: 194 store <8 x i16> %X, <8 x i16>* %ptr, align 16, !nontemporal !1 195 ret void 196 } 197 198 define void @test_nt4xi32(<4 x i32>* nocapture %ptr, <4 x i32> %X) { 199 ; SSE-LABEL: test_nt4xi32: 200 ; SSE: # %bb.0: # %entry 201 ; SSE-NEXT: movntdq %xmm0, (%rdi) 202 ; SSE-NEXT: retq 203 ; 204 ; AVX-LABEL: test_nt4xi32: 205 ; AVX: # %bb.0: # %entry 206 ; AVX-NEXT: vmovntdq %xmm0, (%rdi) 207 ; AVX-NEXT: retq 208 ; 209 ; AVX512-LABEL: test_nt4xi32: 210 ; AVX512: # %bb.0: # %entry 211 ; AVX512-NEXT: vmovntdq %xmm0, (%rdi) 212 ; AVX512-NEXT: retq 213 entry: 214 store <4 x i32> %X, <4 x i32>* %ptr, align 16, !nontemporal !1 215 ret void 216 } 217 218 define void @test_nt2xi64(<2 x i64>* nocapture %ptr, <2 x i64> %X) { 219 ; SSE-LABEL: test_nt2xi64: 220 ; SSE: # %bb.0: # %entry 221 ; SSE-NEXT: movntdq %xmm0, (%rdi) 222 ; SSE-NEXT: retq 223 ; 224 ; AVX-LABEL: test_nt2xi64: 225 ; AVX: # %bb.0: # %entry 226 ; AVX-NEXT: vmovntdq %xmm0, (%rdi) 227 ; AVX-NEXT: retq 228 ; 229 ; AVX512-LABEL: test_nt2xi64: 230 ; AVX512: # %bb.0: # %entry 231 ; AVX512-NEXT: vmovntdq %xmm0, (%rdi) 232 ; AVX512-NEXT: retq 233 entry: 234 store <2 x i64> %X, <2 x i64>* %ptr, align 16, !nontemporal !1 235 ret void 236 } 237 238 ; 239 ; 128-bit Vector Loads 240 ; 241 242 define <4 x float> @test_load_nt4xfloat(<4 x float>* nocapture %ptr) { 243 ; SSE2-LABEL: test_load_nt4xfloat: 244 ; SSE2: # %bb.0: # %entry 245 ; SSE2-NEXT: movaps (%rdi), %xmm0 246 ; SSE2-NEXT: retq 247 ; 248 ; SSE4A-LABEL: test_load_nt4xfloat: 249 ; SSE4A: # %bb.0: # %entry 250 ; SSE4A-NEXT: movaps (%rdi), %xmm0 251 ; SSE4A-NEXT: retq 252 ; 253 ; SSE41-LABEL: test_load_nt4xfloat: 254 ; SSE41: # %bb.0: # %entry 255 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 256 ; SSE41-NEXT: retq 257 ; 258 ; AVX-LABEL: test_load_nt4xfloat: 259 ; AVX: # %bb.0: # %entry 260 ; AVX-NEXT: vmovntdqa (%rdi), %xmm0 261 ; AVX-NEXT: retq 262 ; 263 ; AVX512-LABEL: test_load_nt4xfloat: 264 ; AVX512: # %bb.0: # %entry 265 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm0 266 ; AVX512-NEXT: retq 267 entry: 268 %0 = load <4 x float>, <4 x float>* %ptr, align 16, !nontemporal !1 269 ret <4 x float> %0 270 } 271 272 define <2 x double> @test_load_nt2xdouble(<2 x double>* nocapture %ptr) { 273 ; SSE2-LABEL: test_load_nt2xdouble: 274 ; SSE2: # %bb.0: # %entry 275 ; SSE2-NEXT: movapd (%rdi), %xmm0 276 ; SSE2-NEXT: retq 277 ; 278 ; SSE4A-LABEL: test_load_nt2xdouble: 279 ; SSE4A: # %bb.0: # %entry 280 ; SSE4A-NEXT: movapd (%rdi), %xmm0 281 ; SSE4A-NEXT: retq 282 ; 283 ; SSE41-LABEL: test_load_nt2xdouble: 284 ; SSE41: # %bb.0: # %entry 285 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 286 ; SSE41-NEXT: retq 287 ; 288 ; AVX-LABEL: test_load_nt2xdouble: 289 ; AVX: # %bb.0: # %entry 290 ; AVX-NEXT: vmovntdqa (%rdi), %xmm0 291 ; AVX-NEXT: retq 292 ; 293 ; AVX512-LABEL: test_load_nt2xdouble: 294 ; AVX512: # %bb.0: # %entry 295 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm0 296 ; AVX512-NEXT: retq 297 entry: 298 %0 = load <2 x double>, <2 x double>* %ptr, align 16, !nontemporal !1 299 ret <2 x double> %0 300 } 301 302 define <16 x i8> @test_load_nt16xi8(<16 x i8>* nocapture %ptr) { 303 ; SSE-LABEL: test_load_nt16xi8: 304 ; SSE: # %bb.0: # %entry 305 ; SSE-NEXT: movntdqa (%rdi), %xmm0 306 ; SSE-NEXT: retq 307 ; 308 ; AVX-LABEL: test_load_nt16xi8: 309 ; AVX: # %bb.0: # %entry 310 ; AVX-NEXT: vmovntdqa (%rdi), %xmm0 311 ; AVX-NEXT: retq 312 ; 313 ; AVX512-LABEL: test_load_nt16xi8: 314 ; AVX512: # %bb.0: # %entry 315 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm0 316 ; AVX512-NEXT: retq 317 entry: 318 %0 = load <16 x i8>, <16 x i8>* %ptr, align 16, !nontemporal !1 319 ret <16 x i8> %0 320 } 321 322 define <8 x i16> @test_load_nt8xi16(<8 x i16>* nocapture %ptr) { 323 ; SSE-LABEL: test_load_nt8xi16: 324 ; SSE: # %bb.0: # %entry 325 ; SSE-NEXT: movntdqa (%rdi), %xmm0 326 ; SSE-NEXT: retq 327 ; 328 ; AVX-LABEL: test_load_nt8xi16: 329 ; AVX: # %bb.0: # %entry 330 ; AVX-NEXT: vmovntdqa (%rdi), %xmm0 331 ; AVX-NEXT: retq 332 ; 333 ; AVX512-LABEL: test_load_nt8xi16: 334 ; AVX512: # %bb.0: # %entry 335 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm0 336 ; AVX512-NEXT: retq 337 entry: 338 %0 = load <8 x i16>, <8 x i16>* %ptr, align 16, !nontemporal !1 339 ret <8 x i16> %0 340 } 341 342 define <4 x i32> @test_load_nt4xi32(<4 x i32>* nocapture %ptr) { 343 ; SSE-LABEL: test_load_nt4xi32: 344 ; SSE: # %bb.0: # %entry 345 ; SSE-NEXT: movntdqa (%rdi), %xmm0 346 ; SSE-NEXT: retq 347 ; 348 ; AVX-LABEL: test_load_nt4xi32: 349 ; AVX: # %bb.0: # %entry 350 ; AVX-NEXT: vmovntdqa (%rdi), %xmm0 351 ; AVX-NEXT: retq 352 ; 353 ; AVX512-LABEL: test_load_nt4xi32: 354 ; AVX512: # %bb.0: # %entry 355 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm0 356 ; AVX512-NEXT: retq 357 entry: 358 %0 = load <4 x i32>, <4 x i32>* %ptr, align 16, !nontemporal !1 359 ret <4 x i32> %0 360 } 361 362 define <2 x i64> @test_load_nt2xi64(<2 x i64>* nocapture %ptr) { 363 ; SSE-LABEL: test_load_nt2xi64: 364 ; SSE: # %bb.0: # %entry 365 ; SSE-NEXT: movntdqa (%rdi), %xmm0 366 ; SSE-NEXT: retq 367 ; 368 ; AVX-LABEL: test_load_nt2xi64: 369 ; AVX: # %bb.0: # %entry 370 ; AVX-NEXT: vmovntdqa (%rdi), %xmm0 371 ; AVX-NEXT: retq 372 ; 373 ; AVX512-LABEL: test_load_nt2xi64: 374 ; AVX512: # %bb.0: # %entry 375 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm0 376 ; AVX512-NEXT: retq 377 entry: 378 %0 = load <2 x i64>, <2 x i64>* %ptr, align 16, !nontemporal !1 379 ret <2 x i64> %0 380 } 381 382 ; 383 ; 256-bit Vector Stores 384 ; 385 386 define void @test_nt8xfloat(<8 x float>* nocapture %ptr, <8 x float> %X) { 387 ; SSE-LABEL: test_nt8xfloat: 388 ; SSE: # %bb.0: # %entry 389 ; SSE-NEXT: movntps %xmm0, (%rdi) 390 ; SSE-NEXT: movntps %xmm1, 16(%rdi) 391 ; SSE-NEXT: retq 392 ; 393 ; AVX-LABEL: test_nt8xfloat: 394 ; AVX: # %bb.0: # %entry 395 ; AVX-NEXT: vmovntps %ymm0, (%rdi) 396 ; AVX-NEXT: vzeroupper 397 ; AVX-NEXT: retq 398 ; 399 ; AVX512-LABEL: test_nt8xfloat: 400 ; AVX512: # %bb.0: # %entry 401 ; AVX512-NEXT: vmovntps %ymm0, (%rdi) 402 ; AVX512-NEXT: vzeroupper 403 ; AVX512-NEXT: retq 404 entry: 405 store <8 x float> %X, <8 x float>* %ptr, align 32, !nontemporal !1 406 ret void 407 } 408 409 define void @test_nt4xdouble(<4 x double>* nocapture %ptr, <4 x double> %X) { 410 ; SSE-LABEL: test_nt4xdouble: 411 ; SSE: # %bb.0: # %entry 412 ; SSE-NEXT: movntpd %xmm0, (%rdi) 413 ; SSE-NEXT: movntpd %xmm1, 16(%rdi) 414 ; SSE-NEXT: retq 415 ; 416 ; AVX-LABEL: test_nt4xdouble: 417 ; AVX: # %bb.0: # %entry 418 ; AVX-NEXT: vmovntpd %ymm0, (%rdi) 419 ; AVX-NEXT: vzeroupper 420 ; AVX-NEXT: retq 421 ; 422 ; AVX512-LABEL: test_nt4xdouble: 423 ; AVX512: # %bb.0: # %entry 424 ; AVX512-NEXT: vmovntpd %ymm0, (%rdi) 425 ; AVX512-NEXT: vzeroupper 426 ; AVX512-NEXT: retq 427 entry: 428 store <4 x double> %X, <4 x double>* %ptr, align 32, !nontemporal !1 429 ret void 430 } 431 432 define void @test_nt32xi8(<32 x i8>* nocapture %ptr, <32 x i8> %X) { 433 ; SSE-LABEL: test_nt32xi8: 434 ; SSE: # %bb.0: # %entry 435 ; SSE-NEXT: movntdq %xmm0, (%rdi) 436 ; SSE-NEXT: movntdq %xmm1, 16(%rdi) 437 ; SSE-NEXT: retq 438 ; 439 ; AVX-LABEL: test_nt32xi8: 440 ; AVX: # %bb.0: # %entry 441 ; AVX-NEXT: vmovntdq %ymm0, (%rdi) 442 ; AVX-NEXT: vzeroupper 443 ; AVX-NEXT: retq 444 ; 445 ; AVX512-LABEL: test_nt32xi8: 446 ; AVX512: # %bb.0: # %entry 447 ; AVX512-NEXT: vmovntdq %ymm0, (%rdi) 448 ; AVX512-NEXT: vzeroupper 449 ; AVX512-NEXT: retq 450 entry: 451 store <32 x i8> %X, <32 x i8>* %ptr, align 32, !nontemporal !1 452 ret void 453 } 454 455 define void @test_nt16xi16(<16 x i16>* nocapture %ptr, <16 x i16> %X) { 456 ; SSE-LABEL: test_nt16xi16: 457 ; SSE: # %bb.0: # %entry 458 ; SSE-NEXT: movntdq %xmm0, (%rdi) 459 ; SSE-NEXT: movntdq %xmm1, 16(%rdi) 460 ; SSE-NEXT: retq 461 ; 462 ; AVX-LABEL: test_nt16xi16: 463 ; AVX: # %bb.0: # %entry 464 ; AVX-NEXT: vmovntdq %ymm0, (%rdi) 465 ; AVX-NEXT: vzeroupper 466 ; AVX-NEXT: retq 467 ; 468 ; AVX512-LABEL: test_nt16xi16: 469 ; AVX512: # %bb.0: # %entry 470 ; AVX512-NEXT: vmovntdq %ymm0, (%rdi) 471 ; AVX512-NEXT: vzeroupper 472 ; AVX512-NEXT: retq 473 entry: 474 store <16 x i16> %X, <16 x i16>* %ptr, align 32, !nontemporal !1 475 ret void 476 } 477 478 define void @test_nt8xi32(<8 x i32>* nocapture %ptr, <8 x i32> %X) { 479 ; SSE-LABEL: test_nt8xi32: 480 ; SSE: # %bb.0: # %entry 481 ; SSE-NEXT: movntdq %xmm0, (%rdi) 482 ; SSE-NEXT: movntdq %xmm1, 16(%rdi) 483 ; SSE-NEXT: retq 484 ; 485 ; AVX-LABEL: test_nt8xi32: 486 ; AVX: # %bb.0: # %entry 487 ; AVX-NEXT: vmovntdq %ymm0, (%rdi) 488 ; AVX-NEXT: vzeroupper 489 ; AVX-NEXT: retq 490 ; 491 ; AVX512-LABEL: test_nt8xi32: 492 ; AVX512: # %bb.0: # %entry 493 ; AVX512-NEXT: vmovntdq %ymm0, (%rdi) 494 ; AVX512-NEXT: vzeroupper 495 ; AVX512-NEXT: retq 496 entry: 497 store <8 x i32> %X, <8 x i32>* %ptr, align 32, !nontemporal !1 498 ret void 499 } 500 501 define void @test_nt4xi64(<4 x i64>* nocapture %ptr, <4 x i64> %X) { 502 ; SSE-LABEL: test_nt4xi64: 503 ; SSE: # %bb.0: # %entry 504 ; SSE-NEXT: movntdq %xmm0, (%rdi) 505 ; SSE-NEXT: movntdq %xmm1, 16(%rdi) 506 ; SSE-NEXT: retq 507 ; 508 ; AVX-LABEL: test_nt4xi64: 509 ; AVX: # %bb.0: # %entry 510 ; AVX-NEXT: vmovntdq %ymm0, (%rdi) 511 ; AVX-NEXT: vzeroupper 512 ; AVX-NEXT: retq 513 ; 514 ; AVX512-LABEL: test_nt4xi64: 515 ; AVX512: # %bb.0: # %entry 516 ; AVX512-NEXT: vmovntdq %ymm0, (%rdi) 517 ; AVX512-NEXT: vzeroupper 518 ; AVX512-NEXT: retq 519 entry: 520 store <4 x i64> %X, <4 x i64>* %ptr, align 32, !nontemporal !1 521 ret void 522 } 523 524 ; 525 ; 256-bit Vector Loads 526 ; 527 528 define <8 x float> @test_load_nt8xfloat(<8 x float>* nocapture %ptr) { 529 ; SSE2-LABEL: test_load_nt8xfloat: 530 ; SSE2: # %bb.0: # %entry 531 ; SSE2-NEXT: movaps (%rdi), %xmm0 532 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 533 ; SSE2-NEXT: retq 534 ; 535 ; SSE4A-LABEL: test_load_nt8xfloat: 536 ; SSE4A: # %bb.0: # %entry 537 ; SSE4A-NEXT: movaps (%rdi), %xmm0 538 ; SSE4A-NEXT: movaps 16(%rdi), %xmm1 539 ; SSE4A-NEXT: retq 540 ; 541 ; SSE41-LABEL: test_load_nt8xfloat: 542 ; SSE41: # %bb.0: # %entry 543 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 544 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 545 ; SSE41-NEXT: retq 546 ; 547 ; AVX1-LABEL: test_load_nt8xfloat: 548 ; AVX1: # %bb.0: # %entry 549 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 550 ; AVX1-NEXT: # implicit-def: $ymm1 551 ; AVX1-NEXT: vmovaps %xmm0, %xmm1 552 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0 553 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 554 ; AVX1-NEXT: retq 555 ; 556 ; AVX2-LABEL: test_load_nt8xfloat: 557 ; AVX2: # %bb.0: # %entry 558 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 559 ; AVX2-NEXT: retq 560 ; 561 ; AVX512-LABEL: test_load_nt8xfloat: 562 ; AVX512: # %bb.0: # %entry 563 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0 564 ; AVX512-NEXT: retq 565 entry: 566 %0 = load <8 x float>, <8 x float>* %ptr, align 32, !nontemporal !1 567 ret <8 x float> %0 568 } 569 570 define <4 x double> @test_load_nt4xdouble(<4 x double>* nocapture %ptr) { 571 ; SSE2-LABEL: test_load_nt4xdouble: 572 ; SSE2: # %bb.0: # %entry 573 ; SSE2-NEXT: movapd (%rdi), %xmm0 574 ; SSE2-NEXT: movapd 16(%rdi), %xmm1 575 ; SSE2-NEXT: retq 576 ; 577 ; SSE4A-LABEL: test_load_nt4xdouble: 578 ; SSE4A: # %bb.0: # %entry 579 ; SSE4A-NEXT: movapd (%rdi), %xmm0 580 ; SSE4A-NEXT: movapd 16(%rdi), %xmm1 581 ; SSE4A-NEXT: retq 582 ; 583 ; SSE41-LABEL: test_load_nt4xdouble: 584 ; SSE41: # %bb.0: # %entry 585 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 586 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 587 ; SSE41-NEXT: retq 588 ; 589 ; AVX1-LABEL: test_load_nt4xdouble: 590 ; AVX1: # %bb.0: # %entry 591 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 592 ; AVX1-NEXT: # implicit-def: $ymm1 593 ; AVX1-NEXT: vmovaps %xmm0, %xmm1 594 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0 595 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 596 ; AVX1-NEXT: retq 597 ; 598 ; AVX2-LABEL: test_load_nt4xdouble: 599 ; AVX2: # %bb.0: # %entry 600 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 601 ; AVX2-NEXT: retq 602 ; 603 ; AVX512-LABEL: test_load_nt4xdouble: 604 ; AVX512: # %bb.0: # %entry 605 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0 606 ; AVX512-NEXT: retq 607 entry: 608 %0 = load <4 x double>, <4 x double>* %ptr, align 32, !nontemporal !1 609 ret <4 x double> %0 610 } 611 612 define <32 x i8> @test_load_nt32xi8(<32 x i8>* nocapture %ptr) { 613 ; SSE2-LABEL: test_load_nt32xi8: 614 ; SSE2: # %bb.0: # %entry 615 ; SSE2-NEXT: movaps (%rdi), %xmm0 616 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 617 ; SSE2-NEXT: retq 618 ; 619 ; SSE4A-LABEL: test_load_nt32xi8: 620 ; SSE4A: # %bb.0: # %entry 621 ; SSE4A-NEXT: movaps (%rdi), %xmm0 622 ; SSE4A-NEXT: movaps 16(%rdi), %xmm1 623 ; SSE4A-NEXT: retq 624 ; 625 ; SSE41-LABEL: test_load_nt32xi8: 626 ; SSE41: # %bb.0: # %entry 627 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 628 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 629 ; SSE41-NEXT: retq 630 ; 631 ; AVX1-LABEL: test_load_nt32xi8: 632 ; AVX1: # %bb.0: # %entry 633 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 634 ; AVX1-NEXT: # implicit-def: $ymm1 635 ; AVX1-NEXT: vmovaps %xmm0, %xmm1 636 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0 637 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 638 ; AVX1-NEXT: retq 639 ; 640 ; AVX2-LABEL: test_load_nt32xi8: 641 ; AVX2: # %bb.0: # %entry 642 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 643 ; AVX2-NEXT: retq 644 ; 645 ; AVX512-LABEL: test_load_nt32xi8: 646 ; AVX512: # %bb.0: # %entry 647 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0 648 ; AVX512-NEXT: retq 649 entry: 650 %0 = load <32 x i8>, <32 x i8>* %ptr, align 32, !nontemporal !1 651 ret <32 x i8> %0 652 } 653 654 define <16 x i16> @test_load_nt16xi16(<16 x i16>* nocapture %ptr) { 655 ; SSE2-LABEL: test_load_nt16xi16: 656 ; SSE2: # %bb.0: # %entry 657 ; SSE2-NEXT: movaps (%rdi), %xmm0 658 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 659 ; SSE2-NEXT: retq 660 ; 661 ; SSE4A-LABEL: test_load_nt16xi16: 662 ; SSE4A: # %bb.0: # %entry 663 ; SSE4A-NEXT: movaps (%rdi), %xmm0 664 ; SSE4A-NEXT: movaps 16(%rdi), %xmm1 665 ; SSE4A-NEXT: retq 666 ; 667 ; SSE41-LABEL: test_load_nt16xi16: 668 ; SSE41: # %bb.0: # %entry 669 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 670 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 671 ; SSE41-NEXT: retq 672 ; 673 ; AVX1-LABEL: test_load_nt16xi16: 674 ; AVX1: # %bb.0: # %entry 675 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 676 ; AVX1-NEXT: # implicit-def: $ymm1 677 ; AVX1-NEXT: vmovaps %xmm0, %xmm1 678 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0 679 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 680 ; AVX1-NEXT: retq 681 ; 682 ; AVX2-LABEL: test_load_nt16xi16: 683 ; AVX2: # %bb.0: # %entry 684 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 685 ; AVX2-NEXT: retq 686 ; 687 ; AVX512-LABEL: test_load_nt16xi16: 688 ; AVX512: # %bb.0: # %entry 689 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0 690 ; AVX512-NEXT: retq 691 entry: 692 %0 = load <16 x i16>, <16 x i16>* %ptr, align 32, !nontemporal !1 693 ret <16 x i16> %0 694 } 695 696 define <8 x i32> @test_load_nt8xi32(<8 x i32>* nocapture %ptr) { 697 ; SSE2-LABEL: test_load_nt8xi32: 698 ; SSE2: # %bb.0: # %entry 699 ; SSE2-NEXT: movaps (%rdi), %xmm0 700 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 701 ; SSE2-NEXT: retq 702 ; 703 ; SSE4A-LABEL: test_load_nt8xi32: 704 ; SSE4A: # %bb.0: # %entry 705 ; SSE4A-NEXT: movaps (%rdi), %xmm0 706 ; SSE4A-NEXT: movaps 16(%rdi), %xmm1 707 ; SSE4A-NEXT: retq 708 ; 709 ; SSE41-LABEL: test_load_nt8xi32: 710 ; SSE41: # %bb.0: # %entry 711 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 712 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 713 ; SSE41-NEXT: retq 714 ; 715 ; AVX1-LABEL: test_load_nt8xi32: 716 ; AVX1: # %bb.0: # %entry 717 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 718 ; AVX1-NEXT: # implicit-def: $ymm1 719 ; AVX1-NEXT: vmovaps %xmm0, %xmm1 720 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0 721 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 722 ; AVX1-NEXT: retq 723 ; 724 ; AVX2-LABEL: test_load_nt8xi32: 725 ; AVX2: # %bb.0: # %entry 726 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 727 ; AVX2-NEXT: retq 728 ; 729 ; AVX512-LABEL: test_load_nt8xi32: 730 ; AVX512: # %bb.0: # %entry 731 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0 732 ; AVX512-NEXT: retq 733 entry: 734 %0 = load <8 x i32>, <8 x i32>* %ptr, align 32, !nontemporal !1 735 ret <8 x i32> %0 736 } 737 738 define <4 x i64> @test_load_nt4xi64(<4 x i64>* nocapture %ptr) { 739 ; SSE2-LABEL: test_load_nt4xi64: 740 ; SSE2: # %bb.0: # %entry 741 ; SSE2-NEXT: movaps (%rdi), %xmm0 742 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 743 ; SSE2-NEXT: retq 744 ; 745 ; SSE4A-LABEL: test_load_nt4xi64: 746 ; SSE4A: # %bb.0: # %entry 747 ; SSE4A-NEXT: movaps (%rdi), %xmm0 748 ; SSE4A-NEXT: movaps 16(%rdi), %xmm1 749 ; SSE4A-NEXT: retq 750 ; 751 ; SSE41-LABEL: test_load_nt4xi64: 752 ; SSE41: # %bb.0: # %entry 753 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 754 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 755 ; SSE41-NEXT: retq 756 ; 757 ; AVX1-LABEL: test_load_nt4xi64: 758 ; AVX1: # %bb.0: # %entry 759 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 760 ; AVX1-NEXT: # implicit-def: $ymm1 761 ; AVX1-NEXT: vmovaps %xmm0, %xmm1 762 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0 763 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 764 ; AVX1-NEXT: retq 765 ; 766 ; AVX2-LABEL: test_load_nt4xi64: 767 ; AVX2: # %bb.0: # %entry 768 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 769 ; AVX2-NEXT: retq 770 ; 771 ; AVX512-LABEL: test_load_nt4xi64: 772 ; AVX512: # %bb.0: # %entry 773 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0 774 ; AVX512-NEXT: retq 775 entry: 776 %0 = load <4 x i64>, <4 x i64>* %ptr, align 32, !nontemporal !1 777 ret <4 x i64> %0 778 } 779 780 ; 781 ; 512-bit Vector Stores 782 ; 783 784 define void @test_nt16xfloat(<16 x float>* nocapture %ptr, <16 x float> %X) { 785 ; SSE-LABEL: test_nt16xfloat: 786 ; SSE: # %bb.0: # %entry 787 ; SSE-NEXT: movntps %xmm0, (%rdi) 788 ; SSE-NEXT: movntps %xmm1, 16(%rdi) 789 ; SSE-NEXT: movntps %xmm2, 32(%rdi) 790 ; SSE-NEXT: movntps %xmm3, 48(%rdi) 791 ; SSE-NEXT: retq 792 ; 793 ; AVX-LABEL: test_nt16xfloat: 794 ; AVX: # %bb.0: # %entry 795 ; AVX-NEXT: vmovntps %ymm0, (%rdi) 796 ; AVX-NEXT: vmovntps %ymm1, 32(%rdi) 797 ; AVX-NEXT: vzeroupper 798 ; AVX-NEXT: retq 799 ; 800 ; AVX512-LABEL: test_nt16xfloat: 801 ; AVX512: # %bb.0: # %entry 802 ; AVX512-NEXT: vmovntps %zmm0, (%rdi) 803 ; AVX512-NEXT: vzeroupper 804 ; AVX512-NEXT: retq 805 entry: 806 store <16 x float> %X, <16 x float>* %ptr, align 64, !nontemporal !1 807 ret void 808 } 809 810 define void @test_nt8xdouble(<8 x double>* nocapture %ptr, <8 x double> %X) { 811 ; SSE-LABEL: test_nt8xdouble: 812 ; SSE: # %bb.0: # %entry 813 ; SSE-NEXT: movntpd %xmm0, (%rdi) 814 ; SSE-NEXT: movntpd %xmm1, 16(%rdi) 815 ; SSE-NEXT: movntpd %xmm2, 32(%rdi) 816 ; SSE-NEXT: movntpd %xmm3, 48(%rdi) 817 ; SSE-NEXT: retq 818 ; 819 ; AVX-LABEL: test_nt8xdouble: 820 ; AVX: # %bb.0: # %entry 821 ; AVX-NEXT: vmovntpd %ymm0, (%rdi) 822 ; AVX-NEXT: vmovntpd %ymm1, 32(%rdi) 823 ; AVX-NEXT: vzeroupper 824 ; AVX-NEXT: retq 825 ; 826 ; AVX512-LABEL: test_nt8xdouble: 827 ; AVX512: # %bb.0: # %entry 828 ; AVX512-NEXT: vmovntpd %zmm0, (%rdi) 829 ; AVX512-NEXT: vzeroupper 830 ; AVX512-NEXT: retq 831 entry: 832 store <8 x double> %X, <8 x double>* %ptr, align 64, !nontemporal !1 833 ret void 834 } 835 836 define void @test_nt64xi8(<64 x i8>* nocapture %ptr, <64 x i8> %X) { 837 ; SSE-LABEL: test_nt64xi8: 838 ; SSE: # %bb.0: # %entry 839 ; SSE-NEXT: movntdq %xmm0, (%rdi) 840 ; SSE-NEXT: movntdq %xmm1, 16(%rdi) 841 ; SSE-NEXT: movntdq %xmm2, 32(%rdi) 842 ; SSE-NEXT: movntdq %xmm3, 48(%rdi) 843 ; SSE-NEXT: retq 844 ; 845 ; AVX-LABEL: test_nt64xi8: 846 ; AVX: # %bb.0: # %entry 847 ; AVX-NEXT: vmovntdq %ymm0, (%rdi) 848 ; AVX-NEXT: vmovntdq %ymm1, 32(%rdi) 849 ; AVX-NEXT: vzeroupper 850 ; AVX-NEXT: retq 851 ; 852 ; AVX512VL-LABEL: test_nt64xi8: 853 ; AVX512VL: # %bb.0: # %entry 854 ; AVX512VL-NEXT: vmovntdq %ymm0, (%rdi) 855 ; AVX512VL-NEXT: vmovntdq %ymm1, 32(%rdi) 856 ; AVX512VL-NEXT: vzeroupper 857 ; AVX512VL-NEXT: retq 858 ; 859 ; AVX512F-LABEL: test_nt64xi8: 860 ; AVX512F: # %bb.0: # %entry 861 ; AVX512F-NEXT: vmovntdq %ymm0, (%rdi) 862 ; AVX512F-NEXT: vmovntdq %ymm1, 32(%rdi) 863 ; AVX512F-NEXT: vzeroupper 864 ; AVX512F-NEXT: retq 865 ; 866 ; AVX512BW-LABEL: test_nt64xi8: 867 ; AVX512BW: # %bb.0: # %entry 868 ; AVX512BW-NEXT: vmovntdq %zmm0, (%rdi) 869 ; AVX512BW-NEXT: vzeroupper 870 ; AVX512BW-NEXT: retq 871 entry: 872 store <64 x i8> %X, <64 x i8>* %ptr, align 64, !nontemporal !1 873 ret void 874 } 875 876 define void @test_nt32xi16(<32 x i16>* nocapture %ptr, <32 x i16> %X) { 877 ; SSE-LABEL: test_nt32xi16: 878 ; SSE: # %bb.0: # %entry 879 ; SSE-NEXT: movntdq %xmm0, (%rdi) 880 ; SSE-NEXT: movntdq %xmm1, 16(%rdi) 881 ; SSE-NEXT: movntdq %xmm2, 32(%rdi) 882 ; SSE-NEXT: movntdq %xmm3, 48(%rdi) 883 ; SSE-NEXT: retq 884 ; 885 ; AVX-LABEL: test_nt32xi16: 886 ; AVX: # %bb.0: # %entry 887 ; AVX-NEXT: vmovntdq %ymm0, (%rdi) 888 ; AVX-NEXT: vmovntdq %ymm1, 32(%rdi) 889 ; AVX-NEXT: vzeroupper 890 ; AVX-NEXT: retq 891 ; 892 ; AVX512VL-LABEL: test_nt32xi16: 893 ; AVX512VL: # %bb.0: # %entry 894 ; AVX512VL-NEXT: vmovntdq %ymm0, (%rdi) 895 ; AVX512VL-NEXT: vmovntdq %ymm1, 32(%rdi) 896 ; AVX512VL-NEXT: vzeroupper 897 ; AVX512VL-NEXT: retq 898 ; 899 ; AVX512F-LABEL: test_nt32xi16: 900 ; AVX512F: # %bb.0: # %entry 901 ; AVX512F-NEXT: vmovntdq %ymm0, (%rdi) 902 ; AVX512F-NEXT: vmovntdq %ymm1, 32(%rdi) 903 ; AVX512F-NEXT: vzeroupper 904 ; AVX512F-NEXT: retq 905 ; 906 ; AVX512BW-LABEL: test_nt32xi16: 907 ; AVX512BW: # %bb.0: # %entry 908 ; AVX512BW-NEXT: vmovntdq %zmm0, (%rdi) 909 ; AVX512BW-NEXT: vzeroupper 910 ; AVX512BW-NEXT: retq 911 entry: 912 store <32 x i16> %X, <32 x i16>* %ptr, align 64, !nontemporal !1 913 ret void 914 } 915 916 define void @test_nt16xi32(<16 x i32>* nocapture %ptr, <16 x i32> %X) { 917 ; SSE-LABEL: test_nt16xi32: 918 ; SSE: # %bb.0: # %entry 919 ; SSE-NEXT: movntdq %xmm0, (%rdi) 920 ; SSE-NEXT: movntdq %xmm1, 16(%rdi) 921 ; SSE-NEXT: movntdq %xmm2, 32(%rdi) 922 ; SSE-NEXT: movntdq %xmm3, 48(%rdi) 923 ; SSE-NEXT: retq 924 ; 925 ; AVX-LABEL: test_nt16xi32: 926 ; AVX: # %bb.0: # %entry 927 ; AVX-NEXT: vmovntdq %ymm0, (%rdi) 928 ; AVX-NEXT: vmovntdq %ymm1, 32(%rdi) 929 ; AVX-NEXT: vzeroupper 930 ; AVX-NEXT: retq 931 ; 932 ; AVX512-LABEL: test_nt16xi32: 933 ; AVX512: # %bb.0: # %entry 934 ; AVX512-NEXT: vmovntdq %zmm0, (%rdi) 935 ; AVX512-NEXT: vzeroupper 936 ; AVX512-NEXT: retq 937 entry: 938 store <16 x i32> %X, <16 x i32>* %ptr, align 64, !nontemporal !1 939 ret void 940 } 941 942 define void @test_nt8xi64(<8 x i64>* nocapture %ptr, <8 x i64> %X) { 943 ; SSE-LABEL: test_nt8xi64: 944 ; SSE: # %bb.0: # %entry 945 ; SSE-NEXT: movntdq %xmm0, (%rdi) 946 ; SSE-NEXT: movntdq %xmm1, 16(%rdi) 947 ; SSE-NEXT: movntdq %xmm2, 32(%rdi) 948 ; SSE-NEXT: movntdq %xmm3, 48(%rdi) 949 ; SSE-NEXT: retq 950 ; 951 ; AVX-LABEL: test_nt8xi64: 952 ; AVX: # %bb.0: # %entry 953 ; AVX-NEXT: vmovntdq %ymm0, (%rdi) 954 ; AVX-NEXT: vmovntdq %ymm1, 32(%rdi) 955 ; AVX-NEXT: vzeroupper 956 ; AVX-NEXT: retq 957 ; 958 ; AVX512-LABEL: test_nt8xi64: 959 ; AVX512: # %bb.0: # %entry 960 ; AVX512-NEXT: vmovntdq %zmm0, (%rdi) 961 ; AVX512-NEXT: vzeroupper 962 ; AVX512-NEXT: retq 963 entry: 964 store <8 x i64> %X, <8 x i64>* %ptr, align 64, !nontemporal !1 965 ret void 966 } 967 968 ; 969 ; 512-bit Vector Loads 970 ; 971 972 define <16 x float> @test_load_nt16xfloat(<16 x float>* nocapture %ptr) { 973 ; SSE2-LABEL: test_load_nt16xfloat: 974 ; SSE2: # %bb.0: # %entry 975 ; SSE2-NEXT: movaps (%rdi), %xmm0 976 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 977 ; SSE2-NEXT: movaps 32(%rdi), %xmm2 978 ; SSE2-NEXT: movaps 48(%rdi), %xmm3 979 ; SSE2-NEXT: retq 980 ; 981 ; SSE4A-LABEL: test_load_nt16xfloat: 982 ; SSE4A: # %bb.0: # %entry 983 ; SSE4A-NEXT: movaps (%rdi), %xmm0 984 ; SSE4A-NEXT: movaps 16(%rdi), %xmm1 985 ; SSE4A-NEXT: movaps 32(%rdi), %xmm2 986 ; SSE4A-NEXT: movaps 48(%rdi), %xmm3 987 ; SSE4A-NEXT: retq 988 ; 989 ; SSE41-LABEL: test_load_nt16xfloat: 990 ; SSE41: # %bb.0: # %entry 991 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 992 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 993 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2 994 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3 995 ; SSE41-NEXT: retq 996 ; 997 ; AVX1-LABEL: test_load_nt16xfloat: 998 ; AVX1: # %bb.0: # %entry 999 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 1000 ; AVX1-NEXT: # implicit-def: $ymm1 1001 ; AVX1-NEXT: vmovaps %xmm0, %xmm1 1002 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0 1003 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1004 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm2 1005 ; AVX1-NEXT: # implicit-def: $ymm1 1006 ; AVX1-NEXT: vmovaps %xmm2, %xmm1 1007 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2 1008 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1009 ; AVX1-NEXT: retq 1010 ; 1011 ; AVX2-LABEL: test_load_nt16xfloat: 1012 ; AVX2: # %bb.0: # %entry 1013 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 1014 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1 1015 ; AVX2-NEXT: retq 1016 ; 1017 ; AVX512-LABEL: test_load_nt16xfloat: 1018 ; AVX512: # %bb.0: # %entry 1019 ; AVX512-NEXT: vmovntdqa (%rdi), %zmm0 1020 ; AVX512-NEXT: retq 1021 entry: 1022 %0 = load <16 x float>, <16 x float>* %ptr, align 64, !nontemporal !1 1023 ret <16 x float> %0 1024 } 1025 1026 define <8 x double> @test_load_nt8xdouble(<8 x double>* nocapture %ptr) { 1027 ; SSE2-LABEL: test_load_nt8xdouble: 1028 ; SSE2: # %bb.0: # %entry 1029 ; SSE2-NEXT: movapd (%rdi), %xmm0 1030 ; SSE2-NEXT: movapd 16(%rdi), %xmm1 1031 ; SSE2-NEXT: movapd 32(%rdi), %xmm2 1032 ; SSE2-NEXT: movapd 48(%rdi), %xmm3 1033 ; SSE2-NEXT: retq 1034 ; 1035 ; SSE4A-LABEL: test_load_nt8xdouble: 1036 ; SSE4A: # %bb.0: # %entry 1037 ; SSE4A-NEXT: movapd (%rdi), %xmm0 1038 ; SSE4A-NEXT: movapd 16(%rdi), %xmm1 1039 ; SSE4A-NEXT: movapd 32(%rdi), %xmm2 1040 ; SSE4A-NEXT: movapd 48(%rdi), %xmm3 1041 ; SSE4A-NEXT: retq 1042 ; 1043 ; SSE41-LABEL: test_load_nt8xdouble: 1044 ; SSE41: # %bb.0: # %entry 1045 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 1046 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 1047 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2 1048 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3 1049 ; SSE41-NEXT: retq 1050 ; 1051 ; AVX1-LABEL: test_load_nt8xdouble: 1052 ; AVX1: # %bb.0: # %entry 1053 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 1054 ; AVX1-NEXT: # implicit-def: $ymm1 1055 ; AVX1-NEXT: vmovaps %xmm0, %xmm1 1056 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0 1057 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1058 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm2 1059 ; AVX1-NEXT: # implicit-def: $ymm1 1060 ; AVX1-NEXT: vmovaps %xmm2, %xmm1 1061 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2 1062 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1063 ; AVX1-NEXT: retq 1064 ; 1065 ; AVX2-LABEL: test_load_nt8xdouble: 1066 ; AVX2: # %bb.0: # %entry 1067 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 1068 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1 1069 ; AVX2-NEXT: retq 1070 ; 1071 ; AVX512-LABEL: test_load_nt8xdouble: 1072 ; AVX512: # %bb.0: # %entry 1073 ; AVX512-NEXT: vmovntdqa (%rdi), %zmm0 1074 ; AVX512-NEXT: retq 1075 entry: 1076 %0 = load <8 x double>, <8 x double>* %ptr, align 64, !nontemporal !1 1077 ret <8 x double> %0 1078 } 1079 1080 define <64 x i8> @test_load_nt64xi8(<64 x i8>* nocapture %ptr) { 1081 ; SSE2-LABEL: test_load_nt64xi8: 1082 ; SSE2: # %bb.0: # %entry 1083 ; SSE2-NEXT: movaps (%rdi), %xmm0 1084 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 1085 ; SSE2-NEXT: movaps 32(%rdi), %xmm2 1086 ; SSE2-NEXT: movaps 48(%rdi), %xmm3 1087 ; SSE2-NEXT: retq 1088 ; 1089 ; SSE4A-LABEL: test_load_nt64xi8: 1090 ; SSE4A: # %bb.0: # %entry 1091 ; SSE4A-NEXT: movaps (%rdi), %xmm0 1092 ; SSE4A-NEXT: movaps 16(%rdi), %xmm1 1093 ; SSE4A-NEXT: movaps 32(%rdi), %xmm2 1094 ; SSE4A-NEXT: movaps 48(%rdi), %xmm3 1095 ; SSE4A-NEXT: retq 1096 ; 1097 ; SSE41-LABEL: test_load_nt64xi8: 1098 ; SSE41: # %bb.0: # %entry 1099 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 1100 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 1101 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2 1102 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3 1103 ; SSE41-NEXT: retq 1104 ; 1105 ; AVX1-LABEL: test_load_nt64xi8: 1106 ; AVX1: # %bb.0: # %entry 1107 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 1108 ; AVX1-NEXT: # implicit-def: $ymm1 1109 ; AVX1-NEXT: vmovaps %xmm0, %xmm1 1110 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0 1111 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1112 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm2 1113 ; AVX1-NEXT: # implicit-def: $ymm1 1114 ; AVX1-NEXT: vmovaps %xmm2, %xmm1 1115 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2 1116 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1117 ; AVX1-NEXT: retq 1118 ; 1119 ; AVX2-LABEL: test_load_nt64xi8: 1120 ; AVX2: # %bb.0: # %entry 1121 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 1122 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1 1123 ; AVX2-NEXT: retq 1124 ; 1125 ; AVX512VL-LABEL: test_load_nt64xi8: 1126 ; AVX512VL: # %bb.0: # %entry 1127 ; AVX512VL-NEXT: vmovntdqa (%rdi), %ymm0 1128 ; AVX512VL-NEXT: vmovntdqa 32(%rdi), %ymm1 1129 ; AVX512VL-NEXT: retq 1130 ; 1131 ; AVX512F-LABEL: test_load_nt64xi8: 1132 ; AVX512F: # %bb.0: # %entry 1133 ; AVX512F-NEXT: vmovntdqa (%rdi), %ymm0 1134 ; AVX512F-NEXT: vmovntdqa 32(%rdi), %ymm1 1135 ; AVX512F-NEXT: retq 1136 ; 1137 ; AVX512BW-LABEL: test_load_nt64xi8: 1138 ; AVX512BW: # %bb.0: # %entry 1139 ; AVX512BW-NEXT: vmovntdqa (%rdi), %zmm0 1140 ; AVX512BW-NEXT: retq 1141 entry: 1142 %0 = load <64 x i8>, <64 x i8>* %ptr, align 64, !nontemporal !1 1143 ret <64 x i8> %0 1144 } 1145 1146 define <32 x i16> @test_load_nt32xi16(<32 x i16>* nocapture %ptr) { 1147 ; SSE2-LABEL: test_load_nt32xi16: 1148 ; SSE2: # %bb.0: # %entry 1149 ; SSE2-NEXT: movaps (%rdi), %xmm0 1150 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 1151 ; SSE2-NEXT: movaps 32(%rdi), %xmm2 1152 ; SSE2-NEXT: movaps 48(%rdi), %xmm3 1153 ; SSE2-NEXT: retq 1154 ; 1155 ; SSE4A-LABEL: test_load_nt32xi16: 1156 ; SSE4A: # %bb.0: # %entry 1157 ; SSE4A-NEXT: movaps (%rdi), %xmm0 1158 ; SSE4A-NEXT: movaps 16(%rdi), %xmm1 1159 ; SSE4A-NEXT: movaps 32(%rdi), %xmm2 1160 ; SSE4A-NEXT: movaps 48(%rdi), %xmm3 1161 ; SSE4A-NEXT: retq 1162 ; 1163 ; SSE41-LABEL: test_load_nt32xi16: 1164 ; SSE41: # %bb.0: # %entry 1165 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 1166 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 1167 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2 1168 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3 1169 ; SSE41-NEXT: retq 1170 ; 1171 ; AVX1-LABEL: test_load_nt32xi16: 1172 ; AVX1: # %bb.0: # %entry 1173 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 1174 ; AVX1-NEXT: # implicit-def: $ymm1 1175 ; AVX1-NEXT: vmovaps %xmm0, %xmm1 1176 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0 1177 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1178 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm2 1179 ; AVX1-NEXT: # implicit-def: $ymm1 1180 ; AVX1-NEXT: vmovaps %xmm2, %xmm1 1181 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2 1182 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1183 ; AVX1-NEXT: retq 1184 ; 1185 ; AVX2-LABEL: test_load_nt32xi16: 1186 ; AVX2: # %bb.0: # %entry 1187 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 1188 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1 1189 ; AVX2-NEXT: retq 1190 ; 1191 ; AVX512VL-LABEL: test_load_nt32xi16: 1192 ; AVX512VL: # %bb.0: # %entry 1193 ; AVX512VL-NEXT: vmovntdqa (%rdi), %ymm0 1194 ; AVX512VL-NEXT: vmovntdqa 32(%rdi), %ymm1 1195 ; AVX512VL-NEXT: retq 1196 ; 1197 ; AVX512F-LABEL: test_load_nt32xi16: 1198 ; AVX512F: # %bb.0: # %entry 1199 ; AVX512F-NEXT: vmovntdqa (%rdi), %ymm0 1200 ; AVX512F-NEXT: vmovntdqa 32(%rdi), %ymm1 1201 ; AVX512F-NEXT: retq 1202 ; 1203 ; AVX512BW-LABEL: test_load_nt32xi16: 1204 ; AVX512BW: # %bb.0: # %entry 1205 ; AVX512BW-NEXT: vmovntdqa (%rdi), %zmm0 1206 ; AVX512BW-NEXT: retq 1207 entry: 1208 %0 = load <32 x i16>, <32 x i16>* %ptr, align 64, !nontemporal !1 1209 ret <32 x i16> %0 1210 } 1211 1212 define <16 x i32> @test_load_nt16xi32(<16 x i32>* nocapture %ptr) { 1213 ; SSE2-LABEL: test_load_nt16xi32: 1214 ; SSE2: # %bb.0: # %entry 1215 ; SSE2-NEXT: movaps (%rdi), %xmm0 1216 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 1217 ; SSE2-NEXT: movaps 32(%rdi), %xmm2 1218 ; SSE2-NEXT: movaps 48(%rdi), %xmm3 1219 ; SSE2-NEXT: retq 1220 ; 1221 ; SSE4A-LABEL: test_load_nt16xi32: 1222 ; SSE4A: # %bb.0: # %entry 1223 ; SSE4A-NEXT: movaps (%rdi), %xmm0 1224 ; SSE4A-NEXT: movaps 16(%rdi), %xmm1 1225 ; SSE4A-NEXT: movaps 32(%rdi), %xmm2 1226 ; SSE4A-NEXT: movaps 48(%rdi), %xmm3 1227 ; SSE4A-NEXT: retq 1228 ; 1229 ; SSE41-LABEL: test_load_nt16xi32: 1230 ; SSE41: # %bb.0: # %entry 1231 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 1232 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 1233 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2 1234 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3 1235 ; SSE41-NEXT: retq 1236 ; 1237 ; AVX1-LABEL: test_load_nt16xi32: 1238 ; AVX1: # %bb.0: # %entry 1239 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 1240 ; AVX1-NEXT: # implicit-def: $ymm1 1241 ; AVX1-NEXT: vmovaps %xmm0, %xmm1 1242 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0 1243 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1244 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm2 1245 ; AVX1-NEXT: # implicit-def: $ymm1 1246 ; AVX1-NEXT: vmovaps %xmm2, %xmm1 1247 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2 1248 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1249 ; AVX1-NEXT: retq 1250 ; 1251 ; AVX2-LABEL: test_load_nt16xi32: 1252 ; AVX2: # %bb.0: # %entry 1253 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 1254 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1 1255 ; AVX2-NEXT: retq 1256 ; 1257 ; AVX512-LABEL: test_load_nt16xi32: 1258 ; AVX512: # %bb.0: # %entry 1259 ; AVX512-NEXT: vmovntdqa (%rdi), %zmm0 1260 ; AVX512-NEXT: retq 1261 entry: 1262 %0 = load <16 x i32>, <16 x i32>* %ptr, align 64, !nontemporal !1 1263 ret <16 x i32> %0 1264 } 1265 1266 define <8 x i64> @test_load_nt8xi64(<8 x i64>* nocapture %ptr) { 1267 ; SSE2-LABEL: test_load_nt8xi64: 1268 ; SSE2: # %bb.0: # %entry 1269 ; SSE2-NEXT: movaps (%rdi), %xmm0 1270 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 1271 ; SSE2-NEXT: movaps 32(%rdi), %xmm2 1272 ; SSE2-NEXT: movaps 48(%rdi), %xmm3 1273 ; SSE2-NEXT: retq 1274 ; 1275 ; SSE4A-LABEL: test_load_nt8xi64: 1276 ; SSE4A: # %bb.0: # %entry 1277 ; SSE4A-NEXT: movaps (%rdi), %xmm0 1278 ; SSE4A-NEXT: movaps 16(%rdi), %xmm1 1279 ; SSE4A-NEXT: movaps 32(%rdi), %xmm2 1280 ; SSE4A-NEXT: movaps 48(%rdi), %xmm3 1281 ; SSE4A-NEXT: retq 1282 ; 1283 ; SSE41-LABEL: test_load_nt8xi64: 1284 ; SSE41: # %bb.0: # %entry 1285 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 1286 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 1287 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2 1288 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3 1289 ; SSE41-NEXT: retq 1290 ; 1291 ; AVX1-LABEL: test_load_nt8xi64: 1292 ; AVX1: # %bb.0: # %entry 1293 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 1294 ; AVX1-NEXT: # implicit-def: $ymm1 1295 ; AVX1-NEXT: vmovaps %xmm0, %xmm1 1296 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm0 1297 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 1298 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm2 1299 ; AVX1-NEXT: # implicit-def: $ymm1 1300 ; AVX1-NEXT: vmovaps %xmm2, %xmm1 1301 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2 1302 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1303 ; AVX1-NEXT: retq 1304 ; 1305 ; AVX2-LABEL: test_load_nt8xi64: 1306 ; AVX2: # %bb.0: # %entry 1307 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 1308 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1 1309 ; AVX2-NEXT: retq 1310 ; 1311 ; AVX512-LABEL: test_load_nt8xi64: 1312 ; AVX512: # %bb.0: # %entry 1313 ; AVX512-NEXT: vmovntdqa (%rdi), %zmm0 1314 ; AVX512-NEXT: retq 1315 entry: 1316 %0 = load <8 x i64>, <8 x i64>* %ptr, align 64, !nontemporal !1 1317 ret <8 x i64> %0 1318 } 1319 1320 !1 = !{i32 1} 1321