私はこのCコードを持っています:
int test(signed char anim_col)
{
if (anim_col >= 31) {
return 1;
} else if (anim_col <= -15) {
return -2;
}
return 0;
}
これは、AndroidNDKr4bを使用して-Os-mthumbを使用して次のサムコードにコンパイルされます。
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未満の場合、-15以下の場合に-2を返すだけでなく、-2を返します。これを再現するための完全なコマンドラインは次のとおりです。
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-androideabi-4.4.3 / prebuilt / linux-x86 / bin / arm-linux-androideabi-gcc -c -o test.o -Os test.c --save-temps -mthumb
これは既知のGCCバグですか?信じがたいことですが、それは現実には起こりません。確かに私のコードは間違っていますか?!