annotate 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
rev   line source
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
1
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
2 import ir
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
3 import irmach
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
4 from irmach import makeIns
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
5
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
6 def genTemps():
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
7 n = 900
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
8 while True:
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
9 yield ir.Temp('t{}'.format(n))
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
10 n = n + 1
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
11
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
12 class InstructionSelector:
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
13 """
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
14 Base instruction selector. This class must be overridden by
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
15 backends.
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
16 """
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
17 def __init__(self):
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
18 self.temps = genTemps()
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
19
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
20 def newTmp(self):
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
21 return self.temps.__next__()
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
22
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
23 def munchFunction(self, f, frame):
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
24 # Entry point for instruction selection
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
25 assert isinstance(f, ir.Function)
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
26 self.targets = {}
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
27 # Enter a frame per function:
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
28 self.frame = frame
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
29 # First define labels:
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
30 for bb in f.Blocks:
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
31 itgt = makeIns('{}:'.format(bb.name))
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
32 self.targets[bb] = itgt
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
33 # Generate code for all blocks:
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
34 for bb in f.Blocks:
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
35 self.emit2(self.targets[bb])
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
36 for i in bb.Instructions:
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
37 self.munchStm(i)
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
38 self.munchStm(ir.Move(self.frame.rv, f.return_value))
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
39 self.emit('mov %s0, %s0', src=[self.frame.rv])
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
40
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
41 def move(self, dst, src):
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
42 self.emit('mov %d0, %s0', src=[src], dst=[dst])
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
43
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
44 def emit(self, *args, **kwargs):
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
45 """ Abstract instruction emitter """
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
46 i = makeIns(*args, **kwargs)
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
47 return self.emit2(i)
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
48
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
49 def emit2(self, i):
274
ea93e0a7a31e Move docs
Windel Bouwman
parents: 269
diff changeset
50 self.frame.instructions.append(i)
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
51 return i
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
52
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
53 def munchStm(self, s):
274
ea93e0a7a31e Move docs
Windel Bouwman
parents: 269
diff changeset
54 """ Implement this in the target specific back-end """
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
55 raise NotImplementedError()
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
56
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
57 def munchExpr(self, e):
274
ea93e0a7a31e Move docs
Windel Bouwman
parents: 269
diff changeset
58 """ Implement this in the target specific back-end """
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
59 raise NotImplementedError()
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
60