Dmitry,
Will you explain me the thing. ((unsigned int)180) treated as a one byte
variable? Why? Am I wrong in assumption that first wert should be
converted to unsigned int, next 180 must be converted to unsigned int
and at last multiplied. The result must be converted to unsigned int (no
idea, what for).
Am I right?
Regards,
Dmitriy Korovkin

-----Original Message-----
From: mspgcc-users-ad...@lists.sourceforge.net
[mailto:mspgcc-users-ad...@lists.sourceforge.net] 
Sent: Wednesday, October 20, 2004 2:16 PM
To: mspgcc-users@lists.sourceforge.net
Subject: Re: [Mspgcc-users] Something strange with multiplication of
constant byte numbers

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
> Mspgcc-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/mspgcc-users


-------------------------------------------------------
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
Mspgcc-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mspgcc-users


Reply via email to