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.
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
which is 2 clocks faster and 1 byte shorter, and even more efficient when
the return value is in HL and being used as the argument.
Alan
------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/sdcc-user