Algorithms for accessing variables

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!

Finding the base register
        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++;
            }
          }
        }
Finding an r-value
        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);
        }
Finding an l-value
        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);
        }
Fetching an operand
        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);
              }
          }
        }
An alternative operand fetch
        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);
              }
          }
        }


Peter Kornerup <kornerup@imada.sdu.dk>

Last modified: Wed May 6 11:45:55 1998