xref: /minix3/external/bsd/llvm/dist/clang/test/CodeGen/fp16-ops.c (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
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.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