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