diff --git a/lang/cem/cemcom/code.c b/lang/cem/cemcom/code.c index 77c530a16..788e4dbd4 100644 --- a/lang/cem/cemcom/code.c +++ b/lang/cem/cemcom/code.c @@ -174,9 +174,7 @@ begin_proc(name, def) /* to be called when entering a procedure */ if (strcmp(last_fn_given, FileName) != 0) { /* previous function came from other file */ C_df_dlb(file_name_label = data_label()); - C_con_begin(); - C_scon(last_fn_given = FileName, (arith)0); - C_con_end(); + C_con_scon(last_fn_given = FileName, (arith)0); } /* enable debug trace of EM source */ C_fil_dlb(file_name_label, (arith)0); diff --git a/lang/cem/cemcom/em.c b/lang/cem/cemcom/em.c index 62c6024d9..eb1131cc6 100644 --- a/lang/cem/cemcom/em.c +++ b/lang/cem/cemcom/em.c @@ -61,30 +61,6 @@ C_busy() return ofd >= 0; /* true if code is being generated */ } -/*** front end for generating long CON/ROM lists ***/ -static arg_count; -static arg_rom; - -DC_start(rom){ - arg_count = 0; - arg_rom = rom; -} - -DC_check(){ - if (arg_count++ >= MAX_ARG_CNT) { - switch (arg_rom) { - case ps_con: - C_con_end(); - C_con_begin(); - break; - case ps_rom: - C_rom_end(); - C_rom_begin(); - break; - } - } -} - /*** the compact code generating routines ***/ #define fit16i(x) ((x) >= (long)0xFFFF8000 && (x) <= (long)0x00007FFF) #define fit8u(x) ((x) <= 0xFF) /* x is already unsigned */ diff --git a/lang/cem/cemcom/emcode.def b/lang/cem/cemcom/emcode.def index 5cc32d222..0e27dcc5f 100644 --- a/lang/cem/cemcom/emcode.def +++ b/lang/cem/cemcom/emcode.def @@ -85,22 +85,35 @@ C_df_ilb(l) | label l; | ILB(l) C_bss_cst(n, w, i) | arith n, w; int i; | PS(ps_bss), DCST(n), CST(w), CST((arith)i) % -C_con_begin() | | DC_start(ps_con), PS(ps_con) -C_con_end() | | CEND() -C_rom_begin() | | DC_start(ps_rom), PS(ps_rom) -C_rom_end() | | CEND() -C_cst(l) | arith l; | DC_check(), CST(l) -C_icon(val, siz) | char *val; arith siz; | - DC_check(), WCON(sp_icon, val, siz) -C_ucon(val, siz) | char *val; arith siz; | - DC_check(), WCON(sp_ucon, val, siz) -C_fcon(val, siz) | char *val; arith siz; | - DC_check(), WCON(sp_fcon, val, siz) -C_scon(str, siz) | char *str; arith siz; | DC_check(), CSTR(str) -C_dnam(str, val) | char *str; arith val; | DC_check(), NOFF(str, val) -C_dlb(l, val) | label l; arith val; | DC_check(), DOFF(l, val) -C_pnam(str) | char *str; | DC_check(), PNAM(str) -C_ilb(l) | label l; | DC_check(), ILB(l) +C_con_icon(val, siz) | char *val; arith siz; | + PS(ps_con), WCON(sp_icon, val, siz), CEND() +C_con_ucon(val, siz) | char *val; arith siz; | + PS(ps_con), WCON(sp_ucon, val, siz), CEND() +C_con_fcon(val, siz) | char *val; arith siz; | + PS(ps_con), WCON(sp_fcon, val, siz), CEND() +C_con_scon(str, siz) | char *str; arith siz; | PS(ps_con), CSTR(str), CEND() +C_con_dnam(str, val) | char *str; arith val; | + PS(ps_con), NOFF(str, val), CEND() +C_con_dlb(l, val) | label l; arith val; | + PS(ps_con), DOFF(l, val), CEND() +C_con_pnam(str) | char *str; | PS(ps_con), PNAM(str), CEND() +% +C_rom_cst(l) | arith l; | PS(ps_rom), CST(l), CEND() +C_rom_icon(val, siz) | char *val; arith siz; | + PS(ps_rom), WCON(sp_icon, val, siz), CEND() +C_rom_fcon(val, siz) | char *val; arith siz; | + PS(ps_rom), WCON(sp_fcon, val, siz), CEND() +C_rom_ilb(l) | label l; | PS(ps_rom), ILB(l), CEND() +% +C_cst(l) | arith l; | CST(l) +C_icon(val, siz) | char *val; arith siz; | WCON(sp_icon, val, siz) +C_ucon(val, siz) | char *val; arith siz; | WCON(sp_ucon, val, siz) +C_fcon(val, siz) | char *val; arith siz; | WCON(sp_fcon, val, siz) +C_scon(str, siz) | char *str; arith siz; | CSTR(str) +C_dnam(str, val) | char *str; arith val; | NOFF(str, val) +C_dlb(l, val) | label l; arith val; | DOFF(l, val) +C_pnam(str) | char *str; | PNAM(str) +C_ilb(l) | label l; | ILB(l) % C_pro_narg(p1) | char *p1; | PS(ps_pro), PNAM(p1), CEND() C_end(l) | arith l; | PS(ps_end), CST(l) diff --git a/lang/cem/cemcom/eval.c b/lang/cem/cemcom/eval.c index a0868ebca..d3e38a5eb 100644 --- a/lang/cem/cemcom/eval.c +++ b/lang/cem/cemcom/eval.c @@ -88,9 +88,7 @@ EVAL(expr, val, code, true_label, false_label) label datlab = data_label(); C_df_dlb(datlab); - C_con_begin(); - C_scon(expr->SG_VALUE, (arith)0); - C_con_end(); + C_con_scon(expr->SG_VALUE, (arith)0); C_lae_dlb(datlab, (arith)0); } break; @@ -100,9 +98,7 @@ EVAL(expr, val, code, true_label, false_label) label datlab = data_label(); C_df_dlb(datlab); - C_rom_begin(); - C_fcon(expr->FL_VALUE, expr->ex_type->tp_size); - C_rom_end(); + C_rom_fcon(expr->FL_VALUE, expr->ex_type->tp_size); C_lae_dlb(datlab, (arith)0); C_loi(expr->ex_type->tp_size); } @@ -1019,9 +1015,7 @@ load_cst(val, siz) label datlab; C_df_dlb(datlab = data_label()); - C_rom_begin(); - C_icon(itos(val), siz); - C_rom_end(); + C_rom_icon(itos(val), siz); C_lae_dlb(datlab, (arith)0); C_loi(siz); } diff --git a/lang/cem/cemcom/ival.c b/lang/cem/cemcom/ival.c index 67c29c409..baf2b5e65 100644 --- a/lang/cem/cemcom/ival.c +++ b/lang/cem/cemcom/ival.c @@ -23,11 +23,10 @@ extern char *symbol2str(); -#define con_byte(c) C_ucon(itos((long)(c) & 0xFF), (arith)1) +#define con_byte(c) C_con_ucon(itos((long)(c) & 0xFF), (arith)1) struct expr *do_array(), *do_struct(), *IVAL(); struct expr *strings = 0; /* list of string constants within initialiser */ -static ConStarted; /* indicates the generation of a 'con' pseudo */ /* do_ival() performs the initialisation of a global variable of type tp with the initialisation expression expr by calling IVAL(). @@ -37,9 +36,9 @@ do_ival(tpp, expr) struct type **tpp; struct expr *expr; { - ConStarted = 0; if (IVAL(tpp, expr) != 0) too_many_initialisers(expr); + /* The following loop declares the string constants used in the initialisation. The code for these string constants may not appear in @@ -47,12 +46,9 @@ do_ival(tpp, expr) in EM causes the current initialisation to be completed. E.g. char *s[] = {"hello", "world"}; */ - C_con_end(); while (strings != 0) { C_df_dlb(strings->SG_DATLAB); - C_con_begin(); - C_scon(strings->SG_VALUE, (arith)0); - C_con_end(); + C_con_scon(strings->SG_VALUE, (arith)0); strings = strings->next; } } @@ -341,8 +337,7 @@ check_and_pad(expr, tpp) /* no size specified upto here: just set it to the size of one member. */ - tp = *tpp = - construct_type(ARRAY, tp->tp_up, (arith)1); + tp = *tpp = construct_type(ARRAY, tp->tp_up, (arith)1); else { register dim = tp->tp_size / tp->tp_up->tp_size; /* pad remaining members with zeroes */ @@ -376,10 +371,6 @@ check_and_pad(expr, tpp) pad(tp) struct type *tp; { - if (ConStarted == 0) { - C_con_begin(); - ConStarted = 1; - } switch (tp->tp_fund) { case ARRAY: { @@ -420,11 +411,11 @@ pad(tp) case CHAR: case ENUM: case POINTER: - C_ucon("0", tp->tp_size); + C_con_ucon("0", tp->tp_size); break; case FLOAT: case DOUBLE: - C_fcon("0", tp->tp_size); + C_con_fcon("0", tp->tp_size); break; case UNION: error("initialisation of unions not allowed"); @@ -463,10 +454,6 @@ check_ival(expr, type) break; } ch7cast(&expr, '=', type); - if (ConStarted == 0) { - C_con_begin(); - ConStarted = 1; - } con_int(expr); break; #ifndef NOBITFIELD @@ -485,26 +472,18 @@ check_ival(expr, type) break; } ch7cast(&expr, '=', type); - if (ConStarted == 0) { - C_con_begin(); - ConStarted = 1; - } con_int(expr); break; case FLOAT: case DOUBLE: ch7cast(&expr, '=', type); - if (ConStarted == 0) { - C_con_begin(); - ConStarted = 1; - } if (expr->ex_class == Float) - C_fcon(expr->FL_VALUE, expr->ex_type->tp_size); + C_con_fcon(expr->FL_VALUE, expr->ex_type->tp_size); else if (expr->ex_class == Oper && expr->OP_OPER == INT2FLOAT) { expr = expr->OP_RIGHT; if (expr->ex_class == Value && expr->VL_IDF == 0) - C_fcon(itos(expr->VL_VALUE), type->tp_size); + C_con_fcon(itos(expr->VL_VALUE), type->tp_size); else illegal_init_cst(expr); } @@ -521,13 +500,8 @@ check_ival(expr, type) { label datlab = data_label(); - if (ConStarted) - C_con_end(); - else - ConStarted = 1; /* ??? */ C_ina_pt(datlab); - C_con_begin(); - C_dlb(datlab, (arith)0); + C_con_dlb(datlab, (arith)0); expr->SG_DATLAB = datlab; store_string(expr); break; @@ -538,13 +512,9 @@ check_ival(expr, type) struct idf *idf = vl->vl_idf; ASSERT(expr->ex_type->tp_fund == POINTER); - if (ConStarted == 0) { - C_con_begin(); - ConStarted = 1; - } if (expr->ex_type->tp_up->tp_fund == FUNCTION) { if (idf) - C_pnam(idf->id_text); + C_con_pnam(idf->id_text); else /* int (*func)() = 0 */ con_int(expr); } @@ -558,13 +528,16 @@ check_ival(expr, type) static int *p = &a; */ expr_error(expr, - "illegal initialisation"); + "illegal initialisation" + ); else - C_dlb((label)def->df_address, - vl->vl_value); + C_con_dlb( + (label)def->df_address, + vl->vl_value + ); } else - C_dnam(idf->id_text, vl->vl_value); + C_con_dnam(idf->id_text, vl->vl_value); } else con_int(expr); @@ -611,10 +584,6 @@ init_string(tpp, expr) expr_error(expr, "too many characters in initialiser string"); } - if (ConStarted == 0) { - C_con_begin(); - ConStarted = 1; - } /* throw out the characters of the already prepared string */ do con_byte(*s++); @@ -721,10 +690,6 @@ put_bf(tp, val) if (sd->sd_sdef == 0 || sd->sd_sdef->sd_offset != offset) { /* the selector was the last stored at this address */ expr.VL_VALUE = field; - if (ConStarted == 0) { - C_con_begin(); - ConStarted = 1; - } con_int(&expr); field = (arith)0; offset = (arith)-1; @@ -767,9 +732,9 @@ con_int(expr) register struct type *tp = expr->ex_type; if (tp->tp_unsigned) - C_ucon(itos(expr->VL_VALUE), tp->tp_size); + C_con_ucon(itos(expr->VL_VALUE), tp->tp_size); else - C_icon(itos(expr->VL_VALUE), tp->tp_size); + C_con_icon(itos(expr->VL_VALUE), tp->tp_size); } illegal_init_cst(expr) diff --git a/lang/cem/cemcom/switch.c b/lang/cem/cemcom/switch.c index 39cd033ab..8a695de2f 100644 --- a/lang/cem/cemcom/switch.c +++ b/lang/cem/cemcom/switch.c @@ -56,36 +56,33 @@ code_endswitch() C_df_ilb(sh->sh_table); /* switch table entry */ tablabel = data_label(); /* the rom must have a label */ C_df_dlb(tablabel); - C_rom_begin(); - C_ilb(sh->sh_default); + C_rom_ilb(sh->sh_default); if (compact(sh->sh_nrofentries, sh->sh_lowerbd, sh->sh_upperbd)) { /* CSA */ register arith val; - C_cst(sh->sh_lowerbd); - C_cst(sh->sh_upperbd - sh->sh_lowerbd); + C_rom_cst(sh->sh_lowerbd); + C_rom_cst(sh->sh_upperbd - sh->sh_lowerbd); ce = sh->sh_entries; for (val = sh->sh_lowerbd; val <= sh->sh_upperbd; val++) { ASSERT(ce); if (val == ce->ce_value) { - C_ilb(ce->ce_label); + C_rom_ilb(ce->ce_label); ce = ce->next; } else - C_ilb(sh->sh_default); + C_rom_ilb(sh->sh_default); } - C_rom_end(); C_lae_dlb(tablabel, (arith)0); /* perform the switch */ C_csa(sh->sh_type->tp_size); } else { /* CSB */ - C_cst((arith)sh->sh_nrofentries); + C_rom_cst((arith)sh->sh_nrofentries); for (ce = sh->sh_entries; ce; ce = ce->next) { /* generate the entries: value + prog.label */ - C_cst(ce->ce_value); - C_ilb(ce->ce_label); + C_rom_cst(ce->ce_value); + C_rom_ilb(ce->ce_label); } - C_rom_end(); C_lae_dlb(tablabel, (arith)0); /* perform the switch */ C_csb(sh->sh_type->tp_size); }