Hi all,
There seems to be a bug in the optimiser. When multplying unsigned longs by
65536
it fails to zero the lower half. If instead you shift 16 places left, it works.
Here is a test case:
unsigned long x, y;
void main(void) {
x = (x * 65536UL) + 1UL;
y = (y << 16) + 1UL;
}
compiled with gcc 3.2.3 + mspgcc CVS as of 3/27/2004:
msp430-gcc -mmcu=msp430x449 -S -O1 test.c
results in this code:
/***********************
* Function `main'
***********************/
main:
/* prologue: frame size = 0 */
.L__FrameSize_main=0x0
.L__FrameOffset_main=0x0
mov #(__stack-0), r1
/* prologue end (size=2) */
mov &x, r15
add #llo(1), r14 <<<<<<< r14 uninitialized
addc #lhi(1), r15
mov r14, &x
mov r15, &x+2
mov &y, r15
mov #llo(0), r14 <<<<<<< here OK
add #llo(1), r14
addc #lhi(1), r15
mov r14, &y
mov r15, &y+2
/* epilogue: frame size=0 */
br #__stop_progExec__
/* epilogue end (size=4) */
/* function main size 25 (19) */
.Lfe1:
.size main,.Lfe1-main
/********* End of function ******/
regards,
Francisco