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