aboutsummaryrefslogtreecommitdiffstats
path: root/compute_ref.c
diff options
context:
space:
mode:
Diffstat (limited to 'compute_ref.c')
-rw-r--r--compute_ref.c370
1 files changed, 370 insertions, 0 deletions
diff --git a/compute_ref.c b/compute_ref.c
new file mode 100644
index 0000000..5839d36
--- /dev/null
+++ b/compute_ref.c
@@ -0,0 +1,370 @@
+/*
+
+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;
+}