Exemple #1
0
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)
Exemple #2
0
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)
Exemple #3
0
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)
Exemple #4
0
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)
Exemple #5
0
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)
Exemple #6
0
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)
Exemple #7
0
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)
Exemple #8
0
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)
Exemple #9
0
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)
Exemple #10
0
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
Exemple #11
0
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)
Exemple #12
0
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)
Exemple #13
0
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 = ""
Exemple #14
0
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)
Exemple #15
0
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
Exemple #16
0
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)
Exemple #17
0
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)
Exemple #18
0
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
Exemple #19
0
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 = ""
Exemple #20
0
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
Exemple #21
0
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')
Exemple #22
0
def GET(i):
    
    datafile.blockout.append("movl %eax, " + register.mem(datafile.block[i].out))
    datafile.lineno = datafile.lineno + 1
    pass