Ich habe diesen C-Code:
int test(signed char anim_col)
{
if (anim_col >= 31) {
return 1;
} else if (anim_col <= -15) {
return -2;
}
return 0;
}
Das kompiliert zu folgendem Thumb-Code mit -Os -mthumb unter Verwendung von 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
Aber mit der neuesten Android NDK r5 kompiliert er zu diesem fehlerhaften Code:
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
Dies scheint ... seltsam. Wenn anim_col kleiner als 0 ist, wird -2 zurückgegeben, anstatt nur -2 zurückzugeben, wenn es kleiner oder gleich -15 ist. Die vollständige Befehlszeile, um dies zu reproduzieren, lautet wie folgt:
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
y
Android-ndk-r5/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc -c -o test.o -Os test.c --save-temps -mthumb
Ist dies ein bekannter GCC-Fehler? Ich finde es schwer zu glauben, dass so etwas im wirklichen Leben nicht vorkommt! Sicherlich ist mein Code falsch?!