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=+sse2 | FileCheck %s
      3 
      4 declare <2 x i64> @llvm.cttz.v2i64(<2 x i64>, i1)
      5 declare <2 x i64> @llvm.ctlz.v2i64(<2 x i64>, i1)
      6 declare <2 x i64> @llvm.ctpop.v2i64(<2 x i64>)
      7 
      8 define <2 x i64> @footz(<2 x i64> %a) nounwind {
      9 ; CHECK-LABEL: footz:
     10 ; CHECK:       # %bb.0:
     11 ; CHECK-NEXT:    pxor %xmm1, %xmm1
     12 ; CHECK-NEXT:    pxor %xmm2, %xmm2
     13 ; CHECK-NEXT:    psubq %xmm0, %xmm2
     14 ; CHECK-NEXT:    pand %xmm0, %xmm2
     15 ; CHECK-NEXT:    pcmpeqd %xmm3, %xmm3
     16 ; CHECK-NEXT:    paddq %xmm2, %xmm3
     17 ; CHECK-NEXT:    movdqa %xmm3, %xmm0
     18 ; CHECK-NEXT:    psrlq $1, %xmm0
     19 ; CHECK-NEXT:    pand {{.*}}(%rip), %xmm0
     20 ; CHECK-NEXT:    psubq %xmm0, %xmm3
     21 ; CHECK-NEXT:    movdqa {{.*#+}} xmm0 = [3689348814741910323,3689348814741910323]
     22 ; CHECK-NEXT:    movdqa %xmm3, %xmm2
     23 ; CHECK-NEXT:    pand %xmm0, %xmm2
     24 ; CHECK-NEXT:    psrlq $2, %xmm3
     25 ; CHECK-NEXT:    pand %xmm0, %xmm3
     26 ; CHECK-NEXT:    paddq %xmm2, %xmm3
     27 ; CHECK-NEXT:    movdqa %xmm3, %xmm0
     28 ; CHECK-NEXT:    psrlq $4, %xmm0
     29 ; CHECK-NEXT:    paddq %xmm3, %xmm0
     30 ; CHECK-NEXT:    pand {{.*}}(%rip), %xmm0
     31 ; CHECK-NEXT:    psadbw %xmm1, %xmm0
     32 ; CHECK-NEXT:    retq
     33   %c = call <2 x i64> @llvm.cttz.v2i64(<2 x i64> %a, i1 true)
     34   ret <2 x i64> %c
     35 
     36 }
     37 define <2 x i64> @foolz(<2 x i64> %a) nounwind {
     38 ; CHECK-LABEL: foolz:
     39 ; CHECK:       # %bb.0:
     40 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
     41 ; CHECK-NEXT:    psrlq $1, %xmm1
     42 ; CHECK-NEXT:    por %xmm0, %xmm1
     43 ; CHECK-NEXT:    movdqa %xmm1, %xmm0
     44 ; CHECK-NEXT:    psrlq $2, %xmm0
     45 ; CHECK-NEXT:    por %xmm1, %xmm0
     46 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
     47 ; CHECK-NEXT:    psrlq $4, %xmm1
     48 ; CHECK-NEXT:    por %xmm0, %xmm1
     49 ; CHECK-NEXT:    movdqa %xmm1, %xmm0
     50 ; CHECK-NEXT:    psrlq $8, %xmm0
     51 ; CHECK-NEXT:    por %xmm1, %xmm0
     52 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
     53 ; CHECK-NEXT:    psrlq $16, %xmm1
     54 ; CHECK-NEXT:    por %xmm0, %xmm1
     55 ; CHECK-NEXT:    movdqa %xmm1, %xmm0
     56 ; CHECK-NEXT:    psrlq $32, %xmm0
     57 ; CHECK-NEXT:    por %xmm1, %xmm0
     58 ; CHECK-NEXT:    pcmpeqd %xmm1, %xmm1
     59 ; CHECK-NEXT:    pxor %xmm0, %xmm1
     60 ; CHECK-NEXT:    movdqa %xmm1, %xmm0
     61 ; CHECK-NEXT:    psrlq $1, %xmm0
     62 ; CHECK-NEXT:    pand {{.*}}(%rip), %xmm0
     63 ; CHECK-NEXT:    psubq %xmm0, %xmm1
     64 ; CHECK-NEXT:    movdqa {{.*#+}} xmm0 = [3689348814741910323,3689348814741910323]
     65 ; CHECK-NEXT:    movdqa %xmm1, %xmm2
     66 ; CHECK-NEXT:    pand %xmm0, %xmm2
     67 ; CHECK-NEXT:    psrlq $2, %xmm1
     68 ; CHECK-NEXT:    pand %xmm0, %xmm1
     69 ; CHECK-NEXT:    paddq %xmm2, %xmm1
     70 ; CHECK-NEXT:    movdqa %xmm1, %xmm2
     71 ; CHECK-NEXT:    psrlq $4, %xmm2
     72 ; CHECK-NEXT:    paddq %xmm1, %xmm2
     73 ; CHECK-NEXT:    pand {{.*}}(%rip), %xmm2
     74 ; CHECK-NEXT:    pxor %xmm0, %xmm0
     75 ; CHECK-NEXT:    psadbw %xmm2, %xmm0
     76 ; CHECK-NEXT:    retq
     77   %c = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %a, i1 true)
     78   ret <2 x i64> %c
     79 
     80 }
     81 
     82 define <2 x i64> @foopop(<2 x i64> %a) nounwind {
     83 ; CHECK-LABEL: foopop:
     84 ; CHECK:       # %bb.0:
     85 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
     86 ; CHECK-NEXT:    psrlq $1, %xmm1
     87 ; CHECK-NEXT:    pand {{.*}}(%rip), %xmm1
     88 ; CHECK-NEXT:    psubq %xmm1, %xmm0
     89 ; CHECK-NEXT:    movdqa {{.*#+}} xmm1 = [3689348814741910323,3689348814741910323]
     90 ; CHECK-NEXT:    movdqa %xmm0, %xmm2
     91 ; CHECK-NEXT:    pand %xmm1, %xmm2
     92 ; CHECK-NEXT:    psrlq $2, %xmm0
     93 ; CHECK-NEXT:    pand %xmm1, %xmm0
     94 ; CHECK-NEXT:    paddq %xmm2, %xmm0
     95 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
     96 ; CHECK-NEXT:    psrlq $4, %xmm1
     97 ; CHECK-NEXT:    paddq %xmm0, %xmm1
     98 ; CHECK-NEXT:    pand {{.*}}(%rip), %xmm1
     99 ; CHECK-NEXT:    pxor %xmm0, %xmm0
    100 ; CHECK-NEXT:    psadbw %xmm0, %xmm1
    101 ; CHECK-NEXT:    movdqa %xmm1, %xmm0
    102 ; CHECK-NEXT:    retq
    103   %c = call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %a)
    104   ret <2 x i64> %c
    105 }
    106 
    107 declare <2 x i32> @llvm.cttz.v2i32(<2 x i32>, i1)
    108 declare <2 x i32> @llvm.ctlz.v2i32(<2 x i32>, i1)
    109 declare <2 x i32> @llvm.ctpop.v2i32(<2 x i32>)
    110 
    111 define <2 x i32> @promtz(<2 x i32> %a) nounwind {
    112 ; CHECK-LABEL: promtz:
    113 ; CHECK:       # %bb.0:
    114 ; CHECK-NEXT:    por {{.*}}(%rip), %xmm0
    115 ; CHECK-NEXT:    pxor %xmm1, %xmm1
    116 ; CHECK-NEXT:    pxor %xmm2, %xmm2
    117 ; CHECK-NEXT:    psubq %xmm0, %xmm2
    118 ; CHECK-NEXT:    pand %xmm0, %xmm2
    119 ; CHECK-NEXT:    pcmpeqd %xmm3, %xmm3
    120 ; CHECK-NEXT:    paddq %xmm2, %xmm3
    121 ; CHECK-NEXT:    movdqa %xmm3, %xmm0
    122 ; CHECK-NEXT:    psrlq $1, %xmm0
    123 ; CHECK-NEXT:    pand {{.*}}(%rip), %xmm0
    124 ; CHECK-NEXT:    psubq %xmm0, %xmm3
    125 ; CHECK-NEXT:    movdqa {{.*#+}} xmm0 = [3689348814741910323,3689348814741910323]
    126 ; CHECK-NEXT:    movdqa %xmm3, %xmm2
    127 ; CHECK-NEXT:    pand %xmm0, %xmm2
    128 ; CHECK-NEXT:    psrlq $2, %xmm3
    129 ; CHECK-NEXT:    pand %xmm0, %xmm3
    130 ; CHECK-NEXT:    paddq %xmm2, %xmm3
    131 ; CHECK-NEXT:    movdqa %xmm3, %xmm0
    132 ; CHECK-NEXT:    psrlq $4, %xmm0
    133 ; CHECK-NEXT:    paddq %xmm3, %xmm0
    134 ; CHECK-NEXT:    pand {{.*}}(%rip), %xmm0
    135 ; CHECK-NEXT:    psadbw %xmm1, %xmm0
    136 ; CHECK-NEXT:    retq
    137   %c = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a, i1 false)
    138   ret <2 x i32> %c
    139 
    140 }
    141 define <2 x i32> @promlz(<2 x i32> %a) nounwind {
    142 ; CHECK-LABEL: promlz:
    143 ; CHECK:       # %bb.0:
    144 ; CHECK-NEXT:    pand {{.*}}(%rip), %xmm0
    145 ; CHECK-NEXT:    pxor %xmm1, %xmm1
    146 ; CHECK-NEXT:    movdqa %xmm0, %xmm2
    147 ; CHECK-NEXT:    psrlq $1, %xmm2
    148 ; CHECK-NEXT:    por %xmm0, %xmm2
    149 ; CHECK-NEXT:    movdqa %xmm2, %xmm0
    150 ; CHECK-NEXT:    psrlq $2, %xmm0
    151 ; CHECK-NEXT:    por %xmm2, %xmm0
    152 ; CHECK-NEXT:    movdqa %xmm0, %xmm2
    153 ; CHECK-NEXT:    psrlq $4, %xmm2
    154 ; CHECK-NEXT:    por %xmm0, %xmm2
    155 ; CHECK-NEXT:    movdqa %xmm2, %xmm0
    156 ; CHECK-NEXT:    psrlq $8, %xmm0
    157 ; CHECK-NEXT:    por %xmm2, %xmm0
    158 ; CHECK-NEXT:    movdqa %xmm0, %xmm2
    159 ; CHECK-NEXT:    psrlq $16, %xmm2
    160 ; CHECK-NEXT:    por %xmm0, %xmm2
    161 ; CHECK-NEXT:    movdqa %xmm2, %xmm0
    162 ; CHECK-NEXT:    psrlq $32, %xmm0
    163 ; CHECK-NEXT:    por %xmm2, %xmm0
    164 ; CHECK-NEXT:    pcmpeqd %xmm2, %xmm2
    165 ; CHECK-NEXT:    pxor %xmm0, %xmm2
    166 ; CHECK-NEXT:    movdqa %xmm2, %xmm0
    167 ; CHECK-NEXT:    psrlq $1, %xmm0
    168 ; CHECK-NEXT:    pand {{.*}}(%rip), %xmm0
    169 ; CHECK-NEXT:    psubq %xmm0, %xmm2
    170 ; CHECK-NEXT:    movdqa {{.*#+}} xmm0 = [3689348814741910323,3689348814741910323]
    171 ; CHECK-NEXT:    movdqa %xmm2, %xmm3
    172 ; CHECK-NEXT:    pand %xmm0, %xmm3
    173 ; CHECK-NEXT:    psrlq $2, %xmm2
    174 ; CHECK-NEXT:    pand %xmm0, %xmm2
    175 ; CHECK-NEXT:    paddq %xmm3, %xmm2
    176 ; CHECK-NEXT:    movdqa %xmm2, %xmm0
    177 ; CHECK-NEXT:    psrlq $4, %xmm0
    178 ; CHECK-NEXT:    paddq %xmm2, %xmm0
    179 ; CHECK-NEXT:    pand {{.*}}(%rip), %xmm0
    180 ; CHECK-NEXT:    psadbw %xmm1, %xmm0
    181 ; CHECK-NEXT:    psubq {{.*}}(%rip), %xmm0
    182 ; CHECK-NEXT:    retq
    183   %c = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a, i1 false)
    184   ret <2 x i32> %c
    185 
    186 }
    187 
    188 define <2 x i32> @prompop(<2 x i32> %a) nounwind {
    189 ; CHECK-LABEL: prompop:
    190 ; CHECK:       # %bb.0:
    191 ; CHECK-NEXT:    pand {{.*}}(%rip), %xmm0
    192 ; CHECK-NEXT:    pxor %xmm2, %xmm2
    193 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
    194 ; CHECK-NEXT:    psrlq $1, %xmm1
    195 ; CHECK-NEXT:    pand {{.*}}(%rip), %xmm1
    196 ; CHECK-NEXT:    psubq %xmm1, %xmm0
    197 ; CHECK-NEXT:    movdqa {{.*#+}} xmm1 = [3689348814741910323,3689348814741910323]
    198 ; CHECK-NEXT:    movdqa %xmm0, %xmm3
    199 ; CHECK-NEXT:    pand %xmm1, %xmm3
    200 ; CHECK-NEXT:    psrlq $2, %xmm0
    201 ; CHECK-NEXT:    pand %xmm1, %xmm0
    202 ; CHECK-NEXT:    paddq %xmm3, %xmm0
    203 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
    204 ; CHECK-NEXT:    psrlq $4, %xmm1
    205 ; CHECK-NEXT:    paddq %xmm0, %xmm1
    206 ; CHECK-NEXT:    pand {{.*}}(%rip), %xmm1
    207 ; CHECK-NEXT:    psadbw %xmm2, %xmm1
    208 ; CHECK-NEXT:    movdqa %xmm1, %xmm0
    209 ; CHECK-NEXT:    retq
    210   %c = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %a)
    211   ret <2 x i32> %c
    212 }
    213