371 lines
9.3 KiB
C
371 lines
9.3 KiB
C
/*
|
|
|
|
Copyright (c) 2009, 2010, 2011, 2012, 2013 STMicroelectronics
|
|
Written by Christophe Lyon
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
in the Software without restriction, including without limitation the rights
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
THE SOFTWARE.
|
|
|
|
*/
|
|
|
|
#define _AEABI_PORTABILITY_LEVEL 1
|
|
#undef _AEABI_PORTABLE
|
|
#if defined(__cplusplus)
|
|
#include <cstdio>
|
|
#include <cstdlib>
|
|
#else
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#endif
|
|
|
|
FILE* log_file = NULL;
|
|
FILE* ref_file = NULL;
|
|
FILE* gcc_tests_file = NULL;
|
|
|
|
#define LOGFILE "stm-arm-neon-ref.log"
|
|
|
|
void cleanup (void)
|
|
{
|
|
if (log_file) fclose (log_file);
|
|
if (ref_file) fclose (ref_file);
|
|
if (gcc_tests_file) fclose (gcc_tests_file);
|
|
exit (1);
|
|
}
|
|
|
|
extern void exec_vld1(void);
|
|
extern void exec_vadd(void);
|
|
extern void exec_vld1_lane(void);
|
|
extern void exec_vld1_dup(void);
|
|
extern void exec_vdup(void);
|
|
extern void exec_vget_high(void);
|
|
extern void exec_vget_low(void);
|
|
extern void exec_vqdmlal_lane(void);
|
|
extern void exec_vqdmlsl_lane(void);
|
|
extern void exec_vqdmlal_n(void);
|
|
extern void exec_vqdmlsl_n(void);
|
|
extern void exec_vext(void);
|
|
extern void exec_vshr_n(void);
|
|
extern void exec_vshrn_n(void);
|
|
extern void exec_vrshrn_n(void);
|
|
extern void exec_vqrshrn_n(void);
|
|
extern void exec_vset_lane(void);
|
|
extern void exec_vget_lane(void);
|
|
extern void exec_vqsub(void);
|
|
extern void exec_vqdmulh(void);
|
|
extern void exec_vqdmulh_lane(void);
|
|
extern void exec_vqdmulh_n(void);
|
|
extern void exec_vqdmull(void);
|
|
extern void exec_vqdmlal(void);
|
|
extern void exec_vqdmlsl(void);
|
|
extern void exec_vceq(void);
|
|
extern void exec_vcge(void);
|
|
extern void exec_vcle(void);
|
|
extern void exec_vcgt(void);
|
|
extern void exec_vclt(void);
|
|
extern void exec_vbsl(void);
|
|
extern void exec_vshl(void);
|
|
extern void exec_vqshl(void);
|
|
extern void exec_vqshl_n(void);
|
|
extern void exec_vrshl(void);
|
|
extern void exec_vshl_n(void);
|
|
extern void exec_vldX(void);
|
|
extern void exec_vdup_lane(void);
|
|
extern void exec_vqdmull_lane(void);
|
|
extern void exec_vqdmull_n(void);
|
|
extern void exec_vst1_lane(void);
|
|
extern void exec_vsub(void);
|
|
extern void exec_vqadd(void);
|
|
extern void exec_vabs(void);
|
|
extern void exec_vqabs(void);
|
|
extern void exec_vcombine(void);
|
|
extern void exec_vmax(void);
|
|
extern void exec_vmin(void);
|
|
extern void exec_vneg(void);
|
|
extern void exec_vqneg(void);
|
|
extern void exec_vmlal(void);
|
|
extern void exec_vmlal_lane(void);
|
|
extern void exec_vmlal_n(void);
|
|
extern void exec_vmlsl(void);
|
|
extern void exec_vmlsl_lane(void);
|
|
extern void exec_vmlsl_n(void);
|
|
extern void exec_vmovl(void);
|
|
extern void exec_vmovn(void);
|
|
extern void exec_vmull(void);
|
|
extern void exec_vmull_lane(void);
|
|
extern void exec_vrev(void);
|
|
extern void exec_vsra_n(void);
|
|
extern void exec_vtrn(void);
|
|
extern void exec_vuzp(void);
|
|
extern void exec_vzip(void);
|
|
extern void exec_vreinterpret(void);
|
|
extern void exec_vqrdmulh(void);
|
|
extern void exec_vqrdmulh_lane(void);
|
|
extern void exec_vqrdmulh_n(void);
|
|
extern void exec_vqrshl(void);
|
|
extern void exec_vaba(void);
|
|
extern void exec_vabal(void);
|
|
extern void exec_vabd(void);
|
|
extern void exec_vabdl(void);
|
|
extern void exec_vand(void);
|
|
extern void exec_vorr(void);
|
|
extern void exec_vorn(void);
|
|
extern void exec_veor(void);
|
|
extern void exec_vbic(void);
|
|
extern void exec_vcreate(void);
|
|
extern void exec_vldX_lane(void);
|
|
extern void exec_vldX_dup(void);
|
|
extern void exec_vmla(void);
|
|
extern void exec_vmls(void);
|
|
extern void exec_vmul(void);
|
|
extern void exec_vmul_lane(void);
|
|
extern void exec_vmul_n(void);
|
|
extern void exec_vmull_n(void);
|
|
extern void exec_vmla_lane(void);
|
|
extern void exec_vmls_lane(void);
|
|
extern void exec_vmla_n(void);
|
|
extern void exec_vmls_n(void);
|
|
extern void exec_vsli_n(void);
|
|
extern void exec_vsri_n(void);
|
|
extern void exec_vtst(void);
|
|
extern void exec_vaddhn(void);
|
|
extern void exec_vraddhn(void);
|
|
extern void exec_vaddl(void);
|
|
extern void exec_vaddw(void);
|
|
extern void exec_vhadd(void);
|
|
extern void exec_vrhadd(void);
|
|
extern void exec_vhsub(void);
|
|
extern void exec_vsubl(void);
|
|
extern void exec_vsubw(void);
|
|
extern void exec_vsubhn(void);
|
|
extern void exec_vrsubhn(void);
|
|
extern void exec_vmvn(void);
|
|
extern void exec_vqmovn(void);
|
|
extern void exec_vqmovun(void);
|
|
extern void exec_vrshr_n(void);
|
|
extern void exec_vrsra_n(void);
|
|
extern void exec_vshll_n(void);
|
|
extern void exec_vpaddl(void);
|
|
extern void exec_vpadd(void);
|
|
extern void exec_vpadal(void);
|
|
extern void exec_vqshlu_n(void);
|
|
extern void exec_vclz(void);
|
|
extern void exec_vcls(void);
|
|
extern void exec_vcnt(void);
|
|
extern void exec_vqshrn_n(void);
|
|
extern void exec_vpmax(void);
|
|
extern void exec_vpmin(void);
|
|
extern void exec_vqshrun_n(void);
|
|
extern void exec_vqrshrun_n(void);
|
|
extern void exec_vstX_lane(void);
|
|
extern void exec_vtbX(void);
|
|
extern void exec_vrecpe(void);
|
|
extern void exec_vrsqrte(void);
|
|
|
|
extern void exec_vcage(void);
|
|
extern void exec_vcagt(void);
|
|
extern void exec_vcale(void);
|
|
extern void exec_vcalt(void);
|
|
extern void exec_vcvt(void);
|
|
extern void exec_vrecps(void);
|
|
extern void exec_vrsqrts(void);
|
|
|
|
#if defined(__ARMCC_VERSION) || !defined(__arm__)
|
|
extern void exec_integer(void); /* Integer (non-NEON) intrinsics */
|
|
extern void exec_dsp(void); /* DSP (non-NEON) intrinsics */
|
|
extern void exec_dspfns(void); /* DSP FNS (non-NEON/ITU) intrinsics */
|
|
#endif
|
|
|
|
#include "compute_ref_data.c"
|
|
|
|
int main (void)
|
|
{
|
|
#if defined(_MSC_VER)
|
|
/* When compiled with MSVC, force output of FP numbers with only 2
|
|
* digits for the exponent, for easier comparison of the results
|
|
* with GCC. */
|
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
|
#endif
|
|
|
|
log_file = fopen (LOGFILE, "w");
|
|
if (log_file == NULL) {
|
|
fprintf (stderr, "Error opening log file " LOGFILE "\n");
|
|
cleanup ();
|
|
}
|
|
|
|
ref_file = fopen (REFFILE, "w");
|
|
if (ref_file == NULL) {
|
|
fprintf (log_file, "Error opening ref file %s\n", REFFILE);
|
|
cleanup ();
|
|
}
|
|
|
|
gcc_tests_file = fopen (GCCTESTS_FILE, "w");
|
|
if (gcc_tests_file == NULL) {
|
|
fprintf (log_file, "Error opening GCC ref file %s\n", GCCTESTS_FILE);
|
|
cleanup ();
|
|
}
|
|
|
|
fprintf (log_file, "Computing refs....\n");
|
|
|
|
exec_vld1 ();
|
|
exec_vadd ();
|
|
exec_vld1_lane ();
|
|
exec_vld1_dup ();
|
|
exec_vdup ();
|
|
exec_vget_high ();
|
|
exec_vget_low ();
|
|
exec_vqdmlal_lane ();
|
|
exec_vqdmlsl_lane ();
|
|
exec_vqdmlal_n ();
|
|
exec_vqdmlsl_n ();
|
|
exec_vext ();
|
|
exec_vshr_n ();
|
|
exec_vshrn_n ();
|
|
exec_vrshrn_n ();
|
|
exec_vqrshrn_n ();
|
|
exec_vset_lane ();
|
|
exec_vget_lane ();
|
|
exec_vqsub ();
|
|
exec_vqdmulh ();
|
|
exec_vqdmulh_lane ();
|
|
exec_vqdmulh_n ();
|
|
exec_vqdmull ();
|
|
exec_vqdmlal ();
|
|
exec_vqdmlsl ();
|
|
exec_vceq ();
|
|
exec_vcge ();
|
|
exec_vcle ();
|
|
exec_vcgt ();
|
|
exec_vclt ();
|
|
exec_vbsl ();
|
|
exec_vshl ();
|
|
exec_vshl_n ();
|
|
exec_vqshl ();
|
|
exec_vqshl_n ();
|
|
exec_vrshl ();
|
|
// exec_vldX ();
|
|
exec_vdup_lane ();
|
|
exec_vqdmull_lane ();
|
|
exec_vqdmull_n ();
|
|
exec_vst1_lane ();
|
|
exec_vsub ();
|
|
exec_vqadd ();
|
|
exec_vabs ();
|
|
exec_vqabs ();
|
|
exec_vcombine ();
|
|
exec_vmax ();
|
|
exec_vmin ();
|
|
exec_vneg ();
|
|
exec_vqneg ();
|
|
exec_vmlal ();
|
|
exec_vmlsl ();
|
|
exec_vmlal_lane ();
|
|
exec_vmlsl_lane ();
|
|
exec_vmlal_n ();
|
|
exec_vmlsl_n ();
|
|
exec_vmovl ();
|
|
exec_vmovn ();
|
|
exec_vmull ();
|
|
exec_vmull_lane ();
|
|
exec_vrev ();
|
|
exec_vsra_n ();
|
|
exec_vtrn ();
|
|
exec_vuzp ();
|
|
exec_vzip ();
|
|
exec_vreinterpret ();
|
|
exec_vqrdmulh ();
|
|
exec_vqrdmulh_lane ();
|
|
exec_vqrdmulh_n ();
|
|
exec_vqrshl ();
|
|
exec_vaba ();
|
|
exec_vabal ();
|
|
exec_vabd ();
|
|
exec_vabdl ();
|
|
exec_vand ();
|
|
exec_vorr ();
|
|
exec_vorn ();
|
|
exec_veor ();
|
|
exec_vbic ();
|
|
exec_vcreate ();
|
|
exec_vldX_lane ();
|
|
// exec_vldX_dup ();
|
|
exec_vmla ();
|
|
exec_vmls ();
|
|
exec_vmul ();
|
|
exec_vmul_lane ();
|
|
exec_vmul_n ();
|
|
exec_vmull_n ();
|
|
exec_vmla_lane ();
|
|
exec_vmls_lane ();
|
|
exec_vmla_n ();
|
|
exec_vmls_n ();
|
|
exec_vsli_n ();
|
|
exec_vsri_n ();
|
|
exec_vtst ();
|
|
exec_vaddhn ();
|
|
exec_vraddhn ();
|
|
exec_vaddl ();
|
|
exec_vaddw ();
|
|
exec_vhadd ();
|
|
exec_vrhadd ();
|
|
exec_vhsub ();
|
|
exec_vsubl ();
|
|
exec_vsubw ();
|
|
exec_vsubhn ();
|
|
exec_vrsubhn ();
|
|
exec_vmvn ();
|
|
exec_vqmovn ();
|
|
exec_vqmovun ();
|
|
exec_vrshr_n ();
|
|
exec_vrsra_n ();
|
|
exec_vshll_n ();
|
|
exec_vpaddl ();
|
|
exec_vpadd ();
|
|
exec_vpadal ();
|
|
exec_vqshlu_n ();
|
|
exec_vclz ();
|
|
exec_vcls ();
|
|
exec_vcnt ();
|
|
exec_vqshrn_n ();
|
|
exec_vpmax ();
|
|
exec_vpmin ();
|
|
exec_vqshrun_n ();
|
|
exec_vqrshrun_n ();
|
|
exec_vstX_lane ();
|
|
exec_vtbX ();
|
|
exec_vrecpe ();
|
|
exec_vrsqrte ();
|
|
|
|
exec_vcage ();
|
|
exec_vcale ();
|
|
exec_vcagt ();
|
|
exec_vcalt ();
|
|
exec_vcvt ();
|
|
exec_vrecps ();
|
|
exec_vrsqrts ();
|
|
|
|
#if defined(__ARMCC_VERSION) || (!defined(__arm__) && !defined(__aarch64__))
|
|
exec_integer ();
|
|
exec_dsp ();
|
|
exec_dspfns ();
|
|
#endif
|
|
|
|
fprintf (log_file, "Finished\n");
|
|
|
|
return 0;
|
|
}
|