def genVar(x): # assuming x is ST.Var, ST.Ref, ST.Const # for ST.Const: no code, x.val is constant # for ST.Var: x.reg is FP for local, 0 for global vars, # x.adr is relative or absolute address # for ST.Ref: address is loaded into register # returns ST.Var, ST.Const if type(x) == Const: y = x else: if x.lev == 0: s = R0 elif x.lev == curlev: s = FP else: mark("level!") s = R0 y = Var(x.tp) y.lev = x.lev if type(x) == Ref: # reference is loaded into register r = obtainReg() putM("lw", r, s, x.adr) y.reg, y.adr = r, 0 elif type(x) == Var: y.reg, y.adr = s, x.adr else: y = x # error, pass dummy item return y
def genVar(x): # assuming x is ST.Var, ST.Ref, ST.Const # for ST.Const: no code, x.val is constant # for ST.Var: x.reg is FP for local, 0 for global vars, # x.adr is relative or absolute address # for ST.Ref: address is loaded into register # returns ST.Var, ST.Const if type(x) == Const: y = x else: if x.lev == 0: s = R0 elif x.lev == curlev: s = FP else: mark('level!') s = R0 y = Var(x.tp) y.lev = x.lev if type(x) == Ref: # reference is loaded into register r = obtainReg() putM('lw', r, s, x.adr) y.reg, y.adr = r, 0 elif type(x) == Var: y.reg, y.adr = s, x.adr else: y = x # error, pass dummy item return y
def genVar(x): # version supporting parameters in registers if 0 < x.lev < curlev: mark('level!') if type(x) == Ref: y = Var(x.tp); y.lev = x.lev if x.reg in ('$a0', '$a1', '$a2', '$a3'): # reference already in register, use it y.reg, y.adr = x.reg, 0 # variable at M[y.reg] else: # reference is loaded into register y.reg, y.adr = obtainReg(), 0 # variable at M[y.reg] putMemOp('lw', y.reg, x.reg, x.adr) elif type(x) == Var: if x.reg in ('$a0', '$a1', '$a2', '$a3'): # value already in register, use it y = Reg(x.tp, x.reg) #; y.lev, x.adr = x.lev, x.adr else: y = Var(x.tp); y.lev, y.reg, y.adr = x.lev, x.reg, x.adr else: assert False return y
def genVar(x): if x.lev == 0: s = R0 # global variable at x.adr elif x.lev == curlev: s = FP # local variable, FP relative else: mark('level!') s = R0 y = Var(x.tp) y.lev = x.lev if type(x) == Ref: # reference is loaded into register r = obtainReg() putMemOp('lw', r, s, x.adr) y.reg, y.adr = r, 0 # variable at (y.reg) elif type(x) == Var: y.reg, y.adr = s, x.adr else: assert False return y