1845 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=X86,X86-AVX,X86-AVX13; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=X86,X86-AVX,X86-AVX24; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512vl | FileCheck %s --check-prefixes=X86,X86-AVX5125; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512bw,+avx512vl | FileCheck %s --check-prefixes=X86,X86-AVX5126; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefixes=X86,X86-AVX5127; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX18; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=X64,X64-AVX,X64-AVX29; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl | FileCheck %s --check-prefixes=X64,X64-AVX51210; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl | FileCheck %s --check-prefixes=X64,X64-AVX51211; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefixes=X64,X64-AVX51212 13;14; Subvector Load + Broadcast15;16 17define <4 x double> @test_broadcast_2f64_4f64(ptr%p) nounwind {18; X86-LABEL: test_broadcast_2f64_4f64:19; X86: # %bb.0:20; X86-NEXT: movl {{[0-9]+}}(%esp), %eax21; X86-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]22; X86-NEXT: retl23;24; X64-LABEL: test_broadcast_2f64_4f64:25; X64: # %bb.0:26; X64-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]27; X64-NEXT: retq28 %1 = load <2 x double>, ptr%p29 %2 = shufflevector <2 x double> %1, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>30 ret <4 x double> %231}32 33define <8 x double> @test_broadcast_2f64_8f64(ptr%p) nounwind {34; X86-AVX-LABEL: test_broadcast_2f64_8f64:35; X86-AVX: # %bb.0:36; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax37; X86-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]38; X86-AVX-NEXT: vmovaps %ymm0, %ymm139; X86-AVX-NEXT: retl40;41; X86-AVX512-LABEL: test_broadcast_2f64_8f64:42; X86-AVX512: # %bb.0:43; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax44; X86-AVX512-NEXT: vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]45; X86-AVX512-NEXT: retl46;47; X64-AVX-LABEL: test_broadcast_2f64_8f64:48; X64-AVX: # %bb.0:49; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]50; X64-AVX-NEXT: vmovaps %ymm0, %ymm151; X64-AVX-NEXT: retq52;53; X64-AVX512-LABEL: test_broadcast_2f64_8f64:54; X64-AVX512: # %bb.0:55; X64-AVX512-NEXT: vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]56; X64-AVX512-NEXT: retq57 %1 = load <2 x double>, ptr%p58 %2 = shufflevector <2 x double> %1, <2 x double> undef, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>59 ret <8 x double> %260}61 62define <8 x double> @test_broadcast_4f64_8f64(ptr%p) nounwind {63; X86-AVX-LABEL: test_broadcast_4f64_8f64:64; X86-AVX: # %bb.0:65; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax66; X86-AVX-NEXT: vmovaps (%eax), %ymm067; X86-AVX-NEXT: vmovaps %ymm0, %ymm168; X86-AVX-NEXT: retl69;70; X86-AVX512-LABEL: test_broadcast_4f64_8f64:71; X86-AVX512: # %bb.0:72; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax73; X86-AVX512-NEXT: vbroadcastf64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]74; X86-AVX512-NEXT: retl75;76; X64-AVX-LABEL: test_broadcast_4f64_8f64:77; X64-AVX: # %bb.0:78; X64-AVX-NEXT: vmovaps (%rdi), %ymm079; X64-AVX-NEXT: vmovaps %ymm0, %ymm180; X64-AVX-NEXT: retq81;82; X64-AVX512-LABEL: test_broadcast_4f64_8f64:83; X64-AVX512: # %bb.0:84; X64-AVX512-NEXT: vbroadcastf64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]85; X64-AVX512-NEXT: retq86 %1 = load <4 x double>, ptr%p87 %2 = shufflevector <4 x double> %1, <4 x double> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>88 ret <8 x double> %289}90 91define <4 x i64> @test_broadcast_2i64_4i64(ptr%p) nounwind {92; X86-AVX-LABEL: test_broadcast_2i64_4i64:93; X86-AVX: # %bb.0:94; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax95; X86-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]96; X86-AVX-NEXT: retl97;98; X86-AVX512-LABEL: test_broadcast_2i64_4i64:99; X86-AVX512: # %bb.0:100; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax101; X86-AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm0 = mem[0,1,0,1]102; X86-AVX512-NEXT: retl103;104; X64-AVX-LABEL: test_broadcast_2i64_4i64:105; X64-AVX: # %bb.0:106; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]107; X64-AVX-NEXT: retq108;109; X64-AVX512-LABEL: test_broadcast_2i64_4i64:110; X64-AVX512: # %bb.0:111; X64-AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm0 = mem[0,1,0,1]112; X64-AVX512-NEXT: retq113 %1 = load <2 x i64>, ptr%p114 %2 = shufflevector <2 x i64> %1, <2 x i64> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>115 ret <4 x i64> %2116}117 118define <8 x i64> @test_broadcast_2i64_8i64(ptr%p) nounwind {119; X86-AVX-LABEL: test_broadcast_2i64_8i64:120; X86-AVX: # %bb.0:121; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax122; X86-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]123; X86-AVX-NEXT: vmovaps %ymm0, %ymm1124; X86-AVX-NEXT: retl125;126; X86-AVX512-LABEL: test_broadcast_2i64_8i64:127; X86-AVX512: # %bb.0:128; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax129; X86-AVX512-NEXT: vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]130; X86-AVX512-NEXT: retl131;132; X64-AVX-LABEL: test_broadcast_2i64_8i64:133; X64-AVX: # %bb.0:134; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]135; X64-AVX-NEXT: vmovaps %ymm0, %ymm1136; X64-AVX-NEXT: retq137;138; X64-AVX512-LABEL: test_broadcast_2i64_8i64:139; X64-AVX512: # %bb.0:140; X64-AVX512-NEXT: vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]141; X64-AVX512-NEXT: retq142 %1 = load <2 x i64>, ptr%p143 %2 = shufflevector <2 x i64> %1, <2 x i64> undef, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>144 ret <8 x i64> %2145}146 147define <8 x i64> @test_broadcast_4i64_8i64(ptr%p) nounwind {148; X86-AVX-LABEL: test_broadcast_4i64_8i64:149; X86-AVX: # %bb.0:150; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax151; X86-AVX-NEXT: vmovaps (%eax), %ymm0152; X86-AVX-NEXT: vmovaps %ymm0, %ymm1153; X86-AVX-NEXT: retl154;155; X86-AVX512-LABEL: test_broadcast_4i64_8i64:156; X86-AVX512: # %bb.0:157; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax158; X86-AVX512-NEXT: vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]159; X86-AVX512-NEXT: retl160;161; X64-AVX-LABEL: test_broadcast_4i64_8i64:162; X64-AVX: # %bb.0:163; X64-AVX-NEXT: vmovaps (%rdi), %ymm0164; X64-AVX-NEXT: vmovaps %ymm0, %ymm1165; X64-AVX-NEXT: retq166;167; X64-AVX512-LABEL: test_broadcast_4i64_8i64:168; X64-AVX512: # %bb.0:169; X64-AVX512-NEXT: vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]170; X64-AVX512-NEXT: retq171 %1 = load <4 x i64>, ptr%p172 %2 = shufflevector <4 x i64> %1, <4 x i64> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>173 ret <8 x i64> %2174}175 176define <8 x float> @test_broadcast_4f32_8f32(ptr%p) nounwind {177; X86-LABEL: test_broadcast_4f32_8f32:178; X86: # %bb.0:179; X86-NEXT: movl {{[0-9]+}}(%esp), %eax180; X86-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]181; X86-NEXT: retl182;183; X64-LABEL: test_broadcast_4f32_8f32:184; X64: # %bb.0:185; X64-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]186; X64-NEXT: retq187 %1 = load <4 x float>, ptr%p188 %2 = shufflevector <4 x float> %1, <4 x float> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>189 ret <8 x float> %2190}191 192define <16 x float> @test_broadcast_4f32_16f32(ptr%p) nounwind {193; X86-AVX-LABEL: test_broadcast_4f32_16f32:194; X86-AVX: # %bb.0:195; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax196; X86-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]197; X86-AVX-NEXT: vmovaps %ymm0, %ymm1198; X86-AVX-NEXT: retl199;200; X86-AVX512-LABEL: test_broadcast_4f32_16f32:201; X86-AVX512: # %bb.0:202; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax203; X86-AVX512-NEXT: vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]204; X86-AVX512-NEXT: retl205;206; X64-AVX-LABEL: test_broadcast_4f32_16f32:207; X64-AVX: # %bb.0:208; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]209; X64-AVX-NEXT: vmovaps %ymm0, %ymm1210; X64-AVX-NEXT: retq211;212; X64-AVX512-LABEL: test_broadcast_4f32_16f32:213; X64-AVX512: # %bb.0:214; X64-AVX512-NEXT: vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]215; X64-AVX512-NEXT: retq216 %1 = load <4 x float>, ptr%p217 %2 = shufflevector <4 x float> %1, <4 x float> 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>218 ret <16 x float> %2219}220 221define <16 x float> @test_broadcast_8f32_16f32(ptr%p) nounwind {222; X86-AVX-LABEL: test_broadcast_8f32_16f32:223; X86-AVX: # %bb.0:224; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax225; X86-AVX-NEXT: vmovaps (%eax), %ymm0226; X86-AVX-NEXT: vmovaps %ymm0, %ymm1227; X86-AVX-NEXT: retl228;229; X86-AVX512-LABEL: test_broadcast_8f32_16f32:230; X86-AVX512: # %bb.0:231; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax232; X86-AVX512-NEXT: vbroadcastf64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]233; X86-AVX512-NEXT: retl234;235; X64-AVX-LABEL: test_broadcast_8f32_16f32:236; X64-AVX: # %bb.0:237; X64-AVX-NEXT: vmovaps (%rdi), %ymm0238; X64-AVX-NEXT: vmovaps %ymm0, %ymm1239; X64-AVX-NEXT: retq240;241; X64-AVX512-LABEL: test_broadcast_8f32_16f32:242; X64-AVX512: # %bb.0:243; X64-AVX512-NEXT: vbroadcastf64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]244; X64-AVX512-NEXT: retq245 %1 = load <8 x float>, ptr%p246 %2 = shufflevector <8 x float> %1, <8 x float> 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>247 ret <16 x float> %2248}249 250define <8 x i32> @test_broadcast_4i32_8i32(ptr%p) nounwind {251; X86-AVX-LABEL: test_broadcast_4i32_8i32:252; X86-AVX: # %bb.0:253; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax254; X86-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]255; X86-AVX-NEXT: retl256;257; X86-AVX512-LABEL: test_broadcast_4i32_8i32:258; X86-AVX512: # %bb.0:259; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax260; X86-AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm0 = mem[0,1,0,1]261; X86-AVX512-NEXT: retl262;263; X64-AVX-LABEL: test_broadcast_4i32_8i32:264; X64-AVX: # %bb.0:265; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]266; X64-AVX-NEXT: retq267;268; X64-AVX512-LABEL: test_broadcast_4i32_8i32:269; X64-AVX512: # %bb.0:270; X64-AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm0 = mem[0,1,0,1]271; X64-AVX512-NEXT: retq272 %1 = load <4 x i32>, ptr%p273 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>274 ret <8 x i32> %2275}276 277define <16 x i32> @test_broadcast_4i32_16i32(ptr%p) nounwind {278; X86-AVX-LABEL: test_broadcast_4i32_16i32:279; X86-AVX: # %bb.0:280; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax281; X86-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]282; X86-AVX-NEXT: vmovaps %ymm0, %ymm1283; X86-AVX-NEXT: retl284;285; X86-AVX512-LABEL: test_broadcast_4i32_16i32:286; X86-AVX512: # %bb.0:287; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax288; X86-AVX512-NEXT: vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]289; X86-AVX512-NEXT: retl290;291; X64-AVX-LABEL: test_broadcast_4i32_16i32:292; X64-AVX: # %bb.0:293; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]294; X64-AVX-NEXT: vmovaps %ymm0, %ymm1295; X64-AVX-NEXT: retq296;297; X64-AVX512-LABEL: test_broadcast_4i32_16i32:298; X64-AVX512: # %bb.0:299; X64-AVX512-NEXT: vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]300; X64-AVX512-NEXT: retq301 %1 = load <4 x i32>, ptr%p302 %2 = shufflevector <4 x i32> %1, <4 x i32> 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>303 ret <16 x i32> %2304}305 306define <16 x i32> @test_broadcast_8i32_16i32(ptr%p) nounwind {307; X86-AVX-LABEL: test_broadcast_8i32_16i32:308; X86-AVX: # %bb.0:309; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax310; X86-AVX-NEXT: vmovaps (%eax), %ymm0311; X86-AVX-NEXT: vmovaps %ymm0, %ymm1312; X86-AVX-NEXT: retl313;314; X86-AVX512-LABEL: test_broadcast_8i32_16i32:315; X86-AVX512: # %bb.0:316; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax317; X86-AVX512-NEXT: vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]318; X86-AVX512-NEXT: retl319;320; X64-AVX-LABEL: test_broadcast_8i32_16i32:321; X64-AVX: # %bb.0:322; X64-AVX-NEXT: vmovaps (%rdi), %ymm0323; X64-AVX-NEXT: vmovaps %ymm0, %ymm1324; X64-AVX-NEXT: retq325;326; X64-AVX512-LABEL: test_broadcast_8i32_16i32:327; X64-AVX512: # %bb.0:328; X64-AVX512-NEXT: vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]329; X64-AVX512-NEXT: retq330 %1 = load <8 x i32>, ptr%p331 %2 = shufflevector <8 x i32> %1, <8 x i32> 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>332 ret <16 x i32> %2333}334 335define <16 x i16> @test_broadcast_8i16_16i16(ptr%p) nounwind {336; X86-AVX-LABEL: test_broadcast_8i16_16i16:337; X86-AVX: # %bb.0:338; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax339; X86-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]340; X86-AVX-NEXT: retl341;342; X86-AVX512-LABEL: test_broadcast_8i16_16i16:343; X86-AVX512: # %bb.0:344; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax345; X86-AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm0 = mem[0,1,0,1]346; X86-AVX512-NEXT: retl347;348; X64-AVX-LABEL: test_broadcast_8i16_16i16:349; X64-AVX: # %bb.0:350; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]351; X64-AVX-NEXT: retq352;353; X64-AVX512-LABEL: test_broadcast_8i16_16i16:354; X64-AVX512: # %bb.0:355; X64-AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm0 = mem[0,1,0,1]356; X64-AVX512-NEXT: retq357 %1 = load <8 x i16>, ptr%p358 %2 = shufflevector <8 x i16> %1, <8 x i16> 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>359 ret <16 x i16> %2360}361 362define <32 x i16> @test_broadcast_8i16_32i16(ptr%p) nounwind {363; X86-AVX-LABEL: test_broadcast_8i16_32i16:364; X86-AVX: # %bb.0:365; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax366; X86-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]367; X86-AVX-NEXT: vmovaps %ymm0, %ymm1368; X86-AVX-NEXT: retl369;370; X86-AVX512-LABEL: test_broadcast_8i16_32i16:371; X86-AVX512: # %bb.0:372; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax373; X86-AVX512-NEXT: vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]374; X86-AVX512-NEXT: retl375;376; X64-AVX-LABEL: test_broadcast_8i16_32i16:377; X64-AVX: # %bb.0:378; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]379; X64-AVX-NEXT: vmovaps %ymm0, %ymm1380; X64-AVX-NEXT: retq381;382; X64-AVX512-LABEL: test_broadcast_8i16_32i16:383; X64-AVX512: # %bb.0:384; X64-AVX512-NEXT: vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]385; X64-AVX512-NEXT: retq386 %1 = load <8 x i16>, ptr%p387 %2 = shufflevector <8 x i16> %1, <8 x i16> 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>388 ret <32 x i16> %2389}390 391define <32 x i16> @test_broadcast_16i16_32i16(ptr%p) nounwind {392; X86-AVX-LABEL: test_broadcast_16i16_32i16:393; X86-AVX: # %bb.0:394; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax395; X86-AVX-NEXT: vmovaps (%eax), %ymm0396; X86-AVX-NEXT: vmovaps %ymm0, %ymm1397; X86-AVX-NEXT: retl398;399; X86-AVX512-LABEL: test_broadcast_16i16_32i16:400; X86-AVX512: # %bb.0:401; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax402; X86-AVX512-NEXT: vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]403; X86-AVX512-NEXT: retl404;405; X64-AVX-LABEL: test_broadcast_16i16_32i16:406; X64-AVX: # %bb.0:407; X64-AVX-NEXT: vmovaps (%rdi), %ymm0408; X64-AVX-NEXT: vmovaps %ymm0, %ymm1409; X64-AVX-NEXT: retq410;411; X64-AVX512-LABEL: test_broadcast_16i16_32i16:412; X64-AVX512: # %bb.0:413; X64-AVX512-NEXT: vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]414; X64-AVX512-NEXT: retq415 %1 = load <16 x i16>, ptr%p416 %2 = shufflevector <16 x i16> %1, <16 x i16> undef, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>417 ret <32 x i16> %2418}419 420define <32 x i8> @test_broadcast_16i8_32i8(ptr%p) nounwind {421; X86-AVX-LABEL: test_broadcast_16i8_32i8:422; X86-AVX: # %bb.0:423; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax424; X86-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]425; X86-AVX-NEXT: retl426;427; X86-AVX512-LABEL: test_broadcast_16i8_32i8:428; X86-AVX512: # %bb.0:429; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax430; X86-AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm0 = mem[0,1,0,1]431; X86-AVX512-NEXT: retl432;433; X64-AVX-LABEL: test_broadcast_16i8_32i8:434; X64-AVX: # %bb.0:435; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]436; X64-AVX-NEXT: retq437;438; X64-AVX512-LABEL: test_broadcast_16i8_32i8:439; X64-AVX512: # %bb.0:440; X64-AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm0 = mem[0,1,0,1]441; X64-AVX512-NEXT: retq442 %1 = load <16 x i8>, ptr%p443 %2 = shufflevector <16 x i8> %1, <16 x i8> undef, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>444 ret <32 x i8> %2445}446 447define <64 x i8> @test_broadcast_16i8_64i8(ptr%p) nounwind {448; X86-AVX-LABEL: test_broadcast_16i8_64i8:449; X86-AVX: # %bb.0:450; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax451; X86-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]452; X86-AVX-NEXT: vmovaps %ymm0, %ymm1453; X86-AVX-NEXT: retl454;455; X86-AVX512-LABEL: test_broadcast_16i8_64i8:456; X86-AVX512: # %bb.0:457; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax458; X86-AVX512-NEXT: vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]459; X86-AVX512-NEXT: retl460;461; X64-AVX-LABEL: test_broadcast_16i8_64i8:462; X64-AVX: # %bb.0:463; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]464; X64-AVX-NEXT: vmovaps %ymm0, %ymm1465; X64-AVX-NEXT: retq466;467; X64-AVX512-LABEL: test_broadcast_16i8_64i8:468; X64-AVX512: # %bb.0:469; X64-AVX512-NEXT: vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]470; X64-AVX512-NEXT: retq471 %1 = load <16 x i8>, ptr%p472 %2 = shufflevector <16 x i8> %1, <16 x i8> undef, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>473 ret <64 x i8> %2474}475 476define <64 x i8> @test_broadcast_32i8_64i8(ptr%p) nounwind {477; X86-AVX-LABEL: test_broadcast_32i8_64i8:478; X86-AVX: # %bb.0:479; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax480; X86-AVX-NEXT: vmovaps (%eax), %ymm0481; X86-AVX-NEXT: vmovaps %ymm0, %ymm1482; X86-AVX-NEXT: retl483;484; X86-AVX512-LABEL: test_broadcast_32i8_64i8:485; X86-AVX512: # %bb.0:486; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax487; X86-AVX512-NEXT: vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]488; X86-AVX512-NEXT: retl489;490; X64-AVX-LABEL: test_broadcast_32i8_64i8:491; X64-AVX: # %bb.0:492; X64-AVX-NEXT: vmovaps (%rdi), %ymm0493; X64-AVX-NEXT: vmovaps %ymm0, %ymm1494; X64-AVX-NEXT: retq495;496; X64-AVX512-LABEL: test_broadcast_32i8_64i8:497; X64-AVX512: # %bb.0:498; X64-AVX512-NEXT: vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3]499; X64-AVX512-NEXT: retq500 %1 = load <32 x i8>, ptr%p501 %2 = shufflevector <32 x i8> %1, <32 x i8> undef, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>502 ret <64 x i8> %2503}504 505;506; Subvector Load + Broadcast + Store507;508 509define <4 x double> @test_broadcast_2f64_4f64_reuse(ptr %p0, ptr %p1) {510; X86-AVX-LABEL: test_broadcast_2f64_4f64_reuse:511; X86-AVX: # %bb.0:512; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax513; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx514; X86-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]515; X86-AVX-NEXT: vmovaps %xmm0, (%eax)516; X86-AVX-NEXT: retl517;518; X86-AVX512-LABEL: test_broadcast_2f64_4f64_reuse:519; X86-AVX512: # %bb.0:520; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax521; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %ecx522; X86-AVX512-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]523; X86-AVX512-NEXT: vmovdqa %xmm0, (%eax)524; X86-AVX512-NEXT: retl525;526; X64-AVX-LABEL: test_broadcast_2f64_4f64_reuse:527; X64-AVX: # %bb.0:528; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]529; X64-AVX-NEXT: vmovaps %xmm0, (%rsi)530; X64-AVX-NEXT: retq531;532; X64-AVX512-LABEL: test_broadcast_2f64_4f64_reuse:533; X64-AVX512: # %bb.0:534; X64-AVX512-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]535; X64-AVX512-NEXT: vmovdqa %xmm0, (%rsi)536; X64-AVX512-NEXT: retq537 %1 = load <2 x double>, ptr %p0538 store <2 x double> %1, ptr %p1539 %2 = shufflevector <2 x double> %1, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>540 ret <4 x double> %2541}542 543define <4 x i64> @test_broadcast_2i64_4i64_reuse(ptr %p0, ptr %p1) {544; X86-AVX-LABEL: test_broadcast_2i64_4i64_reuse:545; X86-AVX: # %bb.0:546; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax547; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx548; X86-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]549; X86-AVX-NEXT: vmovaps %xmm0, (%eax)550; X86-AVX-NEXT: retl551;552; X86-AVX512-LABEL: test_broadcast_2i64_4i64_reuse:553; X86-AVX512: # %bb.0:554; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax555; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %ecx556; X86-AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm0 = mem[0,1,0,1]557; X86-AVX512-NEXT: vmovdqa %xmm0, (%eax)558; X86-AVX512-NEXT: retl559;560; X64-AVX-LABEL: test_broadcast_2i64_4i64_reuse:561; X64-AVX: # %bb.0:562; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]563; X64-AVX-NEXT: vmovaps %xmm0, (%rsi)564; X64-AVX-NEXT: retq565;566; X64-AVX512-LABEL: test_broadcast_2i64_4i64_reuse:567; X64-AVX512: # %bb.0:568; X64-AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm0 = mem[0,1,0,1]569; X64-AVX512-NEXT: vmovdqa %xmm0, (%rsi)570; X64-AVX512-NEXT: retq571 %1 = load <2 x i64>, ptr %p0572 store <2 x i64> %1, ptr %p1573 %2 = shufflevector <2 x i64> %1, <2 x i64> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>574 ret <4 x i64> %2575}576 577define <8 x float> @test_broadcast_4f32_8f32_reuse(ptr %p0, ptr %p1) {578; X86-AVX-LABEL: test_broadcast_4f32_8f32_reuse:579; X86-AVX: # %bb.0:580; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax581; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx582; X86-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]583; X86-AVX-NEXT: vmovaps %xmm0, (%eax)584; X86-AVX-NEXT: retl585;586; X86-AVX512-LABEL: test_broadcast_4f32_8f32_reuse:587; X86-AVX512: # %bb.0:588; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax589; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %ecx590; X86-AVX512-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]591; X86-AVX512-NEXT: vmovdqa %xmm0, (%eax)592; X86-AVX512-NEXT: retl593;594; X64-AVX-LABEL: test_broadcast_4f32_8f32_reuse:595; X64-AVX: # %bb.0:596; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]597; X64-AVX-NEXT: vmovaps %xmm0, (%rsi)598; X64-AVX-NEXT: retq599;600; X64-AVX512-LABEL: test_broadcast_4f32_8f32_reuse:601; X64-AVX512: # %bb.0:602; X64-AVX512-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]603; X64-AVX512-NEXT: vmovdqa %xmm0, (%rsi)604; X64-AVX512-NEXT: retq605 %1 = load <4 x float>, ptr %p0606 store <4 x float> %1, ptr %p1607 %2 = shufflevector <4 x float> %1, <4 x float> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>608 ret <8 x float> %2609}610 611define <8 x i32> @test_broadcast_4i32_8i32_reuse(ptr %p0, ptr %p1) {612; X86-AVX-LABEL: test_broadcast_4i32_8i32_reuse:613; X86-AVX: # %bb.0:614; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax615; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx616; X86-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]617; X86-AVX-NEXT: vmovaps %xmm0, (%eax)618; X86-AVX-NEXT: retl619;620; X86-AVX512-LABEL: test_broadcast_4i32_8i32_reuse:621; X86-AVX512: # %bb.0:622; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax623; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %ecx624; X86-AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm0 = mem[0,1,0,1]625; X86-AVX512-NEXT: vmovdqa %xmm0, (%eax)626; X86-AVX512-NEXT: retl627;628; X64-AVX-LABEL: test_broadcast_4i32_8i32_reuse:629; X64-AVX: # %bb.0:630; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]631; X64-AVX-NEXT: vmovaps %xmm0, (%rsi)632; X64-AVX-NEXT: retq633;634; X64-AVX512-LABEL: test_broadcast_4i32_8i32_reuse:635; X64-AVX512: # %bb.0:636; X64-AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm0 = mem[0,1,0,1]637; X64-AVX512-NEXT: vmovdqa %xmm0, (%rsi)638; X64-AVX512-NEXT: retq639 %1 = load <4 x i32>, ptr %p0640 store <4 x i32> %1, ptr %p1641 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>642 ret <8 x i32> %2643}644 645define <16 x i16> @test_broadcast_8i16_16i16_reuse(ptr%p0, ptr%p1) nounwind {646; X86-AVX-LABEL: test_broadcast_8i16_16i16_reuse:647; X86-AVX: # %bb.0:648; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax649; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx650; X86-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]651; X86-AVX-NEXT: vmovaps %xmm0, (%eax)652; X86-AVX-NEXT: retl653;654; X86-AVX512-LABEL: test_broadcast_8i16_16i16_reuse:655; X86-AVX512: # %bb.0:656; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax657; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %ecx658; X86-AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm0 = mem[0,1,0,1]659; X86-AVX512-NEXT: vmovdqa %xmm0, (%eax)660; X86-AVX512-NEXT: retl661;662; X64-AVX-LABEL: test_broadcast_8i16_16i16_reuse:663; X64-AVX: # %bb.0:664; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]665; X64-AVX-NEXT: vmovaps %xmm0, (%rsi)666; X64-AVX-NEXT: retq667;668; X64-AVX512-LABEL: test_broadcast_8i16_16i16_reuse:669; X64-AVX512: # %bb.0:670; X64-AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm0 = mem[0,1,0,1]671; X64-AVX512-NEXT: vmovdqa %xmm0, (%rsi)672; X64-AVX512-NEXT: retq673 %1 = load <8 x i16>, ptr%p0674 store <8 x i16> %1, ptr %p1675 %2 = shufflevector <8 x i16> %1, <8 x i16> 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>676 ret <16 x i16> %2677}678 679define <32 x i8> @test_broadcast_16i8_32i8_reuse(ptr%p0, ptr%p1) nounwind {680; X86-AVX-LABEL: test_broadcast_16i8_32i8_reuse:681; X86-AVX: # %bb.0:682; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax683; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx684; X86-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]685; X86-AVX-NEXT: vmovaps %xmm0, (%eax)686; X86-AVX-NEXT: retl687;688; X86-AVX512-LABEL: test_broadcast_16i8_32i8_reuse:689; X86-AVX512: # %bb.0:690; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax691; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %ecx692; X86-AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm0 = mem[0,1,0,1]693; X86-AVX512-NEXT: vmovdqa %xmm0, (%eax)694; X86-AVX512-NEXT: retl695;696; X64-AVX-LABEL: test_broadcast_16i8_32i8_reuse:697; X64-AVX: # %bb.0:698; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]699; X64-AVX-NEXT: vmovaps %xmm0, (%rsi)700; X64-AVX-NEXT: retq701;702; X64-AVX512-LABEL: test_broadcast_16i8_32i8_reuse:703; X64-AVX512: # %bb.0:704; X64-AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm0 = mem[0,1,0,1]705; X64-AVX512-NEXT: vmovdqa %xmm0, (%rsi)706; X64-AVX512-NEXT: retq707 %1 = load <16 x i8>, ptr%p0708 store <16 x i8> %1, ptr %p1709 %2 = shufflevector <16 x i8> %1, <16 x i8> undef, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>710 ret <32 x i8> %2711}712 713;714; Subvector Load + Broadcast with Separate Store715;716 717define <8 x i32> @test_broadcast_4i32_8i32_chain(ptr %p0, ptr %p1) {718; X86-AVX-LABEL: test_broadcast_4i32_8i32_chain:719; X86-AVX: # %bb.0:720; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax721; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx722; X86-AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1723; X86-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]724; X86-AVX-NEXT: vmovaps %xmm1, (%eax)725; X86-AVX-NEXT: retl726;727; X86-AVX512-LABEL: test_broadcast_4i32_8i32_chain:728; X86-AVX512: # %bb.0:729; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax730; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %ecx731; X86-AVX512-NEXT: vxorps %xmm1, %xmm1, %xmm1732; X86-AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm0 = mem[0,1,0,1]733; X86-AVX512-NEXT: vmovaps %xmm1, (%eax)734; X86-AVX512-NEXT: retl735;736; X64-AVX-LABEL: test_broadcast_4i32_8i32_chain:737; X64-AVX: # %bb.0:738; X64-AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1739; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]740; X64-AVX-NEXT: vmovaps %xmm1, (%rsi)741; X64-AVX-NEXT: retq742;743; X64-AVX512-LABEL: test_broadcast_4i32_8i32_chain:744; X64-AVX512: # %bb.0:745; X64-AVX512-NEXT: vxorps %xmm1, %xmm1, %xmm1746; X64-AVX512-NEXT: vbroadcasti128 {{.*#+}} ymm0 = mem[0,1,0,1]747; X64-AVX512-NEXT: vmovaps %xmm1, (%rsi)748; X64-AVX512-NEXT: retq749 %1 = load <4 x i32>, ptr %p0750 store <4 x float> zeroinitializer, ptr %p1751 %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>752 ret <8 x i32> %2753}754 755define <16 x i32> @test_broadcast_4i32_16i32_chain(ptr %p0, ptr %p1) {756; X86-AVX-LABEL: test_broadcast_4i32_16i32_chain:757; X86-AVX: # %bb.0:758; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax759; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx760; X86-AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1761; X86-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]762; X86-AVX-NEXT: vmovaps %xmm1, (%eax)763; X86-AVX-NEXT: vmovaps %ymm0, %ymm1764; X86-AVX-NEXT: retl765;766; X86-AVX512-LABEL: test_broadcast_4i32_16i32_chain:767; X86-AVX512: # %bb.0:768; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax769; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %ecx770; X86-AVX512-NEXT: vxorps %xmm1, %xmm1, %xmm1771; X86-AVX512-NEXT: vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]772; X86-AVX512-NEXT: vmovaps %xmm1, (%eax)773; X86-AVX512-NEXT: retl774;775; X64-AVX-LABEL: test_broadcast_4i32_16i32_chain:776; X64-AVX: # %bb.0:777; X64-AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1778; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]779; X64-AVX-NEXT: vmovaps %xmm1, (%rsi)780; X64-AVX-NEXT: vmovaps %ymm0, %ymm1781; X64-AVX-NEXT: retq782;783; X64-AVX512-LABEL: test_broadcast_4i32_16i32_chain:784; X64-AVX512: # %bb.0:785; X64-AVX512-NEXT: vxorps %xmm1, %xmm1, %xmm1786; X64-AVX512-NEXT: vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]787; X64-AVX512-NEXT: vmovaps %xmm1, (%rsi)788; X64-AVX512-NEXT: retq789 %1 = load <4 x i32>, ptr %p0790 store <4 x float> zeroinitializer, ptr %p1791 %2 = shufflevector <4 x i32> %1, <4 x i32> 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>792 ret <16 x i32> %2793}794 795;796; subvector Load with multiple uses + broadcast797; Fallback to the broadcast should be done798;799 800@ga4 = dso_local global <4 x i64> zeroinitializer, align 8801@gb4 = dso_local global <8 x i64> zeroinitializer, align 8802 803define dso_local void @fallback_broadcast_v4i64_to_v8i64(<4 x i64> %a, <8 x i64> %b) {804; X86-AVX1-LABEL: fallback_broadcast_v4i64_to_v8i64:805; X86-AVX1: # %bb.0: # %entry806; X86-AVX1-NEXT: vmovdqa {{.*#+}} ymm3 = [1,0,2,0,3,0,4,0]807; X86-AVX1-NEXT: vpaddq %xmm3, %xmm0, %xmm4808; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0809; X86-AVX1-NEXT: vpmovsxbq {{.*#+}} xmm5 = [3,4]810; X86-AVX1-NEXT: vpaddq %xmm5, %xmm0, %xmm0811; X86-AVX1-NEXT: vextractf128 $1, %ymm2, %xmm6812; X86-AVX1-NEXT: vpaddq %xmm5, %xmm6, %xmm6813; X86-AVX1-NEXT: vpaddq %xmm3, %xmm2, %xmm2814; X86-AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm2, %ymm2815; X86-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6816; X86-AVX1-NEXT: vpaddq %xmm5, %xmm6, %xmm5817; X86-AVX1-NEXT: vpaddq %xmm3, %xmm1, %xmm1818; X86-AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm1, %ymm1819; X86-AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1820; X86-AVX1-NEXT: vandps %ymm3, %ymm2, %ymm2821; X86-AVX1-NEXT: vmovdqu %xmm0, ga4+16822; X86-AVX1-NEXT: vmovdqu %xmm4, ga4823; X86-AVX1-NEXT: vmovups %ymm2, gb4+32824; X86-AVX1-NEXT: vmovups %ymm1, gb4825; X86-AVX1-NEXT: vzeroupper826; X86-AVX1-NEXT: retl827;828; X86-AVX2-LABEL: fallback_broadcast_v4i64_to_v8i64:829; X86-AVX2: # %bb.0: # %entry830; X86-AVX2-NEXT: vpmovsxbq {{.*#+}} ymm3 = [1,2,3,4]831; X86-AVX2-NEXT: vpaddq %ymm3, %ymm0, %ymm0832; X86-AVX2-NEXT: vpaddq %ymm3, %ymm2, %ymm2833; X86-AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm1834; X86-AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1835; X86-AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2836; X86-AVX2-NEXT: vmovdqu %ymm0, ga4837; X86-AVX2-NEXT: vmovdqu %ymm2, gb4+32838; X86-AVX2-NEXT: vmovdqu %ymm1, gb4839; X86-AVX2-NEXT: vzeroupper840; X86-AVX2-NEXT: retl841;842; X86-AVX512-LABEL: fallback_broadcast_v4i64_to_v8i64:843; X86-AVX512: # %bb.0: # %entry844; X86-AVX512-NEXT: vbroadcasti64x4 {{.*#+}} zmm2 = [1,0,2,0,3,0,4,0,1,0,2,0,3,0,4,0]845; X86-AVX512-NEXT: # zmm2 = mem[0,1,2,3,0,1,2,3]846; X86-AVX512-NEXT: vpaddq %ymm2, %ymm0, %ymm0847; X86-AVX512-NEXT: vpaddq %zmm2, %zmm1, %zmm1848; X86-AVX512-NEXT: vpandq %zmm2, %zmm1, %zmm1849; X86-AVX512-NEXT: vmovdqu %ymm0, ga4850; X86-AVX512-NEXT: vmovdqu64 %zmm1, gb4851; X86-AVX512-NEXT: vzeroupper852; X86-AVX512-NEXT: retl853;854; X64-AVX1-LABEL: fallback_broadcast_v4i64_to_v8i64:855; X64-AVX1: # %bb.0: # %entry856; X64-AVX1-NEXT: vmovdqa {{.*#+}} ymm3 = [1,2,3,4]857; X64-AVX1-NEXT: vpaddq %xmm3, %xmm0, %xmm4858; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0859; X64-AVX1-NEXT: vpmovsxbq {{.*#+}} xmm5 = [3,4]860; X64-AVX1-NEXT: vpaddq %xmm5, %xmm0, %xmm0861; X64-AVX1-NEXT: vextractf128 $1, %ymm2, %xmm6862; X64-AVX1-NEXT: vpaddq %xmm5, %xmm6, %xmm6863; X64-AVX1-NEXT: vpaddq %xmm3, %xmm2, %xmm2864; X64-AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm2, %ymm2865; X64-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6866; X64-AVX1-NEXT: vpaddq %xmm5, %xmm6, %xmm5867; X64-AVX1-NEXT: vpaddq %xmm3, %xmm1, %xmm1868; X64-AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm1, %ymm1869; X64-AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1870; X64-AVX1-NEXT: vandps %ymm3, %ymm2, %ymm2871; X64-AVX1-NEXT: vmovdqu %xmm0, ga4+16(%rip)872; X64-AVX1-NEXT: vmovdqu %xmm4, ga4(%rip)873; X64-AVX1-NEXT: vmovups %ymm2, gb4+32(%rip)874; X64-AVX1-NEXT: vmovups %ymm1, gb4(%rip)875; X64-AVX1-NEXT: vzeroupper876; X64-AVX1-NEXT: retq877;878; X64-AVX2-LABEL: fallback_broadcast_v4i64_to_v8i64:879; X64-AVX2: # %bb.0: # %entry880; X64-AVX2-NEXT: vpmovsxbq {{.*#+}} ymm3 = [1,2,3,4]881; X64-AVX2-NEXT: vpaddq %ymm3, %ymm0, %ymm0882; X64-AVX2-NEXT: vpaddq %ymm3, %ymm2, %ymm2883; X64-AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm1884; X64-AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1885; X64-AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2886; X64-AVX2-NEXT: vmovdqu %ymm0, ga4(%rip)887; X64-AVX2-NEXT: vmovdqu %ymm2, gb4+32(%rip)888; X64-AVX2-NEXT: vmovdqu %ymm1, gb4(%rip)889; X64-AVX2-NEXT: vzeroupper890; X64-AVX2-NEXT: retq891;892; X64-AVX512-LABEL: fallback_broadcast_v4i64_to_v8i64:893; X64-AVX512: # %bb.0: # %entry894; X64-AVX512-NEXT: vbroadcasti64x4 {{.*#+}} zmm2 = [1,2,3,4,1,2,3,4]895; X64-AVX512-NEXT: # zmm2 = mem[0,1,2,3,0,1,2,3]896; X64-AVX512-NEXT: vpaddq %ymm2, %ymm0, %ymm0897; X64-AVX512-NEXT: vpaddq %zmm2, %zmm1, %zmm1898; X64-AVX512-NEXT: vpandq %zmm2, %zmm1, %zmm1899; X64-AVX512-NEXT: vmovdqu %ymm0, ga4(%rip)900; X64-AVX512-NEXT: vmovdqu64 %zmm1, gb4(%rip)901; X64-AVX512-NEXT: vzeroupper902; X64-AVX512-NEXT: retq903entry:904 %0 = add <4 x i64> %a, <i64 1, i64 2, i64 3, i64 4>905 %1 = add <8 x i64> %b, <i64 1, i64 2, i64 3, i64 4, i64 1, i64 2, i64 3, i64 4>906 %2 = and <8 x i64> %1, <i64 1, i64 2, i64 3, i64 4, i64 1, i64 2, i64 3, i64 4>907 store <4 x i64> %0, ptr @ga4, align 8908 store <8 x i64> %2, ptr @gb4, align 8909 ret void910}911 912 913@ga2 = dso_local global <4 x double> zeroinitializer, align 8914@gb2 = dso_local global <8 x double> zeroinitializer, align 8915 916define dso_local void @fallback_broadcast_v4f64_to_v8f64(<4 x double> %a, <8 x double> %b) {917; X86-AVX-LABEL: fallback_broadcast_v4f64_to_v8f64:918; X86-AVX: # %bb.0: # %entry919; X86-AVX-NEXT: vmovapd {{.*#+}} ymm3 = [1.0E+0,2.0E+0,3.0E+0,4.0E+0]920; X86-AVX-NEXT: vaddpd %ymm3, %ymm0, %ymm0921; X86-AVX-NEXT: vaddpd %ymm3, %ymm2, %ymm2922; X86-AVX-NEXT: vaddpd %ymm3, %ymm1, %ymm1923; X86-AVX-NEXT: vdivpd %ymm3, %ymm1, %ymm1924; X86-AVX-NEXT: vdivpd %ymm3, %ymm2, %ymm2925; X86-AVX-NEXT: vmovupd %ymm0, ga2926; X86-AVX-NEXT: vmovupd %ymm2, gb2+32927; X86-AVX-NEXT: vmovupd %ymm1, gb2928; X86-AVX-NEXT: vzeroupper929; X86-AVX-NEXT: retl930;931; X86-AVX512-LABEL: fallback_broadcast_v4f64_to_v8f64:932; X86-AVX512: # %bb.0: # %entry933; X86-AVX512-NEXT: vbroadcastf64x4 {{.*#+}} zmm2 = [1.0E+0,2.0E+0,3.0E+0,4.0E+0,1.0E+0,2.0E+0,3.0E+0,4.0E+0]934; X86-AVX512-NEXT: # zmm2 = mem[0,1,2,3,0,1,2,3]935; X86-AVX512-NEXT: vaddpd %ymm2, %ymm0, %ymm0936; X86-AVX512-NEXT: vaddpd %zmm2, %zmm1, %zmm1937; X86-AVX512-NEXT: vdivpd %zmm2, %zmm1, %zmm1938; X86-AVX512-NEXT: vmovupd %ymm0, ga2939; X86-AVX512-NEXT: vmovupd %zmm1, gb2940; X86-AVX512-NEXT: vzeroupper941; X86-AVX512-NEXT: retl942;943; X64-AVX-LABEL: fallback_broadcast_v4f64_to_v8f64:944; X64-AVX: # %bb.0: # %entry945; X64-AVX-NEXT: vmovapd {{.*#+}} ymm3 = [1.0E+0,2.0E+0,3.0E+0,4.0E+0]946; X64-AVX-NEXT: vaddpd %ymm3, %ymm0, %ymm0947; X64-AVX-NEXT: vaddpd %ymm3, %ymm2, %ymm2948; X64-AVX-NEXT: vaddpd %ymm3, %ymm1, %ymm1949; X64-AVX-NEXT: vdivpd %ymm3, %ymm1, %ymm1950; X64-AVX-NEXT: vdivpd %ymm3, %ymm2, %ymm2951; X64-AVX-NEXT: vmovupd %ymm0, ga2(%rip)952; X64-AVX-NEXT: vmovupd %ymm2, gb2+32(%rip)953; X64-AVX-NEXT: vmovupd %ymm1, gb2(%rip)954; X64-AVX-NEXT: vzeroupper955; X64-AVX-NEXT: retq956;957; X64-AVX512-LABEL: fallback_broadcast_v4f64_to_v8f64:958; X64-AVX512: # %bb.0: # %entry959; X64-AVX512-NEXT: vbroadcastf64x4 {{.*#+}} zmm2 = [1.0E+0,2.0E+0,3.0E+0,4.0E+0,1.0E+0,2.0E+0,3.0E+0,4.0E+0]960; X64-AVX512-NEXT: # zmm2 = mem[0,1,2,3,0,1,2,3]961; X64-AVX512-NEXT: vaddpd %ymm2, %ymm0, %ymm0962; X64-AVX512-NEXT: vaddpd %zmm2, %zmm1, %zmm1963; X64-AVX512-NEXT: vdivpd %zmm2, %zmm1, %zmm1964; X64-AVX512-NEXT: vmovupd %ymm0, ga2(%rip)965; X64-AVX512-NEXT: vmovupd %zmm1, gb2(%rip)966; X64-AVX512-NEXT: vzeroupper967; X64-AVX512-NEXT: retq968entry:969 %0 = fadd <4 x double> %a, <double 1.0, double 2.0, double 3.0, double 4.0>970 %1 = fadd <8 x double> %b, <double 1.0, double 2.0, double 3.0, double 4.0, double 1.0, double 2.0, double 3.0, double 4.0>971 %2 = fdiv <8 x double> %1, <double 1.0, double 2.0, double 3.0, double 4.0, double 1.0, double 2.0, double 3.0, double 4.0>972 store <4 x double> %0, ptr @ga2, align 8973 store <8 x double> %2, ptr @gb2, align 8974 ret void975}976 977@ha4 = dso_local global <4 x i32> zeroinitializer, align 8978@hb4 = dso_local global <8 x i32> zeroinitializer, align 8979@hc4 = dso_local global <16 x i32> zeroinitializer, align 8980 981define dso_local void @fallback_broadcast_v4i32_v8i32_v16i32(<4 x i32> %a, <8 x i32> %b, <16 x i32> %c) nounwind {982; X86-AVX1-LABEL: fallback_broadcast_v4i32_v8i32_v16i32:983; X86-AVX1: # %bb.0: # %entry984; X86-AVX1-NEXT: pushl %ebp985; X86-AVX1-NEXT: movl %esp, %ebp986; X86-AVX1-NEXT: andl $-32, %esp987; X86-AVX1-NEXT: subl $32, %esp988; X86-AVX1-NEXT: vbroadcastf128 {{.*#+}} ymm3 = [1,2,3,4,1,2,3,4]989; X86-AVX1-NEXT: # ymm3 = mem[0,1,0,1]990; X86-AVX1-NEXT: vpaddd %xmm3, %xmm0, %xmm0991; X86-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4992; X86-AVX1-NEXT: vpaddd %xmm3, %xmm4, %xmm4993; X86-AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1994; X86-AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm1, %ymm1995; X86-AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1996; X86-AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4997; X86-AVX1-NEXT: vpaddd %xmm3, %xmm4, %xmm4998; X86-AVX1-NEXT: vpaddd %xmm3, %xmm2, %xmm2999; X86-AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm2, %ymm21000; X86-AVX1-NEXT: vpaddd 8(%ebp), %xmm3, %xmm41001; X86-AVX1-NEXT: vpaddd 24(%ebp), %xmm3, %xmm51002; X86-AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm4, %ymm41003; X86-AVX1-NEXT: vandps %ymm3, %ymm2, %ymm21004; X86-AVX1-NEXT: vandps %ymm3, %ymm4, %ymm31005; X86-AVX1-NEXT: vmovdqu %xmm0, ha41006; X86-AVX1-NEXT: vmovups %ymm1, hb41007; X86-AVX1-NEXT: vmovups %ymm3, hc4+321008; X86-AVX1-NEXT: vmovups %ymm2, hc41009; X86-AVX1-NEXT: movl %ebp, %esp1010; X86-AVX1-NEXT: popl %ebp1011; X86-AVX1-NEXT: vzeroupper1012; X86-AVX1-NEXT: retl1013;1014; X86-AVX2-LABEL: fallback_broadcast_v4i32_v8i32_v16i32:1015; X86-AVX2: # %bb.0: # %entry1016; X86-AVX2-NEXT: pushl %ebp1017; X86-AVX2-NEXT: movl %esp, %ebp1018; X86-AVX2-NEXT: andl $-32, %esp1019; X86-AVX2-NEXT: subl $32, %esp1020; X86-AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm3 = [1,2,3,4,1,2,3,4]1021; X86-AVX2-NEXT: # ymm3 = mem[0,1,0,1]1022; X86-AVX2-NEXT: vpaddd %xmm3, %xmm0, %xmm01023; X86-AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm11024; X86-AVX2-NEXT: vpand %ymm3, %ymm1, %ymm11025; X86-AVX2-NEXT: vpaddd %ymm3, %ymm2, %ymm21026; X86-AVX2-NEXT: vpaddd 8(%ebp), %ymm3, %ymm41027; X86-AVX2-NEXT: vpand %ymm3, %ymm2, %ymm21028; X86-AVX2-NEXT: vpand %ymm3, %ymm4, %ymm31029; X86-AVX2-NEXT: vmovdqu %xmm0, ha41030; X86-AVX2-NEXT: vmovdqu %ymm1, hb41031; X86-AVX2-NEXT: vmovdqu %ymm3, hc4+321032; X86-AVX2-NEXT: vmovdqu %ymm2, hc41033; X86-AVX2-NEXT: movl %ebp, %esp1034; X86-AVX2-NEXT: popl %ebp1035; X86-AVX2-NEXT: vzeroupper1036; X86-AVX2-NEXT: retl1037;1038; X86-AVX512-LABEL: fallback_broadcast_v4i32_v8i32_v16i32:1039; X86-AVX512: # %bb.0: # %entry1040; X86-AVX512-NEXT: vbroadcasti32x4 {{.*#+}} zmm3 = [1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4]1041; X86-AVX512-NEXT: # zmm3 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]1042; X86-AVX512-NEXT: vpaddd %xmm3, %xmm0, %xmm01043; X86-AVX512-NEXT: vpaddd %ymm3, %ymm1, %ymm11044; X86-AVX512-NEXT: vpand %ymm3, %ymm1, %ymm11045; X86-AVX512-NEXT: vpaddd %zmm3, %zmm2, %zmm21046; X86-AVX512-NEXT: vpandd %zmm3, %zmm2, %zmm21047; X86-AVX512-NEXT: vmovdqu %xmm0, ha41048; X86-AVX512-NEXT: vmovdqu %ymm1, hb41049; X86-AVX512-NEXT: vmovdqu64 %zmm2, hc41050; X86-AVX512-NEXT: vzeroupper1051; X86-AVX512-NEXT: retl1052;1053; X64-AVX1-LABEL: fallback_broadcast_v4i32_v8i32_v16i32:1054; X64-AVX1: # %bb.0: # %entry1055; X64-AVX1-NEXT: vbroadcastf128 {{.*#+}} ymm4 = [1,2,3,4,1,2,3,4]1056; X64-AVX1-NEXT: # ymm4 = mem[0,1,0,1]1057; X64-AVX1-NEXT: vpaddd %xmm4, %xmm0, %xmm01058; X64-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm51059; X64-AVX1-NEXT: vpaddd %xmm4, %xmm5, %xmm51060; X64-AVX1-NEXT: vpaddd %xmm4, %xmm1, %xmm11061; X64-AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm1, %ymm11062; X64-AVX1-NEXT: vandps %ymm4, %ymm1, %ymm11063; X64-AVX1-NEXT: vextractf128 $1, %ymm3, %xmm51064; X64-AVX1-NEXT: vpaddd %xmm4, %xmm5, %xmm51065; X64-AVX1-NEXT: vpaddd %xmm4, %xmm3, %xmm31066; X64-AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm3, %ymm31067; X64-AVX1-NEXT: vextractf128 $1, %ymm2, %xmm51068; X64-AVX1-NEXT: vpaddd %xmm4, %xmm5, %xmm51069; X64-AVX1-NEXT: vpaddd %xmm4, %xmm2, %xmm21070; X64-AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm2, %ymm21071; X64-AVX1-NEXT: vandps %ymm4, %ymm2, %ymm21072; X64-AVX1-NEXT: vandps %ymm4, %ymm3, %ymm31073; X64-AVX1-NEXT: vmovdqu %xmm0, ha4(%rip)1074; X64-AVX1-NEXT: vmovups %ymm1, hb4(%rip)1075; X64-AVX1-NEXT: vmovups %ymm3, hc4+32(%rip)1076; X64-AVX1-NEXT: vmovups %ymm2, hc4(%rip)1077; X64-AVX1-NEXT: vzeroupper1078; X64-AVX1-NEXT: retq1079;1080; X64-AVX2-LABEL: fallback_broadcast_v4i32_v8i32_v16i32:1081; X64-AVX2: # %bb.0: # %entry1082; X64-AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm4 = [1,2,3,4,1,2,3,4]1083; X64-AVX2-NEXT: # ymm4 = mem[0,1,0,1]1084; X64-AVX2-NEXT: vpaddd %xmm4, %xmm0, %xmm01085; X64-AVX2-NEXT: vpaddd %ymm4, %ymm1, %ymm11086; X64-AVX2-NEXT: vpand %ymm4, %ymm1, %ymm11087; X64-AVX2-NEXT: vpaddd %ymm4, %ymm3, %ymm31088; X64-AVX2-NEXT: vpaddd %ymm4, %ymm2, %ymm21089; X64-AVX2-NEXT: vpand %ymm4, %ymm2, %ymm21090; X64-AVX2-NEXT: vpand %ymm4, %ymm3, %ymm31091; X64-AVX2-NEXT: vmovdqu %xmm0, ha4(%rip)1092; X64-AVX2-NEXT: vmovdqu %ymm1, hb4(%rip)1093; X64-AVX2-NEXT: vmovdqu %ymm3, hc4+32(%rip)1094; X64-AVX2-NEXT: vmovdqu %ymm2, hc4(%rip)1095; X64-AVX2-NEXT: vzeroupper1096; X64-AVX2-NEXT: retq1097;1098; X64-AVX512-LABEL: fallback_broadcast_v4i32_v8i32_v16i32:1099; X64-AVX512: # %bb.0: # %entry1100; X64-AVX512-NEXT: vbroadcasti32x4 {{.*#+}} zmm3 = [1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4]1101; X64-AVX512-NEXT: # zmm3 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]1102; X64-AVX512-NEXT: vpaddd %xmm3, %xmm0, %xmm01103; X64-AVX512-NEXT: vpaddd %ymm3, %ymm1, %ymm11104; X64-AVX512-NEXT: vpand %ymm3, %ymm1, %ymm11105; X64-AVX512-NEXT: vpaddd %zmm3, %zmm2, %zmm21106; X64-AVX512-NEXT: vpandd %zmm3, %zmm2, %zmm21107; X64-AVX512-NEXT: vmovdqu %xmm0, ha4(%rip)1108; X64-AVX512-NEXT: vmovdqu %ymm1, hb4(%rip)1109; X64-AVX512-NEXT: vmovdqu64 %zmm2, hc4(%rip)1110; X64-AVX512-NEXT: vzeroupper1111; X64-AVX512-NEXT: retq1112entry:1113 %0 = add <4 x i32> %a, <i32 1, i32 2, i32 3, i32 4>1114 %1 = add <8 x i32> %b, <i32 1, i32 2, i32 3, i32 4, i32 1, i32 2, i32 3, i32 4>1115 %2 = and <8 x i32> %1, <i32 1, i32 2, i32 3, i32 4, i32 1, i32 2, i32 3, i32 4>1116 %3 = add <16 x i32> %c, <i32 1, i32 2, i32 3, i32 4, i32 1, i32 2, i32 3, i32 4, i32 1, i32 2, i32 3, i32 4, i32 1, i32 2, i32 3, i32 4>1117 %4 = and <16 x i32> %3, <i32 1, i32 2, i32 3, i32 4, i32 1, i32 2, i32 3, i32 4, i32 1, i32 2, i32 3, i32 4, i32 1, i32 2, i32 3, i32 4>1118 store <4 x i32> %0, ptr @ha4, align 81119 store <8 x i32> %2, ptr @hb4, align 81120 store <16 x i32> %4, ptr @hc4, align 81121 ret void1122}1123 1124;1125; Subvector Broadcast from register1126;1127 1128define <4 x double> @reg_broadcast_2f64_4f64(<2 x double> %a0) nounwind {1129; X86-LABEL: reg_broadcast_2f64_4f64:1130; X86: # %bb.0:1131; X86-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01132; X86-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01133; X86-NEXT: retl1134;1135; X64-LABEL: reg_broadcast_2f64_4f64:1136; X64: # %bb.0:1137; X64-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01138; X64-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01139; X64-NEXT: retq1140 %1 = shufflevector <2 x double> %a0, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>1141 ret <4 x double> %11142}1143 1144define <8 x double> @reg_broadcast_2f64_8f64(<2 x double> %a0) nounwind {1145; X86-AVX-LABEL: reg_broadcast_2f64_8f64:1146; X86-AVX: # %bb.0:1147; X86-AVX-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01148; X86-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01149; X86-AVX-NEXT: vmovaps %ymm0, %ymm11150; X86-AVX-NEXT: retl1151;1152; X86-AVX512-LABEL: reg_broadcast_2f64_8f64:1153; X86-AVX512: # %bb.0:1154; X86-AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01155; X86-AVX512-NEXT: vshuff64x2 {{.*#+}} zmm0 = zmm0[0,1,0,1,0,1,0,1]1156; X86-AVX512-NEXT: retl1157;1158; X64-AVX-LABEL: reg_broadcast_2f64_8f64:1159; X64-AVX: # %bb.0:1160; X64-AVX-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01161; X64-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01162; X64-AVX-NEXT: vmovaps %ymm0, %ymm11163; X64-AVX-NEXT: retq1164;1165; X64-AVX512-LABEL: reg_broadcast_2f64_8f64:1166; X64-AVX512: # %bb.0:1167; X64-AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01168; X64-AVX512-NEXT: vshuff64x2 {{.*#+}} zmm0 = zmm0[0,1,0,1,0,1,0,1]1169; X64-AVX512-NEXT: retq1170 %1 = shufflevector <2 x double> %a0, <2 x double> undef, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>1171 ret <8 x double> %11172}1173 1174define <8 x double> @reg_broadcast_4f64_8f64(<4 x double> %a0) nounwind {1175; X86-AVX-LABEL: reg_broadcast_4f64_8f64:1176; X86-AVX: # %bb.0:1177; X86-AVX-NEXT: vmovaps %ymm0, %ymm11178; X86-AVX-NEXT: retl1179;1180; X86-AVX512-LABEL: reg_broadcast_4f64_8f64:1181; X86-AVX512: # %bb.0:1182; X86-AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01183; X86-AVX512-NEXT: vinsertf64x4 $1, %ymm0, %zmm0, %zmm01184; X86-AVX512-NEXT: retl1185;1186; X64-AVX-LABEL: reg_broadcast_4f64_8f64:1187; X64-AVX: # %bb.0:1188; X64-AVX-NEXT: vmovaps %ymm0, %ymm11189; X64-AVX-NEXT: retq1190;1191; X64-AVX512-LABEL: reg_broadcast_4f64_8f64:1192; X64-AVX512: # %bb.0:1193; X64-AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01194; X64-AVX512-NEXT: vinsertf64x4 $1, %ymm0, %zmm0, %zmm01195; X64-AVX512-NEXT: retq1196 %1 = shufflevector <4 x double> %a0, <4 x double> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>1197 ret <8 x double> %11198}1199 1200define <4 x i64> @reg_broadcast_2i64_4i64(<2 x i64> %a0) nounwind {1201; X86-LABEL: reg_broadcast_2i64_4i64:1202; X86: # %bb.0:1203; X86-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01204; X86-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01205; X86-NEXT: retl1206;1207; X64-LABEL: reg_broadcast_2i64_4i64:1208; X64: # %bb.0:1209; X64-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01210; X64-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01211; X64-NEXT: retq1212 %1 = shufflevector <2 x i64> %a0, <2 x i64> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>1213 ret <4 x i64> %11214}1215 1216define <8 x i64> @reg_broadcast_2i64_8i64(<2 x i64> %a0) nounwind {1217; X86-AVX-LABEL: reg_broadcast_2i64_8i64:1218; X86-AVX: # %bb.0:1219; X86-AVX-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01220; X86-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01221; X86-AVX-NEXT: vmovaps %ymm0, %ymm11222; X86-AVX-NEXT: retl1223;1224; X86-AVX512-LABEL: reg_broadcast_2i64_8i64:1225; X86-AVX512: # %bb.0:1226; X86-AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01227; X86-AVX512-NEXT: vshufi64x2 {{.*#+}} zmm0 = zmm0[0,1,0,1,0,1,0,1]1228; X86-AVX512-NEXT: retl1229;1230; X64-AVX-LABEL: reg_broadcast_2i64_8i64:1231; X64-AVX: # %bb.0:1232; X64-AVX-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01233; X64-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01234; X64-AVX-NEXT: vmovaps %ymm0, %ymm11235; X64-AVX-NEXT: retq1236;1237; X64-AVX512-LABEL: reg_broadcast_2i64_8i64:1238; X64-AVX512: # %bb.0:1239; X64-AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01240; X64-AVX512-NEXT: vshufi64x2 {{.*#+}} zmm0 = zmm0[0,1,0,1,0,1,0,1]1241; X64-AVX512-NEXT: retq1242 %1 = shufflevector <2 x i64> %a0, <2 x i64> undef, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>1243 ret <8 x i64> %11244}1245 1246define <8 x i64> @reg_broadcast_4i64_8i64(<4 x i64> %a0) nounwind {1247; X86-AVX-LABEL: reg_broadcast_4i64_8i64:1248; X86-AVX: # %bb.0:1249; X86-AVX-NEXT: vmovaps %ymm0, %ymm11250; X86-AVX-NEXT: retl1251;1252; X86-AVX512-LABEL: reg_broadcast_4i64_8i64:1253; X86-AVX512: # %bb.0:1254; X86-AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01255; X86-AVX512-NEXT: vinsertf64x4 $1, %ymm0, %zmm0, %zmm01256; X86-AVX512-NEXT: retl1257;1258; X64-AVX-LABEL: reg_broadcast_4i64_8i64:1259; X64-AVX: # %bb.0:1260; X64-AVX-NEXT: vmovaps %ymm0, %ymm11261; X64-AVX-NEXT: retq1262;1263; X64-AVX512-LABEL: reg_broadcast_4i64_8i64:1264; X64-AVX512: # %bb.0:1265; X64-AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01266; X64-AVX512-NEXT: vinsertf64x4 $1, %ymm0, %zmm0, %zmm01267; X64-AVX512-NEXT: retq1268 %1 = shufflevector <4 x i64> %a0, <4 x i64> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>1269 ret <8 x i64> %11270}1271 1272define <8 x float> @reg_broadcast_4f32_8f32(<4 x float> %a0) nounwind {1273; X86-LABEL: reg_broadcast_4f32_8f32:1274; X86: # %bb.0:1275; X86-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01276; X86-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01277; X86-NEXT: retl1278;1279; X64-LABEL: reg_broadcast_4f32_8f32:1280; X64: # %bb.0:1281; X64-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01282; X64-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01283; X64-NEXT: retq1284 %1 = shufflevector <4 x float> %a0, <4 x float> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>1285 ret <8 x float> %11286}1287 1288define <16 x float> @reg_broadcast_4f32_16f32(<4 x float> %a0) nounwind {1289; X86-AVX-LABEL: reg_broadcast_4f32_16f32:1290; X86-AVX: # %bb.0:1291; X86-AVX-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01292; X86-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01293; X86-AVX-NEXT: vmovaps %ymm0, %ymm11294; X86-AVX-NEXT: retl1295;1296; X86-AVX512-LABEL: reg_broadcast_4f32_16f32:1297; X86-AVX512: # %bb.0:1298; X86-AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01299; X86-AVX512-NEXT: vshuff64x2 {{.*#+}} zmm0 = zmm0[0,1,0,1,0,1,0,1]1300; X86-AVX512-NEXT: retl1301;1302; X64-AVX-LABEL: reg_broadcast_4f32_16f32:1303; X64-AVX: # %bb.0:1304; X64-AVX-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01305; X64-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01306; X64-AVX-NEXT: vmovaps %ymm0, %ymm11307; X64-AVX-NEXT: retq1308;1309; X64-AVX512-LABEL: reg_broadcast_4f32_16f32:1310; X64-AVX512: # %bb.0:1311; X64-AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01312; X64-AVX512-NEXT: vshuff64x2 {{.*#+}} zmm0 = zmm0[0,1,0,1,0,1,0,1]1313; X64-AVX512-NEXT: retq1314 %1 = shufflevector <4 x float> %a0, <4 x float> 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>1315 ret <16 x float> %11316}1317 1318define <16 x float> @reg_broadcast_8f32_16f32(<8 x float> %a0) nounwind {1319; X86-AVX-LABEL: reg_broadcast_8f32_16f32:1320; X86-AVX: # %bb.0:1321; X86-AVX-NEXT: vmovaps %ymm0, %ymm11322; X86-AVX-NEXT: retl1323;1324; X86-AVX512-LABEL: reg_broadcast_8f32_16f32:1325; X86-AVX512: # %bb.0:1326; X86-AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01327; X86-AVX512-NEXT: vinsertf64x4 $1, %ymm0, %zmm0, %zmm01328; X86-AVX512-NEXT: retl1329;1330; X64-AVX-LABEL: reg_broadcast_8f32_16f32:1331; X64-AVX: # %bb.0:1332; X64-AVX-NEXT: vmovaps %ymm0, %ymm11333; X64-AVX-NEXT: retq1334;1335; X64-AVX512-LABEL: reg_broadcast_8f32_16f32:1336; X64-AVX512: # %bb.0:1337; X64-AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01338; X64-AVX512-NEXT: vinsertf64x4 $1, %ymm0, %zmm0, %zmm01339; X64-AVX512-NEXT: retq1340 %1 = shufflevector <8 x float> %a0, <8 x float> 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>1341 ret <16 x float> %11342}1343 1344define <8 x i32> @reg_broadcast_4i32_8i32(<4 x i32> %a0) nounwind {1345; X86-LABEL: reg_broadcast_4i32_8i32:1346; X86: # %bb.0:1347; X86-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01348; X86-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01349; X86-NEXT: retl1350;1351; X64-LABEL: reg_broadcast_4i32_8i32:1352; X64: # %bb.0:1353; X64-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01354; X64-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01355; X64-NEXT: retq1356 %1 = shufflevector <4 x i32> %a0, <4 x i32> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>1357 ret <8 x i32> %11358}1359 1360define <16 x i32> @reg_broadcast_4i32_16i32(<4 x i32> %a0) nounwind {1361; X86-AVX-LABEL: reg_broadcast_4i32_16i32:1362; X86-AVX: # %bb.0:1363; X86-AVX-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01364; X86-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01365; X86-AVX-NEXT: vmovaps %ymm0, %ymm11366; X86-AVX-NEXT: retl1367;1368; X86-AVX512-LABEL: reg_broadcast_4i32_16i32:1369; X86-AVX512: # %bb.0:1370; X86-AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01371; X86-AVX512-NEXT: vshufi64x2 {{.*#+}} zmm0 = zmm0[0,1,0,1,0,1,0,1]1372; X86-AVX512-NEXT: retl1373;1374; X64-AVX-LABEL: reg_broadcast_4i32_16i32:1375; X64-AVX: # %bb.0:1376; X64-AVX-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01377; X64-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01378; X64-AVX-NEXT: vmovaps %ymm0, %ymm11379; X64-AVX-NEXT: retq1380;1381; X64-AVX512-LABEL: reg_broadcast_4i32_16i32:1382; X64-AVX512: # %bb.0:1383; X64-AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01384; X64-AVX512-NEXT: vshufi64x2 {{.*#+}} zmm0 = zmm0[0,1,0,1,0,1,0,1]1385; X64-AVX512-NEXT: retq1386 %1 = shufflevector <4 x i32> %a0, <4 x i32> 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>1387 ret <16 x i32> %11388}1389 1390define <16 x i32> @reg_broadcast_8i32_16i32(<8 x i32> %a0) nounwind {1391; X86-AVX-LABEL: reg_broadcast_8i32_16i32:1392; X86-AVX: # %bb.0:1393; X86-AVX-NEXT: vmovaps %ymm0, %ymm11394; X86-AVX-NEXT: retl1395;1396; X86-AVX512-LABEL: reg_broadcast_8i32_16i32:1397; X86-AVX512: # %bb.0:1398; X86-AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01399; X86-AVX512-NEXT: vinsertf64x4 $1, %ymm0, %zmm0, %zmm01400; X86-AVX512-NEXT: retl1401;1402; X64-AVX-LABEL: reg_broadcast_8i32_16i32:1403; X64-AVX: # %bb.0:1404; X64-AVX-NEXT: vmovaps %ymm0, %ymm11405; X64-AVX-NEXT: retq1406;1407; X64-AVX512-LABEL: reg_broadcast_8i32_16i32:1408; X64-AVX512: # %bb.0:1409; X64-AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01410; X64-AVX512-NEXT: vinsertf64x4 $1, %ymm0, %zmm0, %zmm01411; X64-AVX512-NEXT: retq1412 %1 = shufflevector <8 x i32> %a0, <8 x i32> 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>1413 ret <16 x i32> %11414}1415 1416define <16 x i16> @reg_broadcast_8i16_16i16(<8 x i16> %a0) nounwind {1417; X86-LABEL: reg_broadcast_8i16_16i16:1418; X86: # %bb.0:1419; X86-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01420; X86-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01421; X86-NEXT: retl1422;1423; X64-LABEL: reg_broadcast_8i16_16i16:1424; X64: # %bb.0:1425; X64-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01426; X64-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01427; X64-NEXT: retq1428 %1 = shufflevector <8 x i16> %a0, <8 x i16> 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>1429 ret <16 x i16> %11430}1431 1432define <32 x i16> @reg_broadcast_8i16_32i16(<8 x i16> %a0) nounwind {1433; X86-AVX-LABEL: reg_broadcast_8i16_32i16:1434; X86-AVX: # %bb.0:1435; X86-AVX-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01436; X86-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01437; X86-AVX-NEXT: vmovaps %ymm0, %ymm11438; X86-AVX-NEXT: retl1439;1440; X86-AVX512-LABEL: reg_broadcast_8i16_32i16:1441; X86-AVX512: # %bb.0:1442; X86-AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01443; X86-AVX512-NEXT: vshufi64x2 {{.*#+}} zmm0 = zmm0[0,1,0,1,0,1,0,1]1444; X86-AVX512-NEXT: retl1445;1446; X64-AVX-LABEL: reg_broadcast_8i16_32i16:1447; X64-AVX: # %bb.0:1448; X64-AVX-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01449; X64-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01450; X64-AVX-NEXT: vmovaps %ymm0, %ymm11451; X64-AVX-NEXT: retq1452;1453; X64-AVX512-LABEL: reg_broadcast_8i16_32i16:1454; X64-AVX512: # %bb.0:1455; X64-AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01456; X64-AVX512-NEXT: vshufi64x2 {{.*#+}} zmm0 = zmm0[0,1,0,1,0,1,0,1]1457; X64-AVX512-NEXT: retq1458 %1 = shufflevector <8 x i16> %a0, <8 x i16> 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>1459 ret <32 x i16> %11460}1461 1462define <32 x i16> @reg_broadcast_16i16_32i16(<16 x i16> %a0) nounwind {1463; X86-AVX-LABEL: reg_broadcast_16i16_32i16:1464; X86-AVX: # %bb.0:1465; X86-AVX-NEXT: vmovaps %ymm0, %ymm11466; X86-AVX-NEXT: retl1467;1468; X86-AVX512-LABEL: reg_broadcast_16i16_32i16:1469; X86-AVX512: # %bb.0:1470; X86-AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01471; X86-AVX512-NEXT: vinsertf64x4 $1, %ymm0, %zmm0, %zmm01472; X86-AVX512-NEXT: retl1473;1474; X64-AVX-LABEL: reg_broadcast_16i16_32i16:1475; X64-AVX: # %bb.0:1476; X64-AVX-NEXT: vmovaps %ymm0, %ymm11477; X64-AVX-NEXT: retq1478;1479; X64-AVX512-LABEL: reg_broadcast_16i16_32i16:1480; X64-AVX512: # %bb.0:1481; X64-AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01482; X64-AVX512-NEXT: vinsertf64x4 $1, %ymm0, %zmm0, %zmm01483; X64-AVX512-NEXT: retq1484 %1 = shufflevector <16 x i16> %a0, <16 x i16> undef, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>1485 ret <32 x i16> %11486}1487 1488define <32 x i8> @reg_broadcast_16i8_32i8(<16 x i8> %a0) nounwind {1489; X86-LABEL: reg_broadcast_16i8_32i8:1490; X86: # %bb.0:1491; X86-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01492; X86-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01493; X86-NEXT: retl1494;1495; X64-LABEL: reg_broadcast_16i8_32i8:1496; X64: # %bb.0:1497; X64-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01498; X64-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01499; X64-NEXT: retq1500 %1 = shufflevector <16 x i8> %a0, <16 x i8> undef, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>1501 ret <32 x i8> %11502}1503 1504define <64 x i8> @reg_broadcast_16i8_64i8(<16 x i8> %a0) nounwind {1505; X86-AVX-LABEL: reg_broadcast_16i8_64i8:1506; X86-AVX: # %bb.0:1507; X86-AVX-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01508; X86-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01509; X86-AVX-NEXT: vmovaps %ymm0, %ymm11510; X86-AVX-NEXT: retl1511;1512; X86-AVX512-LABEL: reg_broadcast_16i8_64i8:1513; X86-AVX512: # %bb.0:1514; X86-AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01515; X86-AVX512-NEXT: vshufi64x2 {{.*#+}} zmm0 = zmm0[0,1,0,1,0,1,0,1]1516; X86-AVX512-NEXT: retl1517;1518; X64-AVX-LABEL: reg_broadcast_16i8_64i8:1519; X64-AVX: # %bb.0:1520; X64-AVX-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01521; X64-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01522; X64-AVX-NEXT: vmovaps %ymm0, %ymm11523; X64-AVX-NEXT: retq1524;1525; X64-AVX512-LABEL: reg_broadcast_16i8_64i8:1526; X64-AVX512: # %bb.0:1527; X64-AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01528; X64-AVX512-NEXT: vshufi64x2 {{.*#+}} zmm0 = zmm0[0,1,0,1,0,1,0,1]1529; X64-AVX512-NEXT: retq1530 %1 = shufflevector <16 x i8> %a0, <16 x i8> undef, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>1531 ret <64 x i8> %11532}1533 1534define <64 x i8> @reg_broadcast_32i8_64i8(<32 x i8> %a0) nounwind {1535; X86-AVX-LABEL: reg_broadcast_32i8_64i8:1536; X86-AVX: # %bb.0:1537; X86-AVX-NEXT: vmovaps %ymm0, %ymm11538; X86-AVX-NEXT: retl1539;1540; X86-AVX512-LABEL: reg_broadcast_32i8_64i8:1541; X86-AVX512: # %bb.0:1542; X86-AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01543; X86-AVX512-NEXT: vinsertf64x4 $1, %ymm0, %zmm0, %zmm01544; X86-AVX512-NEXT: retl1545;1546; X64-AVX-LABEL: reg_broadcast_32i8_64i8:1547; X64-AVX: # %bb.0:1548; X64-AVX-NEXT: vmovaps %ymm0, %ymm11549; X64-AVX-NEXT: retq1550;1551; X64-AVX512-LABEL: reg_broadcast_32i8_64i8:1552; X64-AVX512: # %bb.0:1553; X64-AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01554; X64-AVX512-NEXT: vinsertf64x4 $1, %ymm0, %zmm0, %zmm01555; X64-AVX512-NEXT: retq1556 %1 = shufflevector <32 x i8> %a0, <32 x i8> undef, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>1557 ret <64 x i8> %11558}1559 1560;1561; PR343941562;1563 1564define <4 x i32> @test_2xi32_to_4xi32_mem(ptr %vp) {1565; X86-LABEL: test_2xi32_to_4xi32_mem:1566; X86: # %bb.0:1567; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1568; X86-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]1569; X86-NEXT: retl1570;1571; X64-LABEL: test_2xi32_to_4xi32_mem:1572; X64: # %bb.0:1573; X64-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]1574; X64-NEXT: retq1575 %vec = load <2 x i32>, ptr %vp1576 %res = shufflevector <2 x i32> %vec, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>1577 ret <4 x i32> %res1578}1579 1580define <8 x i32> @test_2xi32_to_8xi32_mem(ptr %vp) {1581; X86-LABEL: test_2xi32_to_8xi32_mem:1582; X86: # %bb.0:1583; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1584; X86-NEXT: vbroadcastsd (%eax), %ymm01585; X86-NEXT: retl1586;1587; X64-LABEL: test_2xi32_to_8xi32_mem:1588; X64: # %bb.0:1589; X64-NEXT: vbroadcastsd (%rdi), %ymm01590; X64-NEXT: retq1591 %vec = load <2 x i32>, ptr %vp1592 %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>1593 ret <8 x i32> %res1594}1595 1596define <16 x i32> @test_2xi32_to_16xi32_mem(ptr %vp) {1597; X86-AVX-LABEL: test_2xi32_to_16xi32_mem:1598; X86-AVX: # %bb.0:1599; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax1600; X86-AVX-NEXT: vbroadcastsd (%eax), %ymm01601; X86-AVX-NEXT: vmovaps %ymm0, %ymm11602; X86-AVX-NEXT: retl1603;1604; X86-AVX512-LABEL: test_2xi32_to_16xi32_mem:1605; X86-AVX512: # %bb.0:1606; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax1607; X86-AVX512-NEXT: vbroadcastsd (%eax), %zmm01608; X86-AVX512-NEXT: retl1609;1610; X64-AVX-LABEL: test_2xi32_to_16xi32_mem:1611; X64-AVX: # %bb.0:1612; X64-AVX-NEXT: vbroadcastsd (%rdi), %ymm01613; X64-AVX-NEXT: vmovaps %ymm0, %ymm11614; X64-AVX-NEXT: retq1615;1616; X64-AVX512-LABEL: test_2xi32_to_16xi32_mem:1617; X64-AVX512: # %bb.0:1618; X64-AVX512-NEXT: vbroadcastsd (%rdi), %zmm01619; X64-AVX512-NEXT: retq1620 %vec = load <2 x i32>, ptr %vp1621 %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>1622 ret <16 x i32> %res1623}1624 1625;1626; PR340411627;1628 1629define <4 x double> @broadcast_v4f64_f64_u000(ptr %p) {1630; X86-LABEL: broadcast_v4f64_f64_u000:1631; X86: # %bb.0:1632; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1633; X86-NEXT: vbroadcastsd (%eax), %ymm01634; X86-NEXT: retl1635;1636; X64-LABEL: broadcast_v4f64_f64_u000:1637; X64: # %bb.0:1638; X64-NEXT: vbroadcastsd (%rdi), %ymm01639; X64-NEXT: retq1640 %s = load double, ptr %p1641 %vec = insertelement <2 x double> undef, double %s, i32 01642 %res = shufflevector <2 x double> %vec, <2 x double> undef, <4 x i32> <i32 1, i32 0, i32 0, i32 0>1643 ret <4 x double> %res1644}1645 1646define <4 x double> @broadcast_v4f64_v2f64_4u61(ptr %vp, <4 x double> %default) {1647; X86-LABEL: broadcast_v4f64_v2f64_4u61:1648; X86: # %bb.0:1649; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1650; X86-NEXT: vinsertf128 $1, (%eax), %ymm0, %ymm11651; X86-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5],ymm1[6,7]1652; X86-NEXT: retl1653;1654; X64-LABEL: broadcast_v4f64_v2f64_4u61:1655; X64: # %bb.0:1656; X64-NEXT: vinsertf128 $1, (%rdi), %ymm0, %ymm11657; X64-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5],ymm1[6,7]1658; X64-NEXT: retq1659 %vec = load <2 x double>, ptr %vp1660 %shuf = shufflevector <2 x double> %vec, <2 x double> undef, <4 x i32> <i32 0, i32 3, i32 undef, i32 1>1661 %res = select <4 x i1> <i1 0, i1 1, i1 0, i1 1>, <4 x double> %shuf, <4 x double> %default1662 ret <4 x double> %res1663}1664 1665; TODO: prefer vblend vs vunpckh on AVX1 targets1666define <8 x float> @broadcast_v8f32_v2f32_u1uu0uEu(ptr %vp, <8 x float> %default) {1667; X86-AVX1-LABEL: broadcast_v8f32_v2f32_u1uu0uEu:1668; X86-AVX1: # %bb.0:1669; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax1670; X86-AVX1-NEXT: vbroadcastsd (%eax), %ymm11671; X86-AVX1-NEXT: vunpckhpd {{.*#+}} ymm0 = ymm1[1],ymm0[1],ymm1[3],ymm0[3]1672; X86-AVX1-NEXT: retl1673;1674; X86-AVX2-LABEL: broadcast_v8f32_v2f32_u1uu0uEu:1675; X86-AVX2: # %bb.0:1676; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax1677; X86-AVX2-NEXT: vbroadcastsd (%eax), %ymm11678; X86-AVX2-NEXT: vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3,4,5],ymm0[6,7]1679; X86-AVX2-NEXT: retl1680;1681; X86-AVX512-LABEL: broadcast_v8f32_v2f32_u1uu0uEu:1682; X86-AVX512: # %bb.0:1683; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax1684; X86-AVX512-NEXT: vbroadcastsd (%eax), %ymm11685; X86-AVX512-NEXT: vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3,4,5],ymm0[6,7]1686; X86-AVX512-NEXT: retl1687;1688; X64-AVX1-LABEL: broadcast_v8f32_v2f32_u1uu0uEu:1689; X64-AVX1: # %bb.0:1690; X64-AVX1-NEXT: vbroadcastsd (%rdi), %ymm11691; X64-AVX1-NEXT: vunpckhpd {{.*#+}} ymm0 = ymm1[1],ymm0[1],ymm1[3],ymm0[3]1692; X64-AVX1-NEXT: retq1693;1694; X64-AVX2-LABEL: broadcast_v8f32_v2f32_u1uu0uEu:1695; X64-AVX2: # %bb.0:1696; X64-AVX2-NEXT: vbroadcastsd (%rdi), %ymm11697; X64-AVX2-NEXT: vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3,4,5],ymm0[6,7]1698; X64-AVX2-NEXT: retq1699;1700; X64-AVX512-LABEL: broadcast_v8f32_v2f32_u1uu0uEu:1701; X64-AVX512: # %bb.0:1702; X64-AVX512-NEXT: vbroadcastsd (%rdi), %ymm11703; X64-AVX512-NEXT: vblendps {{.*#+}} ymm0 = ymm1[0,1,2,3,4,5],ymm0[6,7]1704; X64-AVX512-NEXT: retq1705 %vec = load <2 x float>, ptr %vp1706 %shuf = shufflevector <2 x float> %vec, <2 x float> undef, <8 x i32> <i32 undef, i32 1, i32 undef, i32 undef, i32 0, i32 2, i32 3, i32 undef>1707 %res = select <8 x i1> <i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 0, i1 1>, <8 x float> %shuf, <8 x float> %default1708 ret <8 x float> %res1709}1710 1711define <8 x double> @broadcast_v8f64_v2f64_u1u10101(ptr %vp) {1712; X86-AVX-LABEL: broadcast_v8f64_v2f64_u1u10101:1713; X86-AVX: # %bb.0:1714; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax1715; X86-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]1716; X86-AVX-NEXT: vmovaps %ymm0, %ymm11717; X86-AVX-NEXT: retl1718;1719; X86-AVX512-LABEL: broadcast_v8f64_v2f64_u1u10101:1720; X86-AVX512: # %bb.0:1721; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax1722; X86-AVX512-NEXT: vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]1723; X86-AVX512-NEXT: retl1724;1725; X64-AVX-LABEL: broadcast_v8f64_v2f64_u1u10101:1726; X64-AVX: # %bb.0:1727; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]1728; X64-AVX-NEXT: vmovaps %ymm0, %ymm11729; X64-AVX-NEXT: retq1730;1731; X64-AVX512-LABEL: broadcast_v8f64_v2f64_u1u10101:1732; X64-AVX512: # %bb.0:1733; X64-AVX512-NEXT: vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]1734; X64-AVX512-NEXT: retq1735 %vec = load <2 x double>, ptr %vp1736 %res = shufflevector <2 x double> %vec, <2 x double> undef, <8 x i32> <i32 3, i32 1, i32 undef, i32 1, i32 0, i32 1, i32 0, i32 1>1737 ret <8 x double> %res1738}1739 1740define <8 x double> @broadcast_v8f64_v2f64_0uuu0101(ptr %vp) {1741; X86-AVX-LABEL: broadcast_v8f64_v2f64_0uuu0101:1742; X86-AVX: # %bb.0:1743; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax1744; X86-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]1745; X86-AVX-NEXT: vmovaps %ymm0, %ymm11746; X86-AVX-NEXT: retl1747;1748; X86-AVX512-LABEL: broadcast_v8f64_v2f64_0uuu0101:1749; X86-AVX512: # %bb.0:1750; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax1751; X86-AVX512-NEXT: vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]1752; X86-AVX512-NEXT: retl1753;1754; X64-AVX-LABEL: broadcast_v8f64_v2f64_0uuu0101:1755; X64-AVX: # %bb.0:1756; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]1757; X64-AVX-NEXT: vmovaps %ymm0, %ymm11758; X64-AVX-NEXT: retq1759;1760; X64-AVX512-LABEL: broadcast_v8f64_v2f64_0uuu0101:1761; X64-AVX512: # %bb.0:1762; X64-AVX512-NEXT: vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]1763; X64-AVX512-NEXT: retq1764 %vec = load <2 x double>, ptr %vp1765 %res = shufflevector <2 x double> %vec, <2 x double> undef, <8 x i32> <i32 0, i32 undef, i32 undef, i32 undef, i32 0, i32 1, i32 0, i32 1>1766 ret <8 x double> %res1767}1768 1769define void @PR51226() {1770; X86-AVX1-LABEL: PR51226:1771; X86-AVX1: # %bb.0:1772; X86-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1773; X86-AVX1-NEXT: vpslld $16, %xmm0, %xmm01774; X86-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01775; X86-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm11776; X86-AVX1-NEXT: vminps %ymm1, %ymm0, %ymm01777; X86-AVX1-NEXT: vmovups %ymm0, (%eax)1778; X86-AVX1-NEXT: vzeroupper1779; X86-AVX1-NEXT: retl1780;1781; X86-AVX2-LABEL: PR51226:1782; X86-AVX2: # %bb.0:1783; X86-AVX2-NEXT: vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1784; X86-AVX2-NEXT: vpslld $16, %xmm0, %xmm01785; X86-AVX2-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm01786; X86-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm11787; X86-AVX2-NEXT: vminps %ymm1, %ymm0, %ymm01788; X86-AVX2-NEXT: vmovups %ymm0, (%eax)1789; X86-AVX2-NEXT: vzeroupper1790; X86-AVX2-NEXT: retl1791;1792; X86-AVX512-LABEL: PR51226:1793; X86-AVX512: # %bb.0:1794; X86-AVX512-NEXT: vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1795; X86-AVX512-NEXT: vpslld $16, %xmm0, %xmm01796; X86-AVX512-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm01797; X86-AVX512-NEXT: vxorps %xmm1, %xmm1, %xmm11798; X86-AVX512-NEXT: vminps %ymm1, %ymm0, %ymm01799; X86-AVX512-NEXT: vmovups %ymm0, (%eax)1800; X86-AVX512-NEXT: vzeroupper1801; X86-AVX512-NEXT: retl1802;1803; X64-AVX1-LABEL: PR51226:1804; X64-AVX1: # %bb.0:1805; X64-AVX1-NEXT: vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1806; X64-AVX1-NEXT: vpslld $16, %xmm0, %xmm01807; X64-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01808; X64-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm11809; X64-AVX1-NEXT: vminps %ymm1, %ymm0, %ymm01810; X64-AVX1-NEXT: vmovups %ymm0, (%rax)1811; X64-AVX1-NEXT: vzeroupper1812; X64-AVX1-NEXT: retq1813;1814; X64-AVX2-LABEL: PR51226:1815; X64-AVX2: # %bb.0:1816; X64-AVX2-NEXT: vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1817; X64-AVX2-NEXT: vpslld $16, %xmm0, %xmm01818; X64-AVX2-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm01819; X64-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm11820; X64-AVX2-NEXT: vminps %ymm1, %ymm0, %ymm01821; X64-AVX2-NEXT: vmovups %ymm0, (%rax)1822; X64-AVX2-NEXT: vzeroupper1823; X64-AVX2-NEXT: retq1824;1825; X64-AVX512-LABEL: PR51226:1826; X64-AVX512: # %bb.0:1827; X64-AVX512-NEXT: vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero1828; X64-AVX512-NEXT: vpslld $16, %xmm0, %xmm01829; X64-AVX512-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm01830; X64-AVX512-NEXT: vxorps %xmm1, %xmm1, %xmm11831; X64-AVX512-NEXT: vminps %ymm1, %ymm0, %ymm01832; X64-AVX512-NEXT: vmovups %ymm0, (%rax)1833; X64-AVX512-NEXT: vzeroupper1834; X64-AVX512-NEXT: retq1835 %i = load <4 x i16>, ptr undef, align 81836 %i1 = zext <4 x i16> %i to <4 x i32>1837 %i2 = shl nuw <4 x i32> %i1, <i32 16, i32 16, i32 16, i32 16>1838 %i3 = bitcast <4 x i32> %i2 to <4 x float>1839 %shuffle99 = shufflevector <4 x float> %i3, <4 x float> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>1840 %i4 = fcmp reassoc nsz contract ogt <8 x float> zeroinitializer, %shuffle991841 %i5 = select <8 x i1> %i4, <8 x float> %shuffle99, <8 x float> zeroinitializer1842 store <8 x float> %i5, ptr undef, align 161843 ret void1844}1845