【发布时间】:2013-04-03 23:21:04
【问题描述】:
如何指示gcc 为arm application processors 发出idiv(整数除法,udiv 和sdiv)指令?
到目前为止,我能想到的唯一方法是将-mcpu=cortex-a15 与 gcc 4.7 一起使用。
$cat idiv.c
int test_idiv(int a, int b) {
return a / b;
}
在 gcc 4.7 上(与 Android NDK r8e 捆绑在一起)
$gcc -O2 -mcpu=cortex-a15 -c idiv.c
$objdump -S idiv.o
00000000 <test_idiv>:
0: e710f110 sdiv r0, r0, r1
4: e12fff1e bx lr
如果你在-mcpu=cortex-a15 旁边添加-march=armv7-a 并且不发出idiv 指令,即使这个也给出idiv.c:1:0: warning: switch -mcpu=cortex-a15 conflicts with -march=armv7-a switch [enabled by default]。
$gcc -O2 -mcpu=cortex-a15 -march=armv7-a -c idiv.c
idiv.c:1:0: warning: switch -mcpu=cortex-a15 conflicts with -march=armv7-a switch [enabled by default]
$objdump -S idiv.o
00000000 <test_idiv>:
0: e92d4008 push {r3, lr}
4: ebfffffe bl 0 <__aeabi_idiv>
8: e8bd8008 pop {r3, pc}
在 gcc 4.6(与 Android NDK r8e 捆绑)上,它根本不会发出 idiv 指令,但会识别 -mcpu=cortex-a15 也不会抱怨 -mcpu=cortex-a15 -march=armv7-a 组合。
Afaik idiv 在 armv7 上是可选的,因此应该有一种更简洁的方式来指示 gcc 发出它们,但是如何?
【问题讨论】:
-
你确定有一个实际的指令叫做
idiv吗?我只能找到sdiv(有符号除法)和udiv(无符号除法)... -
@unwind 我假设 idiv = sdiv | udiv
-
您的目标具体是哪个 CPU? AFAIK Cortex-A15 支持 sdiv/udiv,但 Cortex-A5 不支持。两者都兼容 ARMv7-A。
-
@AustinPhillips 没什么特别的,我只是想了解是否有办法告诉 gcc 溢出 idiv 指令而不是链接到 __aeabi* 东西。一个例子可能是为支持 idiv 的模拟器构建 Android 堆栈。
-
警告 conflicts with 看起来像一个错误。只是不要指定
-march。请参阅arm.c,第 1644 行 - 或者这个逻辑可能只是为了解决这种情况。由于您请求的 CPU 比 ARCH更好,所以 ARCH 无效。我想你只是想要一个 naked-mcpu=cortex-a7(或-mcpu=cortex-a15,-mcpu=cortex-r5)来获得idiv;这些是唯一支持它的 CPU,它们比 ARCH 更好。