Refactor reciprocal and reciprocal square root estimate into target-independent funct...
[oota-llvm.git] / test / CodeGen / PowerPC / recipest.ll
1 ; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -enable-unsafe-fp-math | FileCheck %s
2 ; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 | FileCheck -check-prefix=CHECK-SAFE %s
3 target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64"
4 target triple = "powerpc64-unknown-linux-gnu"
5
6 declare double @llvm.sqrt.f64(double)
7 declare float @llvm.sqrt.f32(float)
8 declare <4 x float> @llvm.sqrt.v4f32(<4 x float>)
9
10 define double @foo(double %a, double %b) nounwind {
11   %x = call double @llvm.sqrt.f64(double %b)
12   %r = fdiv double %a, %x
13   ret double %r
14
15 ; CHECK: @foo
16 ; CHECK-DAG: frsqrte
17 ; CHECK-DAG: fnmsub
18 ; CHECK: fmul
19 ; CHECK-NEXT: fmadd
20 ; CHECK-NEXT: fmul
21 ; CHECK-NEXT: fmul
22 ; CHECK-NEXT: fmadd
23 ; CHECK-NEXT: fmul
24 ; CHECK-NEXT: fmul
25 ; CHECK: blr
26
27 ; CHECK-SAFE: @foo
28 ; CHECK-SAFE: fsqrt
29 ; CHECK-SAFE: fdiv
30 ; CHECK-SAFE: blr
31 }
32
33 define double @foof(double %a, float %b) nounwind {
34   %x = call float @llvm.sqrt.f32(float %b)
35   %y = fpext float %x to double
36   %r = fdiv double %a, %y
37   ret double %r
38
39 ; CHECK: @foof
40 ; CHECK-DAG: frsqrtes
41 ; CHECK-DAG: fnmsubs
42 ; CHECK: fmuls
43 ; CHECK-NEXT: fmadds
44 ; CHECK-NEXT: fmuls
45 ; CHECK-NEXT: fmul
46 ; CHECK-NEXT: blr
47
48 ; CHECK-SAFE: @foof
49 ; CHECK-SAFE: fsqrts
50 ; CHECK-SAFE: fdiv
51 ; CHECK-SAFE: blr
52 }
53
54 define float @food(float %a, double %b) nounwind {
55   %x = call double @llvm.sqrt.f64(double %b)
56   %y = fptrunc double %x to float
57   %r = fdiv float %a, %y
58   ret float %r
59
60 ; CHECK: @foo
61 ; CHECK-DAG: frsqrte
62 ; CHECK-DAG: fnmsub
63 ; CHECK: fmul
64 ; CHECK-NEXT: fmadd
65 ; CHECK-NEXT: fmul
66 ; CHECK-NEXT: fmul
67 ; CHECK-NEXT: fmadd
68 ; CHECK-NEXT: fmul
69 ; CHECK-NEXT: frsp
70 ; CHECK-NEXT: fmuls
71 ; CHECK-NEXT: blr
72
73 ; CHECK-SAFE: @foo
74 ; CHECK-SAFE: fsqrt
75 ; CHECK-SAFE: fdivs
76 ; CHECK-SAFE: blr
77 }
78
79 define float @goo(float %a, float %b) nounwind {
80   %x = call float @llvm.sqrt.f32(float %b)
81   %r = fdiv float %a, %x
82   ret float %r
83
84 ; CHECK: @goo
85 ; CHECK-DAG: frsqrtes
86 ; CHECK-DAG: fnmsubs
87 ; CHECK: fmuls
88 ; CHECK-NEXT: fmadds
89 ; CHECK-NEXT: fmuls
90 ; CHECK-NEXT: fmuls
91 ; CHECK-NEXT: blr
92
93 ; CHECK-SAFE: @goo
94 ; CHECK-SAFE: fsqrts
95 ; CHECK-SAFE: fdivs
96 ; CHECK-SAFE: blr
97 }
98
99 define <4 x float> @hoo(<4 x float> %a, <4 x float> %b) nounwind {
100   %x = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %b)
101   %r = fdiv <4 x float> %a, %x
102   ret <4 x float> %r
103
104 ; CHECK: @hoo
105 ; CHECK: vrsqrtefp
106
107 ; CHECK-SAFE: @hoo
108 ; CHECK-SAFE-NOT: vrsqrtefp
109 ; CHECK-SAFE: blr
110 }
111
112 define double @foo2(double %a, double %b) nounwind {
113   %r = fdiv double %a, %b
114   ret double %r
115
116 ; CHECK: @foo2
117 ; CHECK-DAG: fre
118 ; CHECK-DAG: fnmsub
119 ; CHECK: fmadd
120 ; CHECK-NEXT: fnmsub
121 ; CHECK-NEXT: fmadd
122 ; CHECK-NEXT: fmul
123 ; CHECK-NEXT: blr
124
125 ; CHECK-SAFE: @foo2
126 ; CHECK-SAFE: fdiv
127 ; CHECK-SAFE: blr
128 }
129
130 define float @goo2(float %a, float %b) nounwind {
131   %r = fdiv float %a, %b
132   ret float %r
133
134 ; CHECK: @goo2
135 ; CHECK-DAG: fres
136 ; CHECK-DAG: fnmsubs
137 ; CHECK: fmadds
138 ; CHECK-NEXT: fmuls
139 ; CHECK-NEXT: blr
140
141 ; CHECK-SAFE: @goo2
142 ; CHECK-SAFE: fdivs
143 ; CHECK-SAFE: blr
144 }
145
146 define <4 x float> @hoo2(<4 x float> %a, <4 x float> %b) nounwind {
147   %r = fdiv <4 x float> %a, %b
148   ret <4 x float> %r
149
150 ; CHECK: @hoo2
151 ; CHECK: vrefp
152
153 ; CHECK-SAFE: @hoo2
154 ; CHECK-SAFE-NOT: vrefp
155 ; CHECK-SAFE: blr
156 }
157
158 define double @foo3(double %a) nounwind {
159   %r = call double @llvm.sqrt.f64(double %a)
160   ret double %r
161
162 ; CHECK: @foo3
163 ; CHECK: fcmpu
164 ; CHECK-DAG: frsqrte
165 ; CHECK-DAG: fnmsub
166 ; CHECK: fmul
167 ; CHECK-NEXT: fmadd
168 ; CHECK-NEXT: fmul
169 ; CHECK-NEXT: fmul
170 ; CHECK-NEXT: fmadd
171 ; CHECK-NEXT: fmul
172 ; CHECK-NEXT: fre
173 ; CHECK-NEXT: fnmsub
174 ; CHECK-NEXT: fmadd
175 ; CHECK-NEXT: fnmsub
176 ; CHECK-NEXT: fmadd
177 ; CHECK: blr
178
179 ; CHECK-SAFE: @foo3
180 ; CHECK-SAFE: fsqrt
181 ; CHECK-SAFE: blr
182 }
183
184 define float @goo3(float %a) nounwind {
185   %r = call float @llvm.sqrt.f32(float %a)
186   ret float %r
187
188 ; CHECK: @goo3
189 ; CHECK: fcmpu
190 ; CHECK-DAG: frsqrtes
191 ; CHECK-DAG: fnmsubs
192 ; CHECK: fmuls
193 ; CHECK-NEXT: fmadds
194 ; CHECK-NEXT: fmuls
195 ; CHECK-NEXT: fres
196 ; CHECK-NEXT: fnmsubs
197 ; CHECK-NEXT: fmadds
198 ; CHECK: blr
199
200 ; CHECK-SAFE: @goo3
201 ; CHECK-SAFE: fsqrts
202 ; CHECK-SAFE: blr
203 }
204
205 define <4 x float> @hoo3(<4 x float> %a) nounwind {
206   %r = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %a)
207   ret <4 x float> %r
208
209 ; CHECK: @hoo3
210 ; CHECK: vrsqrtefp
211 ; CHECK-DAG: vrefp
212 ; CHECK-DAG: vcmpeqfp
213
214 ; CHECK-SAFE: @hoo3
215 ; CHECK-SAFE-NOT: vrsqrtefp
216 ; CHECK-SAFE: blr
217 }
218