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