Mercurial > lcfOS
changeset 262:ed14e077124c
Added conditional branch instructions
author | Windel Bouwman |
---|---|
date | Fri, 09 Aug 2013 11:30:11 +0200 |
parents | 444b9df2ed99 |
children | c352dec19299 |
files | python/codegenarm.py python/cortexm3.py python/ir/instruction.py python/stm32f4/burn2.c3 python/testasm.py |
diffstat | 5 files changed, 87 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/python/codegenarm.py Fri Aug 09 09:05:13 2013 +0200 +++ b/python/codegenarm.py Fri Aug 09 11:30:11 2013 +0200 @@ -5,6 +5,15 @@ from ppci import CompilerError import irmach + +class InstructionSelector: + pass + + +class RegisterAllocator: + pass + + class ArmCodeGenerator: """ Simple code generator @@ -173,13 +182,17 @@ r0 = self.getreg(ins.a) r1 = self.getreg(ins.b) self.emit(arm.cmp_ins(r1, r0)) - tgt_yes = Label(ins.lab1.name) + tgt_yes = LabelRef(ins.lab1.name) if ins.cond == '==': self.emit(arm.beq_ins(tgt_yes)) + elif ins.cond == '<': + self.emit(arm.blt_ins(tgt_yes)) + elif ins.cond == '>': + self.emit(arm.bgt_ins(tgt_yes)) else: raise NotImplementedError('"{}" not covered'.format(ins.cond)) - tgt_no = Label(ins.lab2.name) - self.emit(arm.jmp_ins(tgt_no)) + tgt_no = LabelRef(ins.lab2.name) + self.emit(arm.b_ins(tgt_no)) self.freereg(ins.a, ins) self.freereg(ins.b, ins) elif type(ins) is ir.Alloc:
--- a/python/cortexm3.py Fri Aug 09 09:05:13 2013 +0200 +++ b/python/cortexm3.py Fri Aug 09 11:30:11 2013 +0200 @@ -501,16 +501,31 @@ h = (0b1101 << 12) | (self.cond << 8) | imm8 return u16(h) + @armtarget.instruction class beq_ins(cond_base_ins): mnemonic = 'beq' cond = 0 + @armtarget.instruction -class beq_ins(cond_base_ins): +class bne_ins(cond_base_ins): mnemonic = 'bne' cond = 1 + +@armtarget.instruction +class blt_ins(cond_base_ins): + mnemonic = 'blt' + cond = 0b1011 + + +@armtarget.instruction +class blt_ins(cond_base_ins): + mnemonic = 'bgt' + cond = 0b1100 + + @armtarget.instruction class push_ins(ArmInstruction): operands = (RegisterSet,)
--- a/python/ir/instruction.py Fri Aug 09 09:05:13 2013 +0200 +++ b/python/ir/instruction.py Fri Aug 09 11:30:11 2013 +0200 @@ -37,6 +37,7 @@ use_ins.replaceValue(self, v2.value) assert not self.Used + class Variable(Value): pass @@ -98,6 +99,7 @@ Parent = property(getParent, setParent) def replaceValue(self, old, new): + # TODO: make this a generic function raise NotImplementedError('{}'.format(type(self))) @property @@ -187,6 +189,7 @@ def __repr__(self): return '{} = {}'.format(self.target, self.value) + # Data operations class BinaryOperator(Instruction): def __init__(self, result, operation, value1, value2):
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/python/stm32f4/burn2.c3 Fri Aug 09 11:30:11 2013 +0200 @@ -0,0 +1,45 @@ +/* + +This file blinks a LED on the STM32F4 discovery board. + +the board has 4 leds on PD12, PD13, PD14 and PD15 + +*/ + +package burn2; + +import stm32f4xx; + +function void init() +{ + var RCC_Type RCC; + RCC = cast<RCC_Type>(0x40023800); + + // Enable the clock to port D: + RCC->AHB1ENR = RCC->AHB1ENR | (1 << 3); + // Memory mapped control registers: + var GPIO_Type GPIOD; + GPIOD = cast<GPIO_Type>(0x40020C00); + + var int pin; + pin = 15; + // PD13 == output (01) + GPIOD->MODER = (1 << (pin << 1)); + GPIOD->ODR = (1 << pin); +} + + +function void main() +{ + init(); + + var int a; + a = 0 + while (a < 1000) + { + a = a + 1; + } + + while(true) {} +} +
--- a/python/testasm.py Fri Aug 09 09:05:13 2013 +0200 +++ b/python/testasm.py Fri Aug 09 11:30:11 2013 +0200 @@ -228,6 +228,12 @@ self.feed('eof: b eof') self.check('01e000d0 ffd1fbe7 fee7') + def testConditions(self): + self.feed('blt x') + self.feed('bgt x') + self.feed('x:') + self.check('00dbffdc') + def testBoff(self): self.feed('b henkie') self.feed('b henkie') @@ -265,6 +271,7 @@ self.feed('loop: add r6, r4, 7') self.feed('cmp r6, 5') self.check('0325 2c1c e61d 052e') + def testSequence2(self): self.feed('henkie:') self.feed('push {r1,r4,r5}')