573 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.2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE424; 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=AVX --check-prefix=AVX5127 8; Widened shuffle broadcast loads9 10define <4 x float> @load_splat_4f32_4f32_0101(ptr %ptr) nounwind uwtable readnone ssp {11; SSE2-LABEL: load_splat_4f32_4f32_0101:12; SSE2: # %bb.0: # %entry13; SSE2-NEXT: movaps (%rdi), %xmm014; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0,0]15; SSE2-NEXT: retq16;17; SSE42-LABEL: load_splat_4f32_4f32_0101:18; SSE42: # %bb.0: # %entry19; SSE42-NEXT: movddup {{.*#+}} xmm0 = mem[0,0]20; SSE42-NEXT: retq21;22; AVX-LABEL: load_splat_4f32_4f32_0101:23; AVX: # %bb.0: # %entry24; AVX-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]25; AVX-NEXT: retq26entry:27 %ld = load <4 x float>, ptr %ptr28 %ret = shufflevector <4 x float> %ld, <4 x float> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>29 ret <4 x float> %ret30}31 32define <8 x float> @load_splat_8f32_4f32_01010101(ptr %ptr) nounwind uwtable readnone ssp {33; SSE2-LABEL: load_splat_8f32_4f32_01010101:34; SSE2: # %bb.0: # %entry35; SSE2-NEXT: movaps (%rdi), %xmm036; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0,0]37; SSE2-NEXT: movaps %xmm0, %xmm138; SSE2-NEXT: retq39;40; SSE42-LABEL: load_splat_8f32_4f32_01010101:41; SSE42: # %bb.0: # %entry42; SSE42-NEXT: movddup {{.*#+}} xmm0 = mem[0,0]43; SSE42-NEXT: movapd %xmm0, %xmm144; SSE42-NEXT: retq45;46; AVX-LABEL: load_splat_8f32_4f32_01010101:47; AVX: # %bb.0: # %entry48; AVX-NEXT: vbroadcastsd (%rdi), %ymm049; AVX-NEXT: retq50entry:51 %ld = load <4 x float>, ptr %ptr52 %ret = shufflevector <4 x float> %ld, <4 x float> undef, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>53 ret <8 x float> %ret54}55 56define <8 x float> @load_splat_8f32_8f32_01010101(ptr %ptr) nounwind uwtable readnone ssp {57; SSE2-LABEL: load_splat_8f32_8f32_01010101:58; SSE2: # %bb.0: # %entry59; SSE2-NEXT: movaps (%rdi), %xmm060; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0,0]61; SSE2-NEXT: movaps %xmm0, %xmm162; SSE2-NEXT: retq63;64; SSE42-LABEL: load_splat_8f32_8f32_01010101:65; SSE42: # %bb.0: # %entry66; SSE42-NEXT: movddup {{.*#+}} xmm0 = mem[0,0]67; SSE42-NEXT: movapd %xmm0, %xmm168; SSE42-NEXT: retq69;70; AVX-LABEL: load_splat_8f32_8f32_01010101:71; AVX: # %bb.0: # %entry72; AVX-NEXT: vbroadcastsd (%rdi), %ymm073; AVX-NEXT: retq74entry:75 %ld = load <8 x float>, ptr %ptr76 %ret = shufflevector <8 x float> %ld, <8 x float> undef, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>77 ret <8 x float> %ret78}79 80define <4 x i32> @load_splat_4i32_4i32_0101(ptr %ptr) nounwind uwtable readnone ssp {81; SSE-LABEL: load_splat_4i32_4i32_0101:82; SSE: # %bb.0: # %entry83; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,1,0,1]84; SSE-NEXT: retq85;86; AVX1-LABEL: load_splat_4i32_4i32_0101:87; AVX1: # %bb.0: # %entry88; AVX1-NEXT: vpermilps {{.*#+}} xmm0 = mem[0,1,0,1]89; AVX1-NEXT: retq90;91; AVX2-LABEL: load_splat_4i32_4i32_0101:92; AVX2: # %bb.0: # %entry93; AVX2-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]94; AVX2-NEXT: retq95;96; AVX512-LABEL: load_splat_4i32_4i32_0101:97; AVX512: # %bb.0: # %entry98; AVX512-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]99; AVX512-NEXT: retq100entry:101 %ld = load <4 x i32>, ptr %ptr102 %ret = shufflevector <4 x i32> %ld, <4 x i32> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>103 ret <4 x i32> %ret104}105 106define <8 x i32> @load_splat_8i32_4i32_01010101(ptr %ptr) nounwind uwtable readnone ssp {107; SSE-LABEL: load_splat_8i32_4i32_01010101:108; SSE: # %bb.0: # %entry109; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,1,0,1]110; SSE-NEXT: movdqa %xmm0, %xmm1111; SSE-NEXT: retq112;113; AVX-LABEL: load_splat_8i32_4i32_01010101:114; AVX: # %bb.0: # %entry115; AVX-NEXT: vbroadcastsd (%rdi), %ymm0116; AVX-NEXT: retq117entry:118 %ld = load <4 x i32>, ptr %ptr119 %ret = shufflevector <4 x i32> %ld, <4 x i32> undef, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>120 ret <8 x i32> %ret121}122 123define <8 x i32> @load_splat_8i32_8i32_01010101(ptr %ptr) nounwind uwtable readnone ssp {124; SSE-LABEL: load_splat_8i32_8i32_01010101:125; SSE: # %bb.0: # %entry126; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,1,0,1]127; SSE-NEXT: movdqa %xmm0, %xmm1128; SSE-NEXT: retq129;130; AVX-LABEL: load_splat_8i32_8i32_01010101:131; AVX: # %bb.0: # %entry132; AVX-NEXT: vbroadcastsd (%rdi), %ymm0133; AVX-NEXT: retq134entry:135 %ld = load <8 x i32>, ptr %ptr136 %ret = shufflevector <8 x i32> %ld, <8 x i32> undef, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>137 ret <8 x i32> %ret138}139 140define <8 x i16> @load_splat_8i16_8i16_01010101(ptr %ptr) nounwind uwtable readnone ssp {141; SSE-LABEL: load_splat_8i16_8i16_01010101:142; SSE: # %bb.0: # %entry143; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,0,0,0]144; SSE-NEXT: retq145;146; AVX1-LABEL: load_splat_8i16_8i16_01010101:147; AVX1: # %bb.0: # %entry148; AVX1-NEXT: vpermilps {{.*#+}} xmm0 = mem[0,0,0,0]149; AVX1-NEXT: retq150;151; AVX2-LABEL: load_splat_8i16_8i16_01010101:152; AVX2: # %bb.0: # %entry153; AVX2-NEXT: vbroadcastss (%rdi), %xmm0154; AVX2-NEXT: retq155;156; AVX512-LABEL: load_splat_8i16_8i16_01010101:157; AVX512: # %bb.0: # %entry158; AVX512-NEXT: vbroadcastss (%rdi), %xmm0159; AVX512-NEXT: retq160entry:161 %ld = load <8 x i16>, ptr %ptr162 %ret = shufflevector <8 x i16> %ld, <8 x i16> undef, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>163 ret <8 x i16> %ret164}165 166define <8 x i16> @load_splat_8i16_8i16_01230123(ptr %ptr) nounwind uwtable readnone ssp {167; SSE-LABEL: load_splat_8i16_8i16_01230123:168; SSE: # %bb.0: # %entry169; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,1,0,1]170; SSE-NEXT: retq171;172; AVX1-LABEL: load_splat_8i16_8i16_01230123:173; AVX1: # %bb.0: # %entry174; AVX1-NEXT: vpermilps {{.*#+}} xmm0 = mem[0,1,0,1]175; AVX1-NEXT: retq176;177; AVX2-LABEL: load_splat_8i16_8i16_01230123:178; AVX2: # %bb.0: # %entry179; AVX2-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]180; AVX2-NEXT: retq181;182; AVX512-LABEL: load_splat_8i16_8i16_01230123:183; AVX512: # %bb.0: # %entry184; AVX512-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]185; AVX512-NEXT: retq186entry:187 %ld = load <8 x i16>, ptr %ptr188 %ret = shufflevector <8 x i16> %ld, <8 x i16> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>189 ret <8 x i16> %ret190}191 192define <16 x i16> @load_splat_16i16_8i16_0101010101010101(ptr %ptr) nounwind uwtable readnone ssp {193; SSE-LABEL: load_splat_16i16_8i16_0101010101010101:194; SSE: # %bb.0: # %entry195; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,0,0,0]196; SSE-NEXT: movdqa %xmm0, %xmm1197; SSE-NEXT: retq198;199; AVX-LABEL: load_splat_16i16_8i16_0101010101010101:200; AVX: # %bb.0: # %entry201; AVX-NEXT: vbroadcastss (%rdi), %ymm0202; AVX-NEXT: retq203entry:204 %ld = load <8 x i16>, ptr %ptr205 %ret = shufflevector <8 x i16> %ld, <8 x i16> undef, <16 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>206 ret <16 x i16> %ret207}208 209define <16 x i16> @load_splat_16i16_8i16_0123012301230123(ptr %ptr) nounwind uwtable readnone ssp {210; SSE-LABEL: load_splat_16i16_8i16_0123012301230123:211; SSE: # %bb.0: # %entry212; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,1,0,1]213; SSE-NEXT: movdqa %xmm0, %xmm1214; SSE-NEXT: retq215;216; AVX-LABEL: load_splat_16i16_8i16_0123012301230123:217; AVX: # %bb.0: # %entry218; AVX-NEXT: vbroadcastsd (%rdi), %ymm0219; AVX-NEXT: retq220entry:221 %ld = load <8 x i16>, ptr %ptr222 %ret = shufflevector <8 x i16> %ld, <8 x i16> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3,i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>223 ret <16 x i16> %ret224}225 226define <16 x i16> @load_splat_16i16_16i16_0101010101010101(ptr %ptr) nounwind uwtable readnone ssp {227; SSE-LABEL: load_splat_16i16_16i16_0101010101010101:228; SSE: # %bb.0: # %entry229; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,0,0,0]230; SSE-NEXT: movdqa %xmm0, %xmm1231; SSE-NEXT: retq232;233; AVX-LABEL: load_splat_16i16_16i16_0101010101010101:234; AVX: # %bb.0: # %entry235; AVX-NEXT: vbroadcastss (%rdi), %ymm0236; AVX-NEXT: retq237entry:238 %ld = load <16 x i16>, ptr %ptr239 %ret = shufflevector <16 x i16> %ld, <16 x i16> undef, <16 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>240 ret <16 x i16> %ret241}242 243define <16 x i16> @load_splat_16i16_16i16_0123012301230123(ptr %ptr) nounwind uwtable readnone ssp {244; SSE-LABEL: load_splat_16i16_16i16_0123012301230123:245; SSE: # %bb.0: # %entry246; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,1,0,1]247; SSE-NEXT: movdqa %xmm0, %xmm1248; SSE-NEXT: retq249;250; AVX-LABEL: load_splat_16i16_16i16_0123012301230123:251; AVX: # %bb.0: # %entry252; AVX-NEXT: vbroadcastsd (%rdi), %ymm0253; AVX-NEXT: retq254entry:255 %ld = load <16 x i16>, ptr %ptr256 %ret = shufflevector <16 x i16> %ld, <16 x i16> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3,i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>257 ret <16 x i16> %ret258}259 260define <16 x i8> @load_splat_16i8_16i8_0101010101010101(ptr %ptr) nounwind uwtable readnone ssp {261; SSE-LABEL: load_splat_16i8_16i8_0101010101010101:262; SSE: # %bb.0: # %entry263; SSE-NEXT: pshuflw {{.*#+}} xmm0 = mem[0,0,0,0,4,5,6,7]264; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]265; SSE-NEXT: retq266;267; AVX1-LABEL: load_splat_16i8_16i8_0101010101010101:268; AVX1: # %bb.0: # %entry269; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = mem[0,0,0,0,4,5,6,7]270; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]271; AVX1-NEXT: retq272;273; AVX2-LABEL: load_splat_16i8_16i8_0101010101010101:274; AVX2: # %bb.0: # %entry275; AVX2-NEXT: vpbroadcastw (%rdi), %xmm0276; AVX2-NEXT: retq277;278; AVX512-LABEL: load_splat_16i8_16i8_0101010101010101:279; AVX512: # %bb.0: # %entry280; AVX512-NEXT: vpbroadcastw (%rdi), %xmm0281; AVX512-NEXT: retq282entry:283 %ld = load <16 x i8>, ptr %ptr284 %ret = shufflevector <16 x i8> %ld, <16 x i8> undef, <16 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>285 ret <16 x i8> %ret286}287 288define <16 x i8> @load_splat_16i8_16i8_0123012301230123(ptr %ptr) nounwind uwtable readnone ssp {289; SSE-LABEL: load_splat_16i8_16i8_0123012301230123:290; SSE: # %bb.0: # %entry291; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,0,0,0]292; SSE-NEXT: retq293;294; AVX1-LABEL: load_splat_16i8_16i8_0123012301230123:295; AVX1: # %bb.0: # %entry296; AVX1-NEXT: vpermilps {{.*#+}} xmm0 = mem[0,0,0,0]297; AVX1-NEXT: retq298;299; AVX2-LABEL: load_splat_16i8_16i8_0123012301230123:300; AVX2: # %bb.0: # %entry301; AVX2-NEXT: vbroadcastss (%rdi), %xmm0302; AVX2-NEXT: retq303;304; AVX512-LABEL: load_splat_16i8_16i8_0123012301230123:305; AVX512: # %bb.0: # %entry306; AVX512-NEXT: vbroadcastss (%rdi), %xmm0307; AVX512-NEXT: retq308entry:309 %ld = load <16 x i8>, ptr %ptr310 %ret = shufflevector <16 x i8> %ld, <16 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>311 ret <16 x i8> %ret312}313 314define <16 x i8> @load_splat_16i8_16i8_0123456701234567(ptr %ptr) nounwind uwtable readnone ssp {315; SSE-LABEL: load_splat_16i8_16i8_0123456701234567:316; SSE: # %bb.0: # %entry317; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,1,0,1]318; SSE-NEXT: retq319;320; AVX1-LABEL: load_splat_16i8_16i8_0123456701234567:321; AVX1: # %bb.0: # %entry322; AVX1-NEXT: vpermilps {{.*#+}} xmm0 = mem[0,1,0,1]323; AVX1-NEXT: retq324;325; AVX2-LABEL: load_splat_16i8_16i8_0123456701234567:326; AVX2: # %bb.0: # %entry327; AVX2-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]328; AVX2-NEXT: retq329;330; AVX512-LABEL: load_splat_16i8_16i8_0123456701234567:331; AVX512: # %bb.0: # %entry332; AVX512-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]333; AVX512-NEXT: retq334entry:335 %ld = load <16 x i8>, ptr %ptr336 %ret = shufflevector <16 x i8> %ld, <16 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>337 ret <16 x i8> %ret338}339 340define <32 x i8> @load_splat_32i8_16i8_01010101010101010101010101010101(ptr %ptr) nounwind uwtable readnone ssp {341; SSE-LABEL: load_splat_32i8_16i8_01010101010101010101010101010101:342; SSE: # %bb.0: # %entry343; SSE-NEXT: pshuflw {{.*#+}} xmm0 = mem[0,0,0,0,4,5,6,7]344; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]345; SSE-NEXT: movdqa %xmm0, %xmm1346; SSE-NEXT: retq347;348; AVX1-LABEL: load_splat_32i8_16i8_01010101010101010101010101010101:349; AVX1: # %bb.0: # %entry350; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = mem[0,0,0,0,4,5,6,7]351; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]352; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0353; AVX1-NEXT: retq354;355; AVX2-LABEL: load_splat_32i8_16i8_01010101010101010101010101010101:356; AVX2: # %bb.0: # %entry357; AVX2-NEXT: vpbroadcastw (%rdi), %ymm0358; AVX2-NEXT: retq359;360; AVX512-LABEL: load_splat_32i8_16i8_01010101010101010101010101010101:361; AVX512: # %bb.0: # %entry362; AVX512-NEXT: vpbroadcastw (%rdi), %ymm0363; AVX512-NEXT: retq364entry:365 %ld = load <16 x i8>, ptr %ptr366 %ret = shufflevector <16 x i8> %ld, <16 x i8> undef, <32 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>367 ret <32 x i8> %ret368}369 370define <32 x i8> @load_splat_32i8_16i8_01230123012301230123012301230123(ptr %ptr) nounwind uwtable readnone ssp {371; SSE-LABEL: load_splat_32i8_16i8_01230123012301230123012301230123:372; SSE: # %bb.0: # %entry373; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,0,0,0]374; SSE-NEXT: movdqa %xmm0, %xmm1375; SSE-NEXT: retq376;377; AVX-LABEL: load_splat_32i8_16i8_01230123012301230123012301230123:378; AVX: # %bb.0: # %entry379; AVX-NEXT: vbroadcastss (%rdi), %ymm0380; AVX-NEXT: retq381entry:382 %ld = load <16 x i8>, ptr %ptr383 %ret = shufflevector <16 x i8> %ld, <16 x i8> undef, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>384 ret <32 x i8> %ret385}386 387define <32 x i8> @load_splat_32i8_16i8_01234567012345670123456701234567(ptr %ptr) nounwind uwtable readnone ssp {388; SSE-LABEL: load_splat_32i8_16i8_01234567012345670123456701234567:389; SSE: # %bb.0: # %entry390; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,1,0,1]391; SSE-NEXT: movdqa %xmm0, %xmm1392; SSE-NEXT: retq393;394; AVX-LABEL: load_splat_32i8_16i8_01234567012345670123456701234567:395; AVX: # %bb.0: # %entry396; AVX-NEXT: vbroadcastsd (%rdi), %ymm0397; AVX-NEXT: retq398entry:399 %ld = load <16 x i8>, ptr %ptr400 %ret = shufflevector <16 x i8> %ld, <16 x i8> undef, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>401 ret <32 x i8> %ret402}403 404define <32 x i8> @load_splat_32i8_32i8_01010101010101010101010101010101(ptr %ptr) nounwind uwtable readnone ssp {405; SSE-LABEL: load_splat_32i8_32i8_01010101010101010101010101010101:406; SSE: # %bb.0: # %entry407; SSE-NEXT: pshuflw {{.*#+}} xmm0 = mem[0,0,0,0,4,5,6,7]408; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]409; SSE-NEXT: movdqa %xmm0, %xmm1410; SSE-NEXT: retq411;412; AVX1-LABEL: load_splat_32i8_32i8_01010101010101010101010101010101:413; AVX1: # %bb.0: # %entry414; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = mem[0,0,0,0,4,5,6,7]415; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]416; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0417; AVX1-NEXT: retq418;419; AVX2-LABEL: load_splat_32i8_32i8_01010101010101010101010101010101:420; AVX2: # %bb.0: # %entry421; AVX2-NEXT: vpbroadcastw (%rdi), %ymm0422; AVX2-NEXT: retq423;424; AVX512-LABEL: load_splat_32i8_32i8_01010101010101010101010101010101:425; AVX512: # %bb.0: # %entry426; AVX512-NEXT: vpbroadcastw (%rdi), %ymm0427; AVX512-NEXT: retq428entry:429 %ld = load <32 x i8>, ptr %ptr430 %ret = shufflevector <32 x i8> %ld, <32 x i8> undef, <32 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>431 ret <32 x i8> %ret432}433 434define <32 x i8> @load_splat_32i8_32i8_01230123012301230123012301230123(ptr %ptr) nounwind uwtable readnone ssp {435; SSE-LABEL: load_splat_32i8_32i8_01230123012301230123012301230123:436; SSE: # %bb.0: # %entry437; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,0,0,0]438; SSE-NEXT: movdqa %xmm0, %xmm1439; SSE-NEXT: retq440;441; AVX-LABEL: load_splat_32i8_32i8_01230123012301230123012301230123:442; AVX: # %bb.0: # %entry443; AVX-NEXT: vbroadcastss (%rdi), %ymm0444; AVX-NEXT: retq445entry:446 %ld = load <32 x i8>, ptr %ptr447 %ret = shufflevector <32 x i8> %ld, <32 x i8> undef, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>448 ret <32 x i8> %ret449}450 451define <32 x i8> @load_splat_32i8_32i8_01234567012345670123456701234567(ptr %ptr) nounwind uwtable readnone ssp {452; SSE-LABEL: load_splat_32i8_32i8_01234567012345670123456701234567:453; SSE: # %bb.0: # %entry454; SSE-NEXT: pshufd {{.*#+}} xmm0 = mem[0,1,0,1]455; SSE-NEXT: movdqa %xmm0, %xmm1456; SSE-NEXT: retq457;458; AVX-LABEL: load_splat_32i8_32i8_01234567012345670123456701234567:459; AVX: # %bb.0: # %entry460; AVX-NEXT: vbroadcastsd (%rdi), %ymm0461; AVX-NEXT: retq462entry:463 %ld = load <32 x i8>, ptr %ptr464 %ret = shufflevector <32 x i8> %ld, <32 x i8> undef, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>465 ret <32 x i8> %ret466}467 468define <4 x float> @load_splat_4f32_8f32_0000(ptr %ptr) nounwind uwtable readnone ssp {469; SSE-LABEL: load_splat_4f32_8f32_0000:470; SSE: # %bb.0: # %entry471; SSE-NEXT: movaps (%rdi), %xmm0472; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0,0,0]473; SSE-NEXT: retq474;475; AVX-LABEL: load_splat_4f32_8f32_0000:476; AVX: # %bb.0: # %entry477; AVX-NEXT: vbroadcastss (%rdi), %xmm0478; AVX-NEXT: retq479entry:480 %ld = load <8 x float>, ptr %ptr481 %ret = shufflevector <8 x float> %ld, <8 x float> undef, <4 x i32> zeroinitializer482 ret <4 x float> %ret483}484 485define <8 x float> @load_splat_8f32_16f32_89898989(ptr %ptr) nounwind uwtable readnone ssp {486; SSE2-LABEL: load_splat_8f32_16f32_89898989:487; SSE2: # %bb.0: # %entry488; SSE2-NEXT: movaps 32(%rdi), %xmm0489; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0,0]490; SSE2-NEXT: movaps %xmm0, %xmm1491; SSE2-NEXT: retq492;493; SSE42-LABEL: load_splat_8f32_16f32_89898989:494; SSE42: # %bb.0: # %entry495; SSE42-NEXT: movddup {{.*#+}} xmm0 = mem[0,0]496; SSE42-NEXT: movapd %xmm0, %xmm1497; SSE42-NEXT: retq498;499; AVX-LABEL: load_splat_8f32_16f32_89898989:500; AVX: # %bb.0: # %entry501; AVX-NEXT: vbroadcastsd 32(%rdi), %ymm0502; AVX-NEXT: retq503entry:504 %ld = load <16 x float>, ptr %ptr505 %ret = shufflevector <16 x float> %ld, <16 x float> undef, <8 x i32> <i32 8, i32 9, i32 8, i32 9, i32 8, i32 9, i32 8, i32 9>506 ret <8 x float> %ret507}508 509; PR34394510define <4 x i32> @load_splat_4i32_2i32_0101(ptr %vp) {511; SSE-LABEL: load_splat_4i32_2i32_0101:512; SSE: # %bb.0:513; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero514; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]515; SSE-NEXT: retq516;517; AVX-LABEL: load_splat_4i32_2i32_0101:518; AVX: # %bb.0:519; AVX-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]520; AVX-NEXT: retq521 %vec = load <2 x i32>, ptr %vp522 %res = shufflevector <2 x i32> %vec, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>523 ret <4 x i32> %res524}525 526define <8 x i32> @load_splat_8i32_2i32_0101(ptr %vp) {527; SSE-LABEL: load_splat_8i32_2i32_0101:528; SSE: # %bb.0:529; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero530; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]531; SSE-NEXT: movdqa %xmm0, %xmm1532; SSE-NEXT: retq533;534; AVX-LABEL: load_splat_8i32_2i32_0101:535; AVX: # %bb.0:536; AVX-NEXT: vbroadcastsd (%rdi), %ymm0537; AVX-NEXT: retq538 %vec = load <2 x i32>, ptr %vp539 %res = shufflevector <2 x i32> %vec, <2 x i32> undef, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>540 ret <8 x i32> %res541}542 543define <16 x i32> @load_splat_16i32_2i32_0101(ptr %vp) {544; SSE-LABEL: load_splat_16i32_2i32_0101:545; SSE: # %bb.0:546; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero547; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]548; SSE-NEXT: movdqa %xmm0, %xmm1549; SSE-NEXT: movdqa %xmm0, %xmm2550; SSE-NEXT: movdqa %xmm0, %xmm3551; SSE-NEXT: retq552;553; AVX1-LABEL: load_splat_16i32_2i32_0101:554; AVX1: # %bb.0:555; AVX1-NEXT: vbroadcastsd (%rdi), %ymm0556; AVX1-NEXT: vmovaps %ymm0, %ymm1557; AVX1-NEXT: retq558;559; AVX2-LABEL: load_splat_16i32_2i32_0101:560; AVX2: # %bb.0:561; AVX2-NEXT: vbroadcastsd (%rdi), %ymm0562; AVX2-NEXT: vmovaps %ymm0, %ymm1563; AVX2-NEXT: retq564;565; AVX512-LABEL: load_splat_16i32_2i32_0101:566; AVX512: # %bb.0:567; AVX512-NEXT: vbroadcastsd (%rdi), %zmm0568; AVX512-NEXT: retq569 %vec = load <2 x i32>, ptr %vp570 %res = shufflevector <2 x i32> %vec, <2 x i32> undef, <16 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>571 ret <16 x i32> %res572}573