On 09.09.2014 00:16, Alan Cox wrote: > Is there a good way to get the SDCC compiler to produce decent Z80 output > when handling long types. I'm getting some really long and quite > revolting code out of sdcc whenever I have longs involved > > Stuff like > > ld -4 (ix),l > ld -3 (ix),h > ld -2 (ix),c > ld -1 (ix),b > pop af > ld a,#0x10 > 00115$: > sla -4 (ix) > rl -3 (ix) > rl -2 (ix) > rl -1 (ix) > dec a > jr NZ,00115$ > > (and then goes on and loads them into registers...!) > > > Rather than generating > > 00115$: sla l > rl h > rl c > rl b > dec a > jr nz, 00115$ > > > > Initializers like > > ;devsd.c:134: sd_first_uzi_sector = 0; > xor a, a > ld (#_sd_first_uzi_sector + 0),a > ld (#_sd_first_uzi_sector + 1),a > ld (#_sd_first_uzi_sector + 2),a > ld (#_sd_first_uzi_sector + 3),a > ;devsd.c:135: sd_blockdev_count = 0; > ld hl,#_sd_blockdev_count + 0 > ld (hl), #0x00 > ld hl,#_sd_blockdev_count + 1 > ld (hl), #0x00 > > rather than > xor a > ld hl, #_sd_first_uzi_sector > ld (hl), a > inc hl > ld (hl), a > ... > ld hl, #_sd_blockdev_count > ld (hl), a > inc hl > ld (hl), a > > > and also weirdness like > > ld -1 (ix),d > ld -2 (ix),e > ld -3 (ix),h > ld -4 (ix), l > ld -4 (ix), l > ld a,-3 (ix) > ld -3 (ix),a > > at which point I'm in the 'stare in disbelief' state. > > Some of it works better being split into tiny functions but then the > function call overhead (passing 32bit values by pointer, lack of argument > passing in registers for simple arguments) produce call/entry/exit > overhead thats as bad as the first case. > > Currently using sdcc 3.3.0 and -mz80 --opt-code-size --max-allocs-per-node > 5000 --Werror --stack-auto > > The integer and pointer code is in most cases quite respectable (except > for the poor function calling API) it's just "long" that seems to make > the compilers brains fall out. > > Using max-allocs-per-node=10000 fixes some but introduces other bizarre > bits out output like > > push hl > push hl > pop hl > pop iy > > and takes ages to run.
When I have the tie and memory, I sometimes go up to --max-allocs-per-node 10000000. However, long and long long have not been the focus of optimization. So far they seemed relatively rare. And optimizations tend to focus on the common case. > > It's also noticable the compiler seems to like to generate weirdness like > > pop af > ld hl, something > push hl > [reloads hl with something different before reuse] > > not the expected > > ld hl, something > ex (sp), hl Can You give a short compileable example to reproduce this? Philipp
signature.asc
Description: OpenPGP digital signature
------------------------------------------------------------------------------ Want excitement? Manually upgrade your production database. When you want reliability, choose Perforce Perforce version control. Predictably reliable. http://pubads.g.doubleclick.net/gampad/clk?id=157508191&iu=/4140/ostg.clktrk
_______________________________________________ Sdcc-user mailing list Sdcc-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/sdcc-user