annotate python/ppci/target/instructionselector.py @ 342:86b02c98a717 devel

Moved target directory
author Windel Bouwman
date Sat, 01 Mar 2014 15:40:31 +0100
parents python/target/instructionselector.py@d1ecc493384e
children 3bb7dcfe5529
rev   line source
301
6753763d3bec merge codegen into ppci package
Windel Bouwman
parents: 290
diff changeset
1 from ppci import ir
6753763d3bec merge codegen into ppci package
Windel Bouwman
parents: 290
diff changeset
2 from ppci import irmach
6753763d3bec merge codegen into ppci package
Windel Bouwman
parents: 290
diff changeset
3 from ppci.irmach import AbstractInstruction as makeIns
342
86b02c98a717 Moved target directory
Windel Bouwman
parents: 336
diff changeset
4 from .basetarget import Label
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
280
02385f62f250 Rework from str interface to Instruction interface
Windel Bouwman
parents: 279
diff changeset
12
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
13 class InstructionSelector:
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
14 """
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
15 Base instruction selector. This class must be overridden by
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
16 backends.
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
17 """
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
18 def __init__(self):
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
19 self.temps = genTemps()
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
20
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
21 def newTmp(self):
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
22 return self.temps.__next__()
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
23
336
d1ecc493384e Added spiffy armtoken class for bit fiddeling. Added cool test that checks for build repeatability
Windel Bouwman
parents: 301
diff changeset
24
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
25 def munchFunction(self, f, frame):
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
26 # Entry point for instruction selection
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
27 assert isinstance(f, ir.Function)
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
28 self.targets = {}
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
29 # Enter a frame per function:
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
30 self.frame = frame
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
31 # First define labels:
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
32 for bb in f.Blocks:
342
86b02c98a717 Moved target directory
Windel Bouwman
parents: 336
diff changeset
33 itgt = makeIns(Label(ir.label_name(bb)))
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
34 self.targets[bb] = itgt
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
35 # Generate code for all blocks:
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
36 for bb in f.Blocks:
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
37 self.emit2(self.targets[bb])
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
38 for i in bb.Instructions:
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
39 self.munchStm(i)
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
40 self.munchStm(ir.Move(self.frame.rv, f.return_value))
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
41
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
42 def move(self, dst, src):
280
02385f62f250 Rework from str interface to Instruction interface
Windel Bouwman
parents: 279
diff changeset
43 raise NotImplementedError('Not target implemented')
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
44
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
45 def emit(self, *args, **kwargs):
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
46 """ Abstract instruction emitter """
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
47 i = makeIns(*args, **kwargs)
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
48 return self.emit2(i)
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
49
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
50 def emit2(self, i):
274
ea93e0a7a31e Move docs
Windel Bouwman
parents: 269
diff changeset
51 self.frame.instructions.append(i)
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
52 return i
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
53
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
54 def munchStm(self, s):
274
ea93e0a7a31e Move docs
Windel Bouwman
parents: 269
diff changeset
55 """ Implement this in the target specific back-end """
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
56 raise NotImplementedError()
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
57
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
58 def munchExpr(self, e):
274
ea93e0a7a31e Move docs
Windel Bouwman
parents: 269
diff changeset
59 """ Implement this in the target specific back-end """
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
60 raise NotImplementedError()