comparison python/instructionselector.py @ 275:6f2423df0675

Fixed serve arm-as
author Windel Bouwman
date Sat, 14 Sep 2013 17:29:10 +0200
parents ea93e0a7a31e
children 2ccd57b1d78c
comparison
equal deleted inserted replaced
274:ea93e0a7a31e 275:6f2423df0675
1 1
2 import ir 2 import ir
3 import irmach 3 import irmach
4 from irmach import makeIns
4 5
5 def genTemps(): 6 def genTemps():
6 n = 900 7 n = 900
7 while True: 8 while True:
8 yield 't{}'.format(n) 9 yield ir.Temp('t{}'.format(n))
9 n = n + 1 10 n = n + 1
10 11
11 class InstructionSelector: 12 class InstructionSelector:
12 """ 13 """
13 Base instruction selector. This class must be overridden by 14 Base instruction selector. This class must be overridden by
14 backends. 15 backends.
15 """ 16 """
17 def __init__(self):
18 self.temps = genTemps()
19
16 def newTmp(self): 20 def newTmp(self):
17 return self.temps.__next__() 21 return self.temps.__next__()
18 22
19 def getTempReg(self, tmp): 23 def munchFunction(self, f, frame):
20 if tmp not in self.tempMap: 24 # Entry point for instruction selection
21 self.tempMap[tmp] = self.newTmp() 25 assert isinstance(f, ir.Function)
22 return self.tempMap[tmp] 26 self.targets = {}
27 # Enter a frame per function:
28 self.frame = frame
29 # First define labels:
30 for bb in f.Blocks:
31 itgt = makeIns('{}:'.format(bb.name))
32 self.targets[bb] = itgt
33 # Generate code for all blocks:
34 for bb in f.Blocks:
35 self.emit2(self.targets[bb])
36 for i in bb.Instructions:
37 self.munchStm(i)
38 self.munchStm(ir.Move(self.frame.rv, f.return_value))
39 self.emit('mov %s0, %s0', src=[self.frame.rv])
23 40
24 def munchProgram(self, p): 41 def move(self, dst, src):
25 # Entry point for instruction selection 42 self.emit('mov %d0, %s0', src=[src], dst=[dst])
26 self.temps = genTemps()
27 assert isinstance(p, ir.Module)
28 self.frames = []
29 self.targets = {}
30 self.tempMap = {} # Mapping from temporaries to infinite register
31 for f in p.Functions:
32 # Enter a frame per function:
33 self.frame = self.newFrame(f.name)
34 self.frames.append(self.frame)
35 # First define labels:
36 for bb in f.Blocks:
37 itgt = self.makeIns('{}:'.format(bb.name))
38 self.targets[bb] = itgt
39 for bb in f.Blocks:
40 self.emit2(self.targets[bb])
41 for i in bb.Instructions:
42 self.munchStm(i)
43 #bb.machIns = self.result
44 return self.frames
45
46 def makeIns(self, *args, **kwargs):
47 return irmach.AbstractInstruction(*args, **kwargs)
48 43
49 def emit(self, *args, **kwargs): 44 def emit(self, *args, **kwargs):
50 """ Abstract instruction emitter """ 45 """ Abstract instruction emitter """
51 i = self.makeIns(*args, **kwargs) 46 i = makeIns(*args, **kwargs)
52 return self.emit2(i) 47 return self.emit2(i)
53 48
54 def emit2(self, i): 49 def emit2(self, i):
55 self.frame.instructions.append(i) 50 self.frame.instructions.append(i)
56 return i 51 return i
57
58 def newFrame(self, name):
59 raise NotImplementedError()
60 52
61 def munchStm(self, s): 53 def munchStm(self, s):
62 """ Implement this in the target specific back-end """ 54 """ Implement this in the target specific back-end """
63 raise NotImplementedError() 55 raise NotImplementedError()
64 56