GCC将发出ARM idiv指令
我如何指示GCC将发出ARM idiv指令,gcc,arm,Gcc,Arm,我如何指示gcc发出idiv(整数除法、udiv和sdiv)arm应用程序处理器指令 到目前为止,我能想到的唯一方法是将GCC4.7与-mcpu=cortex-a15结合使用 $cat idiv.c int test_idiv(int a, int b) { return a / b; } 在gcc 4.7中(与捆绑) 在GCC4.6(与Android NDK r8e捆绑)上,它根本不发出idiv指令,但识别-mcpu=cortex-a15也不会向-mcpu=cortex-a15-ma
gcc
发出idiv
(整数除法、udiv
和sdiv
)arm应用程序处理器指令
到目前为止,我能想到的唯一方法是将GCC4.7与-mcpu=cortex-a15
结合使用
$cat idiv.c
int test_idiv(int a, int b) {
return a / b;
}
在gcc 4.7中(与捆绑)
在GCC4.6(与Android NDK r8e捆绑)上,它根本不发出idiv
指令,但识别-mcpu=cortex-a15
也不会向-mcpu=cortex-a15-march=armv7-a
组合抱怨
Afaik
idiv
在armv7
上是可选的,因此应该有一种更干净的方法来指示gcc发出它们,但是如何发出呢?如果指令不在机器描述中,那么我怀疑gcc
是否会发出代码。注1
如果编译器不支持指令,则始终可以使用内联汇编程序获取指令。注意2由于op-code
非常罕见/特定于机器,因此在gcc
源代码中获取指令可能不需要太多努力。特别是,有arch和tune/cpu标志。tune/cpu用于更具体的机器,但是arch应该允许该体系结构中的所有机器。如果我理解的话,这个op code
似乎违反了这个规则
对于gcc
4.6.2,thumb2和cortex-r4似乎是使用这些指令的提示,正如您在gcc
4.7.2中所注意到的,cortex-a15似乎是为了使用这些指令而添加的。使用gcc
4.7.2,thumb2.md文件不再具有udiv
/sdiv
。但是,它可能包含在其他地方;我不是100%熟悉所有的机器描述语言。似乎cortex-a7、cortex-a15和cortex-r5也可以在4.7.2中启用这些指令。附注3
这并不能直接回答问题,但它确实提供了一些信息/路径来获得答案。您可以使用-mcpu=cortex-r4
编译模块,尽管这可能会产生链接器问题。此外,还有intmy_idiv(inta,intb)uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu属性((uuuuuuuuuuuuuuuuuuuuuuuuuuu代码>,您可以在每个功能的基础上指定代码生成器使用的机器描述。我自己没有用过这些,但它们只是尝试的可能。通常,您不希望保留错误的机器,因为它可能会生成次优(可能是非法)操作代码。您必须进行实验,然后可能会提供真实的答案
注1:这适用于股票gcc
4.6.2和4.7.2。我不知道你的Android编译器是否有补丁
gcc-4.6.2/gcc/config/arm$grep[ius]div*.md
arm.md:“…,sdiv,udiv,其他”
皮质-r4.md:;;我们猜测,平均而言,使用sdiv或udiv划分A/B,
皮质-r4.md:;;这使得udiv的延迟为9,sdiv的延迟为10。
cortex-r4.md:(定义保留区“cortex\u r4\u udiv”9
cortex-r4.md:(eq_attr“insn”“udiv”))
cortex-r4.md:(定义保留区“cortex_r4_sdiv”10
cortex-r4.md:(eq_attr“insn”sdiv)
thumb2.md:“sdiv%?\t%0,%1,%2”
thumb2.md:(设置属性“insn”“sdiv”)]
拇指2.md:(定义“udivsi3”
thumb2.md:(udiv:SI(匹配操作数:SI 1“s\u寄存器\u操作数“r”)
thumb2.md:“udiv%?\t%0,%1,%2”
thumb2.md:(设置属性“insn”“udiv”)]
gcc-4.7.2/gcc/config/arm$grep-i[ius]div*.md
arm.md:“…,sdiv,udiv,其他”
arm.md:“TARGET_IDIV”
arm.md:“sdiv%?\t%0,%1,%2”
arm.md:(设置属性“insn”“sdiv”)]
arm.md:(定义“udivsi3”
arm.md:(udiv:SI(匹配操作数:SI 1“s\U寄存器\U操作数“r”)
arm.md:“TARGET_IDIV”
arm.md:“udiv%?\t%0,%1,%2”
arm.md:(设置属性“insn”“udiv”)]
cortex-a15.md:(定义保留区“cortex\u a15\u udiv”9
cortex-a15.md:(eq_attr“insn”“udiv”))
cortex-a15.md:(定义保留区“cortex\u a15\u sdiv”10
cortex-a15.md:(eq_attr“insn”“sdiv”))
cortex-r4.md;;我们猜测平均而言,使用sdiv或udiv进行A/B划分,
cortex-r4.md;;这使得udiv的潜伏期为9,sdiv的潜伏期为10。
cortex-r4.md:(定义保留区“cortex\u r4\u udiv”9
cortex-r4.md:(eq_attr“insn”“udiv”))
cortex-r4.md:(定义保留区“cortex_r4_sdiv”10
cortex-r4.md:(eq_attr“insn”sdiv)
注2:查看gcc
是否正在向gas
传递阻止使用udiv/sdiv
指令的选项。例如,您可以使用asm(.long\n)
其中,操作码是一些标记粘贴的字符串化寄存器编码宏输出。此外,您可以对汇编程序进行注释,以指定机器中的更改。因此,您可以暂时撒谎并说您有cortex-r4,等等
注3:
gcc-4.7.2/gcc/config/arm$grep-E'TARGET_IDIV | arm|arch | arm|hwdiv | FL|arm|DIV'*
arm.c:#定义FL#U arm#U DIV(1)你确定有一条名为idiv
的实际指令吗?我只能找到sdiv
(有符号除法)和udiv
(无符号除法)…@unwind我假设idiv=sdiv | udivWhich CPU特别是你的目标?恐怕Cortex-A15支持sdiv/udiv,但Cortex-A5不支持。两者都是ARMv7-A兼容的。@AustinPhillips没什么特别的,我只是想知道是否有办法让gcc泄漏idiv指令,而不是链接到| aeabi*东西。举个例子:我们需要为支持idiv的模拟器构建Android堆栈。警告与看起来像是一个bug。只是不要指定-march
。请看,第1644行-或者这个逻辑只是为了解决这个问题。因为您请求的CPU比ARCH好,所以ARCH无效。我想您只需要一个裸-mcpu=cortex-a7
(或-mcpu=cortex-a15
,-mcpu=cortex-r5
)以获得idiv;这些是唯一支持它的CPU,它们比ARCH更好。(+1)感谢您在机器定义方面给予了一些勇气,我
$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
$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}