def COMPARE(i): (y, z) = (data.block[i].in1, data.block[i].in2) try: int(z) data.zprime = z except: register_allocator.getz(z) try: int(y) data.L = y except: # print("------------" + data.adesc[y]) if data.zprime in data.vset and data.adesc[y] == None: temp = register_allocator.empty_reg(i, []) data.out.append("movl " + register_allocator.transform(y) + ", " + register_allocator.transform(temp)) data.adesc[y] = temp data.rdesc[temp] = y data.L = temp elif data.adesc[y] != None: data.L = data.adesc[y] else: data.L = y data.out.append("cmp " + register_allocator.transform(data.L) + "," + register_allocator.transform(data.zprime)) register_allocator.freereg(z, i) register_allocator.freereg(y, i)
def STORE_ARRAY(i): (x, y, z) = (data.block[i].out, data.block[i].in1, data.block[i].in2) try: int(z) pass except: register_allocator.getz(z) if data.zprime == None: data.zprime = z data.out.append("movl " + register_allocator.transform(data.zprime) + ", %edi") try: int(x) data.out.append("movl $" + x + ", " + y + "(, %edi, 4)") return except: pass # debug(adesc = data.adesc[x]) register_allocator.getreg(x, y, i) debug(Lp=data.L) if data.rdesc[data.L] == None: data.out.append("movl " + register_allocator.transform(x) + ", " + register_allocator.transform(data.L)) data.out.append("movl " + register_allocator.transform(data.L) + ", " + y + "(, %edi, 4)") data.adesc[x] = data.L data.rdesc[data.L] = x
def PUSH_ARG(i) : var = data.block[i].out if data.adesc[var] != None : place = data.adesc[var] else : place = empty_reg(var) data.out.append("movl " + register_allocator.transform(var) + register_allocator.transform(place)) data.out.append("pushl %" + place) pass
def PUSH_ARG(i): var = data.block[i].out if check_variable(var) and data.adesc[var] != None: place = data.adesc[var] else: place = register_allocator.empty_reg(var) data.out.append("movl " + register_allocator.transform(var) + ", " + register_allocator.transform(place)) data.rdesc[place] = var data.out.append("pushl %" + place) pass
def LOAD_ARRAY(i): (x, y, z) = (data.block[i].out, data.block[i].in1, data.block[i].in2) k = register_allocator.empty_reg(i) try: int(z) pass except: register_allocator.getz(z) if data.zprime == None: data.zprime = z data.out.append("movl " + register_allocator.transform(data.zprime) + ", " + register_allocator.transform(k)) data.L = k data.out.append("movl " + y + "(, %" + k + ", 4), %" + k) register_allocator.update(x)
def MOD(i): (x, y, z) = (data.block[i].out, data.block[i].in1, data.block[i].in2) register_allocator.push("edx") data.out.append("xor %edx, %edx") try: int(z) data.zprime = z reg = register_allocator.empty_reg(i, ["eax", "edx"]) data.out.append("mov $" + z + ", %" + reg) data.zprime = reg except: if data.adesc[z] == "eax": register_allocator.push(z) register_allocator.getz(z) pass register_allocator.getreg(x, y, i, "eax") try: int(y) data.yprime = y except: pass register_allocator.gety(y) data.out.append("idivl " + register_allocator.transform(data.zprime)) data.L = "edx" register_allocator.update(x) register_allocator.freereg(y, i) register_allocator.freereg(z, i)
def DIV(i) : (x, y, z) = (data.block[i].out, data.block[i].in1, data.block[i].in2) register_allocator.push('edx') data.out.append("xor %edx, %edx") try : int(z) reg = register_allocator.empty_reg(['edx', 'eax'], i) data.out.append('mov $' + z + ", %" + reg) data.zprime = reg except : if data.adesc[z] == 'eax': register_allocator.push(z) register_allocator.getz(z) pass register_allocator.getreg(x, y, i, 'eax') try : int(y) data.yprime = y except : pass register_allocator.gety(y) data.out.append("idivl " + register_allocator.transform(data.zprime)) register_allocator.update(x) register_allocator.freereg(y, i) register_allocator.freereg(z, i)
def RETURN(i): if data.block[i].out != None: data.out.append("movl {}, %eax".format(register_allocator.transform(data.block[i].out))) data.out.append("movl %ebp, %esp") data.out.append("popl %ebp") data.out.append("ret") data.out.append("\n") data.curr_scope = ""
def ADD(i): (x, y, z) = (data.block[i].out, data.block[i].in1, data.block[i].in2) try: int(z) data.zprime = z except: register_allocator.getz(z) pass register_allocator.getreg(x, y, i) try: int(y) data.yprime = y except: pass register_allocator.gety(y) data.out.append("addl " + register_allocator.transform(data.zprime) + ", " + register_allocator.transform(data.L)) register_allocator.update(x) register_allocator.freereg(y, i) register_allocator.freereg(z, i)
def PRINT(i): x = data.block[i].out debug(x=x) try: debug(adesc=data.adesc[x]) data.adesc[x] data.out.append("pushl %" + data.adesc[x]) except: data.out.append("pushl " + register_allocator.transform(x)) data.out.append("pushl $printFormat") register_allocator.save_to_memory() data.out.append("call printf") data.out.append("addl $8, %esp")
def GET(i): data.out.append("movl %eax, " + register_allocator.transform(data.block[i].out)) pass