Home | History | Annotate | Download | only in ARM
      1 ; RUN: llc -mcpu=swift -march=arm < %s | FileCheck %s
      2 target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32"
      3 target triple = "thumbv7-apple-ios6.1.0"
      4 
      5 ;;; Float vectors
      6 
      7 %v2f32 = type <2 x float>
      8 ; CHECK: test_v2f32.sqrt:
      9 define %v2f32 @test_v2f32.sqrt(%v2f32 %a) {
     10   ; CHECK: sqrt
     11   %1 = call %v2f32 @llvm.sqrt.v2f32(%v2f32 %a)
     12   ret %v2f32 %1
     13 }
     14 ; CHECK: test_v2f32.powi:
     15 define %v2f32 @test_v2f32.powi(%v2f32 %a, i32 %b) {
     16   ; CHECK: pow
     17   %1 = call %v2f32 @llvm.powi.v2f32(%v2f32 %a, i32 %b)
     18   ret %v2f32 %1
     19 }
     20 ; CHECK: test_v2f32.sin:
     21 define %v2f32 @test_v2f32.sin(%v2f32 %a) {
     22   ; CHECK: sin
     23   %1 = call %v2f32 @llvm.sin.v2f32(%v2f32 %a)
     24   ret %v2f32 %1
     25 }
     26 ; CHECK: test_v2f32.cos:
     27 define %v2f32 @test_v2f32.cos(%v2f32 %a) {
     28   ; CHECK: cos
     29   %1 = call %v2f32 @llvm.cos.v2f32(%v2f32 %a)
     30   ret %v2f32 %1
     31 }
     32 ; CHECK: test_v2f32.pow:
     33 define %v2f32 @test_v2f32.pow(%v2f32 %a, %v2f32 %b) {
     34   ; CHECK: pow
     35   %1 = call %v2f32 @llvm.pow.v2f32(%v2f32 %a, %v2f32 %b)
     36   ret %v2f32 %1
     37 }
     38 ; CHECK: test_v2f32.exp:
     39 define %v2f32 @test_v2f32.exp(%v2f32 %a) {
     40   ; CHECK: exp
     41   %1 = call %v2f32 @llvm.exp.v2f32(%v2f32 %a)
     42   ret %v2f32 %1
     43 }
     44 ; CHECK: test_v2f32.exp2:
     45 define %v2f32 @test_v2f32.exp2(%v2f32 %a) {
     46   ; CHECK: exp
     47   %1 = call %v2f32 @llvm.exp2.v2f32(%v2f32 %a)
     48   ret %v2f32 %1
     49 }
     50 ; CHECK: test_v2f32.log:
     51 define %v2f32 @test_v2f32.log(%v2f32 %a) {
     52   ; CHECK: log
     53   %1 = call %v2f32 @llvm.log.v2f32(%v2f32 %a)
     54   ret %v2f32 %1
     55 }
     56 ; CHECK: test_v2f32.log10:
     57 define %v2f32 @test_v2f32.log10(%v2f32 %a) {
     58   ; CHECK: log
     59   %1 = call %v2f32 @llvm.log10.v2f32(%v2f32 %a)
     60   ret %v2f32 %1
     61 }
     62 ; CHECK: test_v2f32.log2:
     63 define %v2f32 @test_v2f32.log2(%v2f32 %a) {
     64   ; CHECK: log
     65   %1 = call %v2f32 @llvm.log2.v2f32(%v2f32 %a)
     66   ret %v2f32 %1
     67 }
     68 ; CHECK: test_v2f32.fma:
     69 define %v2f32 @test_v2f32.fma(%v2f32 %a, %v2f32 %b, %v2f32 %c) {
     70   ; CHECK: fma
     71   %1 = call %v2f32 @llvm.fma.v2f32(%v2f32 %a, %v2f32 %b, %v2f32 %c)
     72   ret %v2f32 %1
     73 }
     74 ; CHECK: test_v2f32.fabs:
     75 define %v2f32 @test_v2f32.fabs(%v2f32 %a) {
     76   ; CHECK: fabs
     77   %1 = call %v2f32 @llvm.fabs.v2f32(%v2f32 %a)
     78   ret %v2f32 %1
     79 }
     80 ; CHECK: test_v2f32.floor:
     81 define %v2f32 @test_v2f32.floor(%v2f32 %a) {
     82   ; CHECK: floor
     83   %1 = call %v2f32 @llvm.floor.v2f32(%v2f32 %a)
     84   ret %v2f32 %1
     85 }
     86 ; CHECK: test_v2f32.fceil:
     87 define %v2f32 @test_v2f32.fceil(%v2f32 %a) {
     88   ; CHECK: ceil
     89   %1 = call %v2f32 @llvm.fceil.v2f32(%v2f32 %a)
     90   ret %v2f32 %1
     91 }
     92 ; CHECK: test_v2f32.trunc:
     93 define %v2f32 @test_v2f32.trunc(%v2f32 %a) {
     94   ; CHECK: trunc
     95   %1 = call %v2f32 @llvm.trunc.v2f32(%v2f32 %a)
     96   ret %v2f32 %1
     97 }
     98 ; CHECK: test_v2f32.rint:
     99 define %v2f32 @test_v2f32.rint(%v2f32 %a) {
    100   ; CHECK: rint
    101   %1 = call %v2f32 @llvm.rint.v2f32(%v2f32 %a)
    102   ret %v2f32 %1
    103 }
    104 ; CHECK: test_v2f32.nearbyint:
    105 define %v2f32 @test_v2f32.nearbyint(%v2f32 %a) {
    106   ; CHECK: nearbyint
    107   %1 = call %v2f32 @llvm.nearbyint.v2f32(%v2f32 %a)
    108   ret %v2f32 %1
    109 }
    110 
    111 declare %v2f32 @llvm.sqrt.v2f32(%v2f32) #0
    112 declare %v2f32 @llvm.powi.v2f32(%v2f32, i32) #0
    113 declare %v2f32 @llvm.sin.v2f32(%v2f32) #0
    114 declare %v2f32 @llvm.cos.v2f32(%v2f32) #0
    115 declare %v2f32 @llvm.pow.v2f32(%v2f32, %v2f32) #0
    116 declare %v2f32 @llvm.exp.v2f32(%v2f32) #0
    117 declare %v2f32 @llvm.exp2.v2f32(%v2f32) #0
    118 declare %v2f32 @llvm.log.v2f32(%v2f32) #0
    119 declare %v2f32 @llvm.log10.v2f32(%v2f32) #0
    120 declare %v2f32 @llvm.log2.v2f32(%v2f32) #0
    121 declare %v2f32 @llvm.fma.v2f32(%v2f32, %v2f32, %v2f32) #0
    122 declare %v2f32 @llvm.fabs.v2f32(%v2f32) #0
    123 declare %v2f32 @llvm.floor.v2f32(%v2f32) #0
    124 declare %v2f32 @llvm.fceil.v2f32(%v2f32) #0
    125 declare %v2f32 @llvm.trunc.v2f32(%v2f32) #0
    126 declare %v2f32 @llvm.rint.v2f32(%v2f32) #0
    127 declare %v2f32 @llvm.nearbyint.v2f32(%v2f32) #0
    128 
    129 ;;;
    130 
    131 %v4f32 = type <4 x float>
    132 ; CHECK: test_v4f32.sqrt:
    133 define %v4f32 @test_v4f32.sqrt(%v4f32 %a) {
    134   ; CHECK: sqrt
    135   %1 = call %v4f32 @llvm.sqrt.v4f32(%v4f32 %a)
    136   ret %v4f32 %1
    137 }
    138 ; CHECK: test_v4f32.powi:
    139 define %v4f32 @test_v4f32.powi(%v4f32 %a, i32 %b) {
    140   ; CHECK: pow
    141   %1 = call %v4f32 @llvm.powi.v4f32(%v4f32 %a, i32 %b)
    142   ret %v4f32 %1
    143 }
    144 ; CHECK: test_v4f32.sin:
    145 define %v4f32 @test_v4f32.sin(%v4f32 %a) {
    146   ; CHECK: sin
    147   %1 = call %v4f32 @llvm.sin.v4f32(%v4f32 %a)
    148   ret %v4f32 %1
    149 }
    150 ; CHECK: test_v4f32.cos:
    151 define %v4f32 @test_v4f32.cos(%v4f32 %a) {
    152   ; CHECK: cos
    153   %1 = call %v4f32 @llvm.cos.v4f32(%v4f32 %a)
    154   ret %v4f32 %1
    155 }
    156 ; CHECK: test_v4f32.pow:
    157 define %v4f32 @test_v4f32.pow(%v4f32 %a, %v4f32 %b) {
    158   ; CHECK: pow
    159   %1 = call %v4f32 @llvm.pow.v4f32(%v4f32 %a, %v4f32 %b)
    160   ret %v4f32 %1
    161 }
    162 ; CHECK: test_v4f32.exp:
    163 define %v4f32 @test_v4f32.exp(%v4f32 %a) {
    164   ; CHECK: exp
    165   %1 = call %v4f32 @llvm.exp.v4f32(%v4f32 %a)
    166   ret %v4f32 %1
    167 }
    168 ; CHECK: test_v4f32.exp2:
    169 define %v4f32 @test_v4f32.exp2(%v4f32 %a) {
    170   ; CHECK: exp
    171   %1 = call %v4f32 @llvm.exp2.v4f32(%v4f32 %a)
    172   ret %v4f32 %1
    173 }
    174 ; CHECK: test_v4f32.log:
    175 define %v4f32 @test_v4f32.log(%v4f32 %a) {
    176   ; CHECK: log
    177   %1 = call %v4f32 @llvm.log.v4f32(%v4f32 %a)
    178   ret %v4f32 %1
    179 }
    180 ; CHECK: test_v4f32.log10:
    181 define %v4f32 @test_v4f32.log10(%v4f32 %a) {
    182   ; CHECK: log
    183   %1 = call %v4f32 @llvm.log10.v4f32(%v4f32 %a)
    184   ret %v4f32 %1
    185 }
    186 ; CHECK: test_v4f32.log2:
    187 define %v4f32 @test_v4f32.log2(%v4f32 %a) {
    188   ; CHECK: log
    189   %1 = call %v4f32 @llvm.log2.v4f32(%v4f32 %a)
    190   ret %v4f32 %1
    191 }
    192 ; CHECK: test_v4f32.fma:
    193 define %v4f32 @test_v4f32.fma(%v4f32 %a, %v4f32 %b, %v4f32 %c) {
    194   ; CHECK: fma
    195   %1 = call %v4f32 @llvm.fma.v4f32(%v4f32 %a, %v4f32 %b, %v4f32 %c)
    196   ret %v4f32 %1
    197 }
    198 ; CHECK: test_v4f32.fabs:
    199 define %v4f32 @test_v4f32.fabs(%v4f32 %a) {
    200   ; CHECK: fabs
    201   %1 = call %v4f32 @llvm.fabs.v4f32(%v4f32 %a)
    202   ret %v4f32 %1
    203 }
    204 ; CHECK: test_v4f32.floor:
    205 define %v4f32 @test_v4f32.floor(%v4f32 %a) {
    206   ; CHECK: floor
    207   %1 = call %v4f32 @llvm.floor.v4f32(%v4f32 %a)
    208   ret %v4f32 %1
    209 }
    210 ; CHECK: test_v4f32.fceil:
    211 define %v4f32 @test_v4f32.fceil(%v4f32 %a) {
    212   ; CHECK: ceil
    213   %1 = call %v4f32 @llvm.fceil.v4f32(%v4f32 %a)
    214   ret %v4f32 %1
    215 }
    216 ; CHECK: test_v4f32.trunc:
    217 define %v4f32 @test_v4f32.trunc(%v4f32 %a) {
    218   ; CHECK: trunc
    219   %1 = call %v4f32 @llvm.trunc.v4f32(%v4f32 %a)
    220   ret %v4f32 %1
    221 }
    222 ; CHECK: test_v4f32.rint:
    223 define %v4f32 @test_v4f32.rint(%v4f32 %a) {
    224   ; CHECK: rint
    225   %1 = call %v4f32 @llvm.rint.v4f32(%v4f32 %a)
    226   ret %v4f32 %1
    227 }
    228 ; CHECK: test_v4f32.nearbyint:
    229 define %v4f32 @test_v4f32.nearbyint(%v4f32 %a) {
    230   ; CHECK: nearbyint
    231   %1 = call %v4f32 @llvm.nearbyint.v4f32(%v4f32 %a)
    232   ret %v4f32 %1
    233 }
    234 
    235 declare %v4f32 @llvm.sqrt.v4f32(%v4f32) #0
    236 declare %v4f32 @llvm.powi.v4f32(%v4f32, i32) #0
    237 declare %v4f32 @llvm.sin.v4f32(%v4f32) #0
    238 declare %v4f32 @llvm.cos.v4f32(%v4f32) #0
    239 declare %v4f32 @llvm.pow.v4f32(%v4f32, %v4f32) #0
    240 declare %v4f32 @llvm.exp.v4f32(%v4f32) #0
    241 declare %v4f32 @llvm.exp2.v4f32(%v4f32) #0
    242 declare %v4f32 @llvm.log.v4f32(%v4f32) #0
    243 declare %v4f32 @llvm.log10.v4f32(%v4f32) #0
    244 declare %v4f32 @llvm.log2.v4f32(%v4f32) #0
    245 declare %v4f32 @llvm.fma.v4f32(%v4f32, %v4f32, %v4f32) #0
    246 declare %v4f32 @llvm.fabs.v4f32(%v4f32) #0
    247 declare %v4f32 @llvm.floor.v4f32(%v4f32) #0
    248 declare %v4f32 @llvm.fceil.v4f32(%v4f32) #0
    249 declare %v4f32 @llvm.trunc.v4f32(%v4f32) #0
    250 declare %v4f32 @llvm.rint.v4f32(%v4f32) #0
    251 declare %v4f32 @llvm.nearbyint.v4f32(%v4f32) #0
    252 
    253 ;;; Double vector
    254 
    255 %v2f64 = type <2 x double>
    256 ; CHECK: test_v2f64.sqrt:
    257 define %v2f64 @test_v2f64.sqrt(%v2f64 %a) {
    258   ; CHECK: sqrt
    259   %1 = call %v2f64 @llvm.sqrt.v2f64(%v2f64 %a)
    260   ret %v2f64 %1
    261 }
    262 ; CHECK: test_v2f64.powi:
    263 define %v2f64 @test_v2f64.powi(%v2f64 %a, i32 %b) {
    264   ; CHECK: pow
    265   %1 = call %v2f64 @llvm.powi.v2f64(%v2f64 %a, i32 %b)
    266   ret %v2f64 %1
    267 }
    268 ; CHECK: test_v2f64.sin:
    269 define %v2f64 @test_v2f64.sin(%v2f64 %a) {
    270   ; CHECK: sin
    271   %1 = call %v2f64 @llvm.sin.v2f64(%v2f64 %a)
    272   ret %v2f64 %1
    273 }
    274 ; CHECK: test_v2f64.cos:
    275 define %v2f64 @test_v2f64.cos(%v2f64 %a) {
    276   ; CHECK: cos
    277   %1 = call %v2f64 @llvm.cos.v2f64(%v2f64 %a)
    278   ret %v2f64 %1
    279 }
    280 ; CHECK: test_v2f64.pow:
    281 define %v2f64 @test_v2f64.pow(%v2f64 %a, %v2f64 %b) {
    282   ; CHECK: pow
    283   %1 = call %v2f64 @llvm.pow.v2f64(%v2f64 %a, %v2f64 %b)
    284   ret %v2f64 %1
    285 }
    286 ; CHECK: test_v2f64.exp:
    287 define %v2f64 @test_v2f64.exp(%v2f64 %a) {
    288   ; CHECK: exp
    289   %1 = call %v2f64 @llvm.exp.v2f64(%v2f64 %a)
    290   ret %v2f64 %1
    291 }
    292 ; CHECK: test_v2f64.exp2:
    293 define %v2f64 @test_v2f64.exp2(%v2f64 %a) {
    294   ; CHECK: exp
    295   %1 = call %v2f64 @llvm.exp2.v2f64(%v2f64 %a)
    296   ret %v2f64 %1
    297 }
    298 ; CHECK: test_v2f64.log:
    299 define %v2f64 @test_v2f64.log(%v2f64 %a) {
    300   ; CHECK: log
    301   %1 = call %v2f64 @llvm.log.v2f64(%v2f64 %a)
    302   ret %v2f64 %1
    303 }
    304 ; CHECK: test_v2f64.log10:
    305 define %v2f64 @test_v2f64.log10(%v2f64 %a) {
    306   ; CHECK: log
    307   %1 = call %v2f64 @llvm.log10.v2f64(%v2f64 %a)
    308   ret %v2f64 %1
    309 }
    310 ; CHECK: test_v2f64.log2:
    311 define %v2f64 @test_v2f64.log2(%v2f64 %a) {
    312   ; CHECK: log
    313   %1 = call %v2f64 @llvm.log2.v2f64(%v2f64 %a)
    314   ret %v2f64 %1
    315 }
    316 ; CHECK: test_v2f64.fma:
    317 define %v2f64 @test_v2f64.fma(%v2f64 %a, %v2f64 %b, %v2f64 %c) {
    318   ; CHECK: fma
    319   %1 = call %v2f64 @llvm.fma.v2f64(%v2f64 %a, %v2f64 %b, %v2f64 %c)
    320   ret %v2f64 %1
    321 }
    322 ; CHECK: test_v2f64.fabs:
    323 define %v2f64 @test_v2f64.fabs(%v2f64 %a) {
    324   ; CHECK: fabs
    325   %1 = call %v2f64 @llvm.fabs.v2f64(%v2f64 %a)
    326   ret %v2f64 %1
    327 }
    328 ; CHECK: test_v2f64.floor:
    329 define %v2f64 @test_v2f64.floor(%v2f64 %a) {
    330   ; CHECK: floor
    331   %1 = call %v2f64 @llvm.floor.v2f64(%v2f64 %a)
    332   ret %v2f64 %1
    333 }
    334 ; CHECK: test_v2f64.fceil:
    335 define %v2f64 @test_v2f64.fceil(%v2f64 %a) {
    336   ; CHECK: ceil
    337   %1 = call %v2f64 @llvm.fceil.v2f64(%v2f64 %a)
    338   ret %v2f64 %1
    339 }
    340 ; CHECK: test_v2f64.trunc:
    341 define %v2f64 @test_v2f64.trunc(%v2f64 %a) {
    342   ; CHECK: trunc
    343   %1 = call %v2f64 @llvm.trunc.v2f64(%v2f64 %a)
    344   ret %v2f64 %1
    345 }
    346 ; CHECK: test_v2f64.rint:
    347 define %v2f64 @test_v2f64.rint(%v2f64 %a) {
    348   ; CHECK: rint
    349   %1 = call %v2f64 @llvm.rint.v2f64(%v2f64 %a)
    350   ret %v2f64 %1
    351 }
    352 ; CHECK: test_v2f64.nearbyint:
    353 define %v2f64 @test_v2f64.nearbyint(%v2f64 %a) {
    354   ; CHECK: nearbyint
    355   %1 = call %v2f64 @llvm.nearbyint.v2f64(%v2f64 %a)
    356   ret %v2f64 %1
    357 }
    358 
    359 declare %v2f64 @llvm.sqrt.v2f64(%v2f64) #0
    360 declare %v2f64 @llvm.powi.v2f64(%v2f64, i32) #0
    361 declare %v2f64 @llvm.sin.v2f64(%v2f64) #0
    362 declare %v2f64 @llvm.cos.v2f64(%v2f64) #0
    363 declare %v2f64 @llvm.pow.v2f64(%v2f64, %v2f64) #0
    364 declare %v2f64 @llvm.exp.v2f64(%v2f64) #0
    365 declare %v2f64 @llvm.exp2.v2f64(%v2f64) #0
    366 declare %v2f64 @llvm.log.v2f64(%v2f64) #0
    367 declare %v2f64 @llvm.log10.v2f64(%v2f64) #0
    368 declare %v2f64 @llvm.log2.v2f64(%v2f64) #0
    369 declare %v2f64 @llvm.fma.v2f64(%v2f64, %v2f64, %v2f64) #0
    370 declare %v2f64 @llvm.fabs.v2f64(%v2f64) #0
    371 declare %v2f64 @llvm.floor.v2f64(%v2f64) #0
    372 declare %v2f64 @llvm.fceil.v2f64(%v2f64) #0
    373 declare %v2f64 @llvm.trunc.v2f64(%v2f64) #0
    374 declare %v2f64 @llvm.rint.v2f64(%v2f64) #0
    375 declare %v2f64 @llvm.nearbyint.v2f64(%v2f64) #0
    376 
    377 attributes #0 = { nounwind readonly }
    378