OLD | NEW |
1 // Inferno utils/5c/reg.c | 1 // Inferno utils/5c/reg.c |
2 // http://code.google.com/p/inferno-os/source/browse/utils/5c/reg.c | 2 // http://code.google.com/p/inferno-os/source/browse/utils/5c/reg.c |
3 // | 3 // |
4 // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. | 4 // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. |
5 // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) | 5 // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) |
6 // Portions Copyright © 1997-1999 Vita Nuova Limited | 6 // Portions Copyright © 1997-1999 Vita Nuova Limited |
7 // Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuov
a.com) | 7 // Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuov
a.com) |
8 // Portions Copyright © 2004,2006 Bruce Ellis | 8 // Portions Copyright © 2004,2006 Bruce Ellis |
9 // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) | 9 // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) |
10 // Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others | 10 // Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 ".F8", | 163 ".F8", |
164 ".F9", | 164 ".F9", |
165 ".F10", | 165 ".F10", |
166 ".F11", | 166 ".F11", |
167 ".F12", | 167 ".F12", |
168 ".F13", | 168 ".F13", |
169 ".F14", | 169 ".F14", |
170 ".F15", | 170 ".F15", |
171 }; | 171 }; |
172 | 172 |
| 173 static Node* regnodes[NREGVAR]; |
| 174 |
173 void | 175 void |
174 regopt(Prog *firstp) | 176 regopt(Prog *firstp) |
175 { | 177 { |
176 Reg *r, *r1; | 178 Reg *r, *r1; |
177 Prog *p; | 179 Prog *p; |
178 int i, z, nr; | 180 int i, z, nr; |
179 uint32 vreg; | 181 uint32 vreg; |
180 Bits bit; | 182 Bits bit; |
181 ········ | 183 ········ |
182 if(first == 0) { | 184 if(first == 0) { |
(...skipping 26 matching lines...) Expand all Loading... |
209 firstr = R; | 211 firstr = R; |
210 lastr = R; | 212 lastr = R; |
211 | 213 |
212 /* | 214 /* |
213 * control flow is more complicated in generated go code | 215 * control flow is more complicated in generated go code |
214 * than in generated c code. define pseudo-variables for | 216 * than in generated c code. define pseudo-variables for |
215 * registers, so we have complete register usage information. | 217 * registers, so we have complete register usage information. |
216 */ | 218 */ |
217 nvar = NREGVAR; | 219 nvar = NREGVAR; |
218 memset(var, 0, NREGVAR*sizeof var[0]); | 220 memset(var, 0, NREGVAR*sizeof var[0]); |
219 » for(i=0; i<NREGVAR; i++) | 221 » for(i=0; i<NREGVAR; i++) { |
220 » » var[i].node = newname(lookup(regname[i])); | 222 » » if(regnodes[i] == N) |
| 223 » » » regnodes[i] = newname(lookup(regname[i])); |
| 224 » » var[i].node = regnodes[i]; |
| 225 » } |
221 | 226 |
222 regbits = RtoB(REGSP)|RtoB(REGLINK)|RtoB(REGPC); | 227 regbits = RtoB(REGSP)|RtoB(REGLINK)|RtoB(REGPC); |
223 for(z=0; z<BITS; z++) { | 228 for(z=0; z<BITS; z++) { |
224 externs.b[z] = 0; | 229 externs.b[z] = 0; |
225 params.b[z] = 0; | 230 params.b[z] = 0; |
226 consts.b[z] = 0; | 231 consts.b[z] = 0; |
227 addrs.b[z] = 0; | 232 addrs.b[z] = 0; |
228 ovar.b[z] = 0; | 233 ovar.b[z] = 0; |
229 } | 234 } |
230 | 235 |
(...skipping 1543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1774 last->link = P; | 1779 last->link = P; |
1775 } | 1780 } |
1776 ········ | 1781 ········ |
1777 if(debug['R'] && debug['v']) { | 1782 if(debug['R'] && debug['v']) { |
1778 print("\n"); | 1783 print("\n"); |
1779 for(p=firstp; p; p=p->link) | 1784 for(p=firstp; p; p=p->link) |
1780 print("%P\n", p); | 1785 print("%P\n", p); |
1781 print("\n"); | 1786 print("\n"); |
1782 } | 1787 } |
1783 } | 1788 } |
OLD | NEW |