fp16-ops.c revision 176edba5311f6eff0cad2631449885ddf4fbc9ea
1// REQUIRES: arm-registered-target
2// RUN: %clang_cc1 -emit-llvm -o - -triple arm-none-linux-gnueabi %s | FileCheck %s
3typedef unsigned cond_t;
4
5volatile cond_t test;
6volatile __fp16 h0 = 0.0, h1 = 1.0, h2;
7volatile float f0, f1, f2;
8
9void foo(void) {
10  // CHECK-LABEL: define void @foo()
11
12  // Check unary ops
13
14  // CHECK: call float @llvm.convert.from.fp16.f32(
15  // CHECK fptoi float
16  test = (h0);
17  // CHECK: call float @llvm.convert.from.fp16.f32(
18  // CHECK: fcmp une float
19  test = (!h1);
20  // CHECK: call float @llvm.convert.from.fp16.f32(
21  // CHECK: fsub float
22  // CHECK: call i16 @llvm.convert.to.fp16.f32(
23  h1 = -h1;
24  // CHECK: call float @llvm.convert.from.fp16.f32(
25  // CHECK: call i16 @llvm.convert.to.fp16.f32(
26  h1 = +h1;
27  // CHECK: call float @llvm.convert.from.fp16.f32(
28  // CHECK: fadd float
29  // CHECK: call i16 @llvm.convert.to.fp16.f32(
30  h1++;
31  // CHECK: call float @llvm.convert.from.fp16.f32(
32  // CHECK: fadd float
33  // CHECK: call i16 @llvm.convert.to.fp16.f32(
34  ++h1;
35  // CHECK: call float @llvm.convert.from.fp16.f32(
36  // CHECK: fadd float
37  // CHECK: call i16 @llvm.convert.to.fp16.f32(
38  --h1;
39  // CHECK: call float @llvm.convert.from.fp16.f32(
40  // CHECK: fadd float
41  // CHECK: call i16 @llvm.convert.to.fp16.f32(
42  h1--;
43
44  // Check binary ops with various operands
45  // CHECK: call float @llvm.convert.from.fp16.f32(
46  // CHECK: call float @llvm.convert.from.fp16.f32(
47  // CHECK: fmul float
48  // CHECK: call i16 @llvm.convert.to.fp16.f32(
49  h1 = h0 * h2;
50  // CHECK: call float @llvm.convert.from.fp16.f32(
51  // CHECK: call i16 @llvm.convert.to.fp16.f32(
52  // CHECK: call float @llvm.convert.from.fp16.f32(
53  // CHECK: fmul float
54  // CHECK: call i16 @llvm.convert.to.fp16.f32(
55  h1 = h0 * (__fp16) -2.0;
56  // CHECK: call float @llvm.convert.from.fp16.f32(
57  // CHECK: fmul float
58  // CHECK: call i16 @llvm.convert.to.fp16.f32(
59  h1 = h0 * f2;
60  // CHECK: call float @llvm.convert.from.fp16.f32(
61  // CHECK: fmul float
62  // CHECK: call i16 @llvm.convert.to.fp16.f32(
63  h1 = f0 * h2;
64
65  // CHECK: call float @llvm.convert.from.fp16.f32(
66  // CHECK: call float @llvm.convert.from.fp16.f32(
67  // CHECK: fdiv float
68  // CHECK: call i16 @llvm.convert.to.fp16.f32(
69  h1 = (h0 / h2);
70  // CHECK: call float @llvm.convert.from.fp16.f32(
71  // CHECK: call float @llvm.convert.from.fp16.f32(
72  // CHECK: fdiv float
73  // CHECK: call i16 @llvm.convert.to.fp16.f32(
74  h1 = (h0 / (__fp16) -2.0);
75  // CHECK: call float @llvm.convert.from.fp16.f32(
76  // CHECK: fdiv float
77  // CHECK: call i16 @llvm.convert.to.fp16.f32(
78  h1 = (h0 / f2);
79  // CHECK: call float @llvm.convert.from.fp16.f32(
80  // CHECK: fdiv float
81  // CHECK: call i16 @llvm.convert.to.fp16.f32(
82  h1 = (f0 / h2);
83
84  // CHECK: call float @llvm.convert.from.fp16.f32(
85  // CHECK: call float @llvm.convert.from.fp16.f32(
86  // CHECK: fadd float
87  // CHECK: call i16 @llvm.convert.to.fp16.f32(
88  h1 = (h2 + h0);
89  // CHECK: call float @llvm.convert.from.fp16.f32(
90  // CHECK: call float @llvm.convert.from.fp16.f32(
91  // CHECK: fadd float
92  // CHECK: call i16 @llvm.convert.to.fp16.f32(
93  h1 = ((__fp16)-2.0 + h0);
94  // CHECK: call float @llvm.convert.from.fp16.f32(
95  // CHECK: fadd float
96  // CHECK: call i16 @llvm.convert.to.fp16.f32(
97  h1 = (h2 + f0);
98  // CHECK: call float @llvm.convert.from.fp16.f32(
99  // CHECK: fadd float
100  // CHECK: call i16 @llvm.convert.to.fp16.f32(
101  h1 = (f2 + h0);
102
103  // CHECK: call float @llvm.convert.from.fp16.f32(
104  // CHECK: call float @llvm.convert.from.fp16.f32(
105  // CHECK: fsub float
106  // CHECK: call i16 @llvm.convert.to.fp16.f32(
107  h1 = (h2 - h0);
108  // CHECK: call float @llvm.convert.from.fp16.f32(
109  // CHECK: call float @llvm.convert.from.fp16.f32(
110  // CHECK: fsub float
111  // CHECK: call i16 @llvm.convert.to.fp16.f32(
112  h1 = ((__fp16)-2.0 - h0);
113  // CHECK: call float @llvm.convert.from.fp16.f32(
114  // CHECK: fsub float
115  // CHECK: call i16 @llvm.convert.to.fp16.f32(
116  h1 = (h2 - f0);
117  // CHECK: call float @llvm.convert.from.fp16.f32(
118  // CHECK: fsub float
119  // CHECK: call i16 @llvm.convert.to.fp16.f32(
120  h1 = (f2 - h0);
121
122  // CHECK: call float @llvm.convert.from.fp16.f32(
123  // CHECK: call float @llvm.convert.from.fp16.f32(
124  // CHECK: fcmp olt
125  test = (h2 < h0);
126  // CHECK: call float @llvm.convert.from.fp16.f32(
127  // CHECK: call float @llvm.convert.from.fp16.f32(
128  // CHECK: fcmp olt
129  test = (h2 < (__fp16)42.0);
130  // CHECK: call float @llvm.convert.from.fp16.f32(
131  // CHECK: fcmp olt
132  test = (h2 < f0);
133  // CHECK: call float @llvm.convert.from.fp16.f32(
134  // CHECK: fcmp olt
135  test = (f2 < h0);
136
137  // CHECK: call float @llvm.convert.from.fp16.f32(
138  // CHECK: call float @llvm.convert.from.fp16.f32(
139  // CHECK: fcmp ogt
140  test = (h0 > h2);
141  // CHECK: call float @llvm.convert.from.fp16.f32(
142  // CHECK: call float @llvm.convert.from.fp16.f32(
143  // CHECK: fcmp ogt
144  test = ((__fp16)42.0 > h2);
145  // CHECK: call float @llvm.convert.from.fp16.f32(
146  // CHECK: fcmp ogt
147  test = (h0 > f2);
148  // CHECK: call float @llvm.convert.from.fp16.f32(
149  // CHECK: fcmp ogt
150  test = (f0 > h2);
151
152  // CHECK: call float @llvm.convert.from.fp16.f32(
153  // CHECK: call float @llvm.convert.from.fp16.f32(
154  // CHECK: fcmp ole
155  test = (h2 <= h0);
156  // CHECK: call float @llvm.convert.from.fp16.f32(
157  // CHECK: call float @llvm.convert.from.fp16.f32(
158  // CHECK: fcmp ole
159  test = (h2 <= (__fp16)42.0);
160  // CHECK: call float @llvm.convert.from.fp16.f32(
161  // CHECK: fcmp ole
162  test = (h2 <= f0);
163  // CHECK: call float @llvm.convert.from.fp16.f32(
164  // CHECK: fcmp ole
165  test = (f2 <= h0);
166
167  // CHECK: call float @llvm.convert.from.fp16.f32(
168  // CHECK: call float @llvm.convert.from.fp16.f32(
169  // CHECK: fcmp oge
170  test = (h0 >= h2);
171  // CHECK: call float @llvm.convert.from.fp16.f32(
172  // CHECK: call float @llvm.convert.from.fp16.f32(
173  // CHECK: fcmp oge
174  test = (h0 >= (__fp16)-2.0);
175  // CHECK: call float @llvm.convert.from.fp16.f32(
176  // CHECK: fcmp oge
177  test = (h0 >= f2);
178  // CHECK: call float @llvm.convert.from.fp16.f32(
179  // CHECK: fcmp oge
180  test = (f0 >= h2);
181
182  // CHECK: call float @llvm.convert.from.fp16.f32(
183  // CHECK: call float @llvm.convert.from.fp16.f32(
184  // CHECK: fcmp oeq
185  test = (h1 == h2);
186  // CHECK: call float @llvm.convert.from.fp16.f32(
187  // CHECK: call float @llvm.convert.from.fp16.f32(
188  // CHECK: fcmp oeq
189  test = (h1 == (__fp16)1.0);
190  // CHECK: call float @llvm.convert.from.fp16.f32(
191  // CHECK: fcmp oeq
192  test = (h1 == f1);
193  // CHECK: call float @llvm.convert.from.fp16.f32(
194  // CHECK: fcmp oeq
195  test = (f1 == h1);
196
197  // CHECK: call float @llvm.convert.from.fp16.f32(
198  // CHECK: call float @llvm.convert.from.fp16.f32(
199  // CHECK: fcmp une
200  test = (h1 != h2);
201  // CHECK: call float @llvm.convert.from.fp16.f32(
202  // CHECK: call float @llvm.convert.from.fp16.f32(
203  // CHECK: fcmp une
204  test = (h1 != (__fp16)1.0);
205  // CHECK: call float @llvm.convert.from.fp16.f32(
206  // CHECK: fcmp une
207  test = (h1 != f1);
208  // CHECK: call float @llvm.convert.from.fp16.f32(
209  // CHECK: fcmp une
210  test = (f1 != h1);
211
212  // CHECK: call float @llvm.convert.from.fp16.f32(
213  // CHECK: fcmp une
214  // CHECK: call float @llvm.convert.from.fp16.f32(
215  // CHECK: call float @llvm.convert.from.fp16.f32(
216  // CHECK: call i16 @llvm.convert.to.fp16.f32(
217  h1 = (h1 ? h2 : h0);
218  // Check assignments (inc. compound)
219  h0 = h1;
220  // CHECK: call i16 @llvm.convert.to.fp16.f32(
221  h0 = (__fp16)-2.0;
222  // CHECK: call i16 @llvm.convert.to.fp16.f32(
223  h0 = f0;
224
225  // CHECK: call float @llvm.convert.from.fp16.f32(
226  // CHECK: call float @llvm.convert.from.fp16.f32(
227  // CHECK: fadd float
228  // CHECK: call i16 @llvm.convert.to.fp16.f32(
229  h0 += h1;
230  // CHECK: call float @llvm.convert.from.fp16.f32(
231  // CHECK: call float @llvm.convert.from.fp16.f32(
232  // CHECK: fadd
233  // CHECK: call i16 @llvm.convert.to.fp16.f32(
234  h0 += (__fp16)1.0;
235  // CHECK: call float @llvm.convert.from.fp16.f32(
236  // CHECK: fadd
237  // CHECK: call i16 @llvm.convert.to.fp16.f32(
238  h0 += f2;
239
240  // CHECK: call float @llvm.convert.from.fp16.f32(
241  // CHECK: call float @llvm.convert.from.fp16.f32(
242  // CHECK: fsub
243  // CHECK: call i16 @llvm.convert.to.fp16.f32(
244  h0 -= h1;
245  // CHECK: call float @llvm.convert.from.fp16.f32(
246  // CHECK: call float @llvm.convert.from.fp16.f32(
247  // CHECK: fsub
248  // CHECK: call i16 @llvm.convert.to.fp16.f32(
249  h0 -= (__fp16)1.0;
250  // CHECK: call float @llvm.convert.from.fp16.f32(
251  // CHECK: fsub
252  // CHECK: call i16 @llvm.convert.to.fp16.f32(
253  h0 -= f2;
254
255  // CHECK: call float @llvm.convert.from.fp16.f32(
256  // CHECK: call float @llvm.convert.from.fp16.f32(
257  // CHECK: fmul
258  // CHECK: call i16 @llvm.convert.to.fp16.f32(
259  h0 *= h1;
260  // CHECK: call float @llvm.convert.from.fp16.f32(
261  // CHECK: call float @llvm.convert.from.fp16.f32(
262  // CHECK: fmul
263  // CHECK: call i16 @llvm.convert.to.fp16.f32(
264  h0 *= (__fp16)1.0;
265  // CHECK: call float @llvm.convert.from.fp16.f32(
266  // CHECK: fmul
267  // CHECK: call i16 @llvm.convert.to.fp16.f32(
268  h0 *= f2;
269
270  // CHECK: call float @llvm.convert.from.fp16.f32(
271  // CHECK: call float @llvm.convert.from.fp16.f32(
272  // CHECK: fdiv
273  // CHECK: call i16 @llvm.convert.to.fp16.f32(
274  h0 /= h1;
275  // CHECK: call float @llvm.convert.from.fp16.f32(
276  // CHECK: call float @llvm.convert.from.fp16.f32(
277  // CHECK: fdiv
278  // CHECK: call i16 @llvm.convert.to.fp16.f32(
279  h0 /= (__fp16)1.0;
280  // CHECK: call float @llvm.convert.from.fp16.f32(
281  // CHECK: fdiv
282  // CHECK: call i16 @llvm.convert.to.fp16.f32(
283  h0 /= f2;
284}
285