1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE 3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX12,AVX1 4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX12,AVX2 5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512F 6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512BW 7 8 define i32 @v32i16(<32 x i16> %a, <32 x i16> %b) { 9 ; SSE-LABEL: v32i16: 10 ; SSE: # %bb.0: 11 ; SSE-NEXT: pcmpgtw %xmm5, %xmm1 12 ; SSE-NEXT: pcmpgtw %xmm4, %xmm0 13 ; SSE-NEXT: packsswb %xmm1, %xmm0 14 ; SSE-NEXT: pmovmskb %xmm0, %ecx 15 ; SSE-NEXT: pcmpgtw %xmm7, %xmm3 16 ; SSE-NEXT: pcmpgtw %xmm6, %xmm2 17 ; SSE-NEXT: packsswb %xmm3, %xmm2 18 ; SSE-NEXT: pmovmskb %xmm2, %eax 19 ; SSE-NEXT: shll $16, %eax 20 ; SSE-NEXT: orl %ecx, %eax 21 ; SSE-NEXT: retq 22 ; 23 ; AVX1-LABEL: v32i16: 24 ; AVX1: # %bb.0: 25 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4 26 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 27 ; AVX1-NEXT: vpcmpgtw %xmm4, %xmm5, %xmm4 28 ; AVX1-NEXT: vpcmpgtw %xmm2, %xmm0, %xmm0 29 ; AVX1-NEXT: vpacksswb %xmm4, %xmm0, %xmm0 30 ; AVX1-NEXT: vpmovmskb %xmm0, %ecx 31 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm0 32 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 33 ; AVX1-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm0 34 ; AVX1-NEXT: vpcmpgtw %xmm3, %xmm1, %xmm1 35 ; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm0 36 ; AVX1-NEXT: vpmovmskb %xmm0, %eax 37 ; AVX1-NEXT: shll $16, %eax 38 ; AVX1-NEXT: orl %ecx, %eax 39 ; AVX1-NEXT: vzeroupper 40 ; AVX1-NEXT: retq 41 ; 42 ; AVX2-LABEL: v32i16: 43 ; AVX2: # %bb.0: 44 ; AVX2-NEXT: vpcmpgtw %ymm3, %ymm1, %ymm1 45 ; AVX2-NEXT: vpcmpgtw %ymm2, %ymm0, %ymm0 46 ; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm0 47 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 48 ; AVX2-NEXT: vpmovmskb %ymm0, %eax 49 ; AVX2-NEXT: vzeroupper 50 ; AVX2-NEXT: retq 51 ; 52 ; AVX512F-LABEL: v32i16: 53 ; AVX512F: # %bb.0: 54 ; AVX512F-NEXT: vpcmpgtw %ymm2, %ymm0, %ymm0 55 ; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0 56 ; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 57 ; AVX512F-NEXT: kmovw %k0, %ecx 58 ; AVX512F-NEXT: vpcmpgtw %ymm3, %ymm1, %ymm0 59 ; AVX512F-NEXT: vpmovsxwd %ymm0, %zmm0 60 ; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 61 ; AVX512F-NEXT: kmovw %k0, %eax 62 ; AVX512F-NEXT: shll $16, %eax 63 ; AVX512F-NEXT: orl %ecx, %eax 64 ; AVX512F-NEXT: vzeroupper 65 ; AVX512F-NEXT: retq 66 ; 67 ; AVX512BW-LABEL: v32i16: 68 ; AVX512BW: # %bb.0: 69 ; AVX512BW-NEXT: vpcmpgtw %zmm1, %zmm0, %k0 70 ; AVX512BW-NEXT: kmovd %k0, %eax 71 ; AVX512BW-NEXT: vzeroupper 72 ; AVX512BW-NEXT: retq 73 %x = icmp sgt <32 x i16> %a, %b 74 %res = bitcast <32 x i1> %x to i32 75 ret i32 %res 76 } 77 78 define i16 @v16i32(<16 x i32> %a, <16 x i32> %b) { 79 ; SSE-LABEL: v16i32: 80 ; SSE: # %bb.0: 81 ; SSE-NEXT: pcmpgtd %xmm7, %xmm3 82 ; SSE-NEXT: pcmpgtd %xmm6, %xmm2 83 ; SSE-NEXT: packssdw %xmm3, %xmm2 84 ; SSE-NEXT: pcmpgtd %xmm5, %xmm1 85 ; SSE-NEXT: pcmpgtd %xmm4, %xmm0 86 ; SSE-NEXT: packssdw %xmm1, %xmm0 87 ; SSE-NEXT: packsswb %xmm2, %xmm0 88 ; SSE-NEXT: pmovmskb %xmm0, %eax 89 ; SSE-NEXT: # kill: def $ax killed $ax killed $eax 90 ; SSE-NEXT: retq 91 ; 92 ; AVX1-LABEL: v16i32: 93 ; AVX1: # %bb.0: 94 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 95 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 96 ; AVX1-NEXT: vpcmpgtd %xmm4, %xmm5, %xmm4 97 ; AVX1-NEXT: vpcmpgtd %xmm3, %xmm1, %xmm1 98 ; AVX1-NEXT: vpackssdw %xmm4, %xmm1, %xmm1 99 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 100 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 101 ; AVX1-NEXT: vpcmpgtd %xmm3, %xmm4, %xmm3 102 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm0 103 ; AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0 104 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 105 ; AVX1-NEXT: vpmovmskb %xmm0, %eax 106 ; AVX1-NEXT: # kill: def $ax killed $ax killed $eax 107 ; AVX1-NEXT: vzeroupper 108 ; AVX1-NEXT: retq 109 ; 110 ; AVX2-LABEL: v16i32: 111 ; AVX2: # %bb.0: 112 ; AVX2-NEXT: vpcmpgtd %ymm3, %ymm1, %ymm1 113 ; AVX2-NEXT: vpcmpgtd %ymm2, %ymm0, %ymm0 114 ; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0 115 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 116 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 117 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 118 ; AVX2-NEXT: vpmovmskb %xmm0, %eax 119 ; AVX2-NEXT: # kill: def $ax killed $ax killed $eax 120 ; AVX2-NEXT: vzeroupper 121 ; AVX2-NEXT: retq 122 ; 123 ; AVX512F-LABEL: v16i32: 124 ; AVX512F: # %bb.0: 125 ; AVX512F-NEXT: vpcmpgtd %zmm1, %zmm0, %k0 126 ; AVX512F-NEXT: kmovw %k0, %eax 127 ; AVX512F-NEXT: # kill: def $ax killed $ax killed $eax 128 ; AVX512F-NEXT: vzeroupper 129 ; AVX512F-NEXT: retq 130 ; 131 ; AVX512BW-LABEL: v16i32: 132 ; AVX512BW: # %bb.0: 133 ; AVX512BW-NEXT: vpcmpgtd %zmm1, %zmm0, %k0 134 ; AVX512BW-NEXT: kmovd %k0, %eax 135 ; AVX512BW-NEXT: # kill: def $ax killed $ax killed $eax 136 ; AVX512BW-NEXT: vzeroupper 137 ; AVX512BW-NEXT: retq 138 %x = icmp sgt <16 x i32> %a, %b 139 %res = bitcast <16 x i1> %x to i16 140 ret i16 %res 141 } 142 143 define i16 @v16f32(<16 x float> %a, <16 x float> %b) { 144 ; SSE-LABEL: v16f32: 145 ; SSE: # %bb.0: 146 ; SSE-NEXT: cmpltps %xmm3, %xmm7 147 ; SSE-NEXT: cmpltps %xmm2, %xmm6 148 ; SSE-NEXT: packssdw %xmm7, %xmm6 149 ; SSE-NEXT: cmpltps %xmm1, %xmm5 150 ; SSE-NEXT: cmpltps %xmm0, %xmm4 151 ; SSE-NEXT: packssdw %xmm5, %xmm4 152 ; SSE-NEXT: packsswb %xmm6, %xmm4 153 ; SSE-NEXT: pmovmskb %xmm4, %eax 154 ; SSE-NEXT: # kill: def $ax killed $ax killed $eax 155 ; SSE-NEXT: retq 156 ; 157 ; AVX1-LABEL: v16f32: 158 ; AVX1: # %bb.0: 159 ; AVX1-NEXT: vcmpltps %ymm1, %ymm3, %ymm1 160 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 161 ; AVX1-NEXT: vpackssdw %xmm3, %xmm1, %xmm1 162 ; AVX1-NEXT: vcmpltps %ymm0, %ymm2, %ymm0 163 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 164 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0 165 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 166 ; AVX1-NEXT: vpmovmskb %xmm0, %eax 167 ; AVX1-NEXT: # kill: def $ax killed $ax killed $eax 168 ; AVX1-NEXT: vzeroupper 169 ; AVX1-NEXT: retq 170 ; 171 ; AVX2-LABEL: v16f32: 172 ; AVX2: # %bb.0: 173 ; AVX2-NEXT: vcmpltps %ymm1, %ymm3, %ymm1 174 ; AVX2-NEXT: vcmpltps %ymm0, %ymm2, %ymm0 175 ; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0 176 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 177 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 178 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 179 ; AVX2-NEXT: vpmovmskb %xmm0, %eax 180 ; AVX2-NEXT: # kill: def $ax killed $ax killed $eax 181 ; AVX2-NEXT: vzeroupper 182 ; AVX2-NEXT: retq 183 ; 184 ; AVX512F-LABEL: v16f32: 185 ; AVX512F: # %bb.0: 186 ; AVX512F-NEXT: vcmpltps %zmm0, %zmm1, %k0 187 ; AVX512F-NEXT: kmovw %k0, %eax 188 ; AVX512F-NEXT: # kill: def $ax killed $ax killed $eax 189 ; AVX512F-NEXT: vzeroupper 190 ; AVX512F-NEXT: retq 191 ; 192 ; AVX512BW-LABEL: v16f32: 193 ; AVX512BW: # %bb.0: 194 ; AVX512BW-NEXT: vcmpltps %zmm0, %zmm1, %k0 195 ; AVX512BW-NEXT: kmovd %k0, %eax 196 ; AVX512BW-NEXT: # kill: def $ax killed $ax killed $eax 197 ; AVX512BW-NEXT: vzeroupper 198 ; AVX512BW-NEXT: retq 199 %x = fcmp ogt <16 x float> %a, %b 200 %res = bitcast <16 x i1> %x to i16 201 ret i16 %res 202 } 203 204 define i64 @v64i8(<64 x i8> %a, <64 x i8> %b) { 205 ; SSE-LABEL: v64i8: 206 ; SSE: # %bb.0: 207 ; SSE-NEXT: pcmpgtb %xmm4, %xmm0 208 ; SSE-NEXT: pmovmskb %xmm0, %eax 209 ; SSE-NEXT: pcmpgtb %xmm5, %xmm1 210 ; SSE-NEXT: pmovmskb %xmm1, %ecx 211 ; SSE-NEXT: shll $16, %ecx 212 ; SSE-NEXT: orl %eax, %ecx 213 ; SSE-NEXT: pcmpgtb %xmm6, %xmm2 214 ; SSE-NEXT: pmovmskb %xmm2, %edx 215 ; SSE-NEXT: pcmpgtb %xmm7, %xmm3 216 ; SSE-NEXT: pmovmskb %xmm3, %eax 217 ; SSE-NEXT: shll $16, %eax 218 ; SSE-NEXT: orl %edx, %eax 219 ; SSE-NEXT: shlq $32, %rax 220 ; SSE-NEXT: orq %rcx, %rax 221 ; SSE-NEXT: retq 222 ; 223 ; AVX1-LABEL: v64i8: 224 ; AVX1: # %bb.0: 225 ; AVX1-NEXT: vpcmpgtb %xmm2, %xmm0, %xmm4 226 ; AVX1-NEXT: vpmovmskb %xmm4, %eax 227 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2 228 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 229 ; AVX1-NEXT: vpcmpgtb %xmm2, %xmm0, %xmm0 230 ; AVX1-NEXT: vpmovmskb %xmm0, %ecx 231 ; AVX1-NEXT: shll $16, %ecx 232 ; AVX1-NEXT: orl %eax, %ecx 233 ; AVX1-NEXT: vpcmpgtb %xmm3, %xmm1, %xmm0 234 ; AVX1-NEXT: vpmovmskb %xmm0, %edx 235 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm0 236 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 237 ; AVX1-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm0 238 ; AVX1-NEXT: vpmovmskb %xmm0, %eax 239 ; AVX1-NEXT: shll $16, %eax 240 ; AVX1-NEXT: orl %edx, %eax 241 ; AVX1-NEXT: shlq $32, %rax 242 ; AVX1-NEXT: orq %rcx, %rax 243 ; AVX1-NEXT: vzeroupper 244 ; AVX1-NEXT: retq 245 ; 246 ; AVX2-LABEL: v64i8: 247 ; AVX2: # %bb.0: 248 ; AVX2-NEXT: vpcmpgtb %ymm2, %ymm0, %ymm0 249 ; AVX2-NEXT: vpmovmskb %ymm0, %ecx 250 ; AVX2-NEXT: vpcmpgtb %ymm3, %ymm1, %ymm0 251 ; AVX2-NEXT: vpmovmskb %ymm0, %eax 252 ; AVX2-NEXT: shlq $32, %rax 253 ; AVX2-NEXT: orq %rcx, %rax 254 ; AVX2-NEXT: vzeroupper 255 ; AVX2-NEXT: retq 256 ; 257 ; AVX512F-LABEL: v64i8: 258 ; AVX512F: # %bb.0: 259 ; AVX512F-NEXT: vpcmpgtb %ymm2, %ymm0, %ymm0 260 ; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm2 261 ; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 262 ; AVX512F-NEXT: kmovw %k0, %eax 263 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0 264 ; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0 265 ; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 266 ; AVX512F-NEXT: kmovw %k0, %ecx 267 ; AVX512F-NEXT: shll $16, %ecx 268 ; AVX512F-NEXT: orl %eax, %ecx 269 ; AVX512F-NEXT: vpcmpgtb %ymm3, %ymm1, %ymm0 270 ; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm1 271 ; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 272 ; AVX512F-NEXT: kmovw %k0, %edx 273 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0 274 ; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0 275 ; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 276 ; AVX512F-NEXT: kmovw %k0, %eax 277 ; AVX512F-NEXT: shll $16, %eax 278 ; AVX512F-NEXT: orl %edx, %eax 279 ; AVX512F-NEXT: shlq $32, %rax 280 ; AVX512F-NEXT: orq %rcx, %rax 281 ; AVX512F-NEXT: vzeroupper 282 ; AVX512F-NEXT: retq 283 ; 284 ; AVX512BW-LABEL: v64i8: 285 ; AVX512BW: # %bb.0: 286 ; AVX512BW-NEXT: vpcmpgtb %zmm1, %zmm0, %k0 287 ; AVX512BW-NEXT: kmovq %k0, %rax 288 ; AVX512BW-NEXT: vzeroupper 289 ; AVX512BW-NEXT: retq 290 %x = icmp sgt <64 x i8> %a, %b 291 %res = bitcast <64 x i1> %x to i64 292 ret i64 %res 293 } 294 295 define i8 @v8i64(<8 x i64> %a, <8 x i64> %b) { 296 ; SSE-LABEL: v8i64: 297 ; SSE: # %bb.0: 298 ; SSE-NEXT: pcmpgtq %xmm7, %xmm3 299 ; SSE-NEXT: pcmpgtq %xmm6, %xmm2 300 ; SSE-NEXT: packssdw %xmm3, %xmm2 301 ; SSE-NEXT: pcmpgtq %xmm5, %xmm1 302 ; SSE-NEXT: pcmpgtq %xmm4, %xmm0 303 ; SSE-NEXT: packssdw %xmm1, %xmm0 304 ; SSE-NEXT: packssdw %xmm2, %xmm0 305 ; SSE-NEXT: packsswb %xmm0, %xmm0 306 ; SSE-NEXT: pmovmskb %xmm0, %eax 307 ; SSE-NEXT: # kill: def $al killed $al killed $eax 308 ; SSE-NEXT: retq 309 ; 310 ; AVX1-LABEL: v8i64: 311 ; AVX1: # %bb.0: 312 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4 313 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 314 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4 315 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm1, %xmm1 316 ; AVX1-NEXT: vpackssdw %xmm4, %xmm1, %xmm1 317 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 318 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 319 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3 320 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm0 321 ; AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0 322 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 323 ; AVX1-NEXT: vmovmskps %ymm0, %eax 324 ; AVX1-NEXT: # kill: def $al killed $al killed $eax 325 ; AVX1-NEXT: vzeroupper 326 ; AVX1-NEXT: retq 327 ; 328 ; AVX2-LABEL: v8i64: 329 ; AVX2: # %bb.0: 330 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm1, %ymm1 331 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm0 332 ; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0 333 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 334 ; AVX2-NEXT: vmovmskps %ymm0, %eax 335 ; AVX2-NEXT: # kill: def $al killed $al killed $eax 336 ; AVX2-NEXT: vzeroupper 337 ; AVX2-NEXT: retq 338 ; 339 ; AVX512F-LABEL: v8i64: 340 ; AVX512F: # %bb.0: 341 ; AVX512F-NEXT: vpcmpgtq %zmm1, %zmm0, %k0 342 ; AVX512F-NEXT: kmovw %k0, %eax 343 ; AVX512F-NEXT: # kill: def $al killed $al killed $eax 344 ; AVX512F-NEXT: vzeroupper 345 ; AVX512F-NEXT: retq 346 ; 347 ; AVX512BW-LABEL: v8i64: 348 ; AVX512BW: # %bb.0: 349 ; AVX512BW-NEXT: vpcmpgtq %zmm1, %zmm0, %k0 350 ; AVX512BW-NEXT: kmovd %k0, %eax 351 ; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 352 ; AVX512BW-NEXT: vzeroupper 353 ; AVX512BW-NEXT: retq 354 %x = icmp sgt <8 x i64> %a, %b 355 %res = bitcast <8 x i1> %x to i8 356 ret i8 %res 357 } 358 359 define i8 @v8f64(<8 x double> %a, <8 x double> %b) { 360 ; SSE-LABEL: v8f64: 361 ; SSE: # %bb.0: 362 ; SSE-NEXT: cmpltpd %xmm3, %xmm7 363 ; SSE-NEXT: cmpltpd %xmm2, %xmm6 364 ; SSE-NEXT: packssdw %xmm7, %xmm6 365 ; SSE-NEXT: cmpltpd %xmm1, %xmm5 366 ; SSE-NEXT: cmpltpd %xmm0, %xmm4 367 ; SSE-NEXT: packssdw %xmm5, %xmm4 368 ; SSE-NEXT: packssdw %xmm6, %xmm4 369 ; SSE-NEXT: packsswb %xmm0, %xmm4 370 ; SSE-NEXT: pmovmskb %xmm4, %eax 371 ; SSE-NEXT: # kill: def $al killed $al killed $eax 372 ; SSE-NEXT: retq 373 ; 374 ; AVX1-LABEL: v8f64: 375 ; AVX1: # %bb.0: 376 ; AVX1-NEXT: vcmpltpd %ymm1, %ymm3, %ymm1 377 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 378 ; AVX1-NEXT: vpackssdw %xmm3, %xmm1, %xmm1 379 ; AVX1-NEXT: vcmpltpd %ymm0, %ymm2, %ymm0 380 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 381 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0 382 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 383 ; AVX1-NEXT: vmovmskps %ymm0, %eax 384 ; AVX1-NEXT: # kill: def $al killed $al killed $eax 385 ; AVX1-NEXT: vzeroupper 386 ; AVX1-NEXT: retq 387 ; 388 ; AVX2-LABEL: v8f64: 389 ; AVX2: # %bb.0: 390 ; AVX2-NEXT: vcmpltpd %ymm1, %ymm3, %ymm1 391 ; AVX2-NEXT: vcmpltpd %ymm0, %ymm2, %ymm0 392 ; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0 393 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 394 ; AVX2-NEXT: vmovmskps %ymm0, %eax 395 ; AVX2-NEXT: # kill: def $al killed $al killed $eax 396 ; AVX2-NEXT: vzeroupper 397 ; AVX2-NEXT: retq 398 ; 399 ; AVX512F-LABEL: v8f64: 400 ; AVX512F: # %bb.0: 401 ; AVX512F-NEXT: vcmpltpd %zmm0, %zmm1, %k0 402 ; AVX512F-NEXT: kmovw %k0, %eax 403 ; AVX512F-NEXT: # kill: def $al killed $al killed $eax 404 ; AVX512F-NEXT: vzeroupper 405 ; AVX512F-NEXT: retq 406 ; 407 ; AVX512BW-LABEL: v8f64: 408 ; AVX512BW: # %bb.0: 409 ; AVX512BW-NEXT: vcmpltpd %zmm0, %zmm1, %k0 410 ; AVX512BW-NEXT: kmovd %k0, %eax 411 ; AVX512BW-NEXT: # kill: def $al killed $al killed $eax 412 ; AVX512BW-NEXT: vzeroupper 413 ; AVX512BW-NEXT: retq 414 %x = fcmp ogt <8 x double> %a, %b 415 %res = bitcast <8 x i1> %x to i8 416 ret i8 %res 417 } 418