Home | History | Annotate | Download | only in X86
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+sse4.1,-avx < %s | FileCheck %s --check-prefix=SSE41
      3 ; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+avx,-avx2 < %s   | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
      4 ; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+avx512dq,+avx512bw < %s   | FileCheck %s --check-prefix=AVX --check-prefix=AVX512
      5 
      6 define i32 @veccond128(<4 x i32> %input) {
      7 ; SSE41-LABEL: veccond128:
      8 ; SSE41:       # %bb.0: # %entry
      9 ; SSE41-NEXT:    ptest %xmm0, %xmm0
     10 ; SSE41-NEXT:    je .LBB0_2
     11 ; SSE41-NEXT:  # %bb.1: # %if-true-block
     12 ; SSE41-NEXT:    xorl %eax, %eax
     13 ; SSE41-NEXT:    retq
     14 ; SSE41-NEXT:  .LBB0_2: # %endif-block
     15 ; SSE41-NEXT:    movl $1, %eax
     16 ; SSE41-NEXT:    retq
     17 ;
     18 ; AVX-LABEL: veccond128:
     19 ; AVX:       # %bb.0: # %entry
     20 ; AVX-NEXT:    vptest %xmm0, %xmm0
     21 ; AVX-NEXT:    je .LBB0_2
     22 ; AVX-NEXT:  # %bb.1: # %if-true-block
     23 ; AVX-NEXT:    xorl %eax, %eax
     24 ; AVX-NEXT:    retq
     25 ; AVX-NEXT:  .LBB0_2: # %endif-block
     26 ; AVX-NEXT:    movl $1, %eax
     27 ; AVX-NEXT:    retq
     28 entry:
     29   %0 = bitcast <4 x i32> %input to i128
     30   %1 = icmp ne i128 %0, 0
     31   br i1 %1, label %if-true-block, label %endif-block
     32 if-true-block:
     33   ret i32 0
     34 endif-block:
     35   ret i32 1
     36 }
     37 
     38 define i32 @veccond256(<8 x i32> %input) {
     39 ; SSE41-LABEL: veccond256:
     40 ; SSE41:       # %bb.0: # %entry
     41 ; SSE41-NEXT:    por %xmm1, %xmm0
     42 ; SSE41-NEXT:    ptest %xmm0, %xmm0
     43 ; SSE41-NEXT:    je .LBB1_2
     44 ; SSE41-NEXT:  # %bb.1: # %if-true-block
     45 ; SSE41-NEXT:    xorl %eax, %eax
     46 ; SSE41-NEXT:    retq
     47 ; SSE41-NEXT:  .LBB1_2: # %endif-block
     48 ; SSE41-NEXT:    movl $1, %eax
     49 ; SSE41-NEXT:    retq
     50 ;
     51 ; AVX-LABEL: veccond256:
     52 ; AVX:       # %bb.0: # %entry
     53 ; AVX-NEXT:    vptest %ymm0, %ymm0
     54 ; AVX-NEXT:    je .LBB1_2
     55 ; AVX-NEXT:  # %bb.1: # %if-true-block
     56 ; AVX-NEXT:    xorl %eax, %eax
     57 ; AVX-NEXT:    vzeroupper
     58 ; AVX-NEXT:    retq
     59 ; AVX-NEXT:  .LBB1_2: # %endif-block
     60 ; AVX-NEXT:    movl $1, %eax
     61 ; AVX-NEXT:    vzeroupper
     62 ; AVX-NEXT:    retq
     63 entry:
     64   %0 = bitcast <8 x i32> %input to i256
     65   %1 = icmp ne i256 %0, 0
     66   br i1 %1, label %if-true-block, label %endif-block
     67 if-true-block:
     68   ret i32 0
     69 endif-block:
     70   ret i32 1
     71 }
     72 
     73 define i32 @veccond512(<16 x i32> %input) {
     74 ; SSE41-LABEL: veccond512:
     75 ; SSE41:       # %bb.0: # %entry
     76 ; SSE41-NEXT:    por %xmm3, %xmm1
     77 ; SSE41-NEXT:    por %xmm2, %xmm1
     78 ; SSE41-NEXT:    por %xmm0, %xmm1
     79 ; SSE41-NEXT:    ptest %xmm1, %xmm1
     80 ; SSE41-NEXT:    je .LBB2_2
     81 ; SSE41-NEXT:  # %bb.1: # %if-true-block
     82 ; SSE41-NEXT:    xorl %eax, %eax
     83 ; SSE41-NEXT:    retq
     84 ; SSE41-NEXT:  .LBB2_2: # %endif-block
     85 ; SSE41-NEXT:    movl $1, %eax
     86 ; SSE41-NEXT:    retq
     87 ;
     88 ; AVX1-LABEL: veccond512:
     89 ; AVX1:       # %bb.0: # %entry
     90 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
     91 ; AVX1-NEXT:    vptest %ymm0, %ymm0
     92 ; AVX1-NEXT:    je .LBB2_2
     93 ; AVX1-NEXT:  # %bb.1: # %if-true-block
     94 ; AVX1-NEXT:    xorl %eax, %eax
     95 ; AVX1-NEXT:    vzeroupper
     96 ; AVX1-NEXT:    retq
     97 ; AVX1-NEXT:  .LBB2_2: # %endif-block
     98 ; AVX1-NEXT:    movl $1, %eax
     99 ; AVX1-NEXT:    vzeroupper
    100 ; AVX1-NEXT:    retq
    101 ;
    102 ; AVX512-LABEL: veccond512:
    103 ; AVX512:       # %bb.0: # %entry
    104 ; AVX512-NEXT:    vextracti32x4 $3, %zmm0, %xmm1
    105 ; AVX512-NEXT:    vmovq %xmm1, %rax
    106 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm2
    107 ; AVX512-NEXT:    vmovq %xmm2, %rcx
    108 ; AVX512-NEXT:    orq %rax, %rcx
    109 ; AVX512-NEXT:    vextracti32x4 $2, %zmm0, %xmm3
    110 ; AVX512-NEXT:    vmovq %xmm3, %rax
    111 ; AVX512-NEXT:    orq %rcx, %rax
    112 ; AVX512-NEXT:    vmovq %xmm0, %rcx
    113 ; AVX512-NEXT:    orq %rax, %rcx
    114 ; AVX512-NEXT:    vpextrq $1, %xmm1, %rax
    115 ; AVX512-NEXT:    vpextrq $1, %xmm2, %rdx
    116 ; AVX512-NEXT:    orq %rax, %rdx
    117 ; AVX512-NEXT:    vpextrq $1, %xmm3, %rax
    118 ; AVX512-NEXT:    orq %rdx, %rax
    119 ; AVX512-NEXT:    vpextrq $1, %xmm0, %rdx
    120 ; AVX512-NEXT:    orq %rax, %rdx
    121 ; AVX512-NEXT:    orq %rcx, %rdx
    122 ; AVX512-NEXT:    je .LBB2_2
    123 ; AVX512-NEXT:  # %bb.1: # %if-true-block
    124 ; AVX512-NEXT:    xorl %eax, %eax
    125 ; AVX512-NEXT:    vzeroupper
    126 ; AVX512-NEXT:    retq
    127 ; AVX512-NEXT:  .LBB2_2: # %endif-block
    128 ; AVX512-NEXT:    movl $1, %eax
    129 ; AVX512-NEXT:    vzeroupper
    130 ; AVX512-NEXT:    retq
    131 entry:
    132   %0 = bitcast <16 x i32> %input to i512
    133   %1 = icmp ne i512 %0, 0
    134   br i1 %1, label %if-true-block, label %endif-block
    135 if-true-block:
    136   ret i32 0
    137 endif-block:
    138   ret i32 1
    139 }
    140 
    141 define i32 @vectest128(<4 x i32> %input) {
    142 ; SSE41-LABEL: vectest128:
    143 ; SSE41:       # %bb.0:
    144 ; SSE41-NEXT:    xorl %eax, %eax
    145 ; SSE41-NEXT:    ptest %xmm0, %xmm0
    146 ; SSE41-NEXT:    setne %al
    147 ; SSE41-NEXT:    retq
    148 ;
    149 ; AVX-LABEL: vectest128:
    150 ; AVX:       # %bb.0:
    151 ; AVX-NEXT:    xorl %eax, %eax
    152 ; AVX-NEXT:    vptest %xmm0, %xmm0
    153 ; AVX-NEXT:    setne %al
    154 ; AVX-NEXT:    retq
    155   %t0 = bitcast <4 x i32> %input to i128
    156   %t1 = icmp ne i128 %t0, 0
    157   %t2 = zext i1 %t1 to i32
    158   ret i32 %t2
    159 }
    160 
    161 define i32 @vectest256(<8 x i32> %input) {
    162 ; SSE41-LABEL: vectest256:
    163 ; SSE41:       # %bb.0:
    164 ; SSE41-NEXT:    por %xmm1, %xmm0
    165 ; SSE41-NEXT:    xorl %eax, %eax
    166 ; SSE41-NEXT:    ptest %xmm0, %xmm0
    167 ; SSE41-NEXT:    setne %al
    168 ; SSE41-NEXT:    retq
    169 ;
    170 ; AVX-LABEL: vectest256:
    171 ; AVX:       # %bb.0:
    172 ; AVX-NEXT:    xorl %eax, %eax
    173 ; AVX-NEXT:    vptest %ymm0, %ymm0
    174 ; AVX-NEXT:    setne %al
    175 ; AVX-NEXT:    vzeroupper
    176 ; AVX-NEXT:    retq
    177   %t0 = bitcast <8 x i32> %input to i256
    178   %t1 = icmp ne i256 %t0, 0
    179   %t2 = zext i1 %t1 to i32
    180   ret i32 %t2
    181 }
    182 
    183 define i32 @vectest512(<16 x i32> %input) {
    184 ; SSE41-LABEL: vectest512:
    185 ; SSE41:       # %bb.0:
    186 ; SSE41-NEXT:    por %xmm3, %xmm1
    187 ; SSE41-NEXT:    por %xmm2, %xmm1
    188 ; SSE41-NEXT:    por %xmm0, %xmm1
    189 ; SSE41-NEXT:    xorl %eax, %eax
    190 ; SSE41-NEXT:    ptest %xmm1, %xmm1
    191 ; SSE41-NEXT:    setne %al
    192 ; SSE41-NEXT:    retq
    193 ;
    194 ; AVX1-LABEL: vectest512:
    195 ; AVX1:       # %bb.0:
    196 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
    197 ; AVX1-NEXT:    xorl %eax, %eax
    198 ; AVX1-NEXT:    vptest %ymm0, %ymm0
    199 ; AVX1-NEXT:    setne %al
    200 ; AVX1-NEXT:    vzeroupper
    201 ; AVX1-NEXT:    retq
    202 ;
    203 ; AVX512-LABEL: vectest512:
    204 ; AVX512:       # %bb.0:
    205 ; AVX512-NEXT:    vextracti32x4 $3, %zmm0, %xmm1
    206 ; AVX512-NEXT:    vmovq %xmm1, %rax
    207 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm2
    208 ; AVX512-NEXT:    vmovq %xmm2, %rcx
    209 ; AVX512-NEXT:    orq %rax, %rcx
    210 ; AVX512-NEXT:    vextracti32x4 $2, %zmm0, %xmm3
    211 ; AVX512-NEXT:    vmovq %xmm3, %rax
    212 ; AVX512-NEXT:    orq %rcx, %rax
    213 ; AVX512-NEXT:    vmovq %xmm0, %rcx
    214 ; AVX512-NEXT:    orq %rax, %rcx
    215 ; AVX512-NEXT:    vpextrq $1, %xmm1, %rax
    216 ; AVX512-NEXT:    vpextrq $1, %xmm2, %rdx
    217 ; AVX512-NEXT:    orq %rax, %rdx
    218 ; AVX512-NEXT:    vpextrq $1, %xmm3, %rax
    219 ; AVX512-NEXT:    orq %rdx, %rax
    220 ; AVX512-NEXT:    vpextrq $1, %xmm0, %rdx
    221 ; AVX512-NEXT:    orq %rax, %rdx
    222 ; AVX512-NEXT:    xorl %eax, %eax
    223 ; AVX512-NEXT:    orq %rcx, %rdx
    224 ; AVX512-NEXT:    setne %al
    225 ; AVX512-NEXT:    vzeroupper
    226 ; AVX512-NEXT:    retq
    227   %t0 = bitcast <16 x i32> %input to i512
    228   %t1 = icmp ne i512 %t0, 0
    229   %t2 = zext i1 %t1 to i32
    230   ret i32 %t2
    231 }
    232 
    233 define i32 @vecsel128(<4 x i32> %input, i32 %a, i32 %b) {
    234 ; SSE41-LABEL: vecsel128:
    235 ; SSE41:       # %bb.0:
    236 ; SSE41-NEXT:    ptest %xmm0, %xmm0
    237 ; SSE41-NEXT:    cmovel %esi, %edi
    238 ; SSE41-NEXT:    movl %edi, %eax
    239 ; SSE41-NEXT:    retq
    240 ;
    241 ; AVX-LABEL: vecsel128:
    242 ; AVX:       # %bb.0:
    243 ; AVX-NEXT:    vptest %xmm0, %xmm0
    244 ; AVX-NEXT:    cmovel %esi, %edi
    245 ; AVX-NEXT:    movl %edi, %eax
    246 ; AVX-NEXT:    retq
    247   %t0 = bitcast <4 x i32> %input to i128
    248   %t1 = icmp ne i128 %t0, 0
    249   %t2 = select i1 %t1, i32 %a, i32 %b
    250   ret i32 %t2
    251 }
    252 
    253 define i32 @vecsel256(<8 x i32> %input, i32 %a, i32 %b) {
    254 ; SSE41-LABEL: vecsel256:
    255 ; SSE41:       # %bb.0:
    256 ; SSE41-NEXT:    por %xmm1, %xmm0
    257 ; SSE41-NEXT:    ptest %xmm0, %xmm0
    258 ; SSE41-NEXT:    cmovel %esi, %edi
    259 ; SSE41-NEXT:    movl %edi, %eax
    260 ; SSE41-NEXT:    retq
    261 ;
    262 ; AVX-LABEL: vecsel256:
    263 ; AVX:       # %bb.0:
    264 ; AVX-NEXT:    vptest %ymm0, %ymm0
    265 ; AVX-NEXT:    cmovel %esi, %edi
    266 ; AVX-NEXT:    movl %edi, %eax
    267 ; AVX-NEXT:    vzeroupper
    268 ; AVX-NEXT:    retq
    269   %t0 = bitcast <8 x i32> %input to i256
    270   %t1 = icmp ne i256 %t0, 0
    271   %t2 = select i1 %t1, i32 %a, i32 %b
    272   ret i32 %t2
    273 }
    274 
    275 define i32 @vecsel512(<16 x i32> %input, i32 %a, i32 %b) {
    276 ; SSE41-LABEL: vecsel512:
    277 ; SSE41:       # %bb.0:
    278 ; SSE41-NEXT:    por %xmm3, %xmm1
    279 ; SSE41-NEXT:    por %xmm2, %xmm1
    280 ; SSE41-NEXT:    por %xmm0, %xmm1
    281 ; SSE41-NEXT:    ptest %xmm1, %xmm1
    282 ; SSE41-NEXT:    cmovel %esi, %edi
    283 ; SSE41-NEXT:    movl %edi, %eax
    284 ; SSE41-NEXT:    retq
    285 ;
    286 ; AVX1-LABEL: vecsel512:
    287 ; AVX1:       # %bb.0:
    288 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
    289 ; AVX1-NEXT:    vptest %ymm0, %ymm0
    290 ; AVX1-NEXT:    cmovel %esi, %edi
    291 ; AVX1-NEXT:    movl %edi, %eax
    292 ; AVX1-NEXT:    vzeroupper
    293 ; AVX1-NEXT:    retq
    294 ;
    295 ; AVX512-LABEL: vecsel512:
    296 ; AVX512:       # %bb.0:
    297 ; AVX512-NEXT:    vextracti32x4 $3, %zmm0, %xmm1
    298 ; AVX512-NEXT:    vmovq %xmm1, %rax
    299 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm2
    300 ; AVX512-NEXT:    vmovq %xmm2, %rcx
    301 ; AVX512-NEXT:    orq %rax, %rcx
    302 ; AVX512-NEXT:    vextracti32x4 $2, %zmm0, %xmm3
    303 ; AVX512-NEXT:    vmovq %xmm3, %rax
    304 ; AVX512-NEXT:    orq %rcx, %rax
    305 ; AVX512-NEXT:    vmovq %xmm0, %rcx
    306 ; AVX512-NEXT:    orq %rax, %rcx
    307 ; AVX512-NEXT:    vpextrq $1, %xmm1, %rax
    308 ; AVX512-NEXT:    vpextrq $1, %xmm2, %rdx
    309 ; AVX512-NEXT:    orq %rax, %rdx
    310 ; AVX512-NEXT:    vpextrq $1, %xmm3, %rax
    311 ; AVX512-NEXT:    orq %rdx, %rax
    312 ; AVX512-NEXT:    vpextrq $1, %xmm0, %rdx
    313 ; AVX512-NEXT:    orq %rax, %rdx
    314 ; AVX512-NEXT:    orq %rcx, %rdx
    315 ; AVX512-NEXT:    cmovel %esi, %edi
    316 ; AVX512-NEXT:    movl %edi, %eax
    317 ; AVX512-NEXT:    vzeroupper
    318 ; AVX512-NEXT:    retq
    319   %t0 = bitcast <16 x i32> %input to i512
    320   %t1 = icmp ne i512 %t0, 0
    321   %t2 = select i1 %t1, i32 %a, i32 %b
    322   ret i32 %t2
    323 }
    324