346
|
1
|
359
|
2 from ppci.target.arm.instructions import Add1, Add2, Sub1, Mul1
|
354
|
3 from ppci.target.arm.instructions import Ldr1, Ldr3, Adr
|
357
|
4 from ppci.target.arm.instructions import And1, Lsr1, Lsl1, Mov1
|
346
|
5
|
|
6 %%
|
|
7
|
354
|
8 %terminal ADDI32 SUBI32 MULI32 ADR
|
356
|
9 %terminal ORI32 SHLI32 SHRI32 ANDI32
|
354
|
10 %terminal CONSTI32 CONSTDATA MEMI32 REGI32 CALL
|
346
|
11 %terminal MOVI32
|
|
12
|
|
13 %%
|
|
14
|
357
|
15 reg: ADDI32(reg, reg) 2 'd = self.newTmp(); self.emit(Add1, dst=[d], src=[c0, c1]); return d'
|
359
|
16 reg: ADDI32(reg, cn) 2 'return tree.children[1].value < 256' 'd = self.newTmp(); self.emit(Add2, dst=[d], src=[c0], others=[c1]); return d'
|
|
17 reg: ADDI32(cn, reg) 2 'return tree.children[0].value < 256' 'd = self.newTmp(); self.emit(Add2, dst=[d], src=[c1], others=[c0]); return d'
|
357
|
18 reg: SUBI32(reg, reg) 2 'd = self.newTmp(); self.emit(Sub1, dst=[d], src=[c0, c1]); return d'
|
|
19 reg: MULI32(reg, reg) 2 'd = self.newTmp(); self.emit(Mul1, dst=[d], src=[c0, c1]); return d'
|
|
20 reg: ANDI32(reg, reg) 2 'd = self.newTmp(); self.emit(And1, dst=[d], src=[c0, c1]); return d'
|
|
21 reg: SHRI32(reg, reg) 2 'd = self.newTmp(); self.emit(Lsr1, dst=[d], src=[c0, c1]); return d'
|
354
|
22
|
357
|
23 reg: MEMI32(ADDI32(reg, cn)) 2 'd = self.newTmp(); self.emit(Ldr1, dst=[d], src=[c0], others=[c1]); return d'
|
|
24 reg: MEMI32(reg) 2 'd = self.newTmp(); self.emit(Ldr1, dst=[d], src=[c0], others=[0]); return d'
|
346
|
25
|
|
26
|
357
|
27 cn: CONSTI32 0 'return tree.value'
|
346
|
28
|
357
|
29 reg: CONSTI32 6 'd = self.newTmp(); ln = self.selector.frame.add_constant(tree.value); self.emit(Ldr3, dst=[d], others=[ln]); return d'
|
|
30
|
|
31 reg: CONSTI32 2 'return (type(tree.value) is int) and (tree.value < 256)' 'd = self.newTmp(); self.emit(Mov1, dst=[d], others=[tree.value]); return d'
|
354
|
32
|
357
|
33 reg: ADR(CONSTDATA) 2 'd = self.newTmp(); ln = self.selector.frame.add_constant(tree.children[0].value); self.emit(Adr, dst=[d], others=[ln]); return d'
|
354
|
34
|
357
|
35 reg: REGI32 1 'return tree.value'
|
352
|
36
|
357
|
37 reg: CALL 1 'return self.selector.munchCall(tree.value)'
|
|
38
|