changed stackheight computation to top element size computation
This commit is contained in:
parent
3ea64975af
commit
58355b7041
15 changed files with 291 additions and 59 deletions
|
@ -2,11 +2,11 @@
|
||||||
|
|
||||||
EMHOME=../..
|
EMHOME=../..
|
||||||
CFILES=main.c getline.c lookup.c var.c process.c backward.c util.c \
|
CFILES=main.c getline.c lookup.c var.c process.c backward.c util.c \
|
||||||
alloc.c putline.c cleanup.c peephole.c flow.c reg.c shc.c \
|
alloc.c putline.c cleanup.c peephole.c flow.c reg.c tes.c \
|
||||||
pop_push.c
|
pop_push.c
|
||||||
|
|
||||||
OFILES=main.o getline.o lookup.o var.o process.o backward.o util.o\
|
OFILES=main.o getline.o lookup.o var.o process.o backward.o util.o\
|
||||||
alloc.o putline.o cleanup.o peephole.o flow.o shc.o pop_push.o
|
alloc.o putline.o cleanup.o peephole.o flow.o tes.o pop_push.o
|
||||||
ONOGLOB=regnoglob.o
|
ONOGLOB=regnoglob.o
|
||||||
OGLOB=regglob.o
|
OGLOB=regglob.o
|
||||||
LIBS=$(EMHOME)/lib/em_data.a
|
LIBS=$(EMHOME)/lib/em_data.a
|
||||||
|
@ -98,7 +98,7 @@ regglob.o: reg.c
|
||||||
main.o: alloc.h
|
main.o: alloc.h
|
||||||
main.o: ext.h
|
main.o: ext.h
|
||||||
main.o: param.h
|
main.o: param.h
|
||||||
main.o: shc.h
|
main.o: tes.h
|
||||||
main.o: types.h
|
main.o: types.h
|
||||||
getline.o: alloc.h
|
getline.o: alloc.h
|
||||||
getline.o: ext.h
|
getline.o: ext.h
|
||||||
|
@ -106,18 +106,18 @@ getline.o: line.h
|
||||||
getline.o: lookup.h
|
getline.o: lookup.h
|
||||||
getline.o: param.h
|
getline.o: param.h
|
||||||
getline.o: proinf.h
|
getline.o: proinf.h
|
||||||
getline.o: shc.h
|
getline.o: tes.h
|
||||||
getline.o: types.h
|
getline.o: types.h
|
||||||
lookup.o: alloc.h
|
lookup.o: alloc.h
|
||||||
lookup.o: lookup.h
|
lookup.o: lookup.h
|
||||||
lookup.o: param.h
|
lookup.o: param.h
|
||||||
lookup.o: proinf.h
|
lookup.o: proinf.h
|
||||||
lookup.o: shc.h
|
lookup.o: tes.h
|
||||||
lookup.o: types.h
|
lookup.o: types.h
|
||||||
var.o: lookup.h
|
var.o: lookup.h
|
||||||
var.o: param.h
|
var.o: param.h
|
||||||
var.o: proinf.h
|
var.o: proinf.h
|
||||||
var.o: shc.h
|
var.o: tes.h
|
||||||
var.o: types.h
|
var.o: types.h
|
||||||
process.o: alloc.h
|
process.o: alloc.h
|
||||||
process.o: assert.h
|
process.o: assert.h
|
||||||
|
@ -126,7 +126,7 @@ process.o: line.h
|
||||||
process.o: lookup.h
|
process.o: lookup.h
|
||||||
process.o: param.h
|
process.o: param.h
|
||||||
process.o: proinf.h
|
process.o: proinf.h
|
||||||
process.o: shc.h
|
process.o: tes.h
|
||||||
process.o: types.h
|
process.o: types.h
|
||||||
backward.o: alloc.h
|
backward.o: alloc.h
|
||||||
backward.o: assert.h
|
backward.o: assert.h
|
||||||
|
@ -135,7 +135,7 @@ backward.o: line.h
|
||||||
backward.o: lookup.h
|
backward.o: lookup.h
|
||||||
backward.o: param.h
|
backward.o: param.h
|
||||||
backward.o: proinf.h
|
backward.o: proinf.h
|
||||||
backward.o: shc.h
|
backward.o: tes.h
|
||||||
backward.o: types.h
|
backward.o: types.h
|
||||||
util.o: assert.h
|
util.o: assert.h
|
||||||
util.o: ext.h
|
util.o: ext.h
|
||||||
|
@ -143,7 +143,7 @@ util.o: lookup.h
|
||||||
util.o: optim.h
|
util.o: optim.h
|
||||||
util.o: param.h
|
util.o: param.h
|
||||||
util.o: proinf.h
|
util.o: proinf.h
|
||||||
util.o: shc.h
|
util.o: tes.h
|
||||||
util.o: types.h
|
util.o: types.h
|
||||||
alloc.o: alloc.h
|
alloc.o: alloc.h
|
||||||
alloc.o: assert.h
|
alloc.o: assert.h
|
||||||
|
@ -151,7 +151,7 @@ alloc.o: line.h
|
||||||
alloc.o: lookup.h
|
alloc.o: lookup.h
|
||||||
alloc.o: param.h
|
alloc.o: param.h
|
||||||
alloc.o: proinf.h
|
alloc.o: proinf.h
|
||||||
alloc.o: shc.h
|
alloc.o: tes.h
|
||||||
alloc.o: types.h
|
alloc.o: types.h
|
||||||
putline.o: alloc.h
|
putline.o: alloc.h
|
||||||
putline.o: assert.h
|
putline.o: assert.h
|
||||||
|
@ -161,7 +161,7 @@ putline.o: lookup.h
|
||||||
putline.o: optim.h
|
putline.o: optim.h
|
||||||
putline.o: param.h
|
putline.o: param.h
|
||||||
putline.o: proinf.h
|
putline.o: proinf.h
|
||||||
putline.o: shc.h
|
putline.o: tes.h
|
||||||
putline.o: types.h
|
putline.o: types.h
|
||||||
cleanup.o: assert.h
|
cleanup.o: assert.h
|
||||||
cleanup.o: ext.h
|
cleanup.o: ext.h
|
||||||
|
@ -177,7 +177,7 @@ peephole.o: optim.h
|
||||||
peephole.o: param.h
|
peephole.o: param.h
|
||||||
peephole.o: pattern.h
|
peephole.o: pattern.h
|
||||||
peephole.o: proinf.h
|
peephole.o: proinf.h
|
||||||
peephole.o: shc.h
|
peephole.o: tes.h
|
||||||
peephole.o: types.h
|
peephole.o: types.h
|
||||||
flow.o: alloc.h
|
flow.o: alloc.h
|
||||||
flow.o: ext.h
|
flow.o: ext.h
|
||||||
|
@ -185,7 +185,7 @@ flow.o: line.h
|
||||||
flow.o: optim.h
|
flow.o: optim.h
|
||||||
flow.o: param.h
|
flow.o: param.h
|
||||||
flow.o: proinf.h
|
flow.o: proinf.h
|
||||||
flow.o: shc.h
|
flow.o: tes.h
|
||||||
flow.o: types.h
|
flow.o: types.h
|
||||||
reg.o: alloc.h
|
reg.o: alloc.h
|
||||||
reg.o: assert.h
|
reg.o: assert.h
|
||||||
|
@ -193,17 +193,17 @@ reg.o: ext.h
|
||||||
reg.o: line.h
|
reg.o: line.h
|
||||||
reg.o: param.h
|
reg.o: param.h
|
||||||
reg.o: proinf.h
|
reg.o: proinf.h
|
||||||
reg.o: shc.h
|
reg.o: tes.h
|
||||||
reg.o: types.h
|
reg.o: types.h
|
||||||
shc.o: alloc.h
|
tes.o: alloc.h
|
||||||
shc.o: assert.h
|
tes.o: assert.h
|
||||||
shc.o: ext.h
|
tes.o: ext.h
|
||||||
shc.o: line.h
|
tes.o: line.h
|
||||||
shc.o: param.h
|
tes.o: param.h
|
||||||
shc.o: pop_push.h
|
tes.o: pop_push.h
|
||||||
shc.o: proinf.h
|
tes.o: proinf.h
|
||||||
shc.o: shc.h
|
tes.o: tes.h
|
||||||
shc.o: types.h
|
tes.o: types.h
|
||||||
pop_push.o: pop_push.h
|
pop_push.o: pop_push.h
|
||||||
pattern.o: param.h
|
pattern.o: param.h
|
||||||
pattern.o: pattern.h
|
pattern.o: pattern.h
|
||||||
|
@ -214,7 +214,7 @@ regglob.o: ext.h
|
||||||
regglob.o: line.h
|
regglob.o: line.h
|
||||||
regglob.o: param.h
|
regglob.o: param.h
|
||||||
regglob.o: proinf.h
|
regglob.o: proinf.h
|
||||||
regglob.o: shc.h
|
regglob.o: tes.h
|
||||||
regglob.o: types.h
|
regglob.o: types.h
|
||||||
regnoglob.o: alloc.h
|
regnoglob.o: alloc.h
|
||||||
regnoglob.o: assert.h
|
regnoglob.o: assert.h
|
||||||
|
@ -222,5 +222,5 @@ regnoglob.o: ext.h
|
||||||
regnoglob.o: line.h
|
regnoglob.o: line.h
|
||||||
regnoglob.o: param.h
|
regnoglob.o: param.h
|
||||||
regnoglob.o: proinf.h
|
regnoglob.o: proinf.h
|
||||||
regnoglob.o: shc.h
|
regnoglob.o: tes.h
|
||||||
regnoglob.o: types.h
|
regnoglob.o: types.h
|
||||||
|
|
|
@ -5,7 +5,7 @@ static char rcsid[] = "$Header$";
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "param.h"
|
#include "param.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "shc.h"
|
#include "tes.h"
|
||||||
#include "assert.h"
|
#include "assert.h"
|
||||||
#include "alloc.h"
|
#include "alloc.h"
|
||||||
#include "line.h"
|
#include "line.h"
|
||||||
|
|
|
@ -4,7 +4,7 @@ static char rcsid[] = "$Header$";
|
||||||
|
|
||||||
#include "param.h"
|
#include "param.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "shc.h"
|
#include "tes.h"
|
||||||
#include "assert.h"
|
#include "assert.h"
|
||||||
#include "line.h"
|
#include "line.h"
|
||||||
#include "lookup.h"
|
#include "lookup.h"
|
||||||
|
|
|
@ -4,7 +4,7 @@ static char rcsid[] = "$Header$";
|
||||||
|
|
||||||
#include "param.h"
|
#include "param.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "shc.h"
|
#include "tes.h"
|
||||||
#include <em_flag.h>
|
#include <em_flag.h>
|
||||||
#include <em_spec.h>
|
#include <em_spec.h>
|
||||||
#include <em_mnem.h>
|
#include <em_mnem.h>
|
||||||
|
|
|
@ -5,7 +5,7 @@ static char rcsid[] = "$Header$";
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "param.h"
|
#include "param.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "shc.h"
|
#include "tes.h"
|
||||||
#include "line.h"
|
#include "line.h"
|
||||||
#include "lookup.h"
|
#include "lookup.h"
|
||||||
#include "alloc.h"
|
#include "alloc.h"
|
||||||
|
@ -468,7 +468,7 @@ int inpseudo(n) short n; {
|
||||||
lnp=newline(OPNO);
|
lnp=newline(OPNO);
|
||||||
n=ps_exc; /* kludge to force out this line */
|
n=ps_exc; /* kludge to force out this line */
|
||||||
break;
|
break;
|
||||||
case ms_sth:
|
case ms_tes:
|
||||||
tstinpro();
|
tstinpro();
|
||||||
oldline(lnp);
|
oldline(lnp);
|
||||||
lnp=newline(OPNO);
|
lnp=newline(OPNO);
|
||||||
|
|
|
@ -4,7 +4,7 @@ static char rcsid[] = "$Header$";
|
||||||
|
|
||||||
#include "param.h"
|
#include "param.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "shc.h"
|
#include "tes.h"
|
||||||
#include "lookup.h"
|
#include "lookup.h"
|
||||||
#include "alloc.h"
|
#include "alloc.h"
|
||||||
#include "proinf.h"
|
#include "proinf.h"
|
||||||
|
|
|
@ -5,7 +5,7 @@ static char rcsid[] = "$Header$";
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "param.h"
|
#include "param.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "shc.h"
|
#include "tes.h"
|
||||||
#include "alloc.h"
|
#include "alloc.h"
|
||||||
#include <em_spec.h>
|
#include <em_spec.h>
|
||||||
#include "ext.h"
|
#include "ext.h"
|
||||||
|
|
|
@ -4,7 +4,7 @@ static char rcsid[] = "$Header$";
|
||||||
|
|
||||||
#include "param.h"
|
#include "param.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "shc.h"
|
#include "tes.h"
|
||||||
#include "assert.h"
|
#include "assert.h"
|
||||||
#include "line.h"
|
#include "line.h"
|
||||||
#include "lookup.h"
|
#include "lookup.h"
|
||||||
|
|
|
@ -4,7 +4,7 @@ static char rcsid[] = "$Header$";
|
||||||
|
|
||||||
#include "param.h"
|
#include "param.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "shc.h"
|
#include "tes.h"
|
||||||
#include "assert.h"
|
#include "assert.h"
|
||||||
#include <em_spec.h>
|
#include <em_spec.h>
|
||||||
#include <em_pseu.h>
|
#include <em_pseu.h>
|
||||||
|
@ -42,10 +42,10 @@ process() {
|
||||||
} while (madeopt && ++npasses < 5000);
|
} while (madeopt && ++npasses < 5000);
|
||||||
assert(!madeopt);
|
assert(!madeopt);
|
||||||
}
|
}
|
||||||
do_shc(); /* stackheight computation phase */
|
do_tes(); /* top elt. size computation phase */
|
||||||
outpro(); /* generate PRO pseudo */
|
outpro(); /* generate PRO pseudo */
|
||||||
outregs(); /* generate MES ms_reg pseudos */
|
outregs(); /* generate MES ms_reg pseudos */
|
||||||
outsth(); /* generate MES ms_sth pseudos */
|
outtes(); /* generate MES ms_tes pseudos */
|
||||||
}
|
}
|
||||||
putlines(pseudos); /* pseudos first */
|
putlines(pseudos); /* pseudos first */
|
||||||
if (prodepth != 0) {
|
if (prodepth != 0) {
|
||||||
|
@ -190,16 +190,16 @@ symvalue() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
do_shc()
|
do_tes()
|
||||||
{
|
{
|
||||||
register line_p insptr = instrs, oldlin = NULL;
|
register line_p insptr = instrs, oldlin = NULL;
|
||||||
|
|
||||||
init_state();
|
init_state();
|
||||||
shc_pseudos();
|
tes_pseudos();
|
||||||
while (insptr != NULL) {
|
while (insptr != NULL) {
|
||||||
insptr->l_prev = oldlin;
|
insptr->l_prev = oldlin;
|
||||||
oldlin = insptr;
|
oldlin = insptr;
|
||||||
shc_instr(insptr);
|
tes_instr(insptr);
|
||||||
insptr = insptr->l_next;
|
insptr = insptr->l_next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ static char rcsid[] = "$Header$";
|
||||||
|
|
||||||
#include "param.h"
|
#include "param.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "shc.h"
|
#include "tes.h"
|
||||||
#include "assert.h"
|
#include "assert.h"
|
||||||
#include <em_spec.h>
|
#include <em_spec.h>
|
||||||
#include <em_pseu.h>
|
#include <em_pseu.h>
|
||||||
|
|
|
@ -6,7 +6,7 @@ static char rcsid[] = "$Header$";
|
||||||
#include "param.h"
|
#include "param.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "line.h"
|
#include "line.h"
|
||||||
#include "shc.h"
|
#include "tes.h"
|
||||||
#include "proinf.h"
|
#include "proinf.h"
|
||||||
#include "alloc.h"
|
#include "alloc.h"
|
||||||
#include <em_spec.h>
|
#include <em_spec.h>
|
||||||
|
@ -78,18 +78,16 @@ outregs() {
|
||||||
curpro.freg = (reg_p) 0;
|
curpro.freg = (reg_p) 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* outsth() handles the output of the stackheight messages */
|
/* outtes() handles the output of the top elt. messages */
|
||||||
outsth() {
|
outtes() {
|
||||||
register lblst_p lp = est_list;
|
register lblst_p lp = est_list;
|
||||||
|
|
||||||
if (state == NO_STACK_MES) return;
|
|
||||||
|
|
||||||
while(lp != NULL) {
|
while(lp != NULL) {
|
||||||
if ((lp->ll_height != 0) && !(lp->ll_num->n_flags & NUMCOND)) {
|
if ((lp->ll_size != 0) && !(lp->ll_num->n_flags & NUMCOND)) {
|
||||||
outinst(ps_mes);
|
outinst(ps_mes);
|
||||||
outoff((offset)ms_sth);
|
outoff((offset)ms_tes);
|
||||||
outoff((offset)lp->ll_num->n_number);
|
outoff((offset)lp->ll_num->n_number);
|
||||||
outoff((offset)lp->ll_height);
|
outoff((offset)lp->ll_size);
|
||||||
outoff((offset)lp->ll_fallthrough);
|
outoff((offset)lp->ll_fallthrough);
|
||||||
outinst(sp_cend);
|
outinst(sp_cend);
|
||||||
}
|
}
|
||||||
|
|
214
util/opt/tes.c
Normal file
214
util/opt/tes.c
Normal file
|
@ -0,0 +1,214 @@
|
||||||
|
#ifndef NORCSID
|
||||||
|
static char rcsid[] = "$Header$";
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* This file contains the main part of the top element size computation phase.
|
||||||
|
*
|
||||||
|
* Author: Hans van Eck.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <em_spec.h>
|
||||||
|
#include <em_mnem.h>
|
||||||
|
#include <em_pseu.h>
|
||||||
|
#include "param.h"
|
||||||
|
#include "assert.h"
|
||||||
|
#include "types.h"
|
||||||
|
#include "tes.h"
|
||||||
|
#include "alloc.h"
|
||||||
|
#include "proinf.h"
|
||||||
|
#include "line.h"
|
||||||
|
#include "ext.h"
|
||||||
|
#include "pop_push.h"
|
||||||
|
|
||||||
|
extern char *pop_push[];
|
||||||
|
extern char flow_tab[];
|
||||||
|
|
||||||
|
#define NON_CONTINUABLE(i) (flow_tab[i]&JUMP)
|
||||||
|
#define ISABRANCH(i) (flow_tab[i]&HASLABEL)
|
||||||
|
#define ISCONDBRANCH(i) (flow_tab[i]&CONDBRA)
|
||||||
|
|
||||||
|
lblst_p est_list = NULL;
|
||||||
|
|
||||||
|
#define INSTR(lnp) (lnp->l_instr & BMASK)
|
||||||
|
#define TYPE(lnp) lnp->l_optyp
|
||||||
|
#define PREV(lnp) lnp->l_prev
|
||||||
|
#define SHORT(lnp) lnp->l_a.la_short
|
||||||
|
#define MINI(lnp) ((lnp->l_optyp & BMASK) - Z_OPMINI)
|
||||||
|
|
||||||
|
#define IS_MINI(lnp) (lnp->l_optyp >= OPMINI)
|
||||||
|
#define IS_LOC(l) (l!=(line_p) 0 && INSTR(l)==op_loc && IS_MINI(l))
|
||||||
|
|
||||||
|
int state;
|
||||||
|
static int stacktop = 0;
|
||||||
|
|
||||||
|
init_state()
|
||||||
|
{
|
||||||
|
stacktop = 0;
|
||||||
|
state = KNOWN;
|
||||||
|
est_list = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
tes_pseudos()
|
||||||
|
{
|
||||||
|
register line_p lp;
|
||||||
|
|
||||||
|
for (lp = pseudos; lp != (line_p)0; lp = lp->l_next) {
|
||||||
|
switch(INSTR(lp)) {
|
||||||
|
case ps_con:
|
||||||
|
case ps_rom:
|
||||||
|
if (lp->l_optyp == OPLIST) {
|
||||||
|
register arg_p ap = lp->l_a.la_arg;
|
||||||
|
|
||||||
|
while (ap != (arg_p) 0) {
|
||||||
|
if (ap->a_typ == ARGNUM) {
|
||||||
|
assign_label(ap->a_a.a_np->n_repl);
|
||||||
|
}
|
||||||
|
ap = ap->a_next;
|
||||||
|
}
|
||||||
|
} else if (lp->l_optyp == OPNUMLAB)
|
||||||
|
assign_label(lp->l_a.la_np->n_repl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tes_instr(lnp)
|
||||||
|
line_p lnp;
|
||||||
|
{
|
||||||
|
char *s;
|
||||||
|
register instr = INSTR(lnp);
|
||||||
|
register int arg, argdef;
|
||||||
|
line_p x = PREV(lnp);
|
||||||
|
line_p y = (x == (line_p) 0 ? (line_p) 0 : PREV(x));
|
||||||
|
|
||||||
|
if (instr == op_lab) {
|
||||||
|
do_inst_label(lnp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (instr < sp_fmnem || instr > sp_lmnem) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state == NOTREACHED) return; /* What else ? */
|
||||||
|
s = pop_push[instr];
|
||||||
|
|
||||||
|
if (*s != '0') {
|
||||||
|
while (*s != '\0') {
|
||||||
|
if (*s++ == '-') { /* ignores asp -4 */
|
||||||
|
stacktop = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TYPE(lnp) == OPSHORT) {
|
||||||
|
arg = SHORT(lnp);
|
||||||
|
if (arg < wordsize) arg = wordsize;
|
||||||
|
argdef = TRUE;
|
||||||
|
} else if (IS_MINI(lnp)) {
|
||||||
|
arg = MINI(lnp);
|
||||||
|
if (arg > 0 && arg < wordsize) arg = wordsize;
|
||||||
|
if (arg < 0 && -arg < wordsize) arg = -wordsize;
|
||||||
|
argdef = TRUE;
|
||||||
|
} else {
|
||||||
|
argdef = FALSE;
|
||||||
|
}
|
||||||
|
switch (*s++) {
|
||||||
|
case 'w': stacktop = wordsize; break;
|
||||||
|
case 'd': stacktop = wordsize * 2; break;
|
||||||
|
case 'p': stacktop = pointersize; break;
|
||||||
|
case 'a':
|
||||||
|
if (argdef == FALSE || instr == op_ass) {
|
||||||
|
stacktop = 0;
|
||||||
|
} else {
|
||||||
|
stacktop = arg;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'x':
|
||||||
|
if (IS_LOC(x)) {
|
||||||
|
arg = MINI(x);
|
||||||
|
if (arg < wordsize) arg = wordsize;
|
||||||
|
stacktop = arg;
|
||||||
|
} else {
|
||||||
|
stacktop = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'y':
|
||||||
|
if (IS_LOC(y)) {
|
||||||
|
arg = MINI(y);
|
||||||
|
if (arg < wordsize) arg = wordsize;
|
||||||
|
stacktop = arg;
|
||||||
|
} else {
|
||||||
|
stacktop = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '?':
|
||||||
|
stacktop = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stacktop < 0) stacktop = 0;
|
||||||
|
|
||||||
|
if (ISABRANCH(instr)) do_inst_label(lnp);
|
||||||
|
if (NON_CONTINUABLE(instr)) {
|
||||||
|
state = NOTREACHED;
|
||||||
|
stacktop = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_labels()
|
||||||
|
{
|
||||||
|
register lblst_p tmp;
|
||||||
|
|
||||||
|
while ((tmp = est_list) != NULL) {
|
||||||
|
est_list = est_list->ll_next;
|
||||||
|
oldlblst(tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assign_label(label)
|
||||||
|
num_p label;
|
||||||
|
{
|
||||||
|
register lblst_p lst_elt;
|
||||||
|
|
||||||
|
if (label->n_flags & NUMSET) {
|
||||||
|
lst_elt = label->n_lst_elt;
|
||||||
|
if (state == NOTREACHED || stacktop > lst_elt->ll_size) {
|
||||||
|
stacktop = lst_elt->ll_size;
|
||||||
|
} else if ( stacktop < lst_elt->ll_size) {
|
||||||
|
lst_elt->ll_size = stacktop;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
lst_elt = newlblst();
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
do_inst_label(lnp) /* (re-)install a label */
|
||||||
|
line_p lnp;
|
||||||
|
{
|
||||||
|
num_p label = lnp->l_a.la_np->n_repl;
|
||||||
|
int instr = INSTR(lnp);
|
||||||
|
|
||||||
|
assign_label(label);
|
||||||
|
|
||||||
|
if (instr == op_lab) {
|
||||||
|
if (state == NOTREACHED) {
|
||||||
|
label->n_lst_elt->ll_fallthrough = FALSE;
|
||||||
|
} else {
|
||||||
|
label->n_lst_elt->ll_fallthrough = TRUE;
|
||||||
|
}
|
||||||
|
} else if (ISCONDBRANCH(instr)) { /* conditional branch */
|
||||||
|
label->n_flags |= NUMCOND;
|
||||||
|
}
|
||||||
|
state = KNOWN;
|
||||||
|
}
|
20
util/opt/tes.h
Normal file
20
util/opt/tes.h
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
* Author: Hans van Eck.
|
||||||
|
*/
|
||||||
|
/* $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;
|
||||||
|
#define KNOWN 1
|
||||||
|
#define NOTREACHED 2
|
|
@ -5,7 +5,7 @@ static char rcsid[] = "$Header$";
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "param.h"
|
#include "param.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "shc.h"
|
#include "tes.h"
|
||||||
#include "assert.h"
|
#include "assert.h"
|
||||||
#include "lookup.h"
|
#include "lookup.h"
|
||||||
#include "proinf.h"
|
#include "proinf.h"
|
||||||
|
|
|
@ -5,7 +5,7 @@ static char rcsid[] = "$Header$";
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "param.h"
|
#include "param.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "shc.h"
|
#include "tes.h"
|
||||||
#include "lookup.h"
|
#include "lookup.h"
|
||||||
#include "proinf.h"
|
#include "proinf.h"
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue