From: Philipp K. K. <pk...@sp...> - 2014-02-12 11:08:10
|
Am 12.02.2014 10:57, schrieb Ben Shi: > Hello, > > I find a redundant stm8 code serial, that with the following c code > > int ss(int s) > { > s += 1; > return s + 0x2030; > } > > the following asms are generated > > ; a.c: 2: int ss(int s) > ; ----------------------------------------- > ; function ss > ; ----------------------------------------- > _ss: > ; a.c: 4: s += 1; > ldw x, (0x03, sp) > incw x > ldw (0x03, sp), x > ; a.c: 5: return s + 0x2030; > ldw x, (0x03, sp) > addw x, #0x2030 > ret > > I thougth the "ldw x, (0x03, sp)" is unnecessary here, can there be > adding a rule to the peeph.def? like > > replace restart { > ldw %1, %2 > ldw %2, %1 > } by { > ldw %1, %2 > } > > Ben > That rules eliminates a write of %2 and a read of %1. We may only do this if neither is volatile. To be correct, your peephole needs a condition: if notVolatile(%1), notVolatile(%2) Unfortunately, notVolatile() is currently a very rough guess. This will result in the rule probably not being applied in your case (but the rule would help if s was global instead of local, since notVolatile() seems to work better for global than for local variables). See RFE #407 for a suggestion on how to improve notVolatile(). Philipp P.S.: Why does the stm8 port even use s again for the result of s += 1, instead of a iTemp. The z80 port does the same as the stm8, but the hc08 port seems to be more efficient. |