Mercurial > lcfOS
diff python/arm_cm3.py @ 202:f22b431f4113
Added arm add instruction
author | Windel Bouwman |
---|---|
date | Sat, 15 Jun 2013 10:02:50 +0200 |
parents | |
children | ca1ea402f6a1 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/python/arm_cm3.py Sat Jun 15 10:02:50 2013 +0200 @@ -0,0 +1,75 @@ +from target import Register, Instruction, Target +from asmnodes import ASymbol, ANumber +from ppci import CompilerError +import struct, types + +def u16(h): + return struct.pack('<H', h) + +armtarget = Target('arm') + +# Add a custom operand mapping method: +def mapOp(self, operand): + if type(operand) is ASymbol: + # try to map to register: + regs = {} + for r in self.registers: + regs[r.name] = r + if operand.name in regs: + reg = regs[operand.name] + return reg + elif type(operand) is ANumber: + return ArmImm(operand.number) + raise CompilerError('Cannot map {0}'.format(operand)) + +armtarget.mapOperand = types.MethodType(mapOp, armtarget) + +# Define: +registers = 'r0,r1,r2,r3,r4,r5' + +class ArmReg(Register): + def __init__(self, num, name): + super().__init__(name) + self.num = num + +class ArmImm: + def __init__(self, i): + self.i = i + +# 8 bit registers: +r4 = ArmReg(4, 'r4') +armtarget.registers.append(r4) + +class ArmInstruction(Instruction): + pass + +@armtarget.instruction +class ldr_ins(ArmInstruction): + mnemonic = 'ldr' + opcode = 1337 + + +@armtarget.instruction +class mov_ins(ArmInstruction): + """ mov Rd, imm8, move immediate value into register """ + mnemonic = 'mov' + opcode = 4 # 00100 + operands = (ArmReg, ArmImm) + def __init__(self, r, imm): + self.imm = imm.i + self.r = r.num + def encode(self): + rd = self.r + opcode = self.opcode + imm8 = self.imm + h = (opcode << 11) | (rd << 8) | imm8 + return u16(h) + + +@armtarget.instruction +class yield_ins(ArmInstruction): + operands = () + mnemonic = 'yield' + def encode(self): + return u16(0xbf10) +