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