Home | History | Annotate | Download | only in AArch64
      1 ; RUN: llc < %s -mtriple=aarch64 -mattr=neon -recip=!sqrt,!vec-sqrt | FileCheck %s --check-prefix=FAULT
      2 ; RUN: llc < %s -mtriple=aarch64 -mattr=neon -recip=sqrt,vec-sqrt   | FileCheck %s
      3 ; RUN: llc < %s -mtriple=aarch64 -mattr=neon,-use-reverse-square-root  | FileCheck %s --check-prefix=FAULT
      4 ; RUN: llc < %s -mtriple=aarch64 -mattr=neon,+use-reverse-square-root | FileCheck %s
      5 
      6 declare float @llvm.sqrt.f32(float) #1
      7 declare double @llvm.sqrt.f64(double) #1
      8 declare <2 x float> @llvm.sqrt.v2f32(<2 x float>) #1
      9 declare <4 x float> @llvm.sqrt.v4f32(<4 x float>) #1
     10 declare <2 x double> @llvm.sqrt.v2f64(<2 x double>) #1
     11 
     12 define float @fsqrt(float %a) #0 {
     13   %1 = tail call fast float @llvm.sqrt.f32(float %a)
     14   ret float %1
     15 
     16 ; FAULT-LABEL: fsqrt:
     17 ; FAULT-NEXT: BB#0
     18 ; FAULT-NEXT: fsqrt
     19 
     20 ; CHECK-LABEL: fsqrt:
     21 ; CHECK-NEXT: BB#0
     22 ; CHECK-NEXT: fmov
     23 ; CHECK-NEXT: frsqrte
     24 }
     25 
     26 define <2 x float> @f2sqrt(<2 x float> %a) #0 {
     27   %1 = tail call fast <2 x float> @llvm.sqrt.v2f32(<2 x float> %a) #2
     28   ret <2 x float> %1
     29 
     30 ; FAULT-LABEL: f2sqrt:
     31 ; FAULT-NEXT: BB#0
     32 ; FAULT-NEXT: fsqrt
     33 
     34 ; CHECK-LABEL: f2sqrt:
     35 ; CHECK-NEXT: BB#0
     36 ; CHECK-NEXT: fmov
     37 ; CHECK-NEXT: mov
     38 ; CHECK-NEXT: frsqrte
     39 }
     40 
     41 define <4 x float> @f4sqrt(<4 x float> %a) #0 {
     42   %1 = tail call fast <4 x float> @llvm.sqrt.v4f32(<4 x float> %a) #2
     43   ret <4 x float> %1
     44 
     45 ; FAULT-LABEL: f4sqrt:
     46 ; FAULT-NEXT: BB#0
     47 ; FAULT-NEXT: fsqrt
     48 
     49 ; CHECK-LABEL: f4sqrt:
     50 ; CHECK-NEXT: BB#0
     51 ; CHECK-NEXT: fmov
     52 ; CHECK-NEXT: mov
     53 ; CHECK-NEXT: frsqrte
     54 }
     55 
     56 define double @dsqrt(double %a) #0 {
     57   %1 = tail call fast double @llvm.sqrt.f64(double %a)
     58   ret double %1
     59 
     60 ; FAULT-LABEL: dsqrt:
     61 ; FAULT-NEXT: BB#0
     62 ; FAULT-NEXT: fsqrt
     63 
     64 ; CHECK-LABEL: dsqrt:
     65 ; CHECK-NEXT: BB#0
     66 ; CHECK-NEXT: fmov
     67 ; CHECK-NEXT: frsqrte
     68 }
     69 
     70 define <2 x double> @d2sqrt(<2 x double> %a) #0 {
     71   %1 = tail call fast <2 x double> @llvm.sqrt.v2f64(<2 x double> %a) #2
     72   ret <2 x double> %1
     73 
     74 ; FAULT-LABEL: d2sqrt:
     75 ; FAULT-NEXT: BB#0
     76 ; FAULT-NEXT: fsqrt
     77 
     78 ; CHECK-LABEL: d2sqrt:
     79 ; CHECK-NEXT: BB#0
     80 ; CHECK-NEXT: fmov
     81 ; CHECK-NEXT: mov
     82 ; CHECK-NEXT: frsqrte
     83 }
     84 
     85 define float @frsqrt(float %a) #0 {
     86   %1 = tail call fast float @llvm.sqrt.f32(float %a)
     87   %2 = fdiv fast float 1.000000e+00, %1
     88   ret float %2
     89 
     90 ; FAULT-LABEL: frsqrt:
     91 ; FAULT-NEXT: BB#0
     92 ; FAULT-NEXT: fsqrt
     93 
     94 ; CHECK-LABEL: frsqrt:
     95 ; CHECK-NEXT: BB#0
     96 ; CHECK-NEXT: fmov
     97 ; CHECK-NEXT: frsqrte
     98 }
     99 
    100 define <2 x float> @f2rsqrt(<2 x float> %a) #0 {
    101   %1 = tail call fast <2 x float> @llvm.sqrt.v2f32(<2 x float> %a) #2
    102   %2 = fdiv fast <2 x float> <float 1.000000e+00, float 1.000000e+00>, %1
    103   ret <2 x float> %2
    104 
    105 ; FAULT-LABEL: f2rsqrt:
    106 ; FAULT-NEXT: BB#0
    107 ; FAULT-NEXT: fsqrt
    108 
    109 ; CHECK-LABEL: f2rsqrt:
    110 ; CHECK-NEXT: BB#0
    111 ; CHECK-NEXT: fmov
    112 ; CHECK-NEXT: frsqrte
    113 }
    114 
    115 define <4 x float> @f4rsqrt(<4 x float> %a) #0 {
    116   %1 = tail call fast <4 x float> @llvm.sqrt.v4f32(<4 x float> %a) #2
    117   %2 = fdiv fast <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, %1
    118   ret <4 x float> %2
    119 
    120 ; FAULT-LABEL: f4rsqrt:
    121 ; FAULT-NEXT: BB#0
    122 ; FAULT-NEXT: fsqrt
    123 
    124 ; CHECK-LABEL: f4rsqrt:
    125 ; CHECK-NEXT: BB#0
    126 ; CHECK-NEXT: fmov
    127 ; CHECK-NEXT: frsqrte
    128 }
    129 
    130 define double @drsqrt(double %a) #0 {
    131   %1 = tail call fast double @llvm.sqrt.f64(double %a)
    132   %2 = fdiv fast double 1.000000e+00, %1
    133   ret double %2
    134 
    135 ; FAULT-LABEL: drsqrt:
    136 ; FAULT-NEXT: BB#0
    137 ; FAULT-NEXT: fsqrt
    138 
    139 ; CHECK-LABEL: drsqrt:
    140 ; CHECK-NEXT: BB#0
    141 ; CHECK-NEXT: fmov
    142 ; CHECK-NEXT: frsqrte
    143 }
    144 
    145 define <2 x double> @d2rsqrt(<2 x double> %a) #0 {
    146   %1 = tail call fast <2 x double> @llvm.sqrt.v2f64(<2 x double> %a) #2
    147   %2 = fdiv fast <2 x double> <double 1.000000e+00, double 1.000000e+00>, %1
    148   ret <2 x double> %2
    149 
    150 ; FAULT-LABEL: d2rsqrt:
    151 ; FAULT-NEXT: BB#0
    152 ; FAULT-NEXT: fsqrt
    153 
    154 ; CHECK-LABEL: d2rsqrt:
    155 ; CHECK-NEXT: BB#0
    156 ; CHECK-NEXT: fmov
    157 ; CHECK-NEXT: frsqrte
    158 }
    159 
    160 attributes #0 = { nounwind "unsafe-fp-math"="true" }
    161