1884 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE414; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX26; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512F7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512BW8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512VL9 10define <4 x float> @test_v4f32(ptr %src) {11; SSE2-LABEL: test_v4f32:12; SSE2: # %bb.0:13; SSE2-NEXT: movaps (%rdi), %xmm014; SSE2-NEXT: retq15;16; SSE41-LABEL: test_v4f32:17; SSE41: # %bb.0:18; SSE41-NEXT: movntdqa (%rdi), %xmm019; SSE41-NEXT: retq20;21; AVX-LABEL: test_v4f32:22; AVX: # %bb.0:23; AVX-NEXT: vmovntdqa (%rdi), %xmm024; AVX-NEXT: retq25;26; AVX512-LABEL: test_v4f32:27; AVX512: # %bb.0:28; AVX512-NEXT: vmovntdqa (%rdi), %xmm029; AVX512-NEXT: retq30 %1 = load <4 x float>, ptr %src, align 16, !nontemporal !131 ret <4 x float> %132}33 34define <4 x i32> @test_v4i32(ptr %src) {35; SSE2-LABEL: test_v4i32:36; SSE2: # %bb.0:37; SSE2-NEXT: movaps (%rdi), %xmm038; SSE2-NEXT: retq39;40; SSE41-LABEL: test_v4i32:41; SSE41: # %bb.0:42; SSE41-NEXT: movntdqa (%rdi), %xmm043; SSE41-NEXT: retq44;45; AVX-LABEL: test_v4i32:46; AVX: # %bb.0:47; AVX-NEXT: vmovntdqa (%rdi), %xmm048; AVX-NEXT: retq49;50; AVX512-LABEL: test_v4i32:51; AVX512: # %bb.0:52; AVX512-NEXT: vmovntdqa (%rdi), %xmm053; AVX512-NEXT: retq54 %1 = load <4 x i32>, ptr %src, align 16, !nontemporal !155 ret <4 x i32> %156}57 58define <2 x double> @test_v2f64(ptr %src) {59; SSE2-LABEL: test_v2f64:60; SSE2: # %bb.0:61; SSE2-NEXT: movaps (%rdi), %xmm062; SSE2-NEXT: retq63;64; SSE41-LABEL: test_v2f64:65; SSE41: # %bb.0:66; SSE41-NEXT: movntdqa (%rdi), %xmm067; SSE41-NEXT: retq68;69; AVX-LABEL: test_v2f64:70; AVX: # %bb.0:71; AVX-NEXT: vmovntdqa (%rdi), %xmm072; AVX-NEXT: retq73;74; AVX512-LABEL: test_v2f64:75; AVX512: # %bb.0:76; AVX512-NEXT: vmovntdqa (%rdi), %xmm077; AVX512-NEXT: retq78 %1 = load <2 x double>, ptr %src, align 16, !nontemporal !179 ret <2 x double> %180}81 82define <2 x i64> @test_v2i64(ptr %src) {83; SSE2-LABEL: test_v2i64:84; SSE2: # %bb.0:85; SSE2-NEXT: movaps (%rdi), %xmm086; SSE2-NEXT: retq87;88; SSE41-LABEL: test_v2i64:89; SSE41: # %bb.0:90; SSE41-NEXT: movntdqa (%rdi), %xmm091; SSE41-NEXT: retq92;93; AVX-LABEL: test_v2i64:94; AVX: # %bb.0:95; AVX-NEXT: vmovntdqa (%rdi), %xmm096; AVX-NEXT: retq97;98; AVX512-LABEL: test_v2i64:99; AVX512: # %bb.0:100; AVX512-NEXT: vmovntdqa (%rdi), %xmm0101; AVX512-NEXT: retq102 %1 = load <2 x i64>, ptr %src, align 16, !nontemporal !1103 ret <2 x i64> %1104}105 106define <8 x i16> @test_v8i16(ptr %src) {107; SSE2-LABEL: test_v8i16:108; SSE2: # %bb.0:109; SSE2-NEXT: movaps (%rdi), %xmm0110; SSE2-NEXT: retq111;112; SSE41-LABEL: test_v8i16:113; SSE41: # %bb.0:114; SSE41-NEXT: movntdqa (%rdi), %xmm0115; SSE41-NEXT: retq116;117; AVX-LABEL: test_v8i16:118; AVX: # %bb.0:119; AVX-NEXT: vmovntdqa (%rdi), %xmm0120; AVX-NEXT: retq121;122; AVX512-LABEL: test_v8i16:123; AVX512: # %bb.0:124; AVX512-NEXT: vmovntdqa (%rdi), %xmm0125; AVX512-NEXT: retq126 %1 = load <8 x i16>, ptr %src, align 16, !nontemporal !1127 ret <8 x i16> %1128}129 130define <16 x i8> @test_v16i8(ptr %src) {131; SSE2-LABEL: test_v16i8:132; SSE2: # %bb.0:133; SSE2-NEXT: movaps (%rdi), %xmm0134; SSE2-NEXT: retq135;136; SSE41-LABEL: test_v16i8:137; SSE41: # %bb.0:138; SSE41-NEXT: movntdqa (%rdi), %xmm0139; SSE41-NEXT: retq140;141; AVX-LABEL: test_v16i8:142; AVX: # %bb.0:143; AVX-NEXT: vmovntdqa (%rdi), %xmm0144; AVX-NEXT: retq145;146; AVX512-LABEL: test_v16i8:147; AVX512: # %bb.0:148; AVX512-NEXT: vmovntdqa (%rdi), %xmm0149; AVX512-NEXT: retq150 %1 = load <16 x i8>, ptr %src, align 16, !nontemporal !1151 ret <16 x i8> %1152}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), %xmm0160; SSE2-NEXT: movaps 16(%rdi), %xmm1161; SSE2-NEXT: retq162;163; SSE41-LABEL: test_v8f32:164; SSE41: # %bb.0:165; SSE41-NEXT: movntdqa (%rdi), %xmm0166; SSE41-NEXT: movntdqa 16(%rdi), %xmm1167; SSE41-NEXT: retq168;169; AVX1-LABEL: test_v8f32:170; AVX1: # %bb.0:171; AVX1-NEXT: vmovntdqa (%rdi), %xmm0172; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1173; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0174; AVX1-NEXT: retq175;176; AVX2-LABEL: test_v8f32:177; AVX2: # %bb.0:178; AVX2-NEXT: vmovntdqa (%rdi), %ymm0179; AVX2-NEXT: retq180;181; AVX512-LABEL: test_v8f32:182; AVX512: # %bb.0:183; AVX512-NEXT: vmovntdqa (%rdi), %ymm0184; AVX512-NEXT: retq185 %1 = load <8 x float>, ptr %src, align 32, !nontemporal !1186 ret <8 x float> %1187}188 189define <8 x i32> @test_v8i32(ptr %src) {190; SSE2-LABEL: test_v8i32:191; SSE2: # %bb.0:192; SSE2-NEXT: movaps (%rdi), %xmm0193; SSE2-NEXT: movaps 16(%rdi), %xmm1194; SSE2-NEXT: retq195;196; SSE41-LABEL: test_v8i32:197; SSE41: # %bb.0:198; SSE41-NEXT: movntdqa (%rdi), %xmm0199; SSE41-NEXT: movntdqa 16(%rdi), %xmm1200; SSE41-NEXT: retq201;202; AVX1-LABEL: test_v8i32:203; AVX1: # %bb.0:204; AVX1-NEXT: vmovntdqa (%rdi), %xmm0205; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1206; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0207; AVX1-NEXT: retq208;209; AVX2-LABEL: test_v8i32:210; AVX2: # %bb.0:211; AVX2-NEXT: vmovntdqa (%rdi), %ymm0212; AVX2-NEXT: retq213;214; AVX512-LABEL: test_v8i32:215; AVX512: # %bb.0:216; AVX512-NEXT: vmovntdqa (%rdi), %ymm0217; AVX512-NEXT: retq218 %1 = load <8 x i32>, ptr %src, align 32, !nontemporal !1219 ret <8 x i32> %1220}221 222define <4 x double> @test_v4f64(ptr %src) {223; SSE2-LABEL: test_v4f64:224; SSE2: # %bb.0:225; SSE2-NEXT: movaps (%rdi), %xmm0226; SSE2-NEXT: movaps 16(%rdi), %xmm1227; SSE2-NEXT: retq228;229; SSE41-LABEL: test_v4f64:230; SSE41: # %bb.0:231; SSE41-NEXT: movntdqa (%rdi), %xmm0232; SSE41-NEXT: movntdqa 16(%rdi), %xmm1233; SSE41-NEXT: retq234;235; AVX1-LABEL: test_v4f64:236; AVX1: # %bb.0:237; AVX1-NEXT: vmovntdqa (%rdi), %xmm0238; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1239; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0240; AVX1-NEXT: retq241;242; AVX2-LABEL: test_v4f64:243; AVX2: # %bb.0:244; AVX2-NEXT: vmovntdqa (%rdi), %ymm0245; AVX2-NEXT: retq246;247; AVX512-LABEL: test_v4f64:248; AVX512: # %bb.0:249; AVX512-NEXT: vmovntdqa (%rdi), %ymm0250; AVX512-NEXT: retq251 %1 = load <4 x double>, ptr %src, align 32, !nontemporal !1252 ret <4 x double> %1253}254 255define <4 x i64> @test_v4i64(ptr %src) {256; SSE2-LABEL: test_v4i64:257; SSE2: # %bb.0:258; SSE2-NEXT: movaps (%rdi), %xmm0259; SSE2-NEXT: movaps 16(%rdi), %xmm1260; SSE2-NEXT: retq261;262; SSE41-LABEL: test_v4i64:263; SSE41: # %bb.0:264; SSE41-NEXT: movntdqa (%rdi), %xmm0265; SSE41-NEXT: movntdqa 16(%rdi), %xmm1266; SSE41-NEXT: retq267;268; AVX1-LABEL: test_v4i64:269; AVX1: # %bb.0:270; AVX1-NEXT: vmovntdqa (%rdi), %xmm0271; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1272; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0273; AVX1-NEXT: retq274;275; AVX2-LABEL: test_v4i64:276; AVX2: # %bb.0:277; AVX2-NEXT: vmovntdqa (%rdi), %ymm0278; AVX2-NEXT: retq279;280; AVX512-LABEL: test_v4i64:281; AVX512: # %bb.0:282; AVX512-NEXT: vmovntdqa (%rdi), %ymm0283; AVX512-NEXT: retq284 %1 = load <4 x i64>, ptr %src, align 32, !nontemporal !1285 ret <4 x i64> %1286}287 288define <16 x i16> @test_v16i16(ptr %src) {289; SSE2-LABEL: test_v16i16:290; SSE2: # %bb.0:291; SSE2-NEXT: movaps (%rdi), %xmm0292; SSE2-NEXT: movaps 16(%rdi), %xmm1293; SSE2-NEXT: retq294;295; SSE41-LABEL: test_v16i16:296; SSE41: # %bb.0:297; SSE41-NEXT: movntdqa (%rdi), %xmm0298; SSE41-NEXT: movntdqa 16(%rdi), %xmm1299; SSE41-NEXT: retq300;301; AVX1-LABEL: test_v16i16:302; AVX1: # %bb.0:303; AVX1-NEXT: vmovntdqa (%rdi), %xmm0304; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1305; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0306; AVX1-NEXT: retq307;308; AVX2-LABEL: test_v16i16:309; AVX2: # %bb.0:310; AVX2-NEXT: vmovntdqa (%rdi), %ymm0311; AVX2-NEXT: retq312;313; AVX512-LABEL: test_v16i16:314; AVX512: # %bb.0:315; AVX512-NEXT: vmovntdqa (%rdi), %ymm0316; AVX512-NEXT: retq317 %1 = load <16 x i16>, ptr %src, align 32, !nontemporal !1318 ret <16 x i16> %1319}320 321define <32 x i8> @test_v32i8(ptr %src) {322; SSE2-LABEL: test_v32i8:323; SSE2: # %bb.0:324; SSE2-NEXT: movaps (%rdi), %xmm0325; SSE2-NEXT: movaps 16(%rdi), %xmm1326; SSE2-NEXT: retq327;328; SSE41-LABEL: test_v32i8:329; SSE41: # %bb.0:330; SSE41-NEXT: movntdqa (%rdi), %xmm0331; SSE41-NEXT: movntdqa 16(%rdi), %xmm1332; SSE41-NEXT: retq333;334; AVX1-LABEL: test_v32i8:335; AVX1: # %bb.0:336; AVX1-NEXT: vmovntdqa (%rdi), %xmm0337; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1338; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0339; AVX1-NEXT: retq340;341; AVX2-LABEL: test_v32i8:342; AVX2: # %bb.0:343; AVX2-NEXT: vmovntdqa (%rdi), %ymm0344; AVX2-NEXT: retq345;346; AVX512-LABEL: test_v32i8:347; AVX512: # %bb.0:348; AVX512-NEXT: vmovntdqa (%rdi), %ymm0349; AVX512-NEXT: retq350 %1 = load <32 x i8>, ptr %src, align 32, !nontemporal !1351 ret <32 x i8> %1352}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), %xmm0360; SSE2-NEXT: movaps 16(%rdi), %xmm1361; SSE2-NEXT: movaps 32(%rdi), %xmm2362; SSE2-NEXT: movaps 48(%rdi), %xmm3363; SSE2-NEXT: retq364;365; SSE41-LABEL: test_v16f32:366; SSE41: # %bb.0:367; SSE41-NEXT: movntdqa (%rdi), %xmm0368; SSE41-NEXT: movntdqa 16(%rdi), %xmm1369; SSE41-NEXT: movntdqa 32(%rdi), %xmm2370; SSE41-NEXT: movntdqa 48(%rdi), %xmm3371; SSE41-NEXT: retq372;373; AVX1-LABEL: test_v16f32:374; AVX1: # %bb.0:375; AVX1-NEXT: vmovntdqa (%rdi), %xmm0376; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1377; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0378; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm1379; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2380; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1381; AVX1-NEXT: retq382;383; AVX2-LABEL: test_v16f32:384; AVX2: # %bb.0:385; AVX2-NEXT: vmovntdqa (%rdi), %ymm0386; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1387; AVX2-NEXT: retq388;389; AVX512-LABEL: test_v16f32:390; AVX512: # %bb.0:391; AVX512-NEXT: vmovntdqa (%rdi), %zmm0392; AVX512-NEXT: retq393 %1 = load <16 x float>, ptr %src, align 64, !nontemporal !1394 ret <16 x float> %1395}396 397define <16 x i32> @test_v16i32(ptr %src) {398; SSE2-LABEL: test_v16i32:399; SSE2: # %bb.0:400; SSE2-NEXT: movaps (%rdi), %xmm0401; SSE2-NEXT: movaps 16(%rdi), %xmm1402; SSE2-NEXT: movaps 32(%rdi), %xmm2403; SSE2-NEXT: movaps 48(%rdi), %xmm3404; SSE2-NEXT: retq405;406; SSE41-LABEL: test_v16i32:407; SSE41: # %bb.0:408; SSE41-NEXT: movntdqa (%rdi), %xmm0409; SSE41-NEXT: movntdqa 16(%rdi), %xmm1410; SSE41-NEXT: movntdqa 32(%rdi), %xmm2411; SSE41-NEXT: movntdqa 48(%rdi), %xmm3412; SSE41-NEXT: retq413;414; AVX1-LABEL: test_v16i32:415; AVX1: # %bb.0:416; AVX1-NEXT: vmovntdqa (%rdi), %xmm0417; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1418; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0419; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm1420; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2421; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1422; AVX1-NEXT: retq423;424; AVX2-LABEL: test_v16i32:425; AVX2: # %bb.0:426; AVX2-NEXT: vmovntdqa (%rdi), %ymm0427; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1428; AVX2-NEXT: retq429;430; AVX512-LABEL: test_v16i32:431; AVX512: # %bb.0:432; AVX512-NEXT: vmovntdqa (%rdi), %zmm0433; AVX512-NEXT: retq434 %1 = load <16 x i32>, ptr %src, align 64, !nontemporal !1435 ret <16 x i32> %1436}437 438define <8 x double> @test_v8f64(ptr %src) {439; SSE2-LABEL: test_v8f64:440; SSE2: # %bb.0:441; SSE2-NEXT: movaps (%rdi), %xmm0442; SSE2-NEXT: movaps 16(%rdi), %xmm1443; SSE2-NEXT: movaps 32(%rdi), %xmm2444; SSE2-NEXT: movaps 48(%rdi), %xmm3445; SSE2-NEXT: retq446;447; SSE41-LABEL: test_v8f64:448; SSE41: # %bb.0:449; SSE41-NEXT: movntdqa (%rdi), %xmm0450; SSE41-NEXT: movntdqa 16(%rdi), %xmm1451; SSE41-NEXT: movntdqa 32(%rdi), %xmm2452; SSE41-NEXT: movntdqa 48(%rdi), %xmm3453; SSE41-NEXT: retq454;455; AVX1-LABEL: test_v8f64:456; AVX1: # %bb.0:457; AVX1-NEXT: vmovntdqa (%rdi), %xmm0458; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1459; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0460; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm1461; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2462; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1463; AVX1-NEXT: retq464;465; AVX2-LABEL: test_v8f64:466; AVX2: # %bb.0:467; AVX2-NEXT: vmovntdqa (%rdi), %ymm0468; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1469; AVX2-NEXT: retq470;471; AVX512-LABEL: test_v8f64:472; AVX512: # %bb.0:473; AVX512-NEXT: vmovntdqa (%rdi), %zmm0474; AVX512-NEXT: retq475 %1 = load <8 x double>, ptr %src, align 64, !nontemporal !1476 ret <8 x double> %1477}478 479define <8 x i64> @test_v8i64(ptr %src) {480; SSE2-LABEL: test_v8i64:481; SSE2: # %bb.0:482; SSE2-NEXT: movaps (%rdi), %xmm0483; SSE2-NEXT: movaps 16(%rdi), %xmm1484; SSE2-NEXT: movaps 32(%rdi), %xmm2485; SSE2-NEXT: movaps 48(%rdi), %xmm3486; SSE2-NEXT: retq487;488; SSE41-LABEL: test_v8i64:489; SSE41: # %bb.0:490; SSE41-NEXT: movntdqa (%rdi), %xmm0491; SSE41-NEXT: movntdqa 16(%rdi), %xmm1492; SSE41-NEXT: movntdqa 32(%rdi), %xmm2493; SSE41-NEXT: movntdqa 48(%rdi), %xmm3494; SSE41-NEXT: retq495;496; AVX1-LABEL: test_v8i64:497; AVX1: # %bb.0:498; AVX1-NEXT: vmovntdqa (%rdi), %xmm0499; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1500; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0501; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm1502; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2503; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1504; AVX1-NEXT: retq505;506; AVX2-LABEL: test_v8i64:507; AVX2: # %bb.0:508; AVX2-NEXT: vmovntdqa (%rdi), %ymm0509; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1510; AVX2-NEXT: retq511;512; AVX512-LABEL: test_v8i64:513; AVX512: # %bb.0:514; AVX512-NEXT: vmovntdqa (%rdi), %zmm0515; AVX512-NEXT: retq516 %1 = load <8 x i64>, ptr %src, align 64, !nontemporal !1517 ret <8 x i64> %1518}519 520define <32 x i16> @test_v32i16(ptr %src) {521; SSE2-LABEL: test_v32i16:522; SSE2: # %bb.0:523; SSE2-NEXT: movaps (%rdi), %xmm0524; SSE2-NEXT: movaps 16(%rdi), %xmm1525; SSE2-NEXT: movaps 32(%rdi), %xmm2526; SSE2-NEXT: movaps 48(%rdi), %xmm3527; SSE2-NEXT: retq528;529; SSE41-LABEL: test_v32i16:530; SSE41: # %bb.0:531; SSE41-NEXT: movntdqa (%rdi), %xmm0532; SSE41-NEXT: movntdqa 16(%rdi), %xmm1533; SSE41-NEXT: movntdqa 32(%rdi), %xmm2534; SSE41-NEXT: movntdqa 48(%rdi), %xmm3535; SSE41-NEXT: retq536;537; AVX1-LABEL: test_v32i16:538; AVX1: # %bb.0:539; AVX1-NEXT: vmovntdqa (%rdi), %xmm0540; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1541; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0542; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm1543; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2544; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1545; AVX1-NEXT: retq546;547; AVX2-LABEL: test_v32i16:548; AVX2: # %bb.0:549; AVX2-NEXT: vmovntdqa (%rdi), %ymm0550; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1551; AVX2-NEXT: retq552;553; AVX512-LABEL: test_v32i16:554; AVX512: # %bb.0:555; AVX512-NEXT: vmovntdqa (%rdi), %zmm0556; AVX512-NEXT: retq557 %1 = load <32 x i16>, ptr %src, align 64, !nontemporal !1558 ret <32 x i16> %1559}560 561define <64 x i8> @test_v64i8(ptr %src) {562; SSE2-LABEL: test_v64i8:563; SSE2: # %bb.0:564; SSE2-NEXT: movaps (%rdi), %xmm0565; SSE2-NEXT: movaps 16(%rdi), %xmm1566; SSE2-NEXT: movaps 32(%rdi), %xmm2567; SSE2-NEXT: movaps 48(%rdi), %xmm3568; SSE2-NEXT: retq569;570; SSE41-LABEL: test_v64i8:571; SSE41: # %bb.0:572; SSE41-NEXT: movntdqa (%rdi), %xmm0573; SSE41-NEXT: movntdqa 16(%rdi), %xmm1574; SSE41-NEXT: movntdqa 32(%rdi), %xmm2575; SSE41-NEXT: movntdqa 48(%rdi), %xmm3576; SSE41-NEXT: retq577;578; AVX1-LABEL: test_v64i8:579; AVX1: # %bb.0:580; AVX1-NEXT: vmovntdqa (%rdi), %xmm0581; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1582; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0583; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm1584; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm2585; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1586; AVX1-NEXT: retq587;588; AVX2-LABEL: test_v64i8:589; AVX2: # %bb.0:590; AVX2-NEXT: vmovntdqa (%rdi), %ymm0591; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm1592; AVX2-NEXT: retq593;594; AVX512-LABEL: test_v64i8:595; AVX512: # %bb.0:596; AVX512-NEXT: vmovntdqa (%rdi), %zmm0597; AVX512-NEXT: retq598 %1 = load <64 x i8>, ptr %src, align 64, !nontemporal !1599 ret <64 x i8> %1600}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), %xmm0609; SSE2-NEXT: retq610;611; SSE41-LABEL: test_arg_v4f32:612; SSE41: # %bb.0:613; SSE41-NEXT: movntdqa (%rdi), %xmm1614; SSE41-NEXT: addps %xmm1, %xmm0615; SSE41-NEXT: retq616;617; AVX-LABEL: test_arg_v4f32:618; AVX: # %bb.0:619; AVX-NEXT: vmovntdqa (%rdi), %xmm1620; AVX-NEXT: vaddps %xmm1, %xmm0, %xmm0621; AVX-NEXT: retq622;623; AVX512-LABEL: test_arg_v4f32:624; AVX512: # %bb.0:625; AVX512-NEXT: vmovntdqa (%rdi), %xmm1626; AVX512-NEXT: vaddps %xmm1, %xmm0, %xmm0627; AVX512-NEXT: retq628 %1 = load <4 x float>, ptr %src, align 16, !nontemporal !1629 %2 = fadd <4 x float> %arg, %1630 ret <4 x float> %2631}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), %xmm0637; SSE2-NEXT: retq638;639; SSE41-LABEL: test_arg_v4i32:640; SSE41: # %bb.0:641; SSE41-NEXT: movntdqa (%rdi), %xmm1642; SSE41-NEXT: paddd %xmm1, %xmm0643; SSE41-NEXT: retq644;645; AVX-LABEL: test_arg_v4i32:646; AVX: # %bb.0:647; AVX-NEXT: vmovntdqa (%rdi), %xmm1648; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm0649; AVX-NEXT: retq650;651; AVX512-LABEL: test_arg_v4i32:652; AVX512: # %bb.0:653; AVX512-NEXT: vmovntdqa (%rdi), %xmm1654; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm0655; AVX512-NEXT: retq656 %1 = load <4 x i32>, ptr %src, align 16, !nontemporal !1657 %2 = add <4 x i32> %arg, %1658 ret <4 x i32> %2659}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), %xmm0665; SSE2-NEXT: retq666;667; SSE41-LABEL: test_arg_v2f64:668; SSE41: # %bb.0:669; SSE41-NEXT: movntdqa (%rdi), %xmm1670; SSE41-NEXT: addpd %xmm1, %xmm0671; SSE41-NEXT: retq672;673; AVX-LABEL: test_arg_v2f64:674; AVX: # %bb.0:675; AVX-NEXT: vmovntdqa (%rdi), %xmm1676; AVX-NEXT: vaddpd %xmm1, %xmm0, %xmm0677; AVX-NEXT: retq678;679; AVX512-LABEL: test_arg_v2f64:680; AVX512: # %bb.0:681; AVX512-NEXT: vmovntdqa (%rdi), %xmm1682; AVX512-NEXT: vaddpd %xmm1, %xmm0, %xmm0683; AVX512-NEXT: retq684 %1 = load <2 x double>, ptr %src, align 16, !nontemporal !1685 %2 = fadd <2 x double> %arg, %1686 ret <2 x double> %2687}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), %xmm0693; SSE2-NEXT: retq694;695; SSE41-LABEL: test_arg_v2i64:696; SSE41: # %bb.0:697; SSE41-NEXT: movntdqa (%rdi), %xmm1698; SSE41-NEXT: paddq %xmm1, %xmm0699; SSE41-NEXT: retq700;701; AVX-LABEL: test_arg_v2i64:702; AVX: # %bb.0:703; AVX-NEXT: vmovntdqa (%rdi), %xmm1704; AVX-NEXT: vpaddq %xmm1, %xmm0, %xmm0705; AVX-NEXT: retq706;707; AVX512-LABEL: test_arg_v2i64:708; AVX512: # %bb.0:709; AVX512-NEXT: vmovntdqa (%rdi), %xmm1710; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm0711; AVX512-NEXT: retq712 %1 = load <2 x i64>, ptr %src, align 16, !nontemporal !1713 %2 = add <2 x i64> %arg, %1714 ret <2 x i64> %2715}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), %xmm0721; SSE2-NEXT: retq722;723; SSE41-LABEL: test_arg_v8i16:724; SSE41: # %bb.0:725; SSE41-NEXT: movntdqa (%rdi), %xmm1726; SSE41-NEXT: paddw %xmm1, %xmm0727; SSE41-NEXT: retq728;729; AVX-LABEL: test_arg_v8i16:730; AVX: # %bb.0:731; AVX-NEXT: vmovntdqa (%rdi), %xmm1732; AVX-NEXT: vpaddw %xmm1, %xmm0, %xmm0733; AVX-NEXT: retq734;735; AVX512-LABEL: test_arg_v8i16:736; AVX512: # %bb.0:737; AVX512-NEXT: vmovntdqa (%rdi), %xmm1738; AVX512-NEXT: vpaddw %xmm1, %xmm0, %xmm0739; AVX512-NEXT: retq740 %1 = load <8 x i16>, ptr %src, align 16, !nontemporal !1741 %2 = add <8 x i16> %arg, %1742 ret <8 x i16> %2743}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), %xmm0749; SSE2-NEXT: retq750;751; SSE41-LABEL: test_arg_v16i8:752; SSE41: # %bb.0:753; SSE41-NEXT: movntdqa (%rdi), %xmm1754; SSE41-NEXT: paddb %xmm1, %xmm0755; SSE41-NEXT: retq756;757; AVX-LABEL: test_arg_v16i8:758; AVX: # %bb.0:759; AVX-NEXT: vmovntdqa (%rdi), %xmm1760; AVX-NEXT: vpaddb %xmm1, %xmm0, %xmm0761; AVX-NEXT: retq762;763; AVX512-LABEL: test_arg_v16i8:764; AVX512: # %bb.0:765; AVX512-NEXT: vmovntdqa (%rdi), %xmm1766; AVX512-NEXT: vpaddb %xmm1, %xmm0, %xmm0767; AVX512-NEXT: retq768 %1 = load <16 x i8>, ptr %src, align 16, !nontemporal !1769 %2 = add <16 x i8> %arg, %1770 ret <16 x i8> %2771}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), %xmm0779; SSE2-NEXT: addps 16(%rdi), %xmm1780; SSE2-NEXT: retq781;782; SSE41-LABEL: test_arg_v8f32:783; SSE41: # %bb.0:784; SSE41-NEXT: movntdqa 16(%rdi), %xmm2785; SSE41-NEXT: movntdqa (%rdi), %xmm3786; SSE41-NEXT: addps %xmm3, %xmm0787; SSE41-NEXT: addps %xmm2, %xmm1788; SSE41-NEXT: retq789;790; AVX1-LABEL: test_arg_v8f32:791; AVX1: # %bb.0:792; AVX1-NEXT: vmovntdqa (%rdi), %xmm1793; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm2794; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1795; AVX1-NEXT: vaddps %ymm1, %ymm0, %ymm0796; AVX1-NEXT: retq797;798; AVX2-LABEL: test_arg_v8f32:799; AVX2: # %bb.0:800; AVX2-NEXT: vmovntdqa (%rdi), %ymm1801; AVX2-NEXT: vaddps %ymm1, %ymm0, %ymm0802; AVX2-NEXT: retq803;804; AVX512-LABEL: test_arg_v8f32:805; AVX512: # %bb.0:806; AVX512-NEXT: vmovntdqa (%rdi), %ymm1807; AVX512-NEXT: vaddps %ymm1, %ymm0, %ymm0808; AVX512-NEXT: retq809 %1 = load <8 x float>, ptr %src, align 32, !nontemporal !1810 %2 = fadd <8 x float> %arg, %1811 ret <8 x float> %2812}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), %xmm0818; SSE2-NEXT: paddd 16(%rdi), %xmm1819; SSE2-NEXT: retq820;821; SSE41-LABEL: test_arg_v8i32:822; SSE41: # %bb.0:823; SSE41-NEXT: movntdqa 16(%rdi), %xmm2824; SSE41-NEXT: movntdqa (%rdi), %xmm3825; SSE41-NEXT: paddd %xmm3, %xmm0826; SSE41-NEXT: paddd %xmm2, %xmm1827; SSE41-NEXT: retq828;829; AVX1-LABEL: test_arg_v8i32:830; AVX1: # %bb.0:831; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1832; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2833; AVX1-NEXT: vpaddd %xmm1, %xmm2, %xmm1834; AVX1-NEXT: vmovntdqa (%rdi), %xmm2835; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm0836; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0837; AVX1-NEXT: retq838;839; AVX2-LABEL: test_arg_v8i32:840; AVX2: # %bb.0:841; AVX2-NEXT: vmovntdqa (%rdi), %ymm1842; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0843; AVX2-NEXT: retq844;845; AVX512-LABEL: test_arg_v8i32:846; AVX512: # %bb.0:847; AVX512-NEXT: vmovntdqa (%rdi), %ymm1848; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm0849; AVX512-NEXT: retq850 %1 = load <8 x i32>, ptr %src, align 32, !nontemporal !1851 %2 = add <8 x i32> %arg, %1852 ret <8 x i32> %2853}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), %xmm0859; SSE2-NEXT: addpd 16(%rdi), %xmm1860; SSE2-NEXT: retq861;862; SSE41-LABEL: test_arg_v4f64:863; SSE41: # %bb.0:864; SSE41-NEXT: movntdqa 16(%rdi), %xmm2865; SSE41-NEXT: movntdqa (%rdi), %xmm3866; SSE41-NEXT: addpd %xmm3, %xmm0867; SSE41-NEXT: addpd %xmm2, %xmm1868; SSE41-NEXT: retq869;870; AVX1-LABEL: test_arg_v4f64:871; AVX1: # %bb.0:872; AVX1-NEXT: vmovntdqa (%rdi), %xmm1873; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm2874; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1875; AVX1-NEXT: vaddpd %ymm1, %ymm0, %ymm0876; AVX1-NEXT: retq877;878; AVX2-LABEL: test_arg_v4f64:879; AVX2: # %bb.0:880; AVX2-NEXT: vmovntdqa (%rdi), %ymm1881; AVX2-NEXT: vaddpd %ymm1, %ymm0, %ymm0882; AVX2-NEXT: retq883;884; AVX512-LABEL: test_arg_v4f64:885; AVX512: # %bb.0:886; AVX512-NEXT: vmovntdqa (%rdi), %ymm1887; AVX512-NEXT: vaddpd %ymm1, %ymm0, %ymm0888; AVX512-NEXT: retq889 %1 = load <4 x double>, ptr %src, align 32, !nontemporal !1890 %2 = fadd <4 x double> %arg, %1891 ret <4 x double> %2892}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), %xmm0898; SSE2-NEXT: paddq 16(%rdi), %xmm1899; SSE2-NEXT: retq900;901; SSE41-LABEL: test_arg_v4i64:902; SSE41: # %bb.0:903; SSE41-NEXT: movntdqa 16(%rdi), %xmm2904; SSE41-NEXT: movntdqa (%rdi), %xmm3905; SSE41-NEXT: paddq %xmm3, %xmm0906; SSE41-NEXT: paddq %xmm2, %xmm1907; SSE41-NEXT: retq908;909; AVX1-LABEL: test_arg_v4i64:910; AVX1: # %bb.0:911; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1912; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2913; AVX1-NEXT: vpaddq %xmm1, %xmm2, %xmm1914; AVX1-NEXT: vmovntdqa (%rdi), %xmm2915; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm0916; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0917; AVX1-NEXT: retq918;919; AVX2-LABEL: test_arg_v4i64:920; AVX2: # %bb.0:921; AVX2-NEXT: vmovntdqa (%rdi), %ymm1922; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0923; AVX2-NEXT: retq924;925; AVX512-LABEL: test_arg_v4i64:926; AVX512: # %bb.0:927; AVX512-NEXT: vmovntdqa (%rdi), %ymm1928; AVX512-NEXT: vpaddq %ymm1, %ymm0, %ymm0929; AVX512-NEXT: retq930 %1 = load <4 x i64>, ptr %src, align 32, !nontemporal !1931 %2 = add <4 x i64> %arg, %1932 ret <4 x i64> %2933}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), %xmm0939; SSE2-NEXT: paddw 16(%rdi), %xmm1940; SSE2-NEXT: retq941;942; SSE41-LABEL: test_arg_v16i16:943; SSE41: # %bb.0:944; SSE41-NEXT: movntdqa 16(%rdi), %xmm2945; SSE41-NEXT: movntdqa (%rdi), %xmm3946; SSE41-NEXT: paddw %xmm3, %xmm0947; SSE41-NEXT: paddw %xmm2, %xmm1948; SSE41-NEXT: retq949;950; AVX1-LABEL: test_arg_v16i16:951; AVX1: # %bb.0:952; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1953; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2954; AVX1-NEXT: vpaddw %xmm1, %xmm2, %xmm1955; AVX1-NEXT: vmovntdqa (%rdi), %xmm2956; AVX1-NEXT: vpaddw %xmm2, %xmm0, %xmm0957; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0958; AVX1-NEXT: retq959;960; AVX2-LABEL: test_arg_v16i16:961; AVX2: # %bb.0:962; AVX2-NEXT: vmovntdqa (%rdi), %ymm1963; AVX2-NEXT: vpaddw %ymm1, %ymm0, %ymm0964; AVX2-NEXT: retq965;966; AVX512-LABEL: test_arg_v16i16:967; AVX512: # %bb.0:968; AVX512-NEXT: vmovntdqa (%rdi), %ymm1969; AVX512-NEXT: vpaddw %ymm1, %ymm0, %ymm0970; AVX512-NEXT: retq971 %1 = load <16 x i16>, ptr %src, align 32, !nontemporal !1972 %2 = add <16 x i16> %arg, %1973 ret <16 x i16> %2974}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), %xmm0980; SSE2-NEXT: paddb 16(%rdi), %xmm1981; SSE2-NEXT: retq982;983; SSE41-LABEL: test_arg_v32i8:984; SSE41: # %bb.0:985; SSE41-NEXT: movntdqa 16(%rdi), %xmm2986; SSE41-NEXT: movntdqa (%rdi), %xmm3987; SSE41-NEXT: paddb %xmm3, %xmm0988; SSE41-NEXT: paddb %xmm2, %xmm1989; SSE41-NEXT: retq990;991; AVX1-LABEL: test_arg_v32i8:992; AVX1: # %bb.0:993; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm1994; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2995; AVX1-NEXT: vpaddb %xmm1, %xmm2, %xmm1996; AVX1-NEXT: vmovntdqa (%rdi), %xmm2997; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0998; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0999; AVX1-NEXT: retq1000;1001; AVX2-LABEL: test_arg_v32i8:1002; AVX2: # %bb.0:1003; AVX2-NEXT: vmovntdqa (%rdi), %ymm11004; AVX2-NEXT: vpaddb %ymm1, %ymm0, %ymm01005; AVX2-NEXT: retq1006;1007; AVX512-LABEL: test_arg_v32i8:1008; AVX512: # %bb.0:1009; AVX512-NEXT: vmovntdqa (%rdi), %ymm11010; AVX512-NEXT: vpaddb %ymm1, %ymm0, %ymm01011; AVX512-NEXT: retq1012 %1 = load <32 x i8>, ptr %src, align 32, !nontemporal !11013 %2 = add <32 x i8> %arg, %11014 ret <32 x i8> %21015}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), %xmm01023; SSE2-NEXT: addps 16(%rdi), %xmm11024; SSE2-NEXT: addps 32(%rdi), %xmm21025; SSE2-NEXT: addps 48(%rdi), %xmm31026; SSE2-NEXT: retq1027;1028; SSE41-LABEL: test_arg_v16f32:1029; SSE41: # %bb.0:1030; SSE41-NEXT: movntdqa 48(%rdi), %xmm41031; SSE41-NEXT: movntdqa 32(%rdi), %xmm51032; SSE41-NEXT: movntdqa 16(%rdi), %xmm61033; SSE41-NEXT: movntdqa (%rdi), %xmm71034; SSE41-NEXT: addps %xmm7, %xmm01035; SSE41-NEXT: addps %xmm6, %xmm11036; SSE41-NEXT: addps %xmm5, %xmm21037; SSE41-NEXT: addps %xmm4, %xmm31038; SSE41-NEXT: retq1039;1040; AVX1-LABEL: test_arg_v16f32:1041; AVX1: # %bb.0:1042; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm21043; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm31044; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm21045; AVX1-NEXT: vmovntdqa (%rdi), %xmm31046; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm41047; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm31048; AVX1-NEXT: vaddps %ymm3, %ymm0, %ymm01049; AVX1-NEXT: vaddps %ymm2, %ymm1, %ymm11050; AVX1-NEXT: retq1051;1052; AVX2-LABEL: test_arg_v16f32:1053; AVX2: # %bb.0:1054; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm21055; AVX2-NEXT: vmovntdqa (%rdi), %ymm31056; AVX2-NEXT: vaddps %ymm3, %ymm0, %ymm01057; AVX2-NEXT: vaddps %ymm2, %ymm1, %ymm11058; AVX2-NEXT: retq1059;1060; AVX512-LABEL: test_arg_v16f32:1061; AVX512: # %bb.0:1062; AVX512-NEXT: vmovntdqa (%rdi), %zmm11063; AVX512-NEXT: vaddps %zmm1, %zmm0, %zmm01064; AVX512-NEXT: retq1065 %1 = load <16 x float>, ptr %src, align 64, !nontemporal !11066 %2 = fadd <16 x float> %arg, %11067 ret <16 x float> %21068}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), %xmm01074; SSE2-NEXT: paddd 16(%rdi), %xmm11075; SSE2-NEXT: paddd 32(%rdi), %xmm21076; SSE2-NEXT: paddd 48(%rdi), %xmm31077; SSE2-NEXT: retq1078;1079; SSE41-LABEL: test_arg_v16i32:1080; SSE41: # %bb.0:1081; SSE41-NEXT: movntdqa 48(%rdi), %xmm41082; SSE41-NEXT: movntdqa 32(%rdi), %xmm51083; SSE41-NEXT: movntdqa 16(%rdi), %xmm61084; SSE41-NEXT: movntdqa (%rdi), %xmm71085; SSE41-NEXT: paddd %xmm7, %xmm01086; SSE41-NEXT: paddd %xmm6, %xmm11087; SSE41-NEXT: paddd %xmm5, %xmm21088; SSE41-NEXT: paddd %xmm4, %xmm31089; SSE41-NEXT: retq1090;1091; AVX1-LABEL: test_arg_v16i32:1092; AVX1: # %bb.0:1093; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm21094; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31095; AVX1-NEXT: vpaddd %xmm2, %xmm3, %xmm21096; AVX1-NEXT: vmovntdqa (%rdi), %xmm31097; AVX1-NEXT: vpaddd %xmm3, %xmm0, %xmm01098; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01099; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm21100; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm31101; AVX1-NEXT: vpaddd %xmm2, %xmm3, %xmm21102; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm31103; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm11104; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm11105; AVX1-NEXT: retq1106;1107; AVX2-LABEL: test_arg_v16i32:1108; AVX2: # %bb.0:1109; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm21110; AVX2-NEXT: vmovntdqa (%rdi), %ymm31111; AVX2-NEXT: vpaddd %ymm3, %ymm0, %ymm01112; AVX2-NEXT: vpaddd %ymm2, %ymm1, %ymm11113; AVX2-NEXT: retq1114;1115; AVX512-LABEL: test_arg_v16i32:1116; AVX512: # %bb.0:1117; AVX512-NEXT: vmovntdqa (%rdi), %zmm11118; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm01119; AVX512-NEXT: retq1120 %1 = load <16 x i32>, ptr %src, align 64, !nontemporal !11121 %2 = add <16 x i32> %arg, %11122 ret <16 x i32> %21123}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), %xmm01129; SSE2-NEXT: addpd 16(%rdi), %xmm11130; SSE2-NEXT: addpd 32(%rdi), %xmm21131; SSE2-NEXT: addpd 48(%rdi), %xmm31132; SSE2-NEXT: retq1133;1134; SSE41-LABEL: test_arg_v8f64:1135; SSE41: # %bb.0:1136; SSE41-NEXT: movntdqa 48(%rdi), %xmm41137; SSE41-NEXT: movntdqa 32(%rdi), %xmm51138; SSE41-NEXT: movntdqa 16(%rdi), %xmm61139; SSE41-NEXT: movntdqa (%rdi), %xmm71140; SSE41-NEXT: addpd %xmm7, %xmm01141; SSE41-NEXT: addpd %xmm6, %xmm11142; SSE41-NEXT: addpd %xmm5, %xmm21143; SSE41-NEXT: addpd %xmm4, %xmm31144; SSE41-NEXT: retq1145;1146; AVX1-LABEL: test_arg_v8f64:1147; AVX1: # %bb.0:1148; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm21149; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm31150; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm21151; AVX1-NEXT: vmovntdqa (%rdi), %xmm31152; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm41153; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm31154; AVX1-NEXT: vaddpd %ymm3, %ymm0, %ymm01155; AVX1-NEXT: vaddpd %ymm2, %ymm1, %ymm11156; AVX1-NEXT: retq1157;1158; AVX2-LABEL: test_arg_v8f64:1159; AVX2: # %bb.0:1160; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm21161; AVX2-NEXT: vmovntdqa (%rdi), %ymm31162; AVX2-NEXT: vaddpd %ymm3, %ymm0, %ymm01163; AVX2-NEXT: vaddpd %ymm2, %ymm1, %ymm11164; AVX2-NEXT: retq1165;1166; AVX512-LABEL: test_arg_v8f64:1167; AVX512: # %bb.0:1168; AVX512-NEXT: vmovntdqa (%rdi), %zmm11169; AVX512-NEXT: vaddpd %zmm1, %zmm0, %zmm01170; AVX512-NEXT: retq1171 %1 = load <8 x double>, ptr %src, align 64, !nontemporal !11172 %2 = fadd <8 x double> %arg, %11173 ret <8 x double> %21174}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), %xmm01180; SSE2-NEXT: paddq 16(%rdi), %xmm11181; SSE2-NEXT: paddq 32(%rdi), %xmm21182; SSE2-NEXT: paddq 48(%rdi), %xmm31183; SSE2-NEXT: retq1184;1185; SSE41-LABEL: test_arg_v8i64:1186; SSE41: # %bb.0:1187; SSE41-NEXT: movntdqa 48(%rdi), %xmm41188; SSE41-NEXT: movntdqa 32(%rdi), %xmm51189; SSE41-NEXT: movntdqa 16(%rdi), %xmm61190; SSE41-NEXT: movntdqa (%rdi), %xmm71191; SSE41-NEXT: paddq %xmm7, %xmm01192; SSE41-NEXT: paddq %xmm6, %xmm11193; SSE41-NEXT: paddq %xmm5, %xmm21194; SSE41-NEXT: paddq %xmm4, %xmm31195; SSE41-NEXT: retq1196;1197; AVX1-LABEL: test_arg_v8i64:1198; AVX1: # %bb.0:1199; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm21200; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31201; AVX1-NEXT: vpaddq %xmm2, %xmm3, %xmm21202; AVX1-NEXT: vmovntdqa (%rdi), %xmm31203; AVX1-NEXT: vpaddq %xmm3, %xmm0, %xmm01204; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01205; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm21206; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm31207; AVX1-NEXT: vpaddq %xmm2, %xmm3, %xmm21208; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm31209; AVX1-NEXT: vpaddq %xmm3, %xmm1, %xmm11210; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm11211; AVX1-NEXT: retq1212;1213; AVX2-LABEL: test_arg_v8i64:1214; AVX2: # %bb.0:1215; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm21216; AVX2-NEXT: vmovntdqa (%rdi), %ymm31217; AVX2-NEXT: vpaddq %ymm3, %ymm0, %ymm01218; AVX2-NEXT: vpaddq %ymm2, %ymm1, %ymm11219; AVX2-NEXT: retq1220;1221; AVX512-LABEL: test_arg_v8i64:1222; AVX512: # %bb.0:1223; AVX512-NEXT: vmovntdqa (%rdi), %zmm11224; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm01225; AVX512-NEXT: retq1226 %1 = load <8 x i64>, ptr %src, align 64, !nontemporal !11227 %2 = add <8 x i64> %arg, %11228 ret <8 x i64> %21229}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), %xmm01235; SSE2-NEXT: paddw 16(%rdi), %xmm11236; SSE2-NEXT: paddw 32(%rdi), %xmm21237; SSE2-NEXT: paddw 48(%rdi), %xmm31238; SSE2-NEXT: retq1239;1240; SSE41-LABEL: test_arg_v32i16:1241; SSE41: # %bb.0:1242; SSE41-NEXT: movntdqa 48(%rdi), %xmm41243; SSE41-NEXT: movntdqa 32(%rdi), %xmm51244; SSE41-NEXT: movntdqa 16(%rdi), %xmm61245; SSE41-NEXT: movntdqa (%rdi), %xmm71246; SSE41-NEXT: paddw %xmm7, %xmm01247; SSE41-NEXT: paddw %xmm6, %xmm11248; SSE41-NEXT: paddw %xmm5, %xmm21249; SSE41-NEXT: paddw %xmm4, %xmm31250; SSE41-NEXT: retq1251;1252; AVX1-LABEL: test_arg_v32i16:1253; AVX1: # %bb.0:1254; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm21255; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31256; AVX1-NEXT: vpaddw %xmm2, %xmm3, %xmm21257; AVX1-NEXT: vmovntdqa (%rdi), %xmm31258; AVX1-NEXT: vpaddw %xmm3, %xmm0, %xmm01259; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01260; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm21261; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm31262; AVX1-NEXT: vpaddw %xmm2, %xmm3, %xmm21263; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm31264; AVX1-NEXT: vpaddw %xmm3, %xmm1, %xmm11265; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm11266; AVX1-NEXT: retq1267;1268; AVX2-LABEL: test_arg_v32i16:1269; AVX2: # %bb.0:1270; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm21271; AVX2-NEXT: vmovntdqa (%rdi), %ymm31272; AVX2-NEXT: vpaddw %ymm3, %ymm0, %ymm01273; AVX2-NEXT: vpaddw %ymm2, %ymm1, %ymm11274; AVX2-NEXT: retq1275;1276; AVX512F-LABEL: test_arg_v32i16:1277; AVX512F: # %bb.0:1278; AVX512F-NEXT: vmovntdqa 32(%rdi), %ymm11279; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm21280; AVX512F-NEXT: vpaddw %ymm1, %ymm2, %ymm11281; AVX512F-NEXT: vmovntdqa (%rdi), %ymm21282; AVX512F-NEXT: vpaddw %ymm2, %ymm0, %ymm01283; AVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm01284; AVX512F-NEXT: retq1285;1286; AVX512BW-LABEL: test_arg_v32i16:1287; AVX512BW: # %bb.0:1288; AVX512BW-NEXT: vmovntdqa (%rdi), %zmm11289; AVX512BW-NEXT: vpaddw %zmm1, %zmm0, %zmm01290; AVX512BW-NEXT: retq1291;1292; AVX512VL-LABEL: test_arg_v32i16:1293; AVX512VL: # %bb.0:1294; AVX512VL-NEXT: vmovntdqa 32(%rdi), %ymm11295; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm21296; AVX512VL-NEXT: vpaddw %ymm1, %ymm2, %ymm11297; AVX512VL-NEXT: vmovntdqa (%rdi), %ymm21298; AVX512VL-NEXT: vpaddw %ymm2, %ymm0, %ymm01299; AVX512VL-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm01300; AVX512VL-NEXT: retq1301 %1 = load <32 x i16>, ptr %src, align 64, !nontemporal !11302 %2 = add <32 x i16> %arg, %11303 ret <32 x i16> %21304}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), %xmm01310; SSE2-NEXT: paddb 16(%rdi), %xmm11311; SSE2-NEXT: paddb 32(%rdi), %xmm21312; SSE2-NEXT: paddb 48(%rdi), %xmm31313; SSE2-NEXT: retq1314;1315; SSE41-LABEL: test_arg_v64i8:1316; SSE41: # %bb.0:1317; SSE41-NEXT: movntdqa 48(%rdi), %xmm41318; SSE41-NEXT: movntdqa 32(%rdi), %xmm51319; SSE41-NEXT: movntdqa 16(%rdi), %xmm61320; SSE41-NEXT: movntdqa (%rdi), %xmm71321; SSE41-NEXT: paddb %xmm7, %xmm01322; SSE41-NEXT: paddb %xmm6, %xmm11323; SSE41-NEXT: paddb %xmm5, %xmm21324; SSE41-NEXT: paddb %xmm4, %xmm31325; SSE41-NEXT: retq1326;1327; AVX1-LABEL: test_arg_v64i8:1328; AVX1: # %bb.0:1329; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm21330; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31331; AVX1-NEXT: vpaddb %xmm2, %xmm3, %xmm21332; AVX1-NEXT: vmovntdqa (%rdi), %xmm31333; AVX1-NEXT: vpaddb %xmm3, %xmm0, %xmm01334; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01335; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm21336; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm31337; AVX1-NEXT: vpaddb %xmm2, %xmm3, %xmm21338; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm31339; AVX1-NEXT: vpaddb %xmm3, %xmm1, %xmm11340; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm11341; AVX1-NEXT: retq1342;1343; AVX2-LABEL: test_arg_v64i8:1344; AVX2: # %bb.0:1345; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm21346; AVX2-NEXT: vmovntdqa (%rdi), %ymm31347; AVX2-NEXT: vpaddb %ymm3, %ymm0, %ymm01348; AVX2-NEXT: vpaddb %ymm2, %ymm1, %ymm11349; AVX2-NEXT: retq1350;1351; AVX512F-LABEL: test_arg_v64i8:1352; AVX512F: # %bb.0:1353; AVX512F-NEXT: vmovntdqa 32(%rdi), %ymm11354; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm21355; AVX512F-NEXT: vpaddb %ymm1, %ymm2, %ymm11356; AVX512F-NEXT: vmovntdqa (%rdi), %ymm21357; AVX512F-NEXT: vpaddb %ymm2, %ymm0, %ymm01358; AVX512F-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm01359; AVX512F-NEXT: retq1360;1361; AVX512BW-LABEL: test_arg_v64i8:1362; AVX512BW: # %bb.0:1363; AVX512BW-NEXT: vmovntdqa (%rdi), %zmm11364; AVX512BW-NEXT: vpaddb %zmm1, %zmm0, %zmm01365; AVX512BW-NEXT: retq1366;1367; AVX512VL-LABEL: test_arg_v64i8:1368; AVX512VL: # %bb.0:1369; AVX512VL-NEXT: vmovntdqa 32(%rdi), %ymm11370; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm21371; AVX512VL-NEXT: vpaddb %ymm1, %ymm2, %ymm11372; AVX512VL-NEXT: vmovntdqa (%rdi), %ymm21373; AVX512VL-NEXT: vpaddb %ymm2, %ymm0, %ymm01374; AVX512VL-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm01375; AVX512VL-NEXT: retq1376 %1 = load <64 x i8>, ptr %src, align 64, !nontemporal !11377 %2 = add <64 x i8> %arg, %11378 ret <64 x i8> %21379}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), %xmm01388; SSE-NEXT: retq1389;1390; AVX-LABEL: test_unaligned_v4f32:1391; AVX: # %bb.0:1392; AVX-NEXT: vmovups (%rdi), %xmm01393; AVX-NEXT: retq1394;1395; AVX512-LABEL: test_unaligned_v4f32:1396; AVX512: # %bb.0:1397; AVX512-NEXT: vmovups (%rdi), %xmm01398; AVX512-NEXT: retq1399 %1 = load <4 x float>, ptr %src, align 1, !nontemporal !11400 ret <4 x float> %11401}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), %xmm01407; SSE-NEXT: retq1408;1409; AVX-LABEL: test_unaligned_v4i32:1410; AVX: # %bb.0:1411; AVX-NEXT: vmovups (%rdi), %xmm01412; AVX-NEXT: retq1413;1414; AVX512-LABEL: test_unaligned_v4i32:1415; AVX512: # %bb.0:1416; AVX512-NEXT: vmovups (%rdi), %xmm01417; AVX512-NEXT: retq1418 %1 = load <4 x i32>, ptr %src, align 1, !nontemporal !11419 ret <4 x i32> %11420}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), %xmm01426; SSE-NEXT: retq1427;1428; AVX-LABEL: test_unaligned_v2f64:1429; AVX: # %bb.0:1430; AVX-NEXT: vmovups (%rdi), %xmm01431; AVX-NEXT: retq1432;1433; AVX512-LABEL: test_unaligned_v2f64:1434; AVX512: # %bb.0:1435; AVX512-NEXT: vmovups (%rdi), %xmm01436; AVX512-NEXT: retq1437 %1 = load <2 x double>, ptr %src, align 1, !nontemporal !11438 ret <2 x double> %11439}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), %xmm01445; SSE-NEXT: retq1446;1447; AVX-LABEL: test_unaligned_v2i64:1448; AVX: # %bb.0:1449; AVX-NEXT: vmovups (%rdi), %xmm01450; AVX-NEXT: retq1451;1452; AVX512-LABEL: test_unaligned_v2i64:1453; AVX512: # %bb.0:1454; AVX512-NEXT: vmovups (%rdi), %xmm01455; AVX512-NEXT: retq1456 %1 = load <2 x i64>, ptr %src, align 1, !nontemporal !11457 ret <2 x i64> %11458}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), %xmm01464; SSE-NEXT: retq1465;1466; AVX-LABEL: test_unaligned_v8i16:1467; AVX: # %bb.0:1468; AVX-NEXT: vmovups (%rdi), %xmm01469; AVX-NEXT: retq1470;1471; AVX512-LABEL: test_unaligned_v8i16:1472; AVX512: # %bb.0:1473; AVX512-NEXT: vmovups (%rdi), %xmm01474; AVX512-NEXT: retq1475 %1 = load <8 x i16>, ptr %src, align 1, !nontemporal !11476 ret <8 x i16> %11477}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), %xmm01483; SSE-NEXT: retq1484;1485; AVX-LABEL: test_unaligned_v16i8:1486; AVX: # %bb.0:1487; AVX-NEXT: vmovups (%rdi), %xmm01488; AVX-NEXT: retq1489;1490; AVX512-LABEL: test_unaligned_v16i8:1491; AVX512: # %bb.0:1492; AVX512-NEXT: vmovups (%rdi), %xmm01493; AVX512-NEXT: retq1494 %1 = load <16 x i8>, ptr %src, align 1, !nontemporal !11495 ret <16 x i8> %11496}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), %xmm01504; SSE-NEXT: movups 16(%rdi), %xmm11505; SSE-NEXT: retq1506;1507; AVX-LABEL: test_unaligned_v8f32:1508; AVX: # %bb.0:1509; AVX-NEXT: vmovups (%rdi), %ymm01510; AVX-NEXT: retq1511;1512; AVX512-LABEL: test_unaligned_v8f32:1513; AVX512: # %bb.0:1514; AVX512-NEXT: vmovups (%rdi), %ymm01515; AVX512-NEXT: retq1516 %1 = load <8 x float>, ptr %src, align 1, !nontemporal !11517 ret <8 x float> %11518}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), %xmm01524; SSE-NEXT: movups 16(%rdi), %xmm11525; SSE-NEXT: retq1526;1527; AVX-LABEL: test_unaligned_v8i32:1528; AVX: # %bb.0:1529; AVX-NEXT: vmovups (%rdi), %ymm01530; AVX-NEXT: retq1531;1532; AVX512-LABEL: test_unaligned_v8i32:1533; AVX512: # %bb.0:1534; AVX512-NEXT: vmovups (%rdi), %ymm01535; AVX512-NEXT: retq1536 %1 = load <8 x i32>, ptr %src, align 1, !nontemporal !11537 ret <8 x i32> %11538}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), %xmm01544; SSE-NEXT: movups 16(%rdi), %xmm11545; SSE-NEXT: retq1546;1547; AVX-LABEL: test_unaligned_v4f64:1548; AVX: # %bb.0:1549; AVX-NEXT: vmovups (%rdi), %ymm01550; AVX-NEXT: retq1551;1552; AVX512-LABEL: test_unaligned_v4f64:1553; AVX512: # %bb.0:1554; AVX512-NEXT: vmovups (%rdi), %ymm01555; AVX512-NEXT: retq1556 %1 = load <4 x double>, ptr %src, align 1, !nontemporal !11557 ret <4 x double> %11558}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), %xmm01564; SSE-NEXT: movups 16(%rdi), %xmm11565; SSE-NEXT: retq1566;1567; AVX-LABEL: test_unaligned_v4i64:1568; AVX: # %bb.0:1569; AVX-NEXT: vmovups (%rdi), %ymm01570; AVX-NEXT: retq1571;1572; AVX512-LABEL: test_unaligned_v4i64:1573; AVX512: # %bb.0:1574; AVX512-NEXT: vmovups (%rdi), %ymm01575; AVX512-NEXT: retq1576 %1 = load <4 x i64>, ptr %src, align 1, !nontemporal !11577 ret <4 x i64> %11578}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), %xmm01584; SSE-NEXT: movups 16(%rdi), %xmm11585; SSE-NEXT: retq1586;1587; AVX-LABEL: test_unaligned_v16i16:1588; AVX: # %bb.0:1589; AVX-NEXT: vmovups (%rdi), %ymm01590; AVX-NEXT: retq1591;1592; AVX512-LABEL: test_unaligned_v16i16:1593; AVX512: # %bb.0:1594; AVX512-NEXT: vmovups (%rdi), %ymm01595; AVX512-NEXT: retq1596 %1 = load <16 x i16>, ptr %src, align 1, !nontemporal !11597 ret <16 x i16> %11598}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), %xmm01604; SSE-NEXT: movups 16(%rdi), %xmm11605; SSE-NEXT: retq1606;1607; AVX-LABEL: test_unaligned_v32i8:1608; AVX: # %bb.0:1609; AVX-NEXT: vmovups (%rdi), %ymm01610; AVX-NEXT: retq1611;1612; AVX512-LABEL: test_unaligned_v32i8:1613; AVX512: # %bb.0:1614; AVX512-NEXT: vmovups (%rdi), %ymm01615; AVX512-NEXT: retq1616 %1 = load <32 x i8>, ptr %src, align 1, !nontemporal !11617 ret <32 x i8> %11618}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), %xmm01626; SSE-NEXT: movups 16(%rdi), %xmm11627; SSE-NEXT: movups 32(%rdi), %xmm21628; SSE-NEXT: movups 48(%rdi), %xmm31629; SSE-NEXT: retq1630;1631; AVX-LABEL: test_unaligned_v16f32:1632; AVX: # %bb.0:1633; AVX-NEXT: vmovups (%rdi), %ymm01634; AVX-NEXT: vmovups 32(%rdi), %ymm11635; AVX-NEXT: retq1636;1637; AVX512-LABEL: test_unaligned_v16f32:1638; AVX512: # %bb.0:1639; AVX512-NEXT: vmovups (%rdi), %zmm01640; AVX512-NEXT: retq1641 %1 = load <16 x float>, ptr %src, align 1, !nontemporal !11642 ret <16 x float> %11643}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), %xmm01649; SSE-NEXT: movups 16(%rdi), %xmm11650; SSE-NEXT: movups 32(%rdi), %xmm21651; SSE-NEXT: movups 48(%rdi), %xmm31652; SSE-NEXT: retq1653;1654; AVX-LABEL: test_unaligned_v16i32:1655; AVX: # %bb.0:1656; AVX-NEXT: vmovups (%rdi), %ymm01657; AVX-NEXT: vmovups 32(%rdi), %ymm11658; AVX-NEXT: retq1659;1660; AVX512-LABEL: test_unaligned_v16i32:1661; AVX512: # %bb.0:1662; AVX512-NEXT: vmovups (%rdi), %zmm01663; AVX512-NEXT: retq1664 %1 = load <16 x i32>, ptr %src, align 1, !nontemporal !11665 ret <16 x i32> %11666}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), %xmm01672; SSE-NEXT: movups 16(%rdi), %xmm11673; SSE-NEXT: movups 32(%rdi), %xmm21674; SSE-NEXT: movups 48(%rdi), %xmm31675; SSE-NEXT: retq1676;1677; AVX-LABEL: test_unaligned_v8f64:1678; AVX: # %bb.0:1679; AVX-NEXT: vmovups (%rdi), %ymm01680; AVX-NEXT: vmovups 32(%rdi), %ymm11681; AVX-NEXT: retq1682;1683; AVX512-LABEL: test_unaligned_v8f64:1684; AVX512: # %bb.0:1685; AVX512-NEXT: vmovups (%rdi), %zmm01686; AVX512-NEXT: retq1687 %1 = load <8 x double>, ptr %src, align 1, !nontemporal !11688 ret <8 x double> %11689}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), %xmm01695; SSE-NEXT: movups 16(%rdi), %xmm11696; SSE-NEXT: movups 32(%rdi), %xmm21697; SSE-NEXT: movups 48(%rdi), %xmm31698; SSE-NEXT: retq1699;1700; AVX-LABEL: test_unaligned_v8i64:1701; AVX: # %bb.0:1702; AVX-NEXT: vmovups (%rdi), %ymm01703; AVX-NEXT: vmovups 32(%rdi), %ymm11704; AVX-NEXT: retq1705;1706; AVX512-LABEL: test_unaligned_v8i64:1707; AVX512: # %bb.0:1708; AVX512-NEXT: vmovups (%rdi), %zmm01709; AVX512-NEXT: retq1710 %1 = load <8 x i64>, ptr %src, align 1, !nontemporal !11711 ret <8 x i64> %11712}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), %xmm01718; SSE-NEXT: movups 16(%rdi), %xmm11719; SSE-NEXT: movups 32(%rdi), %xmm21720; SSE-NEXT: movups 48(%rdi), %xmm31721; SSE-NEXT: retq1722;1723; AVX-LABEL: test_unaligned_v32i16:1724; AVX: # %bb.0:1725; AVX-NEXT: vmovups (%rdi), %ymm01726; AVX-NEXT: vmovups 32(%rdi), %ymm11727; AVX-NEXT: retq1728;1729; AVX512-LABEL: test_unaligned_v32i16:1730; AVX512: # %bb.0:1731; AVX512-NEXT: vmovups (%rdi), %zmm01732; AVX512-NEXT: retq1733 %1 = load <32 x i16>, ptr %src, align 1, !nontemporal !11734 ret <32 x i16> %11735}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), %xmm01741; SSE-NEXT: movups 16(%rdi), %xmm11742; SSE-NEXT: movups 32(%rdi), %xmm21743; SSE-NEXT: movups 48(%rdi), %xmm31744; SSE-NEXT: retq1745;1746; AVX-LABEL: test_unaligned_v64i8:1747; AVX: # %bb.0:1748; AVX-NEXT: vmovups (%rdi), %ymm01749; AVX-NEXT: vmovups 32(%rdi), %ymm11750; AVX-NEXT: retq1751;1752; AVX512-LABEL: test_unaligned_v64i8:1753; AVX512: # %bb.0:1754; AVX512-NEXT: vmovups (%rdi), %zmm01755; AVX512-NEXT: retq1756 %1 = load <64 x i8>, ptr %src, align 1, !nontemporal !11757 ret <64 x i8> %11758}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, %xmm81764; SSE2-NEXT: pcmpeqd %xmm8, %xmm71765; SSE2-NEXT: pcmpeqd %xmm8, %xmm61766; SSE2-NEXT: pcmpeqd %xmm8, %xmm51767; SSE2-NEXT: pcmpeqd %xmm4, %xmm81768; SSE2-NEXT: pand %xmm8, %xmm01769; SSE2-NEXT: pandn (%rdi), %xmm81770; SSE2-NEXT: por %xmm8, %xmm01771; SSE2-NEXT: pand %xmm5, %xmm11772; SSE2-NEXT: pandn 16(%rdi), %xmm51773; SSE2-NEXT: por %xmm5, %xmm11774; SSE2-NEXT: pand %xmm6, %xmm21775; SSE2-NEXT: pandn 32(%rdi), %xmm61776; SSE2-NEXT: por %xmm6, %xmm21777; SSE2-NEXT: pand %xmm7, %xmm31778; SSE2-NEXT: pandn 48(%rdi), %xmm71779; SSE2-NEXT: por %xmm7, %xmm31780; SSE2-NEXT: retq1781;1782; SSE41-LABEL: test_masked_v16i32:1783; SSE41: # %bb.0:1784; SSE41-NEXT: movdqa %xmm0, %xmm81785; SSE41-NEXT: pxor %xmm0, %xmm01786; SSE41-NEXT: pcmpeqd %xmm0, %xmm71787; SSE41-NEXT: pcmpeqd %xmm0, %xmm61788; SSE41-NEXT: pcmpeqd %xmm0, %xmm51789; SSE41-NEXT: pcmpeqd %xmm4, %xmm01790; SSE41-NEXT: movntdqa 48(%rdi), %xmm41791; SSE41-NEXT: movntdqa 32(%rdi), %xmm91792; SSE41-NEXT: movntdqa 16(%rdi), %xmm101793; SSE41-NEXT: movntdqa (%rdi), %xmm111794; SSE41-NEXT: blendvps %xmm0, %xmm8, %xmm111795; SSE41-NEXT: movdqa %xmm5, %xmm01796; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm101797; SSE41-NEXT: movdqa %xmm6, %xmm01798; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm91799; SSE41-NEXT: movdqa %xmm7, %xmm01800; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm41801; SSE41-NEXT: movaps %xmm11, %xmm01802; SSE41-NEXT: movaps %xmm10, %xmm11803; SSE41-NEXT: movaps %xmm9, %xmm21804; SSE41-NEXT: movaps %xmm4, %xmm31805; SSE41-NEXT: retq1806;1807; AVX1-LABEL: test_masked_v16i32:1808; AVX1: # %bb.0:1809; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm41810; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm51811; AVX1-NEXT: vpcmpeqd %xmm5, %xmm4, %xmm41812; AVX1-NEXT: vpcmpeqd %xmm5, %xmm3, %xmm31813; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm31814; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm41815; AVX1-NEXT: vpcmpeqd %xmm5, %xmm4, %xmm41816; AVX1-NEXT: vpcmpeqd %xmm5, %xmm2, %xmm21817; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm2, %ymm21818; AVX1-NEXT: vmovntdqa 32(%rdi), %xmm41819; AVX1-NEXT: vmovntdqa 48(%rdi), %xmm51820; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm4, %ymm41821; AVX1-NEXT: vblendvps %ymm3, %ymm1, %ymm4, %ymm11822; AVX1-NEXT: vmovntdqa (%rdi), %xmm31823; AVX1-NEXT: vmovntdqa 16(%rdi), %xmm41824; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm31825; AVX1-NEXT: vblendvps %ymm2, %ymm0, %ymm3, %ymm01826; AVX1-NEXT: retq1827;1828; AVX2-LABEL: test_masked_v16i32:1829; AVX2: # %bb.0:1830; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm41831; AVX2-NEXT: vpcmpeqd %ymm4, %ymm3, %ymm31832; AVX2-NEXT: vpcmpeqd %ymm4, %ymm2, %ymm21833; AVX2-NEXT: vmovntdqa 32(%rdi), %ymm41834; AVX2-NEXT: vblendvps %ymm3, %ymm1, %ymm4, %ymm11835; AVX2-NEXT: vmovntdqa (%rdi), %ymm31836; AVX2-NEXT: vblendvps %ymm2, %ymm0, %ymm3, %ymm01837; AVX2-NEXT: retq1838;1839; AVX512-LABEL: test_masked_v16i32:1840; AVX512: # %bb.0:1841; AVX512-NEXT: vptestmd %zmm1, %zmm1, %k11842; AVX512-NEXT: vmovntdqa (%rdi), %zmm11843; AVX512-NEXT: vmovdqa32 %zmm1, %zmm0 {%k1}1844; AVX512-NEXT: retq1845 %mask = icmp ne <16 x i32> %mask1, zeroinitializer1846 %r = load <16 x i32>, ptr %addr, align 64, !nontemporal !11847 %res = select <16 x i1> %mask, <16 x i32> %r, <16 x i32> %old1848 ret <16 x i32>%res1849}1850 1851; Reduced from https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=108951852define i32 @PR39256(ptr %ptr) {1853; SSE-LABEL: PR39256:1854; SSE: # %bb.0: # %entry1855; SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1856; SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01857; SSE-NEXT: setb (%rax)1858; SSE-NEXT: movl $-2147483648, %eax # imm = 0x800000001859; SSE-NEXT: retq1860;1861; AVX-LABEL: PR39256:1862; AVX: # %bb.0: # %entry1863; AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero1864; AVX-NEXT: vucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01865; AVX-NEXT: setb (%rax)1866; AVX-NEXT: movl $-2147483648, %eax # imm = 0x800000001867; AVX-NEXT: retq1868;1869; AVX512-LABEL: PR39256:1870; AVX512: # %bb.0: # %entry1871; AVX512-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero1872; AVX512-NEXT: vucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01873; AVX512-NEXT: setb (%rax)1874; AVX512-NEXT: movl $-2147483648, %eax # imm = 0x800000001875; AVX512-NEXT: retq1876entry:1877 %l = load float, ptr %ptr, !nontemporal !11878 %C = fcmp ult float %l, 0x36A00000000000001879 store i1 %C, ptr undef1880 ret i32 -21474836481881}1882 1883!1 = !{i32 1}1884