> * Faster register allocator reduces compilation time by about 25% (does > not apply to mcs51, ds390 which use a different register allocator).
Noticably so for the most part, although the V7 dc code in Fuzix seems to have gone the other way and now takes my machine over 10 minutes and 16GB of memory to build ! With one exception everything built (see below) although I need to do more run testing and see what other than the kernel broke and why. > * New methods to obtain tree-decompositions of control-flow graphs > improve compilation time / code-quality trade-off (when SDCC is built > with support for the treedec library). Where do I find the treedec library ? Without the treedec library the code generated seems to be slightly larger although some grew, some shrunk and it's not by much. Unfortunately it's now miscompiling the kernel ;tty.c:82: if (t->termios.c_lflag & ICANON) { ; genAssign ; AOP_STK for _tty_read_sloc2_1_0 ;fetchPairLong ld c, -5 (ix) ld b, -4 (ix) ; genPointerGet ; AOP_STK for _tty_read_sloc3_1_0 ;fetchPairLong ld l, -11 (ix) ld h, -10 (ix) === This points HL at the right 16bit pair ld a, (hl) === A now holds bits 0-7 of the flags inc hl ld a, (hl) === A is now corrupted ; genAnd bit 4,a === And this test fails ; peephole 149 tested bit 4 of a directly instead of going through l. jr Z,00129$ I also have some parts of my build producing the message ../../Library/tools/fcc -O2 -c uud.c used unbound variable in replacement which looks like some kind of escaped debugging ?? While the MWC originated ed command causes the compiler to crash Caught signal 11: SIGSEGV make[2]: *** [Makefile.z80:49: ed.rel] Error 1 which I need to look at getting some kind of debug for you. The mixed 16/32bit maths doesn't appear to have helped much in my Fuzix kernel cases. It still tends to try and load stuff into registers it doesn't need to (trivial example below). These btw aren't complaints - I'm just highlighting cases I've noticed that may be worth the compiler learning about. Function uoff ; --------------------------------- ; Register assignment might be sub-optimal. ; Stack space usage: 0 bytes. _uoff: ;inode.c:32: return BLKOFF((uint16_t)udata.u_offset); ; genPointerGet ld hl, (#(_udata + 0x0064) + 0) ld bc, (#(_udata + 0x0064) + 2) ; genCast ;fetchPairLong ; genAnd ld a, h and a, #0x01 ld h, a ; genRet ;fetchPairLong ; genLabel ; peephole 158 removed unused label 00101$. ;inode.c:33: } ; genEndFunction ret It also still doesn't figure out big constant shifts on longs. For example a static ulong being >> 9 generates a loads into four registers and a set of 9 loops of 4 shifts. GCC on 6809 instead generates 3 bytes of loads one set of shifts and a zero of the top byte. It's even more painful with big shifts. SDCC turns if (staticlongval >> 25) into a ton of loads and shifts gcc generates the 6809 equivalent of ld a,(hibyteoflong) and #0xFE and SDCC still seems to try and generate 32bit loads when told to do ((uint16_t)x) and use that for an operation. Alan ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Sdcc-user mailing list Sdcc-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/sdcc-user