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