Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GCC将发出ARM idiv指令_Gcc_Arm - Fatal编程技术网

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}