Fix PPC64 64-bit GPR inline asm constraint matching
[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 entry:
12   %x = call double @llvm.sqrt.f64(double %b)
13   %r = fdiv double %a, %x
14   ret double %r
15
16 ; CHECK: @foo
17 ; CHECK-DAG: frsqrte
18 ; CHECK-DAG: fnmsub
19 ; CHECK: fmul
20 ; CHECK: fmadd
21 ; CHECK: fmul
22 ; CHECK: fmul
23 ; CHECK: fmadd
24 ; CHECK: fmul
25 ; CHECK: fmul
26 ; CHECK: blr
27
28 ; CHECK-SAFE: @foo
29 ; CHECK-SAFE: fsqrt
30 ; CHECK-SAFE: fdiv
31 ; CHECK-SAFE: blr
32 }
33
34 define double @foof(double %a, float %b) nounwind {
35 entry:
36   %x = call float @llvm.sqrt.f32(float %b)
37   %y = fpext float %x to double
38   %r = fdiv double %a, %y
39   ret double %r
40
41 ; CHECK: @foof
42 ; CHECK-DAG: frsqrtes
43 ; CHECK-DAG: fnmsubs
44 ; CHECK: fmuls
45 ; CHECK: fmadds
46 ; CHECK: fmuls
47 ; CHECK: fmul
48 ; CHECK: blr
49
50 ; CHECK-SAFE: @foof
51 ; CHECK-SAFE: fsqrts
52 ; CHECK-SAFE: fdiv
53 ; CHECK-SAFE: blr
54 }
55
56 define float @food(float %a, double %b) nounwind {
57 entry:
58   %x = call double @llvm.sqrt.f64(double %b)
59   %y = fptrunc double %x to float
60   %r = fdiv float %a, %y
61   ret float %r
62
63 ; CHECK: @foo
64 ; CHECK-DAG: frsqrte
65 ; CHECK-DAG: fnmsub
66 ; CHECK: fmul
67 ; CHECK: fmadd
68 ; CHECK: fmul
69 ; CHECK: fmul
70 ; CHECK: fmadd
71 ; CHECK: fmul
72 ; CHECK: frsp
73 ; CHECK: fmuls
74 ; CHECK: blr
75
76 ; CHECK-SAFE: @foo
77 ; CHECK-SAFE: fsqrt
78 ; CHECK-SAFE: fdivs
79 ; CHECK-SAFE: blr
80 }
81
82 define float @goo(float %a, float %b) nounwind {
83 entry:
84   %x = call float @llvm.sqrt.f32(float %b)
85   %r = fdiv float %a, %x
86   ret float %r
87
88 ; CHECK: @goo
89 ; CHECK-DAG: frsqrtes
90 ; CHECK-DAG: fnmsubs
91 ; CHECK: fmuls
92 ; CHECK: fmadds
93 ; CHECK: fmuls
94 ; CHECK: fmuls
95 ; CHECK: blr
96
97 ; CHECK-SAFE: @goo
98 ; CHECK-SAFE: fsqrts
99 ; CHECK-SAFE: fdivs
100 ; CHECK-SAFE: blr
101 }
102
103 define <4 x float> @hoo(<4 x float> %a, <4 x float> %b) nounwind {
104 entry:
105   %x = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %b)
106   %r = fdiv <4 x float> %a, %x
107   ret <4 x float> %r
108
109 ; CHECK: @hoo
110 ; CHECK: vrsqrtefp
111
112 ; CHECK-SAFE: @hoo
113 ; CHECK-SAFE-NOT: vrsqrtefp
114 ; CHECK-SAFE: blr
115 }
116
117 define double @foo2(double %a, double %b) nounwind {
118 entry:
119   %r = fdiv double %a, %b
120   ret double %r
121
122 ; CHECK: @foo2
123 ; CHECK-DAG: fre
124 ; CHECK-DAG: fnmsub
125 ; CHECK: fmadd
126 ; CHECK: fnmsub
127 ; CHECK: fmadd
128 ; CHECK: fmul
129 ; CHECK: blr
130
131 ; CHECK-SAFE: @foo2
132 ; CHECK-SAFE: fdiv
133 ; CHECK-SAFE: blr
134 }
135
136 define float @goo2(float %a, float %b) nounwind {
137 entry:
138   %r = fdiv float %a, %b
139   ret float %r
140
141 ; CHECK: @goo2
142 ; CHECK-DAG: fres
143 ; CHECK-DAG: fnmsubs
144 ; CHECK: fmadds
145 ; CHECK: fmuls
146 ; CHECK: blr
147
148 ; CHECK-SAFE: @goo2
149 ; CHECK-SAFE: fdivs
150 ; CHECK-SAFE: blr
151 }
152
153 define <4 x float> @hoo2(<4 x float> %a, <4 x float> %b) nounwind {
154 entry:
155   %r = fdiv <4 x float> %a, %b
156   ret <4 x float> %r
157
158 ; CHECK: @hoo2
159 ; CHECK: vrefp
160
161 ; CHECK-SAFE: @hoo2
162 ; CHECK-SAFE-NOT: vrefp
163 ; CHECK-SAFE: blr
164 }
165
166 define double @foo3(double %a) nounwind {
167 entry:
168   %r = call double @llvm.sqrt.f64(double %a)
169   ret double %r
170
171 ; CHECK: @foo3
172 ; CHECK-DAG: frsqrte
173 ; CHECK-DAG: fnmsub
174 ; CHECK: fmul
175 ; CHECK: fmadd
176 ; CHECK: fmul
177 ; CHECK: fmul
178 ; CHECK: fmadd
179 ; CHECK: fmul
180 ; CHECK: fre
181 ; CHECK: fnmsub
182 ; CHECK: fmadd
183 ; CHECK: fnmsub
184 ; CHECK: fmadd
185 ; CHECK: blr
186
187 ; CHECK-SAFE: @foo3
188 ; CHECK-SAFE: fsqrt
189 ; CHECK-SAFE: blr
190 }
191
192 define float @goo3(float %a) nounwind {
193 entry:
194   %r = call float @llvm.sqrt.f32(float %a)
195   ret float %r
196
197 ; CHECK: @goo3
198 ; CHECK-DAG: frsqrtes
199 ; CHECK-DAG: fnmsubs
200 ; CHECK: fmuls
201 ; CHECK: fmadds
202 ; CHECK: fmuls
203 ; CHECK: fres
204 ; CHECK: fnmsubs
205 ; CHECK: fmadds
206 ; CHECK: blr
207
208 ; CHECK-SAFE: @goo3
209 ; CHECK-SAFE: fsqrts
210 ; CHECK-SAFE: blr
211 }
212
213 define <4 x float> @hoo3(<4 x float> %a) nounwind {
214 entry:
215   %r = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %a)
216   ret <4 x float> %r
217
218 ; CHECK: @hoo3
219 ; CHECK: vrsqrtefp
220 ; CHECK: vrefp
221
222 ; CHECK-SAFE: @hoo3
223 ; CHECK-SAFE-NOT: vrsqrtefp
224 ; CHECK-SAFE: blr
225 }
226