----- Original Message -----
From: "Bodo Rzany" <rz...@ibrro.de>
To: <mspgcc-users@lists.sourceforge.net>
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



Reply via email to