simplified 'tes' mechanism

This commit is contained in:
ceriel 1991-01-31 15:17:04 +00:00
parent 2a852dcff1
commit ae5dded36f
7 changed files with 17 additions and 63 deletions

View file

@ -172,16 +172,6 @@ oldnum(lp) num_p lp; {
oldcore((short *) lp,sizeof(num_t)); oldcore((short *) lp,sizeof(num_t));
} }
lblst_p newlblst() {
return((lblst_p) newcore(sizeof(lblst_t)));
}
oldlblst(lbp) lblst_p lbp; {
oldcore((short *) lbp, sizeof(lblst_t));
}
offset *newrom() { offset *newrom() {
return((offset *) newcore(MAXROM*sizeof(offset))); return((offset *) newcore(MAXROM*sizeof(offset)));

View file

@ -8,7 +8,6 @@ extern line_p newline();
extern offset *newrom(); extern offset *newrom();
extern sym_p newsym(); extern sym_p newsym();
extern num_p newnum(); extern num_p newnum();
extern lblst_p newlblst();
extern arg_p newarg(); extern arg_p newarg();
extern argb_p newargb(); extern argb_p newargb();
extern reg_p newreg(); extern reg_p newreg();

View file

@ -104,7 +104,6 @@ symknown() {
cleanlocals() { cleanlocals() {
register num_p *npp,np,tp; register num_p *npp,np,tp;
delete_labels();
for (npp = curpro.numhash; npp < &curpro.numhash[NNUMHASH]; npp++) { for (npp = curpro.numhash; npp < &curpro.numhash[NNUMHASH]; npp++) {
np = *npp; np = *npp;
while (np != (num_p) 0) { while (np != (num_p) 0) {

View file

@ -10,7 +10,7 @@ struct num {
unsigned n_jumps; unsigned n_jumps;
num_p n_repl; num_p n_repl;
short n_flags; short n_flags;
lblst_p n_lst_elt; short n_size; /* size of element on top at this label */
line_p n_line; line_p n_line;
}; };
@ -22,6 +22,7 @@ struct num {
#define NUMSCAN 000020 #define NUMSCAN 000020
#define NUMSET 000040 #define NUMSET 000040
#define NUMCOND 000100 #define NUMCOND 000100
#define NUMFALLTHROUGH 000200
#define NNUMHASH 37 #define NNUMHASH 37
extern num_p numlookup(); extern num_p numlookup();

View file

@ -80,18 +80,19 @@ outregs() {
/* outtes() handles the output of the top elt. messages */ /* outtes() handles the output of the top elt. messages */
outtes() { outtes() {
register lblst_p lp = est_list; register num_p *npp, np;
while(lp != NULL) { for (npp=curpro.numhash;npp< &curpro.numhash[NNUMHASH]; npp++) {
if ((lp->ll_size != 0) && !(lp->ll_num->n_flags & NUMCOND)) { for (np = *npp; np != (num_p) 0; np=np->n_next) {
if (! (np->n_flags & NUMSET) || np->n_size == 0 ||
(np->n_flags & NUMCOND)) continue;
outinst(ps_mes); outinst(ps_mes);
outoff((offset)ms_tes); outoff((offset)ms_tes);
outoff((offset)lp->ll_num->n_number); outoff((offset)np->n_number);
outoff((offset)lp->ll_size); outoff((offset)np->n_size);
outoff((offset)lp->ll_fallthrough); outoff((offset)((np->n_flags & NUMFALLTHROUGH) ? 1 : 0));
outinst(sp_cend); outinst(sp_cend);
} }
lp = lp->ll_next;
} }
} }

View file

@ -28,8 +28,6 @@ extern char flow_tab[];
#define ISABRANCH(i) (flow_tab[i]&HASLABEL) #define ISABRANCH(i) (flow_tab[i]&HASLABEL)
#define ISCONDBRANCH(i) (flow_tab[i]&CONDBRA) #define ISCONDBRANCH(i) (flow_tab[i]&CONDBRA)
lblst_p est_list = NULL;
#define INSTR(lnp) (lnp->l_instr & BMASK) #define INSTR(lnp) (lnp->l_instr & BMASK)
#define TYPE(lnp) lnp->l_optyp #define TYPE(lnp) lnp->l_optyp
#define PREV(lnp) lnp->l_prev #define PREV(lnp) lnp->l_prev
@ -46,7 +44,6 @@ init_state()
{ {
stacktop = 0; stacktop = 0;
state = KNOWN; state = KNOWN;
est_list = NULL;
} }
tes_pseudos() tes_pseudos()
@ -161,37 +158,17 @@ line_p lnp;
} }
} }
delete_labels()
{
register lblst_p tmp;
while ((tmp = est_list) != NULL) {
est_list = est_list->ll_next;
oldlblst(tmp);
}
}
assign_label(label) assign_label(label)
num_p label; register num_p label;
{ {
register lblst_p lst_elt;
if (label->n_flags & NUMSET) { if (label->n_flags & NUMSET) {
lst_elt = label->n_lst_elt; if (state == NOTREACHED || stacktop > label->n_size) {
if (state == NOTREACHED || stacktop > lst_elt->ll_size) { stacktop = label->n_size;
stacktop = lst_elt->ll_size; } else if ( stacktop < label->n_size) {
} else if ( stacktop < lst_elt->ll_size) { label->n_size = stacktop;
lst_elt->ll_size = stacktop;
} }
} else { } else {
lst_elt = newlblst(); label->n_size = stacktop;
lst_elt->ll_next = est_list;
lst_elt->ll_num = label;
lst_elt->ll_size = stacktop;
est_list = lst_elt;
label->n_lst_elt = lst_elt;
label->n_flags |= NUMSET; label->n_flags |= NUMSET;
} }
} }
@ -206,9 +183,8 @@ line_p lnp;
if (instr == op_lab) { if (instr == op_lab) {
if (state == NOTREACHED) { if (state == NOTREACHED) {
label->n_lst_elt->ll_fallthrough = FALSE;
} else { } else {
label->n_lst_elt->ll_fallthrough = TRUE; label->n_flags |= NUMFALLTHROUGH;
} }
} else if (ISCONDBRANCH(instr)) { /* conditional branch */ } else if (ISCONDBRANCH(instr)) { /* conditional branch */
label->n_flags |= NUMCOND; label->n_flags |= NUMCOND;

View file

@ -3,18 +3,6 @@
*/ */
/* $Header$ */ /* $Header$ */
typedef struct label_list *lblst_p;
struct label_list {
lblst_p ll_next; /* pointer to next label in the list */
num_p ll_num; /* pointer to label definition */
short ll_size; /* size of the element on top at this label */
char ll_fallthrough; /* is the label reached by fallthrough ? */
};
typedef struct label_list lblst_t;
extern lblst_p est_list;
extern int state; extern int state;
#define KNOWN 1 #define KNOWN 1
#define NOTREACHED 2 #define NOTREACHED 2