Mercurial > lcfOS
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 |