【问题标题】:change floating-point operation in x86 system to the one in armv8 system将x86系统中的浮点运算改为armv8系统中的浮点运算
【发布时间】:2015-11-02 20:34:39
【问题描述】:

我阅读了一些关于浮点运算的内联汇编 C 代码。代码如下。

__asm__ __volatile__ ("fninit);
//There are some other in line assembly here, I omit them because they have nothing to do with my question.
__asm__ __volatile__ ("fcomp %st");

这些代码在 x86 系统中运行。但是,我想将这些代码更改为可以在 armv8 系统中运行的代码。

首先,我想知道上面的代码是什么意思。其次,我想知道如何更改上面的代码使其在armv8系统中运行。

【问题讨论】:

  • 我们不是代码翻译服务,也不是来教你x86和ARM汇编的。
  • 我只是想知道这两个系统的区别。只需两条指令!
  • 您搜索过相关说明吗?你没有证明你试图自己回答这个问题。
  • FNINIT 初始化 x87 FPU。 FCOMP 将堆栈顶部ST(0)ST(1) 进行比较,然后弹出堆栈。由于您没有显示代码,我们无法判断正在比较的内容。我们也不知道这段代码正在实现什么比较运算符,因为FCOMP 之后的代码丢失了。由于 HLL 支持浮点操作数的比较,因此不清楚此处使用内联汇编的目的是什么。如果您只是在 HLL 级别比较操作数会发生什么?
  • 你不能单独移植单个指令;确保您可以交叉引用指令列表并找出 fcomp 是一个浮点比较,因此粗略的 A64(我假设 ARMv8 中的 3 个不同指令集您可能是指一个)等效将是(也许不足为奇) fcmp,但 ARM 指令采用两个显式参数,而不是 x87 的隐式堆栈使用 - 你要指定哪些寄存器?如果不考虑代码的意图并适当地重组整个事情,你仍然会迷失方向。

标签: floating-point x86 stack arm inline-assembly


【解决方案1】:

http://www.ray.masmcode.com/tutorial/index.html 解释了 x87 FPU 的工作原理,当英特尔 insn 参考手册没有告诉您这些部件如何组合在一起时,它是一个有用的参考。我会将它添加到 x86 标签 wiki。

ARM asm 只能靠你自己了。

你确定你甚至需要在 asm 中写任何东西,而不是让编译器来做吗?如果您不需要设置舍入模式,或设置有限精度等,只需使用 C doublefloat

【讨论】:

  • 我写了一个综合基准的程序,所以这就是我用asm写东西的原因。我可以处理所有其他操作。但是,FP 操作让我很困惑。为什么程序需要初始化和恢复 FP 栈。
  • 仍然,感谢您的帮助。这个教程看起来很棒。
  • @80247617aaa:“综合基准”?不知道那是什么意思。你的意思是你写了一个综合基准的程序?让编译器处理 FP 细节。 ABI 要求在进入函数或从函数返回时 FP 堆栈为空,但在 32 位 x86 中保存 FP 返回值除外。就是否溢出 FP 堆栈而言,基准测试应该与任何其他使用浮点的程序有什么不同。
  • 我的意思是我编写了一个可以创建基准的程序。我已经有一个可以创建基准测试的程序,但是这个程序是为 x86 设计的。我想更改程序以使其创建在 armv8 上运行的基准。我对之前程序(为x86设计)中的FP操作感到困惑,我不知道我是否需要在armv8系统中进行一些FP操作。
  • @80247617aaa:您可能应该弄清楚您对哪些性能特征感兴趣,这样您就可以测试与您相关的内容。否则,只需查看标准基准测试套件,例如 SPECint 和 SPECfp。 (尽管大部分 SPECint 并没有受到高度重视,因为代码量小,并且当前的优化编译器在 spec.org/cpu2006/Docs/403.gcc.html 以外的许多基准测试中看到了特殊情况的优化)
猜你喜欢
  • 1970-01-01
  • 2013-05-15
  • 2014-05-07
  • 1970-01-01
  • 2016-08-23
  • 2018-06-23
  • 2018-11-14
  • 1970-01-01
相关资源
最近更新 更多