Home | History | Annotate | Download | only in intrinsics
      1 ; RUN: llc -march=hexagon -O0 < %s | FileCheck %s
      2 ; RUN: llc -march=hexagon -O0 < %s | FileCheck -check-prefix=CHECK-CALL %s
      3 ; Hexagon Programmer's Reference Manual 11.1.1 ALU32/ALU
      4 
      5 ; CHECK-CALL-NOT: call
      6 
      7 ; Add
      8 declare i32 @llvm.hexagon.A2.addi(i32, i32)
      9 define i32 @A2_addi(i32 %a) {
     10   %z = call i32 @llvm.hexagon.A2.addi(i32 %a, i32 0)
     11   ret i32 %z
     12 }
     13 ; CHECK: = add({{.*}}, #0)
     14 
     15 declare i32 @llvm.hexagon.A2.add(i32, i32)
     16 define i32 @A2_add(i32 %a, i32 %b) {
     17   %z = call i32 @llvm.hexagon.A2.add(i32 %a, i32 %b)
     18   ret i32 %z
     19 }
     20 ; CHECK: = add({{.*}}, {{.*}})
     21 
     22 declare i32 @llvm.hexagon.A2.addsat(i32, i32)
     23 define i32 @A2_addsat(i32 %a, i32 %b) {
     24   %z = call i32 @llvm.hexagon.A2.addsat(i32 %a, i32 %b)
     25   ret i32 %z
     26 }
     27 ; CHECK: = add({{.*}}, {{.*}}):sat
     28 
     29 ; Logical operations
     30 declare i32 @llvm.hexagon.A2.and(i32, i32)
     31 define i32 @A2_and(i32 %a, i32 %b) {
     32   %z = call i32 @llvm.hexagon.A2.and(i32 %a, i32 %b)
     33   ret i32 %z
     34 }
     35 ; CHECK: = and({{.*}}, {{.*}})
     36 
     37 declare i32 @llvm.hexagon.A2.or(i32, i32)
     38 define i32 @A2_or(i32 %a, i32 %b) {
     39   %z = call i32 @llvm.hexagon.A2.or(i32 %a, i32 %b)
     40   ret i32 %z
     41 }
     42 ; CHECK: = or({{.*}}, {{.*}})
     43 
     44 declare i32 @llvm.hexagon.A2.xor(i32, i32)
     45 define i32 @A2_xor(i32 %a, i32 %b) {
     46   %z = call i32 @llvm.hexagon.A2.xor(i32 %a, i32 %b)
     47   ret i32 %z
     48 }
     49 ; CHECK: = xor({{.*}}, {{.*}})
     50 
     51 declare i32 @llvm.hexagon.A4.andn(i32, i32)
     52 define i32 @A4_andn(i32 %a, i32 %b) {
     53   %z = call i32 @llvm.hexagon.A4.andn(i32 %a, i32 %b)
     54   ret i32 %z
     55 }
     56 ; CHECK: = and({{.*}}, ~{{.*}})
     57 
     58 declare i32 @llvm.hexagon.A4.orn(i32, i32)
     59 define i32 @A4_orn(i32 %a, i32 %b) {
     60   %z = call i32 @llvm.hexagon.A4.orn(i32 %a, i32 %b)
     61   ret i32 %z
     62 }
     63 ; CHECK: = or({{.*}}, ~{{.*}})
     64 
     65 ; Subtract
     66 declare i32 @llvm.hexagon.A2.sub(i32, i32)
     67 define i32 @A2_sub(i32 %a, i32 %b) {
     68   %z = call i32 @llvm.hexagon.A2.sub(i32 %a, i32 %b)
     69   ret i32 %z
     70 }
     71 ; CHECK: = sub({{.*}}, {{.*}})
     72 
     73 declare i32 @llvm.hexagon.A2.subsat(i32, i32)
     74 define i32 @A2_subsat(i32 %a, i32 %b) {
     75   %z = call i32 @llvm.hexagon.A2.subsat(i32 %a, i32 %b)
     76   ret i32 %z
     77 }
     78 ; CHECK: = sub({{.*}}, {{.*}}):sat
     79 
     80 ; Sign extend
     81 declare i32 @llvm.hexagon.A2.sxtb(i32)
     82 define i32 @A2_sxtb(i32 %a) {
     83   %z = call i32 @llvm.hexagon.A2.sxtb(i32 %a)
     84   ret i32 %z
     85 }
     86 ; CHECK: = sxtb({{.*}})
     87 
     88 declare i32 @llvm.hexagon.A2.sxth(i32)
     89 define i32 @A2_sxth(i32 %a) {
     90   %z = call i32 @llvm.hexagon.A2.sxth(i32 %a)
     91   ret i32 %z
     92 }
     93 ; CHECK: = sxth({{.*}})
     94 
     95 ; Transfer immediate
     96 declare i32 @llvm.hexagon.A2.tfril(i32, i32)
     97 define i32 @A2_tfril(i32 %a) {
     98   %z = call i32 @llvm.hexagon.A2.tfril(i32 %a, i32 0)
     99   ret i32 %z
    100 }
    101 ; CHECK: = #0
    102 
    103 declare i32 @llvm.hexagon.A2.tfrih(i32, i32)
    104 define i32 @A2_tfrih(i32 %a) {
    105   %z = call i32 @llvm.hexagon.A2.tfrih(i32 %a, i32 0)
    106   ret i32 %z
    107 }
    108 ; CHECK: = #0
    109 
    110 declare i32 @llvm.hexagon.A2.tfrsi(i32)
    111 define i32 @A2_tfrsi() {
    112   %z = call i32 @llvm.hexagon.A2.tfrsi(i32 0)
    113   ret i32 %z
    114 }
    115 ; CHECK: = #0
    116 
    117 ; Transfer register
    118 declare i32 @llvm.hexagon.A2.tfr(i32)
    119 define i32 @A2_tfr(i32 %a) {
    120   %z = call i32 @llvm.hexagon.A2.tfr(i32 %a)
    121   ret i32 %z
    122 }
    123 ; CHECK: =
    124 
    125 ; Vector add halfwords
    126 declare i32 @llvm.hexagon.A2.svaddh(i32, i32)
    127 define i32 @A2_svaddh(i32 %a, i32 %b) {
    128   %z = call i32 @llvm.hexagon.A2.svaddh(i32 %a, i32 %b)
    129   ret i32 %z
    130 }
    131 ; CHECK: = vaddh({{.*}}, {{.*}})
    132 
    133 declare i32 @llvm.hexagon.A2.svaddhs(i32, i32)
    134 define i32 @A2_svaddhs(i32 %a, i32 %b) {
    135   %z = call i32 @llvm.hexagon.A2.svaddhs(i32 %a, i32 %b)
    136   ret i32 %z
    137 }
    138 ; CHECK: = vaddh({{.*}}, {{.*}}):sat
    139 
    140 declare i32 @llvm.hexagon.A2.svadduhs(i32, i32)
    141 define i32 @A2_svadduhs(i32 %a, i32 %b) {
    142   %z = call i32 @llvm.hexagon.A2.svadduhs(i32 %a, i32 %b)
    143   ret i32 %z
    144 }
    145 ; CHECK: = vadduh({{.*}}, {{.*}}):sat
    146 
    147 ; Vector average halfwords
    148 declare i32 @llvm.hexagon.A2.svavgh(i32, i32)
    149 define i32 @A2_svavgh(i32 %a, i32 %b) {
    150   %z = call i32 @llvm.hexagon.A2.svavgh(i32 %a, i32 %b)
    151   ret i32 %z
    152 }
    153 ; CHECK: = vavgh({{.*}}, {{.*}})
    154 
    155 declare i32 @llvm.hexagon.A2.svavghs(i32, i32)
    156 define i32 @A2_svavghs(i32 %a, i32 %b) {
    157   %z = call i32 @llvm.hexagon.A2.svavghs(i32 %a, i32 %b)
    158   ret i32 %z
    159 }
    160 ; CHECK: = vavgh({{.*}}, {{.*}}):rnd
    161 
    162 declare i32 @llvm.hexagon.A2.svnavgh(i32, i32)
    163 define i32 @A2_svnavgh(i32 %a, i32 %b) {
    164   %z = call i32 @llvm.hexagon.A2.svnavgh(i32 %a, i32 %b)
    165   ret i32 %z
    166 }
    167 ; CHECK: = vnavgh({{.*}}, {{.*}})
    168 
    169 ; Vector subtract halfwords
    170 declare i32 @llvm.hexagon.A2.svsubh(i32, i32)
    171 define i32 @A2_svsubh(i32 %a, i32 %b) {
    172   %z = call i32 @llvm.hexagon.A2.svsubh(i32 %a, i32 %b)
    173   ret i32 %z
    174 }
    175 ; CHECK: = vsubh({{.*}}, {{.*}})
    176 
    177 declare i32 @llvm.hexagon.A2.svsubhs(i32, i32)
    178 define i32 @A2_svsubhs(i32 %a, i32 %b) {
    179   %z = call i32 @llvm.hexagon.A2.svsubhs(i32 %a, i32 %b)
    180   ret i32 %z
    181 }
    182 ; CHECK: = vsubh({{.*}}, {{.*}}):sat
    183 
    184 declare i32 @llvm.hexagon.A2.svsubuhs(i32, i32)
    185 define i32 @A2_svsubuhs(i32 %a, i32 %b) {
    186   %z = call i32 @llvm.hexagon.A2.svsubuhs(i32 %a, i32 %b)
    187   ret i32 %z
    188 }
    189 ; CHECK: = vsubuh({{.*}}, {{.*}}):sat
    190 
    191 ; Zero extend
    192 declare i32 @llvm.hexagon.A2.zxth(i32)
    193 define i32 @A2_zxth(i32 %a) {
    194   %z = call i32 @llvm.hexagon.A2.zxth(i32 %a)
    195   ret i32 %z
    196 }
    197 ; CHECK: = zxth({{.*}})
    198