8 static char rcsid[] = "$Id: regvar.c,v 0.6 1994/06/24 13:27:56 ceriel Exp $";
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; {
30 register struct regvar *rvlp;
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) register struct regvar *rvlp; {
46 register 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];
104 regsave(codestrings[machregs[rv->rv_reg].r_repr],
105 rv->rv_off,rv->rv_size);
111 isregvar(off) long off; {
112 register struct regvar *rvlp;
114 for(rvlp=rvlist;rvlp!=0;rvlp=rvlp->rv_next)
115 if(rvlp->rv_off == off)
116 return(rvlp->rv_reg);
120 isregtyp(off) long off; {
121 register struct regvar *rvlp;
123 for(rvlp=rvlist;rvlp!=0;rvlp=rvlp->rv_next)
124 if(rvlp->rv_off == off)
125 return(rvlp->rv_reg ? rvlp->rv_type+1 : 0);
130 register struct regvar *rvlp,*t;
131 register struct regassigned *ra;
134 for(rvlp=rvlist;rvlp!=0;rvlp=t) {
136 myfree((string)rvlp);
139 for (rvtyp=reg_any;rvtyp<=reg_float;rvtyp++) {
140 for(i=0;i<nregvar[rvtyp];i++) {
141 ra= ®assigned[rvtyp][i];
150 /* nothing after this */