1984-05-19 11:42:19 +00:00
|
|
|
#ifndef NORCSID
|
|
|
|
static char rcsid[] = "$Header$";
|
|
|
|
#endif
|
|
|
|
|
1984-05-18 21:27:39 +00:00
|
|
|
#include "assert.h"
|
|
|
|
#include "param.h"
|
|
|
|
#include "tables.h"
|
|
|
|
#include "types.h"
|
|
|
|
#include <cg_pattern.h>
|
|
|
|
#include "data.h"
|
|
|
|
#include "result.h"
|
|
|
|
#include "extern.h"
|
|
|
|
|
|
|
|
/*
|
1987-03-10 01:26:51 +00:00
|
|
|
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
|
|
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
1984-05-18 21:27:39 +00:00
|
|
|
*
|
|
|
|
* Author: Hans van Staveren
|
|
|
|
*/
|
|
|
|
|
|
|
|
chrefcount(regno,amount,tflag) {
|
|
|
|
register struct reginfo *rp;
|
|
|
|
register i;
|
|
|
|
|
|
|
|
rp= &machregs[regno];
|
|
|
|
#if MAXMEMBERS!=0
|
|
|
|
if (rp->r_members[0]==0) {
|
|
|
|
#endif
|
|
|
|
rp->r_refcount += amount;
|
|
|
|
if (tflag)
|
|
|
|
rp->r_tcount += amount;
|
|
|
|
assert(rp->r_refcount >= 0);
|
|
|
|
#if MAXMEMBERS!=0
|
|
|
|
} else
|
|
|
|
for (i=0;i<MAXMEMBERS;i++)
|
|
|
|
if (rp->r_members[i]!=0)
|
|
|
|
chrefcount(rp->r_members[i],amount,tflag);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
1988-07-15 11:23:44 +00:00
|
|
|
getrefcount(regno, tflag) {
|
1984-05-18 21:27:39 +00:00
|
|
|
register struct reginfo *rp;
|
|
|
|
register i,maxcount;
|
|
|
|
|
|
|
|
rp= &machregs[regno];
|
|
|
|
#if MAXMEMBERS!=0
|
|
|
|
if (rp->r_members[0]==0)
|
|
|
|
#endif
|
1988-07-15 11:23:44 +00:00
|
|
|
return(rp->r_refcount - (tflag ? rp->r_tcount : 0));
|
1984-05-18 21:27:39 +00:00
|
|
|
#if MAXMEMBERS!=0
|
|
|
|
else {
|
|
|
|
maxcount=0;
|
|
|
|
for (i=0;i<MAXMEMBERS;i++)
|
|
|
|
if (rp->r_members[i]!=0)
|
1988-07-15 11:23:44 +00:00
|
|
|
maxcount=max(maxcount,getrefcount(rp->r_members[i], tflag));
|
1984-05-18 21:27:39 +00:00
|
|
|
return(maxcount);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
erasereg(regno) {
|
|
|
|
register struct reginfo *rp;
|
1987-01-06 18:49:00 +00:00
|
|
|
register int i;
|
|
|
|
|
|
|
|
rp = &machregs[regno];
|
|
|
|
rp->r_contents.t_token = 0;
|
|
|
|
for (i=0;i<TOKENSIZE;i++)
|
|
|
|
rp->r_contents.t_att[i].aw = 0;
|
1984-05-18 21:27:39 +00:00
|
|
|
|
1987-02-21 22:20:10 +00:00
|
|
|
#if MAXMEMBERS == 0
|
1984-05-19 11:49:01 +00:00
|
|
|
awayreg(regno);
|
1987-02-21 22:20:10 +00:00
|
|
|
|
1984-05-18 21:27:39 +00:00
|
|
|
#else
|
1987-03-05 17:40:48 +00:00
|
|
|
if (regno == 1) { /* condition codes */
|
1987-02-21 22:20:10 +00:00
|
|
|
} else
|
1984-05-18 21:27:39 +00:00
|
|
|
for (rp=machregs;rp<machregs+NREGS;rp++)
|
1987-02-20 17:33:06 +00:00
|
|
|
if (rp->r_clash[regno>>4]&(1<<(regno&017))) {
|
|
|
|
rp->r_contents.t_token = 0;
|
|
|
|
for (i=0;i<TOKENSIZE;i++)
|
|
|
|
rp->r_contents.t_att[i].aw = 0;
|
1990-04-25 14:23:05 +00:00
|
|
|
awayreg((int)(rp-machregs));
|
1987-02-20 17:33:06 +00:00
|
|
|
}
|
1984-05-19 11:49:01 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
awayreg(regno) {
|
|
|
|
register struct reginfo *rp;
|
|
|
|
register tkdef_p tdp;
|
|
|
|
register i;
|
|
|
|
|
|
|
|
/* Now erase recursively all registers containing
|
|
|
|
* something using this one
|
|
|
|
*/
|
|
|
|
for (rp=machregs;rp<machregs+NREGS;rp++) {
|
|
|
|
if (rp->r_contents.t_token == -1) {
|
|
|
|
if (rp->r_contents.t_att[0].ar == regno)
|
1990-04-25 14:23:05 +00:00
|
|
|
erasereg((int)(rp-machregs));
|
1987-01-08 14:09:14 +00:00
|
|
|
} else if (rp->r_contents.t_token > 0) {
|
1984-05-19 11:49:01 +00:00
|
|
|
tdp= & tokens[rp->r_contents.t_token];
|
1984-05-18 21:27:39 +00:00
|
|
|
for (i=0;i<TOKENSIZE;i++)
|
1984-05-19 11:49:01 +00:00
|
|
|
if (tdp->t_type[i] == EV_REG &&
|
|
|
|
rp->r_contents.t_att[i].ar == regno) {
|
1990-04-25 14:23:05 +00:00
|
|
|
erasereg((int)(rp-machregs));
|
1984-05-19 11:49:01 +00:00
|
|
|
break;
|
|
|
|
}
|
1984-05-18 21:27:39 +00:00
|
|
|
}
|
1984-05-19 11:49:01 +00:00
|
|
|
}
|
1984-05-18 21:27:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
cleanregs() {
|
|
|
|
register struct reginfo *rp;
|
|
|
|
register i;
|
|
|
|
|
|
|
|
for (rp=machregs;rp<machregs+NREGS;rp++) {
|
|
|
|
rp->r_contents.t_token = 0;
|
|
|
|
for (i=0;i<TOKENSIZE;i++)
|
|
|
|
rp->r_contents.t_att[i].aw = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifndef NDEBUG
|
|
|
|
inctcount(regno) {
|
|
|
|
register struct reginfo *rp;
|
|
|
|
register i;
|
|
|
|
|
|
|
|
rp = &machregs[regno];
|
|
|
|
#if MAXMEMBERS!=0
|
|
|
|
if (rp->r_members[0] == 0) {
|
|
|
|
#endif
|
|
|
|
rp->r_tcount++;
|
|
|
|
#if MAXMEMBERS!=0
|
|
|
|
} else {
|
|
|
|
for (i=0;i<MAXMEMBERS;i++)
|
|
|
|
if (rp->r_members[i] != 0)
|
|
|
|
inctcount(rp->r_members[i]);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
chkregs() {
|
|
|
|
register struct reginfo *rp;
|
|
|
|
register token_p tp;
|
|
|
|
register tkdef_p tdp;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (rp=machregs;rp<machregs+NREGS;rp++) {
|
|
|
|
assert(rp->r_tcount==0);
|
|
|
|
}
|
|
|
|
for (tp=fakestack;tp<fakestack+stackheight;tp++) {
|
|
|
|
if (tp->t_token == -1)
|
|
|
|
inctcount(tp->t_att[0].ar);
|
|
|
|
else {
|
|
|
|
tdp = &tokens[tp->t_token];
|
|
|
|
for (i=0;i<TOKENSIZE;i++)
|
|
|
|
if (tdp->t_type[i]==EV_REG)
|
|
|
|
inctcount(tp->t_att[i].ar);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#ifdef REGVARS
|
|
|
|
#include <em_reg.h>
|
|
|
|
for(i=reg_any;i<=reg_float;i++) {
|
|
|
|
int j;
|
|
|
|
for(j=0;j<nregvar[i];j++)
|
|
|
|
inctcount(rvnumbers[i][j]);
|
|
|
|
}
|
1991-12-17 15:05:43 +00:00
|
|
|
#endif /* REGVARS */
|
1984-05-18 21:27:39 +00:00
|
|
|
for (rp=machregs;rp<machregs+NREGS;rp++) {
|
|
|
|
assert(rp->r_refcount==rp->r_tcount);
|
|
|
|
rp->r_tcount=0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|