It appears msp430-elf-gcc 4.9.1 defaults to hardware multiply support for the msp430g2553 if you don't provide a choice to the command line. I didn't check other chips that lack hardware multiply. I compiled some code written for the msp430g2553 which worked fine with msp430-gcc. However, when I compiled with msp430-elf-gcc it failed to run properly on the device. Looking at the generated code I noticed it was trying use the multiply hardware.
Here is the code it generates:
0000f088 <__mulhi2>: f088: 02 12 push r2 ; f08a: 32 c2 dint f08c: 03 43 nop f08e: 82 4c 30 01 mov r12, &0x0130 ; f092: 82 4d 38 01 mov r13, &0x0138 ; f096: 1c 42 3a 01 mov &0x013a,r12 ;0x013a f09a: 00 13 reti 0000f09c <__mulsihi2>: f09c: 02 12 push r2 ; f09e: 32 c2 dint f0a0: 03 43 nop f0a2: 82 4c 32 01 mov r12, &0x0132 ; f0a6: 82 4d 38 01 mov r13, &0x0138 ; f0aa: 1c 42 3a 01 mov &0x013a,r12 ;0x013a f0ae: 1d 42 3c 01 mov &0x013c,r13 ;0x013c f0b2: 00 13 reti 0000f0b4 <__umulsihi2>: f0b4: 02 12 push r2 ; f0b6: 32 c2 dint f0b8: 03 43 nop f0ba: 82 4c 30 01 mov r12, &0x0130 ; f0be: 82 4d 38 01 mov r13, &0x0138 ; f0c2: 1c 42 3a 01 mov &0x013a,r12 ;0x013a f0c6: 1d 42 3c 01 mov &0x013c,r13 ;0x013c f0ca: 00 13 reti 0000f0cc <__mulsi2>: f0cc: 02 12 push r2 ; f0ce: 32 c2 dint f0d0: 03 43 nop f0d2: 82 4c 30 01 mov r12, &0x0130 ; f0d6: 82 4e 38 01 mov r14, &0x0138 ; f0da: 82 4c 34 01 mov r12, &0x0134 ; f0de: 1c 42 3a 01 mov &0x013a,r12 ;0x013a f0e2: 92 42 3c 01 mov &0x013c,&0x013a ;0x013c f0e6: 3a 01 f0e8: 82 4f 38 01 mov r15, &0x0138 ; f0ec: 82 4d 34 01 mov r13, &0x0134 ; f0f0: 82 4e 38 01 mov r14, &0x0138 ;
If I explicitly add the hardware multiply option to the command line argument,
$ msp430-elf-gcc -Wall -Os -g -mmcu=msp430g2553 -mhwmult=none ...
the code works as expected.
I tested with both the CCS supplied msp430-elf-gcc and one I built from source with the same results.
-rick