f6d0025693bdd6d168bf633da1ad21727920b3a6
[oota-llvm.git] / test / CodeGen / Hexagon / intrinsics / xtype_fp.ll
1 ; RUN: llc -march=hexagon -mcpu=hexagonv5 -O0 < %s | FileCheck %s
2 ; Hexagon Programmer's Reference Manual 11.10.4 XTYPE/FP
3
4 ; Floating point addition
5 declare float @llvm.hexagon.F2.sfadd(float, float)
6 define float @F2_sfadd(float %a, float %b) {
7   %z = call float @llvm.hexagon.F2.sfadd(float %a, float %b)
8   ret float %z
9 }
10 ; CHECK: r0 = sfadd(r0, r1)
11
12 ; Classify floating-point value
13 declare i32 @llvm.hexagon.F2.sfclass(float, i32)
14 define i32 @F2_sfclass(float %a) {
15   %z = call i32 @llvm.hexagon.F2.sfclass(float %a, i32 0)
16   ret i32 %z
17 }
18 ; CHECK: p0 = sfclass(r0, #0)
19
20 declare i32 @llvm.hexagon.F2.dfclass(double, i32)
21 define i32 @F2_dfclass(double %a) {
22   %z = call i32 @llvm.hexagon.F2.dfclass(double %a, i32 0)
23   ret i32 %z
24 }
25 ; CHECK: p0 = dfclass(r1:0, #0)
26
27 ; Convert floating-point value to other format
28 declare double @llvm.hexagon.F2.conv.sf2df(float)
29 define double @F2_conv_sf2df(float %a) {
30   %z = call double @llvm.hexagon.F2.conv.sf2df(float %a)
31   ret double %z
32 }
33 ; CHECK:  = convert_sf2df(r0)
34
35 declare float @llvm.hexagon.F2.conv.df2sf(double)
36 define float @F2_conv_df2sf(double %a) {
37   %z = call float @llvm.hexagon.F2.conv.df2sf(double %a)
38   ret float %z
39 }
40 ; CHECK: r0 = convert_df2sf(r1:0)
41
42 ; Convert integer to floating-point value
43 declare double @llvm.hexagon.F2.conv.ud2df(i64)
44 define double @F2_conv_ud2df(i64 %a) {
45   %z = call double @llvm.hexagon.F2.conv.ud2df(i64 %a)
46   ret double %z
47 }
48 ; CHECK: r1:0 = convert_ud2df(r1:0)
49
50 declare double @llvm.hexagon.F2.conv.d2df(i64)
51 define double @F2_conv_d2df(i64 %a) {
52   %z = call double @llvm.hexagon.F2.conv.d2df(i64 %a)
53   ret double %z
54 }
55 ; CHECK: r1:0 = convert_d2df(r1:0)
56
57 declare double @llvm.hexagon.F2.conv.uw2df(i32)
58 define double @F2_conv_uw2df(i32 %a) {
59   %z = call double @llvm.hexagon.F2.conv.uw2df(i32 %a)
60   ret double %z
61 }
62 ; CHECK:  = convert_uw2df(r0)
63
64 declare double @llvm.hexagon.F2.conv.w2df(i32)
65 define double @F2_conv_w2df(i32 %a) {
66   %z = call double @llvm.hexagon.F2.conv.w2df(i32 %a)
67   ret double %z
68 }
69 ; CHECK:  = convert_w2df(r0)
70
71 declare float @llvm.hexagon.F2.conv.ud2sf(i64)
72 define float @F2_conv_ud2sf(i64 %a) {
73   %z = call float @llvm.hexagon.F2.conv.ud2sf(i64 %a)
74   ret float %z
75 }
76 ; CHECK: r0 = convert_ud2sf(r1:0)
77
78 declare float @llvm.hexagon.F2.conv.d2sf(i64)
79 define float @F2_conv_d2sf(i64 %a) {
80   %z = call float @llvm.hexagon.F2.conv.d2sf(i64 %a)
81   ret float %z
82 }
83 ; CHECK: r0 = convert_d2sf(r1:0)
84
85 declare float @llvm.hexagon.F2.conv.uw2sf(i32)
86 define float @F2_conv_uw2sf(i32 %a) {
87   %z = call float @llvm.hexagon.F2.conv.uw2sf(i32 %a)
88   ret float %z
89 }
90 ; CHECK: r0 = convert_uw2sf(r0)
91
92 declare float @llvm.hexagon.F2.conv.w2sf(i32)
93 define float @F2_conv_w2sf(i32 %a) {
94   %z = call float @llvm.hexagon.F2.conv.w2sf(i32 %a)
95   ret float %z
96 }
97 ; CHECK: r0 = convert_w2sf(r0)
98
99 ; Convert floating-point value to integer
100 declare i64 @llvm.hexagon.F2.conv.df2d(double)
101 define i64 @F2_conv_df2d(double %a) {
102   %z = call i64 @llvm.hexagon.F2.conv.df2d(double %a)
103   ret i64 %z
104 }
105 ; CHECK: r1:0 = convert_df2d(r1:0)
106
107 declare i64 @llvm.hexagon.F2.conv.df2ud(double)
108 define i64 @F2_conv_df2ud(double %a) {
109   %z = call i64 @llvm.hexagon.F2.conv.df2ud(double %a)
110   ret i64 %z
111 }
112 ; CHECK: r1:0 = convert_df2ud(r1:0)
113
114 declare i64 @llvm.hexagon.F2.conv.df2d.chop(double)
115 define i64 @F2_conv_df2d_chop(double %a) {
116   %z = call i64 @llvm.hexagon.F2.conv.df2d.chop(double %a)
117   ret i64 %z
118 }
119 ; CHECK: r1:0 = convert_df2d(r1:0):chop
120
121 declare i64 @llvm.hexagon.F2.conv.df2ud.chop(double)
122 define i64 @F2_conv_df2ud_chop(double %a) {
123   %z = call i64 @llvm.hexagon.F2.conv.df2ud.chop(double %a)
124   ret i64 %z
125 }
126 ; CHECK: r1:0 = convert_df2ud(r1:0):chop
127
128 declare i64 @llvm.hexagon.F2.conv.sf2ud(float)
129 define i64 @F2_conv_sf2ud(float %a) {
130   %z = call i64 @llvm.hexagon.F2.conv.sf2ud(float %a)
131   ret i64 %z
132 }
133 ; CHECK:  = convert_sf2ud(r0)
134
135 declare i64 @llvm.hexagon.F2.conv.sf2d(float)
136 define i64 @F2_conv_sf2d(float %a) {
137   %z = call i64 @llvm.hexagon.F2.conv.sf2d(float %a)
138   ret i64 %z
139 }
140 ; CHECK:  = convert_sf2d(r0)
141
142 declare i64 @llvm.hexagon.F2.conv.sf2d.chop(float)
143 define i64 @F2_conv_sf2d_chop(float %a) {
144   %z = call i64 @llvm.hexagon.F2.conv.sf2d.chop(float %a)
145   ret i64 %z
146 }
147 ; CHECK:  = convert_sf2d(r0):chop
148
149 declare i64 @llvm.hexagon.F2.conv.sf2ud.chop(float)
150 define i64 @F2_conv_sf2ud_chop(float %a) {
151   %z = call i64 @llvm.hexagon.F2.conv.sf2ud.chop(float %a)
152   ret i64 %z
153 }
154 ; CHECK:  = convert_sf2ud(r0):chop
155
156 declare i32 @llvm.hexagon.F2.conv.df2uw(double)
157 define i32 @F2_conv_df2uw(double %a) {
158   %z = call i32 @llvm.hexagon.F2.conv.df2uw(double %a)
159   ret i32 %z
160 }
161 ; CHECK: r0 = convert_df2uw(r1:0)
162
163 declare i32 @llvm.hexagon.F2.conv.df2w(double)
164 define i32 @F2_conv_df2w(double %a) {
165   %z = call i32 @llvm.hexagon.F2.conv.df2w(double %a)
166   ret i32 %z
167 }
168 ; CHECK: r0 = convert_df2w(r1:0)
169
170 declare i32 @llvm.hexagon.F2.conv.df2w.chop(double)
171 define i32 @F2_conv_df2w_chop(double %a) {
172   %z = call i32 @llvm.hexagon.F2.conv.df2w.chop(double %a)
173   ret i32 %z
174 }
175 ; CHECK: r0 = convert_df2w(r1:0):chop
176
177 declare i32 @llvm.hexagon.F2.conv.df2uw.chop(double)
178 define i32 @F2_conv_df2uw_chop(double %a) {
179   %z = call i32 @llvm.hexagon.F2.conv.df2uw.chop(double %a)
180   ret i32 %z
181 }
182 ; CHECK: r0 = convert_df2uw(r1:0):chop
183
184 declare i32 @llvm.hexagon.F2.conv.sf2uw(float)
185 define i32 @F2_conv_sf2uw(float %a) {
186   %z = call i32 @llvm.hexagon.F2.conv.sf2uw(float %a)
187   ret i32 %z
188 }
189 ; CHECK: r0 = convert_sf2uw(r0)
190
191 declare i32 @llvm.hexagon.F2.conv.sf2uw.chop(float)
192 define i32 @F2_conv_sf2uw_chop(float %a) {
193   %z = call i32 @llvm.hexagon.F2.conv.sf2uw.chop(float %a)
194   ret i32 %z
195 }
196 ; CHECK: r0 = convert_sf2uw(r0):chop
197
198 declare i32 @llvm.hexagon.F2.conv.sf2w(float)
199 define i32 @F2_conv_sf2w(float %a) {
200   %z = call i32 @llvm.hexagon.F2.conv.sf2w(float %a)
201   ret i32 %z
202 }
203 ; CHECK: r0 = convert_sf2w(r0)
204
205 declare i32 @llvm.hexagon.F2.conv.sf2w.chop(float)
206 define i32 @F2_conv_sf2w_chop(float %a) {
207   %z = call i32 @llvm.hexagon.F2.conv.sf2w.chop(float %a)
208   ret i32 %z
209 }
210 ; CHECK: r0 = convert_sf2w(r0):chop
211
212 ; Floating point extreme value assistance
213 declare float @llvm.hexagon.F2.sffixupr(float)
214 define float @F2_sffixupr(float %a) {
215   %z = call float @llvm.hexagon.F2.sffixupr(float %a)
216   ret float %z
217 }
218 ; CHECK: r0 = sffixupr(r0)
219
220 declare float @llvm.hexagon.F2.sffixupn(float, float)
221 define float @F2_sffixupn(float %a, float %b) {
222   %z = call float @llvm.hexagon.F2.sffixupn(float %a, float %b)
223   ret float %z
224 }
225 ; CHECK: r0 = sffixupn(r0, r1)
226
227 declare float @llvm.hexagon.F2.sffixupd(float, float)
228 define float @F2_sffixupd(float %a, float %b) {
229   %z = call float @llvm.hexagon.F2.sffixupd(float %a, float %b)
230   ret float %z
231 }
232 ; CHECK: r0 = sffixupd(r0, r1)
233
234 ; Floating point fused multiply-add
235 declare float @llvm.hexagon.F2.sffma(float, float, float)
236 define float @F2_sffma(float %a, float %b, float %c) {
237   %z = call float @llvm.hexagon.F2.sffma(float %a, float %b, float %c)
238   ret float %z
239 }
240 ; CHECK: r0 += sfmpy(r1, r2)
241
242 declare float @llvm.hexagon.F2.sffms(float, float, float)
243 define float @F2_sffms(float %a, float %b, float %c) {
244   %z = call float @llvm.hexagon.F2.sffms(float %a, float %b, float %c)
245   ret float %z
246 }
247 ; CHECK: r0 -= sfmpy(r1, r2)
248
249 ; Floating point fused multiply-add with scaling
250 declare float @llvm.hexagon.F2.sffma.sc(float, float, float, i32)
251 define float @F2_sffma_sc(float %a, float %b, float %c, i32 %d) {
252   %z = call float @llvm.hexagon.F2.sffma.sc(float %a, float %b, float %c, i32 %d)
253   ret float %z
254 }
255 ; CHECK: r0 += sfmpy(r1, r2, p0):scale
256
257 ; Floating point fused multiply-add for library routines
258 declare float @llvm.hexagon.F2.sffma.lib(float, float, float)
259 define float @F2_sffma_lib(float %a, float %b, float %c) {
260   %z = call float @llvm.hexagon.F2.sffma.lib(float %a, float %b, float %c)
261   ret float %z
262 }
263 ; CHECK: r0 += sfmpy(r1, r2):lib
264
265 declare float @llvm.hexagon.F2.sffms.lib(float, float, float)
266 define float @F2_sffms_lib(float %a, float %b, float %c) {
267   %z = call float @llvm.hexagon.F2.sffms.lib(float %a, float %b, float %c)
268   ret float %z
269 }
270 ; CHECK: r0 -= sfmpy(r1, r2):lib
271
272 ; Create floating-point constant
273 declare float @llvm.hexagon.F2.sfimm.p(i32)
274 define float @F2_sfimm_p() {
275   %z = call float @llvm.hexagon.F2.sfimm.p(i32 0)
276   ret float %z
277 }
278 ; CHECK: r0 = sfmake(#0):pos
279
280 declare float @llvm.hexagon.F2.sfimm.n(i32)
281 define float @F2_sfimm_n() {
282   %z = call float @llvm.hexagon.F2.sfimm.n(i32 0)
283   ret float %z
284
285 ; CHECK: r0 = sfmake(#0):neg
286
287 declare double @llvm.hexagon.F2.dfimm.p(i32)
288 define double @F2_dfimm_p() {
289   %z = call double @llvm.hexagon.F2.dfimm.p(i32 0)
290   ret double %z
291 }
292 ; CHECK: r1:0 = dfmake(#0):pos
293
294 declare double @llvm.hexagon.F2.dfimm.n(i32)
295 define double @F2_dfimm_n() {
296   %z = call double @llvm.hexagon.F2.dfimm.n(i32 0)
297   ret double %z
298 }
299 ; CHECK: r1:0 = dfmake(#0):neg
300
301 ; Floating point maximum
302 declare float @llvm.hexagon.F2.sfmax(float, float)
303 define float @F2_sfmax(float %a, float %b) {
304   %z = call float @llvm.hexagon.F2.sfmax(float %a, float %b)
305   ret float %z
306 }
307 ; CHECK: r0 = sfmax(r0, r1)
308
309 ; Floating point minimum
310 declare float @llvm.hexagon.F2.sfmin(float, float)
311 define float @F2_sfmin(float %a, float %b) {
312   %z = call float @llvm.hexagon.F2.sfmin(float %a, float %b)
313   ret float %z
314 }
315 ; CHECK: r0 = sfmin(r0, r1)
316
317 ; Floating point multiply
318 declare float @llvm.hexagon.F2.sfmpy(float, float)
319 define float @F2_sfmpy(float %a, float %b) {
320   %z = call float @llvm.hexagon.F2.sfmpy(float %a, float %b)
321   ret float %z
322 }
323 ; CHECK: r0 = sfmpy(r0, r1)
324
325 ; Floating point subtraction
326 declare float @llvm.hexagon.F2.sfsub(float, float)
327 define float @F2_sfsub(float %a, float %b) {
328   %z = call float @llvm.hexagon.F2.sfsub(float %a, float %b)
329   ret float %z
330 }
331 ; CHECK: r0 = sfsub(r0, r1)