Это ошибка GCC или мой код неправильный?

У меня есть этот код C:

int test(signed char anim_col)
{
    if (anim_col >= 31) {
        return 1;
    } else if (anim_col <= -15) {
        return -2;
    }
    return 0;
}

Это компилируется в следующий код большого пальца с -Os -mthumb с использованием Android NDK r4b:

test:
    mov r3, #1
    cmp r0, #30
    bgt .L3
    mov r3, #0
    add r0, r0, #14
    bge .L3
    mov r3, #2
    neg r3, r3
.L3:
    mov r0, r3
    bx  lr

Но с последней Android NDK r5 он компилируется в этот сломанный код:

test:
    mov r3, #1
    cmp r0, #30
    bgt .L3
    lsl r0, r0, #24
    lsr r0, r0, #24
    mov r3, #0
    cmp r0, #127    @@ WTF?! should be <= -15 @@
    bls .L3
    mov r3, #2
    neg r3, r3
.L3:
    mov r0, r3
    bx  lr

Это кажется ... странным. Если anim_col меньше 0, он вернет -2, а не только -2, когда меньше или равно -15. Полная командная строка для воспроизведения этого выглядит следующим образом:

android-ndk-r4b / build / prebuilt / linux-x86 / arm-eabi-4.4.0 / bin / arm-eabi-gcc -c -o test.o -Os test.c --save-temps -mthumb

и

android-ndk-r5 / toolchains / arm-linux-androidabi-4.4.3 / prebuilt / linux-x86 / bin / arm-linux-androidabi -gcc -c -o test.o -Os test.c --save-temps -mthumb

Это известная ошибка GCC? Мне трудно поверить, что в реальной жизни такого не бывает! Неужто мой код неправильный ?!

7
задан richq 8 December 2010 в 22:59
поделиться