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