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