blob: e506513306701f3d338f0a8d40e42b27fc01a823 [file] [log] [blame]
Jim Grosbachf7947052012-07-09 18:34:21 +00001// REQUIRES: arm-registered-target
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +00002// 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: 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}