Mercurial > lcfOS
comparison python/cortexm3.py @ 276:56d37ed4b4d2
phaa
author | Windel Bouwman |
---|---|
date | Mon, 16 Sep 2013 21:51:17 +0200 |
parents | 6f2423df0675 |
children | 046017431c6a |
comparison
equal
deleted
inserted
replaced
275:6f2423df0675 | 276:56d37ed4b4d2 |
---|---|
109 def __repr__(self): | 109 def __repr__(self): |
110 return '[{}, #{}]'.format(self.regname, self.offset) | 110 return '[{}, #{}]'.format(self.regname, self.offset) |
111 | 111 |
112 @classmethod | 112 @classmethod |
113 def Create(cls, vop): | 113 def Create(cls, vop): |
114 if type(vop) is AUnop and vop.operation == '[]': | 114 if type(vop) is AUnop and vop.operation == '[]' and type(vop.arg) is ABinop and vop.arg.op == '+': |
115 vop = vop.arg # descent | 115 vop = vop.arg # descent |
116 offset = isRegOffset(cls.regname, vop.arg1, vop.arg2) | 116 offset = isRegOffset(cls.regname, vop.arg1, vop.arg2) |
117 if type(offset) is int: | 117 if type(offset) is int: |
118 if offset % 4 == 0: | 118 if offset % 4 == 0: |
119 offset = vop.arg2.number | 119 offset = vop.arg2.number |
120 return cls(offset) | 120 return cls(offset) |
121 elif type(vop) is ASymbol and vop.name.upper() == self.regname: | 121 elif type(vop) is ASymbol and vop.name.upper() == self.regname: |
122 return cls(0) | 122 return cls(0) |
123 | 123 |
124 | |
124 class MemSpRel(MemRegXRel): | 125 class MemSpRel(MemRegXRel): |
125 regname = 'SP' | 126 regname = 'SP' |
126 | 127 |
127 class MemPcRel(MemRegXRel): | |
128 regname = 'PC' | |
129 | 128 |
130 class MemR8Rel: | 129 class MemR8Rel: |
131 def __init__(self, basereg, offset): | 130 def __init__(self, basereg, offset): |
132 assert type(basereg) is ArmReg | 131 assert type(basereg) is ArmReg |
133 self.basereg = basereg | 132 self.basereg = basereg |
161 | 160 |
162 class RegisterSet: | 161 class RegisterSet: |
163 def __init__(self, regs): | 162 def __init__(self, regs): |
164 assert type(regs) is set | 163 assert type(regs) is set |
165 self.regs = regs | 164 self.regs = regs |
165 | |
166 def __repr__(self): | 166 def __repr__(self): |
167 return ','.join([str(r) for r in self.regs]) | 167 return ','.join([str(r) for r in self.regs]) |
168 | |
168 @classmethod | 169 @classmethod |
169 def Create(cls, vop): | 170 def Create(cls, vop): |
170 assert type(vop) is AUnop and vop.operation == '{}' | 171 assert type(vop) is AUnop and vop.operation == '{}' |
171 assert type(vop.arg) is list | 172 assert type(vop.arg) is list |
172 regs = set() | 173 regs = set() |
216 lr = ArmReg(14, 'lr') | 217 lr = ArmReg(14, 'lr') |
217 armtarget.registers.append(lr) | 218 armtarget.registers.append(lr) |
218 pc = ArmReg(15, 'pc') | 219 pc = ArmReg(15, 'pc') |
219 armtarget.registers.append(pc) | 220 armtarget.registers.append(pc) |
220 | 221 |
222 | |
221 class ArmInstruction(Instruction): | 223 class ArmInstruction(Instruction): |
222 pass | 224 pass |
223 | 225 |
224 | 226 |
225 @armtarget.instruction | 227 @armtarget.instruction |
305 x = x + 1 | 307 x = x + 1 |
306 return x | 308 return x |
307 | 309 |
308 @armtarget.instruction | 310 @armtarget.instruction |
309 class ldr_pcrel(ArmInstruction): | 311 class ldr_pcrel(ArmInstruction): |
310 """ ldr Rt, [PC, imm8], store value into memory """ | 312 """ ldr Rt, LABEL, load value from pc relative position """ |
311 mnemonic = 'ldr' | 313 mnemonic = 'ldr' |
312 operands = (RegOp, LabelRef) | 314 operands = (RegOp, LabelRef) |
313 def __init__(self, rt, label): | 315 def __init__(self, rt, label): |
314 assert isinstance(label, LabelRef) | 316 assert isinstance(label, LabelRef) |
315 self.rt = rt | 317 self.rt = rt |
372 | 374 |
373 # Arithmatics: | 375 # Arithmatics: |
374 | 376 |
375 | 377 |
376 | 378 |
377 @armtarget.instruction | 379 class regregimm3_base(ArmInstruction): |
378 class addregregimm3_ins(ArmInstruction): | 380 operands = (Reg8Op, Reg8Op, Imm3) |
379 """ add Rd, Rn, imm3 """ | |
380 mnemonic = 'add' | |
381 opcode = 3 # 00011 | |
382 operands = (RegOp, RegOp, Imm3) | |
383 irpattern = 3 | |
384 def __init__(self, rd, rn, imm3): | 381 def __init__(self, rd, rn, imm3): |
385 self.rd = rd | 382 self.rd = rd |
386 self.rn = rn | 383 self.rn = rn |
387 self.imm3 = imm3 | 384 self.imm3 = imm3 |
388 def encode(self): | 385 def encode(self): |
389 rd = self.rd.num | 386 rd = self.rd.num |
390 rn = self.rn.num | 387 rn = self.rn.num |
391 imm3 = self.imm3.imm | 388 imm3 = self.imm3.imm |
392 opcode = self.opcode | 389 opcode = self.opcode |
393 h = (opcode << 11) | (1 << 10) | (imm3 << 6) | (rn << 3) | rd | 390 h = (self.opcode << 9) | (imm3 << 6) | (rn << 3) | rd |
394 return u16(h) | 391 return u16(h) |
392 | |
393 | |
394 @armtarget.instruction | |
395 class addregregimm3_ins(regregimm3_base): | |
396 """ add Rd, Rn, imm3 """ | |
397 mnemonic = 'add' | |
398 opcode = 0b0001110 | |
399 | |
400 | |
401 @armtarget.instruction | |
402 class subregregimm3_ins(regregimm3_base): | |
403 """ sub Rd, Rn, imm3 """ | |
404 mnemonic = 'sub' | |
405 opcode = 0b0001111 | |
406 | |
395 | 407 |
396 class regregreg_base(ArmInstruction): | 408 class regregreg_base(ArmInstruction): |
397 """ ??? Rd, Rn, Rm """ | 409 """ ??? Rd, Rn, Rm """ |
398 operands = (Reg8Op, Reg8Op, Reg8Op) | 410 operands = (Reg8Op, Reg8Op, Reg8Op) |
399 def __init__(self, rd, rn, rm): | 411 def __init__(self, rd, rn, rm): |
435 return u16((opcode << 8) | (D << 7) |(Rm << 3) | Rd) | 447 return u16((opcode << 8) | (D << 7) |(Rm << 3) | Rd) |
436 def __repr__(self): | 448 def __repr__(self): |
437 return '{} {}, {}'.format(self.mnemonic, self.rd, self.rm) | 449 return '{} {}, {}'.format(self.mnemonic, self.rd, self.rm) |
438 | 450 |
439 | 451 |
452 @armtarget.instruction | |
453 class mulregreg_ins(ArmInstruction): | |
454 """ mul Rn, Rdm """ | |
455 operands = (Reg8Op, Reg8Op) | |
456 mnemonic = 'mul' | |
457 def __init__(self, rn, rdm): | |
458 self.rn = rn | |
459 self.rdm = rdm | |
460 def encode(self): | |
461 rn = self.rn.num | |
462 rdm = self.rdm.num | |
463 opcode = 0b0100001101 | |
464 h = (opcode << 6) | (rn << 3) | rdm | |
465 return u16(h) | |
466 def __repr__(self): | |
467 return '{} {}, {}'.format(self.mnemonic, self.rdn, self.rm) | |
440 | 468 |
441 class regreg_base(ArmInstruction): | 469 class regreg_base(ArmInstruction): |
442 """ ??? Rdn, Rm """ | 470 """ ??? Rdn, Rm """ |
443 operands = (Reg8Op, Reg8Op) | 471 operands = (Reg8Op, Reg8Op) |
444 def __init__(self, rdn, rm): | 472 def __init__(self, rdn, rm): |