annotate python/ppci/target/instructionselector.py @ 348:442fb043d149

Added log option to zcc
author Windel Bouwman
date Sat, 08 Mar 2014 15:32:33 +0100
parents 3bb7dcfe5529
children
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
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
24 def munchFunction(self, f, frame):
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
25 # Entry point for instruction selection
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
26 assert isinstance(f, ir.Function)
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents:
diff changeset
27 self.targets = {}
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
28 # Enter a frame per function:
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
29 self.frame = frame
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
30 # First define labels:
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
31 for bb in f.Blocks:
342
86b02c98a717 Moved target directory
Windel Bouwman
parents: 336
diff changeset
32 itgt = makeIns(Label(ir.label_name(bb)))
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
33 self.targets[bb] = itgt
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
34 # Generate code for all blocks:
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
35 for bb in f.Blocks:
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
36 self.emit2(self.targets[bb])
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
37 for i in bb.Instructions:
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
38 self.munchStm(i)
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
39 self.munchStm(ir.Move(self.frame.rv, f.return_value))
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):
280
02385f62f250 Rework from str interface to Instruction interface
Windel Bouwman
parents: 279
diff changeset
42 raise NotImplementedError('Not target implemented')
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()