On 2006-06-30, Bodo Rzany <rz...@ibrro.de> wrote:
> 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).

No there, is one extra.

>> Why the and.b?
>
> Too less optimizing within the compiler?

I can't even think of any reason why you would and a register
with -1 except to set the condition flags, but the conditions
flags are a) never used, b) overwritten by the next instruction
anyway.

>> 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

Since P6IN is volatile, that code is incorrect.

-- 
Grant Edwards                   grante             Yow!  .. If I cover this
                                  at               entire WALL with MAZOLA,
                               visi.com            wdo I have to give my AGENT
                                                   ten per cent??


Reply via email to