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 %xmm3, %xmm4 23; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 24; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 25; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 26; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 27; SSE2-NEXT: pand %xmm5, %xmm2 28; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 29; SSE2-NEXT: por %xmm2, %xmm3 30; SSE2-NEXT: pand %xmm3, %xmm0 31; SSE2-NEXT: pandn %xmm1, %xmm3 32; SSE2-NEXT: por %xmm0, %xmm3 33; SSE2-NEXT: movq %xmm3, %rax 34; SSE2-NEXT: retq 35; 36; SSE41-LABEL: test_v2i64: 37; SSE41: # %bb.0: 38; SSE41-NEXT: movdqa %xmm0, %xmm1 39; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3] 40; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] 41; SSE41-NEXT: movdqa %xmm0, %xmm4 42; SSE41-NEXT: pxor %xmm3, %xmm4 43; SSE41-NEXT: pxor %xmm2, %xmm3 44; SSE41-NEXT: movdqa %xmm4, %xmm0 45; SSE41-NEXT: pcmpeqd %xmm3, %xmm0 46; SSE41-NEXT: pcmpgtd %xmm3, %xmm4 47; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm4[0,0,2,2] 48; SSE41-NEXT: pand %xmm3, %xmm0 49; SSE41-NEXT: por %xmm4, %xmm0 50; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2 51; SSE41-NEXT: movq %xmm2, %rax 52; SSE41-NEXT: retq 53; 54; SSE42-LABEL: test_v2i64: 55; SSE42: # %bb.0: 56; SSE42-NEXT: movdqa %xmm0, %xmm1 57; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3] 58; SSE42-NEXT: pcmpgtq %xmm2, %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 %xmm1, %xmm0, %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: vpmaxsq %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: vpmaxsq %xmm1, %xmm0, %xmm0 84; AVX512VL-NEXT: vmovq %xmm0, %rax 85; AVX512VL-NEXT: retq 86 %1 = call i64 @llvm.vector.reduce.smax.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 %xmm1, %xmm3 95; SSE2-NEXT: pxor %xmm2, %xmm3 96; SSE2-NEXT: movdqa %xmm0, %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 %xmm1, %xmm3 114; SSE2-NEXT: pcmpgtd %xmm2, %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: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] 131; SSE41-NEXT: movdqa %xmm1, %xmm4 132; SSE41-NEXT: pxor %xmm3, %xmm4 133; SSE41-NEXT: movdqa %xmm0, %xmm5 134; SSE41-NEXT: pxor %xmm3, %xmm5 135; SSE41-NEXT: movdqa %xmm5, %xmm0 136; SSE41-NEXT: pcmpeqd %xmm4, %xmm0 137; SSE41-NEXT: pcmpgtd %xmm4, %xmm5 138; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm5[0,0,2,2] 139; SSE41-NEXT: pand %xmm4, %xmm0 140; SSE41-NEXT: por %xmm5, %xmm0 141; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1 142; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3] 143; SSE41-NEXT: movdqa %xmm1, %xmm4 144; SSE41-NEXT: pxor %xmm3, %xmm4 145; SSE41-NEXT: pxor %xmm2, %xmm3 146; SSE41-NEXT: movdqa %xmm4, %xmm5 147; SSE41-NEXT: pcmpeqd %xmm3, %xmm5 148; SSE41-NEXT: pcmpgtd %xmm3, %xmm4 149; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 150; SSE41-NEXT: pand %xmm5, %xmm0 151; SSE41-NEXT: por %xmm4, %xmm0 152; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2 153; SSE41-NEXT: movq %xmm2, %rax 154; SSE41-NEXT: retq 155; 156; SSE42-LABEL: test_v4i64: 157; SSE42: # %bb.0: 158; SSE42-NEXT: movdqa %xmm0, %xmm2 159; SSE42-NEXT: pcmpgtq %xmm1, %xmm0 160; SSE42-NEXT: blendvpd %xmm0, %xmm2, %xmm1 161; SSE42-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3] 162; SSE42-NEXT: movdqa %xmm1, %xmm0 163; SSE42-NEXT: pcmpgtq %xmm2, %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 %xmm1, %xmm0, %xmm2 172; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 173; AVX1-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,2,3] 174; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %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 %xmm1, %xmm0, %xmm2 184; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 185; AVX2-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,2,3] 186; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %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: vpmaxsq %zmm1, %zmm0, %zmm0 197; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 198; AVX512BW-NEXT: vpmaxsq %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: vpmaxsq %xmm1, %xmm0, %xmm0 207; AVX512VL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 208; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 209; AVX512VL-NEXT: vmovq %xmm0, %rax 210; AVX512VL-NEXT: vzeroupper 211; AVX512VL-NEXT: retq 212 %1 = call i64 @llvm.vector.reduce.smax.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 %xmm2, %xmm5 221; SSE2-NEXT: pxor %xmm4, %xmm5 222; SSE2-NEXT: movdqa %xmm0, %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, %xmm0 233; SSE2-NEXT: pandn %xmm2, %xmm5 234; SSE2-NEXT: por %xmm0, %xmm5 235; SSE2-NEXT: movdqa %xmm3, %xmm0 236; SSE2-NEXT: pxor %xmm4, %xmm0 237; SSE2-NEXT: movdqa %xmm1, %xmm2 238; SSE2-NEXT: pxor %xmm4, %xmm2 239; SSE2-NEXT: movdqa %xmm2, %xmm6 240; SSE2-NEXT: pcmpgtd %xmm0, %xmm6 241; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 242; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 243; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 244; SSE2-NEXT: pand %xmm7, %xmm0 245; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3] 246; SSE2-NEXT: por %xmm0, %xmm2 247; SSE2-NEXT: pand %xmm2, %xmm1 248; SSE2-NEXT: pandn %xmm3, %xmm2 249; SSE2-NEXT: por %xmm1, %xmm2 250; SSE2-NEXT: movdqa %xmm2, %xmm0 251; SSE2-NEXT: pxor %xmm4, %xmm0 252; SSE2-NEXT: movdqa %xmm5, %xmm1 253; SSE2-NEXT: pxor %xmm4, %xmm1 254; SSE2-NEXT: movdqa %xmm1, %xmm3 255; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 256; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[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 = xmm3[1,1,3,3] 261; SSE2-NEXT: por %xmm0, %xmm1 262; SSE2-NEXT: pand %xmm1, %xmm5 263; SSE2-NEXT: pandn %xmm2, %xmm1 264; SSE2-NEXT: por %xmm5, %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 %xmm2, %xmm3 270; SSE2-NEXT: pcmpgtd %xmm4, %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: movdqa {{.*#+}} xmm5 = [2147483648,2147483648] 287; SSE41-NEXT: movdqa %xmm2, %xmm6 288; SSE41-NEXT: pxor %xmm5, %xmm6 289; SSE41-NEXT: movdqa %xmm0, %xmm7 290; SSE41-NEXT: pxor %xmm5, %xmm7 291; SSE41-NEXT: movdqa %xmm7, %xmm0 292; SSE41-NEXT: pcmpeqd %xmm6, %xmm0 293; SSE41-NEXT: pcmpgtd %xmm6, %xmm7 294; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm7[0,0,2,2] 295; SSE41-NEXT: pand %xmm6, %xmm0 296; SSE41-NEXT: por %xmm7, %xmm0 297; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2 298; SSE41-NEXT: movdqa %xmm3, %xmm0 299; SSE41-NEXT: pxor %xmm5, %xmm0 300; SSE41-NEXT: movdqa %xmm1, %xmm4 301; SSE41-NEXT: pxor %xmm5, %xmm4 302; SSE41-NEXT: movdqa %xmm4, %xmm6 303; SSE41-NEXT: pcmpeqd %xmm0, %xmm6 304; SSE41-NEXT: pcmpgtd %xmm0, %xmm4 305; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2] 306; SSE41-NEXT: pand %xmm6, %xmm0 307; SSE41-NEXT: por %xmm4, %xmm0 308; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm3 309; SSE41-NEXT: movapd %xmm3, %xmm0 310; SSE41-NEXT: xorpd %xmm5, %xmm0 311; SSE41-NEXT: movapd %xmm2, %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, %xmm2 322; SSE41-NEXT: pxor %xmm5, %xmm2 323; SSE41-NEXT: pxor %xmm1, %xmm5 324; SSE41-NEXT: movdqa %xmm2, %xmm4 325; SSE41-NEXT: pcmpeqd %xmm5, %xmm4 326; SSE41-NEXT: pcmpgtd %xmm5, %xmm2 327; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2] 328; SSE41-NEXT: pand %xmm4, %xmm0 329; SSE41-NEXT: por %xmm2, %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 %xmm1, %xmm0 338; SSE42-NEXT: pcmpgtq %xmm3, %xmm0 339; SSE42-NEXT: blendvpd %xmm0, %xmm1, %xmm3 340; SSE42-NEXT: movdqa %xmm4, %xmm0 341; SSE42-NEXT: pcmpgtq %xmm2, %xmm0 342; SSE42-NEXT: blendvpd %xmm0, %xmm4, %xmm2 343; SSE42-NEXT: movapd %xmm2, %xmm0 344; SSE42-NEXT: pcmpgtq %xmm3, %xmm0 345; SSE42-NEXT: blendvpd %xmm0, %xmm2, %xmm3 346; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3] 347; SSE42-NEXT: movdqa %xmm3, %xmm0 348; SSE42-NEXT: pcmpgtq %xmm1, %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 %xmm1, %xmm0, %xmm2 356; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 357; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 358; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm5 359; AVX1-NEXT: vblendvpd %xmm5, %xmm4, %xmm3, %xmm3 360; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 361; AVX1-NEXT: vpcmpgtq %xmm3, %xmm0, %xmm1 362; AVX1-NEXT: vblendvpd %xmm1, %xmm0, %xmm3, %xmm0 363; AVX1-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,2,3] 364; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %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 %ymm1, %ymm0, %ymm2 373; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 374; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1 375; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2 376; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 377; AVX2-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,2,3] 378; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %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: vpmaxsq %zmm1, %zmm0, %zmm0 388; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 389; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 390; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 391; AVX512BW-NEXT: vpmaxsq %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: vpmaxsq %zmm1, %zmm0, %zmm0 400; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm1 401; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 402; AVX512VL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 403; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 404; AVX512VL-NEXT: vmovq %xmm0, %rax 405; AVX512VL-NEXT: vzeroupper 406; AVX512VL-NEXT: retq 407 %1 = call i64 @llvm.vector.reduce.smax.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 %xmm5, %xmm9 416; SSE2-NEXT: pxor %xmm8, %xmm9 417; SSE2-NEXT: movdqa %xmm1, %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, %xmm1 428; SSE2-NEXT: pandn %xmm5, %xmm9 429; SSE2-NEXT: por %xmm1, %xmm9 430; SSE2-NEXT: movdqa %xmm7, %xmm1 431; SSE2-NEXT: pxor %xmm8, %xmm1 432; SSE2-NEXT: movdqa %xmm3, %xmm5 433; SSE2-NEXT: pxor %xmm8, %xmm5 434; SSE2-NEXT: movdqa %xmm5, %xmm10 435; SSE2-NEXT: pcmpgtd %xmm1, %xmm10 436; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2] 437; SSE2-NEXT: pcmpeqd %xmm1, %xmm5 438; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 439; SSE2-NEXT: pand %xmm11, %xmm5 440; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm10[1,1,3,3] 441; SSE2-NEXT: por %xmm5, %xmm1 442; SSE2-NEXT: pand %xmm1, %xmm3 443; SSE2-NEXT: pandn %xmm7, %xmm1 444; SSE2-NEXT: por %xmm3, %xmm1 445; SSE2-NEXT: movdqa %xmm4, %xmm3 446; SSE2-NEXT: pxor %xmm8, %xmm3 447; SSE2-NEXT: movdqa %xmm0, %xmm5 448; SSE2-NEXT: pxor %xmm8, %xmm5 449; SSE2-NEXT: movdqa %xmm5, %xmm7 450; SSE2-NEXT: pcmpgtd %xmm3, %xmm7 451; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2] 452; SSE2-NEXT: pcmpeqd %xmm3, %xmm5 453; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] 454; SSE2-NEXT: pand %xmm10, %xmm5 455; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm7[1,1,3,3] 456; SSE2-NEXT: por %xmm5, %xmm3 457; SSE2-NEXT: pand %xmm3, %xmm0 458; SSE2-NEXT: pandn %xmm4, %xmm3 459; SSE2-NEXT: por %xmm0, %xmm3 460; SSE2-NEXT: movdqa %xmm6, %xmm0 461; SSE2-NEXT: pxor %xmm8, %xmm0 462; SSE2-NEXT: movdqa %xmm2, %xmm4 463; SSE2-NEXT: pxor %xmm8, %xmm4 464; SSE2-NEXT: movdqa %xmm4, %xmm5 465; SSE2-NEXT: pcmpgtd %xmm0, %xmm5 466; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2] 467; SSE2-NEXT: pcmpeqd %xmm0, %xmm4 468; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3] 469; SSE2-NEXT: pand %xmm7, %xmm0 470; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] 471; SSE2-NEXT: por %xmm0, %xmm4 472; SSE2-NEXT: pand %xmm4, %xmm2 473; SSE2-NEXT: pandn %xmm6, %xmm4 474; SSE2-NEXT: por %xmm2, %xmm4 475; SSE2-NEXT: movdqa %xmm4, %xmm0 476; SSE2-NEXT: pxor %xmm8, %xmm0 477; SSE2-NEXT: movdqa %xmm3, %xmm2 478; SSE2-NEXT: pxor %xmm8, %xmm2 479; SSE2-NEXT: movdqa %xmm2, %xmm5 480; SSE2-NEXT: pcmpgtd %xmm0, %xmm5 481; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] 482; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 483; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 484; SSE2-NEXT: pand %xmm6, %xmm2 485; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3] 486; SSE2-NEXT: por %xmm2, %xmm0 487; SSE2-NEXT: pand %xmm0, %xmm3 488; SSE2-NEXT: pandn %xmm4, %xmm0 489; SSE2-NEXT: por %xmm3, %xmm0 490; SSE2-NEXT: movdqa %xmm1, %xmm2 491; SSE2-NEXT: pxor %xmm8, %xmm2 492; SSE2-NEXT: movdqa %xmm9, %xmm3 493; SSE2-NEXT: pxor %xmm8, %xmm3 494; SSE2-NEXT: movdqa %xmm3, %xmm4 495; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 496; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 497; SSE2-NEXT: pcmpeqd %xmm2, %xmm3 498; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3] 499; SSE2-NEXT: pand %xmm5, %xmm2 500; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 501; SSE2-NEXT: por %xmm2, %xmm3 502; SSE2-NEXT: pand %xmm3, %xmm9 503; SSE2-NEXT: pandn %xmm1, %xmm3 504; SSE2-NEXT: por %xmm9, %xmm3 505; SSE2-NEXT: movdqa %xmm3, %xmm1 506; SSE2-NEXT: pxor %xmm8, %xmm1 507; SSE2-NEXT: movdqa %xmm0, %xmm2 508; SSE2-NEXT: pxor %xmm8, %xmm2 509; SSE2-NEXT: movdqa %xmm2, %xmm4 510; SSE2-NEXT: pcmpgtd %xmm1, %xmm4 511; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] 512; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 513; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 514; SSE2-NEXT: pand %xmm5, %xmm1 515; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 516; SSE2-NEXT: por %xmm1, %xmm2 517; SSE2-NEXT: pand %xmm2, %xmm0 518; SSE2-NEXT: pandn %xmm3, %xmm2 519; SSE2-NEXT: por %xmm0, %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 %xmm1, %xmm3 525; SSE2-NEXT: pcmpgtd %xmm8, %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: movdqa {{.*#+}} xmm9 = [2147483648,2147483648] 542; SSE41-NEXT: movdqa %xmm5, %xmm0 543; SSE41-NEXT: pxor %xmm9, %xmm0 544; SSE41-NEXT: movdqa %xmm1, %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, %xmm1, %xmm5 553; SSE41-NEXT: movdqa %xmm7, %xmm0 554; SSE41-NEXT: pxor %xmm9, %xmm0 555; SSE41-NEXT: movdqa %xmm3, %xmm1 556; SSE41-NEXT: pxor %xmm9, %xmm1 557; SSE41-NEXT: movdqa %xmm1, %xmm10 558; SSE41-NEXT: pcmpeqd %xmm0, %xmm10 559; SSE41-NEXT: pcmpgtd %xmm0, %xmm1 560; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2] 561; SSE41-NEXT: pand %xmm10, %xmm0 562; SSE41-NEXT: por %xmm1, %xmm0 563; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm7 564; SSE41-NEXT: movdqa %xmm4, %xmm1 565; SSE41-NEXT: pxor %xmm9, %xmm1 566; SSE41-NEXT: movdqa %xmm8, %xmm3 567; SSE41-NEXT: pxor %xmm9, %xmm3 568; SSE41-NEXT: movdqa %xmm3, %xmm0 569; SSE41-NEXT: pcmpeqd %xmm1, %xmm0 570; SSE41-NEXT: pcmpgtd %xmm1, %xmm3 571; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm3[0,0,2,2] 572; SSE41-NEXT: pand %xmm1, %xmm0 573; SSE41-NEXT: por %xmm3, %xmm0 574; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm4 575; SSE41-NEXT: movdqa %xmm6, %xmm0 576; SSE41-NEXT: pxor %xmm9, %xmm0 577; SSE41-NEXT: movdqa %xmm2, %xmm1 578; SSE41-NEXT: pxor %xmm9, %xmm1 579; SSE41-NEXT: movdqa %xmm1, %xmm3 580; SSE41-NEXT: pcmpeqd %xmm0, %xmm3 581; SSE41-NEXT: pcmpgtd %xmm0, %xmm1 582; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2] 583; SSE41-NEXT: pand %xmm3, %xmm0 584; SSE41-NEXT: por %xmm1, %xmm0 585; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm6 586; SSE41-NEXT: movapd %xmm6, %xmm0 587; SSE41-NEXT: xorpd %xmm9, %xmm0 588; SSE41-NEXT: movapd %xmm4, %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, %xmm4, %xmm6 597; SSE41-NEXT: movapd %xmm7, %xmm0 598; SSE41-NEXT: xorpd %xmm9, %xmm0 599; SSE41-NEXT: movapd %xmm5, %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, %xmm5, %xmm7 608; SSE41-NEXT: movapd %xmm7, %xmm0 609; SSE41-NEXT: xorpd %xmm9, %xmm0 610; SSE41-NEXT: movapd %xmm6, %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, %xmm2 621; SSE41-NEXT: pxor %xmm9, %xmm2 622; SSE41-NEXT: pxor %xmm1, %xmm9 623; SSE41-NEXT: movdqa %xmm2, %xmm3 624; SSE41-NEXT: pcmpeqd %xmm9, %xmm3 625; SSE41-NEXT: pcmpgtd %xmm9, %xmm2 626; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2] 627; SSE41-NEXT: pand %xmm3, %xmm0 628; SSE41-NEXT: por %xmm2, %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 %xmm2, %xmm0 637; SSE42-NEXT: pcmpgtq %xmm6, %xmm0 638; SSE42-NEXT: blendvpd %xmm0, %xmm2, %xmm6 639; SSE42-NEXT: movdqa %xmm8, %xmm0 640; SSE42-NEXT: pcmpgtq %xmm4, %xmm0 641; SSE42-NEXT: blendvpd %xmm0, %xmm8, %xmm4 642; SSE42-NEXT: movdqa %xmm3, %xmm0 643; SSE42-NEXT: pcmpgtq %xmm7, %xmm0 644; SSE42-NEXT: blendvpd %xmm0, %xmm3, %xmm7 645; SSE42-NEXT: movdqa %xmm1, %xmm0 646; SSE42-NEXT: pcmpgtq %xmm5, %xmm0 647; SSE42-NEXT: blendvpd %xmm0, %xmm1, %xmm5 648; SSE42-NEXT: movapd %xmm5, %xmm0 649; SSE42-NEXT: pcmpgtq %xmm7, %xmm0 650; SSE42-NEXT: blendvpd %xmm0, %xmm5, %xmm7 651; SSE42-NEXT: movapd %xmm4, %xmm0 652; SSE42-NEXT: pcmpgtq %xmm6, %xmm0 653; SSE42-NEXT: blendvpd %xmm0, %xmm4, %xmm6 654; SSE42-NEXT: movapd %xmm6, %xmm0 655; SSE42-NEXT: pcmpgtq %xmm7, %xmm0 656; SSE42-NEXT: blendvpd %xmm0, %xmm6, %xmm7 657; SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm7[2,3,2,3] 658; SSE42-NEXT: movdqa %xmm7, %xmm0 659; SSE42-NEXT: pcmpgtq %xmm1, %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, %ymm2, %xmm11 667; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 668; AVX1-NEXT: vpcmpgtq %xmm11, %xmm5, %xmm8 669; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm7 670; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6 671; AVX1-NEXT: vpcmpgtq %xmm7, %xmm6, %xmm9 672; AVX1-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm10 673; AVX1-NEXT: vpcmpgtq %xmm3, %xmm1, %xmm4 674; AVX1-NEXT: vblendvpd %xmm4, %xmm1, %xmm3, %xmm1 675; AVX1-NEXT: vblendvpd %xmm10, %xmm0, %xmm2, %xmm0 676; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2 677; AVX1-NEXT: vblendvpd %xmm9, %xmm6, %xmm7, %xmm3 678; AVX1-NEXT: vblendvpd %xmm8, %xmm5, %xmm11, %xmm4 679; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm5 680; AVX1-NEXT: vblendvpd %xmm5, %xmm4, %xmm3, %xmm3 681; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 682; AVX1-NEXT: vpcmpgtq %xmm3, %xmm0, %xmm1 683; AVX1-NEXT: vblendvpd %xmm1, %xmm0, %xmm3, %xmm0 684; AVX1-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,2,3] 685; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %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 %ymm3, %ymm1, %ymm4 694; AVX2-NEXT: vblendvpd %ymm4, %ymm1, %ymm3, %ymm1 695; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm3 696; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 697; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2 698; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0 699; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1 700; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2 701; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 702; AVX2-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[2,3,2,3] 703; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %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: vpmaxsq %zmm1, %zmm0, %zmm0 712; AVX512BW-NEXT: vextracti64x4 $1, %zmm0, %ymm1 713; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 714; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 715; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 716; AVX512BW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 717; AVX512BW-NEXT: vpmaxsq %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: vpmaxsq %zmm1, %zmm0, %zmm0 725; AVX512VL-NEXT: vextracti64x4 $1, %zmm0, %ymm1 726; AVX512VL-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 727; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm1 728; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 729; AVX512VL-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 730; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0 731; AVX512VL-NEXT: vmovq %xmm0, %rax 732; AVX512VL-NEXT: vzeroupper 733; AVX512VL-NEXT: retq 734 %1 = call i64 @llvm.vector.reduce.smax.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 %xmm0, %xmm2 747; SSE2-NEXT: pcmpgtd %xmm1, %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: pmaxsd %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: vpmaxsd %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: vpmaxsd %xmm1, %xmm0, %xmm0 772; AVX512-NEXT: vmovd %xmm0, %eax 773; AVX512-NEXT: retq 774 %1 = call i32 @llvm.vector.reduce.smax.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 %xmm0, %xmm2 783; SSE2-NEXT: pcmpgtd %xmm1, %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 %xmm2, %xmm1 789; SSE2-NEXT: pcmpgtd %xmm0, %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: pmaxsd %xmm0, %xmm1 800; SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1] 801; SSE4-NEXT: pmaxsd %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: vpmaxsd %xmm1, %xmm0, %xmm0 809; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 810; AVX-NEXT: vpmaxsd %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: vpmaxsd %xmm1, %xmm0, %xmm0 818; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 819; AVX512-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 820; AVX512-NEXT: vmovd %xmm0, %eax 821; AVX512-NEXT: retq 822 %1 = call i32 @llvm.vector.reduce.smax.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 %xmm0, %xmm2 830; SSE2-NEXT: pcmpgtd %xmm1, %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 %xmm2, %xmm1 836; SSE2-NEXT: pcmpgtd %xmm0, %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 %xmm1, %xmm2 842; SSE2-NEXT: pcmpgtd %xmm0, %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: pmaxsd %xmm1, %xmm0 852; SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 853; SSE4-NEXT: pmaxsd %xmm0, %xmm1 854; SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1] 855; SSE4-NEXT: pmaxsd %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: vpmaxsd %xmm1, %xmm0, %xmm0 863; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 864; AVX1-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 865; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 866; AVX1-NEXT: vpmaxsd %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: vpmaxsd %xmm1, %xmm0, %xmm0 875; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 876; AVX2-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 877; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 878; AVX2-NEXT: vpmaxsd %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: vpmaxsd %xmm1, %xmm0, %xmm0 887; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 888; AVX512-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 889; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 890; AVX512-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 891; AVX512-NEXT: vmovd %xmm0, %eax 892; AVX512-NEXT: vzeroupper 893; AVX512-NEXT: retq 894 %1 = call i32 @llvm.vector.reduce.smax.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 %xmm1, %xmm4 902; SSE2-NEXT: pcmpgtd %xmm3, %xmm4 903; SSE2-NEXT: pand %xmm4, %xmm1 904; SSE2-NEXT: pandn %xmm3, %xmm4 905; SSE2-NEXT: por %xmm1, %xmm4 906; SSE2-NEXT: movdqa %xmm0, %xmm1 907; SSE2-NEXT: pcmpgtd %xmm2, %xmm1 908; SSE2-NEXT: pand %xmm1, %xmm0 909; SSE2-NEXT: pandn %xmm2, %xmm1 910; SSE2-NEXT: por %xmm0, %xmm1 911; SSE2-NEXT: movdqa %xmm1, %xmm0 912; SSE2-NEXT: pcmpgtd %xmm4, %xmm0 913; SSE2-NEXT: pand %xmm0, %xmm1 914; SSE2-NEXT: pandn %xmm4, %xmm0 915; SSE2-NEXT: por %xmm1, %xmm0 916; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 917; SSE2-NEXT: movdqa %xmm0, %xmm2 918; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 919; SSE2-NEXT: pand %xmm2, %xmm0 920; SSE2-NEXT: pandn %xmm1, %xmm2 921; SSE2-NEXT: por %xmm0, %xmm2 922; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1] 923; SSE2-NEXT: movdqa %xmm2, %xmm1 924; SSE2-NEXT: pcmpgtd %xmm0, %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: pmaxsd %xmm3, %xmm1 934; SSE4-NEXT: pmaxsd %xmm2, %xmm1 935; SSE4-NEXT: pmaxsd %xmm0, %xmm1 936; SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3] 937; SSE4-NEXT: pmaxsd %xmm1, %xmm0 938; SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 939; SSE4-NEXT: pmaxsd %xmm0, %xmm1 940; SSE4-NEXT: movd %xmm1, %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: vpmaxsd %xmm2, %xmm3, %xmm2 948; AVX1-NEXT: vpmaxsd %xmm2, %xmm1, %xmm1 949; AVX1-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 950; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 951; AVX1-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 952; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 953; AVX1-NEXT: vpmaxsd %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: vpmaxsd %ymm1, %ymm0, %ymm0 961; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 962; AVX2-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 963; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 964; AVX2-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 965; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 966; AVX2-NEXT: vpmaxsd %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: vpmaxsd %zmm1, %zmm0, %zmm0 975; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 976; AVX512-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 977; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 978; AVX512-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 979; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 980; AVX512-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 981; AVX512-NEXT: vmovd %xmm0, %eax 982; AVX512-NEXT: vzeroupper 983; AVX512-NEXT: retq 984 %1 = call i32 @llvm.vector.reduce.smax.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 %xmm2, %xmm8 992; SSE2-NEXT: pcmpgtd %xmm6, %xmm8 993; SSE2-NEXT: pand %xmm8, %xmm2 994; SSE2-NEXT: pandn %xmm6, %xmm8 995; SSE2-NEXT: por %xmm2, %xmm8 996; SSE2-NEXT: movdqa %xmm0, %xmm2 997; SSE2-NEXT: pcmpgtd %xmm4, %xmm2 998; SSE2-NEXT: pand %xmm2, %xmm0 999; SSE2-NEXT: pandn %xmm4, %xmm2 1000; SSE2-NEXT: por %xmm0, %xmm2 1001; SSE2-NEXT: movdqa %xmm3, %xmm0 1002; SSE2-NEXT: pcmpgtd %xmm7, %xmm0 1003; SSE2-NEXT: pand %xmm0, %xmm3 1004; SSE2-NEXT: pandn %xmm7, %xmm0 1005; SSE2-NEXT: por %xmm3, %xmm0 1006; SSE2-NEXT: movdqa %xmm1, %xmm3 1007; SSE2-NEXT: pcmpgtd %xmm5, %xmm3 1008; SSE2-NEXT: pand %xmm3, %xmm1 1009; SSE2-NEXT: pandn %xmm5, %xmm3 1010; SSE2-NEXT: por %xmm1, %xmm3 1011; SSE2-NEXT: movdqa %xmm3, %xmm1 1012; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 1013; SSE2-NEXT: pand %xmm1, %xmm3 1014; SSE2-NEXT: pandn %xmm0, %xmm1 1015; SSE2-NEXT: por %xmm3, %xmm1 1016; SSE2-NEXT: movdqa %xmm2, %xmm0 1017; SSE2-NEXT: pcmpgtd %xmm8, %xmm0 1018; SSE2-NEXT: pand %xmm0, %xmm2 1019; SSE2-NEXT: pandn %xmm8, %xmm0 1020; SSE2-NEXT: por %xmm2, %xmm0 1021; SSE2-NEXT: movdqa %xmm0, %xmm2 1022; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 1023; SSE2-NEXT: pand %xmm2, %xmm0 1024; SSE2-NEXT: pandn %xmm1, %xmm2 1025; SSE2-NEXT: por %xmm0, %xmm2 1026; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3] 1027; SSE2-NEXT: movdqa %xmm2, %xmm1 1028; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 1029; SSE2-NEXT: pand %xmm1, %xmm2 1030; SSE2-NEXT: pandn %xmm0, %xmm1 1031; SSE2-NEXT: por %xmm2, %xmm1 1032; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1] 1033; SSE2-NEXT: movdqa %xmm1, %xmm2 1034; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 1035; SSE2-NEXT: pand %xmm2, %xmm1 1036; SSE2-NEXT: pandn %xmm0, %xmm2 1037; SSE2-NEXT: por %xmm1, %xmm2 1038; SSE2-NEXT: movd %xmm2, %eax 1039; SSE2-NEXT: retq 1040; 1041; SSE4-LABEL: test_v32i32: 1042; SSE4: # %bb.0: 1043; SSE4-NEXT: pmaxsd %xmm6, %xmm2 1044; SSE4-NEXT: pmaxsd %xmm7, %xmm3 1045; SSE4-NEXT: pmaxsd %xmm5, %xmm3 1046; SSE4-NEXT: pmaxsd %xmm1, %xmm3 1047; SSE4-NEXT: pmaxsd %xmm4, %xmm2 1048; SSE4-NEXT: pmaxsd %xmm3, %xmm2 1049; SSE4-NEXT: pmaxsd %xmm0, %xmm2 1050; SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3] 1051; SSE4-NEXT: pmaxsd %xmm2, %xmm0 1052; SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 1053; SSE4-NEXT: pmaxsd %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: vpmaxsd %xmm3, %xmm1, %xmm4 1060; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3 1061; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 1062; AVX1-NEXT: vpmaxsd %xmm3, %xmm1, %xmm1 1063; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 1064; AVX1-NEXT: vpmaxsd %xmm1, %xmm3, %xmm1 1065; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1066; AVX1-NEXT: vpmaxsd %xmm1, %xmm3, %xmm1 1067; AVX1-NEXT: vpmaxsd %xmm4, %xmm2, %xmm2 1068; AVX1-NEXT: vpmaxsd %xmm1, %xmm2, %xmm1 1069; AVX1-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 1070; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 1071; AVX1-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 1072; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 1073; AVX1-NEXT: vpmaxsd %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: vpmaxsd %ymm3, %ymm1, %ymm1 1081; AVX2-NEXT: vpmaxsd %ymm1, %ymm2, %ymm1 1082; AVX2-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0 1083; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1084; AVX2-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 1085; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 1086; AVX2-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 1087; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 1088; AVX2-NEXT: vpmaxsd %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: vpmaxsd %zmm1, %zmm0, %zmm0 1096; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1097; AVX512-NEXT: vpmaxsd %zmm1, %zmm0, %zmm0 1098; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 1099; AVX512-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 1100; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 1101; AVX512-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 1102; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 1103; AVX512-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0 1104; AVX512-NEXT: vmovd %xmm0, %eax 1105; AVX512-NEXT: vzeroupper 1106; AVX512-NEXT: retq 1107 %1 = call i32 @llvm.vector.reduce.smax.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: pmaxsw %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: vpmaxsw %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: vpmaxsw %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.smax.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: pmaxsw %xmm0, %xmm1 1149; SSE-NEXT: movdqa %xmm1, %xmm0 1150; SSE-NEXT: psrld $16, %xmm0 1151; SSE-NEXT: pmaxsw %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: vpmaxsw %xmm1, %xmm0, %xmm0 1160; AVX-NEXT: vpsrld $16, %xmm0, %xmm1 1161; AVX-NEXT: vpmaxsw %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: vpmaxsw %xmm1, %xmm0, %xmm0 1170; AVX512-NEXT: vpsrld $16, %xmm0, %xmm1 1171; AVX512-NEXT: vpmaxsw %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.smax.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: pmaxsw %xmm0, %xmm1 1184; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1] 1185; SSE2-NEXT: pmaxsw %xmm1, %xmm0 1186; SSE2-NEXT: movdqa %xmm0, %xmm1 1187; SSE2-NEXT: psrld $16, %xmm1 1188; SSE2-NEXT: pmaxsw %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 {{.*}}(%rip), %xmm0 1196; SSE4-NEXT: phminposuw %xmm0, %xmm0 1197; SSE4-NEXT: movd %xmm0, %eax 1198; SSE4-NEXT: xorl $32767, %eax # imm = 0x7FFF 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 {{.*}}(%rip), %xmm0, %xmm0 1205; AVX-NEXT: vphminposuw %xmm0, %xmm0 1206; AVX-NEXT: vmovd %xmm0, %eax 1207; AVX-NEXT: xorl $32767, %eax # imm = 0x7FFF 1208; AVX-NEXT: # kill: def $ax killed $ax killed $eax 1209; AVX-NEXT: retq 1210; 1211; AVX512-LABEL: test_v8i16: 1212; AVX512: # %bb.0: 1213; AVX512-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 1214; AVX512-NEXT: vphminposuw %xmm0, %xmm0 1215; AVX512-NEXT: vmovd %xmm0, %eax 1216; AVX512-NEXT: xorl $32767, %eax # imm = 0x7FFF 1217; AVX512-NEXT: # kill: def $ax killed $ax killed $eax 1218; AVX512-NEXT: retq 1219 %1 = call i16 @llvm.vector.reduce.smax.v8i16(<8 x i16> %a0) 1220 ret i16 %1 1221} 1222 1223define i16 @test_v16i16(<16 x i16> %a0) { 1224; SSE2-LABEL: test_v16i16: 1225; SSE2: # %bb.0: 1226; SSE2-NEXT: pmaxsw %xmm1, %xmm0 1227; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 1228; SSE2-NEXT: pmaxsw %xmm0, %xmm1 1229; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1] 1230; SSE2-NEXT: pmaxsw %xmm1, %xmm0 1231; SSE2-NEXT: movdqa %xmm0, %xmm1 1232; SSE2-NEXT: psrld $16, %xmm1 1233; SSE2-NEXT: pmaxsw %xmm0, %xmm1 1234; SSE2-NEXT: movd %xmm1, %eax 1235; SSE2-NEXT: # kill: def $ax killed $ax killed $eax 1236; SSE2-NEXT: retq 1237; 1238; SSE4-LABEL: test_v16i16: 1239; SSE4: # %bb.0: 1240; SSE4-NEXT: pmaxsw %xmm1, %xmm0 1241; SSE4-NEXT: pxor {{.*}}(%rip), %xmm0 1242; SSE4-NEXT: phminposuw %xmm0, %xmm0 1243; SSE4-NEXT: movd %xmm0, %eax 1244; SSE4-NEXT: xorl $32767, %eax # imm = 0x7FFF 1245; SSE4-NEXT: # kill: def $ax killed $ax killed $eax 1246; SSE4-NEXT: retq 1247; 1248; AVX1-LABEL: test_v16i16: 1249; AVX1: # %bb.0: 1250; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1251; AVX1-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0 1252; AVX1-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 1253; AVX1-NEXT: vphminposuw %xmm0, %xmm0 1254; AVX1-NEXT: vmovd %xmm0, %eax 1255; AVX1-NEXT: xorl $32767, %eax # imm = 0x7FFF 1256; AVX1-NEXT: # kill: def $ax killed $ax killed $eax 1257; AVX1-NEXT: vzeroupper 1258; AVX1-NEXT: retq 1259; 1260; AVX2-LABEL: test_v16i16: 1261; AVX2: # %bb.0: 1262; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1263; AVX2-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0 1264; AVX2-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 1265; AVX2-NEXT: vphminposuw %xmm0, %xmm0 1266; AVX2-NEXT: vmovd %xmm0, %eax 1267; AVX2-NEXT: xorl $32767, %eax # imm = 0x7FFF 1268; AVX2-NEXT: # kill: def $ax killed $ax killed $eax 1269; AVX2-NEXT: vzeroupper 1270; AVX2-NEXT: retq 1271; 1272; AVX512-LABEL: test_v16i16: 1273; AVX512: # %bb.0: 1274; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 1275; AVX512-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0 1276; AVX512-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 1277; AVX512-NEXT: vphminposuw %xmm0, %xmm0 1278; AVX512-NEXT: vmovd %xmm0, %eax 1279; AVX512-NEXT: xorl $32767, %eax # imm = 0x7FFF 1280; AVX512-NEXT: # kill: def $ax killed $ax killed $eax 1281; AVX512-NEXT: vzeroupper 1282; AVX512-NEXT: retq 1283 %1 = call i16 @llvm.vector.reduce.smax.v16i16(<16 x i16> %a0) 1284 ret i16 %1 1285} 1286 1287define i16 @test_v32i16(<32 x i16> %a0) { 1288; SSE2-LABEL: test_v32i16: 1289; SSE2: # %bb.0: 1290; SSE2-NEXT: pmaxsw %xmm3, %xmm1 1291; SSE2-NEXT: pmaxsw %xmm2, %xmm1 1292; SSE2-NEXT: pmaxsw %xmm0, %xmm1 1293; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3] 1294; SSE2-NEXT: pmaxsw %xmm1, %xmm0 1295; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 1296; SSE2-NEXT: pmaxsw %xmm0, %xmm1 1297; SSE2-NEXT: movdqa %xmm1, %xmm0 1298; SSE2-NEXT: psrld $16, %xmm0 1299; SSE2-NEXT: pmaxsw %xmm1, %xmm0 1300; SSE2-NEXT: movd %xmm0, %eax 1301; SSE2-NEXT: # kill: def $ax killed $ax killed $eax 1302; SSE2-NEXT: retq 1303; 1304; SSE4-LABEL: test_v32i16: 1305; SSE4: # %bb.0: 1306; SSE4-NEXT: pmaxsw %xmm3, %xmm1 1307; SSE4-NEXT: pmaxsw %xmm2, %xmm1 1308; SSE4-NEXT: pmaxsw %xmm0, %xmm1 1309; SSE4-NEXT: pxor {{.*}}(%rip), %xmm1 1310; SSE4-NEXT: phminposuw %xmm1, %xmm0 1311; SSE4-NEXT: movd %xmm0, %eax 1312; SSE4-NEXT: xorl $32767, %eax # imm = 0x7FFF 1313; SSE4-NEXT: # kill: def $ax killed $ax killed $eax 1314; SSE4-NEXT: retq 1315; 1316; AVX1-LABEL: test_v32i16: 1317; AVX1: # %bb.0: 1318; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1319; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1320; AVX1-NEXT: vpmaxsw %xmm2, %xmm3, %xmm2 1321; AVX1-NEXT: vpmaxsw %xmm2, %xmm1, %xmm1 1322; AVX1-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0 1323; AVX1-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 1324; AVX1-NEXT: vphminposuw %xmm0, %xmm0 1325; AVX1-NEXT: vmovd %xmm0, %eax 1326; AVX1-NEXT: xorl $32767, %eax # imm = 0x7FFF 1327; AVX1-NEXT: # kill: def $ax killed $ax killed $eax 1328; AVX1-NEXT: vzeroupper 1329; AVX1-NEXT: retq 1330; 1331; AVX2-LABEL: test_v32i16: 1332; AVX2: # %bb.0: 1333; AVX2-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0 1334; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1335; AVX2-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0 1336; AVX2-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 1337; AVX2-NEXT: vphminposuw %xmm0, %xmm0 1338; AVX2-NEXT: vmovd %xmm0, %eax 1339; AVX2-NEXT: xorl $32767, %eax # imm = 0x7FFF 1340; AVX2-NEXT: # kill: def $ax killed $ax killed $eax 1341; AVX2-NEXT: vzeroupper 1342; AVX2-NEXT: retq 1343; 1344; AVX512-LABEL: test_v32i16: 1345; AVX512: # %bb.0: 1346; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1347; AVX512-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0 1348; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 1349; AVX512-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0 1350; AVX512-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 1351; AVX512-NEXT: vphminposuw %xmm0, %xmm0 1352; AVX512-NEXT: vmovd %xmm0, %eax 1353; AVX512-NEXT: xorl $32767, %eax # imm = 0x7FFF 1354; AVX512-NEXT: # kill: def $ax killed $ax killed $eax 1355; AVX512-NEXT: vzeroupper 1356; AVX512-NEXT: retq 1357 %1 = call i16 @llvm.vector.reduce.smax.v32i16(<32 x i16> %a0) 1358 ret i16 %1 1359} 1360 1361define i16 @test_v64i16(<64 x i16> %a0) { 1362; SSE2-LABEL: test_v64i16: 1363; SSE2: # %bb.0: 1364; SSE2-NEXT: pmaxsw %xmm6, %xmm2 1365; SSE2-NEXT: pmaxsw %xmm7, %xmm3 1366; SSE2-NEXT: pmaxsw %xmm5, %xmm3 1367; SSE2-NEXT: pmaxsw %xmm1, %xmm3 1368; SSE2-NEXT: pmaxsw %xmm4, %xmm2 1369; SSE2-NEXT: pmaxsw %xmm3, %xmm2 1370; SSE2-NEXT: pmaxsw %xmm0, %xmm2 1371; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3] 1372; SSE2-NEXT: pmaxsw %xmm2, %xmm0 1373; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 1374; SSE2-NEXT: pmaxsw %xmm0, %xmm1 1375; SSE2-NEXT: movdqa %xmm1, %xmm0 1376; SSE2-NEXT: psrld $16, %xmm0 1377; SSE2-NEXT: pmaxsw %xmm1, %xmm0 1378; SSE2-NEXT: movd %xmm0, %eax 1379; SSE2-NEXT: # kill: def $ax killed $ax killed $eax 1380; SSE2-NEXT: retq 1381; 1382; SSE4-LABEL: test_v64i16: 1383; SSE4: # %bb.0: 1384; SSE4-NEXT: pmaxsw %xmm7, %xmm3 1385; SSE4-NEXT: pmaxsw %xmm5, %xmm3 1386; SSE4-NEXT: pmaxsw %xmm1, %xmm3 1387; SSE4-NEXT: pmaxsw %xmm6, %xmm2 1388; SSE4-NEXT: pmaxsw %xmm4, %xmm2 1389; SSE4-NEXT: pmaxsw %xmm3, %xmm2 1390; SSE4-NEXT: pmaxsw %xmm0, %xmm2 1391; SSE4-NEXT: pxor {{.*}}(%rip), %xmm2 1392; SSE4-NEXT: phminposuw %xmm2, %xmm0 1393; SSE4-NEXT: movd %xmm0, %eax 1394; SSE4-NEXT: xorl $32767, %eax # imm = 0x7FFF 1395; SSE4-NEXT: # kill: def $ax killed $ax killed $eax 1396; SSE4-NEXT: retq 1397; 1398; AVX1-LABEL: test_v64i16: 1399; AVX1: # %bb.0: 1400; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 1401; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 1402; AVX1-NEXT: vpmaxsw %xmm4, %xmm5, %xmm4 1403; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 1404; AVX1-NEXT: vpmaxsw %xmm4, %xmm5, %xmm4 1405; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 1406; AVX1-NEXT: vpmaxsw %xmm4, %xmm5, %xmm4 1407; AVX1-NEXT: vpmaxsw %xmm3, %xmm1, %xmm1 1408; AVX1-NEXT: vpmaxsw %xmm1, %xmm2, %xmm1 1409; AVX1-NEXT: vpmaxsw %xmm4, %xmm1, %xmm1 1410; AVX1-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0 1411; AVX1-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 1412; AVX1-NEXT: vphminposuw %xmm0, %xmm0 1413; AVX1-NEXT: vmovd %xmm0, %eax 1414; AVX1-NEXT: xorl $32767, %eax # imm = 0x7FFF 1415; AVX1-NEXT: # kill: def $ax killed $ax killed $eax 1416; AVX1-NEXT: vzeroupper 1417; AVX1-NEXT: retq 1418; 1419; AVX2-LABEL: test_v64i16: 1420; AVX2: # %bb.0: 1421; AVX2-NEXT: vpmaxsw %ymm3, %ymm1, %ymm1 1422; AVX2-NEXT: vpmaxsw %ymm1, %ymm2, %ymm1 1423; AVX2-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0 1424; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1425; AVX2-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0 1426; AVX2-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 1427; AVX2-NEXT: vphminposuw %xmm0, %xmm0 1428; AVX2-NEXT: vmovd %xmm0, %eax 1429; AVX2-NEXT: xorl $32767, %eax # imm = 0x7FFF 1430; AVX2-NEXT: # kill: def $ax killed $ax killed $eax 1431; AVX2-NEXT: vzeroupper 1432; AVX2-NEXT: retq 1433; 1434; AVX512-LABEL: test_v64i16: 1435; AVX512: # %bb.0: 1436; AVX512-NEXT: vpmaxsw %zmm1, %zmm0, %zmm0 1437; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1438; AVX512-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0 1439; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 1440; AVX512-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0 1441; AVX512-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 1442; AVX512-NEXT: vphminposuw %xmm0, %xmm0 1443; AVX512-NEXT: vmovd %xmm0, %eax 1444; AVX512-NEXT: xorl $32767, %eax # imm = 0x7FFF 1445; AVX512-NEXT: # kill: def $ax killed $ax killed $eax 1446; AVX512-NEXT: vzeroupper 1447; AVX512-NEXT: retq 1448 %1 = call i16 @llvm.vector.reduce.smax.v64i16(<64 x i16> %a0) 1449 ret i16 %1 1450} 1451 1452; 1453; vXi8 1454; 1455 1456define i8 @test_v2i8(<2 x i8> %a0) { 1457; SSE2-LABEL: test_v2i8: 1458; SSE2: # %bb.0: 1459; SSE2-NEXT: movdqa %xmm0, %xmm1 1460; SSE2-NEXT: psrlw $8, %xmm1 1461; SSE2-NEXT: movdqa %xmm0, %xmm2 1462; SSE2-NEXT: pcmpgtb %xmm1, %xmm2 1463; SSE2-NEXT: pand %xmm2, %xmm0 1464; SSE2-NEXT: pandn %xmm1, %xmm2 1465; SSE2-NEXT: por %xmm0, %xmm2 1466; SSE2-NEXT: movd %xmm2, %eax 1467; SSE2-NEXT: # kill: def $al killed $al killed $eax 1468; SSE2-NEXT: retq 1469; 1470; SSE4-LABEL: test_v2i8: 1471; SSE4: # %bb.0: 1472; SSE4-NEXT: movdqa %xmm0, %xmm1 1473; SSE4-NEXT: psrlw $8, %xmm1 1474; SSE4-NEXT: pmaxsb %xmm0, %xmm1 1475; SSE4-NEXT: movd %xmm1, %eax 1476; SSE4-NEXT: # kill: def $al killed $al killed $eax 1477; SSE4-NEXT: retq 1478; 1479; AVX-LABEL: test_v2i8: 1480; AVX: # %bb.0: 1481; AVX-NEXT: vpsrlw $8, %xmm0, %xmm1 1482; AVX-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0 1483; AVX-NEXT: vmovd %xmm0, %eax 1484; AVX-NEXT: # kill: def $al killed $al killed $eax 1485; AVX-NEXT: retq 1486; 1487; AVX512-LABEL: test_v2i8: 1488; AVX512: # %bb.0: 1489; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1 1490; AVX512-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0 1491; AVX512-NEXT: vmovd %xmm0, %eax 1492; AVX512-NEXT: # kill: def $al killed $al killed $eax 1493; AVX512-NEXT: retq 1494 %1 = call i8 @llvm.vector.reduce.smax.v2i8(<2 x i8> %a0) 1495 ret i8 %1 1496} 1497 1498define i8 @test_v4i8(<4 x i8> %a0) { 1499; SSE2-LABEL: test_v4i8: 1500; SSE2: # %bb.0: 1501; SSE2-NEXT: movdqa %xmm0, %xmm1 1502; SSE2-NEXT: psrld $16, %xmm1 1503; SSE2-NEXT: movdqa %xmm0, %xmm2 1504; SSE2-NEXT: pcmpgtb %xmm1, %xmm2 1505; SSE2-NEXT: pand %xmm2, %xmm0 1506; SSE2-NEXT: pandn %xmm1, %xmm2 1507; SSE2-NEXT: por %xmm0, %xmm2 1508; SSE2-NEXT: movdqa %xmm2, %xmm0 1509; SSE2-NEXT: psrlw $8, %xmm0 1510; SSE2-NEXT: movdqa %xmm2, %xmm1 1511; SSE2-NEXT: pcmpgtb %xmm0, %xmm1 1512; SSE2-NEXT: pand %xmm1, %xmm2 1513; SSE2-NEXT: pandn %xmm0, %xmm1 1514; SSE2-NEXT: por %xmm2, %xmm1 1515; SSE2-NEXT: movd %xmm1, %eax 1516; SSE2-NEXT: # kill: def $al killed $al killed $eax 1517; SSE2-NEXT: retq 1518; 1519; SSE4-LABEL: test_v4i8: 1520; SSE4: # %bb.0: 1521; SSE4-NEXT: movdqa %xmm0, %xmm1 1522; SSE4-NEXT: psrld $16, %xmm1 1523; SSE4-NEXT: pmaxsb %xmm0, %xmm1 1524; SSE4-NEXT: movdqa %xmm1, %xmm0 1525; SSE4-NEXT: psrlw $8, %xmm0 1526; SSE4-NEXT: pmaxsb %xmm1, %xmm0 1527; SSE4-NEXT: movd %xmm0, %eax 1528; SSE4-NEXT: # kill: def $al killed $al killed $eax 1529; SSE4-NEXT: retq 1530; 1531; AVX-LABEL: test_v4i8: 1532; AVX: # %bb.0: 1533; AVX-NEXT: vpsrld $16, %xmm0, %xmm1 1534; AVX-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0 1535; AVX-NEXT: vpsrlw $8, %xmm0, %xmm1 1536; AVX-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0 1537; AVX-NEXT: vmovd %xmm0, %eax 1538; AVX-NEXT: # kill: def $al killed $al killed $eax 1539; AVX-NEXT: retq 1540; 1541; AVX512-LABEL: test_v4i8: 1542; AVX512: # %bb.0: 1543; AVX512-NEXT: vpsrld $16, %xmm0, %xmm1 1544; AVX512-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0 1545; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1 1546; AVX512-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0 1547; AVX512-NEXT: vmovd %xmm0, %eax 1548; AVX512-NEXT: # kill: def $al killed $al killed $eax 1549; AVX512-NEXT: retq 1550 %1 = call i8 @llvm.vector.reduce.smax.v4i8(<4 x i8> %a0) 1551 ret i8 %1 1552} 1553 1554define i8 @test_v8i8(<8 x i8> %a0) { 1555; SSE2-LABEL: test_v8i8: 1556; SSE2: # %bb.0: 1557; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 1558; SSE2-NEXT: movdqa %xmm0, %xmm2 1559; SSE2-NEXT: pcmpgtb %xmm1, %xmm2 1560; SSE2-NEXT: pand %xmm2, %xmm0 1561; SSE2-NEXT: pandn %xmm1, %xmm2 1562; SSE2-NEXT: por %xmm0, %xmm2 1563; SSE2-NEXT: movdqa %xmm2, %xmm0 1564; SSE2-NEXT: psrld $16, %xmm0 1565; SSE2-NEXT: movdqa %xmm2, %xmm1 1566; SSE2-NEXT: pcmpgtb %xmm0, %xmm1 1567; SSE2-NEXT: pand %xmm1, %xmm2 1568; SSE2-NEXT: pandn %xmm0, %xmm1 1569; SSE2-NEXT: por %xmm2, %xmm1 1570; SSE2-NEXT: movdqa %xmm1, %xmm0 1571; SSE2-NEXT: psrlw $8, %xmm0 1572; SSE2-NEXT: movdqa %xmm1, %xmm2 1573; SSE2-NEXT: pcmpgtb %xmm0, %xmm2 1574; SSE2-NEXT: pand %xmm2, %xmm1 1575; SSE2-NEXT: pandn %xmm0, %xmm2 1576; SSE2-NEXT: por %xmm1, %xmm2 1577; SSE2-NEXT: movd %xmm2, %eax 1578; SSE2-NEXT: # kill: def $al killed $al killed $eax 1579; SSE2-NEXT: retq 1580; 1581; SSE4-LABEL: test_v8i8: 1582; SSE4: # %bb.0: 1583; SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 1584; SSE4-NEXT: pmaxsb %xmm0, %xmm1 1585; SSE4-NEXT: movdqa %xmm1, %xmm0 1586; SSE4-NEXT: psrld $16, %xmm0 1587; SSE4-NEXT: pmaxsb %xmm1, %xmm0 1588; SSE4-NEXT: movdqa %xmm0, %xmm1 1589; SSE4-NEXT: psrlw $8, %xmm1 1590; SSE4-NEXT: pmaxsb %xmm0, %xmm1 1591; SSE4-NEXT: movd %xmm1, %eax 1592; SSE4-NEXT: # kill: def $al killed $al killed $eax 1593; SSE4-NEXT: retq 1594; 1595; AVX-LABEL: test_v8i8: 1596; AVX: # %bb.0: 1597; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 1598; AVX-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0 1599; AVX-NEXT: vpsrld $16, %xmm0, %xmm1 1600; AVX-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0 1601; AVX-NEXT: vpsrlw $8, %xmm0, %xmm1 1602; AVX-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0 1603; AVX-NEXT: vmovd %xmm0, %eax 1604; AVX-NEXT: # kill: def $al killed $al killed $eax 1605; AVX-NEXT: retq 1606; 1607; AVX512-LABEL: test_v8i8: 1608; AVX512: # %bb.0: 1609; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 1610; AVX512-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0 1611; AVX512-NEXT: vpsrld $16, %xmm0, %xmm1 1612; AVX512-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0 1613; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1 1614; AVX512-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0 1615; AVX512-NEXT: vmovd %xmm0, %eax 1616; AVX512-NEXT: # kill: def $al killed $al killed $eax 1617; AVX512-NEXT: retq 1618 %1 = call i8 @llvm.vector.reduce.smax.v8i8(<8 x i8> %a0) 1619 ret i8 %1 1620} 1621 1622define i8 @test_v16i8(<16 x i8> %a0) { 1623; SSE2-LABEL: test_v16i8: 1624; SSE2: # %bb.0: 1625; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 1626; SSE2-NEXT: movdqa %xmm0, %xmm2 1627; SSE2-NEXT: pcmpgtb %xmm1, %xmm2 1628; SSE2-NEXT: pand %xmm2, %xmm0 1629; SSE2-NEXT: pandn %xmm1, %xmm2 1630; SSE2-NEXT: por %xmm0, %xmm2 1631; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1] 1632; SSE2-NEXT: movdqa %xmm2, %xmm1 1633; SSE2-NEXT: pcmpgtb %xmm0, %xmm1 1634; SSE2-NEXT: pand %xmm1, %xmm2 1635; SSE2-NEXT: pandn %xmm0, %xmm1 1636; SSE2-NEXT: por %xmm2, %xmm1 1637; SSE2-NEXT: movdqa %xmm1, %xmm0 1638; SSE2-NEXT: psrld $16, %xmm0 1639; SSE2-NEXT: movdqa %xmm1, %xmm2 1640; SSE2-NEXT: pcmpgtb %xmm0, %xmm2 1641; SSE2-NEXT: pand %xmm2, %xmm1 1642; SSE2-NEXT: pandn %xmm0, %xmm2 1643; SSE2-NEXT: por %xmm1, %xmm2 1644; SSE2-NEXT: movdqa %xmm2, %xmm0 1645; SSE2-NEXT: psrlw $8, %xmm0 1646; SSE2-NEXT: movdqa %xmm2, %xmm1 1647; SSE2-NEXT: pcmpgtb %xmm0, %xmm1 1648; SSE2-NEXT: pand %xmm1, %xmm2 1649; SSE2-NEXT: pandn %xmm0, %xmm1 1650; SSE2-NEXT: por %xmm2, %xmm1 1651; SSE2-NEXT: movd %xmm1, %eax 1652; SSE2-NEXT: # kill: def $al killed $al killed $eax 1653; SSE2-NEXT: retq 1654; 1655; SSE4-LABEL: test_v16i8: 1656; SSE4: # %bb.0: 1657; SSE4-NEXT: pxor {{.*}}(%rip), %xmm0 1658; SSE4-NEXT: movdqa %xmm0, %xmm1 1659; SSE4-NEXT: psrlw $8, %xmm1 1660; SSE4-NEXT: pminub %xmm0, %xmm1 1661; SSE4-NEXT: phminposuw %xmm1, %xmm0 1662; SSE4-NEXT: movd %xmm0, %eax 1663; SSE4-NEXT: xorb $127, %al 1664; SSE4-NEXT: # kill: def $al killed $al killed $eax 1665; SSE4-NEXT: retq 1666; 1667; AVX-LABEL: test_v16i8: 1668; AVX: # %bb.0: 1669; AVX-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 1670; AVX-NEXT: vpsrlw $8, %xmm0, %xmm1 1671; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm0 1672; AVX-NEXT: vphminposuw %xmm0, %xmm0 1673; AVX-NEXT: vmovd %xmm0, %eax 1674; AVX-NEXT: xorb $127, %al 1675; AVX-NEXT: # kill: def $al killed $al killed $eax 1676; AVX-NEXT: retq 1677; 1678; AVX512-LABEL: test_v16i8: 1679; AVX512: # %bb.0: 1680; AVX512-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 1681; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1 1682; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0 1683; AVX512-NEXT: vphminposuw %xmm0, %xmm0 1684; AVX512-NEXT: vmovd %xmm0, %eax 1685; AVX512-NEXT: xorb $127, %al 1686; AVX512-NEXT: # kill: def $al killed $al killed $eax 1687; AVX512-NEXT: retq 1688 %1 = call i8 @llvm.vector.reduce.smax.v16i8(<16 x i8> %a0) 1689 ret i8 %1 1690} 1691 1692define i8 @test_v32i8(<32 x i8> %a0) { 1693; SSE2-LABEL: test_v32i8: 1694; SSE2: # %bb.0: 1695; SSE2-NEXT: movdqa %xmm0, %xmm2 1696; SSE2-NEXT: pcmpgtb %xmm1, %xmm2 1697; SSE2-NEXT: pand %xmm2, %xmm0 1698; SSE2-NEXT: pandn %xmm1, %xmm2 1699; SSE2-NEXT: por %xmm0, %xmm2 1700; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3] 1701; SSE2-NEXT: movdqa %xmm2, %xmm1 1702; SSE2-NEXT: pcmpgtb %xmm0, %xmm1 1703; SSE2-NEXT: pand %xmm1, %xmm2 1704; SSE2-NEXT: pandn %xmm0, %xmm1 1705; SSE2-NEXT: por %xmm2, %xmm1 1706; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1] 1707; SSE2-NEXT: movdqa %xmm1, %xmm2 1708; SSE2-NEXT: pcmpgtb %xmm0, %xmm2 1709; SSE2-NEXT: pand %xmm2, %xmm1 1710; SSE2-NEXT: pandn %xmm0, %xmm2 1711; SSE2-NEXT: por %xmm1, %xmm2 1712; SSE2-NEXT: movdqa %xmm2, %xmm0 1713; SSE2-NEXT: psrld $16, %xmm0 1714; SSE2-NEXT: movdqa %xmm2, %xmm1 1715; SSE2-NEXT: pcmpgtb %xmm0, %xmm1 1716; SSE2-NEXT: pand %xmm1, %xmm2 1717; SSE2-NEXT: pandn %xmm0, %xmm1 1718; SSE2-NEXT: por %xmm2, %xmm1 1719; SSE2-NEXT: movdqa %xmm1, %xmm0 1720; SSE2-NEXT: psrlw $8, %xmm0 1721; SSE2-NEXT: movdqa %xmm1, %xmm2 1722; SSE2-NEXT: pcmpgtb %xmm0, %xmm2 1723; SSE2-NEXT: pand %xmm2, %xmm1 1724; SSE2-NEXT: pandn %xmm0, %xmm2 1725; SSE2-NEXT: por %xmm1, %xmm2 1726; SSE2-NEXT: movd %xmm2, %eax 1727; SSE2-NEXT: # kill: def $al killed $al killed $eax 1728; SSE2-NEXT: retq 1729; 1730; SSE4-LABEL: test_v32i8: 1731; SSE4: # %bb.0: 1732; SSE4-NEXT: pmaxsb %xmm1, %xmm0 1733; SSE4-NEXT: pxor {{.*}}(%rip), %xmm0 1734; SSE4-NEXT: movdqa %xmm0, %xmm1 1735; SSE4-NEXT: psrlw $8, %xmm1 1736; SSE4-NEXT: pminub %xmm0, %xmm1 1737; SSE4-NEXT: phminposuw %xmm1, %xmm0 1738; SSE4-NEXT: movd %xmm0, %eax 1739; SSE4-NEXT: xorb $127, %al 1740; SSE4-NEXT: # kill: def $al killed $al killed $eax 1741; SSE4-NEXT: retq 1742; 1743; AVX1-LABEL: test_v32i8: 1744; AVX1: # %bb.0: 1745; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1746; AVX1-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0 1747; AVX1-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 1748; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1 1749; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0 1750; AVX1-NEXT: vphminposuw %xmm0, %xmm0 1751; AVX1-NEXT: vmovd %xmm0, %eax 1752; AVX1-NEXT: xorb $127, %al 1753; AVX1-NEXT: # kill: def $al killed $al killed $eax 1754; AVX1-NEXT: vzeroupper 1755; AVX1-NEXT: retq 1756; 1757; AVX2-LABEL: test_v32i8: 1758; AVX2: # %bb.0: 1759; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1760; AVX2-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0 1761; AVX2-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 1762; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1 1763; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0 1764; AVX2-NEXT: vphminposuw %xmm0, %xmm0 1765; AVX2-NEXT: vmovd %xmm0, %eax 1766; AVX2-NEXT: xorb $127, %al 1767; AVX2-NEXT: # kill: def $al killed $al killed $eax 1768; AVX2-NEXT: vzeroupper 1769; AVX2-NEXT: retq 1770; 1771; AVX512-LABEL: test_v32i8: 1772; AVX512: # %bb.0: 1773; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 1774; AVX512-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0 1775; AVX512-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 1776; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1 1777; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0 1778; AVX512-NEXT: vphminposuw %xmm0, %xmm0 1779; AVX512-NEXT: vmovd %xmm0, %eax 1780; AVX512-NEXT: xorb $127, %al 1781; AVX512-NEXT: # kill: def $al killed $al killed $eax 1782; AVX512-NEXT: vzeroupper 1783; AVX512-NEXT: retq 1784 %1 = call i8 @llvm.vector.reduce.smax.v32i8(<32 x i8> %a0) 1785 ret i8 %1 1786} 1787 1788define i8 @test_v64i8(<64 x i8> %a0) { 1789; SSE2-LABEL: test_v64i8: 1790; SSE2: # %bb.0: 1791; SSE2-NEXT: movdqa %xmm1, %xmm4 1792; SSE2-NEXT: pcmpgtb %xmm3, %xmm4 1793; SSE2-NEXT: pand %xmm4, %xmm1 1794; SSE2-NEXT: pandn %xmm3, %xmm4 1795; SSE2-NEXT: por %xmm1, %xmm4 1796; SSE2-NEXT: movdqa %xmm0, %xmm1 1797; SSE2-NEXT: pcmpgtb %xmm2, %xmm1 1798; SSE2-NEXT: pand %xmm1, %xmm0 1799; SSE2-NEXT: pandn %xmm2, %xmm1 1800; SSE2-NEXT: por %xmm0, %xmm1 1801; SSE2-NEXT: movdqa %xmm1, %xmm0 1802; SSE2-NEXT: pcmpgtb %xmm4, %xmm0 1803; SSE2-NEXT: pand %xmm0, %xmm1 1804; SSE2-NEXT: pandn %xmm4, %xmm0 1805; SSE2-NEXT: por %xmm1, %xmm0 1806; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 1807; SSE2-NEXT: movdqa %xmm0, %xmm2 1808; SSE2-NEXT: pcmpgtb %xmm1, %xmm2 1809; SSE2-NEXT: pand %xmm2, %xmm0 1810; SSE2-NEXT: pandn %xmm1, %xmm2 1811; SSE2-NEXT: por %xmm0, %xmm2 1812; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1] 1813; SSE2-NEXT: movdqa %xmm2, %xmm1 1814; SSE2-NEXT: pcmpgtb %xmm0, %xmm1 1815; SSE2-NEXT: pand %xmm1, %xmm2 1816; SSE2-NEXT: pandn %xmm0, %xmm1 1817; SSE2-NEXT: por %xmm2, %xmm1 1818; SSE2-NEXT: movdqa %xmm1, %xmm0 1819; SSE2-NEXT: psrld $16, %xmm0 1820; SSE2-NEXT: movdqa %xmm1, %xmm2 1821; SSE2-NEXT: pcmpgtb %xmm0, %xmm2 1822; SSE2-NEXT: pand %xmm2, %xmm1 1823; SSE2-NEXT: pandn %xmm0, %xmm2 1824; SSE2-NEXT: por %xmm1, %xmm2 1825; SSE2-NEXT: movdqa %xmm2, %xmm0 1826; SSE2-NEXT: psrlw $8, %xmm0 1827; SSE2-NEXT: movdqa %xmm2, %xmm1 1828; SSE2-NEXT: pcmpgtb %xmm0, %xmm1 1829; SSE2-NEXT: pand %xmm1, %xmm2 1830; SSE2-NEXT: pandn %xmm0, %xmm1 1831; SSE2-NEXT: por %xmm2, %xmm1 1832; SSE2-NEXT: movd %xmm1, %eax 1833; SSE2-NEXT: # kill: def $al killed $al killed $eax 1834; SSE2-NEXT: retq 1835; 1836; SSE4-LABEL: test_v64i8: 1837; SSE4: # %bb.0: 1838; SSE4-NEXT: pmaxsb %xmm3, %xmm1 1839; SSE4-NEXT: pmaxsb %xmm2, %xmm1 1840; SSE4-NEXT: pmaxsb %xmm0, %xmm1 1841; SSE4-NEXT: pxor {{.*}}(%rip), %xmm1 1842; SSE4-NEXT: movdqa %xmm1, %xmm0 1843; SSE4-NEXT: psrlw $8, %xmm0 1844; SSE4-NEXT: pminub %xmm1, %xmm0 1845; SSE4-NEXT: phminposuw %xmm0, %xmm0 1846; SSE4-NEXT: movd %xmm0, %eax 1847; SSE4-NEXT: xorb $127, %al 1848; SSE4-NEXT: # kill: def $al killed $al killed $eax 1849; SSE4-NEXT: retq 1850; 1851; AVX1-LABEL: test_v64i8: 1852; AVX1: # %bb.0: 1853; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 1854; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1855; AVX1-NEXT: vpmaxsb %xmm2, %xmm3, %xmm2 1856; AVX1-NEXT: vpmaxsb %xmm2, %xmm1, %xmm1 1857; AVX1-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0 1858; AVX1-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 1859; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1 1860; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0 1861; AVX1-NEXT: vphminposuw %xmm0, %xmm0 1862; AVX1-NEXT: vmovd %xmm0, %eax 1863; AVX1-NEXT: xorb $127, %al 1864; AVX1-NEXT: # kill: def $al killed $al killed $eax 1865; AVX1-NEXT: vzeroupper 1866; AVX1-NEXT: retq 1867; 1868; AVX2-LABEL: test_v64i8: 1869; AVX2: # %bb.0: 1870; AVX2-NEXT: vpmaxsb %ymm1, %ymm0, %ymm0 1871; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1872; AVX2-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0 1873; AVX2-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 1874; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1 1875; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0 1876; AVX2-NEXT: vphminposuw %xmm0, %xmm0 1877; AVX2-NEXT: vmovd %xmm0, %eax 1878; AVX2-NEXT: xorb $127, %al 1879; AVX2-NEXT: # kill: def $al killed $al killed $eax 1880; AVX2-NEXT: vzeroupper 1881; AVX2-NEXT: retq 1882; 1883; AVX512-LABEL: test_v64i8: 1884; AVX512: # %bb.0: 1885; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1 1886; AVX512-NEXT: vpmaxsb %ymm1, %ymm0, %ymm0 1887; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 1888; AVX512-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0 1889; AVX512-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 1890; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1 1891; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0 1892; AVX512-NEXT: vphminposuw %xmm0, %xmm0 1893; AVX512-NEXT: vmovd %xmm0, %eax 1894; AVX512-NEXT: xorb $127, %al 1895; AVX512-NEXT: # kill: def $al killed $al killed $eax 1896; AVX512-NEXT: vzeroupper 1897; AVX512-NEXT: retq 1898 %1 = call i8 @llvm.vector.reduce.smax.v64i8(<64 x i8> %a0) 1899 ret i8 %1 1900} 1901 1902define i8 @test_v128i8(<128 x i8> %a0) { 1903; SSE2-LABEL: test_v128i8: 1904; SSE2: # %bb.0: 1905; SSE2-NEXT: movdqa %xmm2, %xmm8 1906; SSE2-NEXT: pcmpgtb %xmm6, %xmm8 1907; SSE2-NEXT: pand %xmm8, %xmm2 1908; SSE2-NEXT: pandn %xmm6, %xmm8 1909; SSE2-NEXT: por %xmm2, %xmm8 1910; SSE2-NEXT: movdqa %xmm0, %xmm2 1911; SSE2-NEXT: pcmpgtb %xmm4, %xmm2 1912; SSE2-NEXT: pand %xmm2, %xmm0 1913; SSE2-NEXT: pandn %xmm4, %xmm2 1914; SSE2-NEXT: por %xmm0, %xmm2 1915; SSE2-NEXT: movdqa %xmm3, %xmm0 1916; SSE2-NEXT: pcmpgtb %xmm7, %xmm0 1917; SSE2-NEXT: pand %xmm0, %xmm3 1918; SSE2-NEXT: pandn %xmm7, %xmm0 1919; SSE2-NEXT: por %xmm3, %xmm0 1920; SSE2-NEXT: movdqa %xmm1, %xmm3 1921; SSE2-NEXT: pcmpgtb %xmm5, %xmm3 1922; SSE2-NEXT: pand %xmm3, %xmm1 1923; SSE2-NEXT: pandn %xmm5, %xmm3 1924; SSE2-NEXT: por %xmm1, %xmm3 1925; SSE2-NEXT: movdqa %xmm3, %xmm1 1926; SSE2-NEXT: pcmpgtb %xmm0, %xmm1 1927; SSE2-NEXT: pand %xmm1, %xmm3 1928; SSE2-NEXT: pandn %xmm0, %xmm1 1929; SSE2-NEXT: por %xmm3, %xmm1 1930; SSE2-NEXT: movdqa %xmm2, %xmm0 1931; SSE2-NEXT: pcmpgtb %xmm8, %xmm0 1932; SSE2-NEXT: pand %xmm0, %xmm2 1933; SSE2-NEXT: pandn %xmm8, %xmm0 1934; SSE2-NEXT: por %xmm2, %xmm0 1935; SSE2-NEXT: movdqa %xmm0, %xmm2 1936; SSE2-NEXT: pcmpgtb %xmm1, %xmm2 1937; SSE2-NEXT: pand %xmm2, %xmm0 1938; SSE2-NEXT: pandn %xmm1, %xmm2 1939; SSE2-NEXT: por %xmm0, %xmm2 1940; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3] 1941; SSE2-NEXT: movdqa %xmm2, %xmm1 1942; SSE2-NEXT: pcmpgtb %xmm0, %xmm1 1943; SSE2-NEXT: pand %xmm1, %xmm2 1944; SSE2-NEXT: pandn %xmm0, %xmm1 1945; SSE2-NEXT: por %xmm2, %xmm1 1946; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1] 1947; SSE2-NEXT: movdqa %xmm1, %xmm2 1948; SSE2-NEXT: pcmpgtb %xmm0, %xmm2 1949; SSE2-NEXT: pand %xmm2, %xmm1 1950; SSE2-NEXT: pandn %xmm0, %xmm2 1951; SSE2-NEXT: por %xmm1, %xmm2 1952; SSE2-NEXT: movdqa %xmm2, %xmm0 1953; SSE2-NEXT: psrld $16, %xmm0 1954; SSE2-NEXT: movdqa %xmm2, %xmm1 1955; SSE2-NEXT: pcmpgtb %xmm0, %xmm1 1956; SSE2-NEXT: pand %xmm1, %xmm2 1957; SSE2-NEXT: pandn %xmm0, %xmm1 1958; SSE2-NEXT: por %xmm2, %xmm1 1959; SSE2-NEXT: movdqa %xmm1, %xmm0 1960; SSE2-NEXT: psrlw $8, %xmm0 1961; SSE2-NEXT: movdqa %xmm1, %xmm2 1962; SSE2-NEXT: pcmpgtb %xmm0, %xmm2 1963; SSE2-NEXT: pand %xmm2, %xmm1 1964; SSE2-NEXT: pandn %xmm0, %xmm2 1965; SSE2-NEXT: por %xmm1, %xmm2 1966; SSE2-NEXT: movd %xmm2, %eax 1967; SSE2-NEXT: # kill: def $al killed $al killed $eax 1968; SSE2-NEXT: retq 1969; 1970; SSE4-LABEL: test_v128i8: 1971; SSE4: # %bb.0: 1972; SSE4-NEXT: pmaxsb %xmm7, %xmm3 1973; SSE4-NEXT: pmaxsb %xmm5, %xmm3 1974; SSE4-NEXT: pmaxsb %xmm1, %xmm3 1975; SSE4-NEXT: pmaxsb %xmm6, %xmm2 1976; SSE4-NEXT: pmaxsb %xmm4, %xmm2 1977; SSE4-NEXT: pmaxsb %xmm3, %xmm2 1978; SSE4-NEXT: pmaxsb %xmm0, %xmm2 1979; SSE4-NEXT: pxor {{.*}}(%rip), %xmm2 1980; SSE4-NEXT: movdqa %xmm2, %xmm0 1981; SSE4-NEXT: psrlw $8, %xmm0 1982; SSE4-NEXT: pminub %xmm2, %xmm0 1983; SSE4-NEXT: phminposuw %xmm0, %xmm0 1984; SSE4-NEXT: movd %xmm0, %eax 1985; SSE4-NEXT: xorb $127, %al 1986; SSE4-NEXT: # kill: def $al killed $al killed $eax 1987; SSE4-NEXT: retq 1988; 1989; AVX1-LABEL: test_v128i8: 1990; AVX1: # %bb.0: 1991; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 1992; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 1993; AVX1-NEXT: vpmaxsb %xmm4, %xmm5, %xmm4 1994; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5 1995; AVX1-NEXT: vpmaxsb %xmm4, %xmm5, %xmm4 1996; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 1997; AVX1-NEXT: vpmaxsb %xmm4, %xmm5, %xmm4 1998; AVX1-NEXT: vpmaxsb %xmm3, %xmm1, %xmm1 1999; AVX1-NEXT: vpmaxsb %xmm1, %xmm2, %xmm1 2000; AVX1-NEXT: vpmaxsb %xmm4, %xmm1, %xmm1 2001; AVX1-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0 2002; AVX1-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 2003; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1 2004; AVX1-NEXT: vpminub %xmm1, %xmm0, %xmm0 2005; AVX1-NEXT: vphminposuw %xmm0, %xmm0 2006; AVX1-NEXT: vmovd %xmm0, %eax 2007; AVX1-NEXT: xorb $127, %al 2008; AVX1-NEXT: # kill: def $al killed $al killed $eax 2009; AVX1-NEXT: vzeroupper 2010; AVX1-NEXT: retq 2011; 2012; AVX2-LABEL: test_v128i8: 2013; AVX2: # %bb.0: 2014; AVX2-NEXT: vpmaxsb %ymm3, %ymm1, %ymm1 2015; AVX2-NEXT: vpmaxsb %ymm1, %ymm2, %ymm1 2016; AVX2-NEXT: vpmaxsb %ymm1, %ymm0, %ymm0 2017; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 2018; AVX2-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0 2019; AVX2-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 2020; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1 2021; AVX2-NEXT: vpminub %xmm1, %xmm0, %xmm0 2022; AVX2-NEXT: vphminposuw %xmm0, %xmm0 2023; AVX2-NEXT: vmovd %xmm0, %eax 2024; AVX2-NEXT: xorb $127, %al 2025; AVX2-NEXT: # kill: def $al killed $al killed $eax 2026; AVX2-NEXT: vzeroupper 2027; AVX2-NEXT: retq 2028; 2029; AVX512-LABEL: test_v128i8: 2030; AVX512: # %bb.0: 2031; AVX512-NEXT: vpmaxsb %zmm1, %zmm0, %zmm0 2032; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm1 2033; AVX512-NEXT: vpmaxsb %ymm1, %ymm0, %ymm0 2034; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1 2035; AVX512-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0 2036; AVX512-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm0 2037; AVX512-NEXT: vpsrlw $8, %xmm0, %xmm1 2038; AVX512-NEXT: vpminub %xmm1, %xmm0, %xmm0 2039; AVX512-NEXT: vphminposuw %xmm0, %xmm0 2040; AVX512-NEXT: vmovd %xmm0, %eax 2041; AVX512-NEXT: xorb $127, %al 2042; AVX512-NEXT: # kill: def $al killed $al killed $eax 2043; AVX512-NEXT: vzeroupper 2044; AVX512-NEXT: retq 2045 %1 = call i8 @llvm.vector.reduce.smax.v128i8(<128 x i8> %a0) 2046 ret i8 %1 2047} 2048 2049declare i64 @llvm.vector.reduce.smax.v2i64(<2 x i64>) 2050declare i64 @llvm.vector.reduce.smax.v4i64(<4 x i64>) 2051declare i64 @llvm.vector.reduce.smax.v8i64(<8 x i64>) 2052declare i64 @llvm.vector.reduce.smax.v16i64(<16 x i64>) 2053 2054declare i32 @llvm.vector.reduce.smax.v2i32(<2 x i32>) 2055declare i32 @llvm.vector.reduce.smax.v4i32(<4 x i32>) 2056declare i32 @llvm.vector.reduce.smax.v8i32(<8 x i32>) 2057declare i32 @llvm.vector.reduce.smax.v16i32(<16 x i32>) 2058declare i32 @llvm.vector.reduce.smax.v32i32(<32 x i32>) 2059 2060declare i16 @llvm.vector.reduce.smax.v2i16(<2 x i16>) 2061declare i16 @llvm.vector.reduce.smax.v4i16(<4 x i16>) 2062declare i16 @llvm.vector.reduce.smax.v8i16(<8 x i16>) 2063declare i16 @llvm.vector.reduce.smax.v16i16(<16 x i16>) 2064declare i16 @llvm.vector.reduce.smax.v32i16(<32 x i16>) 2065declare i16 @llvm.vector.reduce.smax.v64i16(<64 x i16>) 2066 2067declare i8 @llvm.vector.reduce.smax.v2i8(<2 x i8>) 2068declare i8 @llvm.vector.reduce.smax.v4i8(<4 x i8>) 2069declare i8 @llvm.vector.reduce.smax.v8i8(<8 x i8>) 2070declare i8 @llvm.vector.reduce.smax.v16i8(<16 x i8>) 2071declare i8 @llvm.vector.reduce.smax.v32i8(<32 x i8>) 2072declare i8 @llvm.vector.reduce.smax.v64i8(<64 x i8>) 2073declare i8 @llvm.vector.reduce.smax.v128i8(<128 x i8>) 2074