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(ptr %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>, ptr %src, align 16, !nontemporal !1 31 ret <4 x float> %1 32} 33 34define <4 x i32> @test_v4i32(ptr %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>, ptr %src, align 16, !nontemporal !1 55 ret <4 x i32> %1 56} 57 58define <2 x double> @test_v2f64(ptr %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>, ptr %src, align 16, !nontemporal !1 79 ret <2 x double> %1 80} 81 82define <2 x i64> @test_v2i64(ptr %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>, ptr %src, align 16, !nontemporal !1 103 ret <2 x i64> %1 104} 105 106define <8 x i16> @test_v8i16(ptr %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>, ptr %src, align 16, !nontemporal !1 127 ret <8 x i16> %1 128} 129 130define <16 x i8> @test_v16i8(ptr %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>, ptr %src, align 16, !nontemporal !1 151 ret <16 x i8> %1 152} 153 154; And now YMM versions. 155 156define <8 x float> @test_v8f32(ptr %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>, ptr %src, align 32, !nontemporal !1 186 ret <8 x float> %1 187} 188 189define <8 x i32> @test_v8i32(ptr %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>, ptr %src, align 32, !nontemporal !1 219 ret <8 x i32> %1 220} 221 222define <4 x double> @test_v4f64(ptr %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>, ptr %src, align 32, !nontemporal !1 252 ret <4 x double> %1 253} 254 255define <4 x i64> @test_v4i64(ptr %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>, ptr %src, align 32, !nontemporal !1 285 ret <4 x i64> %1 286} 287 288define <16 x i16> @test_v16i16(ptr %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>, ptr %src, align 32, !nontemporal !1 318 ret <16 x i16> %1 319} 320 321define <32 x i8> @test_v32i8(ptr %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>, ptr %src, align 32, !nontemporal !1 351 ret <32 x i8> %1 352} 353 354; And now ZMM versions. 355 356define <16 x float> @test_v16f32(ptr %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>, ptr %src, align 64, !nontemporal !1 394 ret <16 x float> %1 395} 396 397define <16 x i32> @test_v16i32(ptr %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>, ptr %src, align 64, !nontemporal !1 435 ret <16 x i32> %1 436} 437 438define <8 x double> @test_v8f64(ptr %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>, ptr %src, align 64, !nontemporal !1 476 ret <8 x double> %1 477} 478 479define <8 x i64> @test_v8i64(ptr %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>, ptr %src, align 64, !nontemporal !1 517 ret <8 x i64> %1 518} 519 520define <32 x i16> @test_v32i16(ptr %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; AVX512-LABEL: test_v32i16: 554; AVX512: # %bb.0: 555; AVX512-NEXT: vmovntdqa (%rdi), %zmm0 556; AVX512-NEXT: retq 557 %1 = load <32 x i16>, ptr %src, align 64, !nontemporal !1 558 ret <32 x i16> %1 559} 560 561define <64 x i8> @test_v64i8(ptr %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: vmovntdqa (%rdi), %xmm0 581; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1 582; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 583; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm1 584; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2 585; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 586; AVX1-NEXT: retq 587; 588; AVX2-LABEL: test_v64i8: 589; AVX2: # %bb.0: 590; AVX2-NEXT: vmovntdqa (%rdi), %ymm0 591; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1 592; AVX2-NEXT: retq 593; 594; AVX512-LABEL: test_v64i8: 595; AVX512: # %bb.0: 596; AVX512-NEXT: vmovntdqa (%rdi), %zmm0 597; AVX512-NEXT: retq 598 %1 = load <64 x i8>, ptr %src, align 64, !nontemporal !1 599 ret <64 x i8> %1 600} 601 602 603; Check cases where the load would be folded. 604 605define <4 x float> @test_arg_v4f32(<4 x float> %arg, ptr %src) { 606; SSE2-LABEL: test_arg_v4f32: 607; SSE2: # %bb.0: 608; SSE2-NEXT: addps (%rdi), %xmm0 609; SSE2-NEXT: retq 610; 611; SSE41-LABEL: test_arg_v4f32: 612; SSE41: # %bb.0: 613; SSE41-NEXT: movntdqa (%rdi), %xmm1 614; SSE41-NEXT: addps %xmm1, %xmm0 615; SSE41-NEXT: retq 616; 617; AVX-LABEL: test_arg_v4f32: 618; AVX: # %bb.0: 619; AVX-NEXT: vmovntdqa (%rdi), %xmm1 620; AVX-NEXT: vaddps %xmm1, %xmm0, %xmm0 621; AVX-NEXT: retq 622; 623; AVX512-LABEL: test_arg_v4f32: 624; AVX512: # %bb.0: 625; AVX512-NEXT: vmovntdqa (%rdi), %xmm1 626; AVX512-NEXT: vaddps %xmm1, %xmm0, %xmm0 627; AVX512-NEXT: retq 628 %1 = load <4 x float>, ptr %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, ptr %src) { 634; SSE2-LABEL: test_arg_v4i32: 635; SSE2: # %bb.0: 636; SSE2-NEXT: paddd (%rdi), %xmm0 637; SSE2-NEXT: retq 638; 639; SSE41-LABEL: test_arg_v4i32: 640; SSE41: # %bb.0: 641; SSE41-NEXT: movntdqa (%rdi), %xmm1 642; SSE41-NEXT: paddd %xmm1, %xmm0 643; SSE41-NEXT: retq 644; 645; AVX-LABEL: test_arg_v4i32: 646; AVX: # %bb.0: 647; AVX-NEXT: vmovntdqa (%rdi), %xmm1 648; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm0 649; AVX-NEXT: retq 650; 651; AVX512-LABEL: test_arg_v4i32: 652; AVX512: # %bb.0: 653; AVX512-NEXT: vmovntdqa (%rdi), %xmm1 654; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm0 655; AVX512-NEXT: retq 656 %1 = load <4 x i32>, ptr %src, align 16, !nontemporal !1 657 %2 = add <4 x i32> %arg, %1 658 ret <4 x i32> %2 659} 660 661define <2 x double> @test_arg_v2f64(<2 x double> %arg, ptr %src) { 662; SSE2-LABEL: test_arg_v2f64: 663; SSE2: # %bb.0: 664; SSE2-NEXT: addpd (%rdi), %xmm0 665; SSE2-NEXT: retq 666; 667; SSE41-LABEL: test_arg_v2f64: 668; SSE41: # %bb.0: 669; SSE41-NEXT: movntdqa (%rdi), %xmm1 670; SSE41-NEXT: addpd %xmm1, %xmm0 671; SSE41-NEXT: retq 672; 673; AVX-LABEL: test_arg_v2f64: 674; AVX: # %bb.0: 675; AVX-NEXT: vmovntdqa (%rdi), %xmm1 676; AVX-NEXT: vaddpd %xmm1, %xmm0, %xmm0 677; AVX-NEXT: retq 678; 679; AVX512-LABEL: test_arg_v2f64: 680; AVX512: # %bb.0: 681; AVX512-NEXT: vmovntdqa (%rdi), %xmm1 682; AVX512-NEXT: vaddpd %xmm1, %xmm0, %xmm0 683; AVX512-NEXT: retq 684 %1 = load <2 x double>, ptr %src, align 16, !nontemporal !1 685 %2 = fadd <2 x double> %arg, %1 686 ret <2 x double> %2 687} 688 689define <2 x i64> @test_arg_v2i64(<2 x i64> %arg, ptr %src) { 690; SSE2-LABEL: test_arg_v2i64: 691; SSE2: # %bb.0: 692; SSE2-NEXT: paddq (%rdi), %xmm0 693; SSE2-NEXT: retq 694; 695; SSE41-LABEL: test_arg_v2i64: 696; SSE41: # %bb.0: 697; SSE41-NEXT: movntdqa (%rdi), %xmm1 698; SSE41-NEXT: paddq %xmm1, %xmm0 699; SSE41-NEXT: retq 700; 701; AVX-LABEL: test_arg_v2i64: 702; AVX: # %bb.0: 703; AVX-NEXT: vmovntdqa (%rdi), %xmm1 704; AVX-NEXT: vpaddq %xmm1, %xmm0, %xmm0 705; AVX-NEXT: retq 706; 707; AVX512-LABEL: test_arg_v2i64: 708; AVX512: # %bb.0: 709; AVX512-NEXT: vmovntdqa (%rdi), %xmm1 710; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm0 711; AVX512-NEXT: retq 712 %1 = load <2 x i64>, ptr %src, align 16, !nontemporal !1 713 %2 = add <2 x i64> %arg, %1 714 ret <2 x i64> %2 715} 716 717define <8 x i16> @test_arg_v8i16(<8 x i16> %arg, ptr %src) { 718; SSE2-LABEL: test_arg_v8i16: 719; SSE2: # %bb.0: 720; SSE2-NEXT: paddw (%rdi), %xmm0 721; SSE2-NEXT: retq 722; 723; SSE41-LABEL: test_arg_v8i16: 724; SSE41: # %bb.0: 725; SSE41-NEXT: movntdqa (%rdi), %xmm1 726; SSE41-NEXT: paddw %xmm1, %xmm0 727; SSE41-NEXT: retq 728; 729; AVX-LABEL: test_arg_v8i16: 730; AVX: # %bb.0: 731; AVX-NEXT: vmovntdqa (%rdi), %xmm1 732; AVX-NEXT: vpaddw %xmm1, %xmm0, %xmm0 733; AVX-NEXT: retq 734; 735; AVX512-LABEL: test_arg_v8i16: 736; AVX512: # %bb.0: 737; AVX512-NEXT: vmovntdqa (%rdi), %xmm1 738; AVX512-NEXT: vpaddw %xmm1, %xmm0, %xmm0 739; AVX512-NEXT: retq 740 %1 = load <8 x i16>, ptr %src, align 16, !nontemporal !1 741 %2 = add <8 x i16> %arg, %1 742 ret <8 x i16> %2 743} 744 745define <16 x i8> @test_arg_v16i8(<16 x i8> %arg, ptr %src) { 746; SSE2-LABEL: test_arg_v16i8: 747; SSE2: # %bb.0: 748; SSE2-NEXT: paddb (%rdi), %xmm0 749; SSE2-NEXT: retq 750; 751; SSE41-LABEL: test_arg_v16i8: 752; SSE41: # %bb.0: 753; SSE41-NEXT: movntdqa (%rdi), %xmm1 754; SSE41-NEXT: paddb %xmm1, %xmm0 755; SSE41-NEXT: retq 756; 757; AVX-LABEL: test_arg_v16i8: 758; AVX: # %bb.0: 759; AVX-NEXT: vmovntdqa (%rdi), %xmm1 760; AVX-NEXT: vpaddb %xmm1, %xmm0, %xmm0 761; AVX-NEXT: retq 762; 763; AVX512-LABEL: test_arg_v16i8: 764; AVX512: # %bb.0: 765; AVX512-NEXT: vmovntdqa (%rdi), %xmm1 766; AVX512-NEXT: vpaddb %xmm1, %xmm0, %xmm0 767; AVX512-NEXT: retq 768 %1 = load <16 x i8>, ptr %src, align 16, !nontemporal !1 769 %2 = add <16 x i8> %arg, %1 770 ret <16 x i8> %2 771} 772 773; And now YMM versions. 774 775define <8 x float> @test_arg_v8f32(<8 x float> %arg, ptr %src) { 776; SSE2-LABEL: test_arg_v8f32: 777; SSE2: # %bb.0: 778; SSE2-NEXT: addps (%rdi), %xmm0 779; SSE2-NEXT: addps 16(%rdi), %xmm1 780; SSE2-NEXT: retq 781; 782; SSE41-LABEL: test_arg_v8f32: 783; SSE41: # %bb.0: 784; SSE41-NEXT: movntdqa 16(%rdi), %xmm2 785; SSE41-NEXT: movntdqa (%rdi), %xmm3 786; SSE41-NEXT: addps %xmm3, %xmm0 787; SSE41-NEXT: addps %xmm2, %xmm1 788; SSE41-NEXT: retq 789; 790; AVX1-LABEL: test_arg_v8f32: 791; AVX1: # %bb.0: 792; AVX1-NEXT: vmovntdqa (%rdi), %xmm1 793; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm2 794; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 795; AVX1-NEXT: vaddps %ymm1, %ymm0, %ymm0 796; AVX1-NEXT: retq 797; 798; AVX2-LABEL: test_arg_v8f32: 799; AVX2: # %bb.0: 800; AVX2-NEXT: vmovntdqa (%rdi), %ymm1 801; AVX2-NEXT: vaddps %ymm1, %ymm0, %ymm0 802; AVX2-NEXT: retq 803; 804; AVX512-LABEL: test_arg_v8f32: 805; AVX512: # %bb.0: 806; AVX512-NEXT: vmovntdqa (%rdi), %ymm1 807; AVX512-NEXT: vaddps %ymm1, %ymm0, %ymm0 808; AVX512-NEXT: retq 809 %1 = load <8 x float>, ptr %src, align 32, !nontemporal !1 810 %2 = fadd <8 x float> %arg, %1 811 ret <8 x float> %2 812} 813 814define <8 x i32> @test_arg_v8i32(<8 x i32> %arg, ptr %src) { 815; SSE2-LABEL: test_arg_v8i32: 816; SSE2: # %bb.0: 817; SSE2-NEXT: paddd (%rdi), %xmm0 818; SSE2-NEXT: paddd 16(%rdi), %xmm1 819; SSE2-NEXT: retq 820; 821; SSE41-LABEL: test_arg_v8i32: 822; SSE41: # %bb.0: 823; SSE41-NEXT: movntdqa 16(%rdi), %xmm2 824; SSE41-NEXT: movntdqa (%rdi), %xmm3 825; SSE41-NEXT: paddd %xmm3, %xmm0 826; SSE41-NEXT: paddd %xmm2, %xmm1 827; SSE41-NEXT: retq 828; 829; AVX1-LABEL: test_arg_v8i32: 830; AVX1: # %bb.0: 831; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1 832; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 833; AVX1-NEXT: vpaddd %xmm1, %xmm2, %xmm1 834; AVX1-NEXT: vmovntdqa (%rdi), %xmm2 835; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm0 836; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 837; AVX1-NEXT: retq 838; 839; AVX2-LABEL: test_arg_v8i32: 840; AVX2: # %bb.0: 841; AVX2-NEXT: vmovntdqa (%rdi), %ymm1 842; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0 843; AVX2-NEXT: retq 844; 845; AVX512-LABEL: test_arg_v8i32: 846; AVX512: # %bb.0: 847; AVX512-NEXT: vmovntdqa (%rdi), %ymm1 848; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm0 849; AVX512-NEXT: retq 850 %1 = load <8 x i32>, ptr %src, align 32, !nontemporal !1 851 %2 = add <8 x i32> %arg, %1 852 ret <8 x i32> %2 853} 854 855define <4 x double> @test_arg_v4f64(<4 x double> %arg, ptr %src) { 856; SSE2-LABEL: test_arg_v4f64: 857; SSE2: # %bb.0: 858; SSE2-NEXT: addpd (%rdi), %xmm0 859; SSE2-NEXT: addpd 16(%rdi), %xmm1 860; SSE2-NEXT: retq 861; 862; SSE41-LABEL: test_arg_v4f64: 863; SSE41: # %bb.0: 864; SSE41-NEXT: movntdqa 16(%rdi), %xmm2 865; SSE41-NEXT: movntdqa (%rdi), %xmm3 866; SSE41-NEXT: addpd %xmm3, %xmm0 867; SSE41-NEXT: addpd %xmm2, %xmm1 868; SSE41-NEXT: retq 869; 870; AVX1-LABEL: test_arg_v4f64: 871; AVX1: # %bb.0: 872; AVX1-NEXT: vmovntdqa (%rdi), %xmm1 873; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm2 874; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 875; AVX1-NEXT: vaddpd %ymm1, %ymm0, %ymm0 876; AVX1-NEXT: retq 877; 878; AVX2-LABEL: test_arg_v4f64: 879; AVX2: # %bb.0: 880; AVX2-NEXT: vmovntdqa (%rdi), %ymm1 881; AVX2-NEXT: vaddpd %ymm1, %ymm0, %ymm0 882; AVX2-NEXT: retq 883; 884; AVX512-LABEL: test_arg_v4f64: 885; AVX512: # %bb.0: 886; AVX512-NEXT: vmovntdqa (%rdi), %ymm1 887; AVX512-NEXT: vaddpd %ymm1, %ymm0, %ymm0 888; AVX512-NEXT: retq 889 %1 = load <4 x double>, ptr %src, align 32, !nontemporal !1 890 %2 = fadd <4 x double> %arg, %1 891 ret <4 x double> %2 892} 893 894define <4 x i64> @test_arg_v4i64(<4 x i64> %arg, ptr %src) { 895; SSE2-LABEL: test_arg_v4i64: 896; SSE2: # %bb.0: 897; SSE2-NEXT: paddq (%rdi), %xmm0 898; SSE2-NEXT: paddq 16(%rdi), %xmm1 899; SSE2-NEXT: retq 900; 901; SSE41-LABEL: test_arg_v4i64: 902; SSE41: # %bb.0: 903; SSE41-NEXT: movntdqa 16(%rdi), %xmm2 904; SSE41-NEXT: movntdqa (%rdi), %xmm3 905; SSE41-NEXT: paddq %xmm3, %xmm0 906; SSE41-NEXT: paddq %xmm2, %xmm1 907; SSE41-NEXT: retq 908; 909; AVX1-LABEL: test_arg_v4i64: 910; AVX1: # %bb.0: 911; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1 912; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 913; AVX1-NEXT: vpaddq %xmm1, %xmm2, %xmm1 914; AVX1-NEXT: vmovntdqa (%rdi), %xmm2 915; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm0 916; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 917; AVX1-NEXT: retq 918; 919; AVX2-LABEL: test_arg_v4i64: 920; AVX2: # %bb.0: 921; AVX2-NEXT: vmovntdqa (%rdi), %ymm1 922; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0 923; AVX2-NEXT: retq 924; 925; AVX512-LABEL: test_arg_v4i64: 926; AVX512: # %bb.0: 927; AVX512-NEXT: vmovntdqa (%rdi), %ymm1 928; AVX512-NEXT: vpaddq %ymm1, %ymm0, %ymm0 929; AVX512-NEXT: retq 930 %1 = load <4 x i64>, ptr %src, align 32, !nontemporal !1 931 %2 = add <4 x i64> %arg, %1 932 ret <4 x i64> %2 933} 934 935define <16 x i16> @test_arg_v16i16(<16 x i16> %arg, ptr %src) { 936; SSE2-LABEL: test_arg_v16i16: 937; SSE2: # %bb.0: 938; SSE2-NEXT: paddw (%rdi), %xmm0 939; SSE2-NEXT: paddw 16(%rdi), %xmm1 940; SSE2-NEXT: retq 941; 942; SSE41-LABEL: test_arg_v16i16: 943; SSE41: # %bb.0: 944; SSE41-NEXT: movntdqa 16(%rdi), %xmm2 945; SSE41-NEXT: movntdqa (%rdi), %xmm3 946; SSE41-NEXT: paddw %xmm3, %xmm0 947; SSE41-NEXT: paddw %xmm2, %xmm1 948; SSE41-NEXT: retq 949; 950; AVX1-LABEL: test_arg_v16i16: 951; AVX1: # %bb.0: 952; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1 953; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 954; AVX1-NEXT: vpaddw %xmm1, %xmm2, %xmm1 955; AVX1-NEXT: vmovntdqa (%rdi), %xmm2 956; AVX1-NEXT: vpaddw %xmm2, %xmm0, %xmm0 957; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 958; AVX1-NEXT: retq 959; 960; AVX2-LABEL: test_arg_v16i16: 961; AVX2: # %bb.0: 962; AVX2-NEXT: vmovntdqa (%rdi), %ymm1 963; AVX2-NEXT: vpaddw %ymm1, %ymm0, %ymm0 964; AVX2-NEXT: retq 965; 966; AVX512-LABEL: test_arg_v16i16: 967; AVX512: # %bb.0: 968; AVX512-NEXT: vmovntdqa (%rdi), %ymm1 969; AVX512-NEXT: vpaddw %ymm1, %ymm0, %ymm0 970; AVX512-NEXT: retq 971 %1 = load <16 x i16>, ptr %src, align 32, !nontemporal !1 972 %2 = add <16 x i16> %arg, %1 973 ret <16 x i16> %2 974} 975 976define <32 x i8> @test_arg_v32i8(<32 x i8> %arg, ptr %src) { 977; SSE2-LABEL: test_arg_v32i8: 978; SSE2: # %bb.0: 979; SSE2-NEXT: paddb (%rdi), %xmm0 980; SSE2-NEXT: paddb 16(%rdi), %xmm1 981; SSE2-NEXT: retq 982; 983; SSE41-LABEL: test_arg_v32i8: 984; SSE41: # %bb.0: 985; SSE41-NEXT: movntdqa 16(%rdi), %xmm2 986; SSE41-NEXT: movntdqa (%rdi), %xmm3 987; SSE41-NEXT: paddb %xmm3, %xmm0 988; SSE41-NEXT: paddb %xmm2, %xmm1 989; SSE41-NEXT: retq 990; 991; AVX1-LABEL: test_arg_v32i8: 992; AVX1: # %bb.0: 993; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1 994; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 995; AVX1-NEXT: vpaddb %xmm1, %xmm2, %xmm1 996; AVX1-NEXT: vmovntdqa (%rdi), %xmm2 997; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0 998; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 999; AVX1-NEXT: retq 1000; 1001; AVX2-LABEL: test_arg_v32i8: 1002; AVX2: # %bb.0: 1003; AVX2-NEXT: vmovntdqa (%rdi), %ymm1 1004; AVX2-NEXT: vpaddb %ymm1, %ymm0, %ymm0 1005; AVX2-NEXT: retq 1006; 1007; AVX512-LABEL: test_arg_v32i8: 1008; AVX512: # %bb.0: 1009; AVX512-NEXT: vmovntdqa (%rdi), %ymm1 1010; AVX512-NEXT: vpaddb %ymm1, %ymm0, %ymm0 1011; AVX512-NEXT: retq 1012 %1 = load <32 x i8>, ptr %src, align 32, !nontemporal !1 1013 %2 = add <32 x i8> %arg, %1 1014 ret <32 x i8> %2 1015} 1016 1017; And now ZMM versions. 1018 1019define <16 x float> @test_arg_v16f32(<16 x float> %arg, ptr %src) { 1020; SSE2-LABEL: test_arg_v16f32: 1021; SSE2: # %bb.0: 1022; SSE2-NEXT: addps (%rdi), %xmm0 1023; SSE2-NEXT: addps 16(%rdi), %xmm1 1024; SSE2-NEXT: addps 32(%rdi), %xmm2 1025; SSE2-NEXT: addps 48(%rdi), %xmm3 1026; SSE2-NEXT: retq 1027; 1028; SSE41-LABEL: test_arg_v16f32: 1029; SSE41: # %bb.0: 1030; SSE41-NEXT: movntdqa 48(%rdi), %xmm4 1031; SSE41-NEXT: movntdqa 32(%rdi), %xmm5 1032; SSE41-NEXT: movntdqa 16(%rdi), %xmm6 1033; SSE41-NEXT: movntdqa (%rdi), %xmm7 1034; SSE41-NEXT: addps %xmm7, %xmm0 1035; SSE41-NEXT: addps %xmm6, %xmm1 1036; SSE41-NEXT: addps %xmm5, %xmm2 1037; SSE41-NEXT: addps %xmm4, %xmm3 1038; SSE41-NEXT: retq 1039; 1040; AVX1-LABEL: test_arg_v16f32: 1041; AVX1: # %bb.0: 1042; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm2 1043; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm3 1044; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 1045; AVX1-NEXT: vmovntdqa (%rdi), %xmm3 1046; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm4 1047; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3 1048; AVX1-NEXT: vaddps %ymm3, %ymm0, %ymm0 1049; AVX1-NEXT: vaddps %ymm2, %ymm1, %ymm1 1050; AVX1-NEXT: retq 1051; 1052; AVX2-LABEL: test_arg_v16f32: 1053; AVX2: # %bb.0: 1054; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm2 1055; AVX2-NEXT: vmovntdqa (%rdi), %ymm3 1056; AVX2-NEXT: vaddps %ymm3, %ymm0, %ymm0 1057; AVX2-NEXT: vaddps %ymm2, %ymm1, %ymm1 1058; AVX2-NEXT: retq 1059; 1060; AVX512-LABEL: test_arg_v16f32: 1061; AVX512: # %bb.0: 1062; AVX512-NEXT: vmovntdqa (%rdi), %zmm1 1063; AVX512-NEXT: vaddps %zmm1, %zmm0, %zmm0 1064; AVX512-NEXT: retq 1065 %1 = load <16 x float>, ptr %src, align 64, !nontemporal !1 1066 %2 = fadd <16 x float> %arg, %1 1067 ret <16 x float> %2 1068} 1069 1070define <16 x i32> @test_arg_v16i32(<16 x i32> %arg, ptr %src) { 1071; SSE2-LABEL: test_arg_v16i32: 1072; SSE2: # %bb.0: 1073; SSE2-NEXT: paddd (%rdi), %xmm0 1074; SSE2-NEXT: paddd 16(%rdi), %xmm1 1075; SSE2-NEXT: paddd 32(%rdi), %xmm2 1076; SSE2-NEXT: paddd 48(%rdi), %xmm3 1077; SSE2-NEXT: retq 1078; 1079; SSE41-LABEL: test_arg_v16i32: 1080; SSE41: # %bb.0: 1081; SSE41-NEXT: movntdqa 48(%rdi), %xmm4 1082; SSE41-NEXT: movntdqa 32(%rdi), %xmm5 1083; SSE41-NEXT: movntdqa 16(%rdi), %xmm6 1084; SSE41-NEXT: movntdqa (%rdi), %xmm7 1085; SSE41-NEXT: paddd %xmm7, %xmm0 1086; SSE41-NEXT: paddd %xmm6, %xmm1 1087; SSE41-NEXT: paddd %xmm5, %xmm2 1088; SSE41-NEXT: paddd %xmm4, %xmm3 1089; SSE41-NEXT: retq 1090; 1091; AVX1-LABEL: test_arg_v16i32: 1092; AVX1: # %bb.0: 1093; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm2 1094; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1095; AVX1-NEXT: vpaddd %xmm2, %xmm3, %xmm2 1096; AVX1-NEXT: vmovntdqa (%rdi), %xmm3 1097; AVX1-NEXT: vpaddd %xmm3, %xmm0, %xmm0 1098; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1099; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2 1100; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1101; AVX1-NEXT: vpaddd %xmm2, %xmm3, %xmm2 1102; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm3 1103; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1 1104; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1105; AVX1-NEXT: retq 1106; 1107; AVX2-LABEL: test_arg_v16i32: 1108; AVX2: # %bb.0: 1109; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm2 1110; AVX2-NEXT: vmovntdqa (%rdi), %ymm3 1111; AVX2-NEXT: vpaddd %ymm3, %ymm0, %ymm0 1112; AVX2-NEXT: vpaddd %ymm2, %ymm1, %ymm1 1113; AVX2-NEXT: retq 1114; 1115; AVX512-LABEL: test_arg_v16i32: 1116; AVX512: # %bb.0: 1117; AVX512-NEXT: vmovntdqa (%rdi), %zmm1 1118; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0 1119; AVX512-NEXT: retq 1120 %1 = load <16 x i32>, ptr %src, align 64, !nontemporal !1 1121 %2 = add <16 x i32> %arg, %1 1122 ret <16 x i32> %2 1123} 1124 1125define <8 x double> @test_arg_v8f64(<8 x double> %arg, ptr %src) { 1126; SSE2-LABEL: test_arg_v8f64: 1127; SSE2: # %bb.0: 1128; SSE2-NEXT: addpd (%rdi), %xmm0 1129; SSE2-NEXT: addpd 16(%rdi), %xmm1 1130; SSE2-NEXT: addpd 32(%rdi), %xmm2 1131; SSE2-NEXT: addpd 48(%rdi), %xmm3 1132; SSE2-NEXT: retq 1133; 1134; SSE41-LABEL: test_arg_v8f64: 1135; SSE41: # %bb.0: 1136; SSE41-NEXT: movntdqa 48(%rdi), %xmm4 1137; SSE41-NEXT: movntdqa 32(%rdi), %xmm5 1138; SSE41-NEXT: movntdqa 16(%rdi), %xmm6 1139; SSE41-NEXT: movntdqa (%rdi), %xmm7 1140; SSE41-NEXT: addpd %xmm7, %xmm0 1141; SSE41-NEXT: addpd %xmm6, %xmm1 1142; SSE41-NEXT: addpd %xmm5, %xmm2 1143; SSE41-NEXT: addpd %xmm4, %xmm3 1144; SSE41-NEXT: retq 1145; 1146; AVX1-LABEL: test_arg_v8f64: 1147; AVX1: # %bb.0: 1148; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm2 1149; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm3 1150; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 1151; AVX1-NEXT: vmovntdqa (%rdi), %xmm3 1152; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm4 1153; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3 1154; AVX1-NEXT: vaddpd %ymm3, %ymm0, %ymm0 1155; AVX1-NEXT: vaddpd %ymm2, %ymm1, %ymm1 1156; AVX1-NEXT: retq 1157; 1158; AVX2-LABEL: test_arg_v8f64: 1159; AVX2: # %bb.0: 1160; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm2 1161; AVX2-NEXT: vmovntdqa (%rdi), %ymm3 1162; AVX2-NEXT: vaddpd %ymm3, %ymm0, %ymm0 1163; AVX2-NEXT: vaddpd %ymm2, %ymm1, %ymm1 1164; AVX2-NEXT: retq 1165; 1166; AVX512-LABEL: test_arg_v8f64: 1167; AVX512: # %bb.0: 1168; AVX512-NEXT: vmovntdqa (%rdi), %zmm1 1169; AVX512-NEXT: vaddpd %zmm1, %zmm0, %zmm0 1170; AVX512-NEXT: retq 1171 %1 = load <8 x double>, ptr %src, align 64, !nontemporal !1 1172 %2 = fadd <8 x double> %arg, %1 1173 ret <8 x double> %2 1174} 1175 1176define <8 x i64> @test_arg_v8i64(<8 x i64> %arg, ptr %src) { 1177; SSE2-LABEL: test_arg_v8i64: 1178; SSE2: # %bb.0: 1179; SSE2-NEXT: paddq (%rdi), %xmm0 1180; SSE2-NEXT: paddq 16(%rdi), %xmm1 1181; SSE2-NEXT: paddq 32(%rdi), %xmm2 1182; SSE2-NEXT: paddq 48(%rdi), %xmm3 1183; SSE2-NEXT: retq 1184; 1185; SSE41-LABEL: test_arg_v8i64: 1186; SSE41: # %bb.0: 1187; SSE41-NEXT: movntdqa 48(%rdi), %xmm4 1188; SSE41-NEXT: movntdqa 32(%rdi), %xmm5 1189; SSE41-NEXT: movntdqa 16(%rdi), %xmm6 1190; SSE41-NEXT: movntdqa (%rdi), %xmm7 1191; SSE41-NEXT: paddq %xmm7, %xmm0 1192; SSE41-NEXT: paddq %xmm6, %xmm1 1193; SSE41-NEXT: paddq %xmm5, %xmm2 1194; SSE41-NEXT: paddq %xmm4, %xmm3 1195; SSE41-NEXT: retq 1196; 1197; AVX1-LABEL: test_arg_v8i64: 1198; AVX1: # %bb.0: 1199; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm2 1200; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1201; AVX1-NEXT: vpaddq %xmm2, %xmm3, %xmm2 1202; AVX1-NEXT: vmovntdqa (%rdi), %xmm3 1203; AVX1-NEXT: vpaddq %xmm3, %xmm0, %xmm0 1204; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1205; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2 1206; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1207; AVX1-NEXT: vpaddq %xmm2, %xmm3, %xmm2 1208; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm3 1209; AVX1-NEXT: vpaddq %xmm3, %xmm1, %xmm1 1210; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1211; AVX1-NEXT: retq 1212; 1213; AVX2-LABEL: test_arg_v8i64: 1214; AVX2: # %bb.0: 1215; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm2 1216; AVX2-NEXT: vmovntdqa (%rdi), %ymm3 1217; AVX2-NEXT: vpaddq %ymm3, %ymm0, %ymm0 1218; AVX2-NEXT: vpaddq %ymm2, %ymm1, %ymm1 1219; AVX2-NEXT: retq 1220; 1221; AVX512-LABEL: test_arg_v8i64: 1222; AVX512: # %bb.0: 1223; AVX512-NEXT: vmovntdqa (%rdi), %zmm1 1224; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm0 1225; AVX512-NEXT: retq 1226 %1 = load <8 x i64>, ptr %src, align 64, !nontemporal !1 1227 %2 = add <8 x i64> %arg, %1 1228 ret <8 x i64> %2 1229} 1230 1231define <32 x i16> @test_arg_v32i16(<32 x i16> %arg, ptr %src) { 1232; SSE2-LABEL: test_arg_v32i16: 1233; SSE2: # %bb.0: 1234; SSE2-NEXT: paddw (%rdi), %xmm0 1235; SSE2-NEXT: paddw 16(%rdi), %xmm1 1236; SSE2-NEXT: paddw 32(%rdi), %xmm2 1237; SSE2-NEXT: paddw 48(%rdi), %xmm3 1238; SSE2-NEXT: retq 1239; 1240; SSE41-LABEL: test_arg_v32i16: 1241; SSE41: # %bb.0: 1242; SSE41-NEXT: movntdqa 48(%rdi), %xmm4 1243; SSE41-NEXT: movntdqa 32(%rdi), %xmm5 1244; SSE41-NEXT: movntdqa 16(%rdi), %xmm6 1245; SSE41-NEXT: movntdqa (%rdi), %xmm7 1246; SSE41-NEXT: paddw %xmm7, %xmm0 1247; SSE41-NEXT: paddw %xmm6, %xmm1 1248; SSE41-NEXT: paddw %xmm5, %xmm2 1249; SSE41-NEXT: paddw %xmm4, %xmm3 1250; SSE41-NEXT: retq 1251; 1252; AVX1-LABEL: test_arg_v32i16: 1253; AVX1: # %bb.0: 1254; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm2 1255; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1256; AVX1-NEXT: vpaddw %xmm2, %xmm3, %xmm2 1257; AVX1-NEXT: vmovntdqa (%rdi), %xmm3 1258; AVX1-NEXT: vpaddw %xmm3, %xmm0, %xmm0 1259; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1260; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2 1261; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1262; AVX1-NEXT: vpaddw %xmm2, %xmm3, %xmm2 1263; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm3 1264; AVX1-NEXT: vpaddw %xmm3, %xmm1, %xmm1 1265; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1266; AVX1-NEXT: retq 1267; 1268; AVX2-LABEL: test_arg_v32i16: 1269; AVX2: # %bb.0: 1270; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm2 1271; AVX2-NEXT: vmovntdqa (%rdi), %ymm3 1272; AVX2-NEXT: vpaddw %ymm3, %ymm0, %ymm0 1273; AVX2-NEXT: vpaddw %ymm2, %ymm1, %ymm1 1274; AVX2-NEXT: retq 1275; 1276; AVX512F-LABEL: test_arg_v32i16: 1277; AVX512F: # %bb.0: 1278; AVX512F-NEXT: vmovntdqa 32(%rdi), %ymm1 1279; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm2 1280; AVX512F-NEXT: vpaddw %ymm1, %ymm2, %ymm1 1281; AVX512F-NEXT: vmovntdqa (%rdi), %ymm2 1282; AVX512F-NEXT: vpaddw %ymm2, %ymm0, %ymm0 1283; AVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 1284; AVX512F-NEXT: retq 1285; 1286; AVX512BW-LABEL: test_arg_v32i16: 1287; AVX512BW: # %bb.0: 1288; AVX512BW-NEXT: vmovntdqa (%rdi), %zmm1 1289; AVX512BW-NEXT: vpaddw %zmm1, %zmm0, %zmm0 1290; AVX512BW-NEXT: retq 1291; 1292; AVX512VL-LABEL: test_arg_v32i16: 1293; AVX512VL: # %bb.0: 1294; AVX512VL-NEXT: vmovntdqa 32(%rdi), %ymm1 1295; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm2 1296; AVX512VL-NEXT: vpaddw %ymm1, %ymm2, %ymm1 1297; AVX512VL-NEXT: vmovntdqa (%rdi), %ymm2 1298; AVX512VL-NEXT: vpaddw %ymm2, %ymm0, %ymm0 1299; AVX512VL-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 1300; AVX512VL-NEXT: retq 1301 %1 = load <32 x i16>, ptr %src, align 64, !nontemporal !1 1302 %2 = add <32 x i16> %arg, %1 1303 ret <32 x i16> %2 1304} 1305 1306define <64 x i8> @test_arg_v64i8(<64 x i8> %arg, ptr %src) { 1307; SSE2-LABEL: test_arg_v64i8: 1308; SSE2: # %bb.0: 1309; SSE2-NEXT: paddb (%rdi), %xmm0 1310; SSE2-NEXT: paddb 16(%rdi), %xmm1 1311; SSE2-NEXT: paddb 32(%rdi), %xmm2 1312; SSE2-NEXT: paddb 48(%rdi), %xmm3 1313; SSE2-NEXT: retq 1314; 1315; SSE41-LABEL: test_arg_v64i8: 1316; SSE41: # %bb.0: 1317; SSE41-NEXT: movntdqa 48(%rdi), %xmm4 1318; SSE41-NEXT: movntdqa 32(%rdi), %xmm5 1319; SSE41-NEXT: movntdqa 16(%rdi), %xmm6 1320; SSE41-NEXT: movntdqa (%rdi), %xmm7 1321; SSE41-NEXT: paddb %xmm7, %xmm0 1322; SSE41-NEXT: paddb %xmm6, %xmm1 1323; SSE41-NEXT: paddb %xmm5, %xmm2 1324; SSE41-NEXT: paddb %xmm4, %xmm3 1325; SSE41-NEXT: retq 1326; 1327; AVX1-LABEL: test_arg_v64i8: 1328; AVX1: # %bb.0: 1329; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm2 1330; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1331; AVX1-NEXT: vpaddb %xmm2, %xmm3, %xmm2 1332; AVX1-NEXT: vmovntdqa (%rdi), %xmm3 1333; AVX1-NEXT: vpaddb %xmm3, %xmm0, %xmm0 1334; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1335; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2 1336; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1337; AVX1-NEXT: vpaddb %xmm2, %xmm3, %xmm2 1338; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm3 1339; AVX1-NEXT: vpaddb %xmm3, %xmm1, %xmm1 1340; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1341; AVX1-NEXT: retq 1342; 1343; AVX2-LABEL: test_arg_v64i8: 1344; AVX2: # %bb.0: 1345; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm2 1346; AVX2-NEXT: vmovntdqa (%rdi), %ymm3 1347; AVX2-NEXT: vpaddb %ymm3, %ymm0, %ymm0 1348; AVX2-NEXT: vpaddb %ymm2, %ymm1, %ymm1 1349; AVX2-NEXT: retq 1350; 1351; AVX512F-LABEL: test_arg_v64i8: 1352; AVX512F: # %bb.0: 1353; AVX512F-NEXT: vmovntdqa 32(%rdi), %ymm1 1354; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm2 1355; AVX512F-NEXT: vpaddb %ymm1, %ymm2, %ymm1 1356; AVX512F-NEXT: vmovntdqa (%rdi), %ymm2 1357; AVX512F-NEXT: vpaddb %ymm2, %ymm0, %ymm0 1358; AVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 1359; AVX512F-NEXT: retq 1360; 1361; AVX512BW-LABEL: test_arg_v64i8: 1362; AVX512BW: # %bb.0: 1363; AVX512BW-NEXT: vmovntdqa (%rdi), %zmm1 1364; AVX512BW-NEXT: vpaddb %zmm1, %zmm0, %zmm0 1365; AVX512BW-NEXT: retq 1366; 1367; AVX512VL-LABEL: test_arg_v64i8: 1368; AVX512VL: # %bb.0: 1369; AVX512VL-NEXT: vmovntdqa 32(%rdi), %ymm1 1370; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm2 1371; AVX512VL-NEXT: vpaddb %ymm1, %ymm2, %ymm1 1372; AVX512VL-NEXT: vmovntdqa (%rdi), %ymm2 1373; AVX512VL-NEXT: vpaddb %ymm2, %ymm0, %ymm0 1374; AVX512VL-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0 1375; AVX512VL-NEXT: retq 1376 %1 = load <64 x i8>, ptr %src, align 64, !nontemporal !1 1377 %2 = add <64 x i8> %arg, %1 1378 ret <64 x i8> %2 1379} 1380 1381 1382; Unaligned non-temporal loads (not supported) 1383 1384define <4 x float> @test_unaligned_v4f32(ptr %src) { 1385; SSE-LABEL: test_unaligned_v4f32: 1386; SSE: # %bb.0: 1387; SSE-NEXT: movups (%rdi), %xmm0 1388; SSE-NEXT: retq 1389; 1390; AVX-LABEL: test_unaligned_v4f32: 1391; AVX: # %bb.0: 1392; AVX-NEXT: vmovups (%rdi), %xmm0 1393; AVX-NEXT: retq 1394; 1395; AVX512-LABEL: test_unaligned_v4f32: 1396; AVX512: # %bb.0: 1397; AVX512-NEXT: vmovups (%rdi), %xmm0 1398; AVX512-NEXT: retq 1399 %1 = load <4 x float>, ptr %src, align 1, !nontemporal !1 1400 ret <4 x float> %1 1401} 1402 1403define <4 x i32> @test_unaligned_v4i32(ptr %src) { 1404; SSE-LABEL: test_unaligned_v4i32: 1405; SSE: # %bb.0: 1406; SSE-NEXT: movups (%rdi), %xmm0 1407; SSE-NEXT: retq 1408; 1409; AVX-LABEL: test_unaligned_v4i32: 1410; AVX: # %bb.0: 1411; AVX-NEXT: vmovups (%rdi), %xmm0 1412; AVX-NEXT: retq 1413; 1414; AVX512-LABEL: test_unaligned_v4i32: 1415; AVX512: # %bb.0: 1416; AVX512-NEXT: vmovups (%rdi), %xmm0 1417; AVX512-NEXT: retq 1418 %1 = load <4 x i32>, ptr %src, align 1, !nontemporal !1 1419 ret <4 x i32> %1 1420} 1421 1422define <2 x double> @test_unaligned_v2f64(ptr %src) { 1423; SSE-LABEL: test_unaligned_v2f64: 1424; SSE: # %bb.0: 1425; SSE-NEXT: movups (%rdi), %xmm0 1426; SSE-NEXT: retq 1427; 1428; AVX-LABEL: test_unaligned_v2f64: 1429; AVX: # %bb.0: 1430; AVX-NEXT: vmovups (%rdi), %xmm0 1431; AVX-NEXT: retq 1432; 1433; AVX512-LABEL: test_unaligned_v2f64: 1434; AVX512: # %bb.0: 1435; AVX512-NEXT: vmovups (%rdi), %xmm0 1436; AVX512-NEXT: retq 1437 %1 = load <2 x double>, ptr %src, align 1, !nontemporal !1 1438 ret <2 x double> %1 1439} 1440 1441define <2 x i64> @test_unaligned_v2i64(ptr %src) { 1442; SSE-LABEL: test_unaligned_v2i64: 1443; SSE: # %bb.0: 1444; SSE-NEXT: movups (%rdi), %xmm0 1445; SSE-NEXT: retq 1446; 1447; AVX-LABEL: test_unaligned_v2i64: 1448; AVX: # %bb.0: 1449; AVX-NEXT: vmovups (%rdi), %xmm0 1450; AVX-NEXT: retq 1451; 1452; AVX512-LABEL: test_unaligned_v2i64: 1453; AVX512: # %bb.0: 1454; AVX512-NEXT: vmovups (%rdi), %xmm0 1455; AVX512-NEXT: retq 1456 %1 = load <2 x i64>, ptr %src, align 1, !nontemporal !1 1457 ret <2 x i64> %1 1458} 1459 1460define <8 x i16> @test_unaligned_v8i16(ptr %src) { 1461; SSE-LABEL: test_unaligned_v8i16: 1462; SSE: # %bb.0: 1463; SSE-NEXT: movups (%rdi), %xmm0 1464; SSE-NEXT: retq 1465; 1466; AVX-LABEL: test_unaligned_v8i16: 1467; AVX: # %bb.0: 1468; AVX-NEXT: vmovups (%rdi), %xmm0 1469; AVX-NEXT: retq 1470; 1471; AVX512-LABEL: test_unaligned_v8i16: 1472; AVX512: # %bb.0: 1473; AVX512-NEXT: vmovups (%rdi), %xmm0 1474; AVX512-NEXT: retq 1475 %1 = load <8 x i16>, ptr %src, align 1, !nontemporal !1 1476 ret <8 x i16> %1 1477} 1478 1479define <16 x i8> @test_unaligned_v16i8(ptr %src) { 1480; SSE-LABEL: test_unaligned_v16i8: 1481; SSE: # %bb.0: 1482; SSE-NEXT: movups (%rdi), %xmm0 1483; SSE-NEXT: retq 1484; 1485; AVX-LABEL: test_unaligned_v16i8: 1486; AVX: # %bb.0: 1487; AVX-NEXT: vmovups (%rdi), %xmm0 1488; AVX-NEXT: retq 1489; 1490; AVX512-LABEL: test_unaligned_v16i8: 1491; AVX512: # %bb.0: 1492; AVX512-NEXT: vmovups (%rdi), %xmm0 1493; AVX512-NEXT: retq 1494 %1 = load <16 x i8>, ptr %src, align 1, !nontemporal !1 1495 ret <16 x i8> %1 1496} 1497 1498; And now YMM versions. 1499 1500define <8 x float> @test_unaligned_v8f32(ptr %src) { 1501; SSE-LABEL: test_unaligned_v8f32: 1502; SSE: # %bb.0: 1503; SSE-NEXT: movups (%rdi), %xmm0 1504; SSE-NEXT: movups 16(%rdi), %xmm1 1505; SSE-NEXT: retq 1506; 1507; AVX-LABEL: test_unaligned_v8f32: 1508; AVX: # %bb.0: 1509; AVX-NEXT: vmovups (%rdi), %ymm0 1510; AVX-NEXT: retq 1511; 1512; AVX512-LABEL: test_unaligned_v8f32: 1513; AVX512: # %bb.0: 1514; AVX512-NEXT: vmovups (%rdi), %ymm0 1515; AVX512-NEXT: retq 1516 %1 = load <8 x float>, ptr %src, align 1, !nontemporal !1 1517 ret <8 x float> %1 1518} 1519 1520define <8 x i32> @test_unaligned_v8i32(ptr %src) { 1521; SSE-LABEL: test_unaligned_v8i32: 1522; SSE: # %bb.0: 1523; SSE-NEXT: movups (%rdi), %xmm0 1524; SSE-NEXT: movups 16(%rdi), %xmm1 1525; SSE-NEXT: retq 1526; 1527; AVX-LABEL: test_unaligned_v8i32: 1528; AVX: # %bb.0: 1529; AVX-NEXT: vmovups (%rdi), %ymm0 1530; AVX-NEXT: retq 1531; 1532; AVX512-LABEL: test_unaligned_v8i32: 1533; AVX512: # %bb.0: 1534; AVX512-NEXT: vmovups (%rdi), %ymm0 1535; AVX512-NEXT: retq 1536 %1 = load <8 x i32>, ptr %src, align 1, !nontemporal !1 1537 ret <8 x i32> %1 1538} 1539 1540define <4 x double> @test_unaligned_v4f64(ptr %src) { 1541; SSE-LABEL: test_unaligned_v4f64: 1542; SSE: # %bb.0: 1543; SSE-NEXT: movups (%rdi), %xmm0 1544; SSE-NEXT: movups 16(%rdi), %xmm1 1545; SSE-NEXT: retq 1546; 1547; AVX-LABEL: test_unaligned_v4f64: 1548; AVX: # %bb.0: 1549; AVX-NEXT: vmovups (%rdi), %ymm0 1550; AVX-NEXT: retq 1551; 1552; AVX512-LABEL: test_unaligned_v4f64: 1553; AVX512: # %bb.0: 1554; AVX512-NEXT: vmovups (%rdi), %ymm0 1555; AVX512-NEXT: retq 1556 %1 = load <4 x double>, ptr %src, align 1, !nontemporal !1 1557 ret <4 x double> %1 1558} 1559 1560define <4 x i64> @test_unaligned_v4i64(ptr %src) { 1561; SSE-LABEL: test_unaligned_v4i64: 1562; SSE: # %bb.0: 1563; SSE-NEXT: movups (%rdi), %xmm0 1564; SSE-NEXT: movups 16(%rdi), %xmm1 1565; SSE-NEXT: retq 1566; 1567; AVX-LABEL: test_unaligned_v4i64: 1568; AVX: # %bb.0: 1569; AVX-NEXT: vmovups (%rdi), %ymm0 1570; AVX-NEXT: retq 1571; 1572; AVX512-LABEL: test_unaligned_v4i64: 1573; AVX512: # %bb.0: 1574; AVX512-NEXT: vmovups (%rdi), %ymm0 1575; AVX512-NEXT: retq 1576 %1 = load <4 x i64>, ptr %src, align 1, !nontemporal !1 1577 ret <4 x i64> %1 1578} 1579 1580define <16 x i16> @test_unaligned_v16i16(ptr %src) { 1581; SSE-LABEL: test_unaligned_v16i16: 1582; SSE: # %bb.0: 1583; SSE-NEXT: movups (%rdi), %xmm0 1584; SSE-NEXT: movups 16(%rdi), %xmm1 1585; SSE-NEXT: retq 1586; 1587; AVX-LABEL: test_unaligned_v16i16: 1588; AVX: # %bb.0: 1589; AVX-NEXT: vmovups (%rdi), %ymm0 1590; AVX-NEXT: retq 1591; 1592; AVX512-LABEL: test_unaligned_v16i16: 1593; AVX512: # %bb.0: 1594; AVX512-NEXT: vmovups (%rdi), %ymm0 1595; AVX512-NEXT: retq 1596 %1 = load <16 x i16>, ptr %src, align 1, !nontemporal !1 1597 ret <16 x i16> %1 1598} 1599 1600define <32 x i8> @test_unaligned_v32i8(ptr %src) { 1601; SSE-LABEL: test_unaligned_v32i8: 1602; SSE: # %bb.0: 1603; SSE-NEXT: movups (%rdi), %xmm0 1604; SSE-NEXT: movups 16(%rdi), %xmm1 1605; SSE-NEXT: retq 1606; 1607; AVX-LABEL: test_unaligned_v32i8: 1608; AVX: # %bb.0: 1609; AVX-NEXT: vmovups (%rdi), %ymm0 1610; AVX-NEXT: retq 1611; 1612; AVX512-LABEL: test_unaligned_v32i8: 1613; AVX512: # %bb.0: 1614; AVX512-NEXT: vmovups (%rdi), %ymm0 1615; AVX512-NEXT: retq 1616 %1 = load <32 x i8>, ptr %src, align 1, !nontemporal !1 1617 ret <32 x i8> %1 1618} 1619 1620; And now ZMM versions. 1621 1622define <16 x float> @test_unaligned_v16f32(ptr %src) { 1623; SSE-LABEL: test_unaligned_v16f32: 1624; SSE: # %bb.0: 1625; SSE-NEXT: movups (%rdi), %xmm0 1626; SSE-NEXT: movups 16(%rdi), %xmm1 1627; SSE-NEXT: movups 32(%rdi), %xmm2 1628; SSE-NEXT: movups 48(%rdi), %xmm3 1629; SSE-NEXT: retq 1630; 1631; AVX-LABEL: test_unaligned_v16f32: 1632; AVX: # %bb.0: 1633; AVX-NEXT: vmovups (%rdi), %ymm0 1634; AVX-NEXT: vmovups 32(%rdi), %ymm1 1635; AVX-NEXT: retq 1636; 1637; AVX512-LABEL: test_unaligned_v16f32: 1638; AVX512: # %bb.0: 1639; AVX512-NEXT: vmovups (%rdi), %zmm0 1640; AVX512-NEXT: retq 1641 %1 = load <16 x float>, ptr %src, align 1, !nontemporal !1 1642 ret <16 x float> %1 1643} 1644 1645define <16 x i32> @test_unaligned_v16i32(ptr %src) { 1646; SSE-LABEL: test_unaligned_v16i32: 1647; SSE: # %bb.0: 1648; SSE-NEXT: movups (%rdi), %xmm0 1649; SSE-NEXT: movups 16(%rdi), %xmm1 1650; SSE-NEXT: movups 32(%rdi), %xmm2 1651; SSE-NEXT: movups 48(%rdi), %xmm3 1652; SSE-NEXT: retq 1653; 1654; AVX-LABEL: test_unaligned_v16i32: 1655; AVX: # %bb.0: 1656; AVX-NEXT: vmovups (%rdi), %ymm0 1657; AVX-NEXT: vmovups 32(%rdi), %ymm1 1658; AVX-NEXT: retq 1659; 1660; AVX512-LABEL: test_unaligned_v16i32: 1661; AVX512: # %bb.0: 1662; AVX512-NEXT: vmovups (%rdi), %zmm0 1663; AVX512-NEXT: retq 1664 %1 = load <16 x i32>, ptr %src, align 1, !nontemporal !1 1665 ret <16 x i32> %1 1666} 1667 1668define <8 x double> @test_unaligned_v8f64(ptr %src) { 1669; SSE-LABEL: test_unaligned_v8f64: 1670; SSE: # %bb.0: 1671; SSE-NEXT: movups (%rdi), %xmm0 1672; SSE-NEXT: movups 16(%rdi), %xmm1 1673; SSE-NEXT: movups 32(%rdi), %xmm2 1674; SSE-NEXT: movups 48(%rdi), %xmm3 1675; SSE-NEXT: retq 1676; 1677; AVX-LABEL: test_unaligned_v8f64: 1678; AVX: # %bb.0: 1679; AVX-NEXT: vmovups (%rdi), %ymm0 1680; AVX-NEXT: vmovups 32(%rdi), %ymm1 1681; AVX-NEXT: retq 1682; 1683; AVX512-LABEL: test_unaligned_v8f64: 1684; AVX512: # %bb.0: 1685; AVX512-NEXT: vmovups (%rdi), %zmm0 1686; AVX512-NEXT: retq 1687 %1 = load <8 x double>, ptr %src, align 1, !nontemporal !1 1688 ret <8 x double> %1 1689} 1690 1691define <8 x i64> @test_unaligned_v8i64(ptr %src) { 1692; SSE-LABEL: test_unaligned_v8i64: 1693; SSE: # %bb.0: 1694; SSE-NEXT: movups (%rdi), %xmm0 1695; SSE-NEXT: movups 16(%rdi), %xmm1 1696; SSE-NEXT: movups 32(%rdi), %xmm2 1697; SSE-NEXT: movups 48(%rdi), %xmm3 1698; SSE-NEXT: retq 1699; 1700; AVX-LABEL: test_unaligned_v8i64: 1701; AVX: # %bb.0: 1702; AVX-NEXT: vmovups (%rdi), %ymm0 1703; AVX-NEXT: vmovups 32(%rdi), %ymm1 1704; AVX-NEXT: retq 1705; 1706; AVX512-LABEL: test_unaligned_v8i64: 1707; AVX512: # %bb.0: 1708; AVX512-NEXT: vmovups (%rdi), %zmm0 1709; AVX512-NEXT: retq 1710 %1 = load <8 x i64>, ptr %src, align 1, !nontemporal !1 1711 ret <8 x i64> %1 1712} 1713 1714define <32 x i16> @test_unaligned_v32i16(ptr %src) { 1715; SSE-LABEL: test_unaligned_v32i16: 1716; SSE: # %bb.0: 1717; SSE-NEXT: movups (%rdi), %xmm0 1718; SSE-NEXT: movups 16(%rdi), %xmm1 1719; SSE-NEXT: movups 32(%rdi), %xmm2 1720; SSE-NEXT: movups 48(%rdi), %xmm3 1721; SSE-NEXT: retq 1722; 1723; AVX-LABEL: test_unaligned_v32i16: 1724; AVX: # %bb.0: 1725; AVX-NEXT: vmovups (%rdi), %ymm0 1726; AVX-NEXT: vmovups 32(%rdi), %ymm1 1727; AVX-NEXT: retq 1728; 1729; AVX512-LABEL: test_unaligned_v32i16: 1730; AVX512: # %bb.0: 1731; AVX512-NEXT: vmovups (%rdi), %zmm0 1732; AVX512-NEXT: retq 1733 %1 = load <32 x i16>, ptr %src, align 1, !nontemporal !1 1734 ret <32 x i16> %1 1735} 1736 1737define <64 x i8> @test_unaligned_v64i8(ptr %src) { 1738; SSE-LABEL: test_unaligned_v64i8: 1739; SSE: # %bb.0: 1740; SSE-NEXT: movups (%rdi), %xmm0 1741; SSE-NEXT: movups 16(%rdi), %xmm1 1742; SSE-NEXT: movups 32(%rdi), %xmm2 1743; SSE-NEXT: movups 48(%rdi), %xmm3 1744; SSE-NEXT: retq 1745; 1746; AVX-LABEL: test_unaligned_v64i8: 1747; AVX: # %bb.0: 1748; AVX-NEXT: vmovups (%rdi), %ymm0 1749; AVX-NEXT: vmovups 32(%rdi), %ymm1 1750; AVX-NEXT: retq 1751; 1752; AVX512-LABEL: test_unaligned_v64i8: 1753; AVX512: # %bb.0: 1754; AVX512-NEXT: vmovups (%rdi), %zmm0 1755; AVX512-NEXT: retq 1756 %1 = load <64 x i8>, ptr %src, align 1, !nontemporal !1 1757 ret <64 x i8> %1 1758} 1759 1760define <16 x i32> @test_masked_v16i32(ptr %addr, <16 x i32> %old, <16 x i32> %mask1) { 1761; SSE2-LABEL: test_masked_v16i32: 1762; SSE2: # %bb.0: 1763; SSE2-NEXT: pxor %xmm8, %xmm8 1764; SSE2-NEXT: pcmpeqd %xmm8, %xmm7 1765; SSE2-NEXT: pcmpeqd %xmm8, %xmm6 1766; SSE2-NEXT: pcmpeqd %xmm8, %xmm5 1767; SSE2-NEXT: pcmpeqd %xmm4, %xmm8 1768; SSE2-NEXT: pand %xmm8, %xmm0 1769; SSE2-NEXT: pandn (%rdi), %xmm8 1770; SSE2-NEXT: por %xmm8, %xmm0 1771; SSE2-NEXT: pand %xmm5, %xmm1 1772; SSE2-NEXT: pandn 16(%rdi), %xmm5 1773; SSE2-NEXT: por %xmm5, %xmm1 1774; SSE2-NEXT: pand %xmm6, %xmm2 1775; SSE2-NEXT: pandn 32(%rdi), %xmm6 1776; SSE2-NEXT: por %xmm6, %xmm2 1777; SSE2-NEXT: pand %xmm7, %xmm3 1778; SSE2-NEXT: pandn 48(%rdi), %xmm7 1779; SSE2-NEXT: por %xmm7, %xmm3 1780; SSE2-NEXT: retq 1781; 1782; SSE41-LABEL: test_masked_v16i32: 1783; SSE41: # %bb.0: 1784; SSE41-NEXT: movdqa %xmm0, %xmm8 1785; SSE41-NEXT: pxor %xmm0, %xmm0 1786; SSE41-NEXT: pcmpeqd %xmm0, %xmm7 1787; SSE41-NEXT: pcmpeqd %xmm0, %xmm6 1788; SSE41-NEXT: pcmpeqd %xmm0, %xmm5 1789; SSE41-NEXT: pcmpeqd %xmm4, %xmm0 1790; SSE41-NEXT: movntdqa 48(%rdi), %xmm4 1791; SSE41-NEXT: movntdqa 32(%rdi), %xmm9 1792; SSE41-NEXT: movntdqa 16(%rdi), %xmm10 1793; SSE41-NEXT: movntdqa (%rdi), %xmm11 1794; SSE41-NEXT: blendvps %xmm0, %xmm8, %xmm11 1795; SSE41-NEXT: movdqa %xmm5, %xmm0 1796; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm10 1797; SSE41-NEXT: movdqa %xmm6, %xmm0 1798; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm9 1799; SSE41-NEXT: movdqa %xmm7, %xmm0 1800; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm4 1801; SSE41-NEXT: movaps %xmm11, %xmm0 1802; SSE41-NEXT: movaps %xmm10, %xmm1 1803; SSE41-NEXT: movaps %xmm9, %xmm2 1804; SSE41-NEXT: movaps %xmm4, %xmm3 1805; SSE41-NEXT: retq 1806; 1807; AVX1-LABEL: test_masked_v16i32: 1808; AVX1: # %bb.0: 1809; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 1810; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5 1811; AVX1-NEXT: vpcmpeqd %xmm5, %xmm4, %xmm4 1812; AVX1-NEXT: vpcmpeqd %xmm5, %xmm3, %xmm3 1813; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3 1814; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 1815; AVX1-NEXT: vpcmpeqd %xmm5, %xmm4, %xmm4 1816; AVX1-NEXT: vpcmpeqd %xmm5, %xmm2, %xmm2 1817; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm2, %ymm2 1818; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm4 1819; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm5 1820; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm4, %ymm4 1821; AVX1-NEXT: vblendvps %ymm3, %ymm1, %ymm4, %ymm1 1822; AVX1-NEXT: vmovntdqa (%rdi), %xmm3 1823; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm4 1824; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3 1825; AVX1-NEXT: vblendvps %ymm2, %ymm0, %ymm3, %ymm0 1826; AVX1-NEXT: retq 1827; 1828; AVX2-LABEL: test_masked_v16i32: 1829; AVX2: # %bb.0: 1830; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4 1831; AVX2-NEXT: vpcmpeqd %ymm4, %ymm3, %ymm3 1832; AVX2-NEXT: vpcmpeqd %ymm4, %ymm2, %ymm2 1833; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm4 1834; AVX2-NEXT: vblendvps %ymm3, %ymm1, %ymm4, %ymm1 1835; AVX2-NEXT: vmovntdqa (%rdi), %ymm3 1836; AVX2-NEXT: vblendvps %ymm2, %ymm0, %ymm3, %ymm0 1837; AVX2-NEXT: retq 1838; 1839; AVX512-LABEL: test_masked_v16i32: 1840; AVX512: # %bb.0: 1841; AVX512-NEXT: vptestmd %zmm1, %zmm1, %k1 1842; AVX512-NEXT: vmovntdqa (%rdi), %zmm1 1843; AVX512-NEXT: vmovdqa32 %zmm1, %zmm0 {%k1} 1844; AVX512-NEXT: retq 1845 %mask = icmp ne <16 x i32> %mask1, zeroinitializer 1846 %r = load <16 x i32>, ptr %addr, align 64, !nontemporal !1 1847 %res = select <16 x i1> %mask, <16 x i32> %r, <16 x i32> %old 1848 ret <16 x i32>%res 1849} 1850 1851; Reduced from https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10895 1852define i32 @PR39256(ptr %ptr) { 1853; SSE-LABEL: PR39256: 1854; SSE: # %bb.0: # %entry 1855; SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 1856; SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1857; SSE-NEXT: setb (%rax) 1858; SSE-NEXT: movl $-2147483648, %eax # imm = 0x80000000 1859; SSE-NEXT: retq 1860; 1861; AVX-LABEL: PR39256: 1862; AVX: # %bb.0: # %entry 1863; AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero 1864; AVX-NEXT: vucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1865; AVX-NEXT: setb (%rax) 1866; AVX-NEXT: movl $-2147483648, %eax # imm = 0x80000000 1867; AVX-NEXT: retq 1868; 1869; AVX512-LABEL: PR39256: 1870; AVX512: # %bb.0: # %entry 1871; AVX512-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero 1872; AVX512-NEXT: vucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1873; AVX512-NEXT: setb (%rax) 1874; AVX512-NEXT: movl $-2147483648, %eax # imm = 0x80000000 1875; AVX512-NEXT: retq 1876entry: 1877 %l = load float, ptr %ptr, !nontemporal !1 1878 %C = fcmp ult float %l, 0x36A0000000000000 1879 store i1 %C, ptr undef 1880 ret i32 -2147483648 1881} 1882 1883!1 = !{i32 1} 1884