this is a feature actually:)
you forgot about operations order.
~d
On Wednesday 20 October 2004 12:48, Else Marcus wrote:
> Hello!
>
> There is something strange with multiplication of constant byte numbers.
>
> ---------------------------------------------------------------------------
>- ------
> Example 1.1:
>
> unsigned int multiplikation (unsigned char wert)
> {
> return (unsigned int)((unsigned int)wert*((unsigned int)180));
> 0: 02 12 push r2 ;
> 2: 32 c2 dint
> 4: 03 43 nop
> 6: c2 4f 30 01 mov.b r15, &0x0130 ;
> a: c2 43 31 01 mov.b #0, &0x0131 ;r3 As==00
> e: b2 40 b4 ff mov #-76, &0x0138 ;#0xffb4
> 12: 38 01
> 14: c2 43 39 01 mov.b #0, &0x0139 ;r3 As==00
> 18: 1f 42 3a 01 mov &0x013a,r15 ;0x013a
> 1c: 32 41 pop r2 ;
> }
> 1e: 30 41 ret
> ---------------------------------------------------------------------------
>- ------
>
> At line (e:) the high byte is set to 0xff. Because of the word access the
> hardware multiplier will start and line (14:) has no effect.
>
> With storing the 180 in uiTemp the code is ok (Example 1.2).
>
> ---------------------------------------------------------------------------
>- ------
> Example 1.2:
>
> unsigned int multiplikation (unsigned char wert)
> {
> unsigned int uiTemp = 180;
> return (unsigned int)((unsigned int)wert*(unsigned int)uiTemp);
> 0: 7f f3 and.b #-1, r15 ;r3 As==11
> 2: 02 12 push r2 ;
> 4: 32 c2 dint
> 6: 03 43 nop
> 8: 82 4f 32 01 mov r15, &0x0132 ;
> c: b2 40 b4 00 mov #180, &0x0138 ;#0x00b4
> 10: 38 01
> 12: 1f 42 3a 01 mov &0x013a,r15 ;0x013a
> 16: 32 41 pop r2 ;
> }
> 18: 30 41 ret
> ---------------------------------------------------------------------------
>- ------
>
> The next example uses adding and shifting for multiplikation.
> ---------------------------------------------------------------------------
>- ------
> Example 2.1:
>
> unsigned int multiplikation (unsigned char wert)
> {
> return (unsigned int)((unsigned int)wert*((unsigned int)129));
> 0: 4e 4f mov.b r15, r14 ;
> 2: 0e 5e rla r14 ;
> 4: 0e 5e rla r14 ;
> 6: 0e 5e rla r14 ;
> 8: 0e 5e rla r14 ;
> a: 0e 5e rla r14 ;
> c: 0e 5e rla r14 ;
> e: 0e 5e rla r14 ;
> 10: 7f f3 and.b #-1, r15 ;r3 As==11
> 12: 0f 8e sub r14, r15 ;
> }
> 14: 30 41 ret
> ---------------------------------------------------------------------------
>- ------
> The value to return ist wert - wert*128 and not wert + wert*128.
>
> With storing the 129 in uiTemp the code is ok again (Example 2.2).
> ---------------------------------------------------------------------------
>- ------
> Example 2.2:
>
> unsigned int multiplikation (unsigned char wert)
> {
> unsigned int uiTemp = 129;
> return (unsigned int)((unsigned int)wert*(unsigned int)uiTemp);
> 0: 7f f3 and.b #-1, r15 ;r3 As==11
> 2: 02 12 push r2 ;
> 4: 32 c2 dint
> 6: 03 43 nop
> 8: 82 4f 32 01 mov r15, &0x0132 ;
> c: b2 40 81 00 mov #129, &0x0138 ;#0x0081
> 10: 38 01
> 12: 1f 42 3a 01 mov &0x013a,r15 ;0x013a
> 16: 32 41 pop r2 ;
> }
> 18: 30 41 ret
> ---------------------------------------------------------------------------
>- ------
>
> Used options for mspgcc: -x c -c -g -O2 -Wall -mmcu=msp430x147
>
> Release: mspgcc-20040723.exe
>
> Is the different behavior between examples 1.1 and 1.2 and between 2.1 and
> 2.2 a bug or a feature?
> Or is it my mistake?
>
> Marcus Else
>
>
> -------------------------------------------------------
> This SF.net email is sponsored by: IT Product Guide on ITManagersJournal
> Use IT products in your business? Tell us what you think of them. Give us
> Your Opinions, Get Free ThinkGeek Gift Certificates! Click to find out more
> http://productguide.itmanagersjournal.com/guidepromo.tmpl
> _______________________________________________
> Mspgcc-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/mspgcc-users