From: erikb Date: Fri, 12 Sep 1986 09:16:07 +0000 (+0000) Subject: built in the compile time flag NOFLOAT to get rid of the float stuff X-Git-Tag: release-5-5~5228 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=c6a51a39f070c45cb62891db2b7b5024012e6644;p=ack.git built in the compile time flag NOFLOAT to get rid of the float stuff --- diff --git a/lang/cem/cemcom/LLlex.c b/lang/cem/cemcom/LLlex.c index a1182d914..b49dcaf6a 100644 --- a/lang/cem/cemcom/LLlex.c +++ b/lang/cem/cemcom/LLlex.c @@ -337,6 +337,7 @@ go_on: /* rescan, the following character has been read */ register arith val = 0; if (ch == '.') { /* an embarrassing ambiguity */ +#ifndef NOFLOAT LoadChar(vch); PushBack(); if (!is_dig(vch)) /* just a `.' */ @@ -345,6 +346,9 @@ go_on: /* rescan, the following character has been read */ /* in the rest of the compiler, all floats have to start with a digit. */ +#else NOFLOAT + return ptok->tk_symb = ch; +#endif NOFLOAT } if (ch == '0') { *np++ = ch; @@ -367,7 +371,10 @@ go_on: /* rescan, the following character has been read */ ptok->tk_fund = LONG; return ptok->tk_symb = INTEGER; } - if (base == 16 || !(ch == '.' || ch == 'e' || ch == 'E')) { +#ifndef NOFLOAT + if (base == 16 || !(ch == '.' || ch == 'e' || ch == 'E')) +#endif NOFLOAT + { PushBack(); ptok->tk_ival = val; /* The semantic analyser must know if the @@ -383,6 +390,7 @@ go_on: /* rescan, the following character has been read */ return ptok->tk_symb = INTEGER; } /* where's the test for the length of the integral ??? */ +#ifndef NOFLOAT if (ch == '.'){ if (np < &buf[NUMSIZE]) *np++ = ch; @@ -423,6 +431,7 @@ go_on: /* rescan, the following character has been read */ else ptok->tk_fval = Salloc(buf, np - buf) + 1; return ptok->tk_symb = FLOATING; +#endif NOFLOAT } case STEOI: /* end of text on source file */ return ptok->tk_symb = EOI; diff --git a/lang/cem/cemcom/LLlex.h b/lang/cem/cemcom/LLlex.h index 392f6664f..572160c5b 100644 --- a/lang/cem/cemcom/LLlex.h +++ b/lang/cem/cemcom/LLlex.h @@ -21,7 +21,9 @@ struct token { int tok_fund; /* INT or LONG */ arith tok_ival; } tok_integer; +#ifndef NOFLOAT char *tok_fval; +#endif NOFLOAT } tok_data; }; @@ -33,7 +35,9 @@ struct token { #define tk_len tok_data.tok_string.tok_len #define tk_fund tok_data.tok_integer.tok_fund #define tk_ival tok_data.tok_integer.tok_ival +#ifndef NOFLOAT #define tk_fval tok_data.tok_fval +#endif NOFLOAT extern struct token dot, ahead, aside; extern unsigned int LineNumber; /* "LLlex.c" */ diff --git a/lang/cem/cemcom/LLmessage.c b/lang/cem/cemcom/LLmessage.c index 78ca57d02..887a15d9d 100644 --- a/lang/cem/cemcom/LLmessage.c +++ b/lang/cem/cemcom/LLmessage.c @@ -44,8 +44,10 @@ insert_token(tk) dot.tk_fund = INT; dot.tk_ival = 1; break; +#ifndef NOFLOAT case FLOATING: dot.tk_fval = Salloc("0.0", 4); break; +#endif NOFLOAT } } diff --git a/lang/cem/cemcom/Parameters b/lang/cem/cemcom/Parameters index c3b9bef78..dab11db3c 100644 --- a/lang/cem/cemcom/Parameters +++ b/lang/cem/cemcom/Parameters @@ -66,8 +66,10 @@ #define SZ_WORD (arith)4 #define SZ_INT (arith)4 #define SZ_LONG (arith)4 +#ifndef NOFLOAT #define SZ_FLOAT (arith)4 #define SZ_DOUBLE (arith)8 +#endif NOFLOAT #define SZ_POINTER (arith)4 /* target machine alignment requirements */ @@ -76,8 +78,10 @@ #define AL_WORD SZ_WORD #define AL_INT SZ_WORD #define AL_LONG SZ_WORD +#ifndef NOFLOAT #define AL_FLOAT SZ_WORD #define AL_DOUBLE SZ_WORD +#endif NOFLOAT #define AL_POINTER SZ_WORD #define AL_STRUCT 1 #define AL_UNION 1 diff --git a/lang/cem/cemcom/align.h b/lang/cem/cemcom/align.h index b0be9d445..ae162f1bb 100644 --- a/lang/cem/cemcom/align.h +++ b/lang/cem/cemcom/align.h @@ -3,7 +3,10 @@ extern int short_align, word_align, int_align, long_align, - float_align, double_align, pointer_align, +#ifndef NOFLOAT + float_align, double_align, +#endif NOFLOAT + pointer_align, struct_align, union_align; extern arith align(); diff --git a/lang/cem/cemcom/arith.c b/lang/cem/cemcom/arith.c index 61bdb6efb..9379244a9 100644 --- a/lang/cem/cemcom/arith.c +++ b/lang/cem/cemcom/arith.c @@ -36,6 +36,7 @@ arithbalance(e1p, oper, e2p) /* RM 6.6 */ t2 = any2arith(e2p, oper); /* Now t1 and t2 are either INT or LONG or DOUBLE */ +#ifndef NOFLOAT if (t1 == DOUBLE && t2 != DOUBLE) t2 = int2float(e2p, double_type); else @@ -44,6 +45,7 @@ arithbalance(e1p, oper, e2p) /* RM 6.6 */ else if (t1 == DOUBLE) return DOUBLE; +#endif NOFLOAT /* Now they are INT or LONG */ u1 = (*e1p)->ex_type->tp_unsigned; @@ -148,11 +150,13 @@ any2arith(expp, oper) expr_warning(*expp, "%s on enum", symbol2str(oper)); int2int(expp, int_type); break; +#ifndef NOFLOAT case FLOAT: float2float(expp, double_type); break; case DOUBLE: break; +#endif NOFLOAT #ifndef NOBITFIELD case FIELD: field2arith(expp); @@ -220,6 +224,7 @@ int2int(expp, tp) return (*expp)->ex_type->tp_fund; } +#ifndef NOFLOAT int int2float(expp, tp) struct expr **expp; @@ -262,6 +267,7 @@ float2float(expp, tp) else *expp = arith2arith(tp, FLOAT2FLOAT, *expp); } +#endif NOFLOAT array2pointer(expp) struct expr **expp; @@ -337,8 +343,10 @@ opnd2logical(expp, oper) case LONG: case ENUM: case POINTER: +#ifndef NOFLOAT case FLOAT: case DOUBLE: +#endif NOFLOAT break; default: expr_error(*expp, "%s operand to %s", @@ -429,7 +437,9 @@ any2opnd(expp, oper) case CHAR: case SHORT: case ENUM: +#ifndef NOFLOAT case FLOAT: +#endif NOFLOAT any2arith(expp, oper); break; case ARRAY: @@ -477,6 +487,7 @@ field2arith(expp) } #endif NOBITFIELD +#ifndef NOFLOAT /* switch_sign_fp() negates the given floating constant expression The lexical analyser has reserved an extra byte of space in front of the string containing the representation of the floating @@ -491,3 +502,4 @@ switch_sign_fp(expr) else --(expr->FL_VALUE); } +#endif NOFLOAT diff --git a/lang/cem/cemcom/ch7.c b/lang/cem/cemcom/ch7.c index 0cb13fb56..b95922fe1 100644 --- a/lang/cem/cemcom/ch7.c +++ b/lang/cem/cemcom/ch7.c @@ -222,6 +222,7 @@ ch7cast(expp, oper, tp) symbol2str(oper)); int2int(expp, tp); } +#ifndef NOFLOAT else if (oldi && !i) { if (oldtp->tp_fund == ENUM && oper != CAST) @@ -235,6 +236,10 @@ ch7cast(expp, oper, tp) float2int(expp, tp); else /* !oldi && !i */ float2float(expp, tp); +#else NOFLOAT + else + crash("(ch7cast) floats not implemented\n"); +#endif NOFLOAT } else if (oldtp->tp_fund == POINTER && tp->tp_fund == POINTER) { @@ -404,8 +409,10 @@ is_arith_type(tp) case INT: case LONG: case ENUM: +#ifndef NOFLOAT case FLOAT: case DOUBLE: +#endif NOFLOAT return 1; #ifndef NOBITFIELD case FIELD: diff --git a/lang/cem/cemcom/ch7bin.c b/lang/cem/cemcom/ch7bin.c index c34e1c219..b8e1e182f 100644 --- a/lang/cem/cemcom/ch7bin.c +++ b/lang/cem/cemcom/ch7bin.c @@ -314,11 +314,13 @@ pointer_arithmetic(expp1, oper, expp2) /* prepares the integral expression expp2 in order to apply it to the pointer expression expp1 */ +#ifndef NOFLOAT if (any2arith(expp2, oper) == DOUBLE) { expr_error(*expp2, "illegal combination of float and pointer"); erroneous2int(expp2); } +#endif NOFLOAT ch7bin( expp2, '*', intexpr(size_of_type((*expp1)->ex_type->tp_up, "object"), pa_type->tp_fund) diff --git a/lang/cem/cemcom/ch7mon.c b/lang/cem/cemcom/ch7mon.c index 2d6332469..21ca76bd6 100644 --- a/lang/cem/cemcom/ch7mon.c +++ b/lang/cem/cemcom/ch7mon.c @@ -88,6 +88,7 @@ ch7mon(oper, expp) } break; case '~': +#ifndef NOFLOAT { int fund = (*expp)->ex_type->tp_fund; @@ -102,6 +103,7 @@ ch7mon(oper, expp) } /* FALLTHROUGH */ } +#endif NOFLOAT case '-': any2arith(expp, oper); if (is_cp_cst(*expp)) { @@ -114,9 +116,11 @@ ch7mon(oper, expp) ); } else +#ifndef NOFLOAT if (is_fp_cst(*expp)) switch_sign_fp(*expp); else +#endif NOFLOAT *expp = new_oper((*expp)->ex_type, NILEXPR, oper, *expp); break; diff --git a/lang/cem/cemcom/code.c b/lang/cem/cemcom/code.c index c273ba359..dfd952b59 100644 --- a/lang/cem/cemcom/code.c +++ b/lang/cem/cemcom/code.c @@ -32,7 +32,9 @@ static struct stmt_block *stmt_stack; char *symbol2str(); +#ifndef NOFLOAT int fp_used; +#endif NOFLOAT label lab_count = 1; label datlab_count = 1; @@ -254,11 +256,13 @@ end_proc(fbytes, nbytes) else C_ret(ATW(func_tp->tp_size)); } +#ifndef NOFLOAT if (fp_used && mes_flt_given == 0) { /* floating point used */ C_ms_flt(); mes_flt_given++; } +#endif NOFLOAT C_ms_par(fbytes); /* # bytes for formals */ if (sp_occurred[SP_SETJMP]) { /* indicate use of "setjmp" */ C_ms_gto(); diff --git a/lang/cem/cemcom/conversion.c b/lang/cem/cemcom/conversion.c index 7d6d47295..e62cb264d 100644 --- a/lang/cem/cemcom/conversion.c +++ b/lang/cem/cemcom/conversion.c @@ -9,7 +9,9 @@ #define T_SIGNED 1 #define T_UNSIGNED 2 +#ifndef NOFLOAT #define T_FLOATING 3 +#endif NOFLOAT /* conversion() generates the EM code for a conversion between the types char, short, int, long, float, double and pointer. @@ -51,11 +53,13 @@ conversion(from_type, to_type) C_ciu(); break; +#ifndef NOFLOAT case T_FLOATING: C_loc(from_size < word_size ? word_size : from_size); C_loc(to_size < word_size ? word_size : to_size); C_cif(); break; +#endif NOFLOAT } break; @@ -73,12 +77,15 @@ conversion(from_type, to_type) C_cuu(); break; +#ifndef NOFLOAT case T_FLOATING: C_cuf(); break; +#endif NOFLOAT } break; +#ifndef NOFLOAT case T_FLOATING: C_loc(from_size < word_size ? word_size : from_size); C_loc(to_size < word_size ? word_size : to_size); @@ -98,6 +105,7 @@ conversion(from_type, to_type) break; } break; +#endif NOFLOAT default: crash("(conversion) illegal type conversion"); } @@ -120,9 +128,11 @@ fundamental(tp) case ENUM: return tp->tp_unsigned ? T_UNSIGNED : T_SIGNED; +#ifndef NOFLOAT case FLOAT: case DOUBLE: return T_FLOATING; +#endif NOFLOAT case POINTER: /* pointer : signed / unsigned ??? */ return T_SIGNED; diff --git a/lang/cem/cemcom/decspecs.c b/lang/cem/cemcom/decspecs.c index 7cc5a2116..564b8d0b6 100644 --- a/lang/cem/cemcom/decspecs.c +++ b/lang/cem/cemcom/decspecs.c @@ -52,15 +52,19 @@ do_decspecs(ds) case SHORT: if (tp == int_type) tp = short_type; - else error("short with illegal type"); + else + error("short with illegal type"); break; case LONG: if (tp == int_type) tp = long_type; else +#ifndef NOFLOAT if (tp == float_type) tp = double_type; - else error("long with illegal type"); + else +#endif NOFLOAT + error("long with illegal type"); break; } if (ds->ds_unsigned) { diff --git a/lang/cem/cemcom/dumpidf.c b/lang/cem/cemcom/dumpidf.c index 361aa89a7..a7bf5ac78 100644 --- a/lang/cem/cemcom/dumpidf.c +++ b/lang/cem/cemcom/dumpidf.c @@ -327,7 +327,9 @@ p1_expr(lvl, expr) expr->ex_depth, expr->ex_class == Value ? "Value" : expr->ex_class == String ? "String" : +#ifndef NOFLOAT expr->ex_class == Float ? "Float" : +#endif NOFLOAT expr->ex_class == Oper ? "Oper" : expr->ex_class == Type ? "Type" : "UNKNOWN CLASS" ); @@ -361,9 +363,11 @@ p1_expr(lvl, expr) ); break; } +#ifndef NOFLOAT case Float: print("%s\n", expr->FL_VALUE); break; +#endif NOFLOAT case Oper: o = &expr->ex_object.ex_oper; print("\n"); diff --git a/lang/cem/cemcom/eval.c b/lang/cem/cemcom/eval.c index ac14d2d23..5374ef46a 100644 --- a/lang/cem/cemcom/eval.c +++ b/lang/cem/cemcom/eval.c @@ -91,6 +91,7 @@ EVAL(expr, val, code, true_label, false_label) C_lae_dlb(expr->VL_LBL, expr->VL_VALUE); } break; +#ifndef NOFLOAT case Float: /* a floating constant */ if (gencode) { label datlab = data_label(); @@ -101,6 +102,7 @@ EVAL(expr, val, code, true_label, false_label) C_loi(expr->ex_type->tp_size); } break; +#endif NOFLOAT case Oper: /* compound expression */ { register int oper = expr->OP_OPER; @@ -131,9 +133,11 @@ EVAL(expr, val, code, true_label, false_label) case POINTER: C_ads(rightop->ex_type->tp_size); break; +#ifndef NOFLOAT case DOUBLE: C_adf(tp->tp_size); break; +#endif NOFLOAT default: crash("bad type +"); } @@ -144,14 +148,16 @@ EVAL(expr, val, code, true_label, false_label) EVAL(rightop, RVAL, code, NO_LABEL, NO_LABEL); if (gencode) { switch (tp->tp_fund) { - case DOUBLE: - C_ngf(tp->tp_size); - break; case INT: case LONG: case POINTER: C_ngi(tp->tp_size); break; +#ifndef NOFLOAT + case DOUBLE: + C_ngf(tp->tp_size); + break; +#endif NOFLOAT default: CRASH(); } @@ -183,9 +189,11 @@ EVAL(expr, val, code, true_label, false_label) C_ads(rightop->ex_type->tp_size); } break; +#ifndef NOFLOAT case DOUBLE: C_sbf(tp->tp_size); break; +#endif NOFLOAT default: crash("bad type -"); } @@ -206,9 +214,11 @@ EVAL(expr, val, code, true_label, false_label) else C_mli(tp->tp_size); break; +#ifndef NOFLOAT case DOUBLE: C_mlf(double_size); break; +#endif NOFLOAT default: crash("bad type *"); } @@ -227,9 +237,11 @@ EVAL(expr, val, code, true_label, false_label) else C_dvi(tp->tp_size); break; +#ifndef NOFLOAT case DOUBLE: C_dvf(double_size); break; +#endif NOFLOAT default: crash("bad type /"); } @@ -237,17 +249,13 @@ EVAL(expr, val, code, true_label, false_label) case '%': EVAL(leftop, RVAL, code, NO_LABEL, NO_LABEL); EVAL(rightop, RVAL, code, NO_LABEL, NO_LABEL); - if (gencode) - if ( tp->tp_fund == INT - || tp->tp_fund == LONG - ) { - if (tp->tp_unsigned) - C_rmu(tp->tp_size); - else - C_rmi(tp->tp_size); - } + ASSERT(tp->tp_fund==INT || tp->tp_fund==LONG); + if (gencode) { + if (tp->tp_unsigned) + C_rmu(tp->tp_size); else - crash("bad type %%"); + C_rmi(tp->tp_size); + } break; case LEFT: EVAL(leftop, RVAL, code, NO_LABEL, NO_LABEL); @@ -287,10 +295,12 @@ EVAL(expr, val, code, true_label, false_label) else C_cmi(size); break; - case FLOAT: +#ifndef NOFLOAT + case FLOAT: /* thought they were converted??? */ case DOUBLE: C_cmf(size); break; +#endif NOFLOAT case POINTER: C_cmp(); break; @@ -553,12 +563,10 @@ EVAL(expr, val, code, true_label, false_label) EVAL(leftop, RVAL, TRUE, l_true, l_false); C_df_ilb(l_true); - EVAL(rightop->OP_LEFT, RVAL, code, - NO_LABEL, NO_LABEL); + EVAL(rightop->OP_LEFT, RVAL, code, NO_LABEL, NO_LABEL); C_bra(l_end); C_df_ilb(l_false); - EVAL(rightop->OP_RIGHT, RVAL, code, - NO_LABEL, NO_LABEL); + EVAL(rightop->OP_RIGHT, RVAL, code, NO_LABEL, NO_LABEL); C_df_ilb(l_end); break; } @@ -655,9 +663,11 @@ EVAL(expr, val, code, true_label, false_label) true_label); break; case INT2INT: +#ifndef NOFLOAT case INT2FLOAT: case FLOAT2INT: case FLOAT2FLOAT: +#endif NOFLOAT EVAL(rightop, RVAL, code, NO_LABEL, NO_LABEL); if (gencode) conversion(rightop->ex_type, leftop->ex_type); @@ -784,6 +794,7 @@ assop(type, oper) break; } break; +#ifndef NOFLOAT case FLOAT: case DOUBLE: switch (oper) { @@ -805,6 +816,7 @@ assop(type, oper) break; } break; +#endif NOFLOAT case POINTER: if (oper == MINAB || oper == MINMIN || oper == POSTDECR) C_ngi(size); diff --git a/lang/cem/cemcom/expr.c b/lang/cem/cemcom/expr.c index 4fa8cf7e1..6426ec5be 100644 --- a/lang/cem/cemcom/expr.c +++ b/lang/cem/cemcom/expr.c @@ -134,9 +134,11 @@ dot2expr(expp) case INTEGER: int2expr(*expp); break; +#ifndef NOFLOAT case FLOATING: float2expr(*expp); break; +#endif NOFLOAT default: crash("bad conversion to expression"); break; @@ -224,6 +226,7 @@ int2expr(expr) fill_int_expr(expr, dot.tk_ival, dot.tk_fund); } +#ifndef NOFLOAT float2expr(expr) struct expr *expr; { @@ -235,6 +238,7 @@ float2expr(expr) expr->FL_VALUE = dot.tk_fval; expr->FL_DATLAB = 0; } +#endif NOFLOAT struct expr* intexpr(ivalue, fund) @@ -408,10 +412,8 @@ chk_cst_expr(expp) expr_warning(expr, "expression comma in constant expression"); } - - if (err) { + if (err) erroneous2int(expp); - } } init_expression(eppp, expr) @@ -453,6 +455,7 @@ is_cp_cst(expr) return is_ld_cst(expr) && expr->VL_CLASS == Const; } +#ifndef NOFLOAT int is_fp_cst(expr) register struct expr *expr; @@ -462,6 +465,7 @@ is_fp_cst(expr) */ return expr->ex_class == Float; } +#endif NOFLOAT free_expression(expr) struct expr *expr; diff --git a/lang/cem/cemcom/expr.str b/lang/cem/cemcom/expr.str index 1d6275862..cf74c7e96 100644 --- a/lang/cem/cemcom/expr.str +++ b/lang/cem/cemcom/expr.str @@ -25,10 +25,12 @@ struct string { label sg_datlab; /* global data-label */ }; +#ifndef NOFLOAT struct floating { char *fl_value; /* pointer to string repr. the fp const. */ label fl_datlab; /* global data_label */ }; +#endif NOFLOAT struct oper { struct type *op_type; /* resulting type of the operation */ @@ -40,7 +42,9 @@ struct oper { /* The following constants indicate the class of the expression: */ #define Value 0 /* it is a value known at load time */ #define String 1 /* it is a string constant */ +#ifndef NOFLOAT #define Float 2 /* it is a floating point constant */ +#endif NOFLOAT #define Oper 3 /* it is a run-time expression */ #define Type 4 /* only its type is relevant */ @@ -56,7 +60,9 @@ struct expr { union { struct value ex_value; struct string ex_string; +#ifndef NOFLOAT struct floating ex_float; +#endif NOFLOAT struct oper ex_oper; } ex_object; }; @@ -69,8 +75,10 @@ struct expr { #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 +#ifndef NOFLOAT #define FL_VALUE ex_object.ex_float.fl_value #define FL_DATLAB ex_object.ex_float.fl_datlab +#endif NOFLOAT #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/idf.c b/lang/cem/cemcom/idf.c index aa6c48f1b..2cda12a97 100644 --- a/lang/cem/cemcom/idf.c +++ b/lang/cem/cemcom/idf.c @@ -210,9 +210,11 @@ declare_idf(ds, dc, lvl) type = construct_type(POINTER, type->tp_up, (arith)0); formal_array = 1; break; +#ifndef NOFLOAT case FLOAT: /* RM 10.1 */ type = double_type; break; +#endif NOFLOAT case CHAR: case SHORT: /* The RM is not clear about this: we must diff --git a/lang/cem/cemcom/ival.c b/lang/cem/cemcom/ival.c index 95e8d3fac..61ce90f22 100644 --- a/lang/cem/cemcom/ival.c +++ b/lang/cem/cemcom/ival.c @@ -383,10 +383,12 @@ pad(tp) case POINTER: C_con_ucon("0", tp->tp_size); break; +#ifndef NOFLOAT case FLOAT: case DOUBLE: C_con_fcon("0", tp->tp_size); break; +#endif NOFLOAT case UNION: error("initialisation of unions not allowed"); break; @@ -448,6 +450,7 @@ check_ival(ex, tp) C_con_dlb(ex->VL_LBL, ex->VL_VALUE); } break; +#ifndef NOFLOAT case FLOAT: case DOUBLE: ch7cast(&ex, '=', tp); @@ -471,6 +474,7 @@ check_ival(ex, tp) else illegal_init_cst(ex); break; +#endif NOFLOAT #ifndef NOBITFIELD case FIELD: diff --git a/lang/cem/cemcom/main.c b/lang/cem/cemcom/main.c index 614eb5cc0..e6240077a 100644 --- a/lang/cem/cemcom/main.c +++ b/lang/cem/cemcom/main.c @@ -48,8 +48,10 @@ arith dword_size = (2 * SZ_WORD), int_size = SZ_INT, long_size = SZ_LONG, +#ifndef NOFLOAT float_size = SZ_FLOAT, double_size = SZ_DOUBLE, +#endif NOFLOAT pointer_size = SZ_POINTER; int @@ -57,8 +59,10 @@ int word_align = AL_WORD, int_align = AL_INT, long_align = AL_LONG, +#ifndef NOFLOAT float_align = AL_FLOAT, double_align = AL_DOUBLE, +#endif NOFLOAT pointer_align = AL_POINTER, struct_align = AL_STRUCT, union_align = AL_UNION; @@ -237,8 +241,10 @@ init() long_type = standard_type(LONG, 0, long_align, long_size); ulong_type = standard_type(LONG, UNSIGNED, long_align, long_size); +#ifndef NOFLOAT float_type = standard_type(FLOAT, 0, float_align, float_size); double_type = standard_type(DOUBLE, 0, double_align, double_size); +#endif NOFLOAT void_type = standard_type(VOID, 0, 0, (arith)0); label_type = standard_type(LABEL, 0, 0, (arith)0); error_type = standard_type(ERRONEOUS, 0, 1, (arith)1); @@ -274,8 +280,10 @@ init() /* Define the standard type identifiers. */ add_def(str2idf("char"), TYPEDEF, char_type, L_UNIVERSAL); add_def(str2idf("int"), TYPEDEF, int_type, L_UNIVERSAL); +#ifndef NOFLOAT add_def(str2idf("float"), TYPEDEF, float_type, L_UNIVERSAL); add_def(str2idf("double"), TYPEDEF, double_type, L_UNIVERSAL); +#endif NOFLOAT add_def(str2idf("void"), TYPEDEF, void_type, L_UNIVERSAL); stack_level(); } @@ -350,9 +358,11 @@ preprocess() case INTEGER: print("%ld ", dot.tk_ival); break; +#ifndef NOFLOAT case FLOATING: print("%s ", dot.tk_fval); break; +#endif NOFLOAT case EOI: case EOF: return; diff --git a/lang/cem/cemcom/options.c b/lang/cem/cemcom/options.c index 7569fc492..90a94f163 100644 --- a/lang/cem/cemcom/options.c +++ b/lang/cem/cemcom/options.c @@ -200,16 +200,20 @@ do_option(text) long_align = align; break; case 'f': /* float */ +#ifndef NOFLOAT if (size != (arith)0) float_size = size; if (align != 0) float_align = align; +#endif NOFLOAT break; case 'd': /* double */ +#ifndef NOFLOAT if (size != (arith)0) double_size = size; if (align != 0) double_align = align; +#endif NOFLOAT break; case 'p': /* pointer */ if (size != (arith)0) diff --git a/lang/cem/cemcom/sizes.h b/lang/cem/cemcom/sizes.h index d0ae01e24..a4af4f2e0 100644 --- a/lang/cem/cemcom/sizes.h +++ b/lang/cem/cemcom/sizes.h @@ -3,6 +3,9 @@ extern arith short_size, word_size, dword_size, int_size, long_size, - float_size, double_size, pointer_size; +#ifndef NOFLOAT + float_size, double_size, +#endif NOFLOAT + pointer_size; extern arith max_int, max_unsigned; /* cstoper.c */ diff --git a/lang/cem/cemcom/stack.c b/lang/cem/cemcom/stack.c index 5e27af245..adb71aa63 100644 --- a/lang/cem/cemcom/stack.c +++ b/lang/cem/cemcom/stack.c @@ -128,10 +128,12 @@ unstack_level() case POINTER: reg = reg_pointer; break; +#ifndef NOFLOAT case FLOAT: case DOUBLE: reg = reg_float; break; +#endif NOFLOAT default: reg = reg_any; break; diff --git a/lang/cem/cemcom/switch.c b/lang/cem/cemcom/switch.c index 4a73673cd..35d131ba2 100644 --- a/lang/cem/cemcom/switch.c +++ b/lang/cem/cemcom/switch.c @@ -49,10 +49,12 @@ code_startswitch(expp) warning("long in switch (cast to int)"); int2int(expp, int_type); break; +#ifndef NOFLOAT case DOUBLE: error("float/double in switch"); erroneous2int(expp); break; +#endif NOFLOAT } stack_stmt(l_break, NO_LABEL); diff --git a/lang/cem/cemcom/type.c b/lang/cem/cemcom/type.c index c68c6687d..520218328 100644 --- a/lang/cem/cemcom/type.c +++ b/lang/cem/cemcom/type.c @@ -26,7 +26,9 @@ struct type *word_type, *uword_type, *int_type, *uint_type, *long_type, *ulong_type, +#ifndef NOFLOAT *float_type, *double_type, +#endif NOFLOAT *void_type, *label_type, *string_type, *funint_type, *error_type; diff --git a/lang/cem/cemcom/type.str b/lang/cem/cemcom/type.str index 9524ef169..837ebc85c 100644 --- a/lang/cem/cemcom/type.str +++ b/lang/cem/cemcom/type.str @@ -33,7 +33,9 @@ extern struct type *word_type, *uword_type, *int_type, *uint_type, *long_type, *ulong_type, +#ifndef NOFLOAT *float_type, *double_type, +#endif NOFLOAT *void_type, *label_type, *string_type, *funint_type, *error_type;