hm.... interesting. i'll check this out later on today. ~d Rick Jenkins wrote:
> This demonstrates an apparent compiler bug in msp430-gcc, using a > compiler built 30 Sept 2003 from CVS. An older compiler version dating > from 31 March 2003 produced the same problem. The demonstration > routine is a hacked-out fragment from some real code, and makes little > sense in isolation, but is about the minimal code to show the bug. > > The C source is: > > ########################################################################### > > // BUG.C demonstrates a compiler bug > > #define FULL_SCALE 4095 > > int p_offset, q_offset; > > void set_offsets( int p_off, int q_off ) > // > // Offsets in tenths of full scale > { > p_offset = ( p_off * FULL_SCALE ) / 10; > q_offset = ( q_off * FULL_SCALE ) / 10; > } > > ########################################################################### > > Compiled with: > > msp430-gcc -S -mmcu=msp430x149 -O2 bug.c > > This produces correct code: > > ########################################################################### > > .file "bug.c" > .arch msp430x149 > > /* Hardware multiplier registers: */ > __MPY=0x130 > __MPYS=0x132 > __MAC=0x134 > __MACS=0x136 > __OP2=0x138 > __RESLO=0x13a > __RESHI=0x13c > __SUMEXT=0x13e > > .text > .p2align 1,0 > .global set_offsets > .type set_offsets,@function > /*********************** > * Function `set_offsets' > ***********************/ > set_offsets: > /* prologue: frame size = 0 */ > .L__FrameSize_set_offsets=0x0 > .L__FrameOffset_set_offsets=0x6 > push r11 > push r10 > push r9 > /* prologue end (size=3) */ > mov r14, r9 > push r2 > dint > nop > mov r15, &__MPYS > mov #llo(4095), &__OP2 > mov &__RESLO, r15 > pop r2 > mov r15, r12 > mov #llo(10), r10 > call #__divmodhi4 > mov r12, &p_offset > push r2 > dint > nop > mov r9, &__MPYS > mov #llo(4095), &__OP2 > mov &__RESLO, r15 > pop r2 > mov r15, r12 > mov #llo(10), r10 > call #__divmodhi4 > mov r12, &q_offset > /* epilogue: frame size=0 */ > pop r9 > pop r10 > pop r11 > ret > /* epilogue end (size=4) */ > /* function set_offsets size 42 (35) */ > .Lfe1: > .size set_offsets,.Lfe1-set_offsets > /********* End of function ******/ > > .comm p_offset,2,2 > .comm q_offset,2,2 > > /********************************************************************* > * File bug.c: code size: 42 words (0x2a) > * incl. words in prologues: 3, epilogues: 4 > *********************************************************************/ > > ########################################################################### > > Compiled with: > > msp430-gcc -S -mmcu=msp430x149 -O2 -mnoint-hwmul bug.c > > Which differs only in the addition of the -mnoint-hwmul switch, it > produces code which incorrectly sets the q_offset to the same value as > the p_offset. The calculation for q_offset starts correctly, but the > code to perform the division by ten is omitted, so that R12 still > contains the result of the previous calculation. The added comment > with all the queries pinpoints the error. > > ########################################################################### > > .file "bug.c" > .arch msp430x149 > > /* Hardware multiplier registers: */ > __MPY=0x130 > __MPYS=0x132 > __MAC=0x134 > __MACS=0x136 > __OP2=0x138 > __RESLO=0x13a > __RESHI=0x13c > __SUMEXT=0x13e > > .text > .p2align 1,0 > .global set_offsets > .type set_offsets,@function > /*********************** > * Function `set_offsets' > ***********************/ > set_offsets: > /* prologue: frame size = 0 */ > .L__FrameSize_set_offsets=0x0 > .L__FrameOffset_set_offsets=0x8 > push r11 > push r10 > push r9 > push r8 > /* prologue end (size=4) */ > mov r14, r8 > mov r15, &__MPYS > mov #llo(4095), &__OP2 > mov &__RESLO, r12 > mov #llo(10), r10 > call #__divmodhi4 > mov r12, &p_offset > mov r8, &__MPYS > mov #llo(4095), &__OP2 > /* ??????????????????????????????????????????????????????????????????? > Some code was missed here > ??????????????????????????????????????????????????????????????????? */ > mov r12, &q_offset > /* epilogue: frame size=0 */ > pop r8 > pop r9 > pop r10 > pop r11 > ret > /* epilogue end (size=5) */ > /* function set_offsets size 30 (21) */ > .Lfe1: > .size set_offsets,.Lfe1-set_offsets > /********* End of function ******/ > > .comm p_offset,2,2 > .comm q_offset,2,2 > > /********************************************************************* > * File bug.c: code size: 30 words (0x1e) > * incl. words in prologues: 4, epilogues: 5 > *********************************************************************/ > > ########################################################################### > > -- > Rick Jenkins <r...@hartmantech.com> > Hartman Technica http://www.hartmantech.com > Phone +1 (403) 230-1987 voice & fax > 221 35 Avenue. N.E., Calgary, Alberta, Canada T2E 2K5 > > ------------------------------------------------------- > This sf.net email is sponsored by:ThinkGeek > Welcome to geek heaven. > http://thinkgeek.com/sf > _______________________________________________ > Mspgcc-users mailing list > Mspgcc-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/mspgcc-users