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