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