1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+sse4.2 < %s | FileCheck %s --check-prefix=SSE 3; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx < %s | FileCheck %s --check-prefix=AVX1 4; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx2 < %s | FileCheck %s --check-prefix=AVX2 5; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f < %s | FileCheck %s --check-prefixes=AVX512,AVX512F 6; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f,+avx512vl < %s | FileCheck %s --check-prefixes=AVX512,AVX512VL 7 8; 9; vXf32 10; 11 12%struct.a = type { [4 x i32], [4 x i8], %struct.b, i32 } 13%struct.b = type { i32, i32 } 14@c = external dso_local global %struct.a, align 4 15 16define <4 x float> @gather_v4f32_ptr_v4i32(<4 x ptr> %ptr, <4 x i32> %trigger, <4 x float> %passthru) { 17; SSE-LABEL: gather_v4f32_ptr_v4i32: 18; SSE: # %bb.0: 19; SSE-NEXT: pxor %xmm4, %xmm4 20; SSE-NEXT: pcmpeqd %xmm2, %xmm4 21; SSE-NEXT: movmskps %xmm4, %eax 22; SSE-NEXT: testb $1, %al 23; SSE-NEXT: jne .LBB0_1 24; SSE-NEXT: # %bb.2: # %else 25; SSE-NEXT: testb $2, %al 26; SSE-NEXT: jne .LBB0_3 27; SSE-NEXT: .LBB0_4: # %else2 28; SSE-NEXT: testb $4, %al 29; SSE-NEXT: jne .LBB0_5 30; SSE-NEXT: .LBB0_6: # %else5 31; SSE-NEXT: testb $8, %al 32; SSE-NEXT: jne .LBB0_7 33; SSE-NEXT: .LBB0_8: # %else8 34; SSE-NEXT: movaps %xmm3, %xmm0 35; SSE-NEXT: retq 36; SSE-NEXT: .LBB0_1: # %cond.load 37; SSE-NEXT: movq %xmm0, %rcx 38; SSE-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero 39; SSE-NEXT: pblendw {{.*#+}} xmm3 = xmm2[0,1],xmm3[2,3,4,5,6,7] 40; SSE-NEXT: testb $2, %al 41; SSE-NEXT: je .LBB0_4 42; SSE-NEXT: .LBB0_3: # %cond.load1 43; SSE-NEXT: pextrq $1, %xmm0, %rcx 44; SSE-NEXT: insertps {{.*#+}} xmm3 = xmm3[0],mem[0],xmm3[2,3] 45; SSE-NEXT: testb $4, %al 46; SSE-NEXT: je .LBB0_6 47; SSE-NEXT: .LBB0_5: # %cond.load4 48; SSE-NEXT: movq %xmm1, %rcx 49; SSE-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1],mem[0],xmm3[3] 50; SSE-NEXT: testb $8, %al 51; SSE-NEXT: je .LBB0_8 52; SSE-NEXT: .LBB0_7: # %cond.load7 53; SSE-NEXT: pextrq $1, %xmm1, %rax 54; SSE-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1,2],mem[0] 55; SSE-NEXT: movaps %xmm3, %xmm0 56; SSE-NEXT: retq 57; 58; AVX1-LABEL: gather_v4f32_ptr_v4i32: 59; AVX1: # %bb.0: 60; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 61; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 62; AVX1-NEXT: vmovmskps %xmm1, %eax 63; AVX1-NEXT: testb $1, %al 64; AVX1-NEXT: je .LBB0_2 65; AVX1-NEXT: # %bb.1: # %cond.load 66; AVX1-NEXT: vmovq %xmm0, %rcx 67; AVX1-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero 68; AVX1-NEXT: vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] 69; AVX1-NEXT: .LBB0_2: # %else 70; AVX1-NEXT: testb $2, %al 71; AVX1-NEXT: je .LBB0_4 72; AVX1-NEXT: # %bb.3: # %cond.load1 73; AVX1-NEXT: vpextrq $1, %xmm0, %rcx 74; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3] 75; AVX1-NEXT: .LBB0_4: # %else2 76; AVX1-NEXT: testb $4, %al 77; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 78; AVX1-NEXT: jne .LBB0_5 79; AVX1-NEXT: # %bb.6: # %else5 80; AVX1-NEXT: testb $8, %al 81; AVX1-NEXT: jne .LBB0_7 82; AVX1-NEXT: .LBB0_8: # %else8 83; AVX1-NEXT: vmovaps %xmm2, %xmm0 84; AVX1-NEXT: vzeroupper 85; AVX1-NEXT: retq 86; AVX1-NEXT: .LBB0_5: # %cond.load4 87; AVX1-NEXT: vmovq %xmm0, %rcx 88; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3] 89; AVX1-NEXT: testb $8, %al 90; AVX1-NEXT: je .LBB0_8 91; AVX1-NEXT: .LBB0_7: # %cond.load7 92; AVX1-NEXT: vpextrq $1, %xmm0, %rax 93; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0] 94; AVX1-NEXT: vmovaps %xmm2, %xmm0 95; AVX1-NEXT: vzeroupper 96; AVX1-NEXT: retq 97; 98; AVX2-LABEL: gather_v4f32_ptr_v4i32: 99; AVX2: # %bb.0: 100; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 101; AVX2-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 102; AVX2-NEXT: vmovmskps %xmm1, %eax 103; AVX2-NEXT: testb $1, %al 104; AVX2-NEXT: je .LBB0_2 105; AVX2-NEXT: # %bb.1: # %cond.load 106; AVX2-NEXT: vmovq %xmm0, %rcx 107; AVX2-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero 108; AVX2-NEXT: vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] 109; AVX2-NEXT: .LBB0_2: # %else 110; AVX2-NEXT: testb $2, %al 111; AVX2-NEXT: je .LBB0_4 112; AVX2-NEXT: # %bb.3: # %cond.load1 113; AVX2-NEXT: vpextrq $1, %xmm0, %rcx 114; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3] 115; AVX2-NEXT: .LBB0_4: # %else2 116; AVX2-NEXT: testb $4, %al 117; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 118; AVX2-NEXT: jne .LBB0_5 119; AVX2-NEXT: # %bb.6: # %else5 120; AVX2-NEXT: testb $8, %al 121; AVX2-NEXT: jne .LBB0_7 122; AVX2-NEXT: .LBB0_8: # %else8 123; AVX2-NEXT: vmovaps %xmm2, %xmm0 124; AVX2-NEXT: vzeroupper 125; AVX2-NEXT: retq 126; AVX2-NEXT: .LBB0_5: # %cond.load4 127; AVX2-NEXT: vmovq %xmm0, %rcx 128; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3] 129; AVX2-NEXT: testb $8, %al 130; AVX2-NEXT: je .LBB0_8 131; AVX2-NEXT: .LBB0_7: # %cond.load7 132; AVX2-NEXT: vpextrq $1, %xmm0, %rax 133; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0] 134; AVX2-NEXT: vmovaps %xmm2, %xmm0 135; AVX2-NEXT: vzeroupper 136; AVX2-NEXT: retq 137; 138; AVX512F-LABEL: gather_v4f32_ptr_v4i32: 139; AVX512F: # %bb.0: 140; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 141; AVX512F-NEXT: vptestnmd %zmm1, %zmm1, %k0 142; AVX512F-NEXT: kmovw %k0, %eax 143; AVX512F-NEXT: testb $1, %al 144; AVX512F-NEXT: je .LBB0_2 145; AVX512F-NEXT: # %bb.1: # %cond.load 146; AVX512F-NEXT: vmovq %xmm0, %rcx 147; AVX512F-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 148; AVX512F-NEXT: vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] 149; AVX512F-NEXT: .LBB0_2: # %else 150; AVX512F-NEXT: testb $2, %al 151; AVX512F-NEXT: je .LBB0_4 152; AVX512F-NEXT: # %bb.3: # %cond.load1 153; AVX512F-NEXT: vpextrq $1, %xmm0, %rcx 154; AVX512F-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3] 155; AVX512F-NEXT: .LBB0_4: # %else2 156; AVX512F-NEXT: testb $4, %al 157; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0 158; AVX512F-NEXT: jne .LBB0_5 159; AVX512F-NEXT: # %bb.6: # %else5 160; AVX512F-NEXT: testb $8, %al 161; AVX512F-NEXT: jne .LBB0_7 162; AVX512F-NEXT: .LBB0_8: # %else8 163; AVX512F-NEXT: vmovaps %xmm2, %xmm0 164; AVX512F-NEXT: vzeroupper 165; AVX512F-NEXT: retq 166; AVX512F-NEXT: .LBB0_5: # %cond.load4 167; AVX512F-NEXT: vmovq %xmm0, %rcx 168; AVX512F-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3] 169; AVX512F-NEXT: testb $8, %al 170; AVX512F-NEXT: je .LBB0_8 171; AVX512F-NEXT: .LBB0_7: # %cond.load7 172; AVX512F-NEXT: vpextrq $1, %xmm0, %rax 173; AVX512F-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0] 174; AVX512F-NEXT: vmovaps %xmm2, %xmm0 175; AVX512F-NEXT: vzeroupper 176; AVX512F-NEXT: retq 177; 178; AVX512VL-LABEL: gather_v4f32_ptr_v4i32: 179; AVX512VL: # %bb.0: 180; AVX512VL-NEXT: vptestnmd %xmm1, %xmm1, %k1 181; AVX512VL-NEXT: vgatherqps (,%ymm0), %xmm2 {%k1} 182; AVX512VL-NEXT: vmovaps %xmm2, %xmm0 183; AVX512VL-NEXT: vzeroupper 184; AVX512VL-NEXT: retq 185 %mask = icmp eq <4 x i32> %trigger, zeroinitializer 186 %res = call <4 x float> @llvm.masked.gather.v4f32.v4p0(<4 x ptr> %ptr, i32 4, <4 x i1> %mask, <4 x float> %passthru) 187 ret <4 x float> %res 188} 189 190define <4 x float> @gather_v4f32_v4i32_v4i32(ptr %base, <4 x i32> %idx, <4 x i32> %trigger, <4 x float> %passthru) { 191; SSE-LABEL: gather_v4f32_v4i32_v4i32: 192; SSE: # %bb.0: 193; SSE-NEXT: movq %rdi, %xmm3 194; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,1,0,1] 195; SSE-NEXT: pmovsxdq %xmm0, %xmm4 196; SSE-NEXT: psllq $2, %xmm4 197; SSE-NEXT: paddq %xmm3, %xmm4 198; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3] 199; SSE-NEXT: pmovsxdq %xmm0, %xmm0 200; SSE-NEXT: pxor %xmm5, %xmm5 201; SSE-NEXT: pcmpeqd %xmm1, %xmm5 202; SSE-NEXT: movmskps %xmm5, %eax 203; SSE-NEXT: testb $1, %al 204; SSE-NEXT: je .LBB1_2 205; SSE-NEXT: # %bb.1: # %cond.load 206; SSE-NEXT: movq %xmm4, %rcx 207; SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 208; SSE-NEXT: pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3,4,5,6,7] 209; SSE-NEXT: .LBB1_2: # %else 210; SSE-NEXT: psllq $2, %xmm0 211; SSE-NEXT: testb $2, %al 212; SSE-NEXT: je .LBB1_4 213; SSE-NEXT: # %bb.3: # %cond.load1 214; SSE-NEXT: pextrq $1, %xmm4, %rcx 215; SSE-NEXT: insertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3] 216; SSE-NEXT: .LBB1_4: # %else2 217; SSE-NEXT: paddq %xmm0, %xmm3 218; SSE-NEXT: testb $4, %al 219; SSE-NEXT: jne .LBB1_5 220; SSE-NEXT: # %bb.6: # %else5 221; SSE-NEXT: testb $8, %al 222; SSE-NEXT: jne .LBB1_7 223; SSE-NEXT: .LBB1_8: # %else8 224; SSE-NEXT: movaps %xmm2, %xmm0 225; SSE-NEXT: retq 226; SSE-NEXT: .LBB1_5: # %cond.load4 227; SSE-NEXT: movq %xmm3, %rcx 228; SSE-NEXT: insertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3] 229; SSE-NEXT: testb $8, %al 230; SSE-NEXT: je .LBB1_8 231; SSE-NEXT: .LBB1_7: # %cond.load7 232; SSE-NEXT: pextrq $1, %xmm3, %rax 233; SSE-NEXT: insertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0] 234; SSE-NEXT: movaps %xmm2, %xmm0 235; SSE-NEXT: retq 236; 237; AVX1-LABEL: gather_v4f32_v4i32_v4i32: 238; AVX1: # %bb.0: 239; AVX1-NEXT: vmovq %rdi, %xmm3 240; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[0,1,0,1] 241; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm0[2,3,2,3] 242; AVX1-NEXT: vpmovsxdq %xmm4, %xmm4 243; AVX1-NEXT: vpsllq $2, %xmm4, %xmm4 244; AVX1-NEXT: vpaddq %xmm4, %xmm3, %xmm4 245; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0 246; AVX1-NEXT: vpsllq $2, %xmm0, %xmm0 247; AVX1-NEXT: vpaddq %xmm0, %xmm3, %xmm0 248; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 249; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 250; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 251; AVX1-NEXT: vmovmskps %xmm1, %eax 252; AVX1-NEXT: testb $1, %al 253; AVX1-NEXT: je .LBB1_2 254; AVX1-NEXT: # %bb.1: # %cond.load 255; AVX1-NEXT: vmovq %xmm0, %rcx 256; AVX1-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero 257; AVX1-NEXT: vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] 258; AVX1-NEXT: .LBB1_2: # %else 259; AVX1-NEXT: testb $2, %al 260; AVX1-NEXT: je .LBB1_4 261; AVX1-NEXT: # %bb.3: # %cond.load1 262; AVX1-NEXT: vpextrq $1, %xmm0, %rcx 263; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3] 264; AVX1-NEXT: .LBB1_4: # %else2 265; AVX1-NEXT: testb $4, %al 266; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 267; AVX1-NEXT: jne .LBB1_5 268; AVX1-NEXT: # %bb.6: # %else5 269; AVX1-NEXT: testb $8, %al 270; AVX1-NEXT: jne .LBB1_7 271; AVX1-NEXT: .LBB1_8: # %else8 272; AVX1-NEXT: vmovaps %xmm2, %xmm0 273; AVX1-NEXT: vzeroupper 274; AVX1-NEXT: retq 275; AVX1-NEXT: .LBB1_5: # %cond.load4 276; AVX1-NEXT: vmovq %xmm0, %rcx 277; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3] 278; AVX1-NEXT: testb $8, %al 279; AVX1-NEXT: je .LBB1_8 280; AVX1-NEXT: .LBB1_7: # %cond.load7 281; AVX1-NEXT: vpextrq $1, %xmm0, %rax 282; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0] 283; AVX1-NEXT: vmovaps %xmm2, %xmm0 284; AVX1-NEXT: vzeroupper 285; AVX1-NEXT: retq 286; 287; AVX2-LABEL: gather_v4f32_v4i32_v4i32: 288; AVX2: # %bb.0: 289; AVX2-NEXT: vmovq %rdi, %xmm3 290; AVX2-NEXT: vpbroadcastq %xmm3, %ymm3 291; AVX2-NEXT: vpmovsxdq %xmm0, %ymm0 292; AVX2-NEXT: vpsllq $2, %ymm0, %ymm0 293; AVX2-NEXT: vpaddq %ymm0, %ymm3, %ymm0 294; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 295; AVX2-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 296; AVX2-NEXT: vmovmskps %xmm1, %eax 297; AVX2-NEXT: testb $1, %al 298; AVX2-NEXT: je .LBB1_2 299; AVX2-NEXT: # %bb.1: # %cond.load 300; AVX2-NEXT: vmovq %xmm0, %rcx 301; AVX2-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero 302; AVX2-NEXT: vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] 303; AVX2-NEXT: .LBB1_2: # %else 304; AVX2-NEXT: testb $2, %al 305; AVX2-NEXT: je .LBB1_4 306; AVX2-NEXT: # %bb.3: # %cond.load1 307; AVX2-NEXT: vpextrq $1, %xmm0, %rcx 308; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3] 309; AVX2-NEXT: .LBB1_4: # %else2 310; AVX2-NEXT: testb $4, %al 311; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 312; AVX2-NEXT: jne .LBB1_5 313; AVX2-NEXT: # %bb.6: # %else5 314; AVX2-NEXT: testb $8, %al 315; AVX2-NEXT: jne .LBB1_7 316; AVX2-NEXT: .LBB1_8: # %else8 317; AVX2-NEXT: vmovaps %xmm2, %xmm0 318; AVX2-NEXT: vzeroupper 319; AVX2-NEXT: retq 320; AVX2-NEXT: .LBB1_5: # %cond.load4 321; AVX2-NEXT: vmovq %xmm0, %rcx 322; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3] 323; AVX2-NEXT: testb $8, %al 324; AVX2-NEXT: je .LBB1_8 325; AVX2-NEXT: .LBB1_7: # %cond.load7 326; AVX2-NEXT: vpextrq $1, %xmm0, %rax 327; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0] 328; AVX2-NEXT: vmovaps %xmm2, %xmm0 329; AVX2-NEXT: vzeroupper 330; AVX2-NEXT: retq 331; 332; AVX512F-LABEL: gather_v4f32_v4i32_v4i32: 333; AVX512F: # %bb.0: 334; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 335; AVX512F-NEXT: vmovq %rdi, %xmm3 336; AVX512F-NEXT: vpbroadcastq %xmm3, %ymm3 337; AVX512F-NEXT: vpmovsxdq %xmm0, %ymm0 338; AVX512F-NEXT: vpsllq $2, %ymm0, %ymm0 339; AVX512F-NEXT: vpaddq %ymm0, %ymm3, %ymm0 340; AVX512F-NEXT: vptestnmd %zmm1, %zmm1, %k0 341; AVX512F-NEXT: kmovw %k0, %eax 342; AVX512F-NEXT: testb $1, %al 343; AVX512F-NEXT: je .LBB1_2 344; AVX512F-NEXT: # %bb.1: # %cond.load 345; AVX512F-NEXT: vmovq %xmm0, %rcx 346; AVX512F-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 347; AVX512F-NEXT: vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] 348; AVX512F-NEXT: .LBB1_2: # %else 349; AVX512F-NEXT: testb $2, %al 350; AVX512F-NEXT: je .LBB1_4 351; AVX512F-NEXT: # %bb.3: # %cond.load1 352; AVX512F-NEXT: vpextrq $1, %xmm0, %rcx 353; AVX512F-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3] 354; AVX512F-NEXT: .LBB1_4: # %else2 355; AVX512F-NEXT: testb $4, %al 356; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0 357; AVX512F-NEXT: jne .LBB1_5 358; AVX512F-NEXT: # %bb.6: # %else5 359; AVX512F-NEXT: testb $8, %al 360; AVX512F-NEXT: jne .LBB1_7 361; AVX512F-NEXT: .LBB1_8: # %else8 362; AVX512F-NEXT: vmovaps %xmm2, %xmm0 363; AVX512F-NEXT: vzeroupper 364; AVX512F-NEXT: retq 365; AVX512F-NEXT: .LBB1_5: # %cond.load4 366; AVX512F-NEXT: vmovq %xmm0, %rcx 367; AVX512F-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3] 368; AVX512F-NEXT: testb $8, %al 369; AVX512F-NEXT: je .LBB1_8 370; AVX512F-NEXT: .LBB1_7: # %cond.load7 371; AVX512F-NEXT: vpextrq $1, %xmm0, %rax 372; AVX512F-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0] 373; AVX512F-NEXT: vmovaps %xmm2, %xmm0 374; AVX512F-NEXT: vzeroupper 375; AVX512F-NEXT: retq 376; 377; AVX512VL-LABEL: gather_v4f32_v4i32_v4i32: 378; AVX512VL: # %bb.0: 379; AVX512VL-NEXT: vptestnmd %xmm1, %xmm1, %k1 380; AVX512VL-NEXT: vgatherdps (%rdi,%xmm0,4), %xmm2 {%k1} 381; AVX512VL-NEXT: vmovaps %xmm2, %xmm0 382; AVX512VL-NEXT: retq 383 %vptr0 = insertelement <4 x ptr> undef, ptr %base, i32 0 384 %vptr1 = shufflevector <4 x ptr> %vptr0, <4 x ptr> undef, <4 x i32> zeroinitializer 385 %vptr2 = getelementptr float, <4 x ptr> %vptr1, <4 x i32> %idx 386 387 %mask = icmp eq <4 x i32> %trigger, zeroinitializer 388 %res = call <4 x float> @llvm.masked.gather.v4f32.v4p0(<4 x ptr> %vptr2, i32 4, <4 x i1> %mask, <4 x float> %passthru) 389 ret <4 x float> %res 390} 391 392define <4 x float> @gather_v4f32_v4i64_v4i32(ptr %base, <4 x i64> %idx, <4 x i32> %trigger, <4 x float> %passthru) { 393; SSE-LABEL: gather_v4f32_v4i64_v4i32: 394; SSE: # %bb.0: 395; SSE-NEXT: movq %rdi, %xmm4 396; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,1,0,1] 397; SSE-NEXT: psllq $2, %xmm0 398; SSE-NEXT: paddq %xmm4, %xmm0 399; SSE-NEXT: pxor %xmm5, %xmm5 400; SSE-NEXT: pcmpeqd %xmm2, %xmm5 401; SSE-NEXT: movmskps %xmm5, %eax 402; SSE-NEXT: testb $1, %al 403; SSE-NEXT: je .LBB2_2 404; SSE-NEXT: # %bb.1: # %cond.load 405; SSE-NEXT: movq %xmm0, %rcx 406; SSE-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero 407; SSE-NEXT: pblendw {{.*#+}} xmm3 = xmm2[0,1],xmm3[2,3,4,5,6,7] 408; SSE-NEXT: .LBB2_2: # %else 409; SSE-NEXT: psllq $2, %xmm1 410; SSE-NEXT: testb $2, %al 411; SSE-NEXT: je .LBB2_4 412; SSE-NEXT: # %bb.3: # %cond.load1 413; SSE-NEXT: pextrq $1, %xmm0, %rcx 414; SSE-NEXT: insertps {{.*#+}} xmm3 = xmm3[0],mem[0],xmm3[2,3] 415; SSE-NEXT: .LBB2_4: # %else2 416; SSE-NEXT: paddq %xmm1, %xmm4 417; SSE-NEXT: testb $4, %al 418; SSE-NEXT: jne .LBB2_5 419; SSE-NEXT: # %bb.6: # %else5 420; SSE-NEXT: testb $8, %al 421; SSE-NEXT: jne .LBB2_7 422; SSE-NEXT: .LBB2_8: # %else8 423; SSE-NEXT: movaps %xmm3, %xmm0 424; SSE-NEXT: retq 425; SSE-NEXT: .LBB2_5: # %cond.load4 426; SSE-NEXT: movq %xmm4, %rcx 427; SSE-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1],mem[0],xmm3[3] 428; SSE-NEXT: testb $8, %al 429; SSE-NEXT: je .LBB2_8 430; SSE-NEXT: .LBB2_7: # %cond.load7 431; SSE-NEXT: pextrq $1, %xmm4, %rax 432; SSE-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1,2],mem[0] 433; SSE-NEXT: movaps %xmm3, %xmm0 434; SSE-NEXT: retq 435; 436; AVX1-LABEL: gather_v4f32_v4i64_v4i32: 437; AVX1: # %bb.0: 438; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 439; AVX1-NEXT: vpsllq $2, %xmm3, %xmm3 440; AVX1-NEXT: vmovq %rdi, %xmm4 441; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[0,1,0,1] 442; AVX1-NEXT: vpaddq %xmm3, %xmm4, %xmm3 443; AVX1-NEXT: vpsllq $2, %xmm0, %xmm0 444; AVX1-NEXT: vpaddq %xmm0, %xmm4, %xmm0 445; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 446; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 447; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 448; AVX1-NEXT: vmovmskps %xmm1, %eax 449; AVX1-NEXT: testb $1, %al 450; AVX1-NEXT: je .LBB2_2 451; AVX1-NEXT: # %bb.1: # %cond.load 452; AVX1-NEXT: vmovq %xmm0, %rcx 453; AVX1-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero 454; AVX1-NEXT: vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] 455; AVX1-NEXT: .LBB2_2: # %else 456; AVX1-NEXT: testb $2, %al 457; AVX1-NEXT: je .LBB2_4 458; AVX1-NEXT: # %bb.3: # %cond.load1 459; AVX1-NEXT: vpextrq $1, %xmm0, %rcx 460; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3] 461; AVX1-NEXT: .LBB2_4: # %else2 462; AVX1-NEXT: testb $4, %al 463; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 464; AVX1-NEXT: jne .LBB2_5 465; AVX1-NEXT: # %bb.6: # %else5 466; AVX1-NEXT: testb $8, %al 467; AVX1-NEXT: jne .LBB2_7 468; AVX1-NEXT: .LBB2_8: # %else8 469; AVX1-NEXT: vmovaps %xmm2, %xmm0 470; AVX1-NEXT: vzeroupper 471; AVX1-NEXT: retq 472; AVX1-NEXT: .LBB2_5: # %cond.load4 473; AVX1-NEXT: vmovq %xmm0, %rcx 474; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3] 475; AVX1-NEXT: testb $8, %al 476; AVX1-NEXT: je .LBB2_8 477; AVX1-NEXT: .LBB2_7: # %cond.load7 478; AVX1-NEXT: vpextrq $1, %xmm0, %rax 479; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0] 480; AVX1-NEXT: vmovaps %xmm2, %xmm0 481; AVX1-NEXT: vzeroupper 482; AVX1-NEXT: retq 483; 484; AVX2-LABEL: gather_v4f32_v4i64_v4i32: 485; AVX2: # %bb.0: 486; AVX2-NEXT: vmovq %rdi, %xmm3 487; AVX2-NEXT: vpbroadcastq %xmm3, %ymm3 488; AVX2-NEXT: vpsllq $2, %ymm0, %ymm0 489; AVX2-NEXT: vpaddq %ymm0, %ymm3, %ymm0 490; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 491; AVX2-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 492; AVX2-NEXT: vmovmskps %xmm1, %eax 493; AVX2-NEXT: testb $1, %al 494; AVX2-NEXT: je .LBB2_2 495; AVX2-NEXT: # %bb.1: # %cond.load 496; AVX2-NEXT: vmovq %xmm0, %rcx 497; AVX2-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero 498; AVX2-NEXT: vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] 499; AVX2-NEXT: .LBB2_2: # %else 500; AVX2-NEXT: testb $2, %al 501; AVX2-NEXT: je .LBB2_4 502; AVX2-NEXT: # %bb.3: # %cond.load1 503; AVX2-NEXT: vpextrq $1, %xmm0, %rcx 504; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3] 505; AVX2-NEXT: .LBB2_4: # %else2 506; AVX2-NEXT: testb $4, %al 507; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 508; AVX2-NEXT: jne .LBB2_5 509; AVX2-NEXT: # %bb.6: # %else5 510; AVX2-NEXT: testb $8, %al 511; AVX2-NEXT: jne .LBB2_7 512; AVX2-NEXT: .LBB2_8: # %else8 513; AVX2-NEXT: vmovaps %xmm2, %xmm0 514; AVX2-NEXT: vzeroupper 515; AVX2-NEXT: retq 516; AVX2-NEXT: .LBB2_5: # %cond.load4 517; AVX2-NEXT: vmovq %xmm0, %rcx 518; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3] 519; AVX2-NEXT: testb $8, %al 520; AVX2-NEXT: je .LBB2_8 521; AVX2-NEXT: .LBB2_7: # %cond.load7 522; AVX2-NEXT: vpextrq $1, %xmm0, %rax 523; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0] 524; AVX2-NEXT: vmovaps %xmm2, %xmm0 525; AVX2-NEXT: vzeroupper 526; AVX2-NEXT: retq 527; 528; AVX512F-LABEL: gather_v4f32_v4i64_v4i32: 529; AVX512F: # %bb.0: 530; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 531; AVX512F-NEXT: vmovq %rdi, %xmm3 532; AVX512F-NEXT: vpbroadcastq %xmm3, %ymm3 533; AVX512F-NEXT: vpsllq $2, %ymm0, %ymm0 534; AVX512F-NEXT: vpaddq %ymm0, %ymm3, %ymm0 535; AVX512F-NEXT: vptestnmd %zmm1, %zmm1, %k0 536; AVX512F-NEXT: kmovw %k0, %eax 537; AVX512F-NEXT: testb $1, %al 538; AVX512F-NEXT: je .LBB2_2 539; AVX512F-NEXT: # %bb.1: # %cond.load 540; AVX512F-NEXT: vmovq %xmm0, %rcx 541; AVX512F-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 542; AVX512F-NEXT: vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] 543; AVX512F-NEXT: .LBB2_2: # %else 544; AVX512F-NEXT: testb $2, %al 545; AVX512F-NEXT: je .LBB2_4 546; AVX512F-NEXT: # %bb.3: # %cond.load1 547; AVX512F-NEXT: vpextrq $1, %xmm0, %rcx 548; AVX512F-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3] 549; AVX512F-NEXT: .LBB2_4: # %else2 550; AVX512F-NEXT: testb $4, %al 551; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0 552; AVX512F-NEXT: jne .LBB2_5 553; AVX512F-NEXT: # %bb.6: # %else5 554; AVX512F-NEXT: testb $8, %al 555; AVX512F-NEXT: jne .LBB2_7 556; AVX512F-NEXT: .LBB2_8: # %else8 557; AVX512F-NEXT: vmovaps %xmm2, %xmm0 558; AVX512F-NEXT: vzeroupper 559; AVX512F-NEXT: retq 560; AVX512F-NEXT: .LBB2_5: # %cond.load4 561; AVX512F-NEXT: vmovq %xmm0, %rcx 562; AVX512F-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3] 563; AVX512F-NEXT: testb $8, %al 564; AVX512F-NEXT: je .LBB2_8 565; AVX512F-NEXT: .LBB2_7: # %cond.load7 566; AVX512F-NEXT: vpextrq $1, %xmm0, %rax 567; AVX512F-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0] 568; AVX512F-NEXT: vmovaps %xmm2, %xmm0 569; AVX512F-NEXT: vzeroupper 570; AVX512F-NEXT: retq 571; 572; AVX512VL-LABEL: gather_v4f32_v4i64_v4i32: 573; AVX512VL: # %bb.0: 574; AVX512VL-NEXT: vptestnmd %xmm1, %xmm1, %k1 575; AVX512VL-NEXT: vgatherqps (%rdi,%ymm0,4), %xmm2 {%k1} 576; AVX512VL-NEXT: vmovaps %xmm2, %xmm0 577; AVX512VL-NEXT: vzeroupper 578; AVX512VL-NEXT: retq 579 %vptr0 = insertelement <4 x ptr> undef, ptr %base, i32 0 580 %vptr1 = shufflevector <4 x ptr> %vptr0, <4 x ptr> undef, <4 x i32> zeroinitializer 581 %vptr2 = getelementptr float, <4 x ptr> %vptr1, <4 x i64> %idx 582 583 %mask = icmp eq <4 x i32> %trigger, zeroinitializer 584 %res = call <4 x float> @llvm.masked.gather.v4f32.v4p0(<4 x ptr> %vptr2, i32 4, <4 x i1> %mask, <4 x float> %passthru) 585 ret <4 x float> %res 586} 587 588; 589; vXi8 590; 591 592define <16 x i8> @gather_v16i8_v16i32_v16i8(ptr %base, <16 x i32> %idx, <16 x i8> %trigger, <16 x i8> %passthru) { 593; SSE-LABEL: gather_v16i8_v16i32_v16i8: 594; SSE: # %bb.0: 595; SSE-NEXT: movq %rdi, %xmm6 596; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,1,0,1] 597; SSE-NEXT: pshufd {{.*#+}} xmm7 = xmm0[2,3,2,3] 598; SSE-NEXT: pmovsxdq %xmm0, %xmm0 599; SSE-NEXT: paddq %xmm6, %xmm0 600; SSE-NEXT: pxor %xmm8, %xmm8 601; SSE-NEXT: pcmpeqb %xmm4, %xmm8 602; SSE-NEXT: pmovmskb %xmm8, %eax 603; SSE-NEXT: testb $1, %al 604; SSE-NEXT: je .LBB3_2 605; SSE-NEXT: # %bb.1: # %cond.load 606; SSE-NEXT: movq %xmm0, %rcx 607; SSE-NEXT: pinsrb $0, (%rcx), %xmm5 608; SSE-NEXT: .LBB3_2: # %else 609; SSE-NEXT: pmovsxdq %xmm7, %xmm4 610; SSE-NEXT: testb $2, %al 611; SSE-NEXT: je .LBB3_4 612; SSE-NEXT: # %bb.3: # %cond.load1 613; SSE-NEXT: pextrq $1, %xmm0, %rcx 614; SSE-NEXT: pinsrb $1, (%rcx), %xmm5 615; SSE-NEXT: .LBB3_4: # %else2 616; SSE-NEXT: paddq %xmm6, %xmm4 617; SSE-NEXT: testb $4, %al 618; SSE-NEXT: je .LBB3_6 619; SSE-NEXT: # %bb.5: # %cond.load4 620; SSE-NEXT: movq %xmm4, %rcx 621; SSE-NEXT: pinsrb $2, (%rcx), %xmm5 622; SSE-NEXT: .LBB3_6: # %else5 623; SSE-NEXT: pmovsxdq %xmm1, %xmm0 624; SSE-NEXT: testb $8, %al 625; SSE-NEXT: je .LBB3_8 626; SSE-NEXT: # %bb.7: # %cond.load7 627; SSE-NEXT: pextrq $1, %xmm4, %rcx 628; SSE-NEXT: pinsrb $3, (%rcx), %xmm5 629; SSE-NEXT: .LBB3_8: # %else8 630; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3] 631; SSE-NEXT: paddq %xmm6, %xmm0 632; SSE-NEXT: testb $16, %al 633; SSE-NEXT: je .LBB3_10 634; SSE-NEXT: # %bb.9: # %cond.load10 635; SSE-NEXT: movq %xmm0, %rcx 636; SSE-NEXT: pinsrb $4, (%rcx), %xmm5 637; SSE-NEXT: .LBB3_10: # %else11 638; SSE-NEXT: pmovsxdq %xmm1, %xmm1 639; SSE-NEXT: testb $32, %al 640; SSE-NEXT: je .LBB3_12 641; SSE-NEXT: # %bb.11: # %cond.load13 642; SSE-NEXT: pextrq $1, %xmm0, %rcx 643; SSE-NEXT: pinsrb $5, (%rcx), %xmm5 644; SSE-NEXT: .LBB3_12: # %else14 645; SSE-NEXT: paddq %xmm6, %xmm1 646; SSE-NEXT: testb $64, %al 647; SSE-NEXT: je .LBB3_14 648; SSE-NEXT: # %bb.13: # %cond.load16 649; SSE-NEXT: movq %xmm1, %rcx 650; SSE-NEXT: pinsrb $6, (%rcx), %xmm5 651; SSE-NEXT: .LBB3_14: # %else17 652; SSE-NEXT: pmovsxdq %xmm2, %xmm0 653; SSE-NEXT: testb %al, %al 654; SSE-NEXT: jns .LBB3_16 655; SSE-NEXT: # %bb.15: # %cond.load19 656; SSE-NEXT: pextrq $1, %xmm1, %rcx 657; SSE-NEXT: pinsrb $7, (%rcx), %xmm5 658; SSE-NEXT: .LBB3_16: # %else20 659; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3] 660; SSE-NEXT: paddq %xmm6, %xmm0 661; SSE-NEXT: testl $256, %eax # imm = 0x100 662; SSE-NEXT: je .LBB3_18 663; SSE-NEXT: # %bb.17: # %cond.load22 664; SSE-NEXT: movq %xmm0, %rcx 665; SSE-NEXT: pinsrb $8, (%rcx), %xmm5 666; SSE-NEXT: .LBB3_18: # %else23 667; SSE-NEXT: pmovsxdq %xmm1, %xmm1 668; SSE-NEXT: testl $512, %eax # imm = 0x200 669; SSE-NEXT: je .LBB3_20 670; SSE-NEXT: # %bb.19: # %cond.load25 671; SSE-NEXT: pextrq $1, %xmm0, %rcx 672; SSE-NEXT: pinsrb $9, (%rcx), %xmm5 673; SSE-NEXT: .LBB3_20: # %else26 674; SSE-NEXT: paddq %xmm6, %xmm1 675; SSE-NEXT: testl $1024, %eax # imm = 0x400 676; SSE-NEXT: je .LBB3_22 677; SSE-NEXT: # %bb.21: # %cond.load28 678; SSE-NEXT: movq %xmm1, %rcx 679; SSE-NEXT: pinsrb $10, (%rcx), %xmm5 680; SSE-NEXT: .LBB3_22: # %else29 681; SSE-NEXT: pmovsxdq %xmm3, %xmm0 682; SSE-NEXT: testl $2048, %eax # imm = 0x800 683; SSE-NEXT: je .LBB3_24 684; SSE-NEXT: # %bb.23: # %cond.load31 685; SSE-NEXT: pextrq $1, %xmm1, %rcx 686; SSE-NEXT: pinsrb $11, (%rcx), %xmm5 687; SSE-NEXT: .LBB3_24: # %else32 688; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3] 689; SSE-NEXT: paddq %xmm6, %xmm0 690; SSE-NEXT: testl $4096, %eax # imm = 0x1000 691; SSE-NEXT: je .LBB3_26 692; SSE-NEXT: # %bb.25: # %cond.load34 693; SSE-NEXT: movq %xmm0, %rcx 694; SSE-NEXT: pinsrb $12, (%rcx), %xmm5 695; SSE-NEXT: .LBB3_26: # %else35 696; SSE-NEXT: pmovsxdq %xmm1, %xmm1 697; SSE-NEXT: testl $8192, %eax # imm = 0x2000 698; SSE-NEXT: je .LBB3_28 699; SSE-NEXT: # %bb.27: # %cond.load37 700; SSE-NEXT: pextrq $1, %xmm0, %rcx 701; SSE-NEXT: pinsrb $13, (%rcx), %xmm5 702; SSE-NEXT: .LBB3_28: # %else38 703; SSE-NEXT: paddq %xmm1, %xmm6 704; SSE-NEXT: testl $16384, %eax # imm = 0x4000 705; SSE-NEXT: jne .LBB3_29 706; SSE-NEXT: # %bb.30: # %else41 707; SSE-NEXT: testl $32768, %eax # imm = 0x8000 708; SSE-NEXT: jne .LBB3_31 709; SSE-NEXT: .LBB3_32: # %else44 710; SSE-NEXT: movdqa %xmm5, %xmm0 711; SSE-NEXT: retq 712; SSE-NEXT: .LBB3_29: # %cond.load40 713; SSE-NEXT: movq %xmm6, %rcx 714; SSE-NEXT: pinsrb $14, (%rcx), %xmm5 715; SSE-NEXT: testl $32768, %eax # imm = 0x8000 716; SSE-NEXT: je .LBB3_32 717; SSE-NEXT: .LBB3_31: # %cond.load43 718; SSE-NEXT: pextrq $1, %xmm6, %rax 719; SSE-NEXT: pinsrb $15, (%rax), %xmm5 720; SSE-NEXT: movdqa %xmm5, %xmm0 721; SSE-NEXT: retq 722; 723; AVX1-LABEL: gather_v16i8_v16i32_v16i8: 724; AVX1: # %bb.0: 725; AVX1-NEXT: vmovq %rdi, %xmm4 726; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[0,1,0,1] 727; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 728; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm0[2,3,2,3] 729; AVX1-NEXT: vpmovsxdq %xmm6, %xmm6 730; AVX1-NEXT: vpaddq %xmm6, %xmm4, %xmm6 731; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0 732; AVX1-NEXT: vpaddq %xmm0, %xmm4, %xmm0 733; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm0, %ymm0 734; AVX1-NEXT: vpxor %xmm6, %xmm6, %xmm6 735; AVX1-NEXT: vpcmpeqb %xmm6, %xmm2, %xmm2 736; AVX1-NEXT: vpmovmskb %xmm2, %eax 737; AVX1-NEXT: testb $1, %al 738; AVX1-NEXT: je .LBB3_2 739; AVX1-NEXT: # %bb.1: # %cond.load 740; AVX1-NEXT: vmovq %xmm0, %rcx 741; AVX1-NEXT: vpinsrb $0, (%rcx), %xmm3, %xmm3 742; AVX1-NEXT: .LBB3_2: # %else 743; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm5[2,3,2,3] 744; AVX1-NEXT: vpmovsxdq %xmm5, %xmm6 745; AVX1-NEXT: testb $2, %al 746; AVX1-NEXT: je .LBB3_4 747; AVX1-NEXT: # %bb.3: # %cond.load1 748; AVX1-NEXT: vpextrq $1, %xmm0, %rcx 749; AVX1-NEXT: vpinsrb $1, (%rcx), %xmm3, %xmm3 750; AVX1-NEXT: .LBB3_4: # %else2 751; AVX1-NEXT: vpmovsxdq %xmm2, %xmm5 752; AVX1-NEXT: vpaddq %xmm6, %xmm4, %xmm2 753; AVX1-NEXT: testb $4, %al 754; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 755; AVX1-NEXT: je .LBB3_6 756; AVX1-NEXT: # %bb.5: # %cond.load4 757; AVX1-NEXT: vmovq %xmm0, %rcx 758; AVX1-NEXT: vpinsrb $2, (%rcx), %xmm3, %xmm3 759; AVX1-NEXT: .LBB3_6: # %else5 760; AVX1-NEXT: vpaddq %xmm5, %xmm4, %xmm5 761; AVX1-NEXT: testb $8, %al 762; AVX1-NEXT: je .LBB3_8 763; AVX1-NEXT: # %bb.7: # %cond.load7 764; AVX1-NEXT: vpextrq $1, %xmm0, %rcx 765; AVX1-NEXT: vpinsrb $3, (%rcx), %xmm3, %xmm3 766; AVX1-NEXT: .LBB3_8: # %else8 767; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm2, %ymm0 768; AVX1-NEXT: testb $16, %al 769; AVX1-NEXT: je .LBB3_10 770; AVX1-NEXT: # %bb.9: # %cond.load10 771; AVX1-NEXT: vmovq %xmm0, %rcx 772; AVX1-NEXT: vpinsrb $4, (%rcx), %xmm3, %xmm3 773; AVX1-NEXT: .LBB3_10: # %else11 774; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[2,3,2,3] 775; AVX1-NEXT: vpmovsxdq %xmm1, %xmm6 776; AVX1-NEXT: testb $32, %al 777; AVX1-NEXT: je .LBB3_12 778; AVX1-NEXT: # %bb.11: # %cond.load13 779; AVX1-NEXT: vpextrq $1, %xmm0, %rcx 780; AVX1-NEXT: vpinsrb $5, (%rcx), %xmm3, %xmm3 781; AVX1-NEXT: .LBB3_12: # %else14 782; AVX1-NEXT: vpmovsxdq %xmm2, %xmm5 783; AVX1-NEXT: vpaddq %xmm6, %xmm4, %xmm2 784; AVX1-NEXT: testb $64, %al 785; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 786; AVX1-NEXT: je .LBB3_14 787; AVX1-NEXT: # %bb.13: # %cond.load16 788; AVX1-NEXT: vmovq %xmm0, %rcx 789; AVX1-NEXT: vpinsrb $6, (%rcx), %xmm3, %xmm3 790; AVX1-NEXT: .LBB3_14: # %else17 791; AVX1-NEXT: vpaddq %xmm5, %xmm4, %xmm5 792; AVX1-NEXT: testb %al, %al 793; AVX1-NEXT: jns .LBB3_16 794; AVX1-NEXT: # %bb.15: # %cond.load19 795; AVX1-NEXT: vpextrq $1, %xmm0, %rcx 796; AVX1-NEXT: vpinsrb $7, (%rcx), %xmm3, %xmm3 797; AVX1-NEXT: .LBB3_16: # %else20 798; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 799; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm2, %ymm0 800; AVX1-NEXT: testl $256, %eax # imm = 0x100 801; AVX1-NEXT: je .LBB3_18 802; AVX1-NEXT: # %bb.17: # %cond.load22 803; AVX1-NEXT: vmovq %xmm0, %rcx 804; AVX1-NEXT: vpinsrb $8, (%rcx), %xmm3, %xmm3 805; AVX1-NEXT: .LBB3_18: # %else23 806; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[2,3,2,3] 807; AVX1-NEXT: vpmovsxdq %xmm1, %xmm1 808; AVX1-NEXT: testl $512, %eax # imm = 0x200 809; AVX1-NEXT: je .LBB3_20 810; AVX1-NEXT: # %bb.19: # %cond.load25 811; AVX1-NEXT: vpextrq $1, %xmm0, %rcx 812; AVX1-NEXT: vpinsrb $9, (%rcx), %xmm3, %xmm3 813; AVX1-NEXT: .LBB3_20: # %else26 814; AVX1-NEXT: vpmovsxdq %xmm2, %xmm2 815; AVX1-NEXT: vpaddq %xmm1, %xmm4, %xmm1 816; AVX1-NEXT: testl $1024, %eax # imm = 0x400 817; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 818; AVX1-NEXT: je .LBB3_22 819; AVX1-NEXT: # %bb.21: # %cond.load28 820; AVX1-NEXT: vmovq %xmm0, %rcx 821; AVX1-NEXT: vpinsrb $10, (%rcx), %xmm3, %xmm3 822; AVX1-NEXT: .LBB3_22: # %else29 823; AVX1-NEXT: vpaddq %xmm2, %xmm4, %xmm2 824; AVX1-NEXT: testl $2048, %eax # imm = 0x800 825; AVX1-NEXT: je .LBB3_24 826; AVX1-NEXT: # %bb.23: # %cond.load31 827; AVX1-NEXT: vpextrq $1, %xmm0, %rcx 828; AVX1-NEXT: vpinsrb $11, (%rcx), %xmm3, %xmm3 829; AVX1-NEXT: .LBB3_24: # %else32 830; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm0 831; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 832; AVX1-NEXT: je .LBB3_26 833; AVX1-NEXT: # %bb.25: # %cond.load34 834; AVX1-NEXT: vmovq %xmm0, %rcx 835; AVX1-NEXT: vpinsrb $12, (%rcx), %xmm3, %xmm3 836; AVX1-NEXT: .LBB3_26: # %else35 837; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 838; AVX1-NEXT: je .LBB3_28 839; AVX1-NEXT: # %bb.27: # %cond.load37 840; AVX1-NEXT: vpextrq $1, %xmm0, %rcx 841; AVX1-NEXT: vpinsrb $13, (%rcx), %xmm3, %xmm3 842; AVX1-NEXT: .LBB3_28: # %else38 843; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 844; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 845; AVX1-NEXT: jne .LBB3_29 846; AVX1-NEXT: # %bb.30: # %else41 847; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 848; AVX1-NEXT: jne .LBB3_31 849; AVX1-NEXT: .LBB3_32: # %else44 850; AVX1-NEXT: vmovdqa %xmm3, %xmm0 851; AVX1-NEXT: vzeroupper 852; AVX1-NEXT: retq 853; AVX1-NEXT: .LBB3_29: # %cond.load40 854; AVX1-NEXT: vmovq %xmm0, %rcx 855; AVX1-NEXT: vpinsrb $14, (%rcx), %xmm3, %xmm3 856; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 857; AVX1-NEXT: je .LBB3_32 858; AVX1-NEXT: .LBB3_31: # %cond.load43 859; AVX1-NEXT: vpextrq $1, %xmm0, %rax 860; AVX1-NEXT: vpinsrb $15, (%rax), %xmm3, %xmm3 861; AVX1-NEXT: vmovdqa %xmm3, %xmm0 862; AVX1-NEXT: vzeroupper 863; AVX1-NEXT: retq 864; 865; AVX2-LABEL: gather_v16i8_v16i32_v16i8: 866; AVX2: # %bb.0: 867; AVX2-NEXT: vmovq %rdi, %xmm4 868; AVX2-NEXT: vpbroadcastq %xmm4, %ymm4 869; AVX2-NEXT: vpmovsxdq %xmm0, %ymm5 870; AVX2-NEXT: vpaddq %ymm5, %ymm4, %ymm5 871; AVX2-NEXT: vpxor %xmm6, %xmm6, %xmm6 872; AVX2-NEXT: vpcmpeqb %xmm6, %xmm2, %xmm2 873; AVX2-NEXT: vpmovmskb %xmm2, %eax 874; AVX2-NEXT: testb $1, %al 875; AVX2-NEXT: je .LBB3_2 876; AVX2-NEXT: # %bb.1: # %cond.load 877; AVX2-NEXT: vmovq %xmm5, %rcx 878; AVX2-NEXT: vpinsrb $0, (%rcx), %xmm3, %xmm3 879; AVX2-NEXT: .LBB3_2: # %else 880; AVX2-NEXT: testb $2, %al 881; AVX2-NEXT: je .LBB3_4 882; AVX2-NEXT: # %bb.3: # %cond.load1 883; AVX2-NEXT: vpextrq $1, %xmm5, %rcx 884; AVX2-NEXT: vpinsrb $1, (%rcx), %xmm3, %xmm3 885; AVX2-NEXT: .LBB3_4: # %else2 886; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 887; AVX2-NEXT: testb $4, %al 888; AVX2-NEXT: vextracti128 $1, %ymm5, %xmm0 889; AVX2-NEXT: je .LBB3_6 890; AVX2-NEXT: # %bb.5: # %cond.load4 891; AVX2-NEXT: vmovq %xmm0, %rcx 892; AVX2-NEXT: vpinsrb $2, (%rcx), %xmm3, %xmm3 893; AVX2-NEXT: .LBB3_6: # %else5 894; AVX2-NEXT: vpmovsxdq %xmm2, %ymm2 895; AVX2-NEXT: testb $8, %al 896; AVX2-NEXT: je .LBB3_8 897; AVX2-NEXT: # %bb.7: # %cond.load7 898; AVX2-NEXT: vpextrq $1, %xmm0, %rcx 899; AVX2-NEXT: vpinsrb $3, (%rcx), %xmm3, %xmm3 900; AVX2-NEXT: .LBB3_8: # %else8 901; AVX2-NEXT: vpaddq %ymm2, %ymm4, %ymm0 902; AVX2-NEXT: testb $16, %al 903; AVX2-NEXT: je .LBB3_10 904; AVX2-NEXT: # %bb.9: # %cond.load10 905; AVX2-NEXT: vmovq %xmm0, %rcx 906; AVX2-NEXT: vpinsrb $4, (%rcx), %xmm3, %xmm3 907; AVX2-NEXT: .LBB3_10: # %else11 908; AVX2-NEXT: testb $32, %al 909; AVX2-NEXT: je .LBB3_12 910; AVX2-NEXT: # %bb.11: # %cond.load13 911; AVX2-NEXT: vpextrq $1, %xmm0, %rcx 912; AVX2-NEXT: vpinsrb $5, (%rcx), %xmm3, %xmm3 913; AVX2-NEXT: .LBB3_12: # %else14 914; AVX2-NEXT: testb $64, %al 915; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 916; AVX2-NEXT: je .LBB3_14 917; AVX2-NEXT: # %bb.13: # %cond.load16 918; AVX2-NEXT: vmovq %xmm0, %rcx 919; AVX2-NEXT: vpinsrb $6, (%rcx), %xmm3, %xmm3 920; AVX2-NEXT: .LBB3_14: # %else17 921; AVX2-NEXT: vpmovsxdq %xmm1, %ymm2 922; AVX2-NEXT: testb %al, %al 923; AVX2-NEXT: jns .LBB3_16 924; AVX2-NEXT: # %bb.15: # %cond.load19 925; AVX2-NEXT: vpextrq $1, %xmm0, %rcx 926; AVX2-NEXT: vpinsrb $7, (%rcx), %xmm3, %xmm3 927; AVX2-NEXT: .LBB3_16: # %else20 928; AVX2-NEXT: vpaddq %ymm2, %ymm4, %ymm0 929; AVX2-NEXT: testl $256, %eax # imm = 0x100 930; AVX2-NEXT: je .LBB3_18 931; AVX2-NEXT: # %bb.17: # %cond.load22 932; AVX2-NEXT: vmovq %xmm0, %rcx 933; AVX2-NEXT: vpinsrb $8, (%rcx), %xmm3, %xmm3 934; AVX2-NEXT: .LBB3_18: # %else23 935; AVX2-NEXT: testl $512, %eax # imm = 0x200 936; AVX2-NEXT: je .LBB3_20 937; AVX2-NEXT: # %bb.19: # %cond.load25 938; AVX2-NEXT: vpextrq $1, %xmm0, %rcx 939; AVX2-NEXT: vpinsrb $9, (%rcx), %xmm3, %xmm3 940; AVX2-NEXT: .LBB3_20: # %else26 941; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 942; AVX2-NEXT: testl $1024, %eax # imm = 0x400 943; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 944; AVX2-NEXT: je .LBB3_22 945; AVX2-NEXT: # %bb.21: # %cond.load28 946; AVX2-NEXT: vmovq %xmm0, %rcx 947; AVX2-NEXT: vpinsrb $10, (%rcx), %xmm3, %xmm3 948; AVX2-NEXT: .LBB3_22: # %else29 949; AVX2-NEXT: vpmovsxdq %xmm1, %ymm1 950; AVX2-NEXT: testl $2048, %eax # imm = 0x800 951; AVX2-NEXT: je .LBB3_24 952; AVX2-NEXT: # %bb.23: # %cond.load31 953; AVX2-NEXT: vpextrq $1, %xmm0, %rcx 954; AVX2-NEXT: vpinsrb $11, (%rcx), %xmm3, %xmm3 955; AVX2-NEXT: .LBB3_24: # %else32 956; AVX2-NEXT: vpaddq %ymm1, %ymm4, %ymm0 957; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 958; AVX2-NEXT: je .LBB3_26 959; AVX2-NEXT: # %bb.25: # %cond.load34 960; AVX2-NEXT: vmovq %xmm0, %rcx 961; AVX2-NEXT: vpinsrb $12, (%rcx), %xmm3, %xmm3 962; AVX2-NEXT: .LBB3_26: # %else35 963; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 964; AVX2-NEXT: je .LBB3_28 965; AVX2-NEXT: # %bb.27: # %cond.load37 966; AVX2-NEXT: vpextrq $1, %xmm0, %rcx 967; AVX2-NEXT: vpinsrb $13, (%rcx), %xmm3, %xmm3 968; AVX2-NEXT: .LBB3_28: # %else38 969; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 970; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 971; AVX2-NEXT: jne .LBB3_29 972; AVX2-NEXT: # %bb.30: # %else41 973; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 974; AVX2-NEXT: jne .LBB3_31 975; AVX2-NEXT: .LBB3_32: # %else44 976; AVX2-NEXT: vmovdqa %xmm3, %xmm0 977; AVX2-NEXT: vzeroupper 978; AVX2-NEXT: retq 979; AVX2-NEXT: .LBB3_29: # %cond.load40 980; AVX2-NEXT: vmovq %xmm0, %rcx 981; AVX2-NEXT: vpinsrb $14, (%rcx), %xmm3, %xmm3 982; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 983; AVX2-NEXT: je .LBB3_32 984; AVX2-NEXT: .LBB3_31: # %cond.load43 985; AVX2-NEXT: vpextrq $1, %xmm0, %rax 986; AVX2-NEXT: vpinsrb $15, (%rax), %xmm3, %xmm3 987; AVX2-NEXT: vmovdqa %xmm3, %xmm0 988; AVX2-NEXT: vzeroupper 989; AVX2-NEXT: retq 990; 991; AVX512-LABEL: gather_v16i8_v16i32_v16i8: 992; AVX512: # %bb.0: 993; AVX512-NEXT: vpbroadcastq %rdi, %zmm3 994; AVX512-NEXT: vpmovsxdq %ymm0, %zmm4 995; AVX512-NEXT: vpaddq %zmm4, %zmm3, %zmm4 996; AVX512-NEXT: vpxor %xmm5, %xmm5, %xmm5 997; AVX512-NEXT: vpcmpeqb %xmm5, %xmm1, %xmm1 998; AVX512-NEXT: vpmovmskb %xmm1, %eax 999; AVX512-NEXT: testb $1, %al 1000; AVX512-NEXT: jne .LBB3_1 1001; AVX512-NEXT: # %bb.2: # %else 1002; AVX512-NEXT: testb $2, %al 1003; AVX512-NEXT: jne .LBB3_3 1004; AVX512-NEXT: .LBB3_4: # %else2 1005; AVX512-NEXT: testb $4, %al 1006; AVX512-NEXT: jne .LBB3_5 1007; AVX512-NEXT: .LBB3_6: # %else5 1008; AVX512-NEXT: testb $8, %al 1009; AVX512-NEXT: je .LBB3_8 1010; AVX512-NEXT: .LBB3_7: # %cond.load7 1011; AVX512-NEXT: vextracti128 $1, %ymm4, %xmm1 1012; AVX512-NEXT: vpextrq $1, %xmm1, %rcx 1013; AVX512-NEXT: vpinsrb $3, (%rcx), %xmm2, %xmm2 1014; AVX512-NEXT: .LBB3_8: # %else8 1015; AVX512-NEXT: testb $16, %al 1016; AVX512-NEXT: vextracti32x4 $2, %zmm4, %xmm1 1017; AVX512-NEXT: je .LBB3_10 1018; AVX512-NEXT: # %bb.9: # %cond.load10 1019; AVX512-NEXT: vmovq %xmm1, %rcx 1020; AVX512-NEXT: vpinsrb $4, (%rcx), %xmm2, %xmm2 1021; AVX512-NEXT: .LBB3_10: # %else11 1022; AVX512-NEXT: testb $32, %al 1023; AVX512-NEXT: je .LBB3_12 1024; AVX512-NEXT: # %bb.11: # %cond.load13 1025; AVX512-NEXT: vpextrq $1, %xmm1, %rcx 1026; AVX512-NEXT: vpinsrb $5, (%rcx), %xmm2, %xmm2 1027; AVX512-NEXT: .LBB3_12: # %else14 1028; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1029; AVX512-NEXT: testb $64, %al 1030; AVX512-NEXT: vextracti32x4 $3, %zmm4, %xmm0 1031; AVX512-NEXT: je .LBB3_14 1032; AVX512-NEXT: # %bb.13: # %cond.load16 1033; AVX512-NEXT: vmovq %xmm0, %rcx 1034; AVX512-NEXT: vpinsrb $6, (%rcx), %xmm2, %xmm2 1035; AVX512-NEXT: .LBB3_14: # %else17 1036; AVX512-NEXT: vpmovsxdq %ymm1, %zmm1 1037; AVX512-NEXT: testb %al, %al 1038; AVX512-NEXT: jns .LBB3_16 1039; AVX512-NEXT: # %bb.15: # %cond.load19 1040; AVX512-NEXT: vpextrq $1, %xmm0, %rcx 1041; AVX512-NEXT: vpinsrb $7, (%rcx), %xmm2, %xmm2 1042; AVX512-NEXT: .LBB3_16: # %else20 1043; AVX512-NEXT: vpaddq %zmm1, %zmm3, %zmm0 1044; AVX512-NEXT: testl $256, %eax # imm = 0x100 1045; AVX512-NEXT: jne .LBB3_17 1046; AVX512-NEXT: # %bb.18: # %else23 1047; AVX512-NEXT: testl $512, %eax # imm = 0x200 1048; AVX512-NEXT: jne .LBB3_19 1049; AVX512-NEXT: .LBB3_20: # %else26 1050; AVX512-NEXT: testl $1024, %eax # imm = 0x400 1051; AVX512-NEXT: jne .LBB3_21 1052; AVX512-NEXT: .LBB3_22: # %else29 1053; AVX512-NEXT: testl $2048, %eax # imm = 0x800 1054; AVX512-NEXT: je .LBB3_24 1055; AVX512-NEXT: .LBB3_23: # %cond.load31 1056; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 1057; AVX512-NEXT: vpextrq $1, %xmm1, %rcx 1058; AVX512-NEXT: vpinsrb $11, (%rcx), %xmm2, %xmm2 1059; AVX512-NEXT: .LBB3_24: # %else32 1060; AVX512-NEXT: testl $4096, %eax # imm = 0x1000 1061; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm1 1062; AVX512-NEXT: je .LBB3_26 1063; AVX512-NEXT: # %bb.25: # %cond.load34 1064; AVX512-NEXT: vmovq %xmm1, %rcx 1065; AVX512-NEXT: vpinsrb $12, (%rcx), %xmm2, %xmm2 1066; AVX512-NEXT: .LBB3_26: # %else35 1067; AVX512-NEXT: testl $8192, %eax # imm = 0x2000 1068; AVX512-NEXT: je .LBB3_28 1069; AVX512-NEXT: # %bb.27: # %cond.load37 1070; AVX512-NEXT: vpextrq $1, %xmm1, %rcx 1071; AVX512-NEXT: vpinsrb $13, (%rcx), %xmm2, %xmm2 1072; AVX512-NEXT: .LBB3_28: # %else38 1073; AVX512-NEXT: testl $16384, %eax # imm = 0x4000 1074; AVX512-NEXT: vextracti32x4 $3, %zmm0, %xmm0 1075; AVX512-NEXT: jne .LBB3_29 1076; AVX512-NEXT: # %bb.30: # %else41 1077; AVX512-NEXT: testl $32768, %eax # imm = 0x8000 1078; AVX512-NEXT: jne .LBB3_31 1079; AVX512-NEXT: .LBB3_32: # %else44 1080; AVX512-NEXT: vmovdqa %xmm2, %xmm0 1081; AVX512-NEXT: vzeroupper 1082; AVX512-NEXT: retq 1083; AVX512-NEXT: .LBB3_1: # %cond.load 1084; AVX512-NEXT: vmovq %xmm4, %rcx 1085; AVX512-NEXT: vpinsrb $0, (%rcx), %xmm2, %xmm2 1086; AVX512-NEXT: testb $2, %al 1087; AVX512-NEXT: je .LBB3_4 1088; AVX512-NEXT: .LBB3_3: # %cond.load1 1089; AVX512-NEXT: vpextrq $1, %xmm4, %rcx 1090; AVX512-NEXT: vpinsrb $1, (%rcx), %xmm2, %xmm2 1091; AVX512-NEXT: testb $4, %al 1092; AVX512-NEXT: je .LBB3_6 1093; AVX512-NEXT: .LBB3_5: # %cond.load4 1094; AVX512-NEXT: vextracti128 $1, %ymm4, %xmm1 1095; AVX512-NEXT: vmovq %xmm1, %rcx 1096; AVX512-NEXT: vpinsrb $2, (%rcx), %xmm2, %xmm2 1097; AVX512-NEXT: testb $8, %al 1098; AVX512-NEXT: jne .LBB3_7 1099; AVX512-NEXT: jmp .LBB3_8 1100; AVX512-NEXT: .LBB3_17: # %cond.load22 1101; AVX512-NEXT: vmovq %xmm0, %rcx 1102; AVX512-NEXT: vpinsrb $8, (%rcx), %xmm2, %xmm2 1103; AVX512-NEXT: testl $512, %eax # imm = 0x200 1104; AVX512-NEXT: je .LBB3_20 1105; AVX512-NEXT: .LBB3_19: # %cond.load25 1106; AVX512-NEXT: vpextrq $1, %xmm0, %rcx 1107; AVX512-NEXT: vpinsrb $9, (%rcx), %xmm2, %xmm2 1108; AVX512-NEXT: testl $1024, %eax # imm = 0x400 1109; AVX512-NEXT: je .LBB3_22 1110; AVX512-NEXT: .LBB3_21: # %cond.load28 1111; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 1112; AVX512-NEXT: vmovq %xmm1, %rcx 1113; AVX512-NEXT: vpinsrb $10, (%rcx), %xmm2, %xmm2 1114; AVX512-NEXT: testl $2048, %eax # imm = 0x800 1115; AVX512-NEXT: jne .LBB3_23 1116; AVX512-NEXT: jmp .LBB3_24 1117; AVX512-NEXT: .LBB3_29: # %cond.load40 1118; AVX512-NEXT: vmovq %xmm0, %rcx 1119; AVX512-NEXT: vpinsrb $14, (%rcx), %xmm2, %xmm2 1120; AVX512-NEXT: testl $32768, %eax # imm = 0x8000 1121; AVX512-NEXT: je .LBB3_32 1122; AVX512-NEXT: .LBB3_31: # %cond.load43 1123; AVX512-NEXT: vpextrq $1, %xmm0, %rax 1124; AVX512-NEXT: vpinsrb $15, (%rax), %xmm2, %xmm2 1125; AVX512-NEXT: vmovdqa %xmm2, %xmm0 1126; AVX512-NEXT: vzeroupper 1127; AVX512-NEXT: retq 1128 %vptr0 = insertelement <16 x ptr> undef, ptr %base, i32 0 1129 %vptr1 = shufflevector <16 x ptr> %vptr0, <16 x ptr> undef, <16 x i32> zeroinitializer 1130 %vptr2 = getelementptr i8, <16 x ptr> %vptr1, <16 x i32> %idx 1131 1132 %mask = icmp eq <16 x i8> %trigger, zeroinitializer 1133 %res = call <16 x i8> @llvm.masked.gather.v16i8.v16p0(<16 x ptr> %vptr2, i32 4, <16 x i1> %mask, <16 x i8> %passthru) 1134 ret <16 x i8> %res 1135} 1136 1137define <8 x i32> @gather_v8i32_v8i32(<8 x i32> %trigger) { 1138; SSE-LABEL: gather_v8i32_v8i32: 1139; SSE: # %bb.0: 1140; SSE-NEXT: movdqa %xmm1, %xmm3 1141; SSE-NEXT: movdqa %xmm0, %xmm2 1142; SSE-NEXT: pxor %xmm0, %xmm0 1143; SSE-NEXT: pcmpeqd %xmm0, %xmm1 1144; SSE-NEXT: pcmpeqd %xmm2, %xmm0 1145; SSE-NEXT: packssdw %xmm1, %xmm0 1146; SSE-NEXT: packsswb %xmm0, %xmm0 1147; SSE-NEXT: pmovmskb %xmm0, %eax 1148; SSE-NEXT: testb $1, %al 1149; SSE-NEXT: je .LBB4_1 1150; SSE-NEXT: # %bb.2: # %cond.load 1151; SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 1152; SSE-NEXT: testb $2, %al 1153; SSE-NEXT: jne .LBB4_4 1154; SSE-NEXT: jmp .LBB4_5 1155; SSE-NEXT: .LBB4_1: 1156; SSE-NEXT: # implicit-def: $xmm0 1157; SSE-NEXT: testb $2, %al 1158; SSE-NEXT: je .LBB4_5 1159; SSE-NEXT: .LBB4_4: # %cond.load1 1160; SSE-NEXT: pinsrd $1, c+12(%rip), %xmm0 1161; SSE-NEXT: .LBB4_5: # %else2 1162; SSE-NEXT: testb $4, %al 1163; SSE-NEXT: jne .LBB4_6 1164; SSE-NEXT: # %bb.7: # %else5 1165; SSE-NEXT: testb $8, %al 1166; SSE-NEXT: jne .LBB4_8 1167; SSE-NEXT: .LBB4_9: # %else8 1168; SSE-NEXT: testb $16, %al 1169; SSE-NEXT: je .LBB4_10 1170; SSE-NEXT: .LBB4_11: # %cond.load10 1171; SSE-NEXT: pinsrd $0, c+12(%rip), %xmm1 1172; SSE-NEXT: testb $32, %al 1173; SSE-NEXT: jne .LBB4_13 1174; SSE-NEXT: jmp .LBB4_14 1175; SSE-NEXT: .LBB4_6: # %cond.load4 1176; SSE-NEXT: pinsrd $2, c+12(%rip), %xmm0 1177; SSE-NEXT: testb $8, %al 1178; SSE-NEXT: je .LBB4_9 1179; SSE-NEXT: .LBB4_8: # %cond.load7 1180; SSE-NEXT: pinsrd $3, c+12(%rip), %xmm0 1181; SSE-NEXT: testb $16, %al 1182; SSE-NEXT: jne .LBB4_11 1183; SSE-NEXT: .LBB4_10: 1184; SSE-NEXT: # implicit-def: $xmm1 1185; SSE-NEXT: testb $32, %al 1186; SSE-NEXT: je .LBB4_14 1187; SSE-NEXT: .LBB4_13: # %cond.load13 1188; SSE-NEXT: pinsrd $1, c+12(%rip), %xmm1 1189; SSE-NEXT: .LBB4_14: # %else14 1190; SSE-NEXT: testb $64, %al 1191; SSE-NEXT: jne .LBB4_15 1192; SSE-NEXT: # %bb.16: # %else17 1193; SSE-NEXT: testb $-128, %al 1194; SSE-NEXT: je .LBB4_18 1195; SSE-NEXT: .LBB4_17: # %cond.load19 1196; SSE-NEXT: pinsrd $3, c+12(%rip), %xmm1 1197; SSE-NEXT: .LBB4_18: # %else20 1198; SSE-NEXT: pxor %xmm4, %xmm4 1199; SSE-NEXT: movdqa %xmm2, %xmm5 1200; SSE-NEXT: pcmpeqd %xmm4, %xmm5 1201; SSE-NEXT: pcmpeqd %xmm3, %xmm4 1202; SSE-NEXT: packssdw %xmm4, %xmm5 1203; SSE-NEXT: packsswb %xmm5, %xmm5 1204; SSE-NEXT: pmovmskb %xmm5, %eax 1205; SSE-NEXT: testb $1, %al 1206; SSE-NEXT: je .LBB4_19 1207; SSE-NEXT: # %bb.20: # %cond.load23 1208; SSE-NEXT: movd {{.*#+}} xmm4 = mem[0],zero,zero,zero 1209; SSE-NEXT: testb $2, %al 1210; SSE-NEXT: jne .LBB4_22 1211; SSE-NEXT: jmp .LBB4_23 1212; SSE-NEXT: .LBB4_15: # %cond.load16 1213; SSE-NEXT: pinsrd $2, c+12(%rip), %xmm1 1214; SSE-NEXT: testb $-128, %al 1215; SSE-NEXT: jne .LBB4_17 1216; SSE-NEXT: jmp .LBB4_18 1217; SSE-NEXT: .LBB4_19: 1218; SSE-NEXT: # implicit-def: $xmm4 1219; SSE-NEXT: testb $2, %al 1220; SSE-NEXT: je .LBB4_23 1221; SSE-NEXT: .LBB4_22: # %cond.load28 1222; SSE-NEXT: pinsrd $1, c+28(%rip), %xmm4 1223; SSE-NEXT: .LBB4_23: # %else31 1224; SSE-NEXT: testb $4, %al 1225; SSE-NEXT: jne .LBB4_24 1226; SSE-NEXT: # %bb.25: # %else36 1227; SSE-NEXT: testb $8, %al 1228; SSE-NEXT: jne .LBB4_26 1229; SSE-NEXT: .LBB4_27: # %else41 1230; SSE-NEXT: testb $16, %al 1231; SSE-NEXT: je .LBB4_28 1232; SSE-NEXT: .LBB4_29: # %cond.load43 1233; SSE-NEXT: pinsrd $0, c+28(%rip), %xmm5 1234; SSE-NEXT: testb $32, %al 1235; SSE-NEXT: jne .LBB4_31 1236; SSE-NEXT: jmp .LBB4_32 1237; SSE-NEXT: .LBB4_24: # %cond.load33 1238; SSE-NEXT: pinsrd $2, c+28(%rip), %xmm4 1239; SSE-NEXT: testb $8, %al 1240; SSE-NEXT: je .LBB4_27 1241; SSE-NEXT: .LBB4_26: # %cond.load38 1242; SSE-NEXT: pinsrd $3, c+28(%rip), %xmm4 1243; SSE-NEXT: testb $16, %al 1244; SSE-NEXT: jne .LBB4_29 1245; SSE-NEXT: .LBB4_28: 1246; SSE-NEXT: # implicit-def: $xmm5 1247; SSE-NEXT: testb $32, %al 1248; SSE-NEXT: je .LBB4_32 1249; SSE-NEXT: .LBB4_31: # %cond.load48 1250; SSE-NEXT: pinsrd $1, c+28(%rip), %xmm5 1251; SSE-NEXT: .LBB4_32: # %else51 1252; SSE-NEXT: testb $64, %al 1253; SSE-NEXT: jne .LBB4_33 1254; SSE-NEXT: # %bb.34: # %else56 1255; SSE-NEXT: testb $-128, %al 1256; SSE-NEXT: je .LBB4_36 1257; SSE-NEXT: .LBB4_35: # %cond.load58 1258; SSE-NEXT: pinsrd $3, c+28(%rip), %xmm5 1259; SSE-NEXT: .LBB4_36: # %else61 1260; SSE-NEXT: pxor %xmm6, %xmm6 1261; SSE-NEXT: pcmpeqd %xmm6, %xmm2 1262; SSE-NEXT: pcmpeqd %xmm6, %xmm3 1263; SSE-NEXT: packssdw %xmm3, %xmm2 1264; SSE-NEXT: packsswb %xmm2, %xmm2 1265; SSE-NEXT: pmovmskb %xmm2, %eax 1266; SSE-NEXT: testb $1, %al 1267; SSE-NEXT: je .LBB4_37 1268; SSE-NEXT: # %bb.38: # %cond.load64 1269; SSE-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero 1270; SSE-NEXT: testb $2, %al 1271; SSE-NEXT: jne .LBB4_40 1272; SSE-NEXT: jmp .LBB4_41 1273; SSE-NEXT: .LBB4_33: # %cond.load53 1274; SSE-NEXT: pinsrd $2, c+28(%rip), %xmm5 1275; SSE-NEXT: testb $-128, %al 1276; SSE-NEXT: jne .LBB4_35 1277; SSE-NEXT: jmp .LBB4_36 1278; SSE-NEXT: .LBB4_37: 1279; SSE-NEXT: # implicit-def: $xmm2 1280; SSE-NEXT: testb $2, %al 1281; SSE-NEXT: je .LBB4_41 1282; SSE-NEXT: .LBB4_40: # %cond.load69 1283; SSE-NEXT: pinsrd $1, c+28(%rip), %xmm2 1284; SSE-NEXT: .LBB4_41: # %else72 1285; SSE-NEXT: testb $4, %al 1286; SSE-NEXT: jne .LBB4_42 1287; SSE-NEXT: # %bb.43: # %else77 1288; SSE-NEXT: testb $8, %al 1289; SSE-NEXT: jne .LBB4_44 1290; SSE-NEXT: .LBB4_45: # %else82 1291; SSE-NEXT: testb $16, %al 1292; SSE-NEXT: je .LBB4_46 1293; SSE-NEXT: .LBB4_47: # %cond.load84 1294; SSE-NEXT: pinsrd $0, c+28(%rip), %xmm3 1295; SSE-NEXT: testb $32, %al 1296; SSE-NEXT: jne .LBB4_49 1297; SSE-NEXT: jmp .LBB4_50 1298; SSE-NEXT: .LBB4_42: # %cond.load74 1299; SSE-NEXT: pinsrd $2, c+28(%rip), %xmm2 1300; SSE-NEXT: testb $8, %al 1301; SSE-NEXT: je .LBB4_45 1302; SSE-NEXT: .LBB4_44: # %cond.load79 1303; SSE-NEXT: pinsrd $3, c+28(%rip), %xmm2 1304; SSE-NEXT: testb $16, %al 1305; SSE-NEXT: jne .LBB4_47 1306; SSE-NEXT: .LBB4_46: 1307; SSE-NEXT: # implicit-def: $xmm3 1308; SSE-NEXT: testb $32, %al 1309; SSE-NEXT: je .LBB4_50 1310; SSE-NEXT: .LBB4_49: # %cond.load89 1311; SSE-NEXT: pinsrd $1, c+28(%rip), %xmm3 1312; SSE-NEXT: .LBB4_50: # %else92 1313; SSE-NEXT: testb $64, %al 1314; SSE-NEXT: je .LBB4_52 1315; SSE-NEXT: # %bb.51: # %cond.load94 1316; SSE-NEXT: pinsrd $2, c+28(%rip), %xmm3 1317; SSE-NEXT: .LBB4_52: # %else97 1318; SSE-NEXT: paddd %xmm4, %xmm0 1319; SSE-NEXT: paddd %xmm5, %xmm1 1320; SSE-NEXT: testb $-128, %al 1321; SSE-NEXT: je .LBB4_54 1322; SSE-NEXT: # %bb.53: # %cond.load99 1323; SSE-NEXT: pinsrd $3, c+28(%rip), %xmm3 1324; SSE-NEXT: .LBB4_54: # %else102 1325; SSE-NEXT: paddd %xmm3, %xmm1 1326; SSE-NEXT: paddd %xmm2, %xmm0 1327; SSE-NEXT: retq 1328; 1329; AVX1-LABEL: gather_v8i32_v8i32: 1330; AVX1: # %bb.0: 1331; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1332; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 1333; AVX1-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm3 1334; AVX1-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm1 1335; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 1336; AVX1-NEXT: vmovmskps %ymm1, %eax 1337; AVX1-NEXT: testb $1, %al 1338; AVX1-NEXT: # implicit-def: $ymm1 1339; AVX1-NEXT: jne .LBB4_1 1340; AVX1-NEXT: # %bb.2: # %else 1341; AVX1-NEXT: testb $2, %al 1342; AVX1-NEXT: jne .LBB4_3 1343; AVX1-NEXT: .LBB4_4: # %else2 1344; AVX1-NEXT: testb $4, %al 1345; AVX1-NEXT: jne .LBB4_5 1346; AVX1-NEXT: .LBB4_6: # %else5 1347; AVX1-NEXT: testb $8, %al 1348; AVX1-NEXT: jne .LBB4_7 1349; AVX1-NEXT: .LBB4_8: # %else8 1350; AVX1-NEXT: testb $16, %al 1351; AVX1-NEXT: jne .LBB4_9 1352; AVX1-NEXT: .LBB4_10: # %else11 1353; AVX1-NEXT: testb $32, %al 1354; AVX1-NEXT: jne .LBB4_11 1355; AVX1-NEXT: .LBB4_12: # %else14 1356; AVX1-NEXT: testb $64, %al 1357; AVX1-NEXT: jne .LBB4_13 1358; AVX1-NEXT: .LBB4_14: # %else17 1359; AVX1-NEXT: testb $-128, %al 1360; AVX1-NEXT: je .LBB4_16 1361; AVX1-NEXT: .LBB4_15: # %cond.load19 1362; AVX1-NEXT: vbroadcastss c+12(%rip), %ymm3 1363; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm1[0,1,2,3,4,5,6],ymm3[7] 1364; AVX1-NEXT: .LBB4_16: # %else20 1365; AVX1-NEXT: vxorps %xmm3, %xmm3, %xmm3 1366; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm4 1367; AVX1-NEXT: vpcmpeqd %xmm3, %xmm0, %xmm3 1368; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3 1369; AVX1-NEXT: vmovmskps %ymm3, %eax 1370; AVX1-NEXT: testb $1, %al 1371; AVX1-NEXT: # implicit-def: $ymm3 1372; AVX1-NEXT: jne .LBB4_17 1373; AVX1-NEXT: # %bb.18: # %else26 1374; AVX1-NEXT: testb $2, %al 1375; AVX1-NEXT: jne .LBB4_19 1376; AVX1-NEXT: .LBB4_20: # %else31 1377; AVX1-NEXT: testb $4, %al 1378; AVX1-NEXT: jne .LBB4_21 1379; AVX1-NEXT: .LBB4_22: # %else36 1380; AVX1-NEXT: testb $8, %al 1381; AVX1-NEXT: jne .LBB4_23 1382; AVX1-NEXT: .LBB4_24: # %else41 1383; AVX1-NEXT: testb $16, %al 1384; AVX1-NEXT: jne .LBB4_25 1385; AVX1-NEXT: .LBB4_26: # %else46 1386; AVX1-NEXT: testb $32, %al 1387; AVX1-NEXT: jne .LBB4_27 1388; AVX1-NEXT: .LBB4_28: # %else51 1389; AVX1-NEXT: testb $64, %al 1390; AVX1-NEXT: jne .LBB4_29 1391; AVX1-NEXT: .LBB4_30: # %else56 1392; AVX1-NEXT: testb $-128, %al 1393; AVX1-NEXT: je .LBB4_32 1394; AVX1-NEXT: .LBB4_31: # %cond.load58 1395; AVX1-NEXT: vbroadcastss c+28(%rip), %ymm4 1396; AVX1-NEXT: vblendps {{.*#+}} ymm3 = ymm3[0,1,2,3,4,5,6],ymm4[7] 1397; AVX1-NEXT: .LBB4_32: # %else61 1398; AVX1-NEXT: vxorps %xmm4, %xmm4, %xmm4 1399; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm2 1400; AVX1-NEXT: vpcmpeqd %xmm4, %xmm0, %xmm0 1401; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1402; AVX1-NEXT: vmovmskps %ymm0, %eax 1403; AVX1-NEXT: testb $1, %al 1404; AVX1-NEXT: # implicit-def: $ymm0 1405; AVX1-NEXT: jne .LBB4_33 1406; AVX1-NEXT: # %bb.34: # %else67 1407; AVX1-NEXT: testb $2, %al 1408; AVX1-NEXT: jne .LBB4_35 1409; AVX1-NEXT: .LBB4_36: # %else72 1410; AVX1-NEXT: testb $4, %al 1411; AVX1-NEXT: jne .LBB4_37 1412; AVX1-NEXT: .LBB4_38: # %else77 1413; AVX1-NEXT: testb $8, %al 1414; AVX1-NEXT: jne .LBB4_39 1415; AVX1-NEXT: .LBB4_40: # %else82 1416; AVX1-NEXT: testb $16, %al 1417; AVX1-NEXT: je .LBB4_42 1418; AVX1-NEXT: .LBB4_41: # %cond.load84 1419; AVX1-NEXT: vbroadcastss c+28(%rip), %ymm2 1420; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm2[4],ymm0[5,6,7] 1421; AVX1-NEXT: .LBB4_42: # %else87 1422; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2 1423; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 1424; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1 1425; AVX1-NEXT: testb $32, %al 1426; AVX1-NEXT: je .LBB4_44 1427; AVX1-NEXT: # %bb.43: # %cond.load89 1428; AVX1-NEXT: vbroadcastss c+28(%rip), %ymm3 1429; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm3[5],ymm0[6,7] 1430; AVX1-NEXT: .LBB4_44: # %else92 1431; AVX1-NEXT: vpaddd %xmm2, %xmm4, %xmm2 1432; AVX1-NEXT: testb $64, %al 1433; AVX1-NEXT: je .LBB4_46 1434; AVX1-NEXT: # %bb.45: # %cond.load94 1435; AVX1-NEXT: vbroadcastss c+28(%rip), %ymm3 1436; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5],ymm3[6],ymm0[7] 1437; AVX1-NEXT: .LBB4_46: # %else97 1438; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 1439; AVX1-NEXT: testb $-128, %al 1440; AVX1-NEXT: je .LBB4_48 1441; AVX1-NEXT: # %bb.47: # %cond.load99 1442; AVX1-NEXT: vbroadcastss c+28(%rip), %ymm2 1443; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5,6],ymm2[7] 1444; AVX1-NEXT: .LBB4_48: # %else102 1445; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1446; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1447; AVX1-NEXT: vpaddd %xmm2, %xmm3, %xmm2 1448; AVX1-NEXT: vpaddd %xmm0, %xmm1, %xmm0 1449; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1450; AVX1-NEXT: retq 1451; AVX1-NEXT: .LBB4_1: # %cond.load 1452; AVX1-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 1453; AVX1-NEXT: testb $2, %al 1454; AVX1-NEXT: je .LBB4_4 1455; AVX1-NEXT: .LBB4_3: # %cond.load1 1456; AVX1-NEXT: vpinsrd $1, c+12(%rip), %xmm1, %xmm3 1457; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] 1458; AVX1-NEXT: testb $4, %al 1459; AVX1-NEXT: je .LBB4_6 1460; AVX1-NEXT: .LBB4_5: # %cond.load4 1461; AVX1-NEXT: vpinsrd $2, c+12(%rip), %xmm1, %xmm3 1462; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] 1463; AVX1-NEXT: testb $8, %al 1464; AVX1-NEXT: je .LBB4_8 1465; AVX1-NEXT: .LBB4_7: # %cond.load7 1466; AVX1-NEXT: vpinsrd $3, c+12(%rip), %xmm1, %xmm3 1467; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] 1468; AVX1-NEXT: testb $16, %al 1469; AVX1-NEXT: je .LBB4_10 1470; AVX1-NEXT: .LBB4_9: # %cond.load10 1471; AVX1-NEXT: vbroadcastss c+12(%rip), %ymm3 1472; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm1[0,1,2,3],ymm3[4],ymm1[5,6,7] 1473; AVX1-NEXT: testb $32, %al 1474; AVX1-NEXT: je .LBB4_12 1475; AVX1-NEXT: .LBB4_11: # %cond.load13 1476; AVX1-NEXT: vbroadcastss c+12(%rip), %ymm3 1477; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm1[0,1,2,3,4],ymm3[5],ymm1[6,7] 1478; AVX1-NEXT: testb $64, %al 1479; AVX1-NEXT: je .LBB4_14 1480; AVX1-NEXT: .LBB4_13: # %cond.load16 1481; AVX1-NEXT: vbroadcastss c+12(%rip), %ymm3 1482; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm1[0,1,2,3,4,5],ymm3[6],ymm1[7] 1483; AVX1-NEXT: testb $-128, %al 1484; AVX1-NEXT: jne .LBB4_15 1485; AVX1-NEXT: jmp .LBB4_16 1486; AVX1-NEXT: .LBB4_17: # %cond.load23 1487; AVX1-NEXT: vmovd {{.*#+}} xmm3 = mem[0],zero,zero,zero 1488; AVX1-NEXT: testb $2, %al 1489; AVX1-NEXT: je .LBB4_20 1490; AVX1-NEXT: .LBB4_19: # %cond.load28 1491; AVX1-NEXT: vpinsrd $1, c+28(%rip), %xmm3, %xmm4 1492; AVX1-NEXT: vblendps {{.*#+}} ymm3 = ymm4[0,1,2,3],ymm3[4,5,6,7] 1493; AVX1-NEXT: testb $4, %al 1494; AVX1-NEXT: je .LBB4_22 1495; AVX1-NEXT: .LBB4_21: # %cond.load33 1496; AVX1-NEXT: vpinsrd $2, c+28(%rip), %xmm3, %xmm4 1497; AVX1-NEXT: vblendps {{.*#+}} ymm3 = ymm4[0,1,2,3],ymm3[4,5,6,7] 1498; AVX1-NEXT: testb $8, %al 1499; AVX1-NEXT: je .LBB4_24 1500; AVX1-NEXT: .LBB4_23: # %cond.load38 1501; AVX1-NEXT: vpinsrd $3, c+28(%rip), %xmm3, %xmm4 1502; AVX1-NEXT: vblendps {{.*#+}} ymm3 = ymm4[0,1,2,3],ymm3[4,5,6,7] 1503; AVX1-NEXT: testb $16, %al 1504; AVX1-NEXT: je .LBB4_26 1505; AVX1-NEXT: .LBB4_25: # %cond.load43 1506; AVX1-NEXT: vbroadcastss c+28(%rip), %ymm4 1507; AVX1-NEXT: vblendps {{.*#+}} ymm3 = ymm3[0,1,2,3],ymm4[4],ymm3[5,6,7] 1508; AVX1-NEXT: testb $32, %al 1509; AVX1-NEXT: je .LBB4_28 1510; AVX1-NEXT: .LBB4_27: # %cond.load48 1511; AVX1-NEXT: vbroadcastss c+28(%rip), %ymm4 1512; AVX1-NEXT: vblendps {{.*#+}} ymm3 = ymm3[0,1,2,3,4],ymm4[5],ymm3[6,7] 1513; AVX1-NEXT: testb $64, %al 1514; AVX1-NEXT: je .LBB4_30 1515; AVX1-NEXT: .LBB4_29: # %cond.load53 1516; AVX1-NEXT: vbroadcastss c+28(%rip), %ymm4 1517; AVX1-NEXT: vblendps {{.*#+}} ymm3 = ymm3[0,1,2,3,4,5],ymm4[6],ymm3[7] 1518; AVX1-NEXT: testb $-128, %al 1519; AVX1-NEXT: jne .LBB4_31 1520; AVX1-NEXT: jmp .LBB4_32 1521; AVX1-NEXT: .LBB4_33: # %cond.load64 1522; AVX1-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 1523; AVX1-NEXT: testb $2, %al 1524; AVX1-NEXT: je .LBB4_36 1525; AVX1-NEXT: .LBB4_35: # %cond.load69 1526; AVX1-NEXT: vpinsrd $1, c+28(%rip), %xmm0, %xmm2 1527; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7] 1528; AVX1-NEXT: testb $4, %al 1529; AVX1-NEXT: je .LBB4_38 1530; AVX1-NEXT: .LBB4_37: # %cond.load74 1531; AVX1-NEXT: vpinsrd $2, c+28(%rip), %xmm0, %xmm2 1532; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7] 1533; AVX1-NEXT: testb $8, %al 1534; AVX1-NEXT: je .LBB4_40 1535; AVX1-NEXT: .LBB4_39: # %cond.load79 1536; AVX1-NEXT: vpinsrd $3, c+28(%rip), %xmm0, %xmm2 1537; AVX1-NEXT: vblendps {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7] 1538; AVX1-NEXT: testb $16, %al 1539; AVX1-NEXT: jne .LBB4_41 1540; AVX1-NEXT: jmp .LBB4_42 1541; 1542; AVX2-LABEL: gather_v8i32_v8i32: 1543; AVX2: # %bb.0: 1544; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 1545; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm1 1546; AVX2-NEXT: vmovmskps %ymm1, %eax 1547; AVX2-NEXT: testb $1, %al 1548; AVX2-NEXT: # implicit-def: $ymm1 1549; AVX2-NEXT: jne .LBB4_1 1550; AVX2-NEXT: # %bb.2: # %else 1551; AVX2-NEXT: testb $2, %al 1552; AVX2-NEXT: jne .LBB4_3 1553; AVX2-NEXT: .LBB4_4: # %else2 1554; AVX2-NEXT: testb $4, %al 1555; AVX2-NEXT: jne .LBB4_5 1556; AVX2-NEXT: .LBB4_6: # %else5 1557; AVX2-NEXT: testb $8, %al 1558; AVX2-NEXT: jne .LBB4_7 1559; AVX2-NEXT: .LBB4_8: # %else8 1560; AVX2-NEXT: testb $16, %al 1561; AVX2-NEXT: jne .LBB4_9 1562; AVX2-NEXT: .LBB4_10: # %else11 1563; AVX2-NEXT: testb $32, %al 1564; AVX2-NEXT: jne .LBB4_11 1565; AVX2-NEXT: .LBB4_12: # %else14 1566; AVX2-NEXT: testb $64, %al 1567; AVX2-NEXT: jne .LBB4_13 1568; AVX2-NEXT: .LBB4_14: # %else17 1569; AVX2-NEXT: testb $-128, %al 1570; AVX2-NEXT: je .LBB4_16 1571; AVX2-NEXT: .LBB4_15: # %cond.load19 1572; AVX2-NEXT: vpbroadcastd c+12(%rip), %ymm2 1573; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0,1,2,3,4,5,6],ymm2[7] 1574; AVX2-NEXT: .LBB4_16: # %else20 1575; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 1576; AVX2-NEXT: vpcmpeqd %ymm2, %ymm0, %ymm2 1577; AVX2-NEXT: vmovmskps %ymm2, %eax 1578; AVX2-NEXT: testb $1, %al 1579; AVX2-NEXT: # implicit-def: $ymm2 1580; AVX2-NEXT: jne .LBB4_17 1581; AVX2-NEXT: # %bb.18: # %else26 1582; AVX2-NEXT: testb $2, %al 1583; AVX2-NEXT: jne .LBB4_19 1584; AVX2-NEXT: .LBB4_20: # %else31 1585; AVX2-NEXT: testb $4, %al 1586; AVX2-NEXT: jne .LBB4_21 1587; AVX2-NEXT: .LBB4_22: # %else36 1588; AVX2-NEXT: testb $8, %al 1589; AVX2-NEXT: jne .LBB4_23 1590; AVX2-NEXT: .LBB4_24: # %else41 1591; AVX2-NEXT: testb $16, %al 1592; AVX2-NEXT: jne .LBB4_25 1593; AVX2-NEXT: .LBB4_26: # %else46 1594; AVX2-NEXT: testb $32, %al 1595; AVX2-NEXT: jne .LBB4_27 1596; AVX2-NEXT: .LBB4_28: # %else51 1597; AVX2-NEXT: testb $64, %al 1598; AVX2-NEXT: jne .LBB4_29 1599; AVX2-NEXT: .LBB4_30: # %else56 1600; AVX2-NEXT: testb $-128, %al 1601; AVX2-NEXT: je .LBB4_32 1602; AVX2-NEXT: .LBB4_31: # %cond.load58 1603; AVX2-NEXT: vpbroadcastd c+28(%rip), %ymm3 1604; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0,1,2,3,4,5,6],ymm3[7] 1605; AVX2-NEXT: .LBB4_32: # %else61 1606; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 1607; AVX2-NEXT: vpcmpeqd %ymm3, %ymm0, %ymm0 1608; AVX2-NEXT: vmovmskps %ymm0, %eax 1609; AVX2-NEXT: testb $1, %al 1610; AVX2-NEXT: # implicit-def: $ymm0 1611; AVX2-NEXT: jne .LBB4_33 1612; AVX2-NEXT: # %bb.34: # %else67 1613; AVX2-NEXT: testb $2, %al 1614; AVX2-NEXT: jne .LBB4_35 1615; AVX2-NEXT: .LBB4_36: # %else72 1616; AVX2-NEXT: testb $4, %al 1617; AVX2-NEXT: jne .LBB4_37 1618; AVX2-NEXT: .LBB4_38: # %else77 1619; AVX2-NEXT: testb $8, %al 1620; AVX2-NEXT: jne .LBB4_39 1621; AVX2-NEXT: .LBB4_40: # %else82 1622; AVX2-NEXT: testb $16, %al 1623; AVX2-NEXT: jne .LBB4_41 1624; AVX2-NEXT: .LBB4_42: # %else87 1625; AVX2-NEXT: testb $32, %al 1626; AVX2-NEXT: jne .LBB4_43 1627; AVX2-NEXT: .LBB4_44: # %else92 1628; AVX2-NEXT: testb $64, %al 1629; AVX2-NEXT: je .LBB4_46 1630; AVX2-NEXT: .LBB4_45: # %cond.load94 1631; AVX2-NEXT: vpbroadcastd c+28(%rip), %ymm3 1632; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5],ymm3[6],ymm0[7] 1633; AVX2-NEXT: .LBB4_46: # %else97 1634; AVX2-NEXT: vpaddd %ymm2, %ymm1, %ymm1 1635; AVX2-NEXT: testb $-128, %al 1636; AVX2-NEXT: je .LBB4_48 1637; AVX2-NEXT: # %bb.47: # %cond.load99 1638; AVX2-NEXT: vpbroadcastd c+28(%rip), %ymm2 1639; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5,6],ymm2[7] 1640; AVX2-NEXT: .LBB4_48: # %else102 1641; AVX2-NEXT: vpaddd %ymm0, %ymm1, %ymm0 1642; AVX2-NEXT: retq 1643; AVX2-NEXT: .LBB4_1: # %cond.load 1644; AVX2-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero 1645; AVX2-NEXT: testb $2, %al 1646; AVX2-NEXT: je .LBB4_4 1647; AVX2-NEXT: .LBB4_3: # %cond.load1 1648; AVX2-NEXT: vpinsrd $1, c+12(%rip), %xmm1, %xmm2 1649; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] 1650; AVX2-NEXT: testb $4, %al 1651; AVX2-NEXT: je .LBB4_6 1652; AVX2-NEXT: .LBB4_5: # %cond.load4 1653; AVX2-NEXT: vpinsrd $2, c+12(%rip), %xmm1, %xmm2 1654; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] 1655; AVX2-NEXT: testb $8, %al 1656; AVX2-NEXT: je .LBB4_8 1657; AVX2-NEXT: .LBB4_7: # %cond.load7 1658; AVX2-NEXT: vpinsrd $3, c+12(%rip), %xmm1, %xmm2 1659; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] 1660; AVX2-NEXT: testb $16, %al 1661; AVX2-NEXT: je .LBB4_10 1662; AVX2-NEXT: .LBB4_9: # %cond.load10 1663; AVX2-NEXT: vpbroadcastd c+12(%rip), %ymm2 1664; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0,1,2,3],ymm2[4],ymm1[5,6,7] 1665; AVX2-NEXT: testb $32, %al 1666; AVX2-NEXT: je .LBB4_12 1667; AVX2-NEXT: .LBB4_11: # %cond.load13 1668; AVX2-NEXT: vpbroadcastd c+12(%rip), %ymm2 1669; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0,1,2,3,4],ymm2[5],ymm1[6,7] 1670; AVX2-NEXT: testb $64, %al 1671; AVX2-NEXT: je .LBB4_14 1672; AVX2-NEXT: .LBB4_13: # %cond.load16 1673; AVX2-NEXT: vpbroadcastd c+12(%rip), %ymm2 1674; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0,1,2,3,4,5],ymm2[6],ymm1[7] 1675; AVX2-NEXT: testb $-128, %al 1676; AVX2-NEXT: jne .LBB4_15 1677; AVX2-NEXT: jmp .LBB4_16 1678; AVX2-NEXT: .LBB4_17: # %cond.load23 1679; AVX2-NEXT: vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero 1680; AVX2-NEXT: testb $2, %al 1681; AVX2-NEXT: je .LBB4_20 1682; AVX2-NEXT: .LBB4_19: # %cond.load28 1683; AVX2-NEXT: vpinsrd $1, c+28(%rip), %xmm2, %xmm3 1684; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm3[0,1,2,3],ymm2[4,5,6,7] 1685; AVX2-NEXT: testb $4, %al 1686; AVX2-NEXT: je .LBB4_22 1687; AVX2-NEXT: .LBB4_21: # %cond.load33 1688; AVX2-NEXT: vpinsrd $2, c+28(%rip), %xmm2, %xmm3 1689; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm3[0,1,2,3],ymm2[4,5,6,7] 1690; AVX2-NEXT: testb $8, %al 1691; AVX2-NEXT: je .LBB4_24 1692; AVX2-NEXT: .LBB4_23: # %cond.load38 1693; AVX2-NEXT: vpinsrd $3, c+28(%rip), %xmm2, %xmm3 1694; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm3[0,1,2,3],ymm2[4,5,6,7] 1695; AVX2-NEXT: testb $16, %al 1696; AVX2-NEXT: je .LBB4_26 1697; AVX2-NEXT: .LBB4_25: # %cond.load43 1698; AVX2-NEXT: vpbroadcastd c+28(%rip), %ymm3 1699; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0,1,2,3],ymm3[4],ymm2[5,6,7] 1700; AVX2-NEXT: testb $32, %al 1701; AVX2-NEXT: je .LBB4_28 1702; AVX2-NEXT: .LBB4_27: # %cond.load48 1703; AVX2-NEXT: vpbroadcastd c+28(%rip), %ymm3 1704; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0,1,2,3,4],ymm3[5],ymm2[6,7] 1705; AVX2-NEXT: testb $64, %al 1706; AVX2-NEXT: je .LBB4_30 1707; AVX2-NEXT: .LBB4_29: # %cond.load53 1708; AVX2-NEXT: vpbroadcastd c+28(%rip), %ymm3 1709; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0,1,2,3,4,5],ymm3[6],ymm2[7] 1710; AVX2-NEXT: testb $-128, %al 1711; AVX2-NEXT: jne .LBB4_31 1712; AVX2-NEXT: jmp .LBB4_32 1713; AVX2-NEXT: .LBB4_33: # %cond.load64 1714; AVX2-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero 1715; AVX2-NEXT: testb $2, %al 1716; AVX2-NEXT: je .LBB4_36 1717; AVX2-NEXT: .LBB4_35: # %cond.load69 1718; AVX2-NEXT: vpinsrd $1, c+28(%rip), %xmm0, %xmm3 1719; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm3[0,1,2,3],ymm0[4,5,6,7] 1720; AVX2-NEXT: testb $4, %al 1721; AVX2-NEXT: je .LBB4_38 1722; AVX2-NEXT: .LBB4_37: # %cond.load74 1723; AVX2-NEXT: vpinsrd $2, c+28(%rip), %xmm0, %xmm3 1724; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm3[0,1,2,3],ymm0[4,5,6,7] 1725; AVX2-NEXT: testb $8, %al 1726; AVX2-NEXT: je .LBB4_40 1727; AVX2-NEXT: .LBB4_39: # %cond.load79 1728; AVX2-NEXT: vpinsrd $3, c+28(%rip), %xmm0, %xmm3 1729; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm3[0,1,2,3],ymm0[4,5,6,7] 1730; AVX2-NEXT: testb $16, %al 1731; AVX2-NEXT: je .LBB4_42 1732; AVX2-NEXT: .LBB4_41: # %cond.load84 1733; AVX2-NEXT: vpbroadcastd c+28(%rip), %ymm3 1734; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm3[4],ymm0[5,6,7] 1735; AVX2-NEXT: testb $32, %al 1736; AVX2-NEXT: je .LBB4_44 1737; AVX2-NEXT: .LBB4_43: # %cond.load89 1738; AVX2-NEXT: vpbroadcastd c+28(%rip), %ymm3 1739; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm3[5],ymm0[6,7] 1740; AVX2-NEXT: testb $64, %al 1741; AVX2-NEXT: jne .LBB4_45 1742; AVX2-NEXT: jmp .LBB4_46 1743; 1744; AVX512F-LABEL: gather_v8i32_v8i32: 1745; AVX512F: # %bb.0: 1746; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1747; AVX512F-NEXT: vptestnmd %zmm0, %zmm0, %k0 1748; AVX512F-NEXT: kshiftlw $8, %k0, %k0 1749; AVX512F-NEXT: kshiftrw $8, %k0, %k1 1750; AVX512F-NEXT: vpxor %xmm0, %xmm0, %xmm0 1751; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 1752; AVX512F-NEXT: kmovw %k1, %k2 1753; AVX512F-NEXT: vpgatherdd c+12(,%zmm0), %zmm1 {%k2} 1754; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 1755; AVX512F-NEXT: vpgatherdd c+28(,%zmm0), %zmm2 {%k1} 1756; AVX512F-NEXT: vpaddd %ymm2, %ymm1, %ymm0 1757; AVX512F-NEXT: vpaddd %ymm2, %ymm0, %ymm0 1758; AVX512F-NEXT: retq 1759; 1760; AVX512VL-LABEL: gather_v8i32_v8i32: 1761; AVX512VL: # %bb.0: 1762; AVX512VL-NEXT: vptestnmd %ymm0, %ymm0, %k1 1763; AVX512VL-NEXT: vpxor %xmm0, %xmm0, %xmm0 1764; AVX512VL-NEXT: kmovw %k1, %k2 1765; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 1766; AVX512VL-NEXT: vpgatherdd c+12(,%ymm0), %ymm1 {%k2} 1767; AVX512VL-NEXT: vpxor %xmm2, %xmm2, %xmm2 1768; AVX512VL-NEXT: vpgatherdd c+28(,%ymm0), %ymm2 {%k1} 1769; AVX512VL-NEXT: vpaddd %ymm2, %ymm1, %ymm0 1770; AVX512VL-NEXT: vpaddd %ymm2, %ymm0, %ymm0 1771; AVX512VL-NEXT: retq 1772 %1 = icmp eq <8 x i32> %trigger, zeroinitializer 1773 %2 = call <8 x i32> @llvm.masked.gather.v8i32.v8p0(<8 x ptr> getelementptr (%struct.a, <8 x ptr> <ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c>, <8 x i64> zeroinitializer, i32 0, <8 x i64> <i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3, i64 3>), i32 4, <8 x i1> %1, <8 x i32> undef) 1774 %3 = call <8 x i32> @llvm.masked.gather.v8i32.v8p0(<8 x ptr> getelementptr (%struct.a, <8 x ptr> <ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c>, <8 x i64> zeroinitializer, i32 3), i32 4, <8 x i1> %1, <8 x i32> undef) 1775 %4 = add <8 x i32> %2, %3 1776 %5 = call <8 x i32> @llvm.masked.gather.v8i32.v8p0(<8 x ptr> getelementptr (%struct.a, <8 x ptr> <ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c, ptr @c>, <8 x i64> zeroinitializer, i32 3), i32 4, <8 x i1> %1, <8 x i32> undef) 1777 %6 = add <8 x i32> %4, %5 1778 ret <8 x i32> %6 1779} 1780 1781declare <2 x double> @llvm.masked.gather.v2f64.v2p0(<2 x ptr>, i32, <2 x i1>, <2 x double>) 1782declare <4 x double> @llvm.masked.gather.v4f64.v4p0(<4 x ptr>, i32, <4 x i1>, <4 x double>) 1783 1784declare <4 x float> @llvm.masked.gather.v4f32.v4p0(<4 x ptr>, i32, <4 x i1>, <4 x float>) 1785declare <8 x float> @llvm.masked.gather.v8f32.v8p0(<8 x ptr>, i32, <8 x i1>, <8 x float>) 1786 1787declare <16 x i8> @llvm.masked.gather.v16i8.v16p0(<16 x ptr>, i32, <16 x i1>, <16 x i8>) 1788 1789declare <8 x i32> @llvm.masked.gather.v8i32.v8p0(<8 x ptr>, i32, <8 x i1>, <8 x i32>) 1790