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