Home | History | Annotate | Download | only in Hexagon
      1 ; RUN: llc -march=hexagon < %s | FileCheck %s
      2 
      3 ; CHECK-LABEL: popcount_16
      4 ; CHECK: zxth
      5 ; CHECK: popcount
      6 define i16 @popcount_16(i16 %p) #0 {
      7   %t = call i16 @llvm.ctpop.i16(i16 %p) #0
      8   ret i16 %t
      9 }
     10 
     11 ; CHECK-LABEL: popcount_32
     12 ; CHECK: popcount
     13 define i32 @popcount_32(i32 %p) #0 {
     14   %t = call i32 @llvm.ctpop.i32(i32 %p) #0
     15   ret i32 %t
     16 }
     17 
     18 ; CHECK-LABEL: popcount_64
     19 ; CHECK: popcount
     20 define i64 @popcount_64(i64 %p) #0 {
     21   %t = call i64 @llvm.ctpop.i64(i64 %p) #0
     22   ret i64 %t
     23 }
     24 
     25 ; CHECK-LABEL: ctlz_16
     26 ; CHECK: [[REG0:r[0-9]+]] = zxth
     27 ; CHECK: [[REG1:r[0-9]+]] = cl0([[REG0]])
     28 ; CHECK: add([[REG1]],#-16)
     29 define i16 @ctlz_16(i16 %p) #0 {
     30   %t = call i16 @llvm.ctlz.i16(i16 %p, i1 true) #0
     31   ret i16 %t
     32 }
     33 
     34 ; CHECK-LABEL: ctlz_32
     35 ; CHECK: cl0
     36 define i32 @ctlz_32(i32 %p) #0 {
     37   %t = call i32 @llvm.ctlz.i32(i32 %p, i1 true) #0
     38   ret i32 %t
     39 }
     40 
     41 ; CHECK-LABEL: ctlz_64
     42 ; CHECK: cl0
     43 define i64 @ctlz_64(i64 %p) #0 {
     44   %t = call i64 @llvm.ctlz.i64(i64 %p, i1 true) #0
     45   ret i64 %t
     46 }
     47 
     48 ; CHECK-LABEL: cttz_16
     49 ; CHECK: ct0
     50 define i16 @cttz_16(i16 %p) #0 {
     51   %t = call i16 @llvm.cttz.i16(i16 %p, i1 true) #0
     52   ret i16 %t
     53 }
     54 
     55 ; CHECK-LABEL: cttz_32
     56 ; CHECK: ct0
     57 define i32 @cttz_32(i32 %p) #0 {
     58   %t = call i32 @llvm.cttz.i32(i32 %p, i1 true) #0
     59   ret i32 %t
     60 }
     61 
     62 ; CHECK-LABEL: cttz_64
     63 ; CHECK: ct0
     64 define i64 @cttz_64(i64 %p) #0 {
     65   %t = call i64 @llvm.cttz.i64(i64 %p, i1 true) #0
     66   ret i64 %t
     67 }
     68 
     69 ; CHECK-LABEL: brev_16
     70 ; CHECK: [[REG:r[0-9]+]] = brev
     71 ; CHECK: lsr([[REG]],#16)
     72 define i16 @brev_16(i16 %p) #0 {
     73   %t = call i16 @llvm.bitreverse.i16(i16 %p) #0
     74   ret i16 %t
     75 }
     76 
     77 ; CHECK-LABEL: brev_32
     78 ; CHECK: brev
     79 define i32 @brev_32(i32 %p) #0 {
     80   %t = call i32 @llvm.bitreverse.i32(i32 %p) #0
     81   ret i32 %t
     82 }
     83 
     84 ; CHECK-LABEL: brev_64
     85 ; CHECK: brev
     86 define i64 @brev_64(i64 %p) #0 {
     87   %t = call i64 @llvm.bitreverse.i64(i64 %p) #0
     88   ret i64 %t
     89 }
     90 
     91 ; CHECK-LABEL: bswap_16
     92 ; CHECK: [[REG:r[0-9]+]] = swiz
     93 ; CHECK: lsr([[REG]],#16)
     94 define i16 @bswap_16(i16 %p) #0 {
     95   %t = call i16 @llvm.bswap.i16(i16 %p) #0
     96   ret i16 %t
     97 }
     98 
     99 ; CHECK-LABEL: bswap_32
    100 ; CHECK: swiz
    101 define i32 @bswap_32(i32 %p) #0 {
    102   %t = call i32 @llvm.bswap.i32(i32 %p) #0
    103   ret i32 %t
    104 }
    105 
    106 ; CHECK-LABEL: bswap_64
    107 ; CHECK: swiz
    108 ; CHECK: swiz
    109 ; CHECK: combine
    110 define i64 @bswap_64(i64 %p) #0 {
    111   %t = call i64 @llvm.bswap.i64(i64 %p) #0
    112   ret i64 %t
    113 }
    114 
    115 declare i16 @llvm.ctpop.i16(i16) #0
    116 declare i32 @llvm.ctpop.i32(i32) #0
    117 declare i64 @llvm.ctpop.i64(i64) #0
    118 
    119 declare i16 @llvm.ctlz.i16(i16, i1) #0
    120 declare i32 @llvm.ctlz.i32(i32, i1) #0
    121 declare i64 @llvm.ctlz.i64(i64, i1) #0
    122 
    123 declare i16 @llvm.cttz.i16(i16, i1) #0
    124 declare i32 @llvm.cttz.i32(i32, i1) #0
    125 declare i64 @llvm.cttz.i64(i64, i1) #0
    126 
    127 declare i16 @llvm.bitreverse.i16(i16) #0
    128 declare i32 @llvm.bitreverse.i32(i32) #0
    129 declare i64 @llvm.bitreverse.i64(i64) #0
    130 
    131 declare i16 @llvm.bswap.i16(i16) #0
    132 declare i32 @llvm.bswap.i32(i32) #0
    133 declare i64 @llvm.bswap.i64(i64) #0
    134 
    135 attributes #0 = { nounwind readnone }
    136