blob: baccb76f9344376471d9347666fc21d2eed3d25f [file] [log] [blame]
Christophe Lyon073831a2011-01-24 17:37:40 +01001/*
2
3Copyright (c) 2009, 2010, 2011 STMicroelectronics
4Written by Christophe Lyon
5
6Permission is hereby granted, free of charge, to any person obtaining a copy
7of this software and associated documentation files (the "Software"), to deal
8in the Software without restriction, including without limitation the rights
9to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10copies of the Software, and to permit persons to whom the Software is
11furnished to do so, subject to the following conditions:
12
13The above copyright notice and this permission notice shall be included in
14all copies or substantial portions of the Software.
15
16THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22THE SOFTWARE.
23
24*/
Christophe Lyon07e032b2012-05-09 17:08:14 +020025#define _AEABI_PORTABILITY_LEVEL 1
26#undef _AEABI_PORTABLE
Christophe Lyon6f4d36f2011-07-19 16:18:19 +020027#if defined(__cplusplus)
28#include <cstdio>
29#include <cstdlib>
30#else
Christophe Lyon073831a2011-01-24 17:37:40 +010031#include <stdio.h>
32#include <stdlib.h>
Christophe Lyon6f4d36f2011-07-19 16:18:19 +020033#endif
Christophe Lyon073831a2011-01-24 17:37:40 +010034
35FILE* log_file = NULL;
36FILE* ref_file = NULL;
37
38#define LOGFILE "stm-arm-neon-ref.log"
39
Christophe Lyon74dd60f2011-07-19 16:32:40 +020040void cleanup (void)
Christophe Lyon073831a2011-01-24 17:37:40 +010041{
42 if (log_file) fclose (log_file);
43 if (ref_file) fclose (ref_file);
44 exit (1);
45}
46
47extern void exec_vld1(void);
48extern void exec_vadd(void);
49extern void exec_vld1_lane(void);
50extern void exec_vld1_dup(void);
51extern void exec_vdup(void);
52extern void exec_vget_high(void);
53extern void exec_vget_low(void);
54extern void exec_vqdmlal_lane(void);
55extern void exec_vqdmlsl_lane(void);
56extern void exec_vqdmlal_n(void);
57extern void exec_vqdmlsl_n(void);
58extern void exec_vext(void);
59extern void exec_vshr_n(void);
60extern void exec_vshrn_n(void);
61extern void exec_vrshrn_n(void);
62extern void exec_vqrshrn_n(void);
63extern void exec_vset_lane(void);
64extern void exec_vget_lane(void);
65extern void exec_vqsub(void);
66extern void exec_vqdmulh(void);
67extern void exec_vqdmulh_lane(void);
68extern void exec_vqdmulh_n(void);
69extern void exec_vqdmull(void);
70extern void exec_vqdmlal(void);
71extern void exec_vqdmlsl(void);
72extern void exec_vceq(void);
73extern void exec_vcge(void);
74extern void exec_vcle(void);
75extern void exec_vcgt(void);
76extern void exec_vclt(void);
77extern void exec_vbsl(void);
78extern void exec_vshl(void);
79extern void exec_vqshl(void);
80extern void exec_vqshl_n(void);
81extern void exec_vrshl(void);
82extern void exec_vshl_n(void);
83extern void exec_vldX(void);
84extern void exec_vdup_lane(void);
85extern void exec_vqdmull_lane(void);
86extern void exec_vqdmull_n(void);
87extern void exec_vst1_lane(void);
88extern void exec_vsub(void);
89extern void exec_vqadd(void);
90extern void exec_vabs(void);
91extern void exec_vqabs(void);
92extern void exec_vcombine(void);
93extern void exec_vmax(void);
94extern void exec_vmin(void);
95extern void exec_vneg(void);
96extern void exec_vqneg(void);
97extern void exec_vmlal(void);
98extern void exec_vmlal_lane(void);
99extern void exec_vmlal_n(void);
100extern void exec_vmlsl(void);
101extern void exec_vmlsl_lane(void);
102extern void exec_vmlsl_n(void);
103extern void exec_vmovl(void);
104extern void exec_vmovn(void);
105extern void exec_vmull(void);
106extern void exec_vmull_lane(void);
107extern void exec_vrev(void);
108extern void exec_vsra_n(void);
109extern void exec_vtrn(void);
110extern void exec_vuzp(void);
111extern void exec_vzip(void);
112extern void exec_vreinterpret(void);
113extern void exec_vqrdmulh(void);
114extern void exec_vqrdmulh_lane(void);
115extern void exec_vqrdmulh_n(void);
116extern void exec_vqrshl(void);
117extern void exec_vaba(void);
118extern void exec_vabal(void);
119extern void exec_vabd(void);
120extern void exec_vabdl(void);
121extern void exec_vand(void);
122extern void exec_vorr(void);
123extern void exec_vorn(void);
124extern void exec_veor(void);
125extern void exec_vbic(void);
126extern void exec_vcreate(void);
127extern void exec_vldX_lane(void);
128extern void exec_vldX_dup(void);
129extern void exec_vmla(void);
130extern void exec_vmls(void);
131extern void exec_vmul(void);
132extern void exec_vmul_lane(void);
133extern void exec_vmul_n(void);
134extern void exec_vmull_n(void);
135extern void exec_vmla_lane(void);
136extern void exec_vmls_lane(void);
137extern void exec_vmla_n(void);
138extern void exec_vmls_n(void);
139extern void exec_vsli_n(void);
140extern void exec_vsri_n(void);
141extern void exec_vtst(void);
142extern void exec_vaddhn(void);
143extern void exec_vraddhn(void);
144extern void exec_vaddl(void);
145extern void exec_vaddw(void);
146extern void exec_vhadd(void);
147extern void exec_vrhadd(void);
148extern void exec_vhsub(void);
149extern void exec_vsubl(void);
150extern void exec_vsubw(void);
151extern void exec_vsubhn(void);
152extern void exec_vrsubhn(void);
153extern void exec_vmvn(void);
154extern void exec_vqmovn(void);
155extern void exec_vqmovun(void);
156extern void exec_vrshr_n(void);
157extern void exec_vrsra_n(void);
158extern void exec_vshll_n(void);
159extern void exec_vpaddl(void);
160extern void exec_vpadd(void);
161extern void exec_vpadal(void);
162extern void exec_vqshlu_n(void);
163extern void exec_vclz(void);
164extern void exec_vcls(void);
165extern void exec_vcnt(void);
166extern void exec_vqshrn_n(void);
167extern void exec_vpmax(void);
168extern void exec_vpmin(void);
169extern void exec_vqshrun_n(void);
170extern void exec_vqrshrun_n(void);
171extern void exec_vstX_lane(void);
172extern void exec_vtbX(void);
173extern void exec_vrecpe(void);
174extern void exec_vrsqrte(void);
Christophe Lyon073831a2011-01-24 17:37:40 +0100175
176extern void exec_vcage(void);
177extern void exec_vcagt(void);
178extern void exec_vcale(void);
179extern void exec_vcalt(void);
180extern void exec_vcvt(void);
181extern void exec_vrecps(void);
182extern void exec_vrsqrts(void);
183
Christophe Lyon302cedf2013-01-14 13:33:15 +0100184#if defined(__ARMCC_VERSION) || !defined(__arm__)
Christophe Lyonbfab3832012-05-11 15:14:44 +0200185extern void exec_integer(void); /* Integer (non-NEON) intrinsics */
Christophe Lyon073831a2011-01-24 17:37:40 +0100186extern void exec_dsp(void); /* DSP (non-NEON) intrinsics */
187extern void exec_dspfns(void); /* DSP FNS (non-NEON/ITU) intrinsics */
Christophe Lyonbfab3832012-05-11 15:14:44 +0200188#endif
Christophe Lyon073831a2011-01-24 17:37:40 +0100189
Christophe Lyon01af0a52013-01-17 17:23:11 +0100190#include "compute_ref_data.c"
191
Christophe Lyon74dd60f2011-07-19 16:32:40 +0200192int main (void)
Christophe Lyon073831a2011-01-24 17:37:40 +0100193{
Christophe Lyone65c9462011-07-19 16:33:25 +0200194#if defined(_MSC_VER)
195 /* When compiled with MSVC, force output of FP numbers with only 2
196 * digits for the exponent, for easier comparison of the results
197 * with GCC. */
198 _set_output_format(_TWO_DIGIT_EXPONENT);
199#endif
200
Christophe Lyon073831a2011-01-24 17:37:40 +0100201 log_file = fopen (LOGFILE, "w");
202 if (log_file == NULL) {
Christophe Lyon3665bb52013-02-22 14:50:12 +0100203 fprintf (stderr, "Error opening log file " LOGFILE "\n");
Christophe Lyon073831a2011-01-24 17:37:40 +0100204 cleanup ();
205 }
206
207 ref_file = fopen (REFFILE, "w");
208 if (ref_file == NULL) {
209 fprintf (log_file, "Error opening ref file %s\n", REFFILE);
210 cleanup ();
211 }
212
213 fprintf (log_file, "Computing refs....\n");
214
215 exec_vld1 ();
216 exec_vadd ();
217 exec_vld1_lane ();
218 exec_vld1_dup ();
219 exec_vdup ();
220 exec_vget_high ();
221 exec_vget_low ();
222 exec_vqdmlal_lane ();
223 exec_vqdmlsl_lane ();
224 exec_vqdmlal_n ();
225 exec_vqdmlsl_n ();
226 exec_vext ();
227 exec_vshr_n ();
228 exec_vshrn_n ();
229 exec_vrshrn_n ();
230 exec_vqrshrn_n ();
231 exec_vset_lane ();
232 exec_vget_lane ();
233 exec_vqsub ();
234 exec_vqdmulh ();
235 exec_vqdmulh_lane ();
236 exec_vqdmulh_n ();
237 exec_vqdmull ();
238 exec_vqdmlal ();
239 exec_vqdmlsl ();
240 exec_vceq ();
241 exec_vcge ();
242 exec_vcle ();
243 exec_vcgt ();
244 exec_vclt ();
245 exec_vbsl ();
246 exec_vshl ();
247 exec_vshl_n ();
248 exec_vqshl ();
249 exec_vqshl_n ();
250 exec_vrshl ();
251 exec_vldX ();
252 exec_vdup_lane ();
253 exec_vqdmull_lane ();
254 exec_vqdmull_n ();
255 exec_vst1_lane ();
256 exec_vsub ();
257 exec_vqadd ();
258 exec_vabs ();
259 exec_vqabs ();
260 exec_vcombine ();
261 exec_vmax ();
262 exec_vmin ();
263 exec_vneg ();
264 exec_vqneg ();
265 exec_vmlal ();
266 exec_vmlsl ();
267 exec_vmlal_lane ();
268 exec_vmlsl_lane ();
269 exec_vmlal_n ();
270 exec_vmlsl_n ();
271 exec_vmovl ();
272 exec_vmovn ();
273 exec_vmull ();
274 exec_vmull_lane ();
275 exec_vrev ();
276 exec_vsra_n ();
277 exec_vtrn ();
278 exec_vuzp ();
279 exec_vzip ();
280 exec_vreinterpret ();
281 exec_vqrdmulh ();
282 exec_vqrdmulh_lane ();
283 exec_vqrdmulh_n ();
284 exec_vqrshl ();
285 exec_vaba ();
286 exec_vabal ();
287 exec_vabd ();
288 exec_vabdl ();
289 exec_vand ();
290 exec_vorr ();
291 exec_vorn ();
292 exec_veor ();
293 exec_vbic ();
294 exec_vcreate ();
295 exec_vldX_lane ();
296 exec_vldX_dup ();
297 exec_vmla ();
298 exec_vmls ();
299 exec_vmul ();
300 exec_vmul_lane ();
301 exec_vmul_n ();
302 exec_vmull_n ();
303 exec_vmla_lane ();
304 exec_vmls_lane ();
305 exec_vmla_n ();
306 exec_vmls_n ();
Christophe Lyon073831a2011-01-24 17:37:40 +0100307 exec_vsli_n ();
308 exec_vsri_n ();
Christophe Lyon073831a2011-01-24 17:37:40 +0100309 exec_vtst ();
310 exec_vaddhn ();
311 exec_vraddhn ();
312 exec_vaddl ();
313 exec_vaddw ();
314 exec_vhadd ();
315 exec_vrhadd ();
316 exec_vhsub ();
317 exec_vsubl ();
318 exec_vsubw ();
319 exec_vsubhn ();
320 exec_vrsubhn ();
321 exec_vmvn ();
322 exec_vqmovn ();
323 exec_vqmovun ();
324 exec_vrshr_n ();
325 exec_vrsra_n ();
326 exec_vshll_n ();
327 exec_vpaddl ();
328 exec_vpadd ();
329 exec_vpadal ();
330 exec_vqshlu_n ();
331 exec_vclz ();
332 exec_vcls ();
333 exec_vcnt ();
334 exec_vqshrn_n ();
335 exec_vpmax ();
336 exec_vpmin ();
337 exec_vqshrun_n ();
338 exec_vqrshrun_n ();
339 exec_vstX_lane ();
340 exec_vtbX ();
341 exec_vrecpe ();
342 exec_vrsqrte ();
343
Christophe Lyon073831a2011-01-24 17:37:40 +0100344 exec_vcage ();
345 exec_vcale ();
346 exec_vcagt ();
347 exec_vcalt ();
348 exec_vcvt ();
349 exec_vrecps ();
350 exec_vrsqrts ();
351
Christophe Lyon302cedf2013-01-14 13:33:15 +0100352#if defined(__ARMCC_VERSION) || !defined(__arm__)
Christophe Lyonbfab3832012-05-11 15:14:44 +0200353 exec_integer ();
Christophe Lyon073831a2011-01-24 17:37:40 +0100354 exec_dsp ();
355 exec_dspfns ();
Christophe Lyonbfab3832012-05-11 15:14:44 +0200356#endif
Christophe Lyon073831a2011-01-24 17:37:40 +0100357
358 fprintf (log_file, "Finished\n");
359
360 return 0;
361}