blob: 41dcb0f5b3fcb9c77b759e6b1da8a2f46aed0837 [file] [log] [blame]
Bill Schmidt5c6cb812014-10-21 13:02:37 +00001; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -enable-unsafe-fp-math -mattr=-vsx | FileCheck %s
Hal Finkelcbf08922015-07-12 02:33:57 +00002; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -enable-unsafe-fp-math -mattr=-vsx -recip=sqrtf:0,sqrtd:0 | FileCheck %s -check-prefix=CHECK-NONR
Bill Schmidt5c6cb812014-10-21 13:02:37 +00003; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -mattr=-vsx | FileCheck -check-prefix=CHECK-SAFE %s
Hal Finkel2e103312013-04-03 04:01:11 +00004target 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"
5target triple = "powerpc64-unknown-linux-gnu"
6
7declare double @llvm.sqrt.f64(double)
8declare float @llvm.sqrt.f32(float)
9declare <4 x float> @llvm.sqrt.v4f32(<4 x float>)
10
11define double @foo(double %a, double %b) nounwind {
Hal Finkel2e103312013-04-03 04:01:11 +000012 %x = call double @llvm.sqrt.f64(double %b)
13 %r = fdiv double %a, %x
14 ret double %r
15
16; CHECK: @foo
Bill Schmidt22f91912013-05-16 16:15:18 +000017; CHECK-DAG: frsqrte
18; CHECK-DAG: fnmsub
Hal Finkel2e103312013-04-03 04:01:11 +000019; CHECK: fmul
Sanjay Patelbdf1e382014-09-26 23:01:47 +000020; CHECK-NEXT: fmadd
21; CHECK-NEXT: fmul
22; CHECK-NEXT: fmul
23; CHECK-NEXT: fmadd
24; CHECK-NEXT: fmul
25; CHECK-NEXT: fmul
Hal Finkel2e103312013-04-03 04:01:11 +000026; CHECK: blr
27
Hal Finkelcbf08922015-07-12 02:33:57 +000028; CHECK-NONR: @foo
29; CHECK-NONR: frsqrte
30; CHECK-NONR-NOT: fmadd
31; CHECK-NONR: fmul
32; CHECK-NONR-NOT: fmadd
33; CHECK-NONR: blr
34
Hal Finkel2e103312013-04-03 04:01:11 +000035; CHECK-SAFE: @foo
36; CHECK-SAFE: fsqrt
37; CHECK-SAFE: fdiv
38; CHECK-SAFE: blr
39}
40
Hal Finkelf96c18e2013-04-04 22:44:12 +000041define double @foof(double %a, float %b) nounwind {
Hal Finkelf96c18e2013-04-04 22:44:12 +000042 %x = call float @llvm.sqrt.f32(float %b)
43 %y = fpext float %x to double
44 %r = fdiv double %a, %y
45 ret double %r
46
47; CHECK: @foof
Bill Schmidt22f91912013-05-16 16:15:18 +000048; CHECK-DAG: frsqrtes
49; CHECK-DAG: fnmsubs
Hal Finkelf96c18e2013-04-04 22:44:12 +000050; CHECK: fmuls
Sanjay Patel4bc685c2014-09-22 22:46:44 +000051; CHECK-NEXT: fmadds
52; CHECK-NEXT: fmuls
53; CHECK-NEXT: fmul
54; CHECK-NEXT: blr
Hal Finkelf96c18e2013-04-04 22:44:12 +000055
56; CHECK-SAFE: @foof
57; CHECK-SAFE: fsqrts
58; CHECK-SAFE: fdiv
59; CHECK-SAFE: blr
60}
61
62define float @food(float %a, double %b) nounwind {
Hal Finkelf96c18e2013-04-04 22:44:12 +000063 %x = call double @llvm.sqrt.f64(double %b)
64 %y = fptrunc double %x to float
65 %r = fdiv float %a, %y
66 ret float %r
67
68; CHECK: @foo
Bill Schmidt22f91912013-05-16 16:15:18 +000069; CHECK-DAG: frsqrte
70; CHECK-DAG: fnmsub
Hal Finkelf96c18e2013-04-04 22:44:12 +000071; CHECK: fmul
Sanjay Patel4bc685c2014-09-22 22:46:44 +000072; CHECK-NEXT: fmadd
73; CHECK-NEXT: fmul
74; CHECK-NEXT: fmul
75; CHECK-NEXT: fmadd
76; CHECK-NEXT: fmul
77; CHECK-NEXT: frsp
78; CHECK-NEXT: fmuls
79; CHECK-NEXT: blr
Hal Finkelf96c18e2013-04-04 22:44:12 +000080
81; CHECK-SAFE: @foo
82; CHECK-SAFE: fsqrt
83; CHECK-SAFE: fdivs
84; CHECK-SAFE: blr
85}
86
Hal Finkel2e103312013-04-03 04:01:11 +000087define float @goo(float %a, float %b) nounwind {
Hal Finkel2e103312013-04-03 04:01:11 +000088 %x = call float @llvm.sqrt.f32(float %b)
89 %r = fdiv float %a, %x
90 ret float %r
91
92; CHECK: @goo
Bill Schmidt22f91912013-05-16 16:15:18 +000093; CHECK-DAG: frsqrtes
94; CHECK-DAG: fnmsubs
Hal Finkel2e103312013-04-03 04:01:11 +000095; CHECK: fmuls
Sanjay Patelbdf1e382014-09-26 23:01:47 +000096; CHECK-NEXT: fmadds
97; CHECK-NEXT: fmuls
98; CHECK-NEXT: fmuls
99; CHECK-NEXT: blr
Hal Finkel2e103312013-04-03 04:01:11 +0000100
Hal Finkelcbf08922015-07-12 02:33:57 +0000101; CHECK-NONR: @goo
102; CHECK-NONR: frsqrtes
103; CHECK-NONR-NOT: fmadds
104; CHECK-NONR: fmuls
105; CHECK-NONR-NOT: fmadds
106; CHECK-NONR: blr
107
Hal Finkel2e103312013-04-03 04:01:11 +0000108; CHECK-SAFE: @goo
109; CHECK-SAFE: fsqrts
110; CHECK-SAFE: fdivs
111; CHECK-SAFE: blr
112}
113
Sanjay Patel7bc91852014-10-06 19:31:18 +0000114; Recognize that this is rsqrt(a) * rcp(b) * c,
115; not 1 / ( 1 / sqrt(a)) * rcp(b) * c.
116define float @rsqrt_fmul(float %a, float %b, float %c) {
117 %x = call float @llvm.sqrt.f32(float %a)
118 %y = fmul float %x, %b
119 %z = fdiv float %c, %y
120 ret float %z
121
122; CHECK: @rsqrt_fmul
123; CHECK-DAG: frsqrtes
124; CHECK-DAG: fres
125; CHECK-DAG: fnmsubs
126; CHECK-DAG: fmuls
127; CHECK-DAG: fnmsubs
128; CHECK-DAG: fmadds
129; CHECK-DAG: fmadds
130; CHECK: fmuls
131; CHECK-NEXT: fmuls
132; CHECK-NEXT: fmuls
133; CHECK-NEXT: blr
134
135; CHECK-SAFE: @rsqrt_fmul
136; CHECK-SAFE: fsqrts
137; CHECK-SAFE: fmuls
138; CHECK-SAFE: fdivs
139; CHECK-SAFE: blr
140}
141
Hal Finkel2e103312013-04-03 04:01:11 +0000142define <4 x float> @hoo(<4 x float> %a, <4 x float> %b) nounwind {
Hal Finkel2e103312013-04-03 04:01:11 +0000143 %x = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %b)
144 %r = fdiv <4 x float> %a, %x
145 ret <4 x float> %r
146
147; CHECK: @hoo
148; CHECK: vrsqrtefp
149
150; CHECK-SAFE: @hoo
151; CHECK-SAFE-NOT: vrsqrtefp
152; CHECK-SAFE: blr
153}
154
155define double @foo2(double %a, double %b) nounwind {
Hal Finkel2e103312013-04-03 04:01:11 +0000156 %r = fdiv double %a, %b
157 ret double %r
158
159; CHECK: @foo2
Bill Schmidt22f91912013-05-16 16:15:18 +0000160; CHECK-DAG: fre
161; CHECK-DAG: fnmsub
Hal Finkel2e103312013-04-03 04:01:11 +0000162; CHECK: fmadd
Sanjay Patelbdf1e382014-09-26 23:01:47 +0000163; CHECK-NEXT: fnmsub
164; CHECK-NEXT: fmadd
165; CHECK-NEXT: fmul
166; CHECK-NEXT: blr
Hal Finkel2e103312013-04-03 04:01:11 +0000167
168; CHECK-SAFE: @foo2
169; CHECK-SAFE: fdiv
170; CHECK-SAFE: blr
171}
172
173define float @goo2(float %a, float %b) nounwind {
Hal Finkel2e103312013-04-03 04:01:11 +0000174 %r = fdiv float %a, %b
175 ret float %r
176
177; CHECK: @goo2
Bill Schmidt22f91912013-05-16 16:15:18 +0000178; CHECK-DAG: fres
179; CHECK-DAG: fnmsubs
Hal Finkel2e103312013-04-03 04:01:11 +0000180; CHECK: fmadds
Sanjay Patelbdf1e382014-09-26 23:01:47 +0000181; CHECK-NEXT: fmuls
182; CHECK-NEXT: blr
Hal Finkel2e103312013-04-03 04:01:11 +0000183
184; CHECK-SAFE: @goo2
185; CHECK-SAFE: fdivs
186; CHECK-SAFE: blr
187}
188
189define <4 x float> @hoo2(<4 x float> %a, <4 x float> %b) nounwind {
Hal Finkel2e103312013-04-03 04:01:11 +0000190 %r = fdiv <4 x float> %a, %b
191 ret <4 x float> %r
192
193; CHECK: @hoo2
194; CHECK: vrefp
195
196; CHECK-SAFE: @hoo2
197; CHECK-SAFE-NOT: vrefp
198; CHECK-SAFE: blr
199}
200
201define double @foo3(double %a) nounwind {
Hal Finkel2e103312013-04-03 04:01:11 +0000202 %r = call double @llvm.sqrt.f64(double %a)
203 ret double %r
204
205; CHECK: @foo3
Hal Finkel1e2e3ea2013-09-12 19:04:12 +0000206; CHECK: fcmpu
Bill Schmidt22f91912013-05-16 16:15:18 +0000207; CHECK-DAG: frsqrte
208; CHECK-DAG: fnmsub
Hal Finkel2e103312013-04-03 04:01:11 +0000209; CHECK: fmul
Sanjay Patelbdf1e382014-09-26 23:01:47 +0000210; CHECK-NEXT: fmadd
211; CHECK-NEXT: fmul
212; CHECK-NEXT: fmul
213; CHECK-NEXT: fmadd
214; CHECK-NEXT: fmul
Sanjay Patel3d497cd2014-10-09 21:26:35 +0000215; CHECK-NEXT: fmul
Hal Finkel2e103312013-04-03 04:01:11 +0000216; CHECK: blr
217
218; CHECK-SAFE: @foo3
219; CHECK-SAFE: fsqrt
220; CHECK-SAFE: blr
221}
222
223define float @goo3(float %a) nounwind {
Hal Finkel2e103312013-04-03 04:01:11 +0000224 %r = call float @llvm.sqrt.f32(float %a)
225 ret float %r
226
227; CHECK: @goo3
Hal Finkel1e2e3ea2013-09-12 19:04:12 +0000228; CHECK: fcmpu
Bill Schmidt22f91912013-05-16 16:15:18 +0000229; CHECK-DAG: frsqrtes
230; CHECK-DAG: fnmsubs
Hal Finkel2e103312013-04-03 04:01:11 +0000231; CHECK: fmuls
Sanjay Patelbdf1e382014-09-26 23:01:47 +0000232; CHECK-NEXT: fmadds
233; CHECK-NEXT: fmuls
Sanjay Patel3d497cd2014-10-09 21:26:35 +0000234; CHECK-NEXT: fmuls
Hal Finkel2e103312013-04-03 04:01:11 +0000235; CHECK: blr
236
237; CHECK-SAFE: @goo3
238; CHECK-SAFE: fsqrts
239; CHECK-SAFE: blr
240}
241
242define <4 x float> @hoo3(<4 x float> %a) nounwind {
Hal Finkel2e103312013-04-03 04:01:11 +0000243 %r = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %a)
244 ret <4 x float> %r
245
246; CHECK: @hoo3
247; CHECK: vrsqrtefp
Hal Finkel1e2e3ea2013-09-12 19:04:12 +0000248; CHECK-DAG: vcmpeqfp
Hal Finkel2e103312013-04-03 04:01:11 +0000249
250; CHECK-SAFE: @hoo3
251; CHECK-SAFE-NOT: vrsqrtefp
252; CHECK-SAFE: blr
253}
254