【发布时间】:2011-05-21 03:14:19
【问题描述】:
我有这个 C 代码:
int test(signed char anim_col)
{
if (anim_col >= 31) {
return 1;
} else if (anim_col <= -15) {
return -2;
}
return 0;
}
使用 Android NDK r4b 编译为以下带有 -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,它将返回 -2 而不是仅在小于或等于 -15 时返回 -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 -大拇指
和
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 --保存临时文件-mthumb
这是一个已知的 GCC 错误吗?我很难相信,这在现实生活中不会发生!我的代码肯定是错的?!
【问题讨论】:
-
代码是否真的给出了错误的答案?
-
@Chris 绝对是,如果输入是 -15 则不正确。这是一个真实应用程序代码的最小测试用例,当我更新到 r5 时出现了一个神秘的错误。
-
您可能希望将其发布到 android-ndk 组。获取相应的上游 arm gcc 版本并查看它是否生成可比较的代码以及是否已提交任何错误也可能很有趣。我一直认为 LSL/LSR 在屏蔽方面很聪明,但除非它进一步转移以屏蔽最后一个字节的一部分,否则“想法”似乎行不通。
标签: gcc android-ndk thumb