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