If you want to speed it up even more, make i signed and test for still positive.
volatile int i = 1;
P1OUT = 0;
do {
P1OUT++;
} while ((i <<= 1) > 0);
Regards
-Bill Knight
R O SoftWare
On Fri, 23 Sep 2005 15:17:43 +0200, Ralf Hildebrandt wrote:
>Hi!
>The while loop is handled in an inefficient way. Lets have an example:
>/*********************************************************************************/
>#include <stdlib.h>
>#include <msp430x14x.h>
>int copy_i(int in);
>int main (void) {
> unsigned int i;
> /**/
> i = copy_i(1); /*used to prevent compiler optimisation*/
> P1OUT = 0;
> while (i<0x8000) {
> P1OUT++;
> i <<= 1;
> }
> return CPUOFF;
>}
>int copy_i(int in) {
> return in;
>}
>/*********************************************************************************/
>Objdump outputs the following (fragment):
>/*********************************************************************************/
> i = copy_i(1); /*used to prevent compiler optimisation*/
> 1144: 1f 43 mov #1, r15 ;r3 As==01
> 1146: b0 12 68 11 call #4456 ;#0x1168
> P1OUT = 0;
> 114a: c2 43 21 00 mov.b #0, &0x0021 ;r3 As==00
> while (i<0x8000) {
> 114e: 3f 90 00 80 cmp #-32768,r15 ;#0x8000
> 1152: 06 2c jc $+14 ;abs 0x1160
> P1OUT++;
> 1154: d2 53 21 00 inc.b &0x0021 ;
> i <<= 1;
> 1158: 0f 5f rla r15 ;
> 115a: 3f 90 00 80 cmp #-32768,r15 ;#0x8000
> 115e: fa 2b jnc $-10 ;abs 0x1154
> }
>/*********************************************************************************/
>As can be seen, at address 0x114e the condition is tested as well as at
>0x115a. Its not nessecary to test this twice.
>Two optimal solutions exist:
>1) Test at the end of the loop: When entering the while loop, JMP to the
> test.
> JMP while_condition
> while_body_start: <while_body>
> while_condition: <test while_condition>
> <conditionally jump to while_body_start>
>2) Test at the beginning of the loop: When hitting the end of the loop,
> JMP to the test.
> while_condition: <test while_condition>
> <conditionally jump to while_end>
> <while_body>
> JMP while_condition:
> while_end:
>I would suggest to think about the 1st solution, because a do-while loop
>would then be equal to a while loop without the initial JMP.
>Ralf
>-------------------------------------------------------
>SF.Net email is sponsored by:
>Tame your development challenges with Apache's Geronimo App Server. Download
>it for free - -and be entered to win a 42" plasma tv or your very own
>Sony(tm)PSP. Click here to play: http://sourceforge.net/geronimo.php
>_______________________________________________
>Mspgcc-users mailing list
>[email protected]
>https://lists.sourceforge.net/lists/listinfo/mspgcc-users