Mercurial > lcfOS
comparison python/codegenarm.py @ 211:99164160fb0b
Added another missing file
author | Windel Bouwman |
---|---|
date | Sat, 29 Jun 2013 10:10:45 +0200 |
parents | |
children | 62386bcee1ba |
comparison
equal
deleted
inserted
replaced
210:67b0feafe5ae | 211:99164160fb0b |
---|---|
1 import ir | |
2 from asmnodes import ALabel | |
3 import arm_cm3 as arm | |
4 from ppci import CompilerError | |
5 | |
6 class ArmCodeGenerator: | |
7 """ Simple code generator """ | |
8 def __init__(self, out): | |
9 self.outs = out | |
10 | |
11 def emit(self, item): | |
12 self.outs.emit(item) | |
13 | |
14 def generate(self, ircode): | |
15 assert isinstance(ircode, ir.Module) | |
16 print('ARM code generation') | |
17 self.outs.selectSection('data') | |
18 | |
19 for gvar in ircode.Variables: | |
20 self.emit(ALabel(gvar.name)) | |
21 # TODO: use initial value: | |
22 self.emit(arm.dcd_ins(0)) | |
23 | |
24 self.outs.selectSection('code') | |
25 for f in ircode.Functions: | |
26 self.emit(ALabel(f.name)) | |
27 self.emit(arm.push_ins(arm.RegisterSet({arm.r2, arm.r3,arm.lr}))) | |
28 for bb in f.BasicBlocks: | |
29 self.emit(ALabel(bb.name)) | |
30 for ins in bb.Instructions: | |
31 self.generateInstruction(ins) | |
32 | |
33 def generateInstruction(self, ins): | |
34 if type(ins) is ir.Branch: | |
35 self.emit(arm.jmp_ins(ins.target)) | |
36 elif type(ins) is ir.ImmLoad and ins.value < 255: | |
37 self.emit(arm.mov_ins(arm.r0, arm.Imm8(ins.value))) | |
38 elif type(ins) is ir.Store: | |
39 print(ins) | |
40 elif type(ins) is ir.Return: | |
41 self.emit(arm.pop_ins(arm.RegisterSet({arm.r2, arm.r3, arm.pc}))) | |
42 elif type(ins) is ir.Load: | |
43 print(ins) | |
44 elif type(ins) is ir.BinaryOperator: | |
45 print(ins) | |
46 else: | |
47 print(ins) | |
48 raise CompilerError('IR "{}" not covered'.format(ins)) | |
49 | |
50 |