def MUL(i): (y, z, l) = (datafile.block[i].op1, datafile.block[i].op2, datafile.block[i].out) datafile.zprime = z register.storereg("edx") try: int(z) datafile.blockout.append("mov edx," + register.mem(datafile.zprime)) except: if datafile.addressdescriptor[z] != None: datafile.blockout.append("mov edx," + datafile.addressdescriptor[z]) else: datafile.blockout.append("mov edx," + register.mem(datafile.zprime)) datafile.yprime = y register.storereg("eax") try: int(y) datafile.blockout.append("mov eax," + register.mem(datafile.yprime)) except: if datafile.addressdescriptor[y] != None: datafile.blockout.append("mov eax," + datafile.addressdescriptor[y]) else: datafile.blockout.append("mov eax," + register.mem(datafile.yprime)) datafile.blockout.append("imul edx") datafile.addressdescriptor[l] = "eax" datafile.registerdescriptor["eax"] = l register.freereg(y, i) register.freereg(z, i)
def DIV(i): (l, y, z) = (datafile.block[i].out, datafile.block[i].op1, datafile.block[i].op2) register.storereg('edx') register.storereg('eax') datafile.blockout.append("xor edx, edx") try : int(z) reg = register.emptyregister(i,['edx', 'eax']) datafile.blockout.append('mov ' + reg + ", " + z) datafile.zprime = reg except : if datafile.addressdescriptor[z] == None: reg = register.emptyregister(i,['edx', 'eax']) datafile.blockout.append('mov ' + reg + ", " + register.mem(z)) datafile.zprime = reg try : int(y) datafile.yprime = "eax" datafile.blockout.append("mov eax," + y) except : datafile.blockout.append("mov eax," + register.mem(y)) datafile.yprime = "eax" datafile.L = "eax" datafile.blockout.append("idiv " +reg) register.UpdateAddressDescriptor(l) register.freereg(y, i) register.freereg(z, i)
def COMPARE(i): (y,z) = (datafile.block[i].op1,datafile.block[i].op2) try: int(z) datafile.zprime = z except: datafile.zprime = register.getz(z) try: int(y) datafile.yprime = y except: if datafile.addressdescriptor[y] != None: datafile.L = datafile.addressdescriptor[y] elif datafile.zprime in datafile.allvariables: reg = register.emptyregister(i) datafile.blockout.append("movl " + register.mem(y) + ", " + register.mem(reg)) datafile.lineno = datafile.lineno + 1 datafile.L = reg datafile.registerdescriptor[reg] = y datafile.addressdescriptor[y] = reg else: datafile.L = y datafile.blockout.append("cmp " + register.mem(y) + ", " + register.mem(z)) datafile.lineno = datafile.lineno + 1 register.freereg(y,i) register.freereg(z,i)
def ADD(i): (y, z, l) = (datafile.block[i].op1, datafile.block[i].op2, datafile.block[i].out) #check if z is constant or not if not get the momloc or register if it is already in register since op r_i , r_j is similar to op r_i , M print y,", ", z, ", ", l ,"these are y and l in add function" try : int(z) datafile.zprime = z except : register.getz(z) pass #get the register for L to store the output of the operation register.getreg(l, y, i) # print datafile.L , "Hello" try : int(y) datafile.yprime = y except : pass register.gety(y) datafile.blockout.append("addl " + register.mem(datafile.zprime) + ", " + register.mem(datafile.L)) # datafile.blockout.append("lineno" + str(datafile.lineno)) datafile.lineno = datafile.lineno + 1 register.UpdateAddressDescriptor(l) register.freereg(y, i) register.freereg(z, i)
def ARRAYLOAD(i): (l, y, z) = (datafile.block[i].out, datafile.block[i].op1, datafile.block[i].op2) #sb $0, array1($3) index addressing mode is used here try: int(z) datafile.zprime = z except: register.getz(z) reg = register.emptyregister(i) datafile.blockout.append("movl " + register.mem(datafile.zprime) + ", " + register.mem(reg)) datafile.lineno = datafile.lineno + 1 datafile.L = reg datafile.blockout.append("movl " + y + "(, %" + reg +", 4 ), %" + reg ) datafile.lineno = datafile.lineno + 1 register.UpdateAddressDescriptor(l)
def DIV(i): (l, y, z) = (datafile.block[i].out, datafile.block[i].op1, datafile.block[i].op2) register.storereg('edx') datafile.blockout.append("xor %edx, %edx") datafile.lineno = datafile.lineno + 1 try : int(z) reg = register.emptyregister(i,['edx', 'eax']) datafile.blockout.append('mov $' + z + ", %" + reg) datafile.lineno = datafile.lineno + 1 datafile.zprime = reg except : if datafile.addressdescriptor[z] == 'eax': register.storereg(z) register.getz(z) pass register.getreg(l, y, i, 'eax') try : int(y) datafile.yprime = y except : pass register.gety(y) datafile.blockout.append("idivl " + register.mem(datafile.zprime)) datafile.lineno = datafile.lineno + 1 register.UpdateAddressDescriptor(l) register.freereg(y, i) register.freereg(z, i)
def MOD(i): (l, y, z) = (datafile.block[i].out, datafile.block[i].op1, datafile.block[i].op2) register.storereg('edx') datafile.blockout.append("xor edx, edx") datafile.lineno = datafile.lineno + 1 try : int(z) datafile.zprime = z reg = register.emptyregister(i,['eax', 'edx']) datafile.blockout.append('mov ' + reg + ", " + z) datafile.lineno = datafile.lineno + 1 datafile.zprime = reg except : if datafile.addressdescriptor[z] == 'eax': register.storereg(z) register.getz(z) pass register.getreg(l, y, i, 'eax') try : int(y) datafile.yprime = y except : pass register.gety(y) datafile.blockout.append("idiv " + register.mem(datafile.zprime)) datafile.lineno = datafile.lineno + 1 datafile.L = 'edx' #since the remainder is store in edx register.update(l) register_allocator.freereg(y, i) register_allocator.freereg(z, i)
def ARRAYLOAD(i): (l, y, z) = (datafile.block[i].out, datafile.block[i].op1, datafile.block[i].op2) try: int(z) datafile.zprime = z except: register.getz(z) if y in datafile.allvariables: if datafile.addressdescriptor[y] != None: datafile.yprime = datafile.addressdescriptor[y] else: datafile.yprime = y m = [] reg = None if register.mem(datafile.zprime) in datafile.registerlist: m.append(register.mem(datafile.zprime)) if register.mem(datafile.yprime) in datafile.registerlist: reg = register.mem(datafile.yprime) if not reg: reg = register.emptyregister(i,m) datafile.L = reg t = register.mem(datafile.yprime) if t[0] == "[": datafile.blockout.append("lea " + reg + "," + t) else: datafile.blockout.append("mov " + reg + "," + t) if (y in datafile.globalsection) or (y in datafile.setofarray) or (y in datafile.setofList): datafile.blockout.append("add " + reg + "," + register.mem(datafile.zprime)) else: datafile.blockout.append("sub " + reg + "," + register.mem(datafile.zprime)) datafile.blockout.append("mov " + reg + ", [" + reg + "]" ) register.UpdateAddressDescriptor(l)
def PUSH_ADDR(i): var = datafile.block[i].out t = False if(var == "formatin"): datafile.blockout.append("push formatin") return elif(var == "formatout"): datafile.blockout.append("push formatout") return if datafile.addressdescriptor[var] != None : place = datafile.addressdescriptor[var] register.storereg(place) place = register.emptyregister(i) datafile.blockout.append("lea " + register.mem(place) +', ' + register.mem(var)) datafile.blockout.append("push " + place)
def PUSH_ARG(i) : var = datafile.block[i].out t = False try: int(var) except: t = True if t and datafile.addressdescriptor[var] != None : place = datafile.addressdescriptor[var] else : place = register.emptyregister(i) datafile.blockout.append("movl " + register.mem(var) +', ' + register.mem(place)) datafile.lineno = datafile.lineno + 1 datafile.registerdescriptor[place] = var datafile.blockout.append("pushl %" + place) datafile.lineno = datafile.lineno + 1 pass
def DEFASSIGN(i): (y,l) = (datafile.block[i].op2,datafile.block[i].out) try : int(y) datafile.yprime = y if datafile.addressdescriptor[l] != None: reg = datafile.addressdescriptor[l] else: reg = register.emptyregister(i) datafile.L = reg register.UpdateAddressDescriptor(l) except : if datafile.addressdescriptor[y] != None: if datafile.addressdescriptor[l] != None: datafile.blockout.append("mov " + '['+datafile.addressdescriptor[l]+']' + "," + datafile.addressdescriptor[y]) register.freereg(y, i) return else: reg = register.emptyregister(i,left=[datafile.addressdescriptor[y]]) datafile.blockout.append('mov ' + reg + ',' + register.mem(l)) datafile.blockout.append("mov " + '['+reg+']' + "," + datafile.addressdescriptor[y]) register.freereg(y, i) register.freereg(reg, i) return else: reg = register.emptyregister(i) # for l reg1 = register.emptyregister(i,[reg]) # for y datafile.blockout.append("mov " + reg1 + "," + register.mem(y)) datafile.L = reg if datafile.addressdescriptor[l] == None: datafile.blockout.append("mov " + reg + ", "+ register.mem(l)) else: datafile.blockout.append("mov " + reg + ", "+ datafile.addressdescriptor[l]) datafile.blockout.append("mov " + '['+reg+']' + "," + reg1) datafile.yprime = reg1 register.UpdateAddressDescriptor(l) register.freereg(y,i) register.freereg(reg1,i) return reg1 = register.emptyregister(i, [reg]) datafile.blockout.append("mov " + reg1 + "," + y) datafile.blockout.append("mov " + '['+reg+']' + "," + reg1) register.freereg(y, i) register.freereg(reg, i)
def PUSH_ARG(i) : var = datafile.block[i].out if str(var) == "DEFAULT": datafile.blockout.append("push " + datafile.meta[datafile.block[i].op2]) return t = False try: int(var) except: t = True if t and datafile.addressdescriptor[var] != None : place = datafile.addressdescriptor[var] else : place = register.emptyregister(i) datafile.blockout.append("mov " + register.mem(place) +', ' + register.mem(var)) datafile.addressdescriptor[var] = place datafile.registerdescriptor[place] = var datafile.blockout.append("push " + place)
def RETURN(i): if datafile.block[i].out != None: datafile.blockout.append("movl " + register.mem(datafile.block[i].out) + ", %eax") datafile.lineno = datafile.lineno + 1 datafile.blockout.append("movl %ebp, %esp") datafile.lineno = datafile.lineno + 1 datafile.blockout.append("popl %ebp") datafile.lineno = datafile.lineno + 1 datafile.blockout.append("ret") datafile.lineno = datafile.lineno + 1 datafile.currentscope = ""
def ADD(i): (y, z, l) = (datafile.block[i].op1, datafile.block[i].op2, datafile.block[i].out) try : int(z) datafile.zprime = z except : register.getz(z) pass register.getreg(l, y, i) try : int(y) datafile.yprime = y except : pass register.gety(y) datafile.blockout.append("add " + register.mem(datafile.L) + ", "+register.mem(datafile.zprime) ) datafile.lineno = datafile.lineno + 1 register.UpdateAddressDescriptor(l) register.freereg(y, i) register.freereg(z, i)
def APPEND(i): try: datafile.block[i].out reg = register.emptyregister(i) if datafile.block[i].op2 in datafile.setofList: datafile.blockout.append("mov " + reg + ", " + register.mem(datafile.block[i].op2)) datafile.blockout.append("add " + reg + ", " +str(datafile.Listoffset[datafile.block[i].op2][datafile.block[i].out])) else: datafile.blockout.append("lea " + reg + ", " + register.mem(datafile.block[i].op2)) datafile.blockout.append("sub " + reg + ", " + str(datafile.Listoffset[datafile.block[i].op2][datafile.block[i].out])) reg1 = register.emptyregister(i,[reg]) try: int(datafile.block[i].op1) datafile.blockout.append("mov " + reg1 + ", " + datafile.block[i].op1) except: datafile.blockout.append("mov " + reg1 + ", " + register.mem(datafile.block[i].op1)) datafile.blockout.append("mov [" + reg + "]" + "," + reg1) datafile.Listoffset[datafile.block[i].op2][datafile.block[i].out] = datafile.Listoffset[datafile.block[i].op2][datafile.block[i].out] + 4 except: reg = register.emptyregister(i) if datafile.block[i].op2 in datafile.setofList: datafile.blockout.append("mov " + reg + ", " + register.mem(datafile.block[i].op2)) datafile.blockout.append("add " + reg + ", " +str(datafile.Listoffset[datafile.block[i].op2])) else: datafile.blockout.append("lea " + reg + ", " + register.mem(datafile.block[i].op2)) datafile.blockout.append("sub " + reg + ", " + str(datafile.Listoffset[datafile.block[i].op2])) reg1 = register.emptyregister(i,[reg]) try: int(datafile.block[i].op1) datafile.blockout.append("mov " + reg1 + ", " + datafile.block[i].op1) except: datafile.blockout.append("mov " + reg1 + ", " + register.mem(datafile.block[i].op1)) datafile.blockout.append("mov [" + reg + "]" + "," + reg1) datafile.Listoffset[datafile.block[i].op2] = datafile.Listoffset[datafile.block[i].op2] + 4
def XOR(i): (y, z, l) = (datafile.block[i].op1, datafile.block[i].op2, datafile.block[i].out) #check if z is constant or not if not get the momloc or register if it is already in register since op r_i , r_j is similar to op r_i , M try : int(z) datafile.zprime = z except : register.getz(z) pass #get the register for L to store the output of the operation register.getreg(l, y, i) try : int(y) datafile.yprime = y except : pass register.gety(y) datafile.blockout.append("xor " + register.mem(datafile.L) + ", " + register.mem(datafile.zprime) ) datafile.lineno = datafile.lineno + 1 register.UpdateAddressDescriptor(l) register.freereg(y, i) register.freereg(z, i)
def COMPARE(i): (y,z) = (datafile.block[i].op1,datafile.block[i].op2) try: int(z) datafile.zprime = z except: register.getz(z) try: int(y) datafile.yprime = y reg = register.emptyregister(i,[datafile.zprime]) datafile.blockout.append("mov " + reg + "," + datafile.yprime) datafile.yprime = reg except: if datafile.addressdescriptor[y] != None: datafile.L = datafile.addressdescriptor[y] datafile.yprime = datafile.addressdescriptor[y] elif datafile.zprime in datafile.allvariables: reg = register.emptyregister(i) datafile.blockout.append("mov " + reg + ", " + register.mem(y) ) datafile.yprime = reg datafile.registerdescriptor[reg] = y datafile.addressdescriptor[y] = reg elif datafile.zprime not in datafile.registerlist: reg = register.emptyregister(i) datafile.blockout.append("mov " + reg + ", " + register.mem(y) ) datafile.yprime = reg datafile.registerdescriptor[reg] = y datafile.addressdescriptor[y] = reg if datafile.yprime in datafile.registerlist: datafile.blockout.append("cmp " + datafile.yprime + "," + register.mem(datafile.zprime)) else: datafile.blockout.append("cmp " + register.mem(datafile.yprime) + "," + datafile.zprime) register.freereg(y,i) register.freereg(z,i)
def PRINT(i): l = datafile.block[i].out try : datafile.addressdescriptor[l] datafile.blockout.append('pushl %' + datafile.addressdescriptor[l]) datafile.lineno = datafile.lineno + 1 except : datafile.blockout.append('pushl ' + register.mem(l)) datafile.lineno = datafile.lineno + 1 datafile.blockout.append('pushl $printFormat') datafile.lineno = datafile.lineno + 1 register.save() datafile.blockout.append('call printf') datafile.lineno = datafile.lineno + 1 datafile.blockout.append('addl $8, %esp') datafile.lineno = datafile.lineno + 1
def RETURN2(i): if datafile.block[i].out != None: try: int(datafile.block[i].out) datafile.blockout.append("mov eax ," + datafile.block[i].out) except: if datafile.addressdescriptor[datafile.block[i].out] == None: datafile.blockout.append("mov " +"eax, " + register.mem(datafile.block[i].out)) else: datafile.blockout.append("mov " +"eax, " + datafile.addressdescriptor[datafile.block[i].out]) datafile.blockout.append("mov esp, ebp") datafile.lineno = datafile.lineno + 1 datafile.blockout.append("pop ebp") datafile.lineno = datafile.lineno + 1 datafile.blockout.append("ret") datafile.lineno = datafile.lineno + 1 datafile.currentscope = ""
def PRINT(i): l = datafile.block[i].out register.storereg("eax") try : datafile.addressdescriptor[l] datafile.blockout.append('push eax\npush ebx\npush ecx\npush edx\n') datafile.blockout.append('xor eax, eax') datafile.blockout.append('mov ' + 'eax, ' + datafile.addressdescriptor[l]) datafile.lineno = datafile.lineno + 3 except : datafile.blockout.append('push eax\npush ebx\npush ecx\npush edx\n') datafile.blockout.append('xor eax, eax') datafile.blockout.append('mov ' + 'eax, ' + register.mem(l)) datafile.blockout.append('push eax') datafile.blockout.append('push message') datafile.blockout.append('call printf') datafile.blockout.append('add esp, 8') datafile.blockout.append('pop edx\npop ecx\npop ebx\npop eax\n') datafile.lineno = datafile.lineno + 14
def READ(i): datafile.blockout.append("push eax") l = datafile.block[i].out try: datafile.addressdescriptor[l] k = datafile.addressdescriptor[l] datafile.blockout.append("mov eax, esp") except: k = register.mem(l) datafile.blockout.append("lea eax," + k) datafile.blockout.append("push eax") datafile.blockout.append("push formatin") datafile.blockout.append("call scanf") datafile.blockout.append("add esp, 8") try: datafile.addressdescriptor[l] datafile.blockout.append("mov " + k + ", [esp]") except: reg = register.emptyregister(i, ['eax']) datafile.blockout.append("mov " + reg + ", [esp]") datafile.L = reg register.UpdateAddressDescriptor(l) datafile.blockout.append('pop eax')
def GET(i): datafile.blockout.append("movl %eax, " + register.mem(datafile.block[i].out)) datafile.lineno = datafile.lineno + 1 pass