annotate python/ir/instruction.py @ 270:cdc76d183bcc

first register allocator
author Windel Bouwman
date Mon, 19 Aug 2013 21:14:28 +0200
parents 5ec7580976d9
children e64bae57cda8
rev   line source
175
a51b3c956386 Added function call in expressions
Windel Bouwman
parents: 174
diff changeset
1 from .function import Function
171
3eb9b9e2958d Improved IR code
Windel Bouwman
parents: 170
diff changeset
2
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
3 class Expression:
205
d77cb5962cc5 Added some handcoded arm code generation
Windel Bouwman
parents: 204
diff changeset
4 pass
d77cb5962cc5 Added some handcoded arm code generation
Windel Bouwman
parents: 204
diff changeset
5
239
63bb40758066 added check
Windel Bouwman
parents: 230
diff changeset
6
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
7 class Const(Expression):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
8 def __init__(self, value):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
9 self.value = value
239
63bb40758066 added check
Windel Bouwman
parents: 230
diff changeset
10
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
11 def __repr__(self):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
12 return 'Constant {}'.format(self.value)
239
63bb40758066 added check
Windel Bouwman
parents: 230
diff changeset
13
63bb40758066 added check
Windel Bouwman
parents: 230
diff changeset
14
158
9683a4cd848f Added some functions for code generation
Windel Bouwman
parents: 157
diff changeset
15 # Function calling:
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
16 class Call(Expression):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
17 def __init__(self, f, arguments):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
18 self.f = f
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
19 assert type(f) is Function
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
20 self.arguments = arguments
261
444b9df2ed99 try to split up code generation
Windel Bouwman
parents: 259
diff changeset
21
444b9df2ed99 try to split up code generation
Windel Bouwman
parents: 259
diff changeset
22 def __repr__(self):
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
23 args = ','.join([str(arg) for arg in self.arguments])
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
24 return '{}({})'.format(self.f.name, args)
170
4348da5ca307 Cleanup of ir dir
Windel Bouwman
parents: 160
diff changeset
25
262
ed14e077124c Added conditional branch instructions
Windel Bouwman
parents: 261
diff changeset
26
171
3eb9b9e2958d Improved IR code
Windel Bouwman
parents: 170
diff changeset
27 # Data operations
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
28 class Binop(Expression):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
29 ops = ['+', '-', '*', '/', '|', '&', '<<', '>>']
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
30 def __init__(self, value1, operation, value2):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
31 assert operation in Binop.ops
261
444b9df2ed99 try to split up code generation
Windel Bouwman
parents: 259
diff changeset
32 self.value1 = value1
444b9df2ed99 try to split up code generation
Windel Bouwman
parents: 259
diff changeset
33 self.value2 = value2
444b9df2ed99 try to split up code generation
Windel Bouwman
parents: 259
diff changeset
34 self.operation = operation
239
63bb40758066 added check
Windel Bouwman
parents: 230
diff changeset
35
230
88a1e0baef65 Added some tests for IR-code
Windel Bouwman
parents: 222
diff changeset
36 def __repr__(self):
88a1e0baef65 Added some tests for IR-code
Windel Bouwman
parents: 222
diff changeset
37 a, b = self.value1, self.value2
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
38 return '({} {} {})'.format(a, self.operation, b)
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
39
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
40
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
41 def Add(a, b):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
42 return Binop(a, '+', b)
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
43
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
44
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
45 class Alloc(Expression):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
46 """ Allocates space on the stack """
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
47 def __init__(self):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
48 super().__init__()
70
35286e8abd03 Added some llvm classes
windel
parents:
diff changeset
49
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
50 def __repr__(self):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
51 return 'Alloc'
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
52
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
53
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
54 class Temp(Expression):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
55 """ Temporary storage, same as register """
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
56 def __init__(self, name):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
57 self.name = name
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
58
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
59 def __repr__(self):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
60 return 'T_{}_'.format(self.name)
239
63bb40758066 added check
Windel Bouwman
parents: 230
diff changeset
61
261
444b9df2ed99 try to split up code generation
Windel Bouwman
parents: 259
diff changeset
62
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
63 class Mem(Expression):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
64 def __init__(self, e):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
65 self.e = e
252
c4370696ccc7 added optimize function
Windel Bouwman
parents: 239
diff changeset
66
c4370696ccc7 added optimize function
Windel Bouwman
parents: 239
diff changeset
67 def __repr__(self):
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
68 return '[{}]'.format(self.e)
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
69
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
70
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
71 class Statement:
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
72 """ Base class for all instructions. """
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
73 pass
157
8f3924b6076e Added some code generator things
Windel Bouwman
parents: 155
diff changeset
74
261
444b9df2ed99 try to split up code generation
Windel Bouwman
parents: 259
diff changeset
75
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
76 class Move(Statement):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
77 def __init__(self, dst, src):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
78 self.dst = dst
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
79 self.src = src
259
ac603eb66b63 Added function call
Windel Bouwman
parents: 258
diff changeset
80
252
c4370696ccc7 added optimize function
Windel Bouwman
parents: 239
diff changeset
81 def __repr__(self):
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
82 return '{} = {}'.format(self.dst, self.src)
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
83
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
84
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
85 class Exp(Statement):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
86 def __init__(self, e):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
87 self.e = e
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
88
252
c4370696ccc7 added optimize function
Windel Bouwman
parents: 239
diff changeset
89
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
90 class Label(Statement):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
91 def __init__(self, name):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
92 self.name = name
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
93 self.statements = []
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
94
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
95 def __repr__(self):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
96 return 'LABEL {}:'.format(self.name)
160
10330be89bc2 Started from scratch with code edit
Windel Bouwman
parents: 158
diff changeset
97
261
444b9df2ed99 try to split up code generation
Windel Bouwman
parents: 259
diff changeset
98
171
3eb9b9e2958d Improved IR code
Windel Bouwman
parents: 170
diff changeset
99 # Branching:
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
100 class Jump(Statement):
219
1fa3e0050b49 Expanded ad hoc code generator
Windel Bouwman
parents: 209
diff changeset
101 def __init__(self, target):
261
444b9df2ed99 try to split up code generation
Windel Bouwman
parents: 259
diff changeset
102 self.target = target
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
103 self.Targets = [target]
261
444b9df2ed99 try to split up code generation
Windel Bouwman
parents: 259
diff changeset
104
219
1fa3e0050b49 Expanded ad hoc code generator
Windel Bouwman
parents: 209
diff changeset
105 def __repr__(self):
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
106 return 'BRANCH {}'.format(self.target.name)
170
4348da5ca307 Cleanup of ir dir
Windel Bouwman
parents: 160
diff changeset
107
261
444b9df2ed99 try to split up code generation
Windel Bouwman
parents: 259
diff changeset
108
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
109 class CJump(Statement):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
110 def __init__(self, a, cond, b, lab_yes, lab_no):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
111 assert cond in ['==', '<', '>', '>=', '<=', '!=']
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
112 self.a = a
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
113 self.cond = cond
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
114 self.b = b
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
115 self.lab_yes = lab_yes
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
116 self.lab_no = lab_no
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
117 self.Targets = [lab_yes, lab_no]
261
444b9df2ed99 try to split up code generation
Windel Bouwman
parents: 259
diff changeset
118
265
Windel Bouwman
parents: 264
diff changeset
119 def __repr__(self):
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
120 return 'IF {} {} {} THEN {} ELSE {}'.format(self.a, self.cond, self.b, self.lab_yes, self.lab_no)
170
4348da5ca307 Cleanup of ir dir
Windel Bouwman
parents: 160
diff changeset
121
261
444b9df2ed99 try to split up code generation
Windel Bouwman
parents: 259
diff changeset
122
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
123 class Return(Statement):
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
124 def __init__(self, value):
261
444b9df2ed99 try to split up code generation
Windel Bouwman
parents: 259
diff changeset
125 self.value = value
268
5ec7580976d9 Op naar tree-IR
Windel Bouwman
parents: 266
diff changeset
126 self.Targets = [] # TODO: Do this in another way
261
444b9df2ed99 try to split up code generation
Windel Bouwman
parents: 259
diff changeset
127
444b9df2ed99 try to split up code generation
Windel Bouwman
parents: 259
diff changeset
128 def __repr__(self):
444b9df2ed99 try to split up code generation
Windel Bouwman
parents: 259
diff changeset
129 if self.value:
444b9df2ed99 try to split up code generation
Windel Bouwman
parents: 259
diff changeset
130 return 'ret {0}'.format(self.value)
444b9df2ed99 try to split up code generation
Windel Bouwman
parents: 259
diff changeset
131 else:
444b9df2ed99 try to split up code generation
Windel Bouwman
parents: 259
diff changeset
132 return 'ret'
444b9df2ed99 try to split up code generation
Windel Bouwman
parents: 259
diff changeset
133
444b9df2ed99 try to split up code generation
Windel Bouwman
parents: 259
diff changeset
134