322
|
1
|
342
|
2 from ppci.target.thumb.instructions import Orr, Lsl, Str2, Ldr2, Ldr3
|
|
3 from ppci.target.thumb.instructions import B, Bl, Bgt, Blt, Beq, Bne
|
|
4 from ppci.target.thumb.instructions import Mov2, Mov3, Sub3
|
|
5 from ppci.target.thumb.instructions import Add3, Sub, Cmp, Sub2, Add2, Mul
|
322
|
6
|
|
7 %%
|
|
8
|
323
|
9 %terminal ADDI32 SUBI32 MULI32
|
|
10 %terminal ORI32 SHLI32
|
322
|
11 %terminal CONSTI32 MEMI32 REGI32 CALL
|
323
|
12 %terminal MOVI32
|
367
|
13 %terminal GLOBALADDRESS CONSTDATA
|
322
|
14
|
|
15 %%
|
|
16
|
323
|
17
|
357
|
18 reg: ADDI32(reg, reg) 2 'd = self.newTmp(); self.emit(Add3, dst=[d], src=[c0, c1]); return d'
|
|
19 reg: SUBI32(reg, reg) 2 'd = self.newTmp(); self.emit(Sub3, dst=[d], src=[c0, c1]); return d'
|
|
20 reg: ORI32(reg, reg) 2 'd = self.newTmp(); self.selector.move(d, c0); self.emit(Orr, dst=[], src=[d, c1]); return d'
|
|
21 reg: SHLI32(reg, reg) 2 'd = self.newTmp(); self.selector.move(d, c0); self.emit(Lsl, dst=[], src=[d, c1]); return d'
|
|
22 reg: MULI32(reg, reg) 2 'd = self.newTmp(); self.selector.move(d, c0); self.emit(Mul, dst=[d], src=[c1, d]); return d'
|
322
|
23
|
357
|
24 reg: CONSTI32 3 'd = self.newTmp(); ln = self.selector.frame.addConstant(tree.value); self.emit(Ldr3, dst=[d], others=[ln]); return d'
|
|
25 reg: MEMI32(reg) 4 'd = self.newTmp(); self.emit(Ldr2, dst=[d], src=[c0], others=[0]); return d'
|
|
26 reg: REGI32 1 'return tree.value'
|
|
27 reg: CALL 1 'return self.selector.munchCall(tree.value)'
|
322
|
28
|
|
29
|
357
|
30 stmt: MOVI32(MEMI32(addr), reg) 3 'self.emit(Str2, src=[c0, c1])'
|
323
|
31
|
357
|
32 addr: reg 0 ''
|