Mercurial > lcfOS
comparison python/ppci/ir2tree.py @ 322:44f336460c2a
Half of use of burg spec for arm
author | Windel Bouwman |
---|---|
date | Mon, 27 Jan 2014 19:58:07 +0100 |
parents | |
children | e9fe6988497c |
comparison
equal
deleted
inserted
replaced
321:8c569fbe60e4 | 322:44f336460c2a |
---|---|
1 from tree import Tree | |
2 from . import ir | |
3 | |
4 f_map = {} # Mapping from types to tree creation functions | |
5 | |
6 def register(tp): | |
7 """ Register a function for type tp """ | |
8 def reg_f(f): | |
9 f_map[tp] = f | |
10 return f | |
11 return reg_f | |
12 | |
13 @register(ir.Binop) | |
14 def binop_to_tree(e): | |
15 names = {'+':'ADDI32', '-':'SUBI32', '|':'ORI32', '<<':'SHLI32', | |
16 '*':'MULI32'} | |
17 op = names[e.operation] | |
18 return Tree(op, makeTree(e.a), makeTree(e.b)) | |
19 | |
20 @register(ir.Temp) | |
21 def temp_to_tree(e): | |
22 t = Tree('REGI32') | |
23 t.value = e | |
24 return t | |
25 | |
26 @register(ir.Const) | |
27 def const_to_tree(e): | |
28 t = Tree('CONSTI32') | |
29 t.value = e.value | |
30 return t | |
31 | |
32 @register(ir.Mem) | |
33 def mem_to_tree(e): | |
34 return Tree('MEMI32', makeTree(e.e)) | |
35 | |
36 @register(ir.Call) | |
37 def call_to_tree(e): | |
38 return Tree('CALL') | |
39 | |
40 def makeTree(ir_node): | |
41 """ Transform an ir node into a tree usable for matching """ | |
42 return f_map[type(ir_node)](ir_node) |