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