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