Mercurial > lcfOS
comparison python/codegenarm.py @ 234:83781bd10fdb
wip
author | Windel Bouwman |
---|---|
date | Sun, 14 Jul 2013 19:29:21 +0200 |
parents | e621e3ba78d2 |
children | ff40407c0240 |
comparison
equal
deleted
inserted
replaced
233:d3dccf12ca88 | 234:83781bd10fdb |
---|---|
1 import ir | 1 import ir |
2 from asmnodes import ALabel, AComment | 2 from target import Label, Comment |
3 import cortexm3 as arm | 3 import cortexm3 as arm |
4 from ppci import CompilerError | 4 from ppci import CompilerError |
5 | 5 |
6 class ArmCodeGenerator: | 6 class ArmCodeGenerator: |
7 """ | 7 """ |
35 # Add global variable addresses to immediate list: | 35 # Add global variable addresses to immediate list: |
36 for gvar in ircode.Variables: | 36 for gvar in ircode.Variables: |
37 pass #self.imms.append(( | 37 pass #self.imms.append(( |
38 | 38 |
39 self.stack_frame = [] | 39 self.stack_frame = [] |
40 self.emit(ALabel(f.name)) | 40 self.emit(Label(f.name)) |
41 # Save some registers: | 41 # Save some registers: |
42 self.emit(arm.push_ins(arm.RegisterSet({arm.r4, arm.r5, arm.r6,arm.r7,arm.lr}))) | 42 self.emit(arm.push_ins(arm.RegisterSet({arm.r4, arm.r5, arm.r6,arm.r7,arm.lr}))) |
43 for bb in f.BasicBlocks: | 43 for bb in f.BasicBlocks: |
44 self.emit(ALabel(bb.name)) | 44 self.emit(Label(bb.name)) |
45 for ins in bb.Instructions: | 45 for ins in bb.Instructions: |
46 self.generateInstruction(ins) | 46 self.generateInstruction(ins) |
47 | 47 |
48 self.outs.align(4) | 48 self.outs.align(4) |
49 while self.imms: | 49 while self.imms: |
50 l, v = self.imms.pop() | 50 l, v = self.imms.pop() |
51 self.emit(ALabel(l)) | 51 self.emit(Label(l)) |
52 self.emit(arm.dcd_ins(v)) | 52 self.emit(arm.dcd_ins(v)) |
53 self.outs.align(4) | 53 self.outs.align(4) |
54 | 54 |
55 # Helper functions: | 55 # Helper functions: |
56 def getStack(self, v): | 56 def getStack(self, v): |
63 _global_address = g.name + '__global' | 63 _global_address = g.name + '__global' |
64 self.emit(arm.ldr_pcrel(r, ALabel(_global_address))) | 64 self.emit(arm.ldr_pcrel(r, ALabel(_global_address))) |
65 def loadStack(self, reg, val): | 65 def loadStack(self, reg, val): |
66 self.emit(arm.ldr_sprel(reg, arm.MemSpRel(self.getStack(val)))) | 66 self.emit(arm.ldr_sprel(reg, arm.MemSpRel(self.getStack(val)))) |
67 def comment(self, txt): | 67 def comment(self, txt): |
68 self.emit(AComment(txt)) | 68 self.emit(Comment(txt)) |
69 | 69 |
70 def generateInstruction(self, ins): | 70 def generateInstruction(self, ins): |
71 self.comment(str(ins)) | 71 self.comment(str(ins)) |
72 if type(ins) is ir.Branch: | 72 if type(ins) is ir.Branch: |
73 tgt = ALabel(ins.target.name) | 73 tgt = Label(ins.target.name) |
74 self.emit(arm.jmp_ins(tgt)) | 74 self.emit(arm.jmp_ins(tgt)) |
75 elif type(ins) is ir.ImmLoad: | 75 elif type(ins) is ir.ImmLoad: |
76 lname = ins.target.name + '_ivalue' | 76 lname = ins.target.name + '_ivalue' |
77 self.emit(arm.ldr_pcrel(arm.r0, ALabel(lname))) | 77 self.emit(arm.ldr_pcrel(arm.r0, Label(lname))) |
78 self.imms.append((lname, ins.value)) | 78 self.imms.append((lname, ins.value)) |
79 self.emit(arm.str_sprel(arm.r0, arm.MemSpRel(self.addStack(ins.target)))) | 79 self.emit(arm.str_sprel(arm.r0, arm.MemSpRel(self.addStack(ins.target)))) |
80 elif type(ins) is ir.Store: | 80 elif type(ins) is ir.Store: |
81 # Load value in r0: | 81 # Load value in r0: |
82 self.loadStack(arm.r0, ins.value) | 82 self.loadStack(arm.r0, ins.value) |