do not compile with stack auto, change functions to be nonreentrant, use fixed parameters

- frees up ~4KB of code space
This commit is contained in:
Jeff Wang
2019-05-02 03:27:01 -04:00
parent 6399cbf44f
commit 0049f3df98
15 changed files with 121 additions and 104 deletions

View File

@ -46,6 +46,9 @@ static const uint8_t num_digits_display = 16;
__idata dec80 AccDecn, BDecn;
__xdata char Buf[DECN_BUF_SIZE];
void copy_decn(dec80* dest, const dec80* src){
uint8_t i;
dest->exponent = src->exponent;
@ -152,7 +155,7 @@ static void remove_leading_zeros(dec80* x){
set_exponent(x, exponent, is_negative);
}
void build_dec80(const char* signif_str, exp_t exponent){
void build_dec80(__xdata const char* signif_str, exp_t exponent){
enum {
SIGN_ZERO,
SIGN_ZERO_SEEN_POINT,
@ -515,7 +518,6 @@ static void sub_mag(dec80* acc, const dec80* x){
_incr_exp(&tmp, get_exponent(acc));
}
#ifdef DEBUG_ADD
extern char Buf[DECN_BUF_SIZE];
decn_to_str_complete(Buf, &tmp);
printf(" incr_exp tmp: %s\n", Buf);
#endif
@ -604,7 +606,6 @@ void add_decn(void){
remove_leading_zeros(&AccDecn);
remove_leading_zeros(&tmp);
#ifdef DEBUG_ADD
extern char Buf[DECN_BUF_SIZE];
decn_to_str_complete(Buf, &AccDecn);
printf(" rem_leading_zeros acc: %s\n", Buf);
decn_to_str_complete(Buf, &tmp);
@ -620,7 +621,6 @@ void add_decn(void){
set_exponent(&AccDecn, get_exponent(&tmp), (AccDecn.exponent < 0));
}
#ifdef DEBUG_ADD
extern char Buf[DECN_BUF_SIZE];
decn_to_str_complete(Buf, &AccDecn);
printf(" incr_exp acc: %s\n", Buf);
decn_to_str_complete(Buf, &tmp);
@ -788,7 +788,6 @@ void div_decn(void){
//do newton raphson iterations
for (i = 0; i < DEC80_NUM_LSU; i++){ //just fix number of iterations for now
#ifdef DEBUG_DIV
extern char Buf[DECN_BUF_SIZE];
decn_to_str_complete(Buf, &curr_recip);
printf("%2d: %s\n", i, Buf);
#endif
@ -820,18 +819,17 @@ void div_decn(void){
mult_decn();
}
static void set_str_error(char* buf){
buf[0] = 'E';
buf[1] = 'r';
buf[2] = 'r';
buf[3] = 'o';
buf[4] = 'r';
buf[5] = '\0';
static void set_str_error(){
Buf[0] = 'E';
Buf[1] = 'r';
Buf[2] = 'r';
Buf[3] = 'o';
Buf[4] = 'r';
Buf[5] = '\0';
}
//buf should hold at least 18 + 4 + 5 + 1 = 28
int8_t decn_to_str(char* buf, const dec80* x){
#define INSERT_DOT() buf[i++]='.'
int8_t decn_to_str(const dec80* x){
#define INSERT_DOT() Buf[i++]='.'
uint8_t i = 0;
uint8_t digit100;
exp_t exponent = 0;
@ -841,7 +839,7 @@ int8_t decn_to_str(char* buf, const dec80* x){
//handle corner case of NaN
if (decn_is_nan(x)){
set_str_error(buf);
set_str_error();
#ifdef DEBUG
printf (" corner case NaN ");
#endif
@ -856,8 +854,8 @@ int8_t decn_to_str(char* buf, const dec80* x){
#ifdef DEBUG
printf (" corner case, set to 0 ");
#endif
buf[0] = '0';
buf[1] = '\0';
Buf[0] = '0';
Buf[1] = '\0';
return 0;
}
//check sign of number
@ -865,7 +863,7 @@ int8_t decn_to_str(char* buf, const dec80* x){
#ifdef DEBUG
printf (" negative ");
#endif
buf[i] = '-';
Buf[i] = '-';
i++;
}
//check if we should use scientific notation
@ -876,18 +874,18 @@ int8_t decn_to_str(char* buf, const dec80* x){
//pad zeros right of decimal point if needed
if (!use_sci && exponent < 0){
exp_t j;
buf[i] = '0';
Buf[i] = '0';
i++;
INSERT_DOT();
//pad zeros right of decimal point
// for (j = exponent + 1; j < 0; j++){ <--- results in undefined behavior (signed overflow), and causes crash
for (j = -exponent -1; j > 0; --j){
buf[i] = '0';
Buf[i] = '0';
i++;
}
}
//print 1st digit
buf[i] = (tmp.lsu[0] / 10) + '0';
Buf[i] = (tmp.lsu[0] / 10) + '0';
i++;
if (use_sci) {
INSERT_DOT();
@ -898,7 +896,7 @@ int8_t decn_to_str(char* buf, const dec80* x){
exponent--;
}
//print 2nd digit
buf[i] = (tmp.lsu[0] % 10) + '0';
Buf[i] = (tmp.lsu[0] % 10) + '0';
if (tmp.lsu[0] % 10 == 0 && (use_sci || exponent < 0)){
trailing_zeros = 1;
@ -913,7 +911,7 @@ int8_t decn_to_str(char* buf, const dec80* x){
//print rest of significand
for (digit100 = 1 ; digit100 < DEC80_NUM_LSU; digit100++){
//print 1st digit
buf[i] = (tmp.lsu[digit100] / 10) + '0';
Buf[i] = (tmp.lsu[digit100] / 10) + '0';
i++;
if (!use_sci){
if (exponent == 0){
@ -922,7 +920,7 @@ int8_t decn_to_str(char* buf, const dec80* x){
exponent--;
}
//print 2nd digit
buf[i] = (tmp.lsu[digit100] % 10) + '0';
Buf[i] = (tmp.lsu[digit100] % 10) + '0';
i++;
if (!use_sci){
if (exponent == 0){
@ -948,7 +946,7 @@ int8_t decn_to_str(char* buf, const dec80* x){
if (use_sci || exponent <= 0){
i -= trailing_zeros;
}
buf[i] = '\0';
Buf[i] = '\0';
//calculate exponent
exponent = get_exponent(&tmp); //base 100
@ -959,7 +957,7 @@ int8_t decn_to_str(char* buf, const dec80* x){
if (use_sci){
//check for overflow
if (exponent > DEC80_MAX_EXP || exponent < DEC80_MIN_EXP){
set_str_error(buf);
set_str_error();
return 0;
}
return exponent;
@ -978,19 +976,19 @@ int8_t decn_to_str(char* buf, const dec80* x){
#ifdef DESKTOP
//complete string including exponent
void decn_to_str_complete(char* buf, const dec80* x){
int8_t exponent = decn_to_str(buf, x);
void decn_to_str_complete(const dec80* x){
int8_t exponent = decn_to_str(x);
int i;
//find end of string
for (i = 0; buf[i] != '\0'; i++);
for (i = 0; Buf[i] != '\0'; i++);
//add exponent
if (exponent != 0){
buf[i++] = 'E';
Buf[i++] = 'E';
if (exponent < 0){
buf[i++] = '-';
u32str(-exponent, &buf[i], 10); //adds null terminator automatically
Buf[i++] = '-';
u32str(-exponent, &Buf[i], 10); //adds null terminator automatically
} else {
u32str(exponent, &buf[i], 10); //adds null terminator automatically
u32str(exponent, &Buf[i], 10); //adds null terminator automatically
}
}
}

View File

@ -16,7 +16,7 @@ extern "C" {
#define DEC80_NUM_LSU 9
//#define EXP16
#define EXP16
#ifdef EXP16
typedef int16_t exp_t;
@ -53,7 +53,7 @@ exp_t get_exponent(const dec80* x);
void copy_decn(dec80* dest, const dec80* src);
extern __idata dec80 AccDecn, BDecn;
void build_dec80(const char* signif_str, exp_t exponent);
void build_dec80(__xdata const char* signif_str, exp_t exponent);
void set_dec80_zero(dec80* dest);
void set_dec80_NaN(dec80* dest);
@ -64,13 +64,14 @@ void add_decn(void);
void mult_decn(void);
void div_decn(void);
//buf should hold at least 18 + 4 + 5 + 1 = 28
//Buf should hold at least 18 + 4 + 5 + 1 = 28
#define DECN_BUF_SIZE 28
int8_t decn_to_str(char* buf, const dec80* x);
extern __xdata char Buf[DECN_BUF_SIZE];
int8_t decn_to_str(const dec80* x);
#ifdef DESKTOP
//complete string including exponent
void decn_to_str_complete(char* buf, const dec80* x);
void decn_to_str_complete(const dec80* x);
void build_decn_at(dec80* dest, const char* signif_str, exp_t exponent);
#endif

View File

@ -32,17 +32,17 @@ static void div_test(
{
build_dec80(a_str, a_exp);
build_decn_at(&BDecn, b_str, b_exp);
decn_to_str_complete(Buf, &AccDecn);
decn_to_str_complete(&AccDecn);
printf(" acc: %s\n", Buf);
decn_to_str_complete(Buf, &BDecn);
decn_to_str_complete(&BDecn);
printf(" b: %s\n", Buf);
div_decn();
decn_to_str_complete(Buf, &AccDecn);
decn_to_str_complete(&AccDecn);
printf("acc/b: %s\n", Buf);
printf(" : %s\n", res_str);
build_decn_at(&diff, res_calc, res_exp);
take_diff();
decn_to_str_complete(Buf, &diff);
decn_to_str_complete(&diff);
printf(" : %s\n\n", Buf);
}
@ -50,15 +50,15 @@ int main(void){
// dec80 acc, b;
build_dec80("0.0009234567890123456", 7);
decn_to_str_complete(Buf, &AccDecn);
decn_to_str_complete(&AccDecn);
printf(" acc: %s\n", Buf);
build_dec80("9.234567890123456", 3);
decn_to_str_complete(Buf, &AccDecn);
decn_to_str_complete(&AccDecn);
printf(" acc: %s\n", Buf);
negate_decn(&AccDecn);
decn_to_str_complete(Buf, &AccDecn);
decn_to_str_complete(&AccDecn);
printf("-acc: %s\n", Buf);
dec80 tmp_copy;
@ -66,54 +66,54 @@ int main(void){
build_dec80("-92.3456789012345678", 1);
copy_decn(&BDecn, &AccDecn);
copy_decn(&AccDecn, &tmp_copy); //restore
decn_to_str_complete(Buf, &BDecn);
decn_to_str_complete(&BDecn);
printf(" b: %s\n", Buf);
decn_to_str_complete(Buf, &AccDecn);
decn_to_str_complete(&AccDecn);
printf("-acc: %s\n", Buf);
//compare result of b - acc
add_decn();
decn_to_str_complete(Buf, &AccDecn);
decn_to_str_complete(&AccDecn);
printf("b - a: %s\n", Buf);
printf(" : %s\n", "-10158.0246791358016");
build_decn_at(&diff, "-1.01580246791358016", 4);
take_diff();
decn_to_str_complete(Buf, &diff);
decn_to_str_complete(&diff);
printf(" : %s\n\n", Buf);
//new acc for acc - b test
decn_to_str_complete(Buf, &AccDecn);
decn_to_str_complete(&AccDecn);
printf("acc: %s\n", Buf);
negate_decn(&BDecn);
decn_to_str_complete(Buf, &BDecn);
decn_to_str_complete(&BDecn);
printf(" -b: %s\n", Buf);
add_decn();
decn_to_str_complete(Buf, &AccDecn);
decn_to_str_complete(&AccDecn);
//compare result of new acc - b
printf("acc - b: %s\n", Buf);
printf(" : %s\n", "-9234.567890123456");
build_decn_at(&diff, "-9.234567890123456", 3);
take_diff();
decn_to_str_complete(Buf, &diff);
decn_to_str_complete(&diff);
printf(" : %s\n\n", Buf);
//new acc and b for multiply test
// build_dec80("7", 2);
build_dec80("92.34567890123456", 2);
build_decn_at(&BDecn, "-92.3456789012345678", 1);
decn_to_str_complete(Buf, &AccDecn);
decn_to_str_complete(&AccDecn);
printf(" acc: %s\n", Buf);
decn_to_str_complete(Buf, &BDecn);
decn_to_str_complete(&BDecn);
printf(" b: %s\n", Buf);
mult_decn();
decn_to_str_complete(Buf, &AccDecn);
decn_to_str_complete(&AccDecn);
printf("acc*b: %s\n", Buf);
printf(" : %s\n", "-8527724.41172991849");
build_decn_at(&diff, "-8.52772441172991849", 6);
take_diff();
decn_to_str_complete(Buf, &diff);
decn_to_str_complete(&diff);
printf(" : %s\n\n", Buf);
//new acc and b for divide test
@ -143,13 +143,13 @@ int main(void){
//small fractions >= 1/10
build_dec80("0.333", 0);
build_decn_at(&BDecn, "3.33", -1);
decn_to_str_complete(Buf, &AccDecn);
decn_to_str_complete(&AccDecn);
printf(" a : %s\n", Buf);
decn_to_str_complete(Buf, &BDecn);
decn_to_str_complete(&BDecn);
printf(" b : %s\n", Buf);
negate_decn(&BDecn);
add_decn();
decn_to_str_complete(Buf, &AccDecn);
decn_to_str_complete(&AccDecn);
printf("a - b: %s\n", Buf);
//new acc and b for divide test