annotate python/irmach.py @ 277:046017431c6a

Started register allocator
author Windel Bouwman
date Thu, 26 Sep 2013 21:14:25 +0200
parents 6f2423df0675
children 02385f62f250
rev   line source
261
444b9df2ed99 try to split up code generation
Windel Bouwman
parents:
diff changeset
1
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents: 268
diff changeset
2 """
270
cdc76d183bcc first register allocator
Windel Bouwman
parents: 269
diff changeset
3 Abstract assembly language instructions.
cdc76d183bcc first register allocator
Windel Bouwman
parents: 269
diff changeset
4
cdc76d183bcc first register allocator
Windel Bouwman
parents: 269
diff changeset
5 This is the second intermediate representation.
cdc76d183bcc first register allocator
Windel Bouwman
parents: 269
diff changeset
6
cdc76d183bcc first register allocator
Windel Bouwman
parents: 269
diff changeset
7 Instructions are selected and scheduled at this stage.
269
5f8c04a8d26b Towards better modularity
Windel Bouwman
parents: 268
diff changeset
8 """
261
444b9df2ed99 try to split up code generation
Windel Bouwman
parents:
diff changeset
9
277
046017431c6a Started register allocator
Windel Bouwman
parents: 275
diff changeset
10 import ir
046017431c6a Started register allocator
Windel Bouwman
parents: 275
diff changeset
11
274
ea93e0a7a31e Move docs
Windel Bouwman
parents: 270
diff changeset
12 class Frame:
ea93e0a7a31e Move docs
Windel Bouwman
parents: 270
diff changeset
13 """
ea93e0a7a31e Move docs
Windel Bouwman
parents: 270
diff changeset
14 Activation record abstraction. This class contains a flattened
ea93e0a7a31e Move docs
Windel Bouwman
parents: 270
diff changeset
15 function. Instructions are selected and scheduled at this stage.
ea93e0a7a31e Move docs
Windel Bouwman
parents: 270
diff changeset
16 Frames differ per machine.
ea93e0a7a31e Move docs
Windel Bouwman
parents: 270
diff changeset
17 """
ea93e0a7a31e Move docs
Windel Bouwman
parents: 270
diff changeset
18 def __init__(self, name):
ea93e0a7a31e Move docs
Windel Bouwman
parents: 270
diff changeset
19 self.name = name
ea93e0a7a31e Move docs
Windel Bouwman
parents: 270
diff changeset
20 self.instructions = []
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
21 self.stacksize = 0
274
ea93e0a7a31e Move docs
Windel Bouwman
parents: 270
diff changeset
22
ea93e0a7a31e Move docs
Windel Bouwman
parents: 270
diff changeset
23 def __repr__(self):
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
24 return 'Frame {}'.format(self.name)
274
ea93e0a7a31e Move docs
Windel Bouwman
parents: 270
diff changeset
25
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
26 def makeIns(*args, **kwargs):
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
27 return AbstractInstruction(*args, **kwargs)
261
444b9df2ed99 try to split up code generation
Windel Bouwman
parents:
diff changeset
28
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 261
diff changeset
29 class AbstractInstruction:
274
ea93e0a7a31e Move docs
Windel Bouwman
parents: 270
diff changeset
30 """
ea93e0a7a31e Move docs
Windel Bouwman
parents: 270
diff changeset
31 Abstract machine instruction class. This is a very simple
ea93e0a7a31e Move docs
Windel Bouwman
parents: 270
diff changeset
32 abstraction of machine instructions.
ea93e0a7a31e Move docs
Windel Bouwman
parents: 270
diff changeset
33 """
277
046017431c6a Started register allocator
Windel Bouwman
parents: 275
diff changeset
34 def __init__(self, cls, ops=(), src=(), dst=(), jumps=()):
046017431c6a Started register allocator
Windel Bouwman
parents: 275
diff changeset
35 self.assem = cls
046017431c6a Started register allocator
Windel Bouwman
parents: 275
diff changeset
36 self.ops = ops
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 261
diff changeset
37 self.src = tuple(src)
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 261
diff changeset
38 self.dst = tuple(dst)
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 261
diff changeset
39 self.jumps = tuple(jumps)
277
046017431c6a Started register allocator
Windel Bouwman
parents: 275
diff changeset
40 c = lambda s: tuple(map(type, s)) == (ir.Temp, )
046017431c6a Started register allocator
Windel Bouwman
parents: 275
diff changeset
41 self.ismove = c(src) and c(dst) and cls.lower().startswith('mov')
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 261
diff changeset
42
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 261
diff changeset
43 def __repr__(self):
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
44 return self.render()
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
45
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
46 def render(self):
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
47 """
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
48 Substitutes source, dst and labels in the string
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
49 """
277
046017431c6a Started register allocator
Windel Bouwman
parents: 275
diff changeset
50 x = str(self.assem)
275
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
51 for i, s in enumerate(self.src):
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
52 p = '%s{}'.format(i)
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
53 x = x.replace(p, str(s))
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
54 for i, d in enumerate(self.dst):
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
55 p = '%d{}'.format(i)
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
56 x = x.replace(p, str(d))
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
57 for i, j in enumerate(self.jumps):
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
58 p = '%l{}'.format(i)
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
59 x = x.replace(p, str(j))
6f2423df0675 Fixed serve arm-as
Windel Bouwman
parents: 274
diff changeset
60 return x
261
444b9df2ed99 try to split up code generation
Windel Bouwman
parents:
diff changeset
61
444b9df2ed99 try to split up code generation
Windel Bouwman
parents:
diff changeset
62