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