编译器为简单分支语句生成的代码质量很高

编译器对于简单分支的处理,感觉非常高效。

比如这段C代码

void sign3_c (uint8_t* s0, uint8_t *s1, int8_t *d, int width, int height, int stride) {
    int i,j;
    for(j = 0; j < height; j++) {
        int offset = j*stride;
        for(i = 0; i < width; i ++) {
            uint8_t c0 = s0[offset + i], c1 = s1[offset + i];
            int8_t v = 0;
            if (c0 < c1)
                v = -1;
            if (c0 > c1)
                v = 1;
            d[offset + i] = v;
        }
    }
}

其内层循环体编译出来的代码为

.L6:
        movzbl  0(%ebp,%eax), %ecx
        movzbl  (%edi,%eax), %edx
        cmpb    %dl, %cl
        sbbl    %ebx, %ebx
        cmpb    %dl, %cl
        movl    $1, %edx
        cmova   %edx, %ebx
        movb    %bl, (%esi,%eax)
        addl    $1, %eax
        cmpl    44(%esp), %eax
        jne     .L6

虽然我们在C语言的层面上有两个判断,但是编译到x86上居然使用条件移动等质量将分支去掉了,不得不赞一个

posted on 2013-08-29 21:59  mathlover  阅读(305)  评论(0编辑  收藏  举报

导航