1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512VL 8 9; 10; vXi64 11; 12 13define i64 @test_v2i64(<2 x i64> %a0) { 14; SSE2-LABEL: test_v2i64: 15; SSE2: # %bb.0: 16; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 17; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456] 18; SSE2-NEXT: movdqa %xmm0, %xmm3 19; SSE2-NEXT: pxor %xmm2, %xmm3 20; SSE2-NEXT: pxor %xmm1, %xmm2 21; SSE2-NEXT: movdqa %xmm2, %xmm4 22; SSE2-NEXT: pcmpgtd %xmm3, %xmm4 23; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 24; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 25; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 26; SSE2-NEXT: pand %xmm5, %xmm2 27; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 28; SSE2-NEXT: por %xmm2, %xmm3 29; SSE2-NEXT: pand %xmm3, %xmm0 30; SSE2-NEXT: pandn %xmm1, %xmm3 31; SSE2-NEXT: por %xmm0, %xmm3 32; SSE2-NEXT: movq %xmm3, %rax 33; SSE2-NEXT: retq 34; 35; SSE41-LABEL: test_v2i64: 36; SSE41: # %bb.0: 37; SSE41-NEXT: movdqa %xmm0, %xmm1 38; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1] 39; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456] 40; SSE41-NEXT: movdqa %xmm1, %xmm3 41; SSE41-NEXT: pxor %xmm0, %xmm3 42; SSE41-NEXT: pxor %xmm2, %xmm0 43; SSE41-NEXT: movdqa %xmm0, %xmm4 44; SSE41-NEXT: pcmpgtd %xmm3, %xmm4 45; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 46; SSE41-NEXT: pcmpeqd %xmm3, %xmm0 47; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 48; SSE41-NEXT: pand %xmm5, %xmm0 49; SSE41-NEXT: por %xmm4, %xmm0 50; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2 51; SSE41-NEXT: movq %xmm2, %rax 52; SSE41-NEXT: retq 53; 54; AVX-LABEL: test_v2i64: 55; AVX: # %bb.0: 56; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 57; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 58; AVX-NEXT: vpxor %xmm2, %xmm0, %xmm3 59; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm2 60; AVX-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2 61; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 62; AVX-NEXT: vmovq %xmm0, %rax 63; AVX-NEXT: retq 64; 65; AVX512BW-LABEL: test_v2i64: 66; AVX512BW: # %bb.0: 67; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 68; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 69; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0 70; AVX512BW-NEXT: vmovq %xmm0, %rax 71; AVX512BW-NEXT: vzeroupper 72; AVX512BW-NEXT: retq 73; 74; AVX512VL-LABEL: test_v2i64: 75; AVX512VL: # %bb.0: 76; AVX512VL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 77; AVX512VL-NEXT: vpminuq %xmm1, %xmm0, %xmm0 78; AVX512VL-NEXT: vmovq %xmm0, %rax 79; AVX512VL-NEXT: retq 80 %1 = call i64 @llvm.experimental.vector.reduce.umin.i64.v2i64(<2 x i64> %a0) 81 ret i64 %1 82} 83 84define i64 @test_v4i64(<4 x i64> %a0) { 85; SSE2-LABEL: test_v4i64: 86; SSE2: # %bb.0: 87; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456] 88; SSE2-NEXT: movdqa %xmm0, %xmm3 89; SSE2-NEXT: pxor %xmm2, %xmm3 90; SSE2-NEXT: movdqa %xmm1, %xmm4 91; SSE2-NEXT: pxor %xmm2, %xmm4 92; SSE2-NEXT: movdqa %xmm4, %xmm5 93; SSE2-NEXT: pcmpgtd %xmm3, %xmm5 94; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 95; SSE2-NEXT: pcmpeqd %xmm3, %xmm4 96; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 97; SSE2-NEXT: pand %xmm6, %xmm3 98; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 99; SSE2-NEXT: por %xmm3, %xmm4 100; SSE2-NEXT: pand %xmm4, %xmm0 101; SSE2-NEXT: pandn %xmm1, %xmm4 102; SSE2-NEXT: por %xmm0, %xmm4 103; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1] 104; SSE2-NEXT: movdqa %xmm4, %xmm1 105; SSE2-NEXT: pxor %xmm2, %xmm1 106; SSE2-NEXT: pxor %xmm0, %xmm2 107; SSE2-NEXT: movdqa %xmm2, %xmm3 108; SSE2-NEXT: pcmpgtd %xmm1, %xmm3 109; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2] 110; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 111; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 112; SSE2-NEXT: pand %xmm5, %xmm1 113; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3] 114; SSE2-NEXT: por %xmm1, %xmm2 115; SSE2-NEXT: pand %xmm2, %xmm4 116; SSE2-NEXT: pandn %xmm0, %xmm2 117; SSE2-NEXT: por %xmm4, %xmm2 118; SSE2-NEXT: movq %xmm2, %rax 119; SSE2-NEXT: retq 120; 121; SSE41-LABEL: test_v4i64: 122; SSE41: # %bb.0: 123; SSE41-NEXT: movdqa %xmm0, %xmm2 124; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456] 125; SSE41-NEXT: pxor %xmm3, %xmm0 126; SSE41-NEXT: movdqa %xmm1, %xmm4 127; SSE41-NEXT: pxor %xmm3, %xmm4 128; SSE41-NEXT: movdqa %xmm4, %xmm5 129; SSE41-NEXT: pcmpgtd %xmm0, %xmm5 130; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 131; SSE41-NEXT: pcmpeqd %xmm0, %xmm4 132; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 133; SSE41-NEXT: pand %xmm6, %xmm0 134; SSE41-NEXT: por %xmm5, %xmm0 135; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1 136; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,0,1] 137; SSE41-NEXT: movdqa %xmm1, %xmm0 138; SSE41-NEXT: pxor %xmm3, %xmm0 139; SSE41-NEXT: pxor %xmm2, %xmm3 140; SSE41-NEXT: movdqa %xmm3, %xmm4 141; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 142; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 143; SSE41-NEXT: pcmpeqd %xmm0, %xmm3 144; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] 145; SSE41-NEXT: pand %xmm5, %xmm0 146; SSE41-NEXT: por %xmm4, %xmm0 147; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2 148; SSE41-NEXT: movq %xmm2, %rax 149; SSE41-NEXT: retq 150; 151; AVX1-LABEL: test_v4i64: 152; AVX1: # %bb.0: 153; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 154; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808] 155; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm3 156; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm4 157; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3 158; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm4 159; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3 160; AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm1, %ymm0 161; AVX1-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1] 162; AVX1-NEXT: vxorpd %xmm2, %xmm0, %xmm3 163; AVX1-NEXT: vxorpd %xmm2, %xmm1, %xmm2 164; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm2 165; AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 166; AVX1-NEXT: vmovq %xmm0, %rax 167; AVX1-NEXT: vzeroupper 168; AVX1-NEXT: retq 169; 170; AVX2-LABEL: test_v4i64: 171; AVX2: # %bb.0: 172; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 173; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 174; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm3 175; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm4 176; AVX2-NEXT: vpcmpgtq %ymm3, %ymm4, %ymm3 177; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm1, %ymm0 178; AVX2-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1] 179; AVX2-NEXT: vxorpd %ymm2, %ymm0, %ymm3 180; AVX2-NEXT: vxorpd %ymm2, %ymm1, %ymm2 181; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2 182; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 183; AVX2-NEXT: vmovq %xmm0, %rax 184; AVX2-NEXT: vzeroupper 185; AVX2-NEXT: retq 186; 187; AVX512BW-LABEL: test_v4i64: 188; AVX512BW: # %bb.0: 189; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 190; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 191; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0 192; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 193; AVX512BW-NEXT: vpminuq %zmm1, %zmm0, %zmm0 194; AVX512BW-NEXT: vmovq %xmm0, %rax 195; AVX512BW-NEXT: vzeroupper 196; AVX512BW-NEXT: retq 197; 198; AVX512VL-LABEL: test_v4i64: 199; AVX512VL: # %bb.0: 200; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm1 201; AVX512VL-NEXT: vpminuq %ymm1, %ymm0, %ymm0 202; AVX512VL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 203; AVX512VL-NEXT: vpminuq %ymm1, %ymm0, %ymm0 204; AVX512VL-NEXT: vmovq %xmm0, %rax 205; AVX512VL-NEXT: vzeroupper 206; AVX512VL-NEXT: retq 207 %1 = call i64 @llvm.experimental.vector.reduce.umin.i64.v4i64(<4 x i64> %a0) 208 ret i64 %1 209} 210 211define i64 @test_v8i64(<8 x i64> %a0) { 212; SSE2-LABEL: test_v8i64: 213; SSE2: # %bb.0: 214; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456] 215; SSE2-NEXT: movdqa %xmm1, %xmm5 216; SSE2-NEXT: pxor %xmm4, %xmm5 217; SSE2-NEXT: movdqa %xmm3, %xmm6 218; SSE2-NEXT: pxor %xmm4, %xmm6 219; SSE2-NEXT: movdqa %xmm6, %xmm7 220; SSE2-NEXT: pcmpgtd %xmm5, %xmm7 221; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2] 222; SSE2-NEXT: pcmpeqd %xmm5, %xmm6 223; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 224; SSE2-NEXT: pand %xmm8, %xmm6 225; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3] 226; SSE2-NEXT: por %xmm6, %xmm5 227; SSE2-NEXT: pand %xmm5, %xmm1 228; SSE2-NEXT: pandn %xmm3, %xmm5 229; SSE2-NEXT: por %xmm1, %xmm5 230; SSE2-NEXT: movdqa %xmm0, %xmm1 231; SSE2-NEXT: pxor %xmm4, %xmm1 232; SSE2-NEXT: movdqa %xmm2, %xmm3 233; SSE2-NEXT: pxor %xmm4, %xmm3 234; SSE2-NEXT: movdqa %xmm3, %xmm6 235; SSE2-NEXT: pcmpgtd %xmm1, %xmm6 236; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 237; SSE2-NEXT: pcmpeqd %xmm1, %xmm3 238; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3] 239; SSE2-NEXT: pand %xmm7, %xmm1 240; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] 241; SSE2-NEXT: por %xmm1, %xmm3 242; SSE2-NEXT: pand %xmm3, %xmm0 243; SSE2-NEXT: pandn %xmm2, %xmm3 244; SSE2-NEXT: por %xmm0, %xmm3 245; SSE2-NEXT: movdqa %xmm3, %xmm0 246; SSE2-NEXT: pxor %xmm4, %xmm0 247; SSE2-NEXT: movdqa %xmm5, %xmm1 248; SSE2-NEXT: pxor %xmm4, %xmm1 249; SSE2-NEXT: movdqa %xmm1, %xmm2 250; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 251; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2] 252; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 253; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 254; SSE2-NEXT: pand %xmm6, %xmm0 255; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 256; SSE2-NEXT: por %xmm0, %xmm1 257; SSE2-NEXT: pand %xmm1, %xmm3 258; SSE2-NEXT: pandn %xmm5, %xmm1 259; SSE2-NEXT: por %xmm3, %xmm1 260; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1] 261; SSE2-NEXT: movdqa %xmm1, %xmm2 262; SSE2-NEXT: pxor %xmm4, %xmm2 263; SSE2-NEXT: pxor %xmm0, %xmm4 264; SSE2-NEXT: movdqa %xmm4, %xmm3 265; SSE2-NEXT: pcmpgtd %xmm2, %xmm3 266; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2] 267; SSE2-NEXT: pcmpeqd %xmm2, %xmm4 268; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 269; SSE2-NEXT: pand %xmm5, %xmm2 270; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 271; SSE2-NEXT: por %xmm2, %xmm3 272; SSE2-NEXT: pand %xmm3, %xmm1 273; SSE2-NEXT: pandn %xmm0, %xmm3 274; SSE2-NEXT: por %xmm1, %xmm3 275; SSE2-NEXT: movq %xmm3, %rax 276; SSE2-NEXT: retq 277; 278; SSE41-LABEL: test_v8i64: 279; SSE41: # %bb.0: 280; SSE41-NEXT: movdqa %xmm0, %xmm8 281; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456] 282; SSE41-NEXT: movdqa %xmm1, %xmm0 283; SSE41-NEXT: pxor %xmm5, %xmm0 284; SSE41-NEXT: movdqa %xmm3, %xmm6 285; SSE41-NEXT: pxor %xmm5, %xmm6 286; SSE41-NEXT: movdqa %xmm6, %xmm7 287; SSE41-NEXT: pcmpgtd %xmm0, %xmm7 288; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2] 289; SSE41-NEXT: pcmpeqd %xmm0, %xmm6 290; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] 291; SSE41-NEXT: pand %xmm4, %xmm0 292; SSE41-NEXT: por %xmm7, %xmm0 293; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm3 294; SSE41-NEXT: movdqa %xmm8, %xmm0 295; SSE41-NEXT: pxor %xmm5, %xmm0 296; SSE41-NEXT: movdqa %xmm2, %xmm1 297; SSE41-NEXT: pxor %xmm5, %xmm1 298; SSE41-NEXT: movdqa %xmm1, %xmm4 299; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 300; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 301; SSE41-NEXT: pcmpeqd %xmm0, %xmm1 302; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 303; SSE41-NEXT: pand %xmm6, %xmm0 304; SSE41-NEXT: por %xmm4, %xmm0 305; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm2 306; SSE41-NEXT: movapd %xmm2, %xmm0 307; SSE41-NEXT: xorpd %xmm5, %xmm0 308; SSE41-NEXT: movapd %xmm3, %xmm1 309; SSE41-NEXT: xorpd %xmm5, %xmm1 310; SSE41-NEXT: movapd %xmm1, %xmm4 311; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 312; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 313; SSE41-NEXT: pcmpeqd %xmm0, %xmm1 314; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 315; SSE41-NEXT: pand %xmm6, %xmm0 316; SSE41-NEXT: por %xmm4, %xmm0 317; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm3 318; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,0,1] 319; SSE41-NEXT: movdqa %xmm3, %xmm0 320; SSE41-NEXT: pxor %xmm5, %xmm0 321; SSE41-NEXT: pxor %xmm1, %xmm5 322; SSE41-NEXT: movdqa %xmm5, %xmm2 323; SSE41-NEXT: pcmpgtd %xmm0, %xmm2 324; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] 325; SSE41-NEXT: pcmpeqd %xmm0, %xmm5 326; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3] 327; SSE41-NEXT: pand %xmm4, %xmm0 328; SSE41-NEXT: por %xmm2, %xmm0 329; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm1 330; SSE41-NEXT: movq %xmm1, %rax 331; SSE41-NEXT: retq 332; 333; AVX1-LABEL: test_v8i64: 334; AVX1: # %bb.0: 335; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 336; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808] 337; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 338; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 339; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 340; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm2 341; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm4 342; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm5 343; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4 344; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm4, %ymm2 345; AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 346; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 347; AVX1-NEXT: vxorpd %xmm3, %xmm0, %xmm2 348; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm4 349; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm2 350; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm4 351; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm2, %ymm2 352; AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 353; AVX1-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1] 354; AVX1-NEXT: vxorpd %xmm3, %xmm0, %xmm2 355; AVX1-NEXT: vxorpd %xmm3, %xmm1, %xmm3 356; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2 357; AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 358; AVX1-NEXT: vmovq %xmm0, %rax 359; AVX1-NEXT: vzeroupper 360; AVX1-NEXT: retq 361; 362; AVX2-LABEL: test_v8i64: 363; AVX2: # %bb.0: 364; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 365; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm3 366; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm4 367; AVX2-NEXT: vpcmpgtq %ymm3, %ymm4, %ymm3 368; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm1, %ymm0 369; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1 370; AVX2-NEXT: vxorpd %ymm2, %ymm0, %ymm3 371; AVX2-NEXT: vxorpd %ymm2, %ymm1, %ymm4 372; AVX2-NEXT: vpcmpgtq %ymm3, %ymm4, %ymm3 373; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm1, %ymm0 374; AVX2-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1] 375; AVX2-NEXT: vxorpd %ymm2, %ymm0, %ymm3 376; AVX2-NEXT: vxorpd %ymm2, %ymm1, %ymm2 377; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2 378; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 379; AVX2-NEXT: vmovq %xmm0, %rax 380; AVX2-NEXT: vzeroupper 381; AVX2-NEXT: retq 382; 383; AVX512-LABEL: test_v8i64: 384; AVX512: # %bb.0: 385; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1 386; AVX512-NEXT: vpminuq %zmm1, %zmm0, %zmm0 387; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 388; AVX512-NEXT: vpminuq %zmm1, %zmm0, %zmm0 389; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 390; AVX512-NEXT: vpminuq %zmm1, %zmm0, %zmm0 391; AVX512-NEXT: vmovq %xmm0, %rax 392; AVX512-NEXT: vzeroupper 393; AVX512-NEXT: retq 394 %1 = call i64 @llvm.experimental.vector.reduce.umin.i64.v8i64(<8 x i64> %a0) 395 ret i64 %1 396} 397 398define i64 @test_v16i64(<16 x i64> %a0) { 399; SSE2-LABEL: test_v16i64: 400; SSE2: # %bb.0: 401; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456] 402; SSE2-NEXT: movdqa %xmm2, %xmm9 403; SSE2-NEXT: pxor %xmm8, %xmm9 404; SSE2-NEXT: movdqa %xmm6, %xmm10 405; SSE2-NEXT: pxor %xmm8, %xmm10 406; SSE2-NEXT: movdqa %xmm10, %xmm11 407; SSE2-NEXT: pcmpgtd %xmm9, %xmm11 408; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2] 409; SSE2-NEXT: pcmpeqd %xmm9, %xmm10 410; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3] 411; SSE2-NEXT: pand %xmm12, %xmm10 412; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm11[1,1,3,3] 413; SSE2-NEXT: por %xmm10, %xmm9 414; SSE2-NEXT: pand %xmm9, %xmm2 415; SSE2-NEXT: pandn %xmm6, %xmm9 416; SSE2-NEXT: por %xmm2, %xmm9 417; SSE2-NEXT: movdqa %xmm0, %xmm2 418; SSE2-NEXT: pxor %xmm8, %xmm2 419; SSE2-NEXT: movdqa %xmm4, %xmm6 420; SSE2-NEXT: pxor %xmm8, %xmm6 421; SSE2-NEXT: movdqa %xmm6, %xmm10 422; SSE2-NEXT: pcmpgtd %xmm2, %xmm10 423; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2] 424; SSE2-NEXT: pcmpeqd %xmm2, %xmm6 425; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 426; SSE2-NEXT: pand %xmm11, %xmm6 427; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3] 428; SSE2-NEXT: por %xmm6, %xmm2 429; SSE2-NEXT: pand %xmm2, %xmm0 430; SSE2-NEXT: pandn %xmm4, %xmm2 431; SSE2-NEXT: por %xmm0, %xmm2 432; SSE2-NEXT: movdqa %xmm3, %xmm0 433; SSE2-NEXT: pxor %xmm8, %xmm0 434; SSE2-NEXT: movdqa %xmm7, %xmm4 435; SSE2-NEXT: pxor %xmm8, %xmm4 436; SSE2-NEXT: movdqa %xmm4, %xmm6 437; SSE2-NEXT: pcmpgtd %xmm0, %xmm6 438; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2] 439; SSE2-NEXT: pcmpeqd %xmm0, %xmm4 440; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 441; SSE2-NEXT: pand %xmm10, %xmm4 442; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] 443; SSE2-NEXT: por %xmm4, %xmm0 444; SSE2-NEXT: pand %xmm0, %xmm3 445; SSE2-NEXT: pandn %xmm7, %xmm0 446; SSE2-NEXT: por %xmm3, %xmm0 447; SSE2-NEXT: movdqa %xmm1, %xmm3 448; SSE2-NEXT: pxor %xmm8, %xmm3 449; SSE2-NEXT: movdqa %xmm5, %xmm4 450; SSE2-NEXT: pxor %xmm8, %xmm4 451; SSE2-NEXT: movdqa %xmm4, %xmm6 452; SSE2-NEXT: pcmpgtd %xmm3, %xmm6 453; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 454; SSE2-NEXT: pcmpeqd %xmm3, %xmm4 455; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 456; SSE2-NEXT: pand %xmm7, %xmm3 457; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3] 458; SSE2-NEXT: por %xmm3, %xmm4 459; SSE2-NEXT: pand %xmm4, %xmm1 460; SSE2-NEXT: pandn %xmm5, %xmm4 461; SSE2-NEXT: por %xmm1, %xmm4 462; SSE2-NEXT: movdqa %xmm4, %xmm1 463; SSE2-NEXT: pxor %xmm8, %xmm1 464; SSE2-NEXT: movdqa %xmm0, %xmm3 465; SSE2-NEXT: pxor %xmm8, %xmm3 466; SSE2-NEXT: movdqa %xmm3, %xmm5 467; SSE2-NEXT: pcmpgtd %xmm1, %xmm5 468; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 469; SSE2-NEXT: pcmpeqd %xmm1, %xmm3 470; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 471; SSE2-NEXT: pand %xmm6, %xmm3 472; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3] 473; SSE2-NEXT: por %xmm3, %xmm1 474; SSE2-NEXT: pand %xmm1, %xmm4 475; SSE2-NEXT: pandn %xmm0, %xmm1 476; SSE2-NEXT: por %xmm4, %xmm1 477; SSE2-NEXT: movdqa %xmm2, %xmm0 478; SSE2-NEXT: pxor %xmm8, %xmm0 479; SSE2-NEXT: movdqa %xmm9, %xmm3 480; SSE2-NEXT: pxor %xmm8, %xmm3 481; SSE2-NEXT: movdqa %xmm3, %xmm4 482; SSE2-NEXT: pcmpgtd %xmm0, %xmm4 483; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 484; SSE2-NEXT: pcmpeqd %xmm0, %xmm3 485; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] 486; SSE2-NEXT: pand %xmm5, %xmm0 487; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 488; SSE2-NEXT: por %xmm0, %xmm3 489; SSE2-NEXT: pand %xmm3, %xmm2 490; SSE2-NEXT: pandn %xmm9, %xmm3 491; SSE2-NEXT: por %xmm2, %xmm3 492; SSE2-NEXT: movdqa %xmm3, %xmm0 493; SSE2-NEXT: pxor %xmm8, %xmm0 494; SSE2-NEXT: movdqa %xmm1, %xmm2 495; SSE2-NEXT: pxor %xmm8, %xmm2 496; SSE2-NEXT: movdqa %xmm2, %xmm4 497; SSE2-NEXT: pcmpgtd %xmm0, %xmm4 498; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 499; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 500; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 501; SSE2-NEXT: pand %xmm5, %xmm0 502; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 503; SSE2-NEXT: por %xmm0, %xmm2 504; SSE2-NEXT: pand %xmm2, %xmm3 505; SSE2-NEXT: pandn %xmm1, %xmm2 506; SSE2-NEXT: por %xmm3, %xmm2 507; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1] 508; SSE2-NEXT: movdqa %xmm2, %xmm1 509; SSE2-NEXT: pxor %xmm8, %xmm1 510; SSE2-NEXT: pxor %xmm0, %xmm8 511; SSE2-NEXT: movdqa %xmm8, %xmm3 512; SSE2-NEXT: pcmpgtd %xmm1, %xmm3 513; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] 514; SSE2-NEXT: pcmpeqd %xmm1, %xmm8 515; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3] 516; SSE2-NEXT: pand %xmm4, %xmm1 517; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 518; SSE2-NEXT: por %xmm1, %xmm3 519; SSE2-NEXT: pand %xmm3, %xmm2 520; SSE2-NEXT: pandn %xmm0, %xmm3 521; SSE2-NEXT: por %xmm2, %xmm3 522; SSE2-NEXT: movq %xmm3, %rax 523; SSE2-NEXT: retq 524; 525; SSE41-LABEL: test_v16i64: 526; SSE41: # %bb.0: 527; SSE41-NEXT: movdqa %xmm0, %xmm8 528; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259456,9223372039002259456] 529; SSE41-NEXT: movdqa %xmm2, %xmm10 530; SSE41-NEXT: pxor %xmm9, %xmm10 531; SSE41-NEXT: movdqa %xmm6, %xmm0 532; SSE41-NEXT: pxor %xmm9, %xmm0 533; SSE41-NEXT: movdqa %xmm0, %xmm11 534; SSE41-NEXT: pcmpgtd %xmm10, %xmm11 535; SSE41-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2] 536; SSE41-NEXT: pcmpeqd %xmm10, %xmm0 537; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 538; SSE41-NEXT: pand %xmm12, %xmm0 539; SSE41-NEXT: por %xmm11, %xmm0 540; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm6 541; SSE41-NEXT: movdqa %xmm8, %xmm0 542; SSE41-NEXT: pxor %xmm9, %xmm0 543; SSE41-NEXT: movdqa %xmm4, %xmm2 544; SSE41-NEXT: pxor %xmm9, %xmm2 545; SSE41-NEXT: movdqa %xmm2, %xmm10 546; SSE41-NEXT: pcmpgtd %xmm0, %xmm10 547; SSE41-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2] 548; SSE41-NEXT: pcmpeqd %xmm0, %xmm2 549; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 550; SSE41-NEXT: pand %xmm11, %xmm0 551; SSE41-NEXT: por %xmm10, %xmm0 552; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm4 553; SSE41-NEXT: movdqa %xmm3, %xmm0 554; SSE41-NEXT: pxor %xmm9, %xmm0 555; SSE41-NEXT: movdqa %xmm7, %xmm2 556; SSE41-NEXT: pxor %xmm9, %xmm2 557; SSE41-NEXT: movdqa %xmm2, %xmm8 558; SSE41-NEXT: pcmpgtd %xmm0, %xmm8 559; SSE41-NEXT: pshufd {{.*#+}} xmm10 = xmm8[0,0,2,2] 560; SSE41-NEXT: pcmpeqd %xmm0, %xmm2 561; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 562; SSE41-NEXT: pand %xmm10, %xmm0 563; SSE41-NEXT: por %xmm8, %xmm0 564; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm7 565; SSE41-NEXT: movdqa %xmm1, %xmm0 566; SSE41-NEXT: pxor %xmm9, %xmm0 567; SSE41-NEXT: movdqa %xmm5, %xmm2 568; SSE41-NEXT: pxor %xmm9, %xmm2 569; SSE41-NEXT: movdqa %xmm2, %xmm3 570; SSE41-NEXT: pcmpgtd %xmm0, %xmm3 571; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm3[0,0,2,2] 572; SSE41-NEXT: pcmpeqd %xmm0, %xmm2 573; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 574; SSE41-NEXT: pand %xmm8, %xmm0 575; SSE41-NEXT: por %xmm3, %xmm0 576; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm5 577; SSE41-NEXT: movapd %xmm5, %xmm0 578; SSE41-NEXT: xorpd %xmm9, %xmm0 579; SSE41-NEXT: movapd %xmm7, %xmm1 580; SSE41-NEXT: xorpd %xmm9, %xmm1 581; SSE41-NEXT: movapd %xmm1, %xmm2 582; SSE41-NEXT: pcmpgtd %xmm0, %xmm2 583; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 584; SSE41-NEXT: pcmpeqd %xmm0, %xmm1 585; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 586; SSE41-NEXT: pand %xmm3, %xmm0 587; SSE41-NEXT: por %xmm2, %xmm0 588; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm7 589; SSE41-NEXT: movapd %xmm4, %xmm0 590; SSE41-NEXT: xorpd %xmm9, %xmm0 591; SSE41-NEXT: movapd %xmm6, %xmm1 592; SSE41-NEXT: xorpd %xmm9, %xmm1 593; SSE41-NEXT: movapd %xmm1, %xmm2 594; SSE41-NEXT: pcmpgtd %xmm0, %xmm2 595; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 596; SSE41-NEXT: pcmpeqd %xmm0, %xmm1 597; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 598; SSE41-NEXT: pand %xmm3, %xmm0 599; SSE41-NEXT: por %xmm2, %xmm0 600; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm6 601; SSE41-NEXT: movapd %xmm6, %xmm0 602; SSE41-NEXT: xorpd %xmm9, %xmm0 603; SSE41-NEXT: movapd %xmm7, %xmm1 604; SSE41-NEXT: xorpd %xmm9, %xmm1 605; SSE41-NEXT: movapd %xmm1, %xmm2 606; SSE41-NEXT: pcmpgtd %xmm0, %xmm2 607; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 608; SSE41-NEXT: pcmpeqd %xmm0, %xmm1 609; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 610; SSE41-NEXT: pand %xmm3, %xmm0 611; SSE41-NEXT: por %xmm2, %xmm0 612; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm7 613; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm7[2,3,0,1] 614; SSE41-NEXT: movdqa %xmm7, %xmm0 615; SSE41-NEXT: pxor %xmm9, %xmm0 616; SSE41-NEXT: pxor %xmm1, %xmm9 617; SSE41-NEXT: movdqa %xmm9, %xmm2 618; SSE41-NEXT: pcmpgtd %xmm0, %xmm2 619; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 620; SSE41-NEXT: pcmpeqd %xmm0, %xmm9 621; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[1,1,3,3] 622; SSE41-NEXT: pand %xmm3, %xmm0 623; SSE41-NEXT: por %xmm2, %xmm0 624; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm1 625; SSE41-NEXT: movq %xmm1, %rax 626; SSE41-NEXT: retq 627; 628; AVX1-LABEL: test_v16i64: 629; AVX1: # %bb.0: 630; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 631; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808] 632; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5 633; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm6 634; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6 635; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm5 636; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm6 637; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm7 638; AVX1-NEXT: vpcmpgtq %xmm6, %xmm7, %xmm6 639; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm6, %ymm5 640; AVX1-NEXT: vblendvpd %ymm5, %ymm1, %ymm3, %ymm1 641; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 642; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 643; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 644; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5 645; AVX1-NEXT: vpcmpgtq %xmm3, %xmm5, %xmm3 646; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm5 647; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm6 648; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm5 649; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm5, %ymm3 650; AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 651; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 652; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2 653; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 654; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 655; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2 656; AVX1-NEXT: vxorpd %xmm4, %xmm0, %xmm3 657; AVX1-NEXT: vxorpd %xmm4, %xmm1, %xmm5 658; AVX1-NEXT: vpcmpgtq %xmm3, %xmm5, %xmm3 659; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2 660; AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 661; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 662; AVX1-NEXT: vxorpd %xmm4, %xmm0, %xmm2 663; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm3 664; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2 665; AVX1-NEXT: vpcmpgtq %xmm3, %xmm0, %xmm3 666; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 667; AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 668; AVX1-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1] 669; AVX1-NEXT: vxorpd %xmm4, %xmm0, %xmm2 670; AVX1-NEXT: vxorpd %xmm4, %xmm1, %xmm3 671; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2 672; AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 673; AVX1-NEXT: vmovq %xmm0, %rax 674; AVX1-NEXT: vzeroupper 675; AVX1-NEXT: retq 676; 677; AVX2-LABEL: test_v16i64: 678; AVX2: # %bb.0: 679; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] 680; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm5 681; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm6 682; AVX2-NEXT: vpcmpgtq %ymm5, %ymm6, %ymm5 683; AVX2-NEXT: vblendvpd %ymm5, %ymm1, %ymm3, %ymm1 684; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm3 685; AVX2-NEXT: vpxor %ymm4, %ymm2, %ymm5 686; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3 687; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 688; AVX2-NEXT: vxorpd %ymm4, %ymm0, %ymm2 689; AVX2-NEXT: vxorpd %ymm4, %ymm1, %ymm3 690; AVX2-NEXT: vpcmpgtq %ymm2, %ymm3, %ymm2 691; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 692; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1 693; AVX2-NEXT: vxorpd %ymm4, %ymm0, %ymm2 694; AVX2-NEXT: vxorpd %ymm4, %ymm1, %ymm3 695; AVX2-NEXT: vpcmpgtq %ymm2, %ymm3, %ymm2 696; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 697; AVX2-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1] 698; AVX2-NEXT: vxorpd %ymm4, %ymm0, %ymm2 699; AVX2-NEXT: vxorpd %ymm4, %ymm1, %ymm3 700; AVX2-NEXT: vpcmpgtq %ymm2, %ymm3, %ymm2 701; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 702; AVX2-NEXT: vmovq %xmm0, %rax 703; AVX2-NEXT: vzeroupper 704; AVX2-NEXT: retq 705; 706; AVX512-LABEL: test_v16i64: 707; AVX512: # %bb.0: 708; AVX512-NEXT: vpminuq %zmm1, %zmm0, %zmm0 709; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1 710; AVX512-NEXT: vpminuq %zmm1, %zmm0, %zmm0 711; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 712; AVX512-NEXT: vpminuq %zmm1, %zmm0, %zmm0 713; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 714; AVX512-NEXT: vpminuq %zmm1, %zmm0, %zmm0 715; AVX512-NEXT: vmovq %xmm0, %rax 716; AVX512-NEXT: vzeroupper 717; AVX512-NEXT: retq 718 %1 = call i64 @llvm.experimental.vector.reduce.umin.i64.v16i64(<16 x i64> %a0) 719 ret i64 %1 720} 721 722; 723; vXi32 724; 725 726define i32 @test_v2i32(<2 x i32> %a0) { 727; SSE2-LABEL: test_v2i32: 728; SSE2: # %bb.0: 729; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [4294967295,0,4294967295,0] 730; SSE2-NEXT: pand %xmm0, %xmm1 731; SSE2-NEXT: pxor %xmm2, %xmm2 732; SSE2-NEXT: punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm2[2],xmm0[3],xmm2[3] 733; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] 734; SSE2-NEXT: movdqa %xmm1, %xmm3 735; SSE2-NEXT: pxor %xmm2, %xmm3 736; SSE2-NEXT: pxor %xmm0, %xmm2 737; SSE2-NEXT: movdqa %xmm2, %xmm4 738; SSE2-NEXT: pcmpgtd %xmm3, %xmm4 739; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 740; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 741; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 742; SSE2-NEXT: pand %xmm5, %xmm2 743; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 744; SSE2-NEXT: por %xmm2, %xmm3 745; SSE2-NEXT: pand %xmm3, %xmm1 746; SSE2-NEXT: pandn %xmm0, %xmm3 747; SSE2-NEXT: por %xmm1, %xmm3 748; SSE2-NEXT: movd %xmm3, %eax 749; SSE2-NEXT: retq 750; 751; SSE41-LABEL: test_v2i32: 752; SSE41: # %bb.0: 753; SSE41-NEXT: movdqa %xmm0, %xmm1 754; SSE41-NEXT: pxor %xmm0, %xmm0 755; SSE41-NEXT: movdqa %xmm1, %xmm2 756; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm0[2,3],xmm2[4,5],xmm0[6,7] 757; SSE41-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm0[2],xmm1[3],xmm0[3] 758; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648] 759; SSE41-NEXT: movdqa %xmm2, %xmm3 760; SSE41-NEXT: pxor %xmm0, %xmm3 761; SSE41-NEXT: pxor %xmm1, %xmm0 762; SSE41-NEXT: movdqa %xmm0, %xmm4 763; SSE41-NEXT: pcmpgtd %xmm3, %xmm4 764; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 765; SSE41-NEXT: pcmpeqd %xmm3, %xmm0 766; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 767; SSE41-NEXT: pand %xmm5, %xmm0 768; SSE41-NEXT: por %xmm4, %xmm0 769; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1 770; SSE41-NEXT: movd %xmm1, %eax 771; SSE41-NEXT: retq 772; 773; AVX1-LABEL: test_v2i32: 774; AVX1: # %bb.0: 775; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 776; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7] 777; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3] 778; AVX1-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm1 779; AVX1-NEXT: vblendvpd %xmm1, %xmm2, %xmm0, %xmm0 780; AVX1-NEXT: vmovd %xmm0, %eax 781; AVX1-NEXT: retq 782; 783; AVX2-LABEL: test_v2i32: 784; AVX2: # %bb.0: 785; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 786; AVX2-NEXT: vpblendd {{.*#+}} xmm2 = xmm0[0],xmm1[1],xmm0[2],xmm1[3] 787; AVX2-NEXT: vpunpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3] 788; AVX2-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm1 789; AVX2-NEXT: vblendvpd %xmm1, %xmm2, %xmm0, %xmm0 790; AVX2-NEXT: vmovd %xmm0, %eax 791; AVX2-NEXT: retq 792; 793; AVX512BW-LABEL: test_v2i32: 794; AVX512BW: # %bb.0: 795; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 796; AVX512BW-NEXT: vpblendd {{.*#+}} xmm2 = xmm0[0],xmm1[1],xmm0[2],xmm1[3] 797; AVX512BW-NEXT: vpunpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3] 798; AVX512BW-NEXT: vpminuq %zmm0, %zmm2, %zmm0 799; AVX512BW-NEXT: vmovd %xmm0, %eax 800; AVX512BW-NEXT: vzeroupper 801; AVX512BW-NEXT: retq 802; 803; AVX512VL-LABEL: test_v2i32: 804; AVX512VL: # %bb.0: 805; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 806; AVX512VL-NEXT: vpblendd {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3] 807; AVX512VL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 808; AVX512VL-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 809; AVX512VL-NEXT: vpminuq %xmm0, %xmm1, %xmm0 810; AVX512VL-NEXT: vmovd %xmm0, %eax 811; AVX512VL-NEXT: retq 812 %1 = call i32 @llvm.experimental.vector.reduce.umin.i32.v2i32(<2 x i32> %a0) 813 ret i32 %1 814} 815 816define i32 @test_v4i32(<4 x i32> %a0) { 817; SSE2-LABEL: test_v4i32: 818; SSE2: # %bb.0: 819; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 820; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] 821; SSE2-NEXT: movdqa %xmm0, %xmm3 822; SSE2-NEXT: pxor %xmm2, %xmm3 823; SSE2-NEXT: movdqa %xmm1, %xmm4 824; SSE2-NEXT: pxor %xmm2, %xmm4 825; SSE2-NEXT: pcmpgtd %xmm3, %xmm4 826; SSE2-NEXT: pand %xmm4, %xmm0 827; SSE2-NEXT: pandn %xmm1, %xmm4 828; SSE2-NEXT: por %xmm0, %xmm4 829; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,2,3] 830; SSE2-NEXT: movdqa %xmm4, %xmm1 831; SSE2-NEXT: pxor %xmm2, %xmm1 832; SSE2-NEXT: pxor %xmm0, %xmm2 833; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 834; SSE2-NEXT: pand %xmm2, %xmm4 835; SSE2-NEXT: pandn %xmm0, %xmm2 836; SSE2-NEXT: por %xmm4, %xmm2 837; SSE2-NEXT: movd %xmm2, %eax 838; SSE2-NEXT: retq 839; 840; SSE41-LABEL: test_v4i32: 841; SSE41: # %bb.0: 842; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 843; SSE41-NEXT: pminud %xmm0, %xmm1 844; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 845; SSE41-NEXT: pminud %xmm1, %xmm0 846; SSE41-NEXT: movd %xmm0, %eax 847; SSE41-NEXT: retq 848; 849; AVX-LABEL: test_v4i32: 850; AVX: # %bb.0: 851; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 852; AVX-NEXT: vpminud %xmm1, %xmm0, %xmm0 853; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 854; AVX-NEXT: vpminud %xmm1, %xmm0, %xmm0 855; AVX-NEXT: vmovd %xmm0, %eax 856; AVX-NEXT: retq 857; 858; AVX512-LABEL: test_v4i32: 859; AVX512: # %bb.0: 860; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 861; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0 862; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 863; AVX512-NEXT: vpminud %xmm1, %xmm0, %xmm0 864; AVX512-NEXT: vmovd %xmm0, %eax 865; AVX512-NEXT: retq 866 %1 = call i32 @llvm.experimental.vector.reduce.umin.i32.v4i32(<4 x i32> %a0) 867 ret i32 %1 868} 869 870define i32 @test_v8i32(<8 x i32> %a0) { 871; SSE2-LABEL: test_v8i32: 872; SSE2: # %bb.0: 873; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] 874; SSE2-NEXT: movdqa %xmm0, %xmm3 875; SSE2-NEXT: pxor %xmm2, %xmm3 876; SSE2-NEXT: movdqa %xmm1, %xmm4 877; SSE2-NEXT: pxor %xmm2, %xmm4 878; SSE2-NEXT: pcmpgtd %xmm3, %xmm4 879; SSE2-NEXT: pand %xmm4, %xmm0 880; SSE2-NEXT: pandn %xmm1, %xmm4 881; SSE2-NEXT: por %xmm0, %xmm4 882; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1] 883; SSE2-NEXT: movdqa %xmm4, %xmm1 884; SSE2-NEXT: pxor %xmm2, %xmm1 885; SSE2-NEXT: movdqa %xmm0, %xmm3 886; SSE2-NEXT: pxor %xmm2, %xmm3 887; SSE2-NEXT: pcmpgtd %xmm1, %xmm3 888; SSE2-NEXT: pand %xmm3, %xmm4 889; SSE2-NEXT: pandn %xmm0, %xmm3 890; SSE2-NEXT: por %xmm4, %xmm3 891; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3] 892; SSE2-NEXT: movdqa %xmm3, %xmm1 893; SSE2-NEXT: pxor %xmm2, %xmm1 894; SSE2-NEXT: pxor %xmm0, %xmm2 895; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 896; SSE2-NEXT: pand %xmm2, %xmm3 897; SSE2-NEXT: pandn %xmm0, %xmm2 898; SSE2-NEXT: por %xmm3, %xmm2 899; SSE2-NEXT: movd %xmm2, %eax 900; SSE2-NEXT: retq 901; 902; SSE41-LABEL: test_v8i32: 903; SSE41: # %bb.0: 904; SSE41-NEXT: pminud %xmm1, %xmm0 905; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 906; SSE41-NEXT: pminud %xmm0, %xmm1 907; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 908; SSE41-NEXT: pminud %xmm1, %xmm0 909; SSE41-NEXT: movd %xmm0, %eax 910; SSE41-NEXT: retq 911; 912; AVX1-LABEL: test_v8i32: 913; AVX1: # %bb.0: 914; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 915; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0 916; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 917; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0 918; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 919; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0 920; AVX1-NEXT: vmovd %xmm0, %eax 921; AVX1-NEXT: vzeroupper 922; AVX1-NEXT: retq 923; 924; AVX2-LABEL: test_v8i32: 925; AVX2: # %bb.0: 926; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 927; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0 928; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 929; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0 930; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 931; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0 932; AVX2-NEXT: vmovd %xmm0, %eax 933; AVX2-NEXT: vzeroupper 934; AVX2-NEXT: retq 935; 936; AVX512-LABEL: test_v8i32: 937; AVX512: # %bb.0: 938; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 939; AVX512-NEXT: vpminud %ymm1, %ymm0, %ymm0 940; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 941; AVX512-NEXT: vpminud %ymm1, %ymm0, %ymm0 942; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 943; AVX512-NEXT: vpminud %ymm1, %ymm0, %ymm0 944; AVX512-NEXT: vmovd %xmm0, %eax 945; AVX512-NEXT: vzeroupper 946; AVX512-NEXT: retq 947 %1 = call i32 @llvm.experimental.vector.reduce.umin.i32.v8i32(<8 x i32> %a0) 948 ret i32 %1 949} 950 951define i32 @test_v16i32(<16 x i32> %a0) { 952; SSE2-LABEL: test_v16i32: 953; SSE2: # %bb.0: 954; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] 955; SSE2-NEXT: movdqa %xmm1, %xmm5 956; SSE2-NEXT: pxor %xmm4, %xmm5 957; SSE2-NEXT: movdqa %xmm3, %xmm6 958; SSE2-NEXT: pxor %xmm4, %xmm6 959; SSE2-NEXT: pcmpgtd %xmm5, %xmm6 960; SSE2-NEXT: pand %xmm6, %xmm1 961; SSE2-NEXT: pandn %xmm3, %xmm6 962; SSE2-NEXT: por %xmm1, %xmm6 963; SSE2-NEXT: movdqa %xmm0, %xmm1 964; SSE2-NEXT: pxor %xmm4, %xmm1 965; SSE2-NEXT: movdqa %xmm2, %xmm3 966; SSE2-NEXT: pxor %xmm4, %xmm3 967; SSE2-NEXT: pcmpgtd %xmm1, %xmm3 968; SSE2-NEXT: pand %xmm3, %xmm0 969; SSE2-NEXT: pandn %xmm2, %xmm3 970; SSE2-NEXT: por %xmm0, %xmm3 971; SSE2-NEXT: movdqa %xmm3, %xmm0 972; SSE2-NEXT: pxor %xmm4, %xmm0 973; SSE2-NEXT: movdqa %xmm6, %xmm1 974; SSE2-NEXT: pxor %xmm4, %xmm1 975; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 976; SSE2-NEXT: pand %xmm1, %xmm3 977; SSE2-NEXT: pandn %xmm6, %xmm1 978; SSE2-NEXT: por %xmm3, %xmm1 979; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1] 980; SSE2-NEXT: movdqa %xmm1, %xmm2 981; SSE2-NEXT: pxor %xmm4, %xmm2 982; SSE2-NEXT: movdqa %xmm0, %xmm3 983; SSE2-NEXT: pxor %xmm4, %xmm3 984; SSE2-NEXT: pcmpgtd %xmm2, %xmm3 985; SSE2-NEXT: pand %xmm3, %xmm1 986; SSE2-NEXT: pandn %xmm0, %xmm3 987; SSE2-NEXT: por %xmm1, %xmm3 988; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3] 989; SSE2-NEXT: movdqa %xmm3, %xmm1 990; SSE2-NEXT: pxor %xmm4, %xmm1 991; SSE2-NEXT: pxor %xmm0, %xmm4 992; SSE2-NEXT: pcmpgtd %xmm1, %xmm4 993; SSE2-NEXT: pand %xmm4, %xmm3 994; SSE2-NEXT: pandn %xmm0, %xmm4 995; SSE2-NEXT: por %xmm3, %xmm4 996; SSE2-NEXT: movd %xmm4, %eax 997; SSE2-NEXT: retq 998; 999; SSE41-LABEL: test_v16i32: 1000; SSE41: # %bb.0: 1001; SSE41-NEXT: pminud %xmm3, %xmm1 1002; SSE41-NEXT: pminud %xmm2, %xmm0 1003; SSE41-NEXT: pminud %xmm1, %xmm0 1004; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1005; SSE41-NEXT: pminud %xmm0, %xmm1 1006; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 1007; SSE41-NEXT: pminud %xmm1, %xmm0 1008; SSE41-NEXT: movd %xmm0, %eax 1009; SSE41-NEXT: retq 1010; 1011; AVX1-LABEL: test_v16i32: 1012; AVX1: # %bb.0: 1013; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1014; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1015; AVX1-NEXT: vpminud %xmm2, %xmm3, %xmm2 1016; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0 1017; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0 1018; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1019; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0 1020; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1021; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0 1022; AVX1-NEXT: vmovd %xmm0, %eax 1023; AVX1-NEXT: vzeroupper 1024; AVX1-NEXT: retq 1025; 1026; AVX2-LABEL: test_v16i32: 1027; AVX2: # %bb.0: 1028; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0 1029; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1030; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0 1031; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1032; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0 1033; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1034; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0 1035; AVX2-NEXT: vmovd %xmm0, %eax 1036; AVX2-NEXT: vzeroupper 1037; AVX2-NEXT: retq 1038; 1039; AVX512-LABEL: test_v16i32: 1040; AVX512: # %bb.0: 1041; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1042; AVX512-NEXT: vpminud %zmm1, %zmm0, %zmm0 1043; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 1044; AVX512-NEXT: vpminud %zmm1, %zmm0, %zmm0 1045; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1046; AVX512-NEXT: vpminud %zmm1, %zmm0, %zmm0 1047; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1048; AVX512-NEXT: vpminud %zmm1, %zmm0, %zmm0 1049; AVX512-NEXT: vmovd %xmm0, %eax 1050; AVX512-NEXT: vzeroupper 1051; AVX512-NEXT: retq 1052 %1 = call i32 @llvm.experimental.vector.reduce.umin.i32.v16i32(<16 x i32> %a0) 1053 ret i32 %1 1054} 1055 1056define i32 @test_v32i32(<32 x i32> %a0) { 1057; SSE2-LABEL: test_v32i32: 1058; SSE2: # %bb.0: 1059; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648] 1060; SSE2-NEXT: movdqa %xmm2, %xmm10 1061; SSE2-NEXT: pxor %xmm8, %xmm10 1062; SSE2-NEXT: movdqa %xmm6, %xmm9 1063; SSE2-NEXT: pxor %xmm8, %xmm9 1064; SSE2-NEXT: pcmpgtd %xmm10, %xmm9 1065; SSE2-NEXT: pand %xmm9, %xmm2 1066; SSE2-NEXT: pandn %xmm6, %xmm9 1067; SSE2-NEXT: por %xmm2, %xmm9 1068; SSE2-NEXT: movdqa %xmm0, %xmm6 1069; SSE2-NEXT: pxor %xmm8, %xmm6 1070; SSE2-NEXT: movdqa %xmm4, %xmm2 1071; SSE2-NEXT: pxor %xmm8, %xmm2 1072; SSE2-NEXT: pcmpgtd %xmm6, %xmm2 1073; SSE2-NEXT: pand %xmm2, %xmm0 1074; SSE2-NEXT: pandn %xmm4, %xmm2 1075; SSE2-NEXT: por %xmm0, %xmm2 1076; SSE2-NEXT: movdqa %xmm3, %xmm0 1077; SSE2-NEXT: pxor %xmm8, %xmm0 1078; SSE2-NEXT: movdqa %xmm7, %xmm4 1079; SSE2-NEXT: pxor %xmm8, %xmm4 1080; SSE2-NEXT: pcmpgtd %xmm0, %xmm4 1081; SSE2-NEXT: pand %xmm4, %xmm3 1082; SSE2-NEXT: pandn %xmm7, %xmm4 1083; SSE2-NEXT: por %xmm3, %xmm4 1084; SSE2-NEXT: movdqa %xmm1, %xmm0 1085; SSE2-NEXT: pxor %xmm8, %xmm0 1086; SSE2-NEXT: movdqa %xmm5, %xmm3 1087; SSE2-NEXT: pxor %xmm8, %xmm3 1088; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 1089; SSE2-NEXT: pand %xmm3, %xmm1 1090; SSE2-NEXT: pandn %xmm5, %xmm3 1091; SSE2-NEXT: por %xmm1, %xmm3 1092; SSE2-NEXT: movdqa %xmm3, %xmm0 1093; SSE2-NEXT: pxor %xmm8, %xmm0 1094; SSE2-NEXT: movdqa %xmm4, %xmm1 1095; SSE2-NEXT: pxor %xmm8, %xmm1 1096; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 1097; SSE2-NEXT: pand %xmm1, %xmm3 1098; SSE2-NEXT: pandn %xmm4, %xmm1 1099; SSE2-NEXT: por %xmm3, %xmm1 1100; SSE2-NEXT: movdqa %xmm2, %xmm0 1101; SSE2-NEXT: pxor %xmm8, %xmm0 1102; SSE2-NEXT: movdqa %xmm9, %xmm3 1103; SSE2-NEXT: pxor %xmm8, %xmm3 1104; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 1105; SSE2-NEXT: pand %xmm3, %xmm2 1106; SSE2-NEXT: pandn %xmm9, %xmm3 1107; SSE2-NEXT: por %xmm2, %xmm3 1108; SSE2-NEXT: movdqa %xmm3, %xmm0 1109; SSE2-NEXT: pxor %xmm8, %xmm0 1110; SSE2-NEXT: movdqa %xmm1, %xmm2 1111; SSE2-NEXT: pxor %xmm8, %xmm2 1112; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 1113; SSE2-NEXT: pand %xmm2, %xmm3 1114; SSE2-NEXT: pandn %xmm1, %xmm2 1115; SSE2-NEXT: por %xmm3, %xmm2 1116; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1] 1117; SSE2-NEXT: movdqa %xmm2, %xmm1 1118; SSE2-NEXT: pxor %xmm8, %xmm1 1119; SSE2-NEXT: movdqa %xmm0, %xmm3 1120; SSE2-NEXT: pxor %xmm8, %xmm3 1121; SSE2-NEXT: pcmpgtd %xmm1, %xmm3 1122; SSE2-NEXT: pand %xmm3, %xmm2 1123; SSE2-NEXT: pandn %xmm0, %xmm3 1124; SSE2-NEXT: por %xmm2, %xmm3 1125; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3] 1126; SSE2-NEXT: movdqa %xmm3, %xmm1 1127; SSE2-NEXT: pxor %xmm8, %xmm1 1128; SSE2-NEXT: pxor %xmm0, %xmm8 1129; SSE2-NEXT: pcmpgtd %xmm1, %xmm8 1130; SSE2-NEXT: pand %xmm8, %xmm3 1131; SSE2-NEXT: pandn %xmm0, %xmm8 1132; SSE2-NEXT: por %xmm3, %xmm8 1133; SSE2-NEXT: movd %xmm8, %eax 1134; SSE2-NEXT: retq 1135; 1136; SSE41-LABEL: test_v32i32: 1137; SSE41: # %bb.0: 1138; SSE41-NEXT: pminud %xmm6, %xmm2 1139; SSE41-NEXT: pminud %xmm4, %xmm0 1140; SSE41-NEXT: pminud %xmm2, %xmm0 1141; SSE41-NEXT: pminud %xmm7, %xmm3 1142; SSE41-NEXT: pminud %xmm5, %xmm1 1143; SSE41-NEXT: pminud %xmm3, %xmm1 1144; SSE41-NEXT: pminud %xmm0, %xmm1 1145; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1] 1146; SSE41-NEXT: pminud %xmm1, %xmm0 1147; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1148; SSE41-NEXT: pminud %xmm0, %xmm1 1149; SSE41-NEXT: movd %xmm1, %eax 1150; SSE41-NEXT: retq 1151; 1152; AVX1-LABEL: test_v32i32: 1153; AVX1: # %bb.0: 1154; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm4 1155; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm5 1156; AVX1-NEXT: vpminud %xmm4, %xmm5, %xmm4 1157; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3 1158; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 1159; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm1 1160; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2 1161; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 1162; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0 1163; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0 1164; AVX1-NEXT: vpminud %xmm0, %xmm4, %xmm0 1165; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1166; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0 1167; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1168; AVX1-NEXT: vpminud %xmm1, %xmm0, %xmm0 1169; AVX1-NEXT: vmovd %xmm0, %eax 1170; AVX1-NEXT: vzeroupper 1171; AVX1-NEXT: retq 1172; 1173; AVX2-LABEL: test_v32i32: 1174; AVX2: # %bb.0: 1175; AVX2-NEXT: vpminud %ymm3, %ymm1, %ymm1 1176; AVX2-NEXT: vpminud %ymm2, %ymm0, %ymm0 1177; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0 1178; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1179; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0 1180; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1181; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0 1182; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1183; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0 1184; AVX2-NEXT: vmovd %xmm0, %eax 1185; AVX2-NEXT: vzeroupper 1186; AVX2-NEXT: retq 1187; 1188; AVX512-LABEL: test_v32i32: 1189; AVX512: # %bb.0: 1190; AVX512-NEXT: vpminud %zmm1, %zmm0, %zmm0 1191; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1192; AVX512-NEXT: vpminud %zmm1, %zmm0, %zmm0 1193; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 1194; AVX512-NEXT: vpminud %zmm1, %zmm0, %zmm0 1195; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1196; AVX512-NEXT: vpminud %zmm1, %zmm0, %zmm0 1197; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 1198; AVX512-NEXT: vpminud %zmm1, %zmm0, %zmm0 1199; AVX512-NEXT: vmovd %xmm0, %eax 1200; AVX512-NEXT: vzeroupper 1201; AVX512-NEXT: retq 1202 %1 = call i32 @llvm.experimental.vector.reduce.umin.i32.v32i32(<32 x i32> %a0) 1203 ret i32 %1 1204} 1205 1206; 1207; vXi16 1208; 1209 1210define i16 @test_v2i16(<2 x i16> %a0) { 1211; SSE2-LABEL: test_v2i16: 1212; SSE2: # %bb.0: 1213; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [65535,0,0,0,65535,0,0,0] 1214; SSE2-NEXT: pand %xmm0, %xmm1 1215; SSE2-NEXT: pxor %xmm2, %xmm2 1216; SSE2-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 1217; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 1218; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] 1219; SSE2-NEXT: movdqa %xmm1, %xmm3 1220; SSE2-NEXT: por %xmm2, %xmm3 1221; SSE2-NEXT: por %xmm0, %xmm2 1222; SSE2-NEXT: movdqa %xmm2, %xmm4 1223; SSE2-NEXT: pcmpgtd %xmm3, %xmm4 1224; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1225; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 1226; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1227; SSE2-NEXT: pand %xmm5, %xmm2 1228; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 1229; SSE2-NEXT: por %xmm2, %xmm3 1230; SSE2-NEXT: pand %xmm3, %xmm1 1231; SSE2-NEXT: pandn %xmm0, %xmm3 1232; SSE2-NEXT: por %xmm1, %xmm3 1233; SSE2-NEXT: movd %xmm3, %eax 1234; SSE2-NEXT: # kill: def $ax killed $ax killed $eax 1235; SSE2-NEXT: retq 1236; 1237; SSE41-LABEL: test_v2i16: 1238; SSE41: # %bb.0: 1239; SSE41-NEXT: pxor %xmm1, %xmm1 1240; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7] 1241; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1242; SSE41-NEXT: pmovzxwq {{.*#+}} xmm2 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 1243; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] 1244; SSE41-NEXT: movdqa %xmm1, %xmm0 1245; SSE41-NEXT: por %xmm3, %xmm0 1246; SSE41-NEXT: por %xmm2, %xmm3 1247; SSE41-NEXT: movdqa %xmm3, %xmm4 1248; SSE41-NEXT: pcmpeqd %xmm0, %xmm4 1249; SSE41-NEXT: pcmpgtd %xmm0, %xmm3 1250; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2] 1251; SSE41-NEXT: pand %xmm4, %xmm0 1252; SSE41-NEXT: por %xmm3, %xmm0 1253; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2 1254; SSE41-NEXT: movd %xmm2, %eax 1255; SSE41-NEXT: # kill: def $ax killed $ax killed $eax 1256; SSE41-NEXT: retq 1257; 1258; AVX-LABEL: test_v2i16: 1259; AVX: # %bb.0: 1260; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1 1261; AVX-NEXT: vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7] 1262; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1263; AVX-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 1264; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2 1265; AVX-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0 1266; AVX-NEXT: vmovd %xmm0, %eax 1267; AVX-NEXT: # kill: def $ax killed $ax killed $eax 1268; AVX-NEXT: retq 1269; 1270; AVX512BW-LABEL: test_v2i16: 1271; AVX512BW: # %bb.0: 1272; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1 1273; AVX512BW-NEXT: vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7] 1274; AVX512BW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1275; AVX512BW-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 1276; AVX512BW-NEXT: vpminuq %zmm0, %zmm1, %zmm0 1277; AVX512BW-NEXT: vmovd %xmm0, %eax 1278; AVX512BW-NEXT: # kill: def $ax killed $ax killed $eax 1279; AVX512BW-NEXT: vzeroupper 1280; AVX512BW-NEXT: retq 1281; 1282; AVX512VL-LABEL: test_v2i16: 1283; AVX512VL: # %bb.0: 1284; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1 1285; AVX512VL-NEXT: vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7] 1286; AVX512VL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1287; AVX512VL-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 1288; AVX512VL-NEXT: vpminuq %xmm0, %xmm1, %xmm0 1289; AVX512VL-NEXT: vmovd %xmm0, %eax 1290; AVX512VL-NEXT: # kill: def $ax killed $ax killed $eax 1291; AVX512VL-NEXT: retq 1292 %1 = call i16 @llvm.experimental.vector.reduce.umin.i16.v2i16(<2 x i16> %a0) 1293 ret i16 %1 1294} 1295 1296define i16 @test_v4i16(<4 x i16> %a0) { 1297; SSE2-LABEL: test_v4i16: 1298; SSE2: # %bb.0: 1299; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [65535,0,65535,0,65535,0,65535,0] 1300; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1] 1301; SSE2-NEXT: pand %xmm1, %xmm0 1302; SSE2-NEXT: pand {{.*}}(%rip), %xmm2 1303; SSE2-NEXT: movdqa %xmm2, %xmm3 1304; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 1305; SSE2-NEXT: pand %xmm3, %xmm0 1306; SSE2-NEXT: pandn %xmm2, %xmm3 1307; SSE2-NEXT: por %xmm0, %xmm3 1308; SSE2-NEXT: pand %xmm3, %xmm1 1309; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3] 1310; SSE2-NEXT: pxor %xmm2, %xmm2 1311; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1312; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 1313; SSE2-NEXT: movdqa %xmm0, %xmm2 1314; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 1315; SSE2-NEXT: pand %xmm2, %xmm1 1316; SSE2-NEXT: pandn %xmm0, %xmm2 1317; SSE2-NEXT: por %xmm1, %xmm2 1318; SSE2-NEXT: movd %xmm2, %eax 1319; SSE2-NEXT: # kill: def $ax killed $ax killed $eax 1320; SSE2-NEXT: retq 1321; 1322; SSE41-LABEL: test_v4i16: 1323; SSE41: # %bb.0: 1324; SSE41-NEXT: pxor %xmm1, %xmm1 1325; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1] 1326; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7] 1327; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0],xmm1[1],xmm2[2],xmm1[3,4,5,6,7] 1328; SSE41-NEXT: pminud %xmm0, %xmm2 1329; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3],xmm2[4],xmm1[5],xmm2[6],xmm1[7] 1330; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3] 1331; SSE41-NEXT: pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 1332; SSE41-NEXT: pminud %xmm1, %xmm0 1333; SSE41-NEXT: movd %xmm0, %eax 1334; SSE41-NEXT: # kill: def $ax killed $ax killed $eax 1335; SSE41-NEXT: retq 1336; 1337; AVX-LABEL: test_v4i16: 1338; AVX: # %bb.0: 1339; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1 1340; AVX-NEXT: vpblendw {{.*#+}} xmm2 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7] 1341; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1342; AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3,4,5,6,7] 1343; AVX-NEXT: vpminud %xmm0, %xmm2, %xmm0 1344; AVX-NEXT: vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7] 1345; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 1346; AVX-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 1347; AVX-NEXT: vpminud %xmm0, %xmm1, %xmm0 1348; AVX-NEXT: vmovd %xmm0, %eax 1349; AVX-NEXT: # kill: def $ax killed $ax killed $eax 1350; AVX-NEXT: retq 1351; 1352; AVX512-LABEL: test_v4i16: 1353; AVX512: # %bb.0: 1354; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1 1355; AVX512-NEXT: vpblendw {{.*#+}} xmm2 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7] 1356; AVX512-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1357; AVX512-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3,4,5,6,7] 1358; AVX512-NEXT: vpminud %xmm0, %xmm2, %xmm0 1359; AVX512-NEXT: vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7] 1360; AVX512-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 1361; AVX512-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero 1362; AVX512-NEXT: vpminud %xmm0, %xmm1, %xmm0 1363; AVX512-NEXT: vmovd %xmm0, %eax 1364; AVX512-NEXT: # kill: def $ax killed $ax killed $eax 1365; AVX512-NEXT: retq 1366 %1 = call i16 @llvm.experimental.vector.reduce.umin.i16.v4i16(<4 x i16> %a0) 1367 ret i16 %1 1368} 1369 1370define i16 @test_v8i16(<8 x i16> %a0) { 1371; SSE2-LABEL: test_v8i16: 1372; SSE2: # %bb.0: 1373; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1374; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768] 1375; SSE2-NEXT: pxor %xmm2, %xmm0 1376; SSE2-NEXT: pxor %xmm2, %xmm1 1377; SSE2-NEXT: pminsw %xmm0, %xmm1 1378; SSE2-NEXT: movdqa %xmm1, %xmm0 1379; SSE2-NEXT: pxor %xmm2, %xmm0 1380; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 1381; SSE2-NEXT: pxor %xmm2, %xmm0 1382; SSE2-NEXT: pminsw %xmm1, %xmm0 1383; SSE2-NEXT: movdqa %xmm0, %xmm1 1384; SSE2-NEXT: pxor %xmm2, %xmm1 1385; SSE2-NEXT: psrld $16, %xmm1 1386; SSE2-NEXT: pxor %xmm2, %xmm1 1387; SSE2-NEXT: pminsw %xmm0, %xmm1 1388; SSE2-NEXT: movd %xmm1, %eax 1389; SSE2-NEXT: xorl $32768, %eax # imm = 0x8000 1390; SSE2-NEXT: # kill: def $ax killed $ax killed $eax 1391; SSE2-NEXT: retq 1392; 1393; SSE41-LABEL: test_v8i16: 1394; SSE41: # %bb.0: 1395; SSE41-NEXT: phminposuw %xmm0, %xmm0 1396; SSE41-NEXT: movd %xmm0, %eax 1397; SSE41-NEXT: # kill: def $ax killed $ax killed $eax 1398; SSE41-NEXT: retq 1399; 1400; AVX-LABEL: test_v8i16: 1401; AVX: # %bb.0: 1402; AVX-NEXT: vphminposuw %xmm0, %xmm0 1403; AVX-NEXT: vmovd %xmm0, %eax 1404; AVX-NEXT: # kill: def $ax killed $ax killed $eax 1405; AVX-NEXT: retq 1406; 1407; AVX512-LABEL: test_v8i16: 1408; AVX512: # %bb.0: 1409; AVX512-NEXT: vphminposuw %xmm0, %xmm0 1410; AVX512-NEXT: vmovd %xmm0, %eax 1411; AVX512-NEXT: # kill: def $ax killed $ax killed $eax 1412; AVX512-NEXT: retq 1413 %1 = call i16 @llvm.experimental.vector.reduce.umin.i16.v8i16(<8 x i16> %a0) 1414 ret i16 %1 1415} 1416 1417define i16 @test_v16i16(<16 x i16> %a0) { 1418; SSE2-LABEL: test_v16i16: 1419; SSE2: # %bb.0: 1420; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768] 1421; SSE2-NEXT: pxor %xmm2, %xmm1 1422; SSE2-NEXT: pxor %xmm2, %xmm0 1423; SSE2-NEXT: pminsw %xmm1, %xmm0 1424; SSE2-NEXT: movdqa %xmm0, %xmm1 1425; SSE2-NEXT: pxor %xmm2, %xmm1 1426; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1] 1427; SSE2-NEXT: pxor %xmm2, %xmm1 1428; SSE2-NEXT: pminsw %xmm0, %xmm1 1429; SSE2-NEXT: movdqa %xmm1, %xmm0 1430; SSE2-NEXT: pxor %xmm2, %xmm0 1431; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 1432; SSE2-NEXT: pxor %xmm2, %xmm0 1433; SSE2-NEXT: pminsw %xmm1, %xmm0 1434; SSE2-NEXT: movdqa %xmm0, %xmm1 1435; SSE2-NEXT: pxor %xmm2, %xmm1 1436; SSE2-NEXT: psrld $16, %xmm1 1437; SSE2-NEXT: pxor %xmm2, %xmm1 1438; SSE2-NEXT: pminsw %xmm0, %xmm1 1439; SSE2-NEXT: movd %xmm1, %eax 1440; SSE2-NEXT: xorl $32768, %eax # imm = 0x8000 1441; SSE2-NEXT: # kill: def $ax killed $ax killed $eax 1442; SSE2-NEXT: retq 1443; 1444; SSE41-LABEL: test_v16i16: 1445; SSE41: # %bb.0: 1446; SSE41-NEXT: pminuw %xmm1, %xmm0 1447; SSE41-NEXT: phminposuw %xmm0, %xmm0 1448; SSE41-NEXT: movd %xmm0, %eax 1449; SSE41-NEXT: # kill: def $ax killed $ax killed $eax 1450; SSE41-NEXT: retq 1451; 1452; AVX1-LABEL: test_v16i16: 1453; AVX1: # %bb.0: 1454; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1455; AVX1-NEXT: vpminuw %xmm1, %xmm0, %xmm0 1456; AVX1-NEXT: vphminposuw %xmm0, %xmm0 1457; AVX1-NEXT: vmovd %xmm0, %eax 1458; AVX1-NEXT: # kill: def $ax killed $ax killed $eax 1459; AVX1-NEXT: vzeroupper 1460; AVX1-NEXT: retq 1461; 1462; AVX2-LABEL: test_v16i16: 1463; AVX2: # %bb.0: 1464; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1465; AVX2-NEXT: vpminuw %xmm1, %xmm0, %xmm0 1466; AVX2-NEXT: vphminposuw %xmm0, %xmm0 1467; AVX2-NEXT: vmovd %xmm0, %eax 1468; AVX2-NEXT: # kill: def $ax killed $ax killed $eax 1469; AVX2-NEXT: vzeroupper 1470; AVX2-NEXT: retq 1471; 1472; AVX512-LABEL: test_v16i16: 1473; AVX512: # %bb.0: 1474; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 1475; AVX512-NEXT: vpminuw %xmm1, %xmm0, %xmm0 1476; AVX512-NEXT: vphminposuw %xmm0, %xmm0 1477; AVX512-NEXT: vmovd %xmm0, %eax 1478; AVX512-NEXT: # kill: def $ax killed $ax killed $eax 1479; AVX512-NEXT: vzeroupper 1480; AVX512-NEXT: retq 1481 %1 = call i16 @llvm.experimental.vector.reduce.umin.i16.v16i16(<16 x i16> %a0) 1482 ret i16 %1 1483} 1484 1485define i16 @test_v32i16(<32 x i16> %a0) { 1486; SSE2-LABEL: test_v32i16: 1487; SSE2: # %bb.0: 1488; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768] 1489; SSE2-NEXT: pxor %xmm4, %xmm3 1490; SSE2-NEXT: pxor %xmm4, %xmm1 1491; SSE2-NEXT: pminsw %xmm3, %xmm1 1492; SSE2-NEXT: pxor %xmm4, %xmm2 1493; SSE2-NEXT: pxor %xmm4, %xmm0 1494; SSE2-NEXT: pminsw %xmm2, %xmm0 1495; SSE2-NEXT: pminsw %xmm1, %xmm0 1496; SSE2-NEXT: movdqa %xmm0, %xmm1 1497; SSE2-NEXT: pxor %xmm4, %xmm1 1498; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1] 1499; SSE2-NEXT: pxor %xmm4, %xmm1 1500; SSE2-NEXT: pminsw %xmm0, %xmm1 1501; SSE2-NEXT: movdqa %xmm1, %xmm0 1502; SSE2-NEXT: pxor %xmm4, %xmm0 1503; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 1504; SSE2-NEXT: pxor %xmm4, %xmm0 1505; SSE2-NEXT: pminsw %xmm1, %xmm0 1506; SSE2-NEXT: movdqa %xmm0, %xmm1 1507; SSE2-NEXT: pxor %xmm4, %xmm1 1508; SSE2-NEXT: psrld $16, %xmm1 1509; SSE2-NEXT: pxor %xmm4, %xmm1 1510; SSE2-NEXT: pminsw %xmm0, %xmm1 1511; SSE2-NEXT: movd %xmm1, %eax 1512; SSE2-NEXT: xorl $32768, %eax # imm = 0x8000 1513; SSE2-NEXT: # kill: def $ax killed $ax killed $eax 1514; SSE2-NEXT: retq 1515; 1516; SSE41-LABEL: test_v32i16: 1517; SSE41: # %bb.0: 1518; SSE41-NEXT: pminuw %xmm3, %xmm1 1519; SSE41-NEXT: pminuw %xmm2, %xmm0 1520; SSE41-NEXT: pminuw %xmm1, %xmm0 1521; SSE41-NEXT: phminposuw %xmm0, %xmm0 1522; SSE41-NEXT: movd %xmm0, %eax 1523; SSE41-NEXT: # kill: def $ax killed $ax killed $eax 1524; SSE41-NEXT: retq 1525; 1526; AVX1-LABEL: test_v32i16: 1527; AVX1: # %bb.0: 1528; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1529; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1530; AVX1-NEXT: vpminuw %xmm2, %xmm3, %xmm2 1531; AVX1-NEXT: vpminuw %xmm1, %xmm0, %xmm0 1532; AVX1-NEXT: vpminuw %xmm2, %xmm0, %xmm0 1533; AVX1-NEXT: vphminposuw %xmm0, %xmm0 1534; AVX1-NEXT: vmovd %xmm0, %eax 1535; AVX1-NEXT: # kill: def $ax killed $ax killed $eax 1536; AVX1-NEXT: vzeroupper 1537; AVX1-NEXT: retq 1538; 1539; AVX2-LABEL: test_v32i16: 1540; AVX2: # %bb.0: 1541; AVX2-NEXT: vpminuw %ymm1, %ymm0, %ymm0 1542; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1543; AVX2-NEXT: vpminuw %xmm1, %xmm0, %xmm0 1544; AVX2-NEXT: vphminposuw %xmm0, %xmm0 1545; AVX2-NEXT: vmovd %xmm0, %eax 1546; AVX2-NEXT: # kill: def $ax killed $ax killed $eax 1547; AVX2-NEXT: vzeroupper 1548; AVX2-NEXT: retq 1549; 1550; AVX512-LABEL: test_v32i16: 1551; AVX512: # %bb.0: 1552; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1553; AVX512-NEXT: vpminuw %ymm1, %ymm0, %ymm0 1554; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 1555; AVX512-NEXT: vpminuw %xmm1, %xmm0, %xmm0 1556; AVX512-NEXT: vphminposuw %xmm0, %xmm0 1557; AVX512-NEXT: vmovd %xmm0, %eax 1558; AVX512-NEXT: # kill: def $ax killed $ax killed $eax 1559; AVX512-NEXT: vzeroupper 1560; AVX512-NEXT: retq 1561 %1 = call i16 @llvm.experimental.vector.reduce.umin.i16.v32i16(<32 x i16> %a0) 1562 ret i16 %1 1563} 1564 1565define i16 @test_v64i16(<64 x i16> %a0) { 1566; SSE2-LABEL: test_v64i16: 1567; SSE2: # %bb.0: 1568; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [32768,32768,32768,32768,32768,32768,32768,32768] 1569; SSE2-NEXT: pxor %xmm8, %xmm6 1570; SSE2-NEXT: pxor %xmm8, %xmm2 1571; SSE2-NEXT: pminsw %xmm6, %xmm2 1572; SSE2-NEXT: pxor %xmm8, %xmm4 1573; SSE2-NEXT: pxor %xmm8, %xmm0 1574; SSE2-NEXT: pminsw %xmm4, %xmm0 1575; SSE2-NEXT: pminsw %xmm2, %xmm0 1576; SSE2-NEXT: pxor %xmm8, %xmm7 1577; SSE2-NEXT: pxor %xmm8, %xmm3 1578; SSE2-NEXT: pminsw %xmm7, %xmm3 1579; SSE2-NEXT: pxor %xmm8, %xmm5 1580; SSE2-NEXT: pxor %xmm8, %xmm1 1581; SSE2-NEXT: pminsw %xmm5, %xmm1 1582; SSE2-NEXT: pminsw %xmm3, %xmm1 1583; SSE2-NEXT: pminsw %xmm0, %xmm1 1584; SSE2-NEXT: movdqa %xmm1, %xmm0 1585; SSE2-NEXT: pxor %xmm8, %xmm0 1586; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1587; SSE2-NEXT: pxor %xmm8, %xmm0 1588; SSE2-NEXT: pminsw %xmm1, %xmm0 1589; SSE2-NEXT: movdqa %xmm0, %xmm1 1590; SSE2-NEXT: pxor %xmm8, %xmm1 1591; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,2,3] 1592; SSE2-NEXT: pxor %xmm8, %xmm1 1593; SSE2-NEXT: pminsw %xmm0, %xmm1 1594; SSE2-NEXT: movdqa %xmm1, %xmm0 1595; SSE2-NEXT: pxor %xmm8, %xmm0 1596; SSE2-NEXT: psrld $16, %xmm0 1597; SSE2-NEXT: pxor %xmm8, %xmm0 1598; SSE2-NEXT: pminsw %xmm1, %xmm0 1599; SSE2-NEXT: movd %xmm0, %eax 1600; SSE2-NEXT: xorl $32768, %eax # imm = 0x8000 1601; SSE2-NEXT: # kill: def $ax killed $ax killed $eax 1602; SSE2-NEXT: retq 1603; 1604; SSE41-LABEL: test_v64i16: 1605; SSE41: # %bb.0: 1606; SSE41-NEXT: pminuw %xmm7, %xmm3 1607; SSE41-NEXT: pminuw %xmm5, %xmm1 1608; SSE41-NEXT: pminuw %xmm3, %xmm1 1609; SSE41-NEXT: pminuw %xmm6, %xmm2 1610; SSE41-NEXT: pminuw %xmm4, %xmm0 1611; SSE41-NEXT: pminuw %xmm2, %xmm0 1612; SSE41-NEXT: pminuw %xmm1, %xmm0 1613; SSE41-NEXT: phminposuw %xmm0, %xmm0 1614; SSE41-NEXT: movd %xmm0, %eax 1615; SSE41-NEXT: # kill: def $ax killed $ax killed $eax 1616; SSE41-NEXT: retq 1617; 1618; AVX1-LABEL: test_v64i16: 1619; AVX1: # %bb.0: 1620; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 1621; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 1622; AVX1-NEXT: vpminuw %xmm4, %xmm5, %xmm4 1623; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 1624; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 1625; AVX1-NEXT: vpminuw %xmm5, %xmm6, %xmm5 1626; AVX1-NEXT: vpminuw %xmm4, %xmm5, %xmm4 1627; AVX1-NEXT: vpminuw %xmm3, %xmm1, %xmm1 1628; AVX1-NEXT: vpminuw %xmm2, %xmm0, %xmm0 1629; AVX1-NEXT: vpminuw %xmm1, %xmm0, %xmm0 1630; AVX1-NEXT: vpminuw %xmm4, %xmm0, %xmm0 1631; AVX1-NEXT: vphminposuw %xmm0, %xmm0 1632; AVX1-NEXT: vmovd %xmm0, %eax 1633; AVX1-NEXT: # kill: def $ax killed $ax killed $eax 1634; AVX1-NEXT: vzeroupper 1635; AVX1-NEXT: retq 1636; 1637; AVX2-LABEL: test_v64i16: 1638; AVX2: # %bb.0: 1639; AVX2-NEXT: vpminuw %ymm3, %ymm1, %ymm1 1640; AVX2-NEXT: vpminuw %ymm2, %ymm0, %ymm0 1641; AVX2-NEXT: vpminuw %ymm1, %ymm0, %ymm0 1642; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1643; AVX2-NEXT: vpminuw %xmm1, %xmm0, %xmm0 1644; AVX2-NEXT: vphminposuw %xmm0, %xmm0 1645; AVX2-NEXT: vmovd %xmm0, %eax 1646; AVX2-NEXT: # kill: def $ax killed $ax killed $eax 1647; AVX2-NEXT: vzeroupper 1648; AVX2-NEXT: retq 1649; 1650; AVX512-LABEL: test_v64i16: 1651; AVX512: # %bb.0: 1652; AVX512-NEXT: vpminuw %zmm1, %zmm0, %zmm0 1653; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1654; AVX512-NEXT: vpminuw %ymm1, %ymm0, %ymm0 1655; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 1656; AVX512-NEXT: vpminuw %xmm1, %xmm0, %xmm0 1657; AVX512-NEXT: vphminposuw %xmm0, %xmm0 1658; AVX512-NEXT: vmovd %xmm0, %eax 1659; AVX512-NEXT: # kill: def $ax killed $ax killed $eax 1660; AVX512-NEXT: vzeroupper 1661; AVX512-NEXT: retq 1662 %1 = call i16 @llvm.experimental.vector.reduce.umin.i16.v64i16(<64 x i16> %a0) 1663 ret i16 %1 1664} 1665 1666; 1667; vXi8 1668; 1669 1670define i8 @test_v2i8(<2 x i8> %a0) { 1671; SSE2-LABEL: test_v2i8: 1672; SSE2: # %bb.0: 1673; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0] 1674; SSE2-NEXT: pand %xmm0, %xmm1 1675; SSE2-NEXT: pxor %xmm2, %xmm2 1676; SSE2-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm2[8],xmm0[9],xmm2[9],xmm0[10],xmm2[10],xmm0[11],xmm2[11],xmm0[12],xmm2[12],xmm0[13],xmm2[13],xmm0[14],xmm2[14],xmm0[15],xmm2[15] 1677; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1678; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 1679; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] 1680; SSE2-NEXT: movdqa %xmm1, %xmm3 1681; SSE2-NEXT: por %xmm2, %xmm3 1682; SSE2-NEXT: por %xmm0, %xmm2 1683; SSE2-NEXT: movdqa %xmm2, %xmm4 1684; SSE2-NEXT: pcmpgtd %xmm3, %xmm4 1685; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 1686; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 1687; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 1688; SSE2-NEXT: pand %xmm5, %xmm2 1689; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 1690; SSE2-NEXT: por %xmm2, %xmm3 1691; SSE2-NEXT: pand %xmm3, %xmm1 1692; SSE2-NEXT: pandn %xmm0, %xmm3 1693; SSE2-NEXT: por %xmm1, %xmm3 1694; SSE2-NEXT: movd %xmm3, %eax 1695; SSE2-NEXT: # kill: def $al killed $al killed $eax 1696; SSE2-NEXT: retq 1697; 1698; SSE41-LABEL: test_v2i8: 1699; SSE41: # %bb.0: 1700; SSE41-NEXT: movdqa %xmm0, %xmm1 1701; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1702; SSE41-NEXT: pand {{.*}}(%rip), %xmm1 1703; SSE41-NEXT: pmovzxbq {{.*#+}} xmm2 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 1704; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] 1705; SSE41-NEXT: movdqa %xmm1, %xmm0 1706; SSE41-NEXT: por %xmm3, %xmm0 1707; SSE41-NEXT: por %xmm2, %xmm3 1708; SSE41-NEXT: movdqa %xmm3, %xmm4 1709; SSE41-NEXT: pcmpeqd %xmm0, %xmm4 1710; SSE41-NEXT: pcmpgtd %xmm0, %xmm3 1711; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2] 1712; SSE41-NEXT: pand %xmm4, %xmm0 1713; SSE41-NEXT: por %xmm3, %xmm0 1714; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2 1715; SSE41-NEXT: pextrb $0, %xmm2, %eax 1716; SSE41-NEXT: # kill: def $al killed $al killed $eax 1717; SSE41-NEXT: retq 1718; 1719; AVX-LABEL: test_v2i8: 1720; AVX: # %bb.0: 1721; AVX-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm1 1722; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1723; AVX-NEXT: vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 1724; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2 1725; AVX-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0 1726; AVX-NEXT: vpextrb $0, %xmm0, %eax 1727; AVX-NEXT: # kill: def $al killed $al killed $eax 1728; AVX-NEXT: retq 1729; 1730; AVX512BW-LABEL: test_v2i8: 1731; AVX512BW: # %bb.0: 1732; AVX512BW-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm1 1733; AVX512BW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1734; AVX512BW-NEXT: vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 1735; AVX512BW-NEXT: vpminuq %zmm0, %zmm1, %zmm0 1736; AVX512BW-NEXT: vpextrb $0, %xmm0, %eax 1737; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 1738; AVX512BW-NEXT: vzeroupper 1739; AVX512BW-NEXT: retq 1740; 1741; AVX512VL-LABEL: test_v2i8: 1742; AVX512VL: # %bb.0: 1743; AVX512VL-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm1 1744; AVX512VL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1745; AVX512VL-NEXT: vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 1746; AVX512VL-NEXT: vpminuq %xmm0, %xmm1, %xmm0 1747; AVX512VL-NEXT: vpextrb $0, %xmm0, %eax 1748; AVX512VL-NEXT: # kill: def $al killed $al killed $eax 1749; AVX512VL-NEXT: retq 1750 %1 = call i8 @llvm.experimental.vector.reduce.umin.i8.v2i8(<2 x i8> %a0) 1751 ret i8 %1 1752} 1753 1754define i8 @test_v4i8(<4 x i8> %a0) { 1755; SSE2-LABEL: test_v4i8: 1756; SSE2: # %bb.0: 1757; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] 1758; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1] 1759; SSE2-NEXT: pand %xmm1, %xmm0 1760; SSE2-NEXT: pand {{.*}}(%rip), %xmm2 1761; SSE2-NEXT: movdqa %xmm2, %xmm3 1762; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 1763; SSE2-NEXT: pand %xmm3, %xmm0 1764; SSE2-NEXT: pandn %xmm2, %xmm3 1765; SSE2-NEXT: por %xmm0, %xmm3 1766; SSE2-NEXT: pand %xmm3, %xmm1 1767; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3] 1768; SSE2-NEXT: pxor %xmm2, %xmm2 1769; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 1770; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1771; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 1772; SSE2-NEXT: movdqa %xmm0, %xmm2 1773; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 1774; SSE2-NEXT: pand %xmm2, %xmm1 1775; SSE2-NEXT: pandn %xmm0, %xmm2 1776; SSE2-NEXT: por %xmm1, %xmm2 1777; SSE2-NEXT: movd %xmm2, %eax 1778; SSE2-NEXT: # kill: def $al killed $al killed $eax 1779; SSE2-NEXT: retq 1780; 1781; SSE41-LABEL: test_v4i8: 1782; SSE41: # %bb.0: 1783; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] 1784; SSE41-NEXT: movdqa %xmm0, %xmm2 1785; SSE41-NEXT: pand %xmm1, %xmm2 1786; SSE41-NEXT: pshufb {{.*#+}} xmm0 = xmm0[8],zero,zero,zero,xmm0[12],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 1787; SSE41-NEXT: pminud %xmm2, %xmm0 1788; SSE41-NEXT: pand %xmm0, %xmm1 1789; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 1790; SSE41-NEXT: pmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 1791; SSE41-NEXT: pminud %xmm1, %xmm0 1792; SSE41-NEXT: pextrb $0, %xmm0, %eax 1793; SSE41-NEXT: # kill: def $al killed $al killed $eax 1794; SSE41-NEXT: retq 1795; 1796; AVX1-LABEL: test_v4i8: 1797; AVX1: # %bb.0: 1798; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [3.57331108E-43,3.57331108E-43,3.57331108E-43,3.57331108E-43] 1799; AVX1-NEXT: vandps %xmm1, %xmm0, %xmm2 1800; AVX1-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[8],zero,zero,zero,xmm0[12],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 1801; AVX1-NEXT: vpminud %xmm0, %xmm2, %xmm0 1802; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm1 1803; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 1804; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 1805; AVX1-NEXT: vpminud %xmm0, %xmm1, %xmm0 1806; AVX1-NEXT: vpextrb $0, %xmm0, %eax 1807; AVX1-NEXT: # kill: def $al killed $al killed $eax 1808; AVX1-NEXT: retq 1809; 1810; AVX2-LABEL: test_v4i8: 1811; AVX2: # %bb.0: 1812; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [255,255,255,255] 1813; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm2 1814; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[8],zero,zero,zero,xmm0[12],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 1815; AVX2-NEXT: vpminud %xmm0, %xmm2, %xmm0 1816; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm1 1817; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 1818; AVX2-NEXT: vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 1819; AVX2-NEXT: vpminud %xmm0, %xmm1, %xmm0 1820; AVX2-NEXT: vpextrb $0, %xmm0, %eax 1821; AVX2-NEXT: # kill: def $al killed $al killed $eax 1822; AVX2-NEXT: retq 1823; 1824; AVX512-LABEL: test_v4i8: 1825; AVX512: # %bb.0: 1826; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm1 = [255,255,255,255] 1827; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm2 1828; AVX512-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[8],zero,zero,zero,xmm0[12],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 1829; AVX512-NEXT: vpminud %xmm0, %xmm2, %xmm0 1830; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm1 1831; AVX512-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 1832; AVX512-NEXT: vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 1833; AVX512-NEXT: vpminud %xmm0, %xmm1, %xmm0 1834; AVX512-NEXT: vpextrb $0, %xmm0, %eax 1835; AVX512-NEXT: # kill: def $al killed $al killed $eax 1836; AVX512-NEXT: retq 1837 %1 = call i8 @llvm.experimental.vector.reduce.umin.i8.v4i8(<4 x i8> %a0) 1838 ret i8 %1 1839} 1840 1841define i8 @test_v8i8(<8 x i8> %a0) { 1842; SSE2-LABEL: test_v8i8: 1843; SSE2: # %bb.0: 1844; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0] 1845; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1] 1846; SSE2-NEXT: pand %xmm1, %xmm0 1847; SSE2-NEXT: pand {{.*}}(%rip), %xmm2 1848; SSE2-NEXT: pminsw %xmm0, %xmm2 1849; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3] 1850; SSE2-NEXT: pand %xmm1, %xmm2 1851; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 1852; SSE2-NEXT: pminsw %xmm2, %xmm0 1853; SSE2-NEXT: pand %xmm0, %xmm1 1854; SSE2-NEXT: psrld $16, %xmm0 1855; SSE2-NEXT: pxor %xmm2, %xmm2 1856; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 1857; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] 1858; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 1859; SSE2-NEXT: pminsw %xmm1, %xmm0 1860; SSE2-NEXT: movd %xmm0, %eax 1861; SSE2-NEXT: # kill: def $al killed $al killed $eax 1862; SSE2-NEXT: retq 1863; 1864; SSE41-LABEL: test_v8i8: 1865; SSE41: # %bb.0: 1866; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0] 1867; SSE41-NEXT: movdqa %xmm0, %xmm2 1868; SSE41-NEXT: pand %xmm1, %xmm2 1869; SSE41-NEXT: pshufb {{.*#+}} xmm0 = xmm0[8],zero,xmm0[10],zero,xmm0[12],zero,xmm0[14],zero,zero,zero,zero,zero,zero,zero,zero,zero 1870; SSE41-NEXT: pminuw %xmm2, %xmm0 1871; SSE41-NEXT: movdqa %xmm0, %xmm2 1872; SSE41-NEXT: pand %xmm1, %xmm2 1873; SSE41-NEXT: pshufb {{.*#+}} xmm0 = xmm0[4],zero,xmm0[6],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 1874; SSE41-NEXT: pminuw %xmm2, %xmm0 1875; SSE41-NEXT: pand %xmm0, %xmm1 1876; SSE41-NEXT: psrld $16, %xmm0 1877; SSE41-NEXT: pmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 1878; SSE41-NEXT: pminuw %xmm1, %xmm0 1879; SSE41-NEXT: pextrb $0, %xmm0, %eax 1880; SSE41-NEXT: # kill: def $al killed $al killed $eax 1881; SSE41-NEXT: retq 1882; 1883; AVX1-LABEL: test_v8i8: 1884; AVX1: # %bb.0: 1885; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0] 1886; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm2 1887; AVX1-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[8],zero,xmm0[10],zero,xmm0[12],zero,xmm0[14],zero,zero,zero,zero,zero,zero,zero,zero,zero 1888; AVX1-NEXT: vpminuw %xmm0, %xmm2, %xmm0 1889; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm2 1890; AVX1-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[4],zero,xmm0[6],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 1891; AVX1-NEXT: vpminuw %xmm0, %xmm2, %xmm0 1892; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm1 1893; AVX1-NEXT: vpsrld $16, %xmm0, %xmm0 1894; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 1895; AVX1-NEXT: vpminuw %xmm0, %xmm1, %xmm0 1896; AVX1-NEXT: vpextrb $0, %xmm0, %eax 1897; AVX1-NEXT: # kill: def $al killed $al killed $eax 1898; AVX1-NEXT: retq 1899; 1900; AVX2-LABEL: test_v8i8: 1901; AVX2: # %bb.0: 1902; AVX2-NEXT: vpbroadcastw {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255] 1903; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm2 1904; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[8],zero,xmm0[10],zero,xmm0[12],zero,xmm0[14],zero,zero,zero,zero,zero,zero,zero,zero,zero 1905; AVX2-NEXT: vpminuw %xmm0, %xmm2, %xmm0 1906; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm2 1907; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[4],zero,xmm0[6],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 1908; AVX2-NEXT: vpminuw %xmm0, %xmm2, %xmm0 1909; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm1 1910; AVX2-NEXT: vpsrld $16, %xmm0, %xmm0 1911; AVX2-NEXT: vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 1912; AVX2-NEXT: vpminuw %xmm0, %xmm1, %xmm0 1913; AVX2-NEXT: vpextrb $0, %xmm0, %eax 1914; AVX2-NEXT: # kill: def $al killed $al killed $eax 1915; AVX2-NEXT: retq 1916; 1917; AVX512-LABEL: test_v8i8: 1918; AVX512: # %bb.0: 1919; AVX512-NEXT: vpbroadcastw {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255] 1920; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm2 1921; AVX512-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[8],zero,xmm0[10],zero,xmm0[12],zero,xmm0[14],zero,zero,zero,zero,zero,zero,zero,zero,zero 1922; AVX512-NEXT: vpminuw %xmm0, %xmm2, %xmm0 1923; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm2 1924; AVX512-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[4],zero,xmm0[6],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 1925; AVX512-NEXT: vpminuw %xmm0, %xmm2, %xmm0 1926; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm1 1927; AVX512-NEXT: vpsrld $16, %xmm0, %xmm0 1928; AVX512-NEXT: vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero 1929; AVX512-NEXT: vpminuw %xmm0, %xmm1, %xmm0 1930; AVX512-NEXT: vpextrb $0, %xmm0, %eax 1931; AVX512-NEXT: # kill: def $al killed $al killed $eax 1932; AVX512-NEXT: retq 1933 %1 = call i8 @llvm.experimental.vector.reduce.umin.i8.v8i8(<8 x i8> %a0) 1934 ret i8 %1 1935} 1936 1937define i8 @test_v16i8(<16 x i8> %a0) { 1938; SSE2-LABEL: test_v16i8: 1939; SSE2: # %bb.0: 1940; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1941; SSE2-NEXT: pminub %xmm0, %xmm1 1942; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 1943; SSE2-NEXT: pminub %xmm1, %xmm0 1944; SSE2-NEXT: movdqa %xmm0, %xmm1 1945; SSE2-NEXT: psrld $16, %xmm1 1946; SSE2-NEXT: pminub %xmm0, %xmm1 1947; SSE2-NEXT: movdqa %xmm1, %xmm0 1948; SSE2-NEXT: psrlw $8, %xmm0 1949; SSE2-NEXT: pminub %xmm1, %xmm0 1950; SSE2-NEXT: movd %xmm0, %eax 1951; SSE2-NEXT: # kill: def $al killed $al killed $eax 1952; SSE2-NEXT: retq 1953; 1954; SSE41-LABEL: test_v16i8: 1955; SSE41: # %bb.0: 1956; SSE41-NEXT: movdqa %xmm0, %xmm1 1957; SSE41-NEXT: psrlw $8, %xmm1 1958; SSE41-NEXT: pminub %xmm0, %xmm1 1959; SSE41-NEXT: phminposuw %xmm1, %xmm0 1960; SSE41-NEXT: pextrb $0, %xmm0, %eax 1961; SSE41-NEXT: # kill: def $al killed $al killed $eax 1962; SSE41-NEXT: retq 1963; 1964; AVX-LABEL: test_v16i8: 1965; AVX: # %bb.0: 1966; AVX-NEXT: vpsrlw $8, %xmm0, %xmm1 1967; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm0 1968; AVX-NEXT: vphminposuw %xmm0, %xmm0 1969; AVX-NEXT: vpextrb $0, %xmm0, %eax 1970; AVX-NEXT: # kill: def $al killed $al killed $eax 1971; AVX-NEXT: retq 1972; 1973; AVX512-LABEL: test_v16i8: 1974; AVX512: # %bb.0: 1975; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1 1976; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0 1977; AVX512-NEXT: vphminposuw %xmm0, %xmm0 1978; AVX512-NEXT: vpextrb $0, %xmm0, %eax 1979; AVX512-NEXT: # kill: def $al killed $al killed $eax 1980; AVX512-NEXT: retq 1981 %1 = call i8 @llvm.experimental.vector.reduce.umin.i8.v16i8(<16 x i8> %a0) 1982 ret i8 %1 1983} 1984 1985define i8 @test_v32i8(<32 x i8> %a0) { 1986; SSE2-LABEL: test_v32i8: 1987; SSE2: # %bb.0: 1988; SSE2-NEXT: pminub %xmm1, %xmm0 1989; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 1990; SSE2-NEXT: pminub %xmm0, %xmm1 1991; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 1992; SSE2-NEXT: pminub %xmm1, %xmm0 1993; SSE2-NEXT: movdqa %xmm0, %xmm1 1994; SSE2-NEXT: psrld $16, %xmm1 1995; SSE2-NEXT: pminub %xmm0, %xmm1 1996; SSE2-NEXT: movdqa %xmm1, %xmm0 1997; SSE2-NEXT: psrlw $8, %xmm0 1998; SSE2-NEXT: pminub %xmm1, %xmm0 1999; SSE2-NEXT: movd %xmm0, %eax 2000; SSE2-NEXT: # kill: def $al killed $al killed $eax 2001; SSE2-NEXT: retq 2002; 2003; SSE41-LABEL: test_v32i8: 2004; SSE41: # %bb.0: 2005; SSE41-NEXT: pminub %xmm1, %xmm0 2006; SSE41-NEXT: movdqa %xmm0, %xmm1 2007; SSE41-NEXT: psrlw $8, %xmm1 2008; SSE41-NEXT: pminub %xmm0, %xmm1 2009; SSE41-NEXT: phminposuw %xmm1, %xmm0 2010; SSE41-NEXT: pextrb $0, %xmm0, %eax 2011; SSE41-NEXT: # kill: def $al killed $al killed $eax 2012; SSE41-NEXT: retq 2013; 2014; AVX1-LABEL: test_v32i8: 2015; AVX1: # %bb.0: 2016; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 2017; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0 2018; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1 2019; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0 2020; AVX1-NEXT: vphminposuw %xmm0, %xmm0 2021; AVX1-NEXT: vpextrb $0, %xmm0, %eax 2022; AVX1-NEXT: # kill: def $al killed $al killed $eax 2023; AVX1-NEXT: vzeroupper 2024; AVX1-NEXT: retq 2025; 2026; AVX2-LABEL: test_v32i8: 2027; AVX2: # %bb.0: 2028; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 2029; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0 2030; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1 2031; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0 2032; AVX2-NEXT: vphminposuw %xmm0, %xmm0 2033; AVX2-NEXT: vpextrb $0, %xmm0, %eax 2034; AVX2-NEXT: # kill: def $al killed $al killed $eax 2035; AVX2-NEXT: vzeroupper 2036; AVX2-NEXT: retq 2037; 2038; AVX512-LABEL: test_v32i8: 2039; AVX512: # %bb.0: 2040; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 2041; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0 2042; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1 2043; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0 2044; AVX512-NEXT: vphminposuw %xmm0, %xmm0 2045; AVX512-NEXT: vpextrb $0, %xmm0, %eax 2046; AVX512-NEXT: # kill: def $al killed $al killed $eax 2047; AVX512-NEXT: vzeroupper 2048; AVX512-NEXT: retq 2049 %1 = call i8 @llvm.experimental.vector.reduce.umin.i8.v32i8(<32 x i8> %a0) 2050 ret i8 %1 2051} 2052 2053define i8 @test_v64i8(<64 x i8> %a0) { 2054; SSE2-LABEL: test_v64i8: 2055; SSE2: # %bb.0: 2056; SSE2-NEXT: pminub %xmm3, %xmm1 2057; SSE2-NEXT: pminub %xmm2, %xmm0 2058; SSE2-NEXT: pminub %xmm1, %xmm0 2059; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] 2060; SSE2-NEXT: pminub %xmm0, %xmm1 2061; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] 2062; SSE2-NEXT: pminub %xmm1, %xmm0 2063; SSE2-NEXT: movdqa %xmm0, %xmm1 2064; SSE2-NEXT: psrld $16, %xmm1 2065; SSE2-NEXT: pminub %xmm0, %xmm1 2066; SSE2-NEXT: movdqa %xmm1, %xmm0 2067; SSE2-NEXT: psrlw $8, %xmm0 2068; SSE2-NEXT: pminub %xmm1, %xmm0 2069; SSE2-NEXT: movd %xmm0, %eax 2070; SSE2-NEXT: # kill: def $al killed $al killed $eax 2071; SSE2-NEXT: retq 2072; 2073; SSE41-LABEL: test_v64i8: 2074; SSE41: # %bb.0: 2075; SSE41-NEXT: pminub %xmm3, %xmm1 2076; SSE41-NEXT: pminub %xmm2, %xmm0 2077; SSE41-NEXT: pminub %xmm1, %xmm0 2078; SSE41-NEXT: movdqa %xmm0, %xmm1 2079; SSE41-NEXT: psrlw $8, %xmm1 2080; SSE41-NEXT: pminub %xmm0, %xmm1 2081; SSE41-NEXT: phminposuw %xmm1, %xmm0 2082; SSE41-NEXT: pextrb $0, %xmm0, %eax 2083; SSE41-NEXT: # kill: def $al killed $al killed $eax 2084; SSE41-NEXT: retq 2085; 2086; AVX1-LABEL: test_v64i8: 2087; AVX1: # %bb.0: 2088; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 2089; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 2090; AVX1-NEXT: vpminub %xmm2, %xmm3, %xmm2 2091; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0 2092; AVX1-NEXT: vpminub %xmm2, %xmm0, %xmm0 2093; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1 2094; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0 2095; AVX1-NEXT: vphminposuw %xmm0, %xmm0 2096; AVX1-NEXT: vpextrb $0, %xmm0, %eax 2097; AVX1-NEXT: # kill: def $al killed $al killed $eax 2098; AVX1-NEXT: vzeroupper 2099; AVX1-NEXT: retq 2100; 2101; AVX2-LABEL: test_v64i8: 2102; AVX2: # %bb.0: 2103; AVX2-NEXT: vpminub %ymm1, %ymm0, %ymm0 2104; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 2105; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0 2106; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1 2107; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0 2108; AVX2-NEXT: vphminposuw %xmm0, %xmm0 2109; AVX2-NEXT: vpextrb $0, %xmm0, %eax 2110; AVX2-NEXT: # kill: def $al killed $al killed $eax 2111; AVX2-NEXT: vzeroupper 2112; AVX2-NEXT: retq 2113; 2114; AVX512-LABEL: test_v64i8: 2115; AVX512: # %bb.0: 2116; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1 2117; AVX512-NEXT: vpminub %ymm1, %ymm0, %ymm0 2118; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 2119; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0 2120; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1 2121; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0 2122; AVX512-NEXT: vphminposuw %xmm0, %xmm0 2123; AVX512-NEXT: vpextrb $0, %xmm0, %eax 2124; AVX512-NEXT: # kill: def $al killed $al killed $eax 2125; AVX512-NEXT: vzeroupper 2126; AVX512-NEXT: retq 2127 %1 = call i8 @llvm.experimental.vector.reduce.umin.i8.v64i8(<64 x i8> %a0) 2128 ret i8 %1 2129} 2130 2131define i8 @test_v128i8(<128 x i8> %a0) { 2132; SSE2-LABEL: test_v128i8: 2133; SSE2: # %bb.0: 2134; SSE2-NEXT: pminub %xmm6, %xmm2 2135; SSE2-NEXT: pminub %xmm4, %xmm0 2136; SSE2-NEXT: pminub %xmm2, %xmm0 2137; SSE2-NEXT: pminub %xmm7, %xmm3 2138; SSE2-NEXT: pminub %xmm5, %xmm1 2139; SSE2-NEXT: pminub %xmm3, %xmm1 2140; SSE2-NEXT: pminub %xmm0, %xmm1 2141; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1] 2142; SSE2-NEXT: pminub %xmm1, %xmm0 2143; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] 2144; SSE2-NEXT: pminub %xmm0, %xmm1 2145; SSE2-NEXT: movdqa %xmm1, %xmm0 2146; SSE2-NEXT: psrld $16, %xmm0 2147; SSE2-NEXT: pminub %xmm1, %xmm0 2148; SSE2-NEXT: movdqa %xmm0, %xmm1 2149; SSE2-NEXT: psrlw $8, %xmm1 2150; SSE2-NEXT: pminub %xmm0, %xmm1 2151; SSE2-NEXT: movd %xmm1, %eax 2152; SSE2-NEXT: # kill: def $al killed $al killed $eax 2153; SSE2-NEXT: retq 2154; 2155; SSE41-LABEL: test_v128i8: 2156; SSE41: # %bb.0: 2157; SSE41-NEXT: pminub %xmm7, %xmm3 2158; SSE41-NEXT: pminub %xmm5, %xmm1 2159; SSE41-NEXT: pminub %xmm3, %xmm1 2160; SSE41-NEXT: pminub %xmm6, %xmm2 2161; SSE41-NEXT: pminub %xmm4, %xmm0 2162; SSE41-NEXT: pminub %xmm2, %xmm0 2163; SSE41-NEXT: pminub %xmm1, %xmm0 2164; SSE41-NEXT: movdqa %xmm0, %xmm1 2165; SSE41-NEXT: psrlw $8, %xmm1 2166; SSE41-NEXT: pminub %xmm0, %xmm1 2167; SSE41-NEXT: phminposuw %xmm1, %xmm0 2168; SSE41-NEXT: pextrb $0, %xmm0, %eax 2169; SSE41-NEXT: # kill: def $al killed $al killed $eax 2170; SSE41-NEXT: retq 2171; 2172; AVX1-LABEL: test_v128i8: 2173; AVX1: # %bb.0: 2174; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 2175; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 2176; AVX1-NEXT: vpminub %xmm4, %xmm5, %xmm4 2177; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 2178; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 2179; AVX1-NEXT: vpminub %xmm5, %xmm6, %xmm5 2180; AVX1-NEXT: vpminub %xmm4, %xmm5, %xmm4 2181; AVX1-NEXT: vpminub %xmm3, %xmm1, %xmm1 2182; AVX1-NEXT: vpminub %xmm2, %xmm0, %xmm0 2183; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0 2184; AVX1-NEXT: vpminub %xmm4, %xmm0, %xmm0 2185; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1 2186; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0 2187; AVX1-NEXT: vphminposuw %xmm0, %xmm0 2188; AVX1-NEXT: vpextrb $0, %xmm0, %eax 2189; AVX1-NEXT: # kill: def $al killed $al killed $eax 2190; AVX1-NEXT: vzeroupper 2191; AVX1-NEXT: retq 2192; 2193; AVX2-LABEL: test_v128i8: 2194; AVX2: # %bb.0: 2195; AVX2-NEXT: vpminub %ymm3, %ymm1, %ymm1 2196; AVX2-NEXT: vpminub %ymm2, %ymm0, %ymm0 2197; AVX2-NEXT: vpminub %ymm1, %ymm0, %ymm0 2198; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 2199; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0 2200; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1 2201; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0 2202; AVX2-NEXT: vphminposuw %xmm0, %xmm0 2203; AVX2-NEXT: vpextrb $0, %xmm0, %eax 2204; AVX2-NEXT: # kill: def $al killed $al killed $eax 2205; AVX2-NEXT: vzeroupper 2206; AVX2-NEXT: retq 2207; 2208; AVX512-LABEL: test_v128i8: 2209; AVX512: # %bb.0: 2210; AVX512-NEXT: vpminub %zmm1, %zmm0, %zmm0 2211; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1 2212; AVX512-NEXT: vpminub %ymm1, %ymm0, %ymm0 2213; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 2214; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0 2215; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1 2216; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0 2217; AVX512-NEXT: vphminposuw %xmm0, %xmm0 2218; AVX512-NEXT: vpextrb $0, %xmm0, %eax 2219; AVX512-NEXT: # kill: def $al killed $al killed $eax 2220; AVX512-NEXT: vzeroupper 2221; AVX512-NEXT: retq 2222 %1 = call i8 @llvm.experimental.vector.reduce.umin.i8.v128i8(<128 x i8> %a0) 2223 ret i8 %1 2224} 2225 2226declare i64 @llvm.experimental.vector.reduce.umin.i64.v2i64(<2 x i64>) 2227declare i64 @llvm.experimental.vector.reduce.umin.i64.v4i64(<4 x i64>) 2228declare i64 @llvm.experimental.vector.reduce.umin.i64.v8i64(<8 x i64>) 2229declare i64 @llvm.experimental.vector.reduce.umin.i64.v16i64(<16 x i64>) 2230 2231declare i32 @llvm.experimental.vector.reduce.umin.i32.v2i32(<2 x i32>) 2232declare i32 @llvm.experimental.vector.reduce.umin.i32.v4i32(<4 x i32>) 2233declare i32 @llvm.experimental.vector.reduce.umin.i32.v8i32(<8 x i32>) 2234declare i32 @llvm.experimental.vector.reduce.umin.i32.v16i32(<16 x i32>) 2235declare i32 @llvm.experimental.vector.reduce.umin.i32.v32i32(<32 x i32>) 2236 2237declare i16 @llvm.experimental.vector.reduce.umin.i16.v2i16(<2 x i16>) 2238declare i16 @llvm.experimental.vector.reduce.umin.i16.v4i16(<4 x i16>) 2239declare i16 @llvm.experimental.vector.reduce.umin.i16.v8i16(<8 x i16>) 2240declare i16 @llvm.experimental.vector.reduce.umin.i16.v16i16(<16 x i16>) 2241declare i16 @llvm.experimental.vector.reduce.umin.i16.v32i16(<32 x i16>) 2242declare i16 @llvm.experimental.vector.reduce.umin.i16.v64i16(<64 x i16>) 2243 2244declare i8 @llvm.experimental.vector.reduce.umin.i8.v2i8(<2 x i8>) 2245declare i8 @llvm.experimental.vector.reduce.umin.i8.v4i8(<4 x i8>) 2246declare i8 @llvm.experimental.vector.reduce.umin.i8.v8i8(<8 x i8>) 2247declare i8 @llvm.experimental.vector.reduce.umin.i8.v16i8(<16 x i8>) 2248declare i8 @llvm.experimental.vector.reduce.umin.i8.v32i8(<32 x i8>) 2249declare i8 @llvm.experimental.vector.reduce.umin.i8.v64i8(<64 x i8>) 2250declare i8 @llvm.experimental.vector.reduce.umin.i8.v128i8(<128 x i8>) 2251