Friday, April 26, 2013

compiler optimizations

编译优化
有一下一段简单代码
#define LED2=0x04;
#define LED3=0x40;
void toggle_led(void){
static int idx=0;
    if((++idx)&1)
        __REG_B(GPKDAT) = LED2;
    else
        __REG_B(GPKDAT) = LED3;
}
优化编译后反汇编得到的代码是:
//omit the code of testing idx,
        movne r2,#LED2
        ldrne r3,=GPKDAT
        strbne r2,[r3]
        moveq r2,#LED3
        ldreq r3,=GPKDAT
        strbeq r2,[r3]
        bx lr
我估计在编译的时候,这里的语句没办法优化因此会 3,4,6,7 行的多余出来。其实这4行用2行代码就可以了。 修改了C代码为
#define LED2=0x04;
#define LED3=0x40;
void toggle(void){
        static int idx=0;
        unigned char temp;
        if((++idx)&1)
                temp = LED2;
        else
                temp = LED3;
        __REG_B(GPKDAT) = temp;
}
代码编译后反编译:
//omit the code of testing idx
        moveq r3,#LED2
        movne r3,#LED3
        ldr  r2,=GPKDAT
        strb r3,[r2]

估计是因为宏__REG_B中使用了volatile,因此对无法代码进行优化。

No comments:

Post a Comment