blob: c267529249205adcb2f5e873ddb98f0d99028942 [file] [log] [blame]
Christophe Lyon073831a2011-01-24 17:37:40 +01001/*
2
Christophe Lyonc94d4c12013-03-29 16:32:37 +01003Copyright (c) 2009, 2010, 2011, 2012, 2013 STMicroelectronics
Christophe Lyon073831a2011-01-24 17:37:40 +01004Written 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 Lyon80902f62013-03-29 16:26:42 +010025
Christophe Lyon07e032b2012-05-09 17:08:14 +020026#define _AEABI_PORTABILITY_LEVEL 1
27#undef _AEABI_PORTABLE
Christophe Lyon6f4d36f2011-07-19 16:18:19 +020028#if defined(__cplusplus)
29#include <cstdio>
30#include <cstdlib>
31#else
Christophe Lyon073831a2011-01-24 17:37:40 +010032#include <stdio.h>
33#include <stdlib.h>
Christophe Lyon6f4d36f2011-07-19 16:18:19 +020034#endif
Christophe Lyon073831a2011-01-24 17:37:40 +010035
36FILE* log_file = NULL;
37FILE* ref_file = NULL;
Christophe Lyonfad316a2014-05-16 17:12:21 +020038FILE* gcc_tests_file = NULL;
Christophe Lyon073831a2011-01-24 17:37:40 +010039
40#define LOGFILE "stm-arm-neon-ref.log"
41
Christophe Lyon74dd60f2011-07-19 16:32:40 +020042void cleanup (void)
Christophe Lyon073831a2011-01-24 17:37:40 +010043{
44 if (log_file) fclose (log_file);
45 if (ref_file) fclose (ref_file);
Christophe Lyonfad316a2014-05-16 17:12:21 +020046 if (gcc_tests_file) fclose (gcc_tests_file);
Christophe Lyon073831a2011-01-24 17:37:40 +010047 exit (1);
48}
49
50extern void exec_vld1(void);
51extern void exec_vadd(void);
52extern void exec_vld1_lane(void);
53extern void exec_vld1_dup(void);
54extern void exec_vdup(void);
55extern void exec_vget_high(void);
56extern void exec_vget_low(void);
57extern void exec_vqdmlal_lane(void);
58extern void exec_vqdmlsl_lane(void);
59extern void exec_vqdmlal_n(void);
60extern void exec_vqdmlsl_n(void);
61extern void exec_vext(void);
62extern void exec_vshr_n(void);
63extern void exec_vshrn_n(void);
64extern void exec_vrshrn_n(void);
65extern void exec_vqrshrn_n(void);
66extern void exec_vset_lane(void);
67extern void exec_vget_lane(void);
68extern void exec_vqsub(void);
69extern void exec_vqdmulh(void);
70extern void exec_vqdmulh_lane(void);
71extern void exec_vqdmulh_n(void);
72extern void exec_vqdmull(void);
73extern void exec_vqdmlal(void);
74extern void exec_vqdmlsl(void);
75extern void exec_vceq(void);
76extern void exec_vcge(void);
77extern void exec_vcle(void);
78extern void exec_vcgt(void);
79extern void exec_vclt(void);
80extern void exec_vbsl(void);
81extern void exec_vshl(void);
82extern void exec_vqshl(void);
83extern void exec_vqshl_n(void);
84extern void exec_vrshl(void);
85extern void exec_vshl_n(void);
86extern void exec_vldX(void);
87extern void exec_vdup_lane(void);
88extern void exec_vqdmull_lane(void);
89extern void exec_vqdmull_n(void);
90extern void exec_vst1_lane(void);
91extern void exec_vsub(void);
92extern void exec_vqadd(void);
93extern void exec_vabs(void);
94extern void exec_vqabs(void);
95extern void exec_vcombine(void);
96extern void exec_vmax(void);
97extern void exec_vmin(void);
98extern void exec_vneg(void);
99extern void exec_vqneg(void);
100extern void exec_vmlal(void);
101extern void exec_vmlal_lane(void);
102extern void exec_vmlal_n(void);
103extern void exec_vmlsl(void);
104extern void exec_vmlsl_lane(void);
105extern void exec_vmlsl_n(void);
106extern void exec_vmovl(void);
107extern void exec_vmovn(void);
108extern void exec_vmull(void);
109extern void exec_vmull_lane(void);
110extern void exec_vrev(void);
111extern void exec_vsra_n(void);
112extern void exec_vtrn(void);
113extern void exec_vuzp(void);
114extern void exec_vzip(void);
115extern void exec_vreinterpret(void);
116extern void exec_vqrdmulh(void);
117extern void exec_vqrdmulh_lane(void);
118extern void exec_vqrdmulh_n(void);
119extern void exec_vqrshl(void);
120extern void exec_vaba(void);
121extern void exec_vabal(void);
122extern void exec_vabd(void);
123extern void exec_vabdl(void);
124extern void exec_vand(void);
125extern void exec_vorr(void);
126extern void exec_vorn(void);
127extern void exec_veor(void);
128extern void exec_vbic(void);
129extern void exec_vcreate(void);
130extern void exec_vldX_lane(void);
131extern void exec_vldX_dup(void);
132extern void exec_vmla(void);
133extern void exec_vmls(void);
134extern void exec_vmul(void);
135extern void exec_vmul_lane(void);
136extern void exec_vmul_n(void);
137extern void exec_vmull_n(void);
138extern void exec_vmla_lane(void);
139extern void exec_vmls_lane(void);
140extern void exec_vmla_n(void);
141extern void exec_vmls_n(void);
142extern void exec_vsli_n(void);
143extern void exec_vsri_n(void);
144extern void exec_vtst(void);
145extern void exec_vaddhn(void);
146extern void exec_vraddhn(void);
147extern void exec_vaddl(void);
148extern void exec_vaddw(void);
149extern void exec_vhadd(void);
150extern void exec_vrhadd(void);
151extern void exec_vhsub(void);
152extern void exec_vsubl(void);
153extern void exec_vsubw(void);
154extern void exec_vsubhn(void);
155extern void exec_vrsubhn(void);
156extern void exec_vmvn(void);
157extern void exec_vqmovn(void);
158extern void exec_vqmovun(void);
159extern void exec_vrshr_n(void);
160extern void exec_vrsra_n(void);
161extern void exec_vshll_n(void);
162extern void exec_vpaddl(void);
163extern void exec_vpadd(void);
164extern void exec_vpadal(void);
165extern void exec_vqshlu_n(void);
166extern void exec_vclz(void);
167extern void exec_vcls(void);
168extern void exec_vcnt(void);
169extern void exec_vqshrn_n(void);
170extern void exec_vpmax(void);
171extern void exec_vpmin(void);
172extern void exec_vqshrun_n(void);
173extern void exec_vqrshrun_n(void);
174extern void exec_vstX_lane(void);
175extern void exec_vtbX(void);
176extern void exec_vrecpe(void);
177extern void exec_vrsqrte(void);
Christophe Lyon073831a2011-01-24 17:37:40 +0100178
179extern void exec_vcage(void);
180extern void exec_vcagt(void);
181extern void exec_vcale(void);
182extern void exec_vcalt(void);
183extern void exec_vcvt(void);
184extern void exec_vrecps(void);
185extern void exec_vrsqrts(void);
186
Christophe Lyon302cedf2013-01-14 13:33:15 +0100187#if defined(__ARMCC_VERSION) || !defined(__arm__)
Christophe Lyonbfab3832012-05-11 15:14:44 +0200188extern void exec_integer(void); /* Integer (non-NEON) intrinsics */
Christophe Lyon073831a2011-01-24 17:37:40 +0100189extern void exec_dsp(void); /* DSP (non-NEON) intrinsics */
190extern void exec_dspfns(void); /* DSP FNS (non-NEON/ITU) intrinsics */
Christophe Lyonbfab3832012-05-11 15:14:44 +0200191#endif
Christophe Lyon073831a2011-01-24 17:37:40 +0100192
Christophe Lyon01af0a52013-01-17 17:23:11 +0100193#include "compute_ref_data.c"
194
Christophe Lyon74dd60f2011-07-19 16:32:40 +0200195int main (void)
Christophe Lyon073831a2011-01-24 17:37:40 +0100196{
Christophe Lyone65c9462011-07-19 16:33:25 +0200197#if defined(_MSC_VER)
198 /* When compiled with MSVC, force output of FP numbers with only 2
199 * digits for the exponent, for easier comparison of the results
200 * with GCC. */
201 _set_output_format(_TWO_DIGIT_EXPONENT);
202#endif
203
Christophe Lyon073831a2011-01-24 17:37:40 +0100204 log_file = fopen (LOGFILE, "w");
205 if (log_file == NULL) {
Christophe Lyon3665bb52013-02-22 14:50:12 +0100206 fprintf (stderr, "Error opening log file " LOGFILE "\n");
Christophe Lyon073831a2011-01-24 17:37:40 +0100207 cleanup ();
208 }
209
210 ref_file = fopen (REFFILE, "w");
211 if (ref_file == NULL) {
212 fprintf (log_file, "Error opening ref file %s\n", REFFILE);
213 cleanup ();
214 }
215
Christophe Lyonfad316a2014-05-16 17:12:21 +0200216 gcc_tests_file = fopen (GCCTESTS_FILE, "w");
217 if (gcc_tests_file == NULL) {
218 fprintf (log_file, "Error opening GCC ref file %s\n", GCCTESTS_FILE);
219 cleanup ();
220 }
221
Christophe Lyon073831a2011-01-24 17:37:40 +0100222 fprintf (log_file, "Computing refs....\n");
223
224 exec_vld1 ();
225 exec_vadd ();
226 exec_vld1_lane ();
227 exec_vld1_dup ();
228 exec_vdup ();
229 exec_vget_high ();
230 exec_vget_low ();
231 exec_vqdmlal_lane ();
232 exec_vqdmlsl_lane ();
233 exec_vqdmlal_n ();
234 exec_vqdmlsl_n ();
235 exec_vext ();
236 exec_vshr_n ();
237 exec_vshrn_n ();
238 exec_vrshrn_n ();
239 exec_vqrshrn_n ();
240 exec_vset_lane ();
241 exec_vget_lane ();
242 exec_vqsub ();
243 exec_vqdmulh ();
244 exec_vqdmulh_lane ();
245 exec_vqdmulh_n ();
246 exec_vqdmull ();
247 exec_vqdmlal ();
248 exec_vqdmlsl ();
249 exec_vceq ();
250 exec_vcge ();
251 exec_vcle ();
252 exec_vcgt ();
253 exec_vclt ();
254 exec_vbsl ();
255 exec_vshl ();
256 exec_vshl_n ();
257 exec_vqshl ();
258 exec_vqshl_n ();
259 exec_vrshl ();
Stephen Hines8457fac2017-10-31 22:07:50 -0700260 // exec_vldX ();
Christophe Lyon073831a2011-01-24 17:37:40 +0100261 exec_vdup_lane ();
262 exec_vqdmull_lane ();
263 exec_vqdmull_n ();
264 exec_vst1_lane ();
265 exec_vsub ();
266 exec_vqadd ();
267 exec_vabs ();
268 exec_vqabs ();
269 exec_vcombine ();
270 exec_vmax ();
271 exec_vmin ();
272 exec_vneg ();
273 exec_vqneg ();
274 exec_vmlal ();
275 exec_vmlsl ();
276 exec_vmlal_lane ();
277 exec_vmlsl_lane ();
278 exec_vmlal_n ();
279 exec_vmlsl_n ();
280 exec_vmovl ();
281 exec_vmovn ();
282 exec_vmull ();
283 exec_vmull_lane ();
284 exec_vrev ();
285 exec_vsra_n ();
286 exec_vtrn ();
287 exec_vuzp ();
288 exec_vzip ();
289 exec_vreinterpret ();
290 exec_vqrdmulh ();
291 exec_vqrdmulh_lane ();
292 exec_vqrdmulh_n ();
293 exec_vqrshl ();
294 exec_vaba ();
295 exec_vabal ();
296 exec_vabd ();
297 exec_vabdl ();
298 exec_vand ();
299 exec_vorr ();
300 exec_vorn ();
301 exec_veor ();
302 exec_vbic ();
303 exec_vcreate ();
304 exec_vldX_lane ();
Stephen Hines8457fac2017-10-31 22:07:50 -0700305 // exec_vldX_dup ();
Christophe Lyon073831a2011-01-24 17:37:40 +0100306 exec_vmla ();
307 exec_vmls ();
308 exec_vmul ();
309 exec_vmul_lane ();
310 exec_vmul_n ();
311 exec_vmull_n ();
312 exec_vmla_lane ();
313 exec_vmls_lane ();
314 exec_vmla_n ();
315 exec_vmls_n ();
Christophe Lyon073831a2011-01-24 17:37:40 +0100316 exec_vsli_n ();
317 exec_vsri_n ();
Christophe Lyon073831a2011-01-24 17:37:40 +0100318 exec_vtst ();
319 exec_vaddhn ();
320 exec_vraddhn ();
321 exec_vaddl ();
322 exec_vaddw ();
323 exec_vhadd ();
324 exec_vrhadd ();
325 exec_vhsub ();
326 exec_vsubl ();
327 exec_vsubw ();
328 exec_vsubhn ();
329 exec_vrsubhn ();
330 exec_vmvn ();
331 exec_vqmovn ();
332 exec_vqmovun ();
333 exec_vrshr_n ();
334 exec_vrsra_n ();
335 exec_vshll_n ();
336 exec_vpaddl ();
337 exec_vpadd ();
338 exec_vpadal ();
339 exec_vqshlu_n ();
340 exec_vclz ();
341 exec_vcls ();
342 exec_vcnt ();
343 exec_vqshrn_n ();
344 exec_vpmax ();
345 exec_vpmin ();
346 exec_vqshrun_n ();
347 exec_vqrshrun_n ();
348 exec_vstX_lane ();
349 exec_vtbX ();
350 exec_vrecpe ();
351 exec_vrsqrte ();
352
Christophe Lyon073831a2011-01-24 17:37:40 +0100353 exec_vcage ();
354 exec_vcale ();
355 exec_vcagt ();
356 exec_vcalt ();
357 exec_vcvt ();
358 exec_vrecps ();
359 exec_vrsqrts ();
360
Christophe Lyon1775be02014-07-10 13:46:54 +0200361#if defined(__ARMCC_VERSION) || (!defined(__arm__) && !defined(__aarch64__))
Christophe Lyonbfab3832012-05-11 15:14:44 +0200362 exec_integer ();
Christophe Lyon073831a2011-01-24 17:37:40 +0100363 exec_dsp ();
364 exec_dspfns ();
Christophe Lyonbfab3832012-05-11 15:14:44 +0200365#endif
Christophe Lyon073831a2011-01-24 17:37:40 +0100366
367 fprintf (log_file, "Finished\n");
368
369 return 0;
370}