diff options
Diffstat (limited to 'stm-arm-neon-ref.h')
-rw-r--r-- | stm-arm-neon-ref.h | 65 |
1 files changed, 62 insertions, 3 deletions
diff --git a/stm-arm-neon-ref.h b/stm-arm-neon-ref.h index 3ea931f..ba29f10 100644 --- a/stm-arm-neon-ref.h +++ b/stm-arm-neon-ref.h @@ -82,7 +82,8 @@ static int result_idx = 0; { \ fprintf(ref_file, "%" FMT ", ", VECT_VAR(result, T, W, N)[i]); \ } \ - fprintf(ref_file, " }\n"); + fprintf(ref_file, " }\n"); \ + DUMP4GCC(MSG,T,W,N,FMT); #define DUMP_FP(MSG,T,W,N,FMT) \ fprintf(ref_file, "%s:%d:%s [] = { ", MSG, result_idx++, \ @@ -96,7 +97,46 @@ static int result_idx = 0; tmp.f = VECT_VAR(result, T, W, N)[i]; \ fprintf(ref_file, "%" FMT " %.7a %.7g, ", tmp.i, tmp.f, tmp.f); \ } \ - fprintf(ref_file, " }\n"); + fprintf(ref_file, " }\n"); \ + DUMP4GCC_FP(MSG,T,W,N,FMT); + +#define DUMP4GCC(MSG,T,W,N,FMT) \ + fprintf(gcc_tests_file, "VECT_VAR_DECL(expected,%s,%d,%d) [] = { ", \ + STR(T), W, N); \ + for(i=0; i<(N-1) ; i++) \ + { \ + if (W < 32) { \ + uint32_t tmp = (uint##W##_t) VECT_VAR(result, T, W, N)[i]; \ + fprintf(gcc_tests_file, "0x%" FMT ", ", tmp); \ + } else { \ + fprintf(gcc_tests_file, "0x%" FMT ", ", VECT_VAR(result, T, W, N)[i]); \ + } \ + } \ + if (W < 32) { \ + uint32_t tmp = (uint##W##_t) VECT_VAR(result, T, W, N)[i]; \ + fprintf(gcc_tests_file, "0x%" FMT, tmp); \ + } else { \ + fprintf(gcc_tests_file, "0x%" FMT, VECT_VAR(result, T, W, N)[i]); \ + } \ + fprintf(gcc_tests_file, " };\n"); + +#define DUMP4GCC_FP(MSG,T,W,N,FMT) \ + { \ + union fp_operand { \ + uint##W##_t i; \ + float##W##_t f; \ + } tmp; \ + fprintf(gcc_tests_file, "VECT_VAR_DECL(expected,%s,%d,%d) [] = { ", \ + "hfloat", W, N); \ + for(i=0; i<(N-1) ; i++) \ + { \ + tmp.f = VECT_VAR(result, T, W, N)[i]; \ + fprintf(gcc_tests_file, "0x%" FMT ", ", tmp.i); \ + } \ + tmp.f = VECT_VAR(result, T, W, N)[i]; \ + fprintf(gcc_tests_file, "0x%" FMT, tmp.i); \ + fprintf(gcc_tests_file, " };\n"); \ + } /* ARMCC has internal knowledge of half-precision type. Define this alias to avoid having to duplicate declarations. */ @@ -115,6 +155,19 @@ static int result_idx = 0; } \ fprintf(ref_file, " }\n"); +#define DUMP4GCC_FP16(MSG,T,W,N,FMT) \ + if (0) { \ + fprintf(gcc_tests_file, "%s:%d:%s [] = { ", MSG, result_idx++, \ + STR(VECT_VAR(result, T, W, N))); \ + for(i=0; i<N ; i++) \ + { \ + uint##W##_t tmp; \ + tmp = (uint##W##_t)VECT_VAR(result, T, W, N)[i]; \ + fprintf(gcc_tests_file, "%" FMT ", ", tmp); \ + } \ + fprintf(gcc_tests_file, " }\n"); \ + } + #define CLEAN_PATTERN_8 0x33 #define CLEAN_PATTERN_16 0x3333 #define CLEAN_PATTERN_32 0x33333333 @@ -146,6 +199,7 @@ static int result_idx = 0; /* Generic declarations: */ extern FILE* log_file; extern FILE* ref_file; +extern FILE* gcc_tests_file; /* Input buffers, one of each size */ extern ARRAY(buffer, int, 8, 8); @@ -383,6 +437,7 @@ static void dump_results (char *test_name) int i; fprintf(ref_file, "\n%s output:\n", test_name); + fprintf(gcc_tests_file, "\n%s output:\n", test_name); DUMP(test_name, int, 8, 8, PRId8); DUMP(test_name, int, 16, 4, PRId16); @@ -421,6 +476,7 @@ static void dump_results_hex2 (const char *test_name, const char* comment) int i; fprintf(ref_file, "\n%s%s output:\n", test_name, comment); + fprintf(gcc_tests_file, "\n%s%s output:\n", test_name, comment); DUMP(test_name, int, 8, 8, PRIx8); DUMP(test_name, int, 16, 4, PRIx16); @@ -529,10 +585,13 @@ static void __set_neon_overflow(int x) { #endif /* STM_ARM_NEON_MODELS */ -static void dump_neon_overflow(const char* msg, const char *name) +static void dump_neon_overflow(const char* msg, const char *name, + const char* t1, int w, int n) { fprintf(ref_file, "%s:%d:%s Neon overflow %d\n", msg, result_idx++, name, Neon_Overflow); + fprintf(gcc_tests_file, "int VECT_VAR(expected_overflow,%s,%d,%d) = %d;\n", \ + t1, w, n, Neon_Overflow); } /* Clean output buffers before execution */ |