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