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