Unsigned 16b multiply question:

When doing unsigned 16bit multiplys, why is it (apparently)
necessary to perform casts to 32b unsigned first?

Using v3.2.3 from ~ 4weeks ago (linux) on MSP430x149

For Example:

int main(void)
{
    unsigned int a= 0xFFFF ;
    unsigned int b= 0xFFFF ;
    unsigned long c ;
    unsigned long d ;

    c = a * b;

    d = (unsigned long)a * (unsigned long)b ;
    return(0);
}

/* Resulting List
<main>:
31 40 00 0a     mov     #2560,  r1      ;#0x0a00
3f 43           mov     #-1,    r15     ;r3 As==11
02 12           push    r2              ;
32 c2           dint                    
03 43           nop                     
82 4f 32 01     mov     r15,    &0x0132     ;<** Signed ???
82 4f 38 01     mov     r15,    &0x0138     ;
1e 42 3a 01     mov     &0x013a,r14 ;0x013a
32 41           pop     r2              ;
02 12           push    r2              ;
32 c2           dint                    
03 43           nop                     
82 4f 30 01     mov     r15,    &0x0130     ;
82 4f 38 01     mov     r15,    &0x0138     ;
1e 42 3a 01     mov     &0x013a,r14 ;0x013a
1f 42 3c 01     mov     &0x013c,r15 ;0x013c
32 41           pop     r2              ;
0f 43           clr     r15             ;
30 40 78 11     br      #0x1178         ;
*/

- Bill Hall

Reply via email to