----- Original Message -----
From: "Bodo Rzany" <[email protected]>
To: <[email protected]>
Sent: Friday, June 30, 2006 10:57 AM
Subject: Re: [Mspgcc-users] Code generation question
> Am Wed, 28 Jun 2006 19:59:27 +0000 (UTC) schrieb Grant Edwards:
> > Can anybody explain the code generated for this function?
> >
> > #include <io.h>
> >
> > unsigned two;
> >
> > void foo(void)
> > {
> > two = P6IN + P6IN;
> > }
> >
> > 21 foo:
> >
> > 26 0000 5F42 3400 mov.b &0x0034, r15
> > 27 0004 4E4F mov.b r15, r14
> > 28 0006 5F42 3400 mov.b &0x0034, r15
> > 29 000a 7FF3 and.b #-1,r15
> > 30 000c 0E5F add r15, r14
> > 31 000e 824E 0000 mov r14, &two
> > 32 0012 3041 ret
> >
> > Why the extra mov.b?
>
> Which extra mov.b? There are two extra mov.b (see below).
>
> > Why the and.b?
>
> Too less optimizing within the compiler?
>
> > Why isn't this correct?
> >
> > mov.b &0x0034, r15
> > mov.b &0x0034, r14
> > add r15, r14
> > mov r14, &two
> > ret
>
> This *is* correct. But if you really want to deal with assembler
> (which I do prefer on the msp430), you could code as follows:
>
> mov.b &0x0034, r15
> add r15, r15
> mov r15, &two
> ret
>
>
That would be wrong. PINB is declared volatile - the C code says it should
be read twice, so it should be read twice by the generated assembly. Thus
better code would be:
mov.b &0x0034, r15
add.d &0x0034, r15
mov r15, &two
ret