Mercurial > lcfOS
view python/codegenarm.py @ 218:494828a7adf1
added some sort of cache to assembler
author | Windel Bouwman |
---|---|
date | Fri, 05 Jul 2013 15:30:22 +0200 |
parents | 62386bcee1ba |
children | 1fa3e0050b49 |
line wrap: on
line source
import ir from asmnodes import ALabel import cortexm3 as arm from ppci import CompilerError class ArmCodeGenerator: """ Simple code generator """ def __init__(self, out): self.outs = out def emit(self, item): self.outs.emit(item) def generate(self, ircode): assert isinstance(ircode, ir.Module) print('ARM code generation') self.outs.selectSection('data') for gvar in ircode.Variables: self.emit(ALabel(gvar.name)) # TODO: use initial value: self.emit(arm.dcd_ins(0)) self.outs.selectSection('code') for f in ircode.Functions: self.emit(ALabel(f.name)) # Save some registers: self.emit(arm.push_ins(arm.RegisterSet({arm.r4, arm.r5, arm.r6,arm.r7,arm.lr}))) for bb in f.BasicBlocks: self.emit(ALabel(bb.name)) for ins in bb.Instructions: self.generateInstruction(ins) def generateInstruction(self, ins): if type(ins) is ir.Branch: self.emit(arm.jmp_ins(ins.target)) elif type(ins) is ir.ImmLoad and ins.value < 255: self.emit(arm.mov_ins(arm.r0, arm.Imm8(ins.value))) # determine stack frame.. self.emit(arm.mov_ins(arm.r1, arm.Imm8(9))) #self.emit(arm. elif type(ins) is ir.ImmLoad and ins.value < (2**32): print(ins) elif type(ins) is ir.Store: print(ins) elif type(ins) is ir.Return: self.emit(arm.pop_ins(arm.RegisterSet({arm.r5, arm.r6, arm.pc}))) elif type(ins) is ir.Load: print(ins) elif type(ins) is ir.BinaryOperator: print(ins) elif type(ins) is ir.ConditionalBranch: print(ins) self.emit(arm.cmp_ins(arm.r1, arm.r0)) else: raise CompilerError('IR "{}" not covered'.format(ins))