【发布时间】:2016-02-18 11:59:06
【问题描述】:
我比较了clang生成的代码和gcc for arm生成的代码。
不幸的是,gcc 的代码通常包含更少的指令。 我只是好奇 - 是否可以减少由 clang 生成的代码? 也许我应该使用一些选项来这样做......
请考虑一个非常简单的例子:
> cat test.c
int to_upper(int c)
{
if(c < 'a' || c > 'z') return c;
else return c - ('a' - 'A');
}
> clang -target arm-none-eabi -Oz -c -mthumb -mcpu=cortex-m0 -msoft-float ./test.c -o ./clang_test.o
> /usr/bin/arm-none-eabi-gcc -Os -c -mthumb -mcpu=cortex-m0 -msoft-float ./test.c -o ./gcc_test.o
> /usr/bin/arm-none-eabi-objdump -d ./clang_test.o
./clang_test.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <to_upper>:
0: 4602 mov r2, r0
2: 3a61 subs r2, #97 ; 0x61
4: 4601 mov r1, r0
6: 3920 subs r1, #32
8: 2a19 cmp r2, #25
a: d800 bhi.n e <to_upper+0xe>
c: 4608 mov r0, r1
e: 4770 bx lr
> /usr/bin/arm-none-eabi-objdump -d ./gcc_test.o
./gcc_test.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <to_upper>:
0: 1c03 adds r3, r0, #0
2: 3b61 subs r3, #97 ; 0x61
4: 2b19 cmp r3, #25
6: d800 bhi.n a <to_upper+0xa>
8: 3820 subs r0, #32
a: 4770 bx lr
为什么这么简单的代码差别这么大? 在这种情况下,clang 可以生成更少的代码吗?至少和gcc一样?
注意:如果我们将 cpu 更改为 -mcpu=cortex-a5(其他选项保持不变),则 clang ang gcc 生成 完全相同的代码:
00000000 <to_upper>:
0: f1a0 0361 sub.w r3, r0, #97 ; 0x61
4: 2b19 cmp r3, #25
6: bf98 it ls
8: 3820 subls r0, #32
a: 4770 bx lr
操作系统:Ubuntu 14.04.3
clang 版本 3.7.1 (tags/RELEASE_371/final) 目标:x86_64-unknown-linux-gnu 线程模型:posix
arm-none-eabi-gcc (4.8.2-14ubuntu1+6) 4.8.2
【问题讨论】:
-
这很有趣。你应该报告一个错误。
-
Cortex-A5 默认不是 thumb2。它是一个与 M0 非常不同的架构。 M0 甚至不支持所有的 T2 指令。
-
有什么理由不把函数写成
int to_upper (int c) { if(c < 'a' || c > 'z') return c; else return c - ('a' - 'A'); }? -
没有理由。不幸的是,生成的代码没有改变。顺便说一下,这是一个遗留代码库。
-
这是我的意思,我发布的代码将产生相同的机器代码。它更具可读性。