Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #3
0
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
Beispiel #4
0
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