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