Home | History | Annotate | Download | only in X86
      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