• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // REQUIRES: arm-registered-target
2 // RUN: %clang_cc1 -emit-llvm -o - -triple arm-none-linux-gnueabi %s | FileCheck %s
3 typedef unsigned cond_t;
4 
5 volatile cond_t test;
6 volatile __fp16 h0 = 0.0, h1 = 1.0, h2;
7 volatile float f0, f1, f2;
8 
foo(void)9 void 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