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