diff options
Diffstat (limited to 'ref_dspfns.c')
-rw-r--r-- | ref_dspfns.c | 1502 |
1 files changed, 1502 insertions, 0 deletions
diff --git a/ref_dspfns.c b/ref_dspfns.c new file mode 100644 index 0000000..a8409c6 --- /dev/null +++ b/ref_dspfns.c @@ -0,0 +1,1502 @@ +/* + +Copyright (c) 2009, 2010, 2011 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. + +*/ + +#if defined(__cplusplus) +#include <cstdio> +#include <cstdint> +#else +#include <stdio.h> +#if defined(_MSC_VER) +#include "msstdint.h" +#else +#include <stdint.h> +#endif +#endif + +#if defined(__arm__) || defined(__aarch64__) +#include <dspfns.h> +#else +#include "stm-dspfns.h" +#endif + +extern FILE* ref_file; + +#define __xSTR(X) #X +#define __STR(X) __xSTR(X) + +#define FN(X) X, __STR(X) + +typedef int32_t func32_32_32_ptr(int32_t, int32_t); +typedef int16_t func16_32_ptr(int32_t); +typedef int32_t func32_32_16_16_ptr(int32_t, int16_t, int16_t); + +void test_16_fn_32(func16_32_ptr func, const char* func_name, + int init_Overflow, int init_Carry) +{ + int32_t svar32_a; + int16_t svar16_a; + + fprintf(ref_file, "Checking %s with input Overflow=%d and input Carry=%d\n", + func_name, init_Overflow, init_Carry); + + svar32_a = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = func(svar32_a); + fprintf(ref_file, "%s(%#x) = %#x overflow %d carry %d\n", + func_name, svar32_a, svar16_a, Overflow, Carry); + + svar32_a = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = func(svar32_a); + fprintf(ref_file, "%s(%#x) = %#x overflow %d carry %d\n", + func_name, svar32_a, svar16_a, Overflow, Carry); + + svar32_a = 32768; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = func(svar32_a); + fprintf(ref_file, "%s(%#x) = %#x overflow %d carry %d\n", + func_name, svar32_a, svar16_a, Overflow, Carry); + + svar32_a = -32768; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = func(svar32_a); + fprintf(ref_file, "%s(%#x) = %#x overflow %d carry %d\n", + func_name, svar32_a, svar16_a, Overflow, Carry); + + svar32_a = -32769; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = func(svar32_a); + fprintf(ref_file, "%s(%#x) = %#x overflow %d carry %d\n", + func_name, svar32_a, svar16_a, Overflow, Carry); +} + +void test_32_fn_32_32(func32_32_32_ptr func, const char* func_name, + int init_Overflow, int init_Carry) +{ + int32_t svar32_a, svar32_b, svar32_c; + + fprintf(ref_file, "Checking %s with input Overflow=%d and input Carry=%d\n", + func_name, init_Overflow, init_Carry); + + svar32_a = 1; + svar32_b = 2; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = func(svar32_a, svar32_b); + fprintf(ref_file, "%s(%#x, %#x) = %#x overflow %d carry %d\n", + func_name, svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = -1; + svar32_b = -2; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = func(svar32_a, svar32_b); + fprintf(ref_file, "%s(%#x, %#x) = %#x overflow %d carry %d\n", + func_name, svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = -1; + svar32_b = 2; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = func(svar32_a, svar32_b); + fprintf(ref_file, "%s(%#x, %#x) = %#x overflow %d carry %d\n", + func_name, svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = 0x7000; + svar32_b = 0x7000; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = func(svar32_a, svar32_b); + fprintf(ref_file, "%s(%#x, %#x) = %#x overflow %d carry %d\n", + func_name, svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = 0x8FFF; + svar32_b = 0x8FFF; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = func(svar32_a, svar32_b); + fprintf(ref_file, "%s(%#x, %#x) = %#x overflow %d carry %d\n", + func_name, svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = 0x70000000; + svar32_b = 0x70000000; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = func(svar32_a, svar32_b); + fprintf(ref_file, "%s(%#x, %#x) = %#x overflow %d carry %d\n", + func_name, svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = 0x8FFFFFFF; + svar32_b = 0x8FFFFFFF; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = func(svar32_a, svar32_b); + fprintf(ref_file, "%s(%#x, %#x) = %#x overflow %d carry %d\n", + func_name, svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = 0x8FFFFFFF; + svar32_b = 0xFFFFFFFF; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = func(svar32_a, svar32_b); + fprintf(ref_file, "%s(%#x, %#x) = %#x overflow %d carry %d\n", + func_name, svar32_a, svar32_b, svar32_c, Overflow, Carry); +} + +void test_32_fn_32_16_16(func32_32_16_16_ptr func, const char* func_name, + int init_Overflow, int init_Carry) +{ + int32_t svar32_a, svar32_b; + int16_t svar16_a, svar16_b; + + fprintf(ref_file, "Checking %s with input Overflow=%d and input Carry=%d\n", + func_name, init_Overflow, init_Carry); + + svar16_a = 2; + svar16_b = 2; + svar32_a = 0x1234; + Overflow = 0; + Carry = init_Carry; + svar32_b = func(svar32_a, svar16_a, svar16_b); + fprintf(ref_file, "%s(%#x, %#x, %#x) = %#x overflow %d carry %d\n", + func_name, svar32_a, svar16_a, svar16_b, svar32_b, Overflow, Carry); + + svar16_a = -1; + svar16_b = -1; + Overflow = 0; + Carry = init_Carry; + svar32_b = func(svar32_a, svar16_a, svar16_b); + fprintf(ref_file, "%s(%#x, %#x, %#x) = %#x overflow %d carry %d\n", + func_name, svar32_a, svar16_a, svar16_b, svar32_b, Overflow, Carry); + + svar16_a = 0x8000; + svar16_b = 0x8000; + Overflow = 0; + Carry = init_Carry; + svar32_b = func(svar32_a, svar16_a, svar16_b); + fprintf(ref_file, "%s(%#x, %#x, %#x) = %#x overflow %d carry %d\n", + func_name, svar32_a, svar16_a, svar16_b, svar32_b, Overflow, Carry); + + svar16_a = 0x8000; + svar16_b = 0x8000; + Overflow = 0; + Carry = init_Carry; + svar32_a = -1; + svar32_b = func(svar32_a, svar16_a, svar16_b); + fprintf(ref_file, "%s(%#x, %#x, %#x) = %#x overflow %d carry %d\n", + func_name, svar32_a, svar16_a, svar16_b, svar32_b, Overflow, Carry); +} + +void exec_dspfns1 (int init_Overflow, int init_Carry) +{ + int32_t svar32_a, svar32_b, svar32_c; + int16_t svar16_a, svar16_b, svar16_c; + + + fprintf(ref_file, "\n\nDSP FNS (non-NEON/ITU) intrinsics with input Overflow=%d and input Carry=%d\n", init_Overflow, init_Carry); + + /* saturate */ + /* int16_t saturate(int32_t x) */ + test_16_fn_32(FN(saturate), init_Overflow, init_Carry); + + + /* add */ + /* int16_t add(int16_t x, int16_t y) */ + svar16_a = 1; + svar16_b = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = add(svar16_a, svar16_b); + fprintf(ref_file, "add(%#x, %#x) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = -1; + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = add(svar16_a, svar16_b); + fprintf(ref_file, "add(%#x, %#x) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 20000; + svar16_b = 20000; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = add(svar16_a, svar16_b); + fprintf(ref_file, "add(%#x, %#x) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = -20000; + svar16_b = -20000; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = add(svar16_a, svar16_b); + fprintf(ref_file, "add(%#x, %#x) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + + /* sub */ + /* int16_t sub(int16_t x, int16_t y) */ + svar16_a = 1; + svar16_b = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = sub(svar16_a, svar16_b); + fprintf(ref_file, "sub(%#x, %#x) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = -1; + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = sub(svar16_a, svar16_b); + fprintf(ref_file, "sub(%#x, %#x) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 20000; + svar16_b = 20000; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = sub(svar16_a, svar16_b); + fprintf(ref_file, "sub(%#x, %#x) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = -20000; + svar16_b = -20000; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = sub(svar16_a, svar16_b); + fprintf(ref_file, "sub(%#x, %#x) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 0; + svar16_b = -32768; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = sub(svar16_a, svar16_b); + fprintf(ref_file, "sub(%#x, %#x) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + + /* abs_s */ + /* int16_t abs_s(int16_t x) */ + svar16_b = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = abs_s(svar16_b); + fprintf(ref_file, "abs_s(%#x) = %#x overflow %d carry %d\n", svar16_b, svar16_a, Overflow, Carry); + + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = abs_s(svar16_b); + fprintf(ref_file, "abs_s(%#x) = %#x overflow %d carry %d\n", svar16_b, svar16_a, Overflow, Carry); + + svar16_b = -32768; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = abs_s(svar16_b); + fprintf(ref_file, "abs_s(%#x) = %#x overflow %d carry %d\n", svar16_b, svar16_a, Overflow, Carry); + + + /* shl */ + /* int16_t shl(int16_t x, int16_t y) */ + svar16_a = 1; + svar16_b = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shl(svar16_a, svar16_b); + fprintf(ref_file, "shl(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 10; + svar16_b = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shl(svar16_a, svar16_b); + fprintf(ref_file, "shl(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 0xFFF; + svar16_b = 10; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shl(svar16_a, svar16_b); + fprintf(ref_file, "shl(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 0xFFF; + svar16_b = 20; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shl(svar16_a, svar16_b); + fprintf(ref_file, "shl(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 1; + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shl(svar16_a, svar16_b); + fprintf(ref_file, "shl(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 20; + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shl(svar16_a, svar16_b); + fprintf(ref_file, "shl(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 0xFFF; + svar16_b = -10; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shl(svar16_a, svar16_b); + fprintf(ref_file, "shl(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 0xFFF; + svar16_b = -64; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shl(svar16_a, svar16_b); + fprintf(ref_file, "shl(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + + /* shr */ + /* int16_t shr(int16_t x, int16_t y) */ + svar16_a = 1; + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shr(svar16_a, svar16_b); + fprintf(ref_file, "shr(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 10; + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shr(svar16_a, svar16_b); + fprintf(ref_file, "shr(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 0xFFF; + svar16_b = -10; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shr(svar16_a, svar16_b); + fprintf(ref_file, "shr(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 0xFFF; + svar16_b = -20; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shr(svar16_a, svar16_b); + fprintf(ref_file, "shr(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 1; + svar16_b = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shr(svar16_a, svar16_b); + fprintf(ref_file, "shr(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 20; + svar16_b = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shr(svar16_a, svar16_b); + fprintf(ref_file, "shr(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 0xFFF; + svar16_b = 10; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shr(svar16_a, svar16_b); + fprintf(ref_file, "shr(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 0xFFF; + svar16_b = 64; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shr(svar16_a, svar16_b); + fprintf(ref_file, "shr(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + + /* mult */ + /* int16_t mult(int16_t x, int16_t y) */ + svar16_a = 2; + svar16_b = 2; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = mult(svar16_a, svar16_b); + fprintf(ref_file, "mult(%#x, %#x) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = -1; + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = mult(svar16_a, svar16_b); + fprintf(ref_file, "mult(%#x, %#x) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 0x8000; + svar16_b = 0x8000; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = mult(svar16_a, svar16_b); + fprintf(ref_file, "mult(%#x, %#x) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + + /* L_mult */ + /* int32_t L_mult(int16_t x, int16_t y) */ + svar16_a = 2; + svar16_b = 2; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = L_mult(svar16_a, svar16_b); + fprintf(ref_file, "L_mult(%#x, %#x) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar32_a, Overflow, Carry); + + svar16_a = -1; + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = L_mult(svar16_a, svar16_b); + fprintf(ref_file, "L_mult(%#x, %#x) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar32_a, Overflow, Carry); + + svar16_a = 0x8000; + svar16_b = 0x8000; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = L_mult(svar16_a, svar16_b); + fprintf(ref_file, "L_mult(%#x, %#x) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar32_a, Overflow, Carry); + + + /* negate */ + /* int16_t negate(int16_t x) */ + svar16_b = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = negate(svar16_b); + fprintf(ref_file, "negate(%#x) = %#x overflow %d carry %d\n", svar16_b, svar16_a, Overflow, Carry); + + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = negate(svar16_b); + fprintf(ref_file, "negate(%#x) = %#x overflow %d carry %d\n", svar16_b, svar16_a, Overflow, Carry); + + svar16_b = -32768; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = negate(svar16_b); + fprintf(ref_file, "negate(%#x) = %#x overflow %d carry %d\n", svar16_b, svar16_a, Overflow, Carry); + + + /* extract_h */ + /* int16_t extract_h(int32_t x) */ + svar32_a = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = extract_h(svar32_a); + fprintf(ref_file, "extract_h(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + svar32_a = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = extract_h(svar32_a); + fprintf(ref_file, "extract_h(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + svar32_a = -32768; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = extract_h(svar32_a); + fprintf(ref_file, "extract_h(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + svar32_a = 0x12345678; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = extract_h(svar32_a); + fprintf(ref_file, "extract_h(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + + /* extract_l */ + /* int16_t extract_l(int32_t x) */ + svar32_a = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = extract_l(svar32_a); + fprintf(ref_file, "extract_l(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + svar32_a = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = extract_l(svar32_a); + fprintf(ref_file, "extract_l(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + svar32_a = -32768; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = extract_l(svar32_a); + fprintf(ref_file, "extract_l(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + svar32_a = 0x43218765; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = extract_l(svar32_a); + fprintf(ref_file, "extract_l(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + + /* round */ + /* int16_t round(int32_t x) */ + svar32_a = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = round(svar32_a); + fprintf(ref_file, "round(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + svar32_a = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = round(svar32_a); + fprintf(ref_file, "round(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + svar32_a = -32768; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = round(svar32_a); + fprintf(ref_file, "round(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + svar32_a = 0x43218765; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = round(svar32_a); + fprintf(ref_file, "round(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + svar32_a = 0x87654321; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = round(svar32_a); + fprintf(ref_file, "round(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + + /* L_mac */ + /* int32_t L_mac(int32_t acc, int16_t x, int16_t y) */ + svar16_a = 2; + svar16_b = 2; + svar32_a = 0x1234; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_b = L_mac(svar32_a, svar16_a, svar16_b); + fprintf(ref_file, "L_mac(%#x, %#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, svar16_b, svar32_b, Overflow, Carry); + + svar16_a = -1; + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_b = L_mac(svar32_a, svar16_a, svar16_b); + fprintf(ref_file, "L_mac(%#x, %#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, svar16_b, svar32_b, Overflow, Carry); + + svar16_a = 0x8000; + svar16_b = 0x8000; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_b = L_mac(svar32_a, svar16_a, svar16_b); + fprintf(ref_file, "L_mac(%#x, %#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, svar16_b, svar32_b, Overflow, Carry); + + svar16_a = 0x8000; + svar16_b = 0x8000; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = -1; + svar32_b = L_mac(svar32_a, svar16_a, svar16_b); + fprintf(ref_file, "L_mac(%#x, %#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, svar16_b, svar32_b, Overflow, Carry); + + + /* L_msu */ + /* int32_t L_msu(int32_t acc, int16_t x, int16_t y) */ + svar16_a = 2; + svar16_b = 2; + svar32_a = 0x1234; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_b = L_msu(svar32_a, svar16_a, svar16_b); + fprintf(ref_file, "L_msu(%#x, %#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, svar16_b, svar32_b, Overflow, Carry); + + svar16_a = -1; + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_b = L_msu(svar32_a, svar16_a, svar16_b); + fprintf(ref_file, "L_msu(%#x, %#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, svar16_b, svar32_b, Overflow, Carry); + + svar16_a = 0x8000; + svar16_b = 0x8000; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_b = L_msu(svar32_a, svar16_a, svar16_b); + fprintf(ref_file, "L_msu(%#x, %#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, svar16_b, svar32_b, Overflow, Carry); + + svar16_a = 0x8000; + svar16_b = 0x8000; + svar32_a = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_b = L_msu(svar32_a, svar16_a, svar16_b); + fprintf(ref_file, "L_msu(%#x, %#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, svar16_b, svar32_b, Overflow, Carry); + + + /* L_add */ + /* int32_t L_add(int32_t val1, int32_t val2); */ + svar32_a = 1; + svar32_b = 2; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_add(svar32_a, svar32_b); + fprintf(ref_file, "L_add(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = -1; + svar32_b = -2; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_add(svar32_a, svar32_b); + fprintf(ref_file, "L_add(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = -1; + svar32_b = 2; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_add(svar32_a, svar32_b); + fprintf(ref_file, "L_add(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = 0x7000; + svar32_b = 0x7000; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_add(svar32_a, svar32_b); + fprintf(ref_file, "L_add(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = 0x8FFF; + svar32_b = 0x8FFF; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_add(svar32_a, svar32_b); + fprintf(ref_file, "L_add(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = 0x70000000; + svar32_b = 0x70000000; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_add(svar32_a, svar32_b); + fprintf(ref_file, "L_add(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = 0x8FFFFFFF; + svar32_b = 0x8FFFFFFF; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_add(svar32_a, svar32_b); + fprintf(ref_file, "L_add(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + /* L_sub */ + /* int32_t L_sub(int32_t val1, int32_t val2); */ + svar32_a = 1; + svar32_b = 2; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_sub(svar32_a, svar32_b); + fprintf(ref_file, "L_sub(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = -1; + svar32_b = -2; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_sub(svar32_a, svar32_b); + fprintf(ref_file, "L_sub(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = -1; + svar32_b = 2; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_sub(svar32_a, svar32_b); + fprintf(ref_file, "L_sub(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = 0x7000; + svar32_b = 0xFFFF9000; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_sub(svar32_a, svar32_b); + fprintf(ref_file, "L_sub(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = 0x8FFF; + svar32_b = 0xFFFF7001; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_sub(svar32_a, svar32_b); + fprintf(ref_file, "L_sub(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = 0x70000000; + svar32_b = 0x90000000; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_sub(svar32_a, svar32_b); + fprintf(ref_file, "L_sub(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = 0x8FFFFFFF; + svar32_b = 0x70000001; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_sub(svar32_a, svar32_b); + fprintf(ref_file, "L_sub(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = 0; + svar32_b = 0x80000000; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_sub(svar32_a, svar32_b); + fprintf(ref_file, "L_sub(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + + /* L_add_c */ + /* int32_t L_add_c(int32_t val1, int32_t val2); */ + test_32_fn_32_32(FN(L_add_c), init_Overflow, init_Carry); + + + + /* L_sub_c */ + /* int32_t L_sub_c(int32_t val1, int32_t val2); */ +#undef MYFN +#define MYFN L_sub_c + svar32_a = 1; + svar32_b = 2; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = MYFN(svar32_a, svar32_b); + fprintf(ref_file, __STR(MYFN) "(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = -1; + svar32_b = -2; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = MYFN(svar32_a, svar32_b); + fprintf(ref_file, __STR(MYFN) "(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = -1; + svar32_b = 2; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = MYFN(svar32_a, svar32_b); + fprintf(ref_file, __STR(MYFN) "(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = 0x7000; + svar32_b = 0x7000; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = MYFN(svar32_a, svar32_b); + fprintf(ref_file, __STR(MYFN) "(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = 0x8FFF; + svar32_b = 0x8FFF; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = MYFN(svar32_a, svar32_b); + fprintf(ref_file, __STR(MYFN) "(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = 0x70000000; + svar32_b = 0x70000000; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = MYFN(svar32_a, svar32_b); + fprintf(ref_file, __STR(MYFN) "(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = 0x8FFFFFFF; + svar32_b = 0x8FFFFFFF; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = MYFN(svar32_a, svar32_b); + fprintf(ref_file, __STR(MYFN) "(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = 0x1; + svar32_b = 0x80000000; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = MYFN(svar32_a, svar32_b); + fprintf(ref_file, __STR(MYFN) "(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + svar32_a = 0xFFFFFFFF; + svar32_b = 0x7FFFFFFF; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = MYFN(svar32_a, svar32_b); + fprintf(ref_file, __STR(MYFN) "(%#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar32_b, svar32_c, Overflow, Carry); + + + /* L_macNs */ + /* int32_t L_macNs(int32_t acc, int16_t x, int16_t y) */ + test_32_fn_32_16_16(FN(L_macNs), init_Overflow, init_Carry); + + /* L_msuNs */ + /* int32_t L_msuNs(int32_t acc, int16_t x, int16_t y) */ + test_32_fn_32_16_16(FN(L_msuNs), init_Overflow, init_Carry); + + + /* negate */ + /* int32_t negate(int32_t x) */ + svar32_b = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = negate(svar32_b); + fprintf(ref_file, "negate(%#x) = %#x overflow %d carry %d\n", svar32_b, svar32_a, Overflow, Carry); + + svar32_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = negate(svar32_b); + fprintf(ref_file, "negate(%#x) = %#x overflow %d carry %d\n", svar32_b, svar32_a, Overflow, Carry); + + svar32_b = -32768; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = negate(svar32_b); + fprintf(ref_file, "negate(%#x) = %#x overflow %d carry %d\n", svar32_b, svar32_a, Overflow, Carry); + + + /* mult_r */ + /* int16_t mult_r(int16_t x, int16_t y) */ + svar16_a = 2; + svar16_b = 2; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = mult_r(svar16_a, svar16_b); + fprintf(ref_file, "mult_r(%#x, %#x) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = -1; + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = mult_r(svar16_a, svar16_b); + fprintf(ref_file, "mult_r(%#x, %#x) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 0x8000; + svar16_b = 0x8000; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = mult_r(svar16_a, svar16_b); + fprintf(ref_file, "mult_r(%#x, %#x) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + + /* norm_s */ + /* int16_t norm_s(int32_t x) */ + svar32_a = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = norm_s(svar32_a); + fprintf(ref_file, "norm_s(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + svar32_a = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = norm_s(svar32_a); + fprintf(ref_file, "norm_s(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + svar32_a = -32768; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = norm_s(svar32_a); + fprintf(ref_file, "norm_s(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + svar32_a = 12000; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = norm_s(svar32_a); + fprintf(ref_file, "norm_s(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + + /* norm_l */ + /* int16_t norm_l(int16_t x) */ + svar32_a = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = norm_l(svar32_a); + fprintf(ref_file, "norm_l(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + svar32_a = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = norm_l(svar32_a); + fprintf(ref_file, "norm_l(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + svar32_a = -32768; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = norm_l(svar32_a); + fprintf(ref_file, "norm_l(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + svar32_a = 12000; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = norm_l(svar32_a); + fprintf(ref_file, "norm_l(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + svar32_a = 0x123456; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = norm_l(svar32_a); + fprintf(ref_file, "norm_l(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + svar32_a = 0xABCDEF; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_a = norm_l(svar32_a); + fprintf(ref_file, "norm_l(%#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, Overflow, Carry); + + + /* L_shl */ + /* int32_t L_shl(int32_t x, int16_t y) */ + svar32_a = 1; + svar16_b = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shl(svar32_a, svar16_b); + fprintf(ref_file, "L_shl(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 10; + svar16_b = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shl(svar32_a, svar16_b); + fprintf(ref_file, "L_shl(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0xFFF; + svar16_b = 10; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shl(svar32_a, svar16_b); + fprintf(ref_file, "L_shl(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0xFFF; + svar16_b = 20; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shl(svar32_a, svar16_b); + fprintf(ref_file, "L_shl(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0x12345678; + svar16_b = 2; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shl(svar32_a, svar16_b); + fprintf(ref_file, "L_shl(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0x12345678; + svar16_b = 40; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shl(svar32_a, svar16_b); + fprintf(ref_file, "L_shl(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 1; + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shl(svar32_a, svar16_b); + fprintf(ref_file, "L_shl(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 20; + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shl(svar32_a, svar16_b); + fprintf(ref_file, "L_shl(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0xFFF; + svar16_b = -10; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shl(svar32_a, svar16_b); + fprintf(ref_file, "L_shl(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0xFFF; + svar16_b = -64; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shl(svar32_a, svar16_b); + fprintf(ref_file, "L_shl(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0x12345678; + svar16_b = -10; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shl(svar32_a, svar16_b); + fprintf(ref_file, "L_shl(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0x12345678; + svar16_b = -64; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shl(svar32_a, svar16_b); + fprintf(ref_file, "L_shl(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + + /* L_shr */ + /* int32_t L_shr(int32_t x, int16_t y) */ + svar32_a = 1; + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr(svar32_a, svar16_b); + fprintf(ref_file, "L_shr(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 10; + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr(svar32_a, svar16_b); + fprintf(ref_file, "L_shr(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0xFFF; + svar16_b = -10; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr(svar32_a, svar16_b); + fprintf(ref_file, "L_shr(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0xFFF; + svar16_b = -20; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr(svar32_a, svar16_b); + fprintf(ref_file, "L_shr(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0x12345678; + svar16_b = -10; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr(svar32_a, svar16_b); + fprintf(ref_file, "L_shr(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0x12345678; + svar16_b = -40; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr(svar32_a, svar16_b); + fprintf(ref_file, "L_shr(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 1; + svar16_b = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr(svar32_a, svar16_b); + fprintf(ref_file, "L_shr(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 20; + svar16_b = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr(svar32_a, svar16_b); + fprintf(ref_file, "L_shr(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0xFFF; + svar16_b = 10; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr(svar32_a, svar16_b); + fprintf(ref_file, "L_shr(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0xFFF; + svar16_b = 64; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr(svar32_a, svar16_b); + fprintf(ref_file, "L_shr(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0x12345678; + svar16_b = 10; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr(svar32_a, svar16_b); + fprintf(ref_file, "L_shr(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0x12345678; + svar16_b = 64; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr(svar32_a, svar16_b); + fprintf(ref_file, "L_shr(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + + /* shr_r */ + /* int16_t shr_r(int16_t x, int16_t y) */ + svar16_a = 1; + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shr_r(svar16_a, svar16_b); + fprintf(ref_file, "shr_r(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 10; + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shr_r(svar16_a, svar16_b); + fprintf(ref_file, "shr_r(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 0xFFF; + svar16_b = -10; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shr_r(svar16_a, svar16_b); + fprintf(ref_file, "shr_r(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 0xFFF; + svar16_b = -20; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shr_r(svar16_a, svar16_b); + fprintf(ref_file, "shr_r(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 1; + svar16_b = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shr_r(svar16_a, svar16_b); + fprintf(ref_file, "shr_r(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 20; + svar16_b = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shr_r(svar16_a, svar16_b); + fprintf(ref_file, "shr_r(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 0xFFF; + svar16_b = 10; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shr_r(svar16_a, svar16_b); + fprintf(ref_file, "shr_r(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 0xFFF; + svar16_b = 64; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = shr_r(svar16_a, svar16_b); + fprintf(ref_file, "shr_r(%#x, %d) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + + /* mac_r */ + /* int16_t mac_r(int32_t acc, int16_t x, int16_t y) */ + svar16_a = 2; + svar16_b = 2; + svar32_a = 0x1234; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = mac_r(svar32_a, svar16_a, svar16_b); + fprintf(ref_file, "mac_r(%#x, %#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = -1; + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = mac_r(svar32_a, svar16_a, svar16_b); + fprintf(ref_file, "mac_r(%#x, %#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 0x8000; + svar16_b = 0x8000; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = mac_r(svar32_a, svar16_a, svar16_b); + fprintf(ref_file, "mac_r(%#x, %#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 0x8000; + svar16_b = 0x8000; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = -1; + svar16_c = mac_r(svar32_a, svar16_a, svar16_b); + fprintf(ref_file, "mac_r(%#x, %#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 0x244; + svar16_b = 0x522; + svar32_a = 0x123456; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = mac_r(svar32_a, svar16_a, svar16_b); + fprintf(ref_file, "mac_r(%#x, %#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, svar16_b, svar16_c, Overflow, Carry); + + + /* msu_r */ + /* int32_t msu_r(int32_t acc, int16_t x, int16_t y) */ + svar16_a = 2; + svar16_b = 2; + svar32_a = 0x1234; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = msu_r(svar32_a, svar16_a, svar16_b); + fprintf(ref_file, "msu_r(%#x, %#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = -1; + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = msu_r(svar32_a, svar16_a, svar16_b); + fprintf(ref_file, "msu_r(%#x, %#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 0x8000; + svar16_b = 0x8000; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = msu_r(svar32_a, svar16_a, svar16_b); + fprintf(ref_file, "msu_r(%#x, %#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 0x8000; + svar16_b = 0x8000; + svar32_a = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = msu_r(svar32_a, svar16_a, svar16_b); + fprintf(ref_file, "msu_r(%#x, %#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 0x321; + svar16_b = 0x243; + svar32_a = 0x123456; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = msu_r(svar32_a, svar16_a, svar16_b); + fprintf(ref_file, "msu_r(%#x, %#x, %#x) = %#x overflow %d carry %d\n", svar32_a, svar16_a, svar16_b, svar16_c, Overflow, Carry); + + + /* L_deposit_h */ + /* int32_t L_deposit_h(int16_t x) */ + svar16_b = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = L_deposit_h(svar16_b); + fprintf(ref_file, "L_deposit_h(%#x) = %#x overflow %d carry %d\n", svar16_b, svar32_a, Overflow, Carry); + + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = L_deposit_h(svar16_b); + fprintf(ref_file, "L_deposit_h(%#x) = %#x overflow %d carry %d\n", svar16_b, svar32_a, Overflow, Carry); + + svar16_b = -32768; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = L_deposit_h(svar16_b); + fprintf(ref_file, "L_deposit_h(%#x) = %#x overflow %d carry %d\n", svar16_b, svar32_a, Overflow, Carry); + + svar16_b = 0x1234; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = L_deposit_h(svar16_b); + fprintf(ref_file, "L_deposit_h(%#x) = %#x overflow %d carry %d\n", svar16_b, svar32_a, Overflow, Carry); + + + /* L_deposit_l */ + /* int32_t L_deposit_l(int16_t x) */ + svar16_b = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = L_deposit_l(svar16_b); + fprintf(ref_file, "L_deposit_l(%#x) = %#x overflow %d carry %d\n", svar16_b, svar32_a, Overflow, Carry); + + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = L_deposit_l(svar16_b); + fprintf(ref_file, "L_deposit_l(%#x) = %#x overflow %d carry %d\n", svar16_b, svar32_a, Overflow, Carry); + + svar16_b = -32768; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = L_deposit_l(svar16_b); + fprintf(ref_file, "L_deposit_l(%#x) = %#x overflow %d carry %d\n", svar16_b, svar32_a, Overflow, Carry); + + svar16_b = 0x1234; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = L_deposit_l(svar16_b); + fprintf(ref_file, "L_deposit_l(%#x) = %#x overflow %d carry %d\n", svar16_b, svar32_a, Overflow, Carry); + + + /* L_shr_r */ + /* int32_t L_shr_r(int32_t x, int16_t y) */ + svar32_a = 1; + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr_r(svar32_a, svar16_b); + fprintf(ref_file, "L_shr_r(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 10; + svar16_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr_r(svar32_a, svar16_b); + fprintf(ref_file, "L_shr_r(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0xFFF; + svar16_b = -10; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr_r(svar32_a, svar16_b); + fprintf(ref_file, "L_shr_r(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0xFFF; + svar16_b = -20; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr_r(svar32_a, svar16_b); + fprintf(ref_file, "L_shr_r(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0x12345678; + svar16_b = -10; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr_r(svar32_a, svar16_b); + fprintf(ref_file, "L_shr_r(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0x12345678; + svar16_b = -40; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr_r(svar32_a, svar16_b); + fprintf(ref_file, "L_shr_r(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 1; + svar16_b = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr_r(svar32_a, svar16_b); + fprintf(ref_file, "L_shr_r(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 20; + svar16_b = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr_r(svar32_a, svar16_b); + fprintf(ref_file, "L_shr_r(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0xFFF; + svar16_b = 10; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr_r(svar32_a, svar16_b); + fprintf(ref_file, "L_shr_r(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0xFFF; + svar16_b = 64; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr_r(svar32_a, svar16_b); + fprintf(ref_file, "L_shr_r(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0x12345678; + svar16_b = 10; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr_r(svar32_a, svar16_b); + fprintf(ref_file, "L_shr_r(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + svar32_a = 0x12345678; + svar16_b = 64; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_c = L_shr_r(svar32_a, svar16_b); + fprintf(ref_file, "L_shr_r(%#x, %d) = %#x overflow %d carry %d\n", svar32_a, svar16_b, svar32_c, Overflow, Carry); + + + /* L_abs */ + /* int32_t L_abs(int32_t x) */ + svar32_b = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = L_abs(svar32_b); + fprintf(ref_file, "L_abs(%#x) = %#x overflow %d carry %d\n", svar32_b, svar32_a, Overflow, Carry); + + svar32_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = L_abs(svar32_b); + fprintf(ref_file, "L_abs(%#x) = %#x overflow %d carry %d\n", svar32_b, svar32_a, Overflow, Carry); + + svar32_b = 0x80000000; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = L_abs(svar32_b); + fprintf(ref_file, "L_abs(%#x) = %#x overflow %d carry %d\n", svar32_b, svar32_a, Overflow, Carry); + + + /* L_sat */ + /* int32_t L_sat(int32_t x) */ + svar32_b = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = L_sat(svar32_b); + fprintf(ref_file, "L_sat(%#x) = %#x overflow %d carry %d\n", svar32_b, svar32_a, Overflow, Carry); + + svar32_b = -1; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = L_sat(svar32_b); + fprintf(ref_file, "L_sat(%#x) = %#x overflow %d carry %d\n", svar32_b, svar32_a, Overflow, Carry); + + svar32_b = -32768; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = L_sat(svar32_b); + fprintf(ref_file, "L_sat(%#x) = %#x overflow %d carry %d\n", svar32_b, svar32_a, Overflow, Carry); + + svar32_b = 32768; + Overflow = init_Overflow; + Carry = init_Carry; + svar32_a = L_sat(svar32_b); + fprintf(ref_file, "L_sat(%#x) = %#x overflow %d carry %d\n", svar32_b, svar32_a, Overflow, Carry); + + + /* div_s */ + /* int16_t div_s(int16_t x, int16_t y) */ + svar16_a = 1; + svar16_b = 1; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = div_s(svar16_a, svar16_b); + fprintf(ref_file, "div_s(%#x, %#x) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + svar16_a = 10000; + svar16_b = 20000; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = div_s(svar16_a, svar16_b); + fprintf(ref_file, "div_s(%#x, %#x) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + + + svar16_a = 10000; + svar16_b = 20000; + Overflow = init_Overflow; + Carry = init_Carry; + svar16_c = div_s(svar16_a, svar16_b); + fprintf(ref_file, "div_s(%#x, %#x) = %#x overflow %d carry %d\n", svar16_a, svar16_b, svar16_c, Overflow, Carry); + +} + +void exec_dspfns(void) +{ + Overflow = 0; + + exec_dspfns1(0, 0); + exec_dspfns1(0, 1); + exec_dspfns1(1, 0); + exec_dspfns1(1, 1); +} |