annotate python/ppci/ir2tree.py @ 341:4d204f6f7d4e devel

Rewrite of assembler parts
author Windel Bouwman
date Fri, 28 Feb 2014 18:07:14 +0100
parents e9fe6988497c
children 5477e499b039
rev   line source
322
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
1 from tree import Tree
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
2 from . import ir
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
3
323
e9fe6988497c Used burg for generating expressions
Windel Bouwman
parents: 322
diff changeset
4 """ Create a tree from ir code. """
e9fe6988497c Used burg for generating expressions
Windel Bouwman
parents: 322
diff changeset
5
322
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
6 f_map = {} # Mapping from types to tree creation functions
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
7
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
8 def register(tp):
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
9 """ Register a function for type tp """
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
10 def reg_f(f):
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
11 f_map[tp] = f
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
12 return f
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
13 return reg_f
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
14
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
15 @register(ir.Binop)
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
16 def binop_to_tree(e):
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
17 names = {'+':'ADDI32', '-':'SUBI32', '|':'ORI32', '<<':'SHLI32',
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
18 '*':'MULI32'}
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
19 op = names[e.operation]
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
20 return Tree(op, makeTree(e.a), makeTree(e.b))
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
21
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
22 @register(ir.Temp)
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
23 def temp_to_tree(e):
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
24 t = Tree('REGI32')
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
25 t.value = e
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
26 return t
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
27
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
28 @register(ir.Const)
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
29 def const_to_tree(e):
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
30 t = Tree('CONSTI32')
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
31 t.value = e.value
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
32 return t
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
33
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
34 @register(ir.Mem)
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
35 def mem_to_tree(e):
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
36 return Tree('MEMI32', makeTree(e.e))
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
37
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
38 @register(ir.Call)
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
39 def call_to_tree(e):
323
e9fe6988497c Used burg for generating expressions
Windel Bouwman
parents: 322
diff changeset
40 t = Tree('CALL')
e9fe6988497c Used burg for generating expressions
Windel Bouwman
parents: 322
diff changeset
41 t.value = e
e9fe6988497c Used burg for generating expressions
Windel Bouwman
parents: 322
diff changeset
42 return t
322
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
43
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
44 def makeTree(ir_node):
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
45 """ Transform an ir node into a tree usable for matching """
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
46 return f_map[type(ir_node)](ir_node)