Hello, I noticed that mspgcc-20120406 produces strange assembly for some very simple pointer arithmetic. I've managed to isolate this in a tiny test case:
ext.c: int foo, bar; main.c: extern int foo, bar; void main(void) { char *ptr = (char *)&foo; char *top = (char *)&bar; *(int *)ptr = top - ptr; } I'm compiling with this command: msp430-gcc -Os -mmcu=msp430f47173 main.c ext.c The only reason for putting foo and bar in another .c file than main() is to avoid "top - ptr" getting optimized out into a constant value determined at compile time. The assembly for the above C code looks like this: 313e: 3a 40 02 11 mov #4354, r10 ;#0x1102 3142: 0f 4a mov r10, r15 3144: 8f 10 swpb r15 3146: 8f 11 sxt r15 3148: 8f 10 swpb r15 314a: 8f 11 sxt r15 314c: 0b 4f mov r15, r11 314e: 3c 40 00 11 mov #4352, r12 ;#0x1100 3152: 0f 4c mov r12, r15 3154: 8f 10 swpb r15 3156: 8f 11 sxt r15 3158: 8f 10 swpb r15 315a: 8f 11 sxt r15 315c: 0d 4f mov r15, r13 315e: 0a 8c sub r12, r10 3160: 0b 7d subc r13, r11 3162: 82 4a 00 11 mov r10, &0x1100 Given the above assembly, 0x1102 is the address of bar and 0x1100 the address of foo. Any idea why "top - ptr" is not compiled as a simple "sub" instruction? I'm guessing that it has something to do with operator signedness, but I can't figure it out... Thanks, Radu Rendec ------------------------------------------------------------------------------ LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial Remotely access PCs and mobile devices and provide instant support Improve your efficiency, and focus on delivering more value-add services Discover what IT Professionals Know. Rescue delivers http://p.sf.net/sfu/logmein_12329d2d _______________________________________________ Mspgcc-users mailing list Mspgcc-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mspgcc-users