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