1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i686-apple-darwin -mattr=+avx | FileCheck %s --check-prefix=X32 --check-prefix=X32-AVX --check-prefix=X32-AVX1 3; RUN: llc < %s -mtriple=i686-apple-darwin -mattr=+avx2 | FileCheck %s --check-prefix=X32 --check-prefix=X32-AVX --check-prefix=X32-AVX2 4; RUN: llc < %s -mtriple=i686-apple-darwin -mattr=+avx512vl | FileCheck %s --check-prefix=X32 --check-prefix=X32-AVX512 --check-prefix=X32-AVX512F 5; RUN: llc < %s -mtriple=i686-apple-darwin -mattr=+avx512bw,+avx512vl | FileCheck %s --check-prefix=X32 --check-prefix=X32-AVX512 --check-prefix=X32-AVX512BW 6; RUN: llc < %s -mtriple=i686-apple-darwin -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefix=X32 --check-prefix=X32-AVX512 --check-prefix=X32-AVX512DQ 7; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx | FileCheck %s --check-prefix=X64 --check-prefix=X64-AVX --check-prefix=X64-AVX1 8; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx2 | FileCheck %s --check-prefix=X64 --check-prefix=X64-AVX --check-prefix=X64-AVX2 9; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512vl | FileCheck %s --check-prefix=X64 --check-prefix=X64-AVX512 --check-prefix=X64-AVX512F 10; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512bw,+avx512vl | FileCheck %s --check-prefix=X64 --check-prefix=X64-AVX512 --check-prefix=X64-AVX512BW 11; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefix=X64 --check-prefix=X64-AVX512 --check-prefix=X64-AVX512DQ 12 13; 14; Subvector Load + Broadcast 15; 16 17define <4 x double> @test_broadcast_2f64_4f64(<2 x double> *%p) nounwind { 18; X32-AVX-LABEL: test_broadcast_2f64_4f64: 19; X32-AVX: ## BB#0: 20; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 21; X32-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 22; X32-AVX-NEXT: retl 23; 24; X32-AVX512F-LABEL: test_broadcast_2f64_4f64: 25; X32-AVX512F: ## BB#0: 26; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax 27; X32-AVX512F-NEXT: vbroadcastf32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 28; X32-AVX512F-NEXT: retl 29; 30; X32-AVX512BW-LABEL: test_broadcast_2f64_4f64: 31; X32-AVX512BW: ## BB#0: 32; X32-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %eax 33; X32-AVX512BW-NEXT: vbroadcastf32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 34; X32-AVX512BW-NEXT: retl 35; 36; X32-AVX512DQ-LABEL: test_broadcast_2f64_4f64: 37; X32-AVX512DQ: ## BB#0: 38; X32-AVX512DQ-NEXT: movl {{[0-9]+}}(%esp), %eax 39; X32-AVX512DQ-NEXT: vbroadcastf64x2 {{.*#+}} ymm0 = mem[0,1,0,1] 40; X32-AVX512DQ-NEXT: retl 41; 42; X64-AVX-LABEL: test_broadcast_2f64_4f64: 43; X64-AVX: ## BB#0: 44; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 45; X64-AVX-NEXT: retq 46; 47; X64-AVX512F-LABEL: test_broadcast_2f64_4f64: 48; X64-AVX512F: ## BB#0: 49; X64-AVX512F-NEXT: vbroadcastf32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 50; X64-AVX512F-NEXT: retq 51; 52; X64-AVX512BW-LABEL: test_broadcast_2f64_4f64: 53; X64-AVX512BW: ## BB#0: 54; X64-AVX512BW-NEXT: vbroadcastf32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 55; X64-AVX512BW-NEXT: retq 56; 57; X64-AVX512DQ-LABEL: test_broadcast_2f64_4f64: 58; X64-AVX512DQ: ## BB#0: 59; X64-AVX512DQ-NEXT: vbroadcastf64x2 {{.*#+}} ymm0 = mem[0,1,0,1] 60; X64-AVX512DQ-NEXT: retq 61 %1 = load <2 x double>, <2 x double> *%p 62 %2 = shufflevector <2 x double> %1, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1> 63 ret <4 x double> %2 64} 65 66define <8 x double> @test_broadcast_2f64_8f64(<2 x double> *%p) nounwind { 67; X32-AVX-LABEL: test_broadcast_2f64_8f64: 68; X32-AVX: ## BB#0: 69; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 70; X32-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 71; X32-AVX-NEXT: vmovdqa %ymm0, %ymm1 72; X32-AVX-NEXT: retl 73; 74; X32-AVX512F-LABEL: test_broadcast_2f64_8f64: 75; X32-AVX512F: ## BB#0: 76; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax 77; X32-AVX512F-NEXT: vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3] 78; X32-AVX512F-NEXT: retl 79; 80; X32-AVX512BW-LABEL: test_broadcast_2f64_8f64: 81; X32-AVX512BW: ## BB#0: 82; X32-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %eax 83; X32-AVX512BW-NEXT: vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3] 84; X32-AVX512BW-NEXT: retl 85; 86; X32-AVX512DQ-LABEL: test_broadcast_2f64_8f64: 87; X32-AVX512DQ: ## BB#0: 88; X32-AVX512DQ-NEXT: movl {{[0-9]+}}(%esp), %eax 89; X32-AVX512DQ-NEXT: vbroadcastf64x2 {{.*#+}} zmm0 = mem[0,1,0,1,0,1,0,1] 90; X32-AVX512DQ-NEXT: retl 91; 92; X64-AVX-LABEL: test_broadcast_2f64_8f64: 93; X64-AVX: ## BB#0: 94; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 95; X64-AVX-NEXT: vmovdqa %ymm0, %ymm1 96; X64-AVX-NEXT: retq 97; 98; X64-AVX512F-LABEL: test_broadcast_2f64_8f64: 99; X64-AVX512F: ## BB#0: 100; X64-AVX512F-NEXT: vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3] 101; X64-AVX512F-NEXT: retq 102; 103; X64-AVX512BW-LABEL: test_broadcast_2f64_8f64: 104; X64-AVX512BW: ## BB#0: 105; X64-AVX512BW-NEXT: vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3] 106; X64-AVX512BW-NEXT: retq 107; 108; X64-AVX512DQ-LABEL: test_broadcast_2f64_8f64: 109; X64-AVX512DQ: ## BB#0: 110; X64-AVX512DQ-NEXT: vbroadcastf64x2 {{.*#+}} zmm0 = mem[0,1,0,1,0,1,0,1] 111; X64-AVX512DQ-NEXT: retq 112 %1 = load <2 x double>, <2 x double> *%p 113 %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> 114 ret <8 x double> %2 115} 116 117define <8 x double> @test_broadcast_4f64_8f64(<4 x double> *%p) nounwind { 118; X32-AVX-LABEL: test_broadcast_4f64_8f64: 119; X32-AVX: ## BB#0: 120; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 121; X32-AVX-NEXT: vmovaps (%eax), %ymm0 122; X32-AVX-NEXT: vmovaps %ymm0, %ymm1 123; X32-AVX-NEXT: retl 124; 125; X32-AVX512-LABEL: test_broadcast_4f64_8f64: 126; X32-AVX512: ## BB#0: 127; X32-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax 128; X32-AVX512-NEXT: vbroadcastf64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3] 129; X32-AVX512-NEXT: retl 130; 131; X64-AVX-LABEL: test_broadcast_4f64_8f64: 132; X64-AVX: ## BB#0: 133; X64-AVX-NEXT: vmovaps (%rdi), %ymm0 134; X64-AVX-NEXT: vmovaps %ymm0, %ymm1 135; X64-AVX-NEXT: retq 136; 137; X64-AVX512-LABEL: test_broadcast_4f64_8f64: 138; X64-AVX512: ## BB#0: 139; X64-AVX512-NEXT: vbroadcastf64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3] 140; X64-AVX512-NEXT: retq 141 %1 = load <4 x double>, <4 x double> *%p 142 %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> 143 ret <8 x double> %2 144} 145 146define <4 x i64> @test_broadcast_2i64_4i64(<2 x i64> *%p) nounwind { 147; X32-AVX-LABEL: test_broadcast_2i64_4i64: 148; X32-AVX: ## BB#0: 149; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 150; X32-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 151; X32-AVX-NEXT: retl 152; 153; X32-AVX512F-LABEL: test_broadcast_2i64_4i64: 154; X32-AVX512F: ## BB#0: 155; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax 156; X32-AVX512F-NEXT: vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 157; X32-AVX512F-NEXT: retl 158; 159; X32-AVX512BW-LABEL: test_broadcast_2i64_4i64: 160; X32-AVX512BW: ## BB#0: 161; X32-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %eax 162; X32-AVX512BW-NEXT: vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 163; X32-AVX512BW-NEXT: retl 164; 165; X32-AVX512DQ-LABEL: test_broadcast_2i64_4i64: 166; X32-AVX512DQ: ## BB#0: 167; X32-AVX512DQ-NEXT: movl {{[0-9]+}}(%esp), %eax 168; X32-AVX512DQ-NEXT: vbroadcasti64x2 {{.*#+}} ymm0 = mem[0,1,0,1] 169; X32-AVX512DQ-NEXT: retl 170; 171; X64-AVX-LABEL: test_broadcast_2i64_4i64: 172; X64-AVX: ## BB#0: 173; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 174; X64-AVX-NEXT: retq 175; 176; X64-AVX512F-LABEL: test_broadcast_2i64_4i64: 177; X64-AVX512F: ## BB#0: 178; X64-AVX512F-NEXT: vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 179; X64-AVX512F-NEXT: retq 180; 181; X64-AVX512BW-LABEL: test_broadcast_2i64_4i64: 182; X64-AVX512BW: ## BB#0: 183; X64-AVX512BW-NEXT: vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 184; X64-AVX512BW-NEXT: retq 185; 186; X64-AVX512DQ-LABEL: test_broadcast_2i64_4i64: 187; X64-AVX512DQ: ## BB#0: 188; X64-AVX512DQ-NEXT: vbroadcasti64x2 {{.*#+}} ymm0 = mem[0,1,0,1] 189; X64-AVX512DQ-NEXT: retq 190 %1 = load <2 x i64>, <2 x i64> *%p 191 %2 = shufflevector <2 x i64> %1, <2 x i64> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1> 192 ret <4 x i64> %2 193} 194 195define <8 x i64> @test_broadcast_2i64_8i64(<2 x i64> *%p) nounwind { 196; X32-AVX1-LABEL: test_broadcast_2i64_8i64: 197; X32-AVX1: ## BB#0: 198; X32-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax 199; X32-AVX1-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 200; X32-AVX1-NEXT: vmovdqa %ymm0, %ymm1 201; X32-AVX1-NEXT: retl 202; 203; X32-AVX2-LABEL: test_broadcast_2i64_8i64: 204; X32-AVX2: ## BB#0: 205; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax 206; X32-AVX2-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 207; X32-AVX2-NEXT: vmovaps %ymm0, %ymm1 208; X32-AVX2-NEXT: retl 209; 210; X32-AVX512F-LABEL: test_broadcast_2i64_8i64: 211; X32-AVX512F: ## BB#0: 212; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax 213; X32-AVX512F-NEXT: vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3] 214; X32-AVX512F-NEXT: retl 215; 216; X32-AVX512BW-LABEL: test_broadcast_2i64_8i64: 217; X32-AVX512BW: ## BB#0: 218; X32-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %eax 219; X32-AVX512BW-NEXT: vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3] 220; X32-AVX512BW-NEXT: retl 221; 222; X32-AVX512DQ-LABEL: test_broadcast_2i64_8i64: 223; X32-AVX512DQ: ## BB#0: 224; X32-AVX512DQ-NEXT: movl {{[0-9]+}}(%esp), %eax 225; X32-AVX512DQ-NEXT: vbroadcasti64x2 {{.*#+}} zmm0 = mem[0,1,0,1,0,1,0,1] 226; X32-AVX512DQ-NEXT: retl 227; 228; X64-AVX1-LABEL: test_broadcast_2i64_8i64: 229; X64-AVX1: ## BB#0: 230; X64-AVX1-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 231; X64-AVX1-NEXT: vmovdqa %ymm0, %ymm1 232; X64-AVX1-NEXT: retq 233; 234; X64-AVX2-LABEL: test_broadcast_2i64_8i64: 235; X64-AVX2: ## BB#0: 236; X64-AVX2-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 237; X64-AVX2-NEXT: vmovaps %ymm0, %ymm1 238; X64-AVX2-NEXT: retq 239; 240; X64-AVX512F-LABEL: test_broadcast_2i64_8i64: 241; X64-AVX512F: ## BB#0: 242; X64-AVX512F-NEXT: vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3] 243; X64-AVX512F-NEXT: retq 244; 245; X64-AVX512BW-LABEL: test_broadcast_2i64_8i64: 246; X64-AVX512BW: ## BB#0: 247; X64-AVX512BW-NEXT: vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3] 248; X64-AVX512BW-NEXT: retq 249; 250; X64-AVX512DQ-LABEL: test_broadcast_2i64_8i64: 251; X64-AVX512DQ: ## BB#0: 252; X64-AVX512DQ-NEXT: vbroadcasti64x2 {{.*#+}} zmm0 = mem[0,1,0,1,0,1,0,1] 253; X64-AVX512DQ-NEXT: retq 254 %1 = load <2 x i64>, <2 x i64> *%p 255 %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> 256 ret <8 x i64> %2 257} 258 259define <8 x i64> @test_broadcast_4i64_8i64(<4 x i64> *%p) nounwind { 260; X32-AVX-LABEL: test_broadcast_4i64_8i64: 261; X32-AVX: ## BB#0: 262; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 263; X32-AVX-NEXT: vmovaps (%eax), %ymm0 264; X32-AVX-NEXT: vmovaps %ymm0, %ymm1 265; X32-AVX-NEXT: retl 266; 267; X32-AVX512-LABEL: test_broadcast_4i64_8i64: 268; X32-AVX512: ## BB#0: 269; X32-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax 270; X32-AVX512-NEXT: vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3] 271; X32-AVX512-NEXT: retl 272; 273; X64-AVX-LABEL: test_broadcast_4i64_8i64: 274; X64-AVX: ## BB#0: 275; X64-AVX-NEXT: vmovaps (%rdi), %ymm0 276; X64-AVX-NEXT: vmovaps %ymm0, %ymm1 277; X64-AVX-NEXT: retq 278; 279; X64-AVX512-LABEL: test_broadcast_4i64_8i64: 280; X64-AVX512: ## BB#0: 281; X64-AVX512-NEXT: vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3] 282; X64-AVX512-NEXT: retq 283 %1 = load <4 x i64>, <4 x i64> *%p 284 %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> 285 ret <8 x i64> %2 286} 287 288define <8 x float> @test_broadcast_4f32_8f32(<4 x float> *%p) nounwind { 289; X32-AVX-LABEL: test_broadcast_4f32_8f32: 290; X32-AVX: ## BB#0: 291; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 292; X32-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 293; X32-AVX-NEXT: retl 294; 295; X32-AVX512-LABEL: test_broadcast_4f32_8f32: 296; X32-AVX512: ## BB#0: 297; X32-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax 298; X32-AVX512-NEXT: vbroadcastf32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 299; X32-AVX512-NEXT: retl 300; 301; X64-AVX-LABEL: test_broadcast_4f32_8f32: 302; X64-AVX: ## BB#0: 303; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 304; X64-AVX-NEXT: retq 305; 306; X64-AVX512-LABEL: test_broadcast_4f32_8f32: 307; X64-AVX512: ## BB#0: 308; X64-AVX512-NEXT: vbroadcastf32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 309; X64-AVX512-NEXT: retq 310 %1 = load <4 x float>, <4 x float> *%p 311 %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> 312 ret <8 x float> %2 313} 314 315define <16 x float> @test_broadcast_4f32_16f32(<4 x float> *%p) nounwind { 316; X32-AVX-LABEL: test_broadcast_4f32_16f32: 317; X32-AVX: ## BB#0: 318; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 319; X32-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 320; X32-AVX-NEXT: vmovdqa %ymm0, %ymm1 321; X32-AVX-NEXT: retl 322; 323; X32-AVX512-LABEL: test_broadcast_4f32_16f32: 324; X32-AVX512: ## BB#0: 325; X32-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax 326; X32-AVX512-NEXT: vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3] 327; X32-AVX512-NEXT: retl 328; 329; X64-AVX-LABEL: test_broadcast_4f32_16f32: 330; X64-AVX: ## BB#0: 331; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 332; X64-AVX-NEXT: vmovdqa %ymm0, %ymm1 333; X64-AVX-NEXT: retq 334; 335; X64-AVX512-LABEL: test_broadcast_4f32_16f32: 336; X64-AVX512: ## BB#0: 337; X64-AVX512-NEXT: vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3] 338; X64-AVX512-NEXT: retq 339 %1 = load <4 x float>, <4 x float> *%p 340 %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> 341 ret <16 x float> %2 342} 343 344define <16 x float> @test_broadcast_8f32_16f32(<8 x float> *%p) nounwind { 345; X32-AVX-LABEL: test_broadcast_8f32_16f32: 346; X32-AVX: ## BB#0: 347; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 348; X32-AVX-NEXT: vmovaps (%eax), %ymm0 349; X32-AVX-NEXT: vmovaps %ymm0, %ymm1 350; X32-AVX-NEXT: retl 351; 352; X32-AVX512F-LABEL: test_broadcast_8f32_16f32: 353; X32-AVX512F: ## BB#0: 354; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax 355; X32-AVX512F-NEXT: vbroadcastf64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3] 356; X32-AVX512F-NEXT: retl 357; 358; X32-AVX512BW-LABEL: test_broadcast_8f32_16f32: 359; X32-AVX512BW: ## BB#0: 360; X32-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %eax 361; X32-AVX512BW-NEXT: vbroadcastf64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3] 362; X32-AVX512BW-NEXT: retl 363; 364; X32-AVX512DQ-LABEL: test_broadcast_8f32_16f32: 365; X32-AVX512DQ: ## BB#0: 366; X32-AVX512DQ-NEXT: movl {{[0-9]+}}(%esp), %eax 367; X32-AVX512DQ-NEXT: vbroadcastf32x8 {{.*#+}} zmm0 = mem[0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7] 368; X32-AVX512DQ-NEXT: retl 369; 370; X64-AVX-LABEL: test_broadcast_8f32_16f32: 371; X64-AVX: ## BB#0: 372; X64-AVX-NEXT: vmovaps (%rdi), %ymm0 373; X64-AVX-NEXT: vmovaps %ymm0, %ymm1 374; X64-AVX-NEXT: retq 375; 376; X64-AVX512F-LABEL: test_broadcast_8f32_16f32: 377; X64-AVX512F: ## BB#0: 378; X64-AVX512F-NEXT: vbroadcastf64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3] 379; X64-AVX512F-NEXT: retq 380; 381; X64-AVX512BW-LABEL: test_broadcast_8f32_16f32: 382; X64-AVX512BW: ## BB#0: 383; X64-AVX512BW-NEXT: vbroadcastf64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3] 384; X64-AVX512BW-NEXT: retq 385; 386; X64-AVX512DQ-LABEL: test_broadcast_8f32_16f32: 387; X64-AVX512DQ: ## BB#0: 388; X64-AVX512DQ-NEXT: vbroadcastf32x8 {{.*#+}} zmm0 = mem[0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7] 389; X64-AVX512DQ-NEXT: retq 390 %1 = load <8 x float>, <8 x float> *%p 391 %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> 392 ret <16 x float> %2 393} 394 395define <8 x i32> @test_broadcast_4i32_8i32(<4 x i32> *%p) nounwind { 396; X32-AVX-LABEL: test_broadcast_4i32_8i32: 397; X32-AVX: ## BB#0: 398; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 399; X32-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 400; X32-AVX-NEXT: retl 401; 402; X32-AVX512-LABEL: test_broadcast_4i32_8i32: 403; X32-AVX512: ## BB#0: 404; X32-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax 405; X32-AVX512-NEXT: vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 406; X32-AVX512-NEXT: retl 407; 408; X64-AVX-LABEL: test_broadcast_4i32_8i32: 409; X64-AVX: ## BB#0: 410; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 411; X64-AVX-NEXT: retq 412; 413; X64-AVX512-LABEL: test_broadcast_4i32_8i32: 414; X64-AVX512: ## BB#0: 415; X64-AVX512-NEXT: vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 416; X64-AVX512-NEXT: retq 417 %1 = load <4 x i32>, <4 x i32> *%p 418 %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> 419 ret <8 x i32> %2 420} 421 422define <16 x i32> @test_broadcast_4i32_16i32(<4 x i32> *%p) nounwind { 423; X32-AVX1-LABEL: test_broadcast_4i32_16i32: 424; X32-AVX1: ## BB#0: 425; X32-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax 426; X32-AVX1-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 427; X32-AVX1-NEXT: vmovdqa %ymm0, %ymm1 428; X32-AVX1-NEXT: retl 429; 430; X32-AVX2-LABEL: test_broadcast_4i32_16i32: 431; X32-AVX2: ## BB#0: 432; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax 433; X32-AVX2-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 434; X32-AVX2-NEXT: vmovaps %ymm0, %ymm1 435; X32-AVX2-NEXT: retl 436; 437; X32-AVX512-LABEL: test_broadcast_4i32_16i32: 438; X32-AVX512: ## BB#0: 439; X32-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax 440; X32-AVX512-NEXT: vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3] 441; X32-AVX512-NEXT: retl 442; 443; X64-AVX1-LABEL: test_broadcast_4i32_16i32: 444; X64-AVX1: ## BB#0: 445; X64-AVX1-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 446; X64-AVX1-NEXT: vmovdqa %ymm0, %ymm1 447; X64-AVX1-NEXT: retq 448; 449; X64-AVX2-LABEL: test_broadcast_4i32_16i32: 450; X64-AVX2: ## BB#0: 451; X64-AVX2-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 452; X64-AVX2-NEXT: vmovaps %ymm0, %ymm1 453; X64-AVX2-NEXT: retq 454; 455; X64-AVX512-LABEL: test_broadcast_4i32_16i32: 456; X64-AVX512: ## BB#0: 457; X64-AVX512-NEXT: vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3] 458; X64-AVX512-NEXT: retq 459 %1 = load <4 x i32>, <4 x i32> *%p 460 %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> 461 ret <16 x i32> %2 462} 463 464define <16 x i32> @test_broadcast_8i32_16i32(<8 x i32> *%p) nounwind { 465; X32-AVX-LABEL: test_broadcast_8i32_16i32: 466; X32-AVX: ## BB#0: 467; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 468; X32-AVX-NEXT: vmovaps (%eax), %ymm0 469; X32-AVX-NEXT: vmovaps %ymm0, %ymm1 470; X32-AVX-NEXT: retl 471; 472; X32-AVX512F-LABEL: test_broadcast_8i32_16i32: 473; X32-AVX512F: ## BB#0: 474; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax 475; X32-AVX512F-NEXT: vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3] 476; X32-AVX512F-NEXT: retl 477; 478; X32-AVX512BW-LABEL: test_broadcast_8i32_16i32: 479; X32-AVX512BW: ## BB#0: 480; X32-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %eax 481; X32-AVX512BW-NEXT: vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3] 482; X32-AVX512BW-NEXT: retl 483; 484; X32-AVX512DQ-LABEL: test_broadcast_8i32_16i32: 485; X32-AVX512DQ: ## BB#0: 486; X32-AVX512DQ-NEXT: movl {{[0-9]+}}(%esp), %eax 487; X32-AVX512DQ-NEXT: vbroadcasti32x8 {{.*#+}} zmm0 = mem[0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7] 488; X32-AVX512DQ-NEXT: retl 489; 490; X64-AVX-LABEL: test_broadcast_8i32_16i32: 491; X64-AVX: ## BB#0: 492; X64-AVX-NEXT: vmovaps (%rdi), %ymm0 493; X64-AVX-NEXT: vmovaps %ymm0, %ymm1 494; X64-AVX-NEXT: retq 495; 496; X64-AVX512F-LABEL: test_broadcast_8i32_16i32: 497; X64-AVX512F: ## BB#0: 498; X64-AVX512F-NEXT: vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3] 499; X64-AVX512F-NEXT: retq 500; 501; X64-AVX512BW-LABEL: test_broadcast_8i32_16i32: 502; X64-AVX512BW: ## BB#0: 503; X64-AVX512BW-NEXT: vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3] 504; X64-AVX512BW-NEXT: retq 505; 506; X64-AVX512DQ-LABEL: test_broadcast_8i32_16i32: 507; X64-AVX512DQ: ## BB#0: 508; X64-AVX512DQ-NEXT: vbroadcasti32x8 {{.*#+}} zmm0 = mem[0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7] 509; X64-AVX512DQ-NEXT: retq 510 %1 = load <8 x i32>, <8 x i32> *%p 511 %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> 512 ret <16 x i32> %2 513} 514 515define <16 x i16> @test_broadcast_8i16_16i16(<8 x i16> *%p) nounwind { 516; X32-AVX-LABEL: test_broadcast_8i16_16i16: 517; X32-AVX: ## BB#0: 518; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 519; X32-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 520; X32-AVX-NEXT: retl 521; 522; X32-AVX512-LABEL: test_broadcast_8i16_16i16: 523; X32-AVX512: ## BB#0: 524; X32-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax 525; X32-AVX512-NEXT: vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 526; X32-AVX512-NEXT: retl 527; 528; X64-AVX-LABEL: test_broadcast_8i16_16i16: 529; X64-AVX: ## BB#0: 530; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 531; X64-AVX-NEXT: retq 532; 533; X64-AVX512-LABEL: test_broadcast_8i16_16i16: 534; X64-AVX512: ## BB#0: 535; X64-AVX512-NEXT: vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 536; X64-AVX512-NEXT: retq 537 %1 = load <8 x i16>, <8 x i16> *%p 538 %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> 539 ret <16 x i16> %2 540} 541 542define <32 x i16> @test_broadcast_8i16_32i16(<8 x i16> *%p) nounwind { 543; X32-AVX1-LABEL: test_broadcast_8i16_32i16: 544; X32-AVX1: ## BB#0: 545; X32-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax 546; X32-AVX1-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 547; X32-AVX1-NEXT: vmovdqa %ymm0, %ymm1 548; X32-AVX1-NEXT: retl 549; 550; X32-AVX2-LABEL: test_broadcast_8i16_32i16: 551; X32-AVX2: ## BB#0: 552; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax 553; X32-AVX2-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 554; X32-AVX2-NEXT: vmovaps %ymm0, %ymm1 555; X32-AVX2-NEXT: retl 556; 557; X32-AVX512F-LABEL: test_broadcast_8i16_32i16: 558; X32-AVX512F: ## BB#0: 559; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax 560; X32-AVX512F-NEXT: vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 561; X32-AVX512F-NEXT: vmovdqa64 %ymm0, %ymm1 562; X32-AVX512F-NEXT: retl 563; 564; X32-AVX512BW-LABEL: test_broadcast_8i16_32i16: 565; X32-AVX512BW: ## BB#0: 566; X32-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %eax 567; X32-AVX512BW-NEXT: vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3] 568; X32-AVX512BW-NEXT: retl 569; 570; X32-AVX512DQ-LABEL: test_broadcast_8i16_32i16: 571; X32-AVX512DQ: ## BB#0: 572; X32-AVX512DQ-NEXT: movl {{[0-9]+}}(%esp), %eax 573; X32-AVX512DQ-NEXT: vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 574; X32-AVX512DQ-NEXT: vmovdqa64 %ymm0, %ymm1 575; X32-AVX512DQ-NEXT: retl 576; 577; X64-AVX1-LABEL: test_broadcast_8i16_32i16: 578; X64-AVX1: ## BB#0: 579; X64-AVX1-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 580; X64-AVX1-NEXT: vmovdqa %ymm0, %ymm1 581; X64-AVX1-NEXT: retq 582; 583; X64-AVX2-LABEL: test_broadcast_8i16_32i16: 584; X64-AVX2: ## BB#0: 585; X64-AVX2-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 586; X64-AVX2-NEXT: vmovaps %ymm0, %ymm1 587; X64-AVX2-NEXT: retq 588; 589; X64-AVX512F-LABEL: test_broadcast_8i16_32i16: 590; X64-AVX512F: ## BB#0: 591; X64-AVX512F-NEXT: vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 592; X64-AVX512F-NEXT: vmovdqa64 %ymm0, %ymm1 593; X64-AVX512F-NEXT: retq 594; 595; X64-AVX512BW-LABEL: test_broadcast_8i16_32i16: 596; X64-AVX512BW: ## BB#0: 597; X64-AVX512BW-NEXT: vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3] 598; X64-AVX512BW-NEXT: retq 599; 600; X64-AVX512DQ-LABEL: test_broadcast_8i16_32i16: 601; X64-AVX512DQ: ## BB#0: 602; X64-AVX512DQ-NEXT: vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 603; X64-AVX512DQ-NEXT: vmovdqa64 %ymm0, %ymm1 604; X64-AVX512DQ-NEXT: retq 605 %1 = load <8 x i16>, <8 x i16> *%p 606 %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> 607 ret <32 x i16> %2 608} 609 610define <32 x i16> @test_broadcast_16i16_32i16(<16 x i16> *%p) nounwind { 611; X32-AVX-LABEL: test_broadcast_16i16_32i16: 612; X32-AVX: ## BB#0: 613; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 614; X32-AVX-NEXT: vmovaps (%eax), %ymm0 615; X32-AVX-NEXT: vmovaps %ymm0, %ymm1 616; X32-AVX-NEXT: retl 617; 618; X32-AVX512F-LABEL: test_broadcast_16i16_32i16: 619; X32-AVX512F: ## BB#0: 620; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax 621; X32-AVX512F-NEXT: vmovaps (%eax), %ymm0 622; X32-AVX512F-NEXT: vmovaps %ymm0, %ymm1 623; X32-AVX512F-NEXT: retl 624; 625; X32-AVX512BW-LABEL: test_broadcast_16i16_32i16: 626; X32-AVX512BW: ## BB#0: 627; X32-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %eax 628; X32-AVX512BW-NEXT: vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3] 629; X32-AVX512BW-NEXT: retl 630; 631; X32-AVX512DQ-LABEL: test_broadcast_16i16_32i16: 632; X32-AVX512DQ: ## BB#0: 633; X32-AVX512DQ-NEXT: movl {{[0-9]+}}(%esp), %eax 634; X32-AVX512DQ-NEXT: vmovaps (%eax), %ymm0 635; X32-AVX512DQ-NEXT: vmovaps %ymm0, %ymm1 636; X32-AVX512DQ-NEXT: retl 637; 638; X64-AVX-LABEL: test_broadcast_16i16_32i16: 639; X64-AVX: ## BB#0: 640; X64-AVX-NEXT: vmovaps (%rdi), %ymm0 641; X64-AVX-NEXT: vmovaps %ymm0, %ymm1 642; X64-AVX-NEXT: retq 643; 644; X64-AVX512F-LABEL: test_broadcast_16i16_32i16: 645; X64-AVX512F: ## BB#0: 646; X64-AVX512F-NEXT: vmovaps (%rdi), %ymm0 647; X64-AVX512F-NEXT: vmovaps %ymm0, %ymm1 648; X64-AVX512F-NEXT: retq 649; 650; X64-AVX512BW-LABEL: test_broadcast_16i16_32i16: 651; X64-AVX512BW: ## BB#0: 652; X64-AVX512BW-NEXT: vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3] 653; X64-AVX512BW-NEXT: retq 654; 655; X64-AVX512DQ-LABEL: test_broadcast_16i16_32i16: 656; X64-AVX512DQ: ## BB#0: 657; X64-AVX512DQ-NEXT: vmovaps (%rdi), %ymm0 658; X64-AVX512DQ-NEXT: vmovaps %ymm0, %ymm1 659; X64-AVX512DQ-NEXT: retq 660 %1 = load <16 x i16>, <16 x i16> *%p 661 %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> 662 ret <32 x i16> %2 663} 664 665define <32 x i8> @test_broadcast_16i8_32i8(<16 x i8> *%p) nounwind { 666; X32-AVX-LABEL: test_broadcast_16i8_32i8: 667; X32-AVX: ## BB#0: 668; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 669; X32-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 670; X32-AVX-NEXT: retl 671; 672; X32-AVX512-LABEL: test_broadcast_16i8_32i8: 673; X32-AVX512: ## BB#0: 674; X32-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax 675; X32-AVX512-NEXT: vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 676; X32-AVX512-NEXT: retl 677; 678; X64-AVX-LABEL: test_broadcast_16i8_32i8: 679; X64-AVX: ## BB#0: 680; X64-AVX-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 681; X64-AVX-NEXT: retq 682; 683; X64-AVX512-LABEL: test_broadcast_16i8_32i8: 684; X64-AVX512: ## BB#0: 685; X64-AVX512-NEXT: vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 686; X64-AVX512-NEXT: retq 687 %1 = load <16 x i8>, <16 x i8> *%p 688 %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> 689 ret <32 x i8> %2 690} 691 692define <64 x i8> @test_broadcast_16i8_64i8(<16 x i8> *%p) nounwind { 693; X32-AVX1-LABEL: test_broadcast_16i8_64i8: 694; X32-AVX1: ## BB#0: 695; X32-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax 696; X32-AVX1-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 697; X32-AVX1-NEXT: vmovdqa %ymm0, %ymm1 698; X32-AVX1-NEXT: retl 699; 700; X32-AVX2-LABEL: test_broadcast_16i8_64i8: 701; X32-AVX2: ## BB#0: 702; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax 703; X32-AVX2-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 704; X32-AVX2-NEXT: vmovaps %ymm0, %ymm1 705; X32-AVX2-NEXT: retl 706; 707; X32-AVX512F-LABEL: test_broadcast_16i8_64i8: 708; X32-AVX512F: ## BB#0: 709; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax 710; X32-AVX512F-NEXT: vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 711; X32-AVX512F-NEXT: vmovdqa64 %ymm0, %ymm1 712; X32-AVX512F-NEXT: retl 713; 714; X32-AVX512BW-LABEL: test_broadcast_16i8_64i8: 715; X32-AVX512BW: ## BB#0: 716; X32-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %eax 717; X32-AVX512BW-NEXT: vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3] 718; X32-AVX512BW-NEXT: retl 719; 720; X32-AVX512DQ-LABEL: test_broadcast_16i8_64i8: 721; X32-AVX512DQ: ## BB#0: 722; X32-AVX512DQ-NEXT: movl {{[0-9]+}}(%esp), %eax 723; X32-AVX512DQ-NEXT: vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 724; X32-AVX512DQ-NEXT: vmovdqa64 %ymm0, %ymm1 725; X32-AVX512DQ-NEXT: retl 726; 727; X64-AVX1-LABEL: test_broadcast_16i8_64i8: 728; X64-AVX1: ## BB#0: 729; X64-AVX1-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 730; X64-AVX1-NEXT: vmovdqa %ymm0, %ymm1 731; X64-AVX1-NEXT: retq 732; 733; X64-AVX2-LABEL: test_broadcast_16i8_64i8: 734; X64-AVX2: ## BB#0: 735; X64-AVX2-NEXT: vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1] 736; X64-AVX2-NEXT: vmovaps %ymm0, %ymm1 737; X64-AVX2-NEXT: retq 738; 739; X64-AVX512F-LABEL: test_broadcast_16i8_64i8: 740; X64-AVX512F: ## BB#0: 741; X64-AVX512F-NEXT: vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 742; X64-AVX512F-NEXT: vmovdqa64 %ymm0, %ymm1 743; X64-AVX512F-NEXT: retq 744; 745; X64-AVX512BW-LABEL: test_broadcast_16i8_64i8: 746; X64-AVX512BW: ## BB#0: 747; X64-AVX512BW-NEXT: vbroadcasti32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3] 748; X64-AVX512BW-NEXT: retq 749; 750; X64-AVX512DQ-LABEL: test_broadcast_16i8_64i8: 751; X64-AVX512DQ: ## BB#0: 752; X64-AVX512DQ-NEXT: vbroadcasti32x4 {{.*#+}} ymm0 = mem[0,1,2,3,0,1,2,3] 753; X64-AVX512DQ-NEXT: vmovdqa64 %ymm0, %ymm1 754; X64-AVX512DQ-NEXT: retq 755 %1 = load <16 x i8>, <16 x i8> *%p 756 %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> 757 ret <64 x i8> %2 758} 759 760define <64 x i8> @test_broadcast_32i8_64i8(<32 x i8> *%p) nounwind { 761; X32-AVX-LABEL: test_broadcast_32i8_64i8: 762; X32-AVX: ## BB#0: 763; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 764; X32-AVX-NEXT: vmovaps (%eax), %ymm0 765; X32-AVX-NEXT: vmovaps %ymm0, %ymm1 766; X32-AVX-NEXT: retl 767; 768; X32-AVX512F-LABEL: test_broadcast_32i8_64i8: 769; X32-AVX512F: ## BB#0: 770; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax 771; X32-AVX512F-NEXT: vmovaps (%eax), %ymm0 772; X32-AVX512F-NEXT: vmovaps %ymm0, %ymm1 773; X32-AVX512F-NEXT: retl 774; 775; X32-AVX512BW-LABEL: test_broadcast_32i8_64i8: 776; X32-AVX512BW: ## BB#0: 777; X32-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %eax 778; X32-AVX512BW-NEXT: vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3] 779; X32-AVX512BW-NEXT: retl 780; 781; X32-AVX512DQ-LABEL: test_broadcast_32i8_64i8: 782; X32-AVX512DQ: ## BB#0: 783; X32-AVX512DQ-NEXT: movl {{[0-9]+}}(%esp), %eax 784; X32-AVX512DQ-NEXT: vmovaps (%eax), %ymm0 785; X32-AVX512DQ-NEXT: vmovaps %ymm0, %ymm1 786; X32-AVX512DQ-NEXT: retl 787; 788; X64-AVX-LABEL: test_broadcast_32i8_64i8: 789; X64-AVX: ## BB#0: 790; X64-AVX-NEXT: vmovaps (%rdi), %ymm0 791; X64-AVX-NEXT: vmovaps %ymm0, %ymm1 792; X64-AVX-NEXT: retq 793; 794; X64-AVX512F-LABEL: test_broadcast_32i8_64i8: 795; X64-AVX512F: ## BB#0: 796; X64-AVX512F-NEXT: vmovaps (%rdi), %ymm0 797; X64-AVX512F-NEXT: vmovaps %ymm0, %ymm1 798; X64-AVX512F-NEXT: retq 799; 800; X64-AVX512BW-LABEL: test_broadcast_32i8_64i8: 801; X64-AVX512BW: ## BB#0: 802; X64-AVX512BW-NEXT: vbroadcasti64x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3] 803; X64-AVX512BW-NEXT: retq 804; 805; X64-AVX512DQ-LABEL: test_broadcast_32i8_64i8: 806; X64-AVX512DQ: ## BB#0: 807; X64-AVX512DQ-NEXT: vmovaps (%rdi), %ymm0 808; X64-AVX512DQ-NEXT: vmovaps %ymm0, %ymm1 809; X64-AVX512DQ-NEXT: retq 810 %1 = load <32 x i8>, <32 x i8> *%p 811 %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> 812 ret <64 x i8> %2 813} 814 815; 816; Subvector Load + Broadcast + Store 817; 818 819define <4 x double> @test_broadcast_2f64_4f64_reuse(<2 x double>* %p0, <2 x double>* %p1) { 820; X32-AVX-LABEL: test_broadcast_2f64_4f64_reuse: 821; X32-AVX: ## BB#0: 822; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 823; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx 824; X32-AVX-NEXT: vmovaps (%ecx), %xmm0 825; X32-AVX-NEXT: vmovaps %xmm0, (%eax) 826; X32-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 827; X32-AVX-NEXT: retl 828; 829; X32-AVX512F-LABEL: test_broadcast_2f64_4f64_reuse: 830; X32-AVX512F: ## BB#0: 831; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax 832; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %ecx 833; X32-AVX512F-NEXT: vmovaps (%ecx), %xmm0 834; X32-AVX512F-NEXT: vmovaps %xmm0, (%eax) 835; X32-AVX512F-NEXT: vinsertf32x4 $1, %xmm0, %ymm0, %ymm0 836; X32-AVX512F-NEXT: retl 837; 838; X32-AVX512BW-LABEL: test_broadcast_2f64_4f64_reuse: 839; X32-AVX512BW: ## BB#0: 840; X32-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %eax 841; X32-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %ecx 842; X32-AVX512BW-NEXT: vmovaps (%ecx), %xmm0 843; X32-AVX512BW-NEXT: vmovaps %xmm0, (%eax) 844; X32-AVX512BW-NEXT: vinsertf32x4 $1, %xmm0, %ymm0, %ymm0 845; X32-AVX512BW-NEXT: retl 846; 847; X32-AVX512DQ-LABEL: test_broadcast_2f64_4f64_reuse: 848; X32-AVX512DQ: ## BB#0: 849; X32-AVX512DQ-NEXT: movl {{[0-9]+}}(%esp), %eax 850; X32-AVX512DQ-NEXT: movl {{[0-9]+}}(%esp), %ecx 851; X32-AVX512DQ-NEXT: vmovapd (%ecx), %xmm0 852; X32-AVX512DQ-NEXT: vmovapd %xmm0, (%eax) 853; X32-AVX512DQ-NEXT: vinsertf64x2 $1, %xmm0, %ymm0, %ymm0 854; X32-AVX512DQ-NEXT: retl 855; 856; X64-AVX-LABEL: test_broadcast_2f64_4f64_reuse: 857; X64-AVX: ## BB#0: 858; X64-AVX-NEXT: vmovaps (%rdi), %xmm0 859; X64-AVX-NEXT: vmovaps %xmm0, (%rsi) 860; X64-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 861; X64-AVX-NEXT: retq 862; 863; X64-AVX512F-LABEL: test_broadcast_2f64_4f64_reuse: 864; X64-AVX512F: ## BB#0: 865; X64-AVX512F-NEXT: vmovaps (%rdi), %xmm0 866; X64-AVX512F-NEXT: vmovaps %xmm0, (%rsi) 867; X64-AVX512F-NEXT: vinsertf32x4 $1, %xmm0, %ymm0, %ymm0 868; X64-AVX512F-NEXT: retq 869; 870; X64-AVX512BW-LABEL: test_broadcast_2f64_4f64_reuse: 871; X64-AVX512BW: ## BB#0: 872; X64-AVX512BW-NEXT: vmovaps (%rdi), %xmm0 873; X64-AVX512BW-NEXT: vmovaps %xmm0, (%rsi) 874; X64-AVX512BW-NEXT: vinsertf32x4 $1, %xmm0, %ymm0, %ymm0 875; X64-AVX512BW-NEXT: retq 876; 877; X64-AVX512DQ-LABEL: test_broadcast_2f64_4f64_reuse: 878; X64-AVX512DQ: ## BB#0: 879; X64-AVX512DQ-NEXT: vmovapd (%rdi), %xmm0 880; X64-AVX512DQ-NEXT: vmovapd %xmm0, (%rsi) 881; X64-AVX512DQ-NEXT: vinsertf64x2 $1, %xmm0, %ymm0, %ymm0 882; X64-AVX512DQ-NEXT: retq 883 %1 = load <2 x double>, <2 x double>* %p0 884 store <2 x double> %1, <2 x double>* %p1 885 %2 = shufflevector <2 x double> %1, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1> 886 ret <4 x double> %2 887} 888 889define <4 x i64> @test_broadcast_2i64_4i64_reuse(<2 x i64>* %p0, <2 x i64>* %p1) { 890; X32-AVX-LABEL: test_broadcast_2i64_4i64_reuse: 891; X32-AVX: ## BB#0: 892; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 893; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx 894; X32-AVX-NEXT: vmovaps (%ecx), %xmm0 895; X32-AVX-NEXT: vmovaps %xmm0, (%eax) 896; X32-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 897; X32-AVX-NEXT: retl 898; 899; X32-AVX512F-LABEL: test_broadcast_2i64_4i64_reuse: 900; X32-AVX512F: ## BB#0: 901; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax 902; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %ecx 903; X32-AVX512F-NEXT: vmovdqa64 (%ecx), %xmm0 904; X32-AVX512F-NEXT: vmovdqa64 %xmm0, (%eax) 905; X32-AVX512F-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 906; X32-AVX512F-NEXT: retl 907; 908; X32-AVX512BW-LABEL: test_broadcast_2i64_4i64_reuse: 909; X32-AVX512BW: ## BB#0: 910; X32-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %eax 911; X32-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %ecx 912; X32-AVX512BW-NEXT: vmovdqa64 (%ecx), %xmm0 913; X32-AVX512BW-NEXT: vmovdqa64 %xmm0, (%eax) 914; X32-AVX512BW-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 915; X32-AVX512BW-NEXT: retl 916; 917; X32-AVX512DQ-LABEL: test_broadcast_2i64_4i64_reuse: 918; X32-AVX512DQ: ## BB#0: 919; X32-AVX512DQ-NEXT: movl {{[0-9]+}}(%esp), %eax 920; X32-AVX512DQ-NEXT: movl {{[0-9]+}}(%esp), %ecx 921; X32-AVX512DQ-NEXT: vmovdqa64 (%ecx), %xmm0 922; X32-AVX512DQ-NEXT: vmovdqa64 %xmm0, (%eax) 923; X32-AVX512DQ-NEXT: vinserti64x2 $1, %xmm0, %ymm0, %ymm0 924; X32-AVX512DQ-NEXT: retl 925; 926; X64-AVX-LABEL: test_broadcast_2i64_4i64_reuse: 927; X64-AVX: ## BB#0: 928; X64-AVX-NEXT: vmovaps (%rdi), %xmm0 929; X64-AVX-NEXT: vmovaps %xmm0, (%rsi) 930; X64-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 931; X64-AVX-NEXT: retq 932; 933; X64-AVX512F-LABEL: test_broadcast_2i64_4i64_reuse: 934; X64-AVX512F: ## BB#0: 935; X64-AVX512F-NEXT: vmovdqa64 (%rdi), %xmm0 936; X64-AVX512F-NEXT: vmovdqa64 %xmm0, (%rsi) 937; X64-AVX512F-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 938; X64-AVX512F-NEXT: retq 939; 940; X64-AVX512BW-LABEL: test_broadcast_2i64_4i64_reuse: 941; X64-AVX512BW: ## BB#0: 942; X64-AVX512BW-NEXT: vmovdqa64 (%rdi), %xmm0 943; X64-AVX512BW-NEXT: vmovdqa64 %xmm0, (%rsi) 944; X64-AVX512BW-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 945; X64-AVX512BW-NEXT: retq 946; 947; X64-AVX512DQ-LABEL: test_broadcast_2i64_4i64_reuse: 948; X64-AVX512DQ: ## BB#0: 949; X64-AVX512DQ-NEXT: vmovdqa64 (%rdi), %xmm0 950; X64-AVX512DQ-NEXT: vmovdqa64 %xmm0, (%rsi) 951; X64-AVX512DQ-NEXT: vinserti64x2 $1, %xmm0, %ymm0, %ymm0 952; X64-AVX512DQ-NEXT: retq 953 %1 = load <2 x i64>, <2 x i64>* %p0 954 store <2 x i64> %1, <2 x i64>* %p1 955 %2 = shufflevector <2 x i64> %1, <2 x i64> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1> 956 ret <4 x i64> %2 957} 958 959define <8 x float> @test_broadcast_4f32_8f32_reuse(<4 x float>* %p0, <4 x float>* %p1) { 960; X32-AVX-LABEL: test_broadcast_4f32_8f32_reuse: 961; X32-AVX: ## BB#0: 962; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 963; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx 964; X32-AVX-NEXT: vmovaps (%ecx), %xmm0 965; X32-AVX-NEXT: vmovaps %xmm0, (%eax) 966; X32-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 967; X32-AVX-NEXT: retl 968; 969; X32-AVX512-LABEL: test_broadcast_4f32_8f32_reuse: 970; X32-AVX512: ## BB#0: 971; X32-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax 972; X32-AVX512-NEXT: movl {{[0-9]+}}(%esp), %ecx 973; X32-AVX512-NEXT: vmovaps (%ecx), %xmm0 974; X32-AVX512-NEXT: vmovaps %xmm0, (%eax) 975; X32-AVX512-NEXT: vinsertf32x4 $1, %xmm0, %ymm0, %ymm0 976; X32-AVX512-NEXT: retl 977; 978; X64-AVX-LABEL: test_broadcast_4f32_8f32_reuse: 979; X64-AVX: ## BB#0: 980; X64-AVX-NEXT: vmovaps (%rdi), %xmm0 981; X64-AVX-NEXT: vmovaps %xmm0, (%rsi) 982; X64-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 983; X64-AVX-NEXT: retq 984; 985; X64-AVX512-LABEL: test_broadcast_4f32_8f32_reuse: 986; X64-AVX512: ## BB#0: 987; X64-AVX512-NEXT: vmovaps (%rdi), %xmm0 988; X64-AVX512-NEXT: vmovaps %xmm0, (%rsi) 989; X64-AVX512-NEXT: vinsertf32x4 $1, %xmm0, %ymm0, %ymm0 990; X64-AVX512-NEXT: retq 991 %1 = load <4 x float>, <4 x float>* %p0 992 store <4 x float> %1, <4 x float>* %p1 993 %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> 994 ret <8 x float> %2 995} 996 997define <8 x i32> @test_broadcast_4i32_8i32_reuse(<4 x i32>* %p0, <4 x i32>* %p1) { 998; X32-AVX-LABEL: test_broadcast_4i32_8i32_reuse: 999; X32-AVX: ## BB#0: 1000; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 1001; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx 1002; X32-AVX-NEXT: vmovaps (%ecx), %xmm0 1003; X32-AVX-NEXT: vmovaps %xmm0, (%eax) 1004; X32-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 1005; X32-AVX-NEXT: retl 1006; 1007; X32-AVX512-LABEL: test_broadcast_4i32_8i32_reuse: 1008; X32-AVX512: ## BB#0: 1009; X32-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax 1010; X32-AVX512-NEXT: movl {{[0-9]+}}(%esp), %ecx 1011; X32-AVX512-NEXT: vmovdqa32 (%ecx), %xmm0 1012; X32-AVX512-NEXT: vmovdqa32 %xmm0, (%eax) 1013; X32-AVX512-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 1014; X32-AVX512-NEXT: retl 1015; 1016; X64-AVX-LABEL: test_broadcast_4i32_8i32_reuse: 1017; X64-AVX: ## BB#0: 1018; X64-AVX-NEXT: vmovaps (%rdi), %xmm0 1019; X64-AVX-NEXT: vmovaps %xmm0, (%rsi) 1020; X64-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 1021; X64-AVX-NEXT: retq 1022; 1023; X64-AVX512-LABEL: test_broadcast_4i32_8i32_reuse: 1024; X64-AVX512: ## BB#0: 1025; X64-AVX512-NEXT: vmovdqa32 (%rdi), %xmm0 1026; X64-AVX512-NEXT: vmovdqa32 %xmm0, (%rsi) 1027; X64-AVX512-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 1028; X64-AVX512-NEXT: retq 1029 %1 = load <4 x i32>, <4 x i32>* %p0 1030 store <4 x i32> %1, <4 x i32>* %p1 1031 %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> 1032 ret <8 x i32> %2 1033} 1034 1035define <16 x i16> @test_broadcast_8i16_16i16_reuse(<8 x i16> *%p0, <8 x i16> *%p1) nounwind { 1036; X32-AVX-LABEL: test_broadcast_8i16_16i16_reuse: 1037; X32-AVX: ## BB#0: 1038; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 1039; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx 1040; X32-AVX-NEXT: vmovaps (%ecx), %xmm0 1041; X32-AVX-NEXT: vmovaps %xmm0, (%eax) 1042; X32-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 1043; X32-AVX-NEXT: retl 1044; 1045; X32-AVX512F-LABEL: test_broadcast_8i16_16i16_reuse: 1046; X32-AVX512F: ## BB#0: 1047; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax 1048; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %ecx 1049; X32-AVX512F-NEXT: vmovdqa64 (%ecx), %xmm0 1050; X32-AVX512F-NEXT: vmovdqa32 %xmm0, (%eax) 1051; X32-AVX512F-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 1052; X32-AVX512F-NEXT: retl 1053; 1054; X32-AVX512BW-LABEL: test_broadcast_8i16_16i16_reuse: 1055; X32-AVX512BW: ## BB#0: 1056; X32-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %eax 1057; X32-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %ecx 1058; X32-AVX512BW-NEXT: vmovdqu16 (%ecx), %xmm0 1059; X32-AVX512BW-NEXT: vmovdqu16 %xmm0, (%eax) 1060; X32-AVX512BW-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 1061; X32-AVX512BW-NEXT: retl 1062; 1063; X32-AVX512DQ-LABEL: test_broadcast_8i16_16i16_reuse: 1064; X32-AVX512DQ: ## BB#0: 1065; X32-AVX512DQ-NEXT: movl {{[0-9]+}}(%esp), %eax 1066; X32-AVX512DQ-NEXT: movl {{[0-9]+}}(%esp), %ecx 1067; X32-AVX512DQ-NEXT: vmovdqa64 (%ecx), %xmm0 1068; X32-AVX512DQ-NEXT: vmovdqa32 %xmm0, (%eax) 1069; X32-AVX512DQ-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 1070; X32-AVX512DQ-NEXT: retl 1071; 1072; X64-AVX-LABEL: test_broadcast_8i16_16i16_reuse: 1073; X64-AVX: ## BB#0: 1074; X64-AVX-NEXT: vmovaps (%rdi), %xmm0 1075; X64-AVX-NEXT: vmovaps %xmm0, (%rsi) 1076; X64-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 1077; X64-AVX-NEXT: retq 1078; 1079; X64-AVX512F-LABEL: test_broadcast_8i16_16i16_reuse: 1080; X64-AVX512F: ## BB#0: 1081; X64-AVX512F-NEXT: vmovdqa64 (%rdi), %xmm0 1082; X64-AVX512F-NEXT: vmovdqa32 %xmm0, (%rsi) 1083; X64-AVX512F-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 1084; X64-AVX512F-NEXT: retq 1085; 1086; X64-AVX512BW-LABEL: test_broadcast_8i16_16i16_reuse: 1087; X64-AVX512BW: ## BB#0: 1088; X64-AVX512BW-NEXT: vmovdqu16 (%rdi), %xmm0 1089; X64-AVX512BW-NEXT: vmovdqu16 %xmm0, (%rsi) 1090; X64-AVX512BW-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 1091; X64-AVX512BW-NEXT: retq 1092; 1093; X64-AVX512DQ-LABEL: test_broadcast_8i16_16i16_reuse: 1094; X64-AVX512DQ: ## BB#0: 1095; X64-AVX512DQ-NEXT: vmovdqa64 (%rdi), %xmm0 1096; X64-AVX512DQ-NEXT: vmovdqa32 %xmm0, (%rsi) 1097; X64-AVX512DQ-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 1098; X64-AVX512DQ-NEXT: retq 1099 %1 = load <8 x i16>, <8 x i16> *%p0 1100 store <8 x i16> %1, <8 x i16>* %p1 1101 %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> 1102 ret <16 x i16> %2 1103} 1104 1105define <32 x i8> @test_broadcast_16i8_32i8_reuse(<16 x i8> *%p0, <16 x i8> *%p1) nounwind { 1106; X32-AVX-LABEL: test_broadcast_16i8_32i8_reuse: 1107; X32-AVX: ## BB#0: 1108; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 1109; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx 1110; X32-AVX-NEXT: vmovaps (%ecx), %xmm0 1111; X32-AVX-NEXT: vmovaps %xmm0, (%eax) 1112; X32-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 1113; X32-AVX-NEXT: retl 1114; 1115; X32-AVX512F-LABEL: test_broadcast_16i8_32i8_reuse: 1116; X32-AVX512F: ## BB#0: 1117; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax 1118; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %ecx 1119; X32-AVX512F-NEXT: vmovdqa64 (%ecx), %xmm0 1120; X32-AVX512F-NEXT: vmovdqa32 %xmm0, (%eax) 1121; X32-AVX512F-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 1122; X32-AVX512F-NEXT: retl 1123; 1124; X32-AVX512BW-LABEL: test_broadcast_16i8_32i8_reuse: 1125; X32-AVX512BW: ## BB#0: 1126; X32-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %eax 1127; X32-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %ecx 1128; X32-AVX512BW-NEXT: vmovdqu8 (%ecx), %xmm0 1129; X32-AVX512BW-NEXT: vmovdqu8 %xmm0, (%eax) 1130; X32-AVX512BW-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 1131; X32-AVX512BW-NEXT: retl 1132; 1133; X32-AVX512DQ-LABEL: test_broadcast_16i8_32i8_reuse: 1134; X32-AVX512DQ: ## BB#0: 1135; X32-AVX512DQ-NEXT: movl {{[0-9]+}}(%esp), %eax 1136; X32-AVX512DQ-NEXT: movl {{[0-9]+}}(%esp), %ecx 1137; X32-AVX512DQ-NEXT: vmovdqa64 (%ecx), %xmm0 1138; X32-AVX512DQ-NEXT: vmovdqa32 %xmm0, (%eax) 1139; X32-AVX512DQ-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 1140; X32-AVX512DQ-NEXT: retl 1141; 1142; X64-AVX-LABEL: test_broadcast_16i8_32i8_reuse: 1143; X64-AVX: ## BB#0: 1144; X64-AVX-NEXT: vmovaps (%rdi), %xmm0 1145; X64-AVX-NEXT: vmovaps %xmm0, (%rsi) 1146; X64-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 1147; X64-AVX-NEXT: retq 1148; 1149; X64-AVX512F-LABEL: test_broadcast_16i8_32i8_reuse: 1150; X64-AVX512F: ## BB#0: 1151; X64-AVX512F-NEXT: vmovdqa64 (%rdi), %xmm0 1152; X64-AVX512F-NEXT: vmovdqa32 %xmm0, (%rsi) 1153; X64-AVX512F-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 1154; X64-AVX512F-NEXT: retq 1155; 1156; X64-AVX512BW-LABEL: test_broadcast_16i8_32i8_reuse: 1157; X64-AVX512BW: ## BB#0: 1158; X64-AVX512BW-NEXT: vmovdqu8 (%rdi), %xmm0 1159; X64-AVX512BW-NEXT: vmovdqu8 %xmm0, (%rsi) 1160; X64-AVX512BW-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 1161; X64-AVX512BW-NEXT: retq 1162; 1163; X64-AVX512DQ-LABEL: test_broadcast_16i8_32i8_reuse: 1164; X64-AVX512DQ: ## BB#0: 1165; X64-AVX512DQ-NEXT: vmovdqa64 (%rdi), %xmm0 1166; X64-AVX512DQ-NEXT: vmovdqa32 %xmm0, (%rsi) 1167; X64-AVX512DQ-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 1168; X64-AVX512DQ-NEXT: retq 1169 %1 = load <16 x i8>, <16 x i8> *%p0 1170 store <16 x i8> %1, <16 x i8>* %p1 1171 %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> 1172 ret <32 x i8> %2 1173} 1174 1175; 1176; Subvector Load + Broadcast with Separate Store 1177; 1178 1179define <8 x i32> @test_broadcast_4i32_8i32_chain(<4 x i32>* %p0, <4 x float>* %p1) { 1180; X32-AVX-LABEL: test_broadcast_4i32_8i32_chain: 1181; X32-AVX: ## BB#0: 1182; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 1183; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx 1184; X32-AVX-NEXT: vmovaps (%ecx), %xmm0 1185; X32-AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 1186; X32-AVX-NEXT: vmovaps %xmm1, (%eax) 1187; X32-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 1188; X32-AVX-NEXT: retl 1189; 1190; X32-AVX512F-LABEL: test_broadcast_4i32_8i32_chain: 1191; X32-AVX512F: ## BB#0: 1192; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax 1193; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %ecx 1194; X32-AVX512F-NEXT: vmovdqa64 (%ecx), %xmm0 1195; X32-AVX512F-NEXT: vpxord %xmm1, %xmm1, %xmm1 1196; X32-AVX512F-NEXT: vmovdqa32 %xmm1, (%eax) 1197; X32-AVX512F-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 1198; X32-AVX512F-NEXT: retl 1199; 1200; X32-AVX512BW-LABEL: test_broadcast_4i32_8i32_chain: 1201; X32-AVX512BW: ## BB#0: 1202; X32-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %eax 1203; X32-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %ecx 1204; X32-AVX512BW-NEXT: vmovdqa64 (%ecx), %xmm0 1205; X32-AVX512BW-NEXT: vpxord %xmm1, %xmm1, %xmm1 1206; X32-AVX512BW-NEXT: vmovdqa32 %xmm1, (%eax) 1207; X32-AVX512BW-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 1208; X32-AVX512BW-NEXT: retl 1209; 1210; X32-AVX512DQ-LABEL: test_broadcast_4i32_8i32_chain: 1211; X32-AVX512DQ: ## BB#0: 1212; X32-AVX512DQ-NEXT: movl {{[0-9]+}}(%esp), %eax 1213; X32-AVX512DQ-NEXT: movl {{[0-9]+}}(%esp), %ecx 1214; X32-AVX512DQ-NEXT: vmovdqa64 (%ecx), %xmm0 1215; X32-AVX512DQ-NEXT: vxorps %xmm1, %xmm1, %xmm1 1216; X32-AVX512DQ-NEXT: vmovaps %xmm1, (%eax) 1217; X32-AVX512DQ-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 1218; X32-AVX512DQ-NEXT: retl 1219; 1220; X64-AVX-LABEL: test_broadcast_4i32_8i32_chain: 1221; X64-AVX: ## BB#0: 1222; X64-AVX-NEXT: vmovaps (%rdi), %xmm0 1223; X64-AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 1224; X64-AVX-NEXT: vmovaps %xmm1, (%rsi) 1225; X64-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 1226; X64-AVX-NEXT: retq 1227; 1228; X64-AVX512F-LABEL: test_broadcast_4i32_8i32_chain: 1229; X64-AVX512F: ## BB#0: 1230; X64-AVX512F-NEXT: vmovdqa64 (%rdi), %xmm0 1231; X64-AVX512F-NEXT: vpxord %xmm1, %xmm1, %xmm1 1232; X64-AVX512F-NEXT: vmovdqa32 %xmm1, (%rsi) 1233; X64-AVX512F-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 1234; X64-AVX512F-NEXT: retq 1235; 1236; X64-AVX512BW-LABEL: test_broadcast_4i32_8i32_chain: 1237; X64-AVX512BW: ## BB#0: 1238; X64-AVX512BW-NEXT: vmovdqa64 (%rdi), %xmm0 1239; X64-AVX512BW-NEXT: vpxord %xmm1, %xmm1, %xmm1 1240; X64-AVX512BW-NEXT: vmovdqa32 %xmm1, (%rsi) 1241; X64-AVX512BW-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 1242; X64-AVX512BW-NEXT: retq 1243; 1244; X64-AVX512DQ-LABEL: test_broadcast_4i32_8i32_chain: 1245; X64-AVX512DQ: ## BB#0: 1246; X64-AVX512DQ-NEXT: vmovdqa64 (%rdi), %xmm0 1247; X64-AVX512DQ-NEXT: vxorps %xmm1, %xmm1, %xmm1 1248; X64-AVX512DQ-NEXT: vmovaps %xmm1, (%rsi) 1249; X64-AVX512DQ-NEXT: vinserti32x4 $1, %xmm0, %ymm0, %ymm0 1250; X64-AVX512DQ-NEXT: retq 1251 %1 = load <4 x i32>, <4 x i32>* %p0 1252 store <4 x float> zeroinitializer, <4 x float>* %p1 1253 %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> 1254 ret <8 x i32> %2 1255} 1256 1257define <16 x i32> @test_broadcast_4i32_16i32_chain(<4 x i32>* %p0, <4 x float>* %p1) { 1258; X32-AVX-LABEL: test_broadcast_4i32_16i32_chain: 1259; X32-AVX: ## BB#0: 1260; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax 1261; X32-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx 1262; X32-AVX-NEXT: vmovaps (%ecx), %xmm0 1263; X32-AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 1264; X32-AVX-NEXT: vmovaps %xmm1, (%eax) 1265; X32-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 1266; X32-AVX-NEXT: vmovaps %ymm0, %ymm1 1267; X32-AVX-NEXT: retl 1268; 1269; X32-AVX512F-LABEL: test_broadcast_4i32_16i32_chain: 1270; X32-AVX512F: ## BB#0: 1271; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %eax 1272; X32-AVX512F-NEXT: movl {{[0-9]+}}(%esp), %ecx 1273; X32-AVX512F-NEXT: vmovdqa64 (%ecx), %xmm0 1274; X32-AVX512F-NEXT: vpxord %xmm1, %xmm1, %xmm1 1275; X32-AVX512F-NEXT: vmovdqa32 %xmm1, (%eax) 1276; X32-AVX512F-NEXT: vinserti32x4 $1, %xmm0, %zmm0, %zmm0 1277; X32-AVX512F-NEXT: vinserti64x4 $1, %ymm0, %zmm0, %zmm0 1278; X32-AVX512F-NEXT: retl 1279; 1280; X32-AVX512BW-LABEL: test_broadcast_4i32_16i32_chain: 1281; X32-AVX512BW: ## BB#0: 1282; X32-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %eax 1283; X32-AVX512BW-NEXT: movl {{[0-9]+}}(%esp), %ecx 1284; X32-AVX512BW-NEXT: vmovdqa64 (%ecx), %xmm0 1285; X32-AVX512BW-NEXT: vpxord %xmm1, %xmm1, %xmm1 1286; X32-AVX512BW-NEXT: vmovdqa32 %xmm1, (%eax) 1287; X32-AVX512BW-NEXT: vinserti32x4 $1, %xmm0, %zmm0, %zmm0 1288; X32-AVX512BW-NEXT: vinserti64x4 $1, %ymm0, %zmm0, %zmm0 1289; X32-AVX512BW-NEXT: retl 1290; 1291; X32-AVX512DQ-LABEL: test_broadcast_4i32_16i32_chain: 1292; X32-AVX512DQ: ## BB#0: 1293; X32-AVX512DQ-NEXT: movl {{[0-9]+}}(%esp), %eax 1294; X32-AVX512DQ-NEXT: movl {{[0-9]+}}(%esp), %ecx 1295; X32-AVX512DQ-NEXT: vmovdqa64 (%ecx), %xmm0 1296; X32-AVX512DQ-NEXT: vxorps %xmm1, %xmm1, %xmm1 1297; X32-AVX512DQ-NEXT: vmovaps %xmm1, (%eax) 1298; X32-AVX512DQ-NEXT: vinserti32x4 $1, %xmm0, %zmm0, %zmm0 1299; X32-AVX512DQ-NEXT: vinserti32x8 $1, %ymm0, %zmm0, %zmm0 1300; X32-AVX512DQ-NEXT: retl 1301; 1302; X64-AVX-LABEL: test_broadcast_4i32_16i32_chain: 1303; X64-AVX: ## BB#0: 1304; X64-AVX-NEXT: vmovaps (%rdi), %xmm0 1305; X64-AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 1306; X64-AVX-NEXT: vmovaps %xmm1, (%rsi) 1307; X64-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 1308; X64-AVX-NEXT: vmovaps %ymm0, %ymm1 1309; X64-AVX-NEXT: retq 1310; 1311; X64-AVX512F-LABEL: test_broadcast_4i32_16i32_chain: 1312; X64-AVX512F: ## BB#0: 1313; X64-AVX512F-NEXT: vmovdqa64 (%rdi), %xmm0 1314; X64-AVX512F-NEXT: vpxord %xmm1, %xmm1, %xmm1 1315; X64-AVX512F-NEXT: vmovdqa32 %xmm1, (%rsi) 1316; X64-AVX512F-NEXT: vinserti32x4 $1, %xmm0, %zmm0, %zmm0 1317; X64-AVX512F-NEXT: vinserti64x4 $1, %ymm0, %zmm0, %zmm0 1318; X64-AVX512F-NEXT: retq 1319; 1320; X64-AVX512BW-LABEL: test_broadcast_4i32_16i32_chain: 1321; X64-AVX512BW: ## BB#0: 1322; X64-AVX512BW-NEXT: vmovdqa64 (%rdi), %xmm0 1323; X64-AVX512BW-NEXT: vpxord %xmm1, %xmm1, %xmm1 1324; X64-AVX512BW-NEXT: vmovdqa32 %xmm1, (%rsi) 1325; X64-AVX512BW-NEXT: vinserti32x4 $1, %xmm0, %zmm0, %zmm0 1326; X64-AVX512BW-NEXT: vinserti64x4 $1, %ymm0, %zmm0, %zmm0 1327; X64-AVX512BW-NEXT: retq 1328; 1329; X64-AVX512DQ-LABEL: test_broadcast_4i32_16i32_chain: 1330; X64-AVX512DQ: ## BB#0: 1331; X64-AVX512DQ-NEXT: vmovdqa64 (%rdi), %xmm0 1332; X64-AVX512DQ-NEXT: vxorps %xmm1, %xmm1, %xmm1 1333; X64-AVX512DQ-NEXT: vmovaps %xmm1, (%rsi) 1334; X64-AVX512DQ-NEXT: vinserti32x4 $1, %xmm0, %zmm0, %zmm0 1335; X64-AVX512DQ-NEXT: vinserti32x8 $1, %ymm0, %zmm0, %zmm0 1336; X64-AVX512DQ-NEXT: retq 1337 %1 = load <4 x i32>, <4 x i32>* %p0 1338 store <4 x float> zeroinitializer, <4 x float>* %p1 1339 %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> 1340 ret <16 x i32> %2 1341} 1342 1343; 1344; subvector Load with multiple uses + broadcast 1345; Fallback to the broadcast should be done 1346; 1347 1348@ga4 = global <4 x i64> zeroinitializer, align 8 1349@gb4 = global <8 x i64> zeroinitializer, align 8 1350 1351define void @fallback_broadcast_v4i64_to_v8i64(<4 x i64> %a, <8 x i64> %b) { 1352; X32-AVX512-LABEL: fallback_broadcast_v4i64_to_v8i64: 1353; X32-AVX512: ## BB#0: ## %entry 1354; X32-AVX512-NEXT: vpaddq LCPI26_0, %ymm0, %ymm0 1355; X32-AVX512-NEXT: vmovdqa64 {{.*#+}} zmm2 = [1,0,2,0,3,0,4,0,1,0,2,0,3,0,4,0] 1356; X32-AVX512-NEXT: vpaddq %zmm2, %zmm1, %zmm1 1357; X32-AVX512-NEXT: vpandq %zmm2, %zmm1, %zmm1 1358; X32-AVX512-NEXT: vmovdqu64 %ymm0, _ga4 1359; X32-AVX512-NEXT: vmovdqu64 %zmm1, _gb4 1360; X32-AVX512-NEXT: retl 1361; 1362; X64-AVX512-LABEL: fallback_broadcast_v4i64_to_v8i64: 1363; X64-AVX512: ## BB#0: ## %entry 1364; X64-AVX512-NEXT: vmovdqa64 {{.*#+}} ymm2 = [1,2,3,4] 1365; X64-AVX512-NEXT: vpaddq %ymm2, %ymm0, %ymm0 1366; X64-AVX512-NEXT: vinserti64x4 $1, %ymm2, %zmm2, %zmm2 1367; X64-AVX512-NEXT: vpaddq %zmm2, %zmm1, %zmm1 1368; X64-AVX512-NEXT: vpandq %zmm2, %zmm1, %zmm1 1369; X64-AVX512-NEXT: vmovdqu64 %ymm0, {{.*}}(%rip) 1370; X64-AVX512-NEXT: vmovdqu64 %zmm1, {{.*}}(%rip) 1371; X64-AVX512-NEXT: retq 1372entry: 1373 %0 = add <4 x i64> %a, <i64 1, i64 2, i64 3, i64 4> 1374 %1 = add <8 x i64> %b, <i64 1, i64 2, i64 3, i64 4, i64 1, i64 2, i64 3, i64 4> 1375 %2 = and <8 x i64> %1, <i64 1, i64 2, i64 3, i64 4, i64 1, i64 2, i64 3, i64 4> 1376 store <4 x i64> %0, <4 x i64>* @ga4, align 8 1377 store <8 x i64> %2, <8 x i64>* @gb4, align 8 1378 ret void 1379} 1380 1381 1382@ga2 = global <4 x double> zeroinitializer, align 8 1383@gb2 = global <8 x double> zeroinitializer, align 8 1384 1385define void @fallback_broadcast_v4f64_to_v8f64(<4 x double> %a, <8 x double> %b) { 1386; X32-AVX512-LABEL: fallback_broadcast_v4f64_to_v8f64: 1387; X32-AVX512: ## BB#0: ## %entry 1388; X32-AVX512-NEXT: vmovapd {{.*#+}} ymm2 = [1.000000e+00,2.000000e+00,3.000000e+00,4.000000e+00] 1389; X32-AVX512-NEXT: vaddpd %ymm2, %ymm0, %ymm0 1390; X32-AVX512-NEXT: vinsertf64x4 $1, %ymm2, %zmm2, %zmm2 1391; X32-AVX512-NEXT: vaddpd %zmm2, %zmm1, %zmm1 1392; X32-AVX512-NEXT: vdivpd %zmm2, %zmm1, %zmm1 1393; X32-AVX512-NEXT: vmovupd %ymm0, _ga2 1394; X32-AVX512-NEXT: vmovupd %zmm1, _gb2 1395; X32-AVX512-NEXT: retl 1396; 1397; X64-AVX512-LABEL: fallback_broadcast_v4f64_to_v8f64: 1398; X64-AVX512: ## BB#0: ## %entry 1399; X64-AVX512-NEXT: vmovapd {{.*#+}} ymm2 = [1.000000e+00,2.000000e+00,3.000000e+00,4.000000e+00] 1400; X64-AVX512-NEXT: vaddpd %ymm2, %ymm0, %ymm0 1401; X64-AVX512-NEXT: vinsertf64x4 $1, %ymm2, %zmm2, %zmm2 1402; X64-AVX512-NEXT: vaddpd %zmm2, %zmm1, %zmm1 1403; X64-AVX512-NEXT: vdivpd %zmm2, %zmm1, %zmm1 1404; X64-AVX512-NEXT: vmovupd %ymm0, {{.*}}(%rip) 1405; X64-AVX512-NEXT: vmovupd %zmm1, {{.*}}(%rip) 1406; X64-AVX512-NEXT: retq 1407entry: 1408 %0 = fadd <4 x double> %a, <double 1.0, double 2.0, double 3.0, double 4.0> 1409 %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> 1410 %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> 1411 store <4 x double> %0, <4 x double>* @ga2, align 8 1412 store <8 x double> %2, <8 x double>* @gb2, align 8 1413 ret void 1414} 1415