Here are some pseudo-algorithms for accessing variables and parameters. Note: They are meant as a help for generating the real functions, and do not take all subtle cases into account!
base (place, breg, dreg) {
/* breg er en variabel, der kan tildeles et registernavn.
dreg er navnet på et register, der er til rådighed.
place.kind = memory, breg bliver "baseregister",
dvs. %g3 for globale
%fp for lokale
access-link**n for andre. */
if (level==0) breg = "%g3";
else if (level == currentLevel) breg = "%fp";
else {
/* ikke lokale/globale */
breg = dreg; level++;
gen(ld, [%fp-4], breg);
while (level < currentLevel) {
/* follow access-link */
gen(ld, [breg-4], breg);
level++;
}
}
}
rval(place, dreg) {
/* dreg er navnet på det register, vi ønsker
at lægge værdien i. (tager ikke højde for arrays) */
base(place, breg, dreg);
gen(ld, [breg-place.offset], dreg);
}
lval(place, dreg)
/* dreg er navnet på det register, vi ønsker
at lægge adressen i. (tager ikke højde for arrays) */
base(place, breg, dreg);
gen(sub, breg, place.offset, dreg);
}
opFetch(place, reg) {
/* reg er navnet på det register, vi ønsker at
lægge operanden i. */
switch (place.kind) {
register:
gen(mov, place.reg, reg);
break;
memory:
rval(place, reg);
break;
constant:
if (-4096 <= place.num <= 4095)
gen(mov, place.num, reg);
else {
gen(sethi, hi(place.num), reg);
gen(or, reg, lo(place.num), reg);
}
}
}
opFetch(place, reg) {
/* reg er navnet på det register operanden afleveres i. */
switch (place.kind) {
register:
reg=place.loc;
break;
memory:
newtemp(reg);
rval(place, reg);
break;
constant:
newtemp(reg);
if (-4096 <= place.num <= 4095)
gen(mov, place.num, reg);
else {
gen(sethi, hi(place.num), reg);
gen(or, reg, lo(place.num), reg);
}
}
}
Last modified: Wed May 6 11:45:55 1998