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 ; AVX512-LABEL: test_v4i32: 51 ; AVX512: # %bb.0: 52 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm0 53 ; AVX512-NEXT: retq 54 %1 = load <4 x i32>, <4 x i32>* %src, align 16, !nontemporal !1 55 ret <4 x i32> %1 56 } 57 58 define <2 x double> @test_v2f64(<2 x double>* %src) { 59 ; SSE2-LABEL: test_v2f64: 60 ; SSE2: # %bb.0: 61 ; SSE2-NEXT: movaps (%rdi), %xmm0 62 ; SSE2-NEXT: retq 63 ; 64 ; SSE41-LABEL: test_v2f64: 65 ; SSE41: # %bb.0: 66 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 67 ; SSE41-NEXT: retq 68 ; 69 ; AVX-LABEL: test_v2f64: 70 ; AVX: # %bb.0: 71 ; AVX-NEXT: vmovntdqa (%rdi), %xmm0 72 ; AVX-NEXT: retq 73 ; 74 ; AVX512-LABEL: test_v2f64: 75 ; AVX512: # %bb.0: 76 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm0 77 ; AVX512-NEXT: retq 78 %1 = load <2 x double>, <2 x double>* %src, align 16, !nontemporal !1 79 ret <2 x double> %1 80 } 81 82 define <2 x i64> @test_v2i64(<2 x i64>* %src) { 83 ; SSE2-LABEL: test_v2i64: 84 ; SSE2: # %bb.0: 85 ; SSE2-NEXT: movaps (%rdi), %xmm0 86 ; SSE2-NEXT: retq 87 ; 88 ; SSE41-LABEL: test_v2i64: 89 ; SSE41: # %bb.0: 90 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 91 ; SSE41-NEXT: retq 92 ; 93 ; AVX-LABEL: test_v2i64: 94 ; AVX: # %bb.0: 95 ; AVX-NEXT: vmovntdqa (%rdi), %xmm0 96 ; AVX-NEXT: retq 97 ; 98 ; AVX512-LABEL: test_v2i64: 99 ; AVX512: # %bb.0: 100 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm0 101 ; AVX512-NEXT: retq 102 %1 = load <2 x i64>, <2 x i64>* %src, align 16, !nontemporal !1 103 ret <2 x i64> %1 104 } 105 106 define <8 x i16> @test_v8i16(<8 x i16>* %src) { 107 ; SSE2-LABEL: test_v8i16: 108 ; SSE2: # %bb.0: 109 ; SSE2-NEXT: movaps (%rdi), %xmm0 110 ; SSE2-NEXT: retq 111 ; 112 ; SSE41-LABEL: test_v8i16: 113 ; SSE41: # %bb.0: 114 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 115 ; SSE41-NEXT: retq 116 ; 117 ; AVX-LABEL: test_v8i16: 118 ; AVX: # %bb.0: 119 ; AVX-NEXT: vmovntdqa (%rdi), %xmm0 120 ; AVX-NEXT: retq 121 ; 122 ; AVX512-LABEL: test_v8i16: 123 ; AVX512: # %bb.0: 124 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm0 125 ; AVX512-NEXT: retq 126 %1 = load <8 x i16>, <8 x i16>* %src, align 16, !nontemporal !1 127 ret <8 x i16> %1 128 } 129 130 define <16 x i8> @test_v16i8(<16 x i8>* %src) { 131 ; SSE2-LABEL: test_v16i8: 132 ; SSE2: # %bb.0: 133 ; SSE2-NEXT: movaps (%rdi), %xmm0 134 ; SSE2-NEXT: retq 135 ; 136 ; SSE41-LABEL: test_v16i8: 137 ; SSE41: # %bb.0: 138 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 139 ; SSE41-NEXT: retq 140 ; 141 ; AVX-LABEL: test_v16i8: 142 ; AVX: # %bb.0: 143 ; AVX-NEXT: vmovntdqa (%rdi), %xmm0 144 ; AVX-NEXT: retq 145 ; 146 ; AVX512-LABEL: test_v16i8: 147 ; AVX512: # %bb.0: 148 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm0 149 ; AVX512-NEXT: retq 150 %1 = load <16 x i8>, <16 x i8>* %src, align 16, !nontemporal !1 151 ret <16 x i8> %1 152 } 153 154 ; And now YMM versions. 155 156 define <8 x float> @test_v8f32(<8 x float>* %src) { 157 ; SSE2-LABEL: test_v8f32: 158 ; SSE2: # %bb.0: 159 ; SSE2-NEXT: movaps (%rdi), %xmm0 160 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 161 ; SSE2-NEXT: retq 162 ; 163 ; SSE41-LABEL: test_v8f32: 164 ; SSE41: # %bb.0: 165 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 166 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 167 ; SSE41-NEXT: retq 168 ; 169 ; AVX1-LABEL: test_v8f32: 170 ; AVX1: # %bb.0: 171 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 172 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1 173 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 174 ; AVX1-NEXT: retq 175 ; 176 ; AVX2-LABEL: test_v8f32: 177 ; AVX2: # %bb.0: 178 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 179 ; AVX2-NEXT: retq 180 ; 181 ; AVX512-LABEL: test_v8f32: 182 ; AVX512: # %bb.0: 183 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0 184 ; AVX512-NEXT: retq 185 %1 = load <8 x float>, <8 x float>* %src, align 32, !nontemporal !1 186 ret <8 x float> %1 187 } 188 189 define <8 x i32> @test_v8i32(<8 x i32>* %src) { 190 ; SSE2-LABEL: test_v8i32: 191 ; SSE2: # %bb.0: 192 ; SSE2-NEXT: movaps (%rdi), %xmm0 193 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 194 ; SSE2-NEXT: retq 195 ; 196 ; SSE41-LABEL: test_v8i32: 197 ; SSE41: # %bb.0: 198 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 199 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 200 ; SSE41-NEXT: retq 201 ; 202 ; AVX1-LABEL: test_v8i32: 203 ; AVX1: # %bb.0: 204 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 205 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1 206 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 207 ; AVX1-NEXT: retq 208 ; 209 ; AVX2-LABEL: test_v8i32: 210 ; AVX2: # %bb.0: 211 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 212 ; AVX2-NEXT: retq 213 ; 214 ; AVX512-LABEL: test_v8i32: 215 ; AVX512: # %bb.0: 216 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0 217 ; AVX512-NEXT: retq 218 %1 = load <8 x i32>, <8 x i32>* %src, align 32, !nontemporal !1 219 ret <8 x i32> %1 220 } 221 222 define <4 x double> @test_v4f64(<4 x double>* %src) { 223 ; SSE2-LABEL: test_v4f64: 224 ; SSE2: # %bb.0: 225 ; SSE2-NEXT: movaps (%rdi), %xmm0 226 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 227 ; SSE2-NEXT: retq 228 ; 229 ; SSE41-LABEL: test_v4f64: 230 ; SSE41: # %bb.0: 231 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 232 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 233 ; SSE41-NEXT: retq 234 ; 235 ; AVX1-LABEL: test_v4f64: 236 ; AVX1: # %bb.0: 237 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 238 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1 239 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 240 ; AVX1-NEXT: retq 241 ; 242 ; AVX2-LABEL: test_v4f64: 243 ; AVX2: # %bb.0: 244 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 245 ; AVX2-NEXT: retq 246 ; 247 ; AVX512-LABEL: test_v4f64: 248 ; AVX512: # %bb.0: 249 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0 250 ; AVX512-NEXT: retq 251 %1 = load <4 x double>, <4 x double>* %src, align 32, !nontemporal !1 252 ret <4 x double> %1 253 } 254 255 define <4 x i64> @test_v4i64(<4 x i64>* %src) { 256 ; SSE2-LABEL: test_v4i64: 257 ; SSE2: # %bb.0: 258 ; SSE2-NEXT: movaps (%rdi), %xmm0 259 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 260 ; SSE2-NEXT: retq 261 ; 262 ; SSE41-LABEL: test_v4i64: 263 ; SSE41: # %bb.0: 264 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 265 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 266 ; SSE41-NEXT: retq 267 ; 268 ; AVX1-LABEL: test_v4i64: 269 ; AVX1: # %bb.0: 270 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 271 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1 272 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 273 ; AVX1-NEXT: retq 274 ; 275 ; AVX2-LABEL: test_v4i64: 276 ; AVX2: # %bb.0: 277 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 278 ; AVX2-NEXT: retq 279 ; 280 ; AVX512-LABEL: test_v4i64: 281 ; AVX512: # %bb.0: 282 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0 283 ; AVX512-NEXT: retq 284 %1 = load <4 x i64>, <4 x i64>* %src, align 32, !nontemporal !1 285 ret <4 x i64> %1 286 } 287 288 define <16 x i16> @test_v16i16(<16 x i16>* %src) { 289 ; SSE2-LABEL: test_v16i16: 290 ; SSE2: # %bb.0: 291 ; SSE2-NEXT: movaps (%rdi), %xmm0 292 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 293 ; SSE2-NEXT: retq 294 ; 295 ; SSE41-LABEL: test_v16i16: 296 ; SSE41: # %bb.0: 297 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 298 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 299 ; SSE41-NEXT: retq 300 ; 301 ; AVX1-LABEL: test_v16i16: 302 ; AVX1: # %bb.0: 303 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 304 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1 305 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 306 ; AVX1-NEXT: retq 307 ; 308 ; AVX2-LABEL: test_v16i16: 309 ; AVX2: # %bb.0: 310 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 311 ; AVX2-NEXT: retq 312 ; 313 ; AVX512-LABEL: test_v16i16: 314 ; AVX512: # %bb.0: 315 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0 316 ; AVX512-NEXT: retq 317 %1 = load <16 x i16>, <16 x i16>* %src, align 32, !nontemporal !1 318 ret <16 x i16> %1 319 } 320 321 define <32 x i8> @test_v32i8(<32 x i8>* %src) { 322 ; SSE2-LABEL: test_v32i8: 323 ; SSE2: # %bb.0: 324 ; SSE2-NEXT: movaps (%rdi), %xmm0 325 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 326 ; SSE2-NEXT: retq 327 ; 328 ; SSE41-LABEL: test_v32i8: 329 ; SSE41: # %bb.0: 330 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 331 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 332 ; SSE41-NEXT: retq 333 ; 334 ; AVX1-LABEL: test_v32i8: 335 ; AVX1: # %bb.0: 336 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 337 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1 338 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 339 ; AVX1-NEXT: retq 340 ; 341 ; AVX2-LABEL: test_v32i8: 342 ; AVX2: # %bb.0: 343 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 344 ; AVX2-NEXT: retq 345 ; 346 ; AVX512-LABEL: test_v32i8: 347 ; AVX512: # %bb.0: 348 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm0 349 ; AVX512-NEXT: retq 350 %1 = load <32 x i8>, <32 x i8>* %src, align 32, !nontemporal !1 351 ret <32 x i8> %1 352 } 353 354 ; And now ZMM versions. 355 356 define <16 x float> @test_v16f32(<16 x float>* %src) { 357 ; SSE2-LABEL: test_v16f32: 358 ; SSE2: # %bb.0: 359 ; SSE2-NEXT: movaps (%rdi), %xmm0 360 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 361 ; SSE2-NEXT: movaps 32(%rdi), %xmm2 362 ; SSE2-NEXT: movaps 48(%rdi), %xmm3 363 ; SSE2-NEXT: retq 364 ; 365 ; SSE41-LABEL: test_v16f32: 366 ; SSE41: # %bb.0: 367 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 368 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 369 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2 370 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3 371 ; SSE41-NEXT: retq 372 ; 373 ; AVX1-LABEL: test_v16f32: 374 ; AVX1: # %bb.0: 375 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 376 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1 377 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 378 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm1 379 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2 380 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 381 ; AVX1-NEXT: retq 382 ; 383 ; AVX2-LABEL: test_v16f32: 384 ; AVX2: # %bb.0: 385 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 386 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1 387 ; AVX2-NEXT: retq 388 ; 389 ; AVX512-LABEL: test_v16f32: 390 ; AVX512: # %bb.0: 391 ; AVX512-NEXT: vmovntdqa (%rdi), %zmm0 392 ; AVX512-NEXT: retq 393 %1 = load <16 x float>, <16 x float>* %src, align 64, !nontemporal !1 394 ret <16 x float> %1 395 } 396 397 define <16 x i32> @test_v16i32(<16 x i32>* %src) { 398 ; SSE2-LABEL: test_v16i32: 399 ; SSE2: # %bb.0: 400 ; SSE2-NEXT: movaps (%rdi), %xmm0 401 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 402 ; SSE2-NEXT: movaps 32(%rdi), %xmm2 403 ; SSE2-NEXT: movaps 48(%rdi), %xmm3 404 ; SSE2-NEXT: retq 405 ; 406 ; SSE41-LABEL: test_v16i32: 407 ; SSE41: # %bb.0: 408 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 409 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 410 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2 411 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3 412 ; SSE41-NEXT: retq 413 ; 414 ; AVX1-LABEL: test_v16i32: 415 ; AVX1: # %bb.0: 416 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 417 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1 418 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 419 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm1 420 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2 421 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %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: vmovntdqa (%rdi), %xmm0 458 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1 459 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 460 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm1 461 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2 462 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 463 ; AVX1-NEXT: retq 464 ; 465 ; AVX2-LABEL: test_v8f64: 466 ; AVX2: # %bb.0: 467 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 468 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1 469 ; AVX2-NEXT: retq 470 ; 471 ; AVX512-LABEL: test_v8f64: 472 ; AVX512: # %bb.0: 473 ; AVX512-NEXT: vmovntdqa (%rdi), %zmm0 474 ; AVX512-NEXT: retq 475 %1 = load <8 x double>, <8 x double>* %src, align 64, !nontemporal !1 476 ret <8 x double> %1 477 } 478 479 define <8 x i64> @test_v8i64(<8 x i64>* %src) { 480 ; SSE2-LABEL: test_v8i64: 481 ; SSE2: # %bb.0: 482 ; SSE2-NEXT: movaps (%rdi), %xmm0 483 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 484 ; SSE2-NEXT: movaps 32(%rdi), %xmm2 485 ; SSE2-NEXT: movaps 48(%rdi), %xmm3 486 ; SSE2-NEXT: retq 487 ; 488 ; SSE41-LABEL: test_v8i64: 489 ; SSE41: # %bb.0: 490 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 491 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 492 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2 493 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3 494 ; SSE41-NEXT: retq 495 ; 496 ; AVX1-LABEL: test_v8i64: 497 ; AVX1: # %bb.0: 498 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 499 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1 500 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 501 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm1 502 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2 503 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 504 ; AVX1-NEXT: retq 505 ; 506 ; AVX2-LABEL: test_v8i64: 507 ; AVX2: # %bb.0: 508 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 509 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1 510 ; AVX2-NEXT: retq 511 ; 512 ; AVX512-LABEL: test_v8i64: 513 ; AVX512: # %bb.0: 514 ; AVX512-NEXT: vmovntdqa (%rdi), %zmm0 515 ; AVX512-NEXT: retq 516 %1 = load <8 x i64>, <8 x i64>* %src, align 64, !nontemporal !1 517 ret <8 x i64> %1 518 } 519 520 define <32 x i16> @test_v32i16(<32 x i16>* %src) { 521 ; SSE2-LABEL: test_v32i16: 522 ; SSE2: # %bb.0: 523 ; SSE2-NEXT: movaps (%rdi), %xmm0 524 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 525 ; SSE2-NEXT: movaps 32(%rdi), %xmm2 526 ; SSE2-NEXT: movaps 48(%rdi), %xmm3 527 ; SSE2-NEXT: retq 528 ; 529 ; SSE41-LABEL: test_v32i16: 530 ; SSE41: # %bb.0: 531 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 532 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 533 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2 534 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3 535 ; SSE41-NEXT: retq 536 ; 537 ; AVX1-LABEL: test_v32i16: 538 ; AVX1: # %bb.0: 539 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 540 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1 541 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 542 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm1 543 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2 544 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 545 ; AVX1-NEXT: retq 546 ; 547 ; AVX2-LABEL: test_v32i16: 548 ; AVX2: # %bb.0: 549 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 550 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1 551 ; AVX2-NEXT: retq 552 ; 553 ; AVX512F-LABEL: test_v32i16: 554 ; AVX512F: # %bb.0: 555 ; AVX512F-NEXT: vmovntdqa (%rdi), %ymm0 556 ; AVX512F-NEXT: vmovntdqa 32(%rdi), %ymm1 557 ; AVX512F-NEXT: retq 558 ; 559 ; AVX512BW-LABEL: test_v32i16: 560 ; AVX512BW: # %bb.0: 561 ; AVX512BW-NEXT: vmovntdqa (%rdi), %zmm0 562 ; AVX512BW-NEXT: retq 563 ; 564 ; AVX512VL-LABEL: test_v32i16: 565 ; AVX512VL: # %bb.0: 566 ; AVX512VL-NEXT: vmovntdqa (%rdi), %ymm0 567 ; AVX512VL-NEXT: vmovntdqa 32(%rdi), %ymm1 568 ; AVX512VL-NEXT: retq 569 %1 = load <32 x i16>, <32 x i16>* %src, align 64, !nontemporal !1 570 ret <32 x i16> %1 571 } 572 573 define <64 x i8> @test_v64i8(<64 x i8>* %src) { 574 ; SSE2-LABEL: test_v64i8: 575 ; SSE2: # %bb.0: 576 ; SSE2-NEXT: movaps (%rdi), %xmm0 577 ; SSE2-NEXT: movaps 16(%rdi), %xmm1 578 ; SSE2-NEXT: movaps 32(%rdi), %xmm2 579 ; SSE2-NEXT: movaps 48(%rdi), %xmm3 580 ; SSE2-NEXT: retq 581 ; 582 ; SSE41-LABEL: test_v64i8: 583 ; SSE41: # %bb.0: 584 ; SSE41-NEXT: movntdqa (%rdi), %xmm0 585 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm1 586 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm2 587 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm3 588 ; SSE41-NEXT: retq 589 ; 590 ; AVX1-LABEL: test_v64i8: 591 ; AVX1: # %bb.0: 592 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm0 593 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1 594 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 595 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm1 596 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2 597 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 598 ; AVX1-NEXT: retq 599 ; 600 ; AVX2-LABEL: test_v64i8: 601 ; AVX2: # %bb.0: 602 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 603 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1 604 ; AVX2-NEXT: retq 605 ; 606 ; AVX512F-LABEL: test_v64i8: 607 ; AVX512F: # %bb.0: 608 ; AVX512F-NEXT: vmovntdqa (%rdi), %ymm0 609 ; AVX512F-NEXT: vmovntdqa 32(%rdi), %ymm1 610 ; AVX512F-NEXT: retq 611 ; 612 ; AVX512BW-LABEL: test_v64i8: 613 ; AVX512BW: # %bb.0: 614 ; AVX512BW-NEXT: vmovntdqa (%rdi), %zmm0 615 ; AVX512BW-NEXT: retq 616 ; 617 ; AVX512VL-LABEL: test_v64i8: 618 ; AVX512VL: # %bb.0: 619 ; AVX512VL-NEXT: vmovntdqa (%rdi), %ymm0 620 ; AVX512VL-NEXT: vmovntdqa 32(%rdi), %ymm1 621 ; AVX512VL-NEXT: retq 622 %1 = load <64 x i8>, <64 x i8>* %src, align 64, !nontemporal !1 623 ret <64 x i8> %1 624 } 625 626 627 ; Check cases where the load would be folded. 628 629 define <4 x float> @test_arg_v4f32(<4 x float> %arg, <4 x float>* %src) { 630 ; SSE2-LABEL: test_arg_v4f32: 631 ; SSE2: # %bb.0: 632 ; SSE2-NEXT: addps (%rdi), %xmm0 633 ; SSE2-NEXT: retq 634 ; 635 ; SSE41-LABEL: test_arg_v4f32: 636 ; SSE41: # %bb.0: 637 ; SSE41-NEXT: movntdqa (%rdi), %xmm1 638 ; SSE41-NEXT: addps %xmm1, %xmm0 639 ; SSE41-NEXT: retq 640 ; 641 ; AVX-LABEL: test_arg_v4f32: 642 ; AVX: # %bb.0: 643 ; AVX-NEXT: vmovntdqa (%rdi), %xmm1 644 ; AVX-NEXT: vaddps %xmm1, %xmm0, %xmm0 645 ; AVX-NEXT: retq 646 ; 647 ; AVX512-LABEL: test_arg_v4f32: 648 ; AVX512: # %bb.0: 649 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm1 650 ; AVX512-NEXT: vaddps %xmm1, %xmm0, %xmm0 651 ; AVX512-NEXT: retq 652 %1 = load <4 x float>, <4 x float>* %src, align 16, !nontemporal !1 653 %2 = fadd <4 x float> %arg, %1 654 ret <4 x float> %2 655 } 656 657 define <4 x i32> @test_arg_v4i32(<4 x i32> %arg, <4 x i32>* %src) { 658 ; SSE2-LABEL: test_arg_v4i32: 659 ; SSE2: # %bb.0: 660 ; SSE2-NEXT: paddd (%rdi), %xmm0 661 ; SSE2-NEXT: retq 662 ; 663 ; SSE41-LABEL: test_arg_v4i32: 664 ; SSE41: # %bb.0: 665 ; SSE41-NEXT: movntdqa (%rdi), %xmm1 666 ; SSE41-NEXT: paddd %xmm1, %xmm0 667 ; SSE41-NEXT: retq 668 ; 669 ; AVX-LABEL: test_arg_v4i32: 670 ; AVX: # %bb.0: 671 ; AVX-NEXT: vmovntdqa (%rdi), %xmm1 672 ; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm0 673 ; AVX-NEXT: retq 674 ; 675 ; AVX512-LABEL: test_arg_v4i32: 676 ; AVX512: # %bb.0: 677 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm1 678 ; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm0 679 ; AVX512-NEXT: retq 680 %1 = load <4 x i32>, <4 x i32>* %src, align 16, !nontemporal !1 681 %2 = add <4 x i32> %arg, %1 682 ret <4 x i32> %2 683 } 684 685 define <2 x double> @test_arg_v2f64(<2 x double> %arg, <2 x double>* %src) { 686 ; SSE2-LABEL: test_arg_v2f64: 687 ; SSE2: # %bb.0: 688 ; SSE2-NEXT: addpd (%rdi), %xmm0 689 ; SSE2-NEXT: retq 690 ; 691 ; SSE41-LABEL: test_arg_v2f64: 692 ; SSE41: # %bb.0: 693 ; SSE41-NEXT: movntdqa (%rdi), %xmm1 694 ; SSE41-NEXT: addpd %xmm1, %xmm0 695 ; SSE41-NEXT: retq 696 ; 697 ; AVX-LABEL: test_arg_v2f64: 698 ; AVX: # %bb.0: 699 ; AVX-NEXT: vmovntdqa (%rdi), %xmm1 700 ; AVX-NEXT: vaddpd %xmm1, %xmm0, %xmm0 701 ; AVX-NEXT: retq 702 ; 703 ; AVX512-LABEL: test_arg_v2f64: 704 ; AVX512: # %bb.0: 705 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm1 706 ; AVX512-NEXT: vaddpd %xmm1, %xmm0, %xmm0 707 ; AVX512-NEXT: retq 708 %1 = load <2 x double>, <2 x double>* %src, align 16, !nontemporal !1 709 %2 = fadd <2 x double> %arg, %1 710 ret <2 x double> %2 711 } 712 713 define <2 x i64> @test_arg_v2i64(<2 x i64> %arg, <2 x i64>* %src) { 714 ; SSE2-LABEL: test_arg_v2i64: 715 ; SSE2: # %bb.0: 716 ; SSE2-NEXT: paddq (%rdi), %xmm0 717 ; SSE2-NEXT: retq 718 ; 719 ; SSE41-LABEL: test_arg_v2i64: 720 ; SSE41: # %bb.0: 721 ; SSE41-NEXT: movntdqa (%rdi), %xmm1 722 ; SSE41-NEXT: paddq %xmm1, %xmm0 723 ; SSE41-NEXT: retq 724 ; 725 ; AVX-LABEL: test_arg_v2i64: 726 ; AVX: # %bb.0: 727 ; AVX-NEXT: vmovntdqa (%rdi), %xmm1 728 ; AVX-NEXT: vpaddq %xmm1, %xmm0, %xmm0 729 ; AVX-NEXT: retq 730 ; 731 ; AVX512-LABEL: test_arg_v2i64: 732 ; AVX512: # %bb.0: 733 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm1 734 ; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm0 735 ; AVX512-NEXT: retq 736 %1 = load <2 x i64>, <2 x i64>* %src, align 16, !nontemporal !1 737 %2 = add <2 x i64> %arg, %1 738 ret <2 x i64> %2 739 } 740 741 define <8 x i16> @test_arg_v8i16(<8 x i16> %arg, <8 x i16>* %src) { 742 ; SSE2-LABEL: test_arg_v8i16: 743 ; SSE2: # %bb.0: 744 ; SSE2-NEXT: paddw (%rdi), %xmm0 745 ; SSE2-NEXT: retq 746 ; 747 ; SSE41-LABEL: test_arg_v8i16: 748 ; SSE41: # %bb.0: 749 ; SSE41-NEXT: movntdqa (%rdi), %xmm1 750 ; SSE41-NEXT: paddw %xmm1, %xmm0 751 ; SSE41-NEXT: retq 752 ; 753 ; AVX-LABEL: test_arg_v8i16: 754 ; AVX: # %bb.0: 755 ; AVX-NEXT: vmovntdqa (%rdi), %xmm1 756 ; AVX-NEXT: vpaddw %xmm1, %xmm0, %xmm0 757 ; AVX-NEXT: retq 758 ; 759 ; AVX512-LABEL: test_arg_v8i16: 760 ; AVX512: # %bb.0: 761 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm1 762 ; AVX512-NEXT: vpaddw %xmm1, %xmm0, %xmm0 763 ; AVX512-NEXT: retq 764 %1 = load <8 x i16>, <8 x i16>* %src, align 16, !nontemporal !1 765 %2 = add <8 x i16> %arg, %1 766 ret <8 x i16> %2 767 } 768 769 define <16 x i8> @test_arg_v16i8(<16 x i8> %arg, <16 x i8>* %src) { 770 ; SSE2-LABEL: test_arg_v16i8: 771 ; SSE2: # %bb.0: 772 ; SSE2-NEXT: paddb (%rdi), %xmm0 773 ; SSE2-NEXT: retq 774 ; 775 ; SSE41-LABEL: test_arg_v16i8: 776 ; SSE41: # %bb.0: 777 ; SSE41-NEXT: movntdqa (%rdi), %xmm1 778 ; SSE41-NEXT: paddb %xmm1, %xmm0 779 ; SSE41-NEXT: retq 780 ; 781 ; AVX-LABEL: test_arg_v16i8: 782 ; AVX: # %bb.0: 783 ; AVX-NEXT: vmovntdqa (%rdi), %xmm1 784 ; AVX-NEXT: vpaddb %xmm1, %xmm0, %xmm0 785 ; AVX-NEXT: retq 786 ; 787 ; AVX512-LABEL: test_arg_v16i8: 788 ; AVX512: # %bb.0: 789 ; AVX512-NEXT: vmovntdqa (%rdi), %xmm1 790 ; AVX512-NEXT: vpaddb %xmm1, %xmm0, %xmm0 791 ; AVX512-NEXT: retq 792 %1 = load <16 x i8>, <16 x i8>* %src, align 16, !nontemporal !1 793 %2 = add <16 x i8> %arg, %1 794 ret <16 x i8> %2 795 } 796 797 ; And now YMM versions. 798 799 define <8 x float> @test_arg_v8f32(<8 x float> %arg, <8 x float>* %src) { 800 ; SSE2-LABEL: test_arg_v8f32: 801 ; SSE2: # %bb.0: 802 ; SSE2-NEXT: addps (%rdi), %xmm0 803 ; SSE2-NEXT: addps 16(%rdi), %xmm1 804 ; SSE2-NEXT: retq 805 ; 806 ; SSE41-LABEL: test_arg_v8f32: 807 ; SSE41: # %bb.0: 808 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm2 809 ; SSE41-NEXT: movntdqa (%rdi), %xmm3 810 ; SSE41-NEXT: addps %xmm3, %xmm0 811 ; SSE41-NEXT: addps %xmm2, %xmm1 812 ; SSE41-NEXT: retq 813 ; 814 ; AVX1-LABEL: test_arg_v8f32: 815 ; AVX1: # %bb.0: 816 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm1 817 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm2 818 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 819 ; AVX1-NEXT: vaddps %ymm1, %ymm0, %ymm0 820 ; AVX1-NEXT: retq 821 ; 822 ; AVX2-LABEL: test_arg_v8f32: 823 ; AVX2: # %bb.0: 824 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm1 825 ; AVX2-NEXT: vaddps %ymm1, %ymm0, %ymm0 826 ; AVX2-NEXT: retq 827 ; 828 ; AVX512-LABEL: test_arg_v8f32: 829 ; AVX512: # %bb.0: 830 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm1 831 ; AVX512-NEXT: vaddps %ymm1, %ymm0, %ymm0 832 ; AVX512-NEXT: retq 833 %1 = load <8 x float>, <8 x float>* %src, align 32, !nontemporal !1 834 %2 = fadd <8 x float> %arg, %1 835 ret <8 x float> %2 836 } 837 838 define <8 x i32> @test_arg_v8i32(<8 x i32> %arg, <8 x i32>* %src) { 839 ; SSE2-LABEL: test_arg_v8i32: 840 ; SSE2: # %bb.0: 841 ; SSE2-NEXT: paddd (%rdi), %xmm0 842 ; SSE2-NEXT: paddd 16(%rdi), %xmm1 843 ; SSE2-NEXT: retq 844 ; 845 ; SSE41-LABEL: test_arg_v8i32: 846 ; SSE41: # %bb.0: 847 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm2 848 ; SSE41-NEXT: movntdqa (%rdi), %xmm3 849 ; SSE41-NEXT: paddd %xmm3, %xmm0 850 ; SSE41-NEXT: paddd %xmm2, %xmm1 851 ; SSE41-NEXT: retq 852 ; 853 ; AVX1-LABEL: test_arg_v8i32: 854 ; AVX1: # %bb.0: 855 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm1 856 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm2 857 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 858 ; AVX1-NEXT: vpaddd %xmm2, %xmm3, %xmm2 859 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0 860 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 861 ; AVX1-NEXT: retq 862 ; 863 ; AVX2-LABEL: test_arg_v8i32: 864 ; AVX2: # %bb.0: 865 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm1 866 ; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0 867 ; AVX2-NEXT: retq 868 ; 869 ; AVX512-LABEL: test_arg_v8i32: 870 ; AVX512: # %bb.0: 871 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm1 872 ; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm0 873 ; AVX512-NEXT: retq 874 %1 = load <8 x i32>, <8 x i32>* %src, align 32, !nontemporal !1 875 %2 = add <8 x i32> %arg, %1 876 ret <8 x i32> %2 877 } 878 879 define <4 x double> @test_arg_v4f64(<4 x double> %arg, <4 x double>* %src) { 880 ; SSE2-LABEL: test_arg_v4f64: 881 ; SSE2: # %bb.0: 882 ; SSE2-NEXT: addpd (%rdi), %xmm0 883 ; SSE2-NEXT: addpd 16(%rdi), %xmm1 884 ; SSE2-NEXT: retq 885 ; 886 ; SSE41-LABEL: test_arg_v4f64: 887 ; SSE41: # %bb.0: 888 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm2 889 ; SSE41-NEXT: movntdqa (%rdi), %xmm3 890 ; SSE41-NEXT: addpd %xmm3, %xmm0 891 ; SSE41-NEXT: addpd %xmm2, %xmm1 892 ; SSE41-NEXT: retq 893 ; 894 ; AVX1-LABEL: test_arg_v4f64: 895 ; AVX1: # %bb.0: 896 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm1 897 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm2 898 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 899 ; AVX1-NEXT: vaddpd %ymm1, %ymm0, %ymm0 900 ; AVX1-NEXT: retq 901 ; 902 ; AVX2-LABEL: test_arg_v4f64: 903 ; AVX2: # %bb.0: 904 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm1 905 ; AVX2-NEXT: vaddpd %ymm1, %ymm0, %ymm0 906 ; AVX2-NEXT: retq 907 ; 908 ; AVX512-LABEL: test_arg_v4f64: 909 ; AVX512: # %bb.0: 910 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm1 911 ; AVX512-NEXT: vaddpd %ymm1, %ymm0, %ymm0 912 ; AVX512-NEXT: retq 913 %1 = load <4 x double>, <4 x double>* %src, align 32, !nontemporal !1 914 %2 = fadd <4 x double> %arg, %1 915 ret <4 x double> %2 916 } 917 918 define <4 x i64> @test_arg_v4i64(<4 x i64> %arg, <4 x i64>* %src) { 919 ; SSE2-LABEL: test_arg_v4i64: 920 ; SSE2: # %bb.0: 921 ; SSE2-NEXT: paddq (%rdi), %xmm0 922 ; SSE2-NEXT: paddq 16(%rdi), %xmm1 923 ; SSE2-NEXT: retq 924 ; 925 ; SSE41-LABEL: test_arg_v4i64: 926 ; SSE41: # %bb.0: 927 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm2 928 ; SSE41-NEXT: movntdqa (%rdi), %xmm3 929 ; SSE41-NEXT: paddq %xmm3, %xmm0 930 ; SSE41-NEXT: paddq %xmm2, %xmm1 931 ; SSE41-NEXT: retq 932 ; 933 ; AVX1-LABEL: test_arg_v4i64: 934 ; AVX1: # %bb.0: 935 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm1 936 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm2 937 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 938 ; AVX1-NEXT: vpaddq %xmm2, %xmm3, %xmm2 939 ; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0 940 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 941 ; AVX1-NEXT: retq 942 ; 943 ; AVX2-LABEL: test_arg_v4i64: 944 ; AVX2: # %bb.0: 945 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm1 946 ; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0 947 ; AVX2-NEXT: retq 948 ; 949 ; AVX512-LABEL: test_arg_v4i64: 950 ; AVX512: # %bb.0: 951 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm1 952 ; AVX512-NEXT: vpaddq %ymm1, %ymm0, %ymm0 953 ; AVX512-NEXT: retq 954 %1 = load <4 x i64>, <4 x i64>* %src, align 32, !nontemporal !1 955 %2 = add <4 x i64> %arg, %1 956 ret <4 x i64> %2 957 } 958 959 define <16 x i16> @test_arg_v16i16(<16 x i16> %arg, <16 x i16>* %src) { 960 ; SSE2-LABEL: test_arg_v16i16: 961 ; SSE2: # %bb.0: 962 ; SSE2-NEXT: paddw (%rdi), %xmm0 963 ; SSE2-NEXT: paddw 16(%rdi), %xmm1 964 ; SSE2-NEXT: retq 965 ; 966 ; SSE41-LABEL: test_arg_v16i16: 967 ; SSE41: # %bb.0: 968 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm2 969 ; SSE41-NEXT: movntdqa (%rdi), %xmm3 970 ; SSE41-NEXT: paddw %xmm3, %xmm0 971 ; SSE41-NEXT: paddw %xmm2, %xmm1 972 ; SSE41-NEXT: retq 973 ; 974 ; AVX1-LABEL: test_arg_v16i16: 975 ; AVX1: # %bb.0: 976 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm1 977 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm2 978 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 979 ; AVX1-NEXT: vpaddw %xmm2, %xmm3, %xmm2 980 ; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm0 981 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 982 ; AVX1-NEXT: retq 983 ; 984 ; AVX2-LABEL: test_arg_v16i16: 985 ; AVX2: # %bb.0: 986 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm1 987 ; AVX2-NEXT: vpaddw %ymm1, %ymm0, %ymm0 988 ; AVX2-NEXT: retq 989 ; 990 ; AVX512-LABEL: test_arg_v16i16: 991 ; AVX512: # %bb.0: 992 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm1 993 ; AVX512-NEXT: vpaddw %ymm1, %ymm0, %ymm0 994 ; AVX512-NEXT: retq 995 %1 = load <16 x i16>, <16 x i16>* %src, align 32, !nontemporal !1 996 %2 = add <16 x i16> %arg, %1 997 ret <16 x i16> %2 998 } 999 1000 define <32 x i8> @test_arg_v32i8(<32 x i8> %arg, <32 x i8>* %src) { 1001 ; SSE2-LABEL: test_arg_v32i8: 1002 ; SSE2: # %bb.0: 1003 ; SSE2-NEXT: paddb (%rdi), %xmm0 1004 ; SSE2-NEXT: paddb 16(%rdi), %xmm1 1005 ; SSE2-NEXT: retq 1006 ; 1007 ; SSE41-LABEL: test_arg_v32i8: 1008 ; SSE41: # %bb.0: 1009 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm2 1010 ; SSE41-NEXT: movntdqa (%rdi), %xmm3 1011 ; SSE41-NEXT: paddb %xmm3, %xmm0 1012 ; SSE41-NEXT: paddb %xmm2, %xmm1 1013 ; SSE41-NEXT: retq 1014 ; 1015 ; AVX1-LABEL: test_arg_v32i8: 1016 ; AVX1: # %bb.0: 1017 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm1 1018 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm2 1019 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1020 ; AVX1-NEXT: vpaddb %xmm2, %xmm3, %xmm2 1021 ; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm0 1022 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1023 ; AVX1-NEXT: retq 1024 ; 1025 ; AVX2-LABEL: test_arg_v32i8: 1026 ; AVX2: # %bb.0: 1027 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm1 1028 ; AVX2-NEXT: vpaddb %ymm1, %ymm0, %ymm0 1029 ; AVX2-NEXT: retq 1030 ; 1031 ; AVX512-LABEL: test_arg_v32i8: 1032 ; AVX512: # %bb.0: 1033 ; AVX512-NEXT: vmovntdqa (%rdi), %ymm1 1034 ; AVX512-NEXT: vpaddb %ymm1, %ymm0, %ymm0 1035 ; AVX512-NEXT: retq 1036 %1 = load <32 x i8>, <32 x i8>* %src, align 32, !nontemporal !1 1037 %2 = add <32 x i8> %arg, %1 1038 ret <32 x i8> %2 1039 } 1040 1041 ; And now ZMM versions. 1042 1043 define <16 x float> @test_arg_v16f32(<16 x float> %arg, <16 x float>* %src) { 1044 ; SSE2-LABEL: test_arg_v16f32: 1045 ; SSE2: # %bb.0: 1046 ; SSE2-NEXT: addps (%rdi), %xmm0 1047 ; SSE2-NEXT: addps 16(%rdi), %xmm1 1048 ; SSE2-NEXT: addps 32(%rdi), %xmm2 1049 ; SSE2-NEXT: addps 48(%rdi), %xmm3 1050 ; SSE2-NEXT: retq 1051 ; 1052 ; SSE41-LABEL: test_arg_v16f32: 1053 ; SSE41: # %bb.0: 1054 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm4 1055 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm5 1056 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm6 1057 ; SSE41-NEXT: movntdqa (%rdi), %xmm7 1058 ; SSE41-NEXT: addps %xmm7, %xmm0 1059 ; SSE41-NEXT: addps %xmm6, %xmm1 1060 ; SSE41-NEXT: addps %xmm5, %xmm2 1061 ; SSE41-NEXT: addps %xmm4, %xmm3 1062 ; SSE41-NEXT: retq 1063 ; 1064 ; AVX1-LABEL: test_arg_v16f32: 1065 ; AVX1: # %bb.0: 1066 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm2 1067 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm3 1068 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 1069 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm3 1070 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm4 1071 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3 1072 ; AVX1-NEXT: vaddps %ymm3, %ymm0, %ymm0 1073 ; AVX1-NEXT: vaddps %ymm2, %ymm1, %ymm1 1074 ; AVX1-NEXT: retq 1075 ; 1076 ; AVX2-LABEL: test_arg_v16f32: 1077 ; AVX2: # %bb.0: 1078 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm2 1079 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm3 1080 ; AVX2-NEXT: vaddps %ymm3, %ymm0, %ymm0 1081 ; AVX2-NEXT: vaddps %ymm2, %ymm1, %ymm1 1082 ; AVX2-NEXT: retq 1083 ; 1084 ; AVX512-LABEL: test_arg_v16f32: 1085 ; AVX512: # %bb.0: 1086 ; AVX512-NEXT: vmovntdqa (%rdi), %zmm1 1087 ; AVX512-NEXT: vaddps %zmm1, %zmm0, %zmm0 1088 ; AVX512-NEXT: retq 1089 %1 = load <16 x float>, <16 x float>* %src, align 64, !nontemporal !1 1090 %2 = fadd <16 x float> %arg, %1 1091 ret <16 x float> %2 1092 } 1093 1094 define <16 x i32> @test_arg_v16i32(<16 x i32> %arg, <16 x i32>* %src) { 1095 ; SSE2-LABEL: test_arg_v16i32: 1096 ; SSE2: # %bb.0: 1097 ; SSE2-NEXT: paddd (%rdi), %xmm0 1098 ; SSE2-NEXT: paddd 16(%rdi), %xmm1 1099 ; SSE2-NEXT: paddd 32(%rdi), %xmm2 1100 ; SSE2-NEXT: paddd 48(%rdi), %xmm3 1101 ; SSE2-NEXT: retq 1102 ; 1103 ; SSE41-LABEL: test_arg_v16i32: 1104 ; SSE41: # %bb.0: 1105 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm4 1106 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm5 1107 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm6 1108 ; SSE41-NEXT: movntdqa (%rdi), %xmm7 1109 ; SSE41-NEXT: paddd %xmm7, %xmm0 1110 ; SSE41-NEXT: paddd %xmm6, %xmm1 1111 ; SSE41-NEXT: paddd %xmm5, %xmm2 1112 ; SSE41-NEXT: paddd %xmm4, %xmm3 1113 ; SSE41-NEXT: retq 1114 ; 1115 ; AVX1-LABEL: test_arg_v16i32: 1116 ; AVX1: # %bb.0: 1117 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm2 1118 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm3 1119 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm4 1120 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm5 1121 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 1122 ; AVX1-NEXT: vpaddd %xmm5, %xmm6, %xmm5 1123 ; AVX1-NEXT: vpaddd %xmm4, %xmm0, %xmm0 1124 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm0, %ymm0 1125 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 1126 ; AVX1-NEXT: vpaddd %xmm3, %xmm4, %xmm3 1127 ; AVX1-NEXT: vpaddd %xmm2, %xmm1, %xmm1 1128 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 1129 ; AVX1-NEXT: retq 1130 ; 1131 ; AVX2-LABEL: test_arg_v16i32: 1132 ; AVX2: # %bb.0: 1133 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm2 1134 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm3 1135 ; AVX2-NEXT: vpaddd %ymm3, %ymm0, %ymm0 1136 ; AVX2-NEXT: vpaddd %ymm2, %ymm1, %ymm1 1137 ; AVX2-NEXT: retq 1138 ; 1139 ; AVX512-LABEL: test_arg_v16i32: 1140 ; AVX512: # %bb.0: 1141 ; AVX512-NEXT: vmovntdqa (%rdi), %zmm1 1142 ; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0 1143 ; AVX512-NEXT: retq 1144 %1 = load <16 x i32>, <16 x i32>* %src, align 64, !nontemporal !1 1145 %2 = add <16 x i32> %arg, %1 1146 ret <16 x i32> %2 1147 } 1148 1149 define <8 x double> @test_arg_v8f64(<8 x double> %arg, <8 x double>* %src) { 1150 ; SSE2-LABEL: test_arg_v8f64: 1151 ; SSE2: # %bb.0: 1152 ; SSE2-NEXT: addpd (%rdi), %xmm0 1153 ; SSE2-NEXT: addpd 16(%rdi), %xmm1 1154 ; SSE2-NEXT: addpd 32(%rdi), %xmm2 1155 ; SSE2-NEXT: addpd 48(%rdi), %xmm3 1156 ; SSE2-NEXT: retq 1157 ; 1158 ; SSE41-LABEL: test_arg_v8f64: 1159 ; SSE41: # %bb.0: 1160 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm4 1161 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm5 1162 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm6 1163 ; SSE41-NEXT: movntdqa (%rdi), %xmm7 1164 ; SSE41-NEXT: addpd %xmm7, %xmm0 1165 ; SSE41-NEXT: addpd %xmm6, %xmm1 1166 ; SSE41-NEXT: addpd %xmm5, %xmm2 1167 ; SSE41-NEXT: addpd %xmm4, %xmm3 1168 ; SSE41-NEXT: retq 1169 ; 1170 ; AVX1-LABEL: test_arg_v8f64: 1171 ; AVX1: # %bb.0: 1172 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm2 1173 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm3 1174 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 1175 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm3 1176 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm4 1177 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3 1178 ; AVX1-NEXT: vaddpd %ymm3, %ymm0, %ymm0 1179 ; AVX1-NEXT: vaddpd %ymm2, %ymm1, %ymm1 1180 ; AVX1-NEXT: retq 1181 ; 1182 ; AVX2-LABEL: test_arg_v8f64: 1183 ; AVX2: # %bb.0: 1184 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm2 1185 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm3 1186 ; AVX2-NEXT: vaddpd %ymm3, %ymm0, %ymm0 1187 ; AVX2-NEXT: vaddpd %ymm2, %ymm1, %ymm1 1188 ; AVX2-NEXT: retq 1189 ; 1190 ; AVX512-LABEL: test_arg_v8f64: 1191 ; AVX512: # %bb.0: 1192 ; AVX512-NEXT: vmovntdqa (%rdi), %zmm1 1193 ; AVX512-NEXT: vaddpd %zmm1, %zmm0, %zmm0 1194 ; AVX512-NEXT: retq 1195 %1 = load <8 x double>, <8 x double>* %src, align 64, !nontemporal !1 1196 %2 = fadd <8 x double> %arg, %1 1197 ret <8 x double> %2 1198 } 1199 1200 define <8 x i64> @test_arg_v8i64(<8 x i64> %arg, <8 x i64>* %src) { 1201 ; SSE2-LABEL: test_arg_v8i64: 1202 ; SSE2: # %bb.0: 1203 ; SSE2-NEXT: paddq (%rdi), %xmm0 1204 ; SSE2-NEXT: paddq 16(%rdi), %xmm1 1205 ; SSE2-NEXT: paddq 32(%rdi), %xmm2 1206 ; SSE2-NEXT: paddq 48(%rdi), %xmm3 1207 ; SSE2-NEXT: retq 1208 ; 1209 ; SSE41-LABEL: test_arg_v8i64: 1210 ; SSE41: # %bb.0: 1211 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm4 1212 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm5 1213 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm6 1214 ; SSE41-NEXT: movntdqa (%rdi), %xmm7 1215 ; SSE41-NEXT: paddq %xmm7, %xmm0 1216 ; SSE41-NEXT: paddq %xmm6, %xmm1 1217 ; SSE41-NEXT: paddq %xmm5, %xmm2 1218 ; SSE41-NEXT: paddq %xmm4, %xmm3 1219 ; SSE41-NEXT: retq 1220 ; 1221 ; AVX1-LABEL: test_arg_v8i64: 1222 ; AVX1: # %bb.0: 1223 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm2 1224 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm3 1225 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm4 1226 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm5 1227 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 1228 ; AVX1-NEXT: vpaddq %xmm5, %xmm6, %xmm5 1229 ; AVX1-NEXT: vpaddq %xmm4, %xmm0, %xmm0 1230 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm0, %ymm0 1231 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 1232 ; AVX1-NEXT: vpaddq %xmm3, %xmm4, %xmm3 1233 ; AVX1-NEXT: vpaddq %xmm2, %xmm1, %xmm1 1234 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 1235 ; AVX1-NEXT: retq 1236 ; 1237 ; AVX2-LABEL: test_arg_v8i64: 1238 ; AVX2: # %bb.0: 1239 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm2 1240 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm3 1241 ; AVX2-NEXT: vpaddq %ymm3, %ymm0, %ymm0 1242 ; AVX2-NEXT: vpaddq %ymm2, %ymm1, %ymm1 1243 ; AVX2-NEXT: retq 1244 ; 1245 ; AVX512-LABEL: test_arg_v8i64: 1246 ; AVX512: # %bb.0: 1247 ; AVX512-NEXT: vmovntdqa (%rdi), %zmm1 1248 ; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm0 1249 ; AVX512-NEXT: retq 1250 %1 = load <8 x i64>, <8 x i64>* %src, align 64, !nontemporal !1 1251 %2 = add <8 x i64> %arg, %1 1252 ret <8 x i64> %2 1253 } 1254 1255 define <32 x i16> @test_arg_v32i16(<32 x i16> %arg, <32 x i16>* %src) { 1256 ; SSE2-LABEL: test_arg_v32i16: 1257 ; SSE2: # %bb.0: 1258 ; SSE2-NEXT: paddw (%rdi), %xmm0 1259 ; SSE2-NEXT: paddw 16(%rdi), %xmm1 1260 ; SSE2-NEXT: paddw 32(%rdi), %xmm2 1261 ; SSE2-NEXT: paddw 48(%rdi), %xmm3 1262 ; SSE2-NEXT: retq 1263 ; 1264 ; SSE41-LABEL: test_arg_v32i16: 1265 ; SSE41: # %bb.0: 1266 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm4 1267 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm5 1268 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm6 1269 ; SSE41-NEXT: movntdqa (%rdi), %xmm7 1270 ; SSE41-NEXT: paddw %xmm7, %xmm0 1271 ; SSE41-NEXT: paddw %xmm6, %xmm1 1272 ; SSE41-NEXT: paddw %xmm5, %xmm2 1273 ; SSE41-NEXT: paddw %xmm4, %xmm3 1274 ; SSE41-NEXT: retq 1275 ; 1276 ; AVX1-LABEL: test_arg_v32i16: 1277 ; AVX1: # %bb.0: 1278 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm2 1279 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm3 1280 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm4 1281 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm5 1282 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 1283 ; AVX1-NEXT: vpaddw %xmm5, %xmm6, %xmm5 1284 ; AVX1-NEXT: vpaddw %xmm4, %xmm0, %xmm0 1285 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm0, %ymm0 1286 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 1287 ; AVX1-NEXT: vpaddw %xmm3, %xmm4, %xmm3 1288 ; AVX1-NEXT: vpaddw %xmm2, %xmm1, %xmm1 1289 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 1290 ; AVX1-NEXT: retq 1291 ; 1292 ; AVX2-LABEL: test_arg_v32i16: 1293 ; AVX2: # %bb.0: 1294 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm2 1295 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm3 1296 ; AVX2-NEXT: vpaddw %ymm3, %ymm0, %ymm0 1297 ; AVX2-NEXT: vpaddw %ymm2, %ymm1, %ymm1 1298 ; AVX2-NEXT: retq 1299 ; 1300 ; AVX512F-LABEL: test_arg_v32i16: 1301 ; AVX512F: # %bb.0: 1302 ; AVX512F-NEXT: vmovntdqa 32(%rdi), %ymm2 1303 ; AVX512F-NEXT: vmovntdqa (%rdi), %ymm3 1304 ; AVX512F-NEXT: vpaddw %ymm3, %ymm0, %ymm0 1305 ; AVX512F-NEXT: vpaddw %ymm2, %ymm1, %ymm1 1306 ; AVX512F-NEXT: retq 1307 ; 1308 ; AVX512BW-LABEL: test_arg_v32i16: 1309 ; AVX512BW: # %bb.0: 1310 ; AVX512BW-NEXT: vmovntdqa (%rdi), %zmm1 1311 ; AVX512BW-NEXT: vpaddw %zmm1, %zmm0, %zmm0 1312 ; AVX512BW-NEXT: retq 1313 ; 1314 ; AVX512VL-LABEL: test_arg_v32i16: 1315 ; AVX512VL: # %bb.0: 1316 ; AVX512VL-NEXT: vmovntdqa 32(%rdi), %ymm2 1317 ; AVX512VL-NEXT: vmovntdqa (%rdi), %ymm3 1318 ; AVX512VL-NEXT: vpaddw %ymm3, %ymm0, %ymm0 1319 ; AVX512VL-NEXT: vpaddw %ymm2, %ymm1, %ymm1 1320 ; AVX512VL-NEXT: retq 1321 %1 = load <32 x i16>, <32 x i16>* %src, align 64, !nontemporal !1 1322 %2 = add <32 x i16> %arg, %1 1323 ret <32 x i16> %2 1324 } 1325 1326 define <64 x i8> @test_arg_v64i8(<64 x i8> %arg, <64 x i8>* %src) { 1327 ; SSE2-LABEL: test_arg_v64i8: 1328 ; SSE2: # %bb.0: 1329 ; SSE2-NEXT: paddb (%rdi), %xmm0 1330 ; SSE2-NEXT: paddb 16(%rdi), %xmm1 1331 ; SSE2-NEXT: paddb 32(%rdi), %xmm2 1332 ; SSE2-NEXT: paddb 48(%rdi), %xmm3 1333 ; SSE2-NEXT: retq 1334 ; 1335 ; SSE41-LABEL: test_arg_v64i8: 1336 ; SSE41: # %bb.0: 1337 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm4 1338 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm5 1339 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm6 1340 ; SSE41-NEXT: movntdqa (%rdi), %xmm7 1341 ; SSE41-NEXT: paddb %xmm7, %xmm0 1342 ; SSE41-NEXT: paddb %xmm6, %xmm1 1343 ; SSE41-NEXT: paddb %xmm5, %xmm2 1344 ; SSE41-NEXT: paddb %xmm4, %xmm3 1345 ; SSE41-NEXT: retq 1346 ; 1347 ; AVX1-LABEL: test_arg_v64i8: 1348 ; AVX1: # %bb.0: 1349 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm2 1350 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm3 1351 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm4 1352 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm5 1353 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 1354 ; AVX1-NEXT: vpaddb %xmm5, %xmm6, %xmm5 1355 ; AVX1-NEXT: vpaddb %xmm4, %xmm0, %xmm0 1356 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm0, %ymm0 1357 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 1358 ; AVX1-NEXT: vpaddb %xmm3, %xmm4, %xmm3 1359 ; AVX1-NEXT: vpaddb %xmm2, %xmm1, %xmm1 1360 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 1361 ; AVX1-NEXT: retq 1362 ; 1363 ; AVX2-LABEL: test_arg_v64i8: 1364 ; AVX2: # %bb.0: 1365 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm2 1366 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm3 1367 ; AVX2-NEXT: vpaddb %ymm3, %ymm0, %ymm0 1368 ; AVX2-NEXT: vpaddb %ymm2, %ymm1, %ymm1 1369 ; AVX2-NEXT: retq 1370 ; 1371 ; AVX512F-LABEL: test_arg_v64i8: 1372 ; AVX512F: # %bb.0: 1373 ; AVX512F-NEXT: vmovntdqa 32(%rdi), %ymm2 1374 ; AVX512F-NEXT: vmovntdqa (%rdi), %ymm3 1375 ; AVX512F-NEXT: vpaddb %ymm3, %ymm0, %ymm0 1376 ; AVX512F-NEXT: vpaddb %ymm2, %ymm1, %ymm1 1377 ; AVX512F-NEXT: retq 1378 ; 1379 ; AVX512BW-LABEL: test_arg_v64i8: 1380 ; AVX512BW: # %bb.0: 1381 ; AVX512BW-NEXT: vmovntdqa (%rdi), %zmm1 1382 ; AVX512BW-NEXT: vpaddb %zmm1, %zmm0, %zmm0 1383 ; AVX512BW-NEXT: retq 1384 ; 1385 ; AVX512VL-LABEL: test_arg_v64i8: 1386 ; AVX512VL: # %bb.0: 1387 ; AVX512VL-NEXT: vmovntdqa 32(%rdi), %ymm2 1388 ; AVX512VL-NEXT: vmovntdqa (%rdi), %ymm3 1389 ; AVX512VL-NEXT: vpaddb %ymm3, %ymm0, %ymm0 1390 ; AVX512VL-NEXT: vpaddb %ymm2, %ymm1, %ymm1 1391 ; AVX512VL-NEXT: retq 1392 %1 = load <64 x i8>, <64 x i8>* %src, align 64, !nontemporal !1 1393 %2 = add <64 x i8> %arg, %1 1394 ret <64 x i8> %2 1395 } 1396 1397 1398 ; Unaligned non-temporal loads (not supported) 1399 1400 define <4 x float> @test_unaligned_v4f32(<4 x float>* %src) { 1401 ; SSE-LABEL: test_unaligned_v4f32: 1402 ; SSE: # %bb.0: 1403 ; SSE-NEXT: movups (%rdi), %xmm0 1404 ; SSE-NEXT: retq 1405 ; 1406 ; AVX-LABEL: test_unaligned_v4f32: 1407 ; AVX: # %bb.0: 1408 ; AVX-NEXT: vmovups (%rdi), %xmm0 1409 ; AVX-NEXT: retq 1410 ; 1411 ; AVX512-LABEL: test_unaligned_v4f32: 1412 ; AVX512: # %bb.0: 1413 ; AVX512-NEXT: vmovups (%rdi), %xmm0 1414 ; AVX512-NEXT: retq 1415 %1 = load <4 x float>, <4 x float>* %src, align 1, !nontemporal !1 1416 ret <4 x float> %1 1417 } 1418 1419 define <4 x i32> @test_unaligned_v4i32(<4 x i32>* %src) { 1420 ; SSE-LABEL: test_unaligned_v4i32: 1421 ; SSE: # %bb.0: 1422 ; SSE-NEXT: movups (%rdi), %xmm0 1423 ; SSE-NEXT: retq 1424 ; 1425 ; AVX-LABEL: test_unaligned_v4i32: 1426 ; AVX: # %bb.0: 1427 ; AVX-NEXT: vmovups (%rdi), %xmm0 1428 ; AVX-NEXT: retq 1429 ; 1430 ; AVX512-LABEL: test_unaligned_v4i32: 1431 ; AVX512: # %bb.0: 1432 ; AVX512-NEXT: vmovups (%rdi), %xmm0 1433 ; AVX512-NEXT: retq 1434 %1 = load <4 x i32>, <4 x i32>* %src, align 1, !nontemporal !1 1435 ret <4 x i32> %1 1436 } 1437 1438 define <2 x double> @test_unaligned_v2f64(<2 x double>* %src) { 1439 ; SSE-LABEL: test_unaligned_v2f64: 1440 ; SSE: # %bb.0: 1441 ; SSE-NEXT: movups (%rdi), %xmm0 1442 ; SSE-NEXT: retq 1443 ; 1444 ; AVX-LABEL: test_unaligned_v2f64: 1445 ; AVX: # %bb.0: 1446 ; AVX-NEXT: vmovups (%rdi), %xmm0 1447 ; AVX-NEXT: retq 1448 ; 1449 ; AVX512-LABEL: test_unaligned_v2f64: 1450 ; AVX512: # %bb.0: 1451 ; AVX512-NEXT: vmovups (%rdi), %xmm0 1452 ; AVX512-NEXT: retq 1453 %1 = load <2 x double>, <2 x double>* %src, align 1, !nontemporal !1 1454 ret <2 x double> %1 1455 } 1456 1457 define <2 x i64> @test_unaligned_v2i64(<2 x i64>* %src) { 1458 ; SSE-LABEL: test_unaligned_v2i64: 1459 ; SSE: # %bb.0: 1460 ; SSE-NEXT: movups (%rdi), %xmm0 1461 ; SSE-NEXT: retq 1462 ; 1463 ; AVX-LABEL: test_unaligned_v2i64: 1464 ; AVX: # %bb.0: 1465 ; AVX-NEXT: vmovups (%rdi), %xmm0 1466 ; AVX-NEXT: retq 1467 ; 1468 ; AVX512-LABEL: test_unaligned_v2i64: 1469 ; AVX512: # %bb.0: 1470 ; AVX512-NEXT: vmovups (%rdi), %xmm0 1471 ; AVX512-NEXT: retq 1472 %1 = load <2 x i64>, <2 x i64>* %src, align 1, !nontemporal !1 1473 ret <2 x i64> %1 1474 } 1475 1476 define <8 x i16> @test_unaligned_v8i16(<8 x i16>* %src) { 1477 ; SSE-LABEL: test_unaligned_v8i16: 1478 ; SSE: # %bb.0: 1479 ; SSE-NEXT: movups (%rdi), %xmm0 1480 ; SSE-NEXT: retq 1481 ; 1482 ; AVX-LABEL: test_unaligned_v8i16: 1483 ; AVX: # %bb.0: 1484 ; AVX-NEXT: vmovups (%rdi), %xmm0 1485 ; AVX-NEXT: retq 1486 ; 1487 ; AVX512-LABEL: test_unaligned_v8i16: 1488 ; AVX512: # %bb.0: 1489 ; AVX512-NEXT: vmovups (%rdi), %xmm0 1490 ; AVX512-NEXT: retq 1491 %1 = load <8 x i16>, <8 x i16>* %src, align 1, !nontemporal !1 1492 ret <8 x i16> %1 1493 } 1494 1495 define <16 x i8> @test_unaligned_v16i8(<16 x i8>* %src) { 1496 ; SSE-LABEL: test_unaligned_v16i8: 1497 ; SSE: # %bb.0: 1498 ; SSE-NEXT: movups (%rdi), %xmm0 1499 ; SSE-NEXT: retq 1500 ; 1501 ; AVX-LABEL: test_unaligned_v16i8: 1502 ; AVX: # %bb.0: 1503 ; AVX-NEXT: vmovups (%rdi), %xmm0 1504 ; AVX-NEXT: retq 1505 ; 1506 ; AVX512-LABEL: test_unaligned_v16i8: 1507 ; AVX512: # %bb.0: 1508 ; AVX512-NEXT: vmovups (%rdi), %xmm0 1509 ; AVX512-NEXT: retq 1510 %1 = load <16 x i8>, <16 x i8>* %src, align 1, !nontemporal !1 1511 ret <16 x i8> %1 1512 } 1513 1514 ; And now YMM versions. 1515 1516 define <8 x float> @test_unaligned_v8f32(<8 x float>* %src) { 1517 ; SSE-LABEL: test_unaligned_v8f32: 1518 ; SSE: # %bb.0: 1519 ; SSE-NEXT: movups (%rdi), %xmm0 1520 ; SSE-NEXT: movups 16(%rdi), %xmm1 1521 ; SSE-NEXT: retq 1522 ; 1523 ; AVX-LABEL: test_unaligned_v8f32: 1524 ; AVX: # %bb.0: 1525 ; AVX-NEXT: vmovups (%rdi), %ymm0 1526 ; AVX-NEXT: retq 1527 ; 1528 ; AVX512-LABEL: test_unaligned_v8f32: 1529 ; AVX512: # %bb.0: 1530 ; AVX512-NEXT: vmovups (%rdi), %ymm0 1531 ; AVX512-NEXT: retq 1532 %1 = load <8 x float>, <8 x float>* %src, align 1, !nontemporal !1 1533 ret <8 x float> %1 1534 } 1535 1536 define <8 x i32> @test_unaligned_v8i32(<8 x i32>* %src) { 1537 ; SSE-LABEL: test_unaligned_v8i32: 1538 ; SSE: # %bb.0: 1539 ; SSE-NEXT: movups (%rdi), %xmm0 1540 ; SSE-NEXT: movups 16(%rdi), %xmm1 1541 ; SSE-NEXT: retq 1542 ; 1543 ; AVX-LABEL: test_unaligned_v8i32: 1544 ; AVX: # %bb.0: 1545 ; AVX-NEXT: vmovups (%rdi), %ymm0 1546 ; AVX-NEXT: retq 1547 ; 1548 ; AVX512-LABEL: test_unaligned_v8i32: 1549 ; AVX512: # %bb.0: 1550 ; AVX512-NEXT: vmovups (%rdi), %ymm0 1551 ; AVX512-NEXT: retq 1552 %1 = load <8 x i32>, <8 x i32>* %src, align 1, !nontemporal !1 1553 ret <8 x i32> %1 1554 } 1555 1556 define <4 x double> @test_unaligned_v4f64(<4 x double>* %src) { 1557 ; SSE-LABEL: test_unaligned_v4f64: 1558 ; SSE: # %bb.0: 1559 ; SSE-NEXT: movups (%rdi), %xmm0 1560 ; SSE-NEXT: movups 16(%rdi), %xmm1 1561 ; SSE-NEXT: retq 1562 ; 1563 ; AVX-LABEL: test_unaligned_v4f64: 1564 ; AVX: # %bb.0: 1565 ; AVX-NEXT: vmovups (%rdi), %ymm0 1566 ; AVX-NEXT: retq 1567 ; 1568 ; AVX512-LABEL: test_unaligned_v4f64: 1569 ; AVX512: # %bb.0: 1570 ; AVX512-NEXT: vmovups (%rdi), %ymm0 1571 ; AVX512-NEXT: retq 1572 %1 = load <4 x double>, <4 x double>* %src, align 1, !nontemporal !1 1573 ret <4 x double> %1 1574 } 1575 1576 define <4 x i64> @test_unaligned_v4i64(<4 x i64>* %src) { 1577 ; SSE-LABEL: test_unaligned_v4i64: 1578 ; SSE: # %bb.0: 1579 ; SSE-NEXT: movups (%rdi), %xmm0 1580 ; SSE-NEXT: movups 16(%rdi), %xmm1 1581 ; SSE-NEXT: retq 1582 ; 1583 ; AVX-LABEL: test_unaligned_v4i64: 1584 ; AVX: # %bb.0: 1585 ; AVX-NEXT: vmovups (%rdi), %ymm0 1586 ; AVX-NEXT: retq 1587 ; 1588 ; AVX512-LABEL: test_unaligned_v4i64: 1589 ; AVX512: # %bb.0: 1590 ; AVX512-NEXT: vmovups (%rdi), %ymm0 1591 ; AVX512-NEXT: retq 1592 %1 = load <4 x i64>, <4 x i64>* %src, align 1, !nontemporal !1 1593 ret <4 x i64> %1 1594 } 1595 1596 define <16 x i16> @test_unaligned_v16i16(<16 x i16>* %src) { 1597 ; SSE-LABEL: test_unaligned_v16i16: 1598 ; SSE: # %bb.0: 1599 ; SSE-NEXT: movups (%rdi), %xmm0 1600 ; SSE-NEXT: movups 16(%rdi), %xmm1 1601 ; SSE-NEXT: retq 1602 ; 1603 ; AVX-LABEL: test_unaligned_v16i16: 1604 ; AVX: # %bb.0: 1605 ; AVX-NEXT: vmovups (%rdi), %ymm0 1606 ; AVX-NEXT: retq 1607 ; 1608 ; AVX512-LABEL: test_unaligned_v16i16: 1609 ; AVX512: # %bb.0: 1610 ; AVX512-NEXT: vmovups (%rdi), %ymm0 1611 ; AVX512-NEXT: retq 1612 %1 = load <16 x i16>, <16 x i16>* %src, align 1, !nontemporal !1 1613 ret <16 x i16> %1 1614 } 1615 1616 define <32 x i8> @test_unaligned_v32i8(<32 x i8>* %src) { 1617 ; SSE-LABEL: test_unaligned_v32i8: 1618 ; SSE: # %bb.0: 1619 ; SSE-NEXT: movups (%rdi), %xmm0 1620 ; SSE-NEXT: movups 16(%rdi), %xmm1 1621 ; SSE-NEXT: retq 1622 ; 1623 ; AVX-LABEL: test_unaligned_v32i8: 1624 ; AVX: # %bb.0: 1625 ; AVX-NEXT: vmovups (%rdi), %ymm0 1626 ; AVX-NEXT: retq 1627 ; 1628 ; AVX512-LABEL: test_unaligned_v32i8: 1629 ; AVX512: # %bb.0: 1630 ; AVX512-NEXT: vmovups (%rdi), %ymm0 1631 ; AVX512-NEXT: retq 1632 %1 = load <32 x i8>, <32 x i8>* %src, align 1, !nontemporal !1 1633 ret <32 x i8> %1 1634 } 1635 1636 ; And now ZMM versions. 1637 1638 define <16 x float> @test_unaligned_v16f32(<16 x float>* %src) { 1639 ; SSE-LABEL: test_unaligned_v16f32: 1640 ; SSE: # %bb.0: 1641 ; SSE-NEXT: movups (%rdi), %xmm0 1642 ; SSE-NEXT: movups 16(%rdi), %xmm1 1643 ; SSE-NEXT: movups 32(%rdi), %xmm2 1644 ; SSE-NEXT: movups 48(%rdi), %xmm3 1645 ; SSE-NEXT: retq 1646 ; 1647 ; AVX-LABEL: test_unaligned_v16f32: 1648 ; AVX: # %bb.0: 1649 ; AVX-NEXT: vmovups (%rdi), %ymm0 1650 ; AVX-NEXT: vmovups 32(%rdi), %ymm1 1651 ; AVX-NEXT: retq 1652 ; 1653 ; AVX512-LABEL: test_unaligned_v16f32: 1654 ; AVX512: # %bb.0: 1655 ; AVX512-NEXT: vmovups (%rdi), %zmm0 1656 ; AVX512-NEXT: retq 1657 %1 = load <16 x float>, <16 x float>* %src, align 1, !nontemporal !1 1658 ret <16 x float> %1 1659 } 1660 1661 define <16 x i32> @test_unaligned_v16i32(<16 x i32>* %src) { 1662 ; SSE-LABEL: test_unaligned_v16i32: 1663 ; SSE: # %bb.0: 1664 ; SSE-NEXT: movups (%rdi), %xmm0 1665 ; SSE-NEXT: movups 16(%rdi), %xmm1 1666 ; SSE-NEXT: movups 32(%rdi), %xmm2 1667 ; SSE-NEXT: movups 48(%rdi), %xmm3 1668 ; SSE-NEXT: retq 1669 ; 1670 ; AVX-LABEL: test_unaligned_v16i32: 1671 ; AVX: # %bb.0: 1672 ; AVX-NEXT: vmovups (%rdi), %ymm0 1673 ; AVX-NEXT: vmovups 32(%rdi), %ymm1 1674 ; AVX-NEXT: retq 1675 ; 1676 ; AVX512-LABEL: test_unaligned_v16i32: 1677 ; AVX512: # %bb.0: 1678 ; AVX512-NEXT: vmovups (%rdi), %zmm0 1679 ; AVX512-NEXT: retq 1680 %1 = load <16 x i32>, <16 x i32>* %src, align 1, !nontemporal !1 1681 ret <16 x i32> %1 1682 } 1683 1684 define <8 x double> @test_unaligned_v8f64(<8 x double>* %src) { 1685 ; SSE-LABEL: test_unaligned_v8f64: 1686 ; SSE: # %bb.0: 1687 ; SSE-NEXT: movups (%rdi), %xmm0 1688 ; SSE-NEXT: movups 16(%rdi), %xmm1 1689 ; SSE-NEXT: movups 32(%rdi), %xmm2 1690 ; SSE-NEXT: movups 48(%rdi), %xmm3 1691 ; SSE-NEXT: retq 1692 ; 1693 ; AVX-LABEL: test_unaligned_v8f64: 1694 ; AVX: # %bb.0: 1695 ; AVX-NEXT: vmovups (%rdi), %ymm0 1696 ; AVX-NEXT: vmovups 32(%rdi), %ymm1 1697 ; AVX-NEXT: retq 1698 ; 1699 ; AVX512-LABEL: test_unaligned_v8f64: 1700 ; AVX512: # %bb.0: 1701 ; AVX512-NEXT: vmovups (%rdi), %zmm0 1702 ; AVX512-NEXT: retq 1703 %1 = load <8 x double>, <8 x double>* %src, align 1, !nontemporal !1 1704 ret <8 x double> %1 1705 } 1706 1707 define <8 x i64> @test_unaligned_v8i64(<8 x i64>* %src) { 1708 ; SSE-LABEL: test_unaligned_v8i64: 1709 ; SSE: # %bb.0: 1710 ; SSE-NEXT: movups (%rdi), %xmm0 1711 ; SSE-NEXT: movups 16(%rdi), %xmm1 1712 ; SSE-NEXT: movups 32(%rdi), %xmm2 1713 ; SSE-NEXT: movups 48(%rdi), %xmm3 1714 ; SSE-NEXT: retq 1715 ; 1716 ; AVX-LABEL: test_unaligned_v8i64: 1717 ; AVX: # %bb.0: 1718 ; AVX-NEXT: vmovups (%rdi), %ymm0 1719 ; AVX-NEXT: vmovups 32(%rdi), %ymm1 1720 ; AVX-NEXT: retq 1721 ; 1722 ; AVX512-LABEL: test_unaligned_v8i64: 1723 ; AVX512: # %bb.0: 1724 ; AVX512-NEXT: vmovups (%rdi), %zmm0 1725 ; AVX512-NEXT: retq 1726 %1 = load <8 x i64>, <8 x i64>* %src, align 1, !nontemporal !1 1727 ret <8 x i64> %1 1728 } 1729 1730 define <32 x i16> @test_unaligned_v32i16(<32 x i16>* %src) { 1731 ; SSE-LABEL: test_unaligned_v32i16: 1732 ; SSE: # %bb.0: 1733 ; SSE-NEXT: movups (%rdi), %xmm0 1734 ; SSE-NEXT: movups 16(%rdi), %xmm1 1735 ; SSE-NEXT: movups 32(%rdi), %xmm2 1736 ; SSE-NEXT: movups 48(%rdi), %xmm3 1737 ; SSE-NEXT: retq 1738 ; 1739 ; AVX-LABEL: test_unaligned_v32i16: 1740 ; AVX: # %bb.0: 1741 ; AVX-NEXT: vmovups (%rdi), %ymm0 1742 ; AVX-NEXT: vmovups 32(%rdi), %ymm1 1743 ; AVX-NEXT: retq 1744 ; 1745 ; AVX512F-LABEL: test_unaligned_v32i16: 1746 ; AVX512F: # %bb.0: 1747 ; AVX512F-NEXT: vmovups (%rdi), %ymm0 1748 ; AVX512F-NEXT: vmovups 32(%rdi), %ymm1 1749 ; AVX512F-NEXT: retq 1750 ; 1751 ; AVX512BW-LABEL: test_unaligned_v32i16: 1752 ; AVX512BW: # %bb.0: 1753 ; AVX512BW-NEXT: vmovups (%rdi), %zmm0 1754 ; AVX512BW-NEXT: retq 1755 ; 1756 ; AVX512VL-LABEL: test_unaligned_v32i16: 1757 ; AVX512VL: # %bb.0: 1758 ; AVX512VL-NEXT: vmovups (%rdi), %ymm0 1759 ; AVX512VL-NEXT: vmovups 32(%rdi), %ymm1 1760 ; AVX512VL-NEXT: retq 1761 %1 = load <32 x i16>, <32 x i16>* %src, align 1, !nontemporal !1 1762 ret <32 x i16> %1 1763 } 1764 1765 define <64 x i8> @test_unaligned_v64i8(<64 x i8>* %src) { 1766 ; SSE-LABEL: test_unaligned_v64i8: 1767 ; SSE: # %bb.0: 1768 ; SSE-NEXT: movups (%rdi), %xmm0 1769 ; SSE-NEXT: movups 16(%rdi), %xmm1 1770 ; SSE-NEXT: movups 32(%rdi), %xmm2 1771 ; SSE-NEXT: movups 48(%rdi), %xmm3 1772 ; SSE-NEXT: retq 1773 ; 1774 ; AVX-LABEL: test_unaligned_v64i8: 1775 ; AVX: # %bb.0: 1776 ; AVX-NEXT: vmovups (%rdi), %ymm0 1777 ; AVX-NEXT: vmovups 32(%rdi), %ymm1 1778 ; AVX-NEXT: retq 1779 ; 1780 ; AVX512F-LABEL: test_unaligned_v64i8: 1781 ; AVX512F: # %bb.0: 1782 ; AVX512F-NEXT: vmovups (%rdi), %ymm0 1783 ; AVX512F-NEXT: vmovups 32(%rdi), %ymm1 1784 ; AVX512F-NEXT: retq 1785 ; 1786 ; AVX512BW-LABEL: test_unaligned_v64i8: 1787 ; AVX512BW: # %bb.0: 1788 ; AVX512BW-NEXT: vmovups (%rdi), %zmm0 1789 ; AVX512BW-NEXT: retq 1790 ; 1791 ; AVX512VL-LABEL: test_unaligned_v64i8: 1792 ; AVX512VL: # %bb.0: 1793 ; AVX512VL-NEXT: vmovups (%rdi), %ymm0 1794 ; AVX512VL-NEXT: vmovups 32(%rdi), %ymm1 1795 ; AVX512VL-NEXT: retq 1796 %1 = load <64 x i8>, <64 x i8>* %src, align 1, !nontemporal !1 1797 ret <64 x i8> %1 1798 } 1799 1800 define <16 x i32> @test_masked_v16i32(i8 * %addr, <16 x i32> %old, <16 x i32> %mask1) { 1801 ; SSE2-LABEL: test_masked_v16i32: 1802 ; SSE2: # %bb.0: 1803 ; SSE2-NEXT: movdqa %xmm0, %xmm10 1804 ; SSE2-NEXT: pxor %xmm12, %xmm12 1805 ; SSE2-NEXT: pcmpeqd %xmm12, %xmm7 1806 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 1807 ; SSE2-NEXT: movdqa %xmm7, %xmm8 1808 ; SSE2-NEXT: pxor %xmm0, %xmm8 1809 ; SSE2-NEXT: pcmpeqd %xmm12, %xmm6 1810 ; SSE2-NEXT: movdqa %xmm6, %xmm9 1811 ; SSE2-NEXT: pxor %xmm0, %xmm9 1812 ; SSE2-NEXT: pcmpeqd %xmm12, %xmm5 1813 ; SSE2-NEXT: movdqa %xmm5, %xmm11 1814 ; SSE2-NEXT: pxor %xmm0, %xmm11 1815 ; SSE2-NEXT: pcmpeqd %xmm12, %xmm4 1816 ; SSE2-NEXT: pxor %xmm4, %xmm0 1817 ; SSE2-NEXT: pandn (%rdi), %xmm4 1818 ; SSE2-NEXT: pandn %xmm10, %xmm0 1819 ; SSE2-NEXT: por %xmm4, %xmm0 1820 ; SSE2-NEXT: pandn 16(%rdi), %xmm5 1821 ; SSE2-NEXT: pandn %xmm1, %xmm11 1822 ; SSE2-NEXT: por %xmm5, %xmm11 1823 ; SSE2-NEXT: pandn 32(%rdi), %xmm6 1824 ; SSE2-NEXT: pandn %xmm2, %xmm9 1825 ; SSE2-NEXT: por %xmm6, %xmm9 1826 ; SSE2-NEXT: pandn 48(%rdi), %xmm7 1827 ; SSE2-NEXT: pandn %xmm3, %xmm8 1828 ; SSE2-NEXT: por %xmm7, %xmm8 1829 ; SSE2-NEXT: movdqa %xmm11, %xmm1 1830 ; SSE2-NEXT: movdqa %xmm9, %xmm2 1831 ; SSE2-NEXT: movdqa %xmm8, %xmm3 1832 ; SSE2-NEXT: retq 1833 ; 1834 ; SSE41-LABEL: test_masked_v16i32: 1835 ; SSE41: # %bb.0: 1836 ; SSE41-NEXT: movdqa %xmm0, %xmm8 1837 ; SSE41-NEXT: pxor %xmm0, %xmm0 1838 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm7 1839 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm9 1840 ; SSE41-NEXT: pxor %xmm9, %xmm7 1841 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm6 1842 ; SSE41-NEXT: pxor %xmm9, %xmm6 1843 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5 1844 ; SSE41-NEXT: pxor %xmm9, %xmm5 1845 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm0 1846 ; SSE41-NEXT: pxor %xmm9, %xmm0 1847 ; SSE41-NEXT: movntdqa 48(%rdi), %xmm9 1848 ; SSE41-NEXT: movntdqa 32(%rdi), %xmm10 1849 ; SSE41-NEXT: movntdqa 16(%rdi), %xmm11 1850 ; SSE41-NEXT: movntdqa (%rdi), %xmm4 1851 ; SSE41-NEXT: blendvps %xmm0, %xmm4, %xmm8 1852 ; SSE41-NEXT: movdqa %xmm5, %xmm0 1853 ; SSE41-NEXT: blendvps %xmm0, %xmm11, %xmm1 1854 ; SSE41-NEXT: movdqa %xmm6, %xmm0 1855 ; SSE41-NEXT: blendvps %xmm0, %xmm10, %xmm2 1856 ; SSE41-NEXT: movdqa %xmm7, %xmm0 1857 ; SSE41-NEXT: blendvps %xmm0, %xmm9, %xmm3 1858 ; SSE41-NEXT: movaps %xmm8, %xmm0 1859 ; SSE41-NEXT: retq 1860 ; 1861 ; AVX1-LABEL: test_masked_v16i32: 1862 ; AVX1: # %bb.0: 1863 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 1864 ; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5 1865 ; AVX1-NEXT: vpcmpeqd %xmm5, %xmm4, %xmm4 1866 ; AVX1-NEXT: vpcmpeqd %xmm6, %xmm6, %xmm6 1867 ; AVX1-NEXT: vpxor %xmm6, %xmm4, %xmm4 1868 ; AVX1-NEXT: vpcmpeqd %xmm5, %xmm3, %xmm3 1869 ; AVX1-NEXT: vpxor %xmm6, %xmm3, %xmm3 1870 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3 1871 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 1872 ; AVX1-NEXT: vpcmpeqd %xmm5, %xmm4, %xmm4 1873 ; AVX1-NEXT: vpxor %xmm6, %xmm4, %xmm4 1874 ; AVX1-NEXT: vpcmpeqd %xmm5, %xmm2, %xmm2 1875 ; AVX1-NEXT: vpxor %xmm6, %xmm2, %xmm2 1876 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm2, %ymm2 1877 ; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm4 1878 ; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm5 1879 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm4, %ymm4 1880 ; AVX1-NEXT: vblendvps %ymm3, %ymm4, %ymm1, %ymm1 1881 ; AVX1-NEXT: vmovntdqa (%rdi), %xmm3 1882 ; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm4 1883 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3 1884 ; AVX1-NEXT: vblendvps %ymm2, %ymm3, %ymm0, %ymm0 1885 ; AVX1-NEXT: retq 1886 ; 1887 ; AVX2-LABEL: test_masked_v16i32: 1888 ; AVX2: # %bb.0: 1889 ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4 1890 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm3, %ymm3 1891 ; AVX2-NEXT: vpcmpeqd %ymm5, %ymm5, %ymm5 1892 ; AVX2-NEXT: vpxor %ymm5, %ymm3, %ymm3 1893 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm2, %ymm2 1894 ; AVX2-NEXT: vpxor %ymm5, %ymm2, %ymm2 1895 ; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm4 1896 ; AVX2-NEXT: vblendvps %ymm3, %ymm4, %ymm1, %ymm1 1897 ; AVX2-NEXT: vmovntdqa (%rdi), %ymm3 1898 ; AVX2-NEXT: vblendvps %ymm2, %ymm3, %ymm0, %ymm0 1899 ; AVX2-NEXT: retq 1900 ; 1901 ; AVX512-LABEL: test_masked_v16i32: 1902 ; AVX512: # %bb.0: 1903 ; AVX512-NEXT: vptestmd %zmm1, %zmm1, %k1 1904 ; AVX512-NEXT: vmovntdqa (%rdi), %zmm1 1905 ; AVX512-NEXT: vmovdqa32 %zmm1, %zmm0 {%k1} 1906 ; AVX512-NEXT: retq 1907 %mask = icmp ne <16 x i32> %mask1, zeroinitializer 1908 %vaddr = bitcast i8* %addr to <16 x i32>* 1909 %r = load <16 x i32>, <16 x i32>* %vaddr, align 64, !nontemporal !1 1910 %res = select <16 x i1> %mask, <16 x i32> %r, <16 x i32> %old 1911 ret <16 x i32>%res 1912 } 1913 1914 !1 = !{i32 1} 1915