comparison python/codegenarm.py @ 222:c3f1ce8b638f

Fixup of parser
author Windel Bouwman
date Tue, 09 Jul 2013 17:36:31 +0200
parents 1fa3e0050b49
children 1c7364bd74c7
comparison
equal deleted inserted replaced
221:848c4b15fd0b 222:c3f1ce8b638f
63 self.emit(arm.jmp_ins(tgt)) 63 self.emit(arm.jmp_ins(tgt))
64 elif type(ins) is ir.ImmLoad: 64 elif type(ins) is ir.ImmLoad:
65 lname = ins.target.name + '_ivalue' 65 lname = ins.target.name + '_ivalue'
66 self.emit(arm.ldr_pcrel(arm.r0, ALabel(lname))) 66 self.emit(arm.ldr_pcrel(arm.r0, ALabel(lname)))
67 self.imms.append((lname, ins.value)) 67 self.imms.append((lname, ins.value))
68 self.emit(arm.str_sprel(arm.r0, self.addStack(ins.target))) 68 self.emit(arm.str_sprel(arm.r0, arm.MemoryOp(arm.sp, self.addStack(ins.target))))
69 elif type(ins) is ir.Store: 69 elif type(ins) is ir.Store:
70 # Load value in r0: 70 # Load value in r0:
71 self.emit(arm.ldr_sprel(arm.r0, self.getStack(ins.value))) 71 self.emit(arm.ldr_sprel(arm.r0, arm.MemoryOp(arm.sp, self.getStack(ins.value))))
72 # store in memory: 72 # store in memory:
73 self.getGlobal(arm.r1, ins.location) 73 self.getGlobal(arm.r1, ins.location)
74 self.emit(arm.storeimm5_ins(arm.r0, arm.MemoryOp(arm.r1, 0))) 74 self.emit(arm.storeimm5_ins(arm.r0, arm.MemoryOp(arm.r1, 0)))
75 elif type(ins) is ir.Load: 75 elif type(ins) is ir.Load:
76 self.getGlobal(arm.r0, ins.location) 76 self.getGlobal(arm.r0, ins.location)
77 self.emit(arm.loadimm5_ins(arm.r0, arm.MemoryOp(arm.r0, 0))) 77 self.emit(arm.loadimm5_ins(arm.r0, arm.MemoryOp(arm.r0, 0)))
78 # Store value on stack: 78 # Store value on stack:
79 self.emit(arm.str_sprel(arm.r0, self.addStack(ins.value))) 79 self.emit(arm.str_sprel(arm.r0, arm.MemoryOp(arm.sp, self.addStack(ins.value))))
80 elif type(ins) is ir.BinaryOperator: 80 elif type(ins) is ir.BinaryOperator:
81 # Load operands: 81 # Load operands:
82 self.emit(arm.ldr_sprel(arm.r0, self.getStack(ins.value1))) 82 self.emit(arm.ldr_sprel(arm.r0, arm.MemoryOp(arm.sp, self.getStack(ins.value1))))
83 self.emit(arm.ldr_sprel(arm.r1, self.getStack(ins.value2))) 83 self.emit(arm.ldr_sprel(arm.r1, arm.MemoryOp(arm.sp, self.getStack(ins.value2))))
84 # do operation: 84 # do operation:
85 if ins.operation == '+': 85 if ins.operation == '+':
86 self.emit(arm.addregs_ins(arm.r0, arm.r0, arm.r1)) 86 self.emit(arm.addregs_ins(arm.r0, arm.r0, arm.r1))
87 else: 87 else:
88 print('operation not implemented', ins.operation) 88 print('operation not implemented', ins.operation)
89 # Store value back: 89 # Store value back:
90 self.emit(arm.str_sprel(arm.r0, self.addStack(ins.result))) 90 self.emit(arm.str_sprel(arm.r0, arm.MemoryOp(arm.sp, self.addStack(ins.result))))
91 elif type(ins) is ir.Return: 91 elif type(ins) is ir.Return:
92 self.emit(arm.pop_ins(arm.RegisterSet({arm.r4, arm.r5, arm.r6, arm.r7, arm.pc}))) 92 self.emit(arm.pop_ins(arm.RegisterSet({arm.r4, arm.r5, arm.r6, arm.r7, arm.pc})))
93 elif type(ins) is ir.ConditionalBranch: 93 elif type(ins) is ir.ConditionalBranch:
94 self.emit(arm.ldr_sprel(arm.r0, self.getStack(ins.a))) 94 self.emit(arm.ldr_sprel(arm.r0, arm.MemoryOp(arm.sp, self.getStack(ins.a))))
95 self.emit(arm.ldr_sprel(arm.r1, self.getStack(ins.b))) 95 self.emit(arm.ldr_sprel(arm.r1, arm.MemoryOp(arm.sp, self.getStack(ins.b))))
96 self.emit(arm.cmp_ins(arm.r1, arm.r0)) 96 self.emit(arm.cmp_ins(arm.r1, arm.r0))
97 tgt_yes = ALabel(ins.lab1.name) 97 tgt_yes = ALabel(ins.lab1.name)
98 if ins.cond == '==': 98 if ins.cond == '==':
99 self.emit(arm.beq_ins(tgt_yes)) 99 self.emit(arm.beq_ins(tgt_yes))
100 else: 100 else:
101 print('TODO', ins.cond) 101 print('TODO', ins.cond)
102 tgt_no = ALabel(ins.lab2.name) 102 tgt_no = ALabel(ins.lab2.name)
103 self.emit(arm.jmp_ins(tgt_no)) 103 self.emit(arm.jmp_ins(tgt_no))
104 elif type(ins) is ir.Alloc:
105 self.addStack(ins.value)
104 else: 106 else:
105 raise CompilerError('IR "{}" not covered'.format(ins)) 107 raise CompilerError('IR "{}" not covered'.format(ins))
106 108
107 109