comparison python/x86.py @ 174:3eb06f5fb987

Added memory alloc for locals
author Windel Bouwman
date Fri, 19 Apr 2013 19:22:52 +0200
parents c1d2b6b9f9a7
children 460db5669efa
comparison
equal deleted inserted replaced
173:c1d2b6b9f9a7 174:3eb06f5fb987
33 33
34 def genBin(self, ir): 34 def genBin(self, ir):
35 self.asm = [] 35 self.asm = []
36 # Allocate registers: 36 # Allocate registers:
37 ra = registerallocator.RegisterAllocator() 37 ra = registerallocator.RegisterAllocator()
38 # TODO: do not register allocate on intermediate code:
38 ra.registerAllocate(ir, self.regs) 39 ra.registerAllocate(ir, self.regs)
39 self.genModule(ir) 40 self.genModule(ir)
40 return self.asm 41 return self.asm
41 42
42 def genModule(self, ir): 43 def genModule(self, ir):
43 #for f in ir.Functions: 44 for f in ir.Functions:
44 # self.genFunction(f) 45 self.genFunction(f)
45 for bb in ir.BasicBlocks:
46 self.genBB(bb)
47 def genFunction(self, f): 46 def genFunction(self, f):
48 self.emit('global {0}'.format(f.name)) 47 self.emit('global {0}'.format(f.name))
49 self.emit(AsmLabel(f.name)) 48 self.emit(AsmLabel(f.name))
49 self.emit(Jmp('jmp', f.entry.name))
50 for bb in f.BasicBlocks: 50 for bb in f.BasicBlocks:
51 self.genBB(bb) 51 self.genBB(bb)
52 def genBB(self, bb): 52 def genBB(self, bb):
53 self.emit(AsmLabel(bb.name)) 53 self.emit(AsmLabel(bb.name))
54 for i in bb.Instructions: 54 for i in bb.Instructions:
60 self.emit(Op('mov', i.result.reg, i.value1.reg)) 60 self.emit(Op('mov', i.result.reg, i.value1.reg))
61 self.emit(Op(ops[i.operation], i.result.reg, i.value2.reg)) 61 self.emit(Op(ops[i.operation], i.result.reg, i.value2.reg))
62 else: 62 else:
63 raise NotImplementedError('op {0}'.format(i.operation)) 63 raise NotImplementedError('op {0}'.format(i.operation))
64 elif type(i) is ir.Load: 64 elif type(i) is ir.Load:
65 self.emit(Op('mov', i.value, '[{0}]'.format(i.name))) 65 self.emit(Op('mov', i.value, '[{0}]'.format(i.location)))
66 elif type(i) is ir.Return: 66 elif type(i) is ir.Return:
67 self.emit('ret') 67 self.emit('ret')
68 elif type(i) is ir.Call: 68 elif type(i) is ir.Call:
69 self.emit('call') 69 self.emit('call')
70 elif type(i) is ir.ImmLoad: 70 elif type(i) is ir.ImmLoad:
71 self.emit(Op('mov', i.target, i.value)) 71 self.emit(Op('mov', i.target, i.value))
72 elif type(i) is ir.Store: 72 elif type(i) is ir.Store:
73 self.emit(Op('mov', '[{0}]'.format(i.name), i.value)) 73 self.emit(Op('mov', '[{0}]'.format(i.location), i.value))
74 elif type(i) is ir.ConditionalBranch: 74 elif type(i) is ir.ConditionalBranch:
75 self.emit(Op('cmp', i.a, i.b)) 75 self.emit(Op('cmp', i.a, i.b))
76 jmps = {'>':'jg', '<':'jl', '==':'je'} 76 jmps = {'>':'jg', '<':'jl', '==':'je'}
77 if i.cond in jmps: 77 if i.cond in jmps:
78 j = jmps[i.cond] 78 j = jmps[i.cond]
80 else: 80 else:
81 raise NotImplementedError('condition {0}'.format(i.cond)) 81 raise NotImplementedError('condition {0}'.format(i.cond))
82 self.emit(Jmp('jmp', i.lab2.name)) 82 self.emit(Jmp('jmp', i.lab2.name))
83 elif type(i) is ir.Branch: 83 elif type(i) is ir.Branch:
84 self.emit(Jmp('jmp', i.target.name)) 84 self.emit(Jmp('jmp', i.target.name))
85 elif type(i) is ir.Alloc:
86 pass
85 else: 87 else:
86 raise NotImplementedError('{0}'.format(i)) 88 raise NotImplementedError('{0}'.format(i))
87 89