8 static char rcsid[] = "$Id: regvar.c,v 2.9 1994/06/24 13:24:09 ceriel Exp $";
12 #include <cg_pattern.h>
20 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
21 * See the copyright notice in the ACK home directory, in the file "Copyright".
23 * Author: Hans van Staveren
25 extern string myalloc();
26 struct regvar *rvlist;
29 linkreg(of,sz,tp,sc) long of; {
32 rvlp= (struct regvar *) myalloc(sizeof *rvlp);
33 rvlp->rv_next = rvlist;
39 rvlp->rv_reg = 0; /* no register assigned yet */
43 tryreg(rvlp,typ) struct regvar *rvlp; {
46 struct regassigned *ra;
49 if (typ != reg_any && nregvar[typ]!=0) {
50 if (machregs[rvnumbers[typ][0]].r_size!=rvlp->rv_size)
53 score = regscore(rvlp->rv_off,
57 typ); /* machine dependent */
58 ra = regassigned[typ];
59 if (score>ra[nregvar[typ]-1].ra_score) {
60 save = ra[nregvar[typ]-1].ra_rv;
61 for (i=nregvar[typ]-1;i>0 && ra[i-1].ra_score<score;i--)
64 ra[i].ra_score = score;
69 if (nregvar[reg_any]==0)
71 if (machregs[rvnumbers[reg_any][0]].r_size!=rvlp->rv_size)
74 score = regscore(rvlp->rv_off,
78 reg_any); /* machine dependent */
79 ra = regassigned[reg_any];
80 if (score>ra[nregvar[reg_any]-1].ra_score) {
81 for (i=nregvar[reg_any]-1;i>0 && ra[i-1].ra_score<score;i--)
84 ra[i].ra_score = score;
89 register struct regvar *rv;
93 i_regsave(); /* machine dependent initialization */
94 for (rvtyp=reg_any;rvtyp<=reg_float;rvtyp++) {
95 for(i=0;i<nregvar[rvtyp];i++)
98 rp= &machregs[rvnumbers[rvtyp][i]];
99 regsave(codestrings[rp->r_repr],(long)-TEM_WSIZE,rp->r_size);
100 } else if(regassigned[rvtyp][i].ra_score>0) {
101 rv=regassigned[rvtyp][i].ra_rv;
102 rv->rv_reg=rvnumbers[rvtyp][i];
103 regsave(codestrings[machregs[rv->rv_reg].r_repr],
104 rv->rv_off,rv->rv_size);
110 isregvar(off) long off; {
111 register struct regvar *rvlp;
113 for(rvlp=rvlist;rvlp!=0;rvlp=rvlp->rv_next)
114 if(rvlp->rv_off == off)
115 return(rvlp->rv_reg);
120 register struct regvar *rvlp,*t;
121 register struct regassigned *ra;
124 for(rvlp=rvlist;rvlp!=0;rvlp=t) {
129 for (rvtyp=reg_any;rvtyp<=reg_float;rvtyp++) {
130 for(i=0;i<nregvar[rvtyp];i++) {
131 ra= ®assigned[rvtyp][i];
140 /* nothing after this */