Sorry for my persistence (is this the right word?),
but each of theses examples is a very short separate file!
E.g. the source file:
----------------------------------------------------------------------------
------------------
unsigned int multiplikation (unsigned char wert)
{
return (unsigned int)(((unsigned int)wert)*((unsigned int)180));
}
----------------------------------------------------------------------------
------------------
Four lines or 125 Bytes!
And: (the operating order is determined by brackets)
The result is:
----------------------------------------------------------------------------
------------------
Disassembly of section .text:
00000000 <multiplikation>:
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
////////////////////////////////////////////////////////////////////////////
//////////////////
Where is the '.b'? -----^
////////////////////////////////////////////////////////////////////////////
//////////////////
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
----------------------------------------------------------------------------
------------------
A second example, another file, another project, again very short and with
brackets to determine
the operating order:
----------------------------------------------------------------------------
------------------
unsigned int another_multiplication (unsigned char value)
{
return (unsigned int)(((unsigned int)value)*((unsigned int)129));
}
----------------------------------------------------------------------------
------------------
The job ist to calculate value*129
If value equal 1 129 should be returned,
if 2 258, if 3 387 and so on...
Result:
----------------------------------------------------------------------------
------------------
Disassembly of section .text:
00000000 <another_multiplication>:
unsigned int another_multiplication (unsigned char value)
{
return (unsigned int)(((unsigned int)value)*((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
----------------------------------------------------------------------------
------------------
This code calculates value-128*value or value*(-127), but it is not its job!
Marcus
> -----Ursprüngliche Nachricht-----
> Von: [email protected]
> [mailto:[email protected]]im Auftrag von Dmitry
> Gesendet: Mittwoch, 20. Oktober 2004 17:55
> An: [email protected]
> Betreff: Re: [Mspgcc-users] Something strange with multiplication of
> constant byte numbers
>
>
>
> Oops..
>
> this is the one of mysterious problems which happens with large files.
> I think there is a memory leak somewhere in cgen code...
> Marcus, Just split your code in a couple of files and the bug should
> disappear.
>
> ~d
>
>
>
> On Wednesday 20 October 2004 18:35, Dmitry wrote:
> > nope...
> > e: b2 40 b4 ff mov #-76, &0x0138 ;#0xffb4
> > 12: 38 01
> > 14: c2 43 39 01 mov.b #0, &0x0139 ;r3 As==00
> > check the third line...
> > or the result of mult does not depend on high nibble of OP2 ?
> > If there is a bug I'll fix this shortly.
> >
> > ~d
> >
> > On Wednesday 20 October 2004 15:20, [email protected] wrote:
> > > 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: [email protected]
> > > [mailto:[email protected]]
> > > Sent: Wednesday, October 20, 2004 2:16 PM
> > > To: [email protected]
> > > 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
> > > > [email protected]
> > > > 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
> > > [email protected]
> > > 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
> > > [email protected]
> > > 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
> > [email protected]
> > 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
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/mspgcc-users
>