From e7b7aa394448b3006ab0c729ccf772d5a07a72f9 Mon Sep 17 00:00:00 2001 From: ceriel Date: Tue, 15 Jan 1991 18:21:16 +0000 Subject: [PATCH] simplified compile time floating point somewhat --- lang/cem/cemcom.ansi/arith.c | 4 ---- lang/cem/cemcom.ansi/dumpidf.c | 11 ++++++----- lang/cem/cemcom.ansi/eval.c | 8 +++----- lang/cem/cemcom.ansi/expr.c | 8 ++------ lang/cem/cemcom.ansi/expr.str | 14 ++------------ lang/cem/cemcom.ansi/fltcstoper.c | 2 -- lang/cem/cemcom.ansi/ival.g | 9 ++++----- 7 files changed, 17 insertions(+), 39 deletions(-) diff --git a/lang/cem/cemcom.ansi/arith.c b/lang/cem/cemcom.ansi/arith.c index a733d87a8..4e2221736 100644 --- a/lang/cem/cemcom.ansi/arith.c +++ b/lang/cem/cemcom.ansi/arith.c @@ -379,9 +379,7 @@ int2float(expp, tp) exp->ex_type = tp; exp->ex_class = Float; - exp->FL_VALUE = 0; flt_arith2flt(exp->VL_VALUE, &(exp->FL_ARITH), uns); - exp->FL_DATLAB = 0; } else { fp_used = 1; @@ -623,6 +621,4 @@ switch_sign_fp(expr) register struct expr *expr; { flt_umin(&(expr->FL_ARITH)); - if (expr->FL_VALUE) free(expr->FL_VALUE); - expr->FL_VALUE = 0; } diff --git a/lang/cem/cemcom.ansi/dumpidf.c b/lang/cem/cemcom.ansi/dumpidf.c index eb04f2fc4..121f4e0a9 100644 --- a/lang/cem/cemcom.ansi/dumpidf.c +++ b/lang/cem/cemcom.ansi/dumpidf.c @@ -480,12 +480,13 @@ p1_expr(lvl, expr) break; } case Float: - if (!expr->FL_VALUE) { - expr->FL_VALUE = Malloc(FLT_STRLEN); - flt_flt2str(&(expr->FL_ARITH), expr->FL_VALUE, FLT_STRLEN); - } - print("%s\n", expr->FL_VALUE); + { + char buf[FLT_STRLEN]; + + flt_flt2str(&(expr->FL_ARITH), buf, FLT_STRLEN); + print("%s\n", buf); break; + } case Oper: o = &expr->ex_object.ex_oper; print("\n"); diff --git a/lang/cem/cemcom.ansi/eval.c b/lang/cem/cemcom.ansi/eval.c index cf59ce19f..944492b7d 100644 --- a/lang/cem/cemcom.ansi/eval.c +++ b/lang/cem/cemcom.ansi/eval.c @@ -101,14 +101,12 @@ EVAL(expr, val, code, true_label, false_label) case Float: /* a floating constant */ if (gencode) { label datlab = data_label(); + char buf[FLT_STRLEN]; fp_used = 1; - if (!expr->FL_VALUE) { - expr->FL_VALUE = Malloc(FLT_STRLEN); - flt_flt2str(&(expr->FL_ARITH), expr->FL_VALUE, FLT_STRLEN); - } + flt_flt2str(&(expr->FL_ARITH), buf, FLT_STRLEN); C_df_dlb(datlab); - C_rom_fcon(expr->FL_VALUE, expr->ex_type->tp_size); + C_rom_fcon(buf, expr->ex_type->tp_size); C_lae_dlb(datlab, (arith)0); C_loi(expr->ex_type->tp_size); } diff --git a/lang/cem/cemcom.ansi/expr.c b/lang/cem/cemcom.ansi/expr.c index e32930369..871ccf0eb 100644 --- a/lang/cem/cemcom.ansi/expr.c +++ b/lang/cem/cemcom.ansi/expr.c @@ -223,7 +223,6 @@ string2expr(expp, str, len) ex->ex_class = String; ex->SG_VALUE = str; ex->SG_LEN = len; - /* ex->SG_DATLAB = 0; */ } int2expr(expr) @@ -258,12 +257,11 @@ float2expr(expr) crash("(float2expr) bad fund %s\n", symbol2str(fund)); } expr->ex_class = Float; - expr->FL_VALUE = dot.tk_fval; - flt_str2flt(expr->FL_VALUE, &(expr->FL_ARITH)); + flt_str2flt(dot.tk_fval, &(expr->FL_ARITH)); + free(dot.tk_fval); ASSERT(flt_status != FLT_NOFLT); if (flt_status == FLT_OVFL) expr_warning(expr,"internal floating point overflow"); - expr->FL_DATLAB = 0; } struct expr* @@ -501,8 +499,6 @@ free_expression(expr) /* The expression expr is freed recursively. */ if (expr) { - if (expr->ex_class == Float && expr->FL_VALUE) - free(expr->FL_VALUE); if (expr->ex_class == Oper) { free_expression(expr->OP_LEFT); free_expression(expr->OP_RIGHT); diff --git a/lang/cem/cemcom.ansi/expr.str b/lang/cem/cemcom.ansi/expr.str index a9071b1c9..43f96de4e 100644 --- a/lang/cem/cemcom.ansi/expr.str +++ b/lang/cem/cemcom.ansi/expr.str @@ -26,13 +26,6 @@ struct value { struct string { char *sg_value; /* row of bytes repr. the constant */ int sg_len; /* length of the row */ - label sg_datlab; /* global data-label */ -}; - -struct floating { - char *fl_value; /* pointer to string repr. the fp const. */ - flt_arith fl_arith; /* the value in high precision */ - label fl_datlab; /* global data_label */ }; struct oper { @@ -60,7 +53,7 @@ struct expr { union { struct value ex_value; struct string ex_string; - struct floating ex_float; + flt_arith ex_fl_arith; struct oper ex_oper; } ex_object; }; @@ -73,10 +66,7 @@ struct expr { #define VL_LBL EX_VALUE.vl_data.vl_lbl #define SG_VALUE ex_object.ex_string.sg_value #define SG_LEN ex_object.ex_string.sg_len -#define SG_DATLAB ex_object.ex_string.sg_datlab -#define FL_VALUE ex_object.ex_float.fl_value -#define FL_ARITH ex_object.ex_float.fl_arith -#define FL_DATLAB ex_object.ex_float.fl_datlab +#define FL_ARITH ex_object.ex_fl_arith #define OP_TYPE ex_object.ex_oper.op_type #define OP_LEFT ex_object.ex_oper.op_left #define OP_OPER ex_object.ex_oper.op_oper diff --git a/lang/cem/cemcom.ansi/fltcstoper.c b/lang/cem/cemcom.ansi/fltcstoper.c index c5a2508e9..19a7508db 100644 --- a/lang/cem/cemcom.ansi/fltcstoper.c +++ b/lang/cem/cemcom.ansi/fltcstoper.c @@ -91,8 +91,6 @@ fltcstbin(expp, oper, expr) default: /* there can't be another status */ crash("(fltcstoper) bad status"); } - if ((*expp)->FL_VALUE) free((*expp)->FL_VALUE); - (*expp)->FL_VALUE = 0; if (compar) { fill_int_expr(*expp, (arith)cmpval, INT); } else { diff --git a/lang/cem/cemcom.ansi/ival.g b/lang/cem/cemcom.ansi/ival.g index 9126095b6..1d7ed0730 100644 --- a/lang/cem/cemcom.ansi/ival.g +++ b/lang/cem/cemcom.ansi/ival.g @@ -514,11 +514,10 @@ check_ival(expp, tp) print_expr("init-expr after cast", expr); #endif DEBUG if (expr->ex_class == Float) { - if (!expr->FL_VALUE) { - expr->FL_VALUE = Malloc(FLT_STRLEN); - flt_flt2str(&(expr->FL_ARITH), expr->FL_VALUE, FLT_STRLEN); - } - C_con_fcon(expr->FL_VALUE, expr->ex_type->tp_size); + char buf[FLT_STRLEN]; + + flt_flt2str(&(expr->FL_ARITH), buf, FLT_STRLEN); + C_con_fcon(buf, expr->ex_type->tp_size); } #ifdef NOTDEF -- 2.34.1