編譯器爲簡單分支語句生成的代碼質量很高

編譯器對於簡單分支的處理,感受很是高效。ide

好比這段C代碼ui

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

其內層循環體編譯出來的代碼爲spa

.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上竟然使用條件移動等質量將分支去掉了,不得不讚一個code

相關文章
相關標籤/搜索