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