Floating point 将x86系统中的浮点操作更改为armv8系统中的浮点操作

Floating point 将x86系统中的浮点操作更改为armv8系统中的浮点操作,floating-point,x86,stack,arm,inline-assembly,Floating Point,X86,Stack,Arm,Inline Assembly,我读了一些关于浮点运算的内联汇编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系统中运行的代码 首先,我

我读了一些关于浮点运算的内联汇编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系统中运行。

解释了x87 FPU的工作原理,并且在“英特尔insn ref”手册没有告诉您这些部件是如何组合在一起时,这是一个有用的参考。我将把它添加到x86标记wiki中

你只能靠自己的手臂


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

我们不是代码翻译服务,也不是教您x86和ARM汇编程序。我只想知道这两个系统之间的区别。只要两个指令!你用谷歌搜索过有问题的说明了吗?没有证据表明您曾试图亲自回答此问题。
FNINIT
初始化x87 FPU
FCOMP
将堆栈顶部的
ST(0)
ST(1)
进行比较,然后弹出堆栈。因为您没有显示代码,所以我们无法说出正在比较的内容。由于
FCOMP
后面的代码缺失,我们也不知道该代码实现了什么比较运算符。由于HLL支持浮点操作数的比较,因此不清楚此处使用内联汇编的目的。如果只是在HLL级别比较操作数,会发生什么情况?不能单独移植单个指令;当然,您可以交叉引用指令列表,并找出
fcomp
是一个浮点比较,因此粗略的A64(我假设ARMv8中的3个不同指令集中有一个)相当于(也许并不奇怪)
fcmp
,但是ARM指令采用两个显式参数,而不是x87的隐式堆栈用法——您将指定哪些寄存器?如果不考虑代码的意图,不适当地重新构造整个过程,您仍然会迷失方向。我编写了一个程序来综合基准测试,这就是为什么我要在asm中编写一些东西。我可以处理所有其他的操作。然而,FP操作让我很困惑。为什么程序需要初始化和还原FP堆栈。不过,感谢您的帮助。本教程似乎很棒。@80247617aaa:“综合基准测试”?不知道那是什么意思。你的意思是你写了一个程序,是一个综合的基准?让编译器处理FP细节。ABI要求在输入函数或从函数返回时FP堆栈为空,但在32位x86中保留FP返回值除外。基准测试不应该与任何其他使用浮点的程序有任何不同,不管是否溢出FP堆栈。我的意思是我写了一个可以创建基准测试的程序。我已经有了一个可以创建基准的程序,但是这个程序是为x86设计的。我想更改程序,使其创建在armv8上运行的基准测试。我对上一个程序(为x86设计)中的FP操作感到困惑,我不知道是否需要在armv8系统中进行一些FP操作。@80247617aaa:您可能应该找出您感兴趣的性能特征,以便测试与您相关的性能特征。否则,只需看看标准基准测试套件,比如SPECint和SPECfp。(尽管大多数SPECint并没有受到很高的重视,这是因为代码量小,而且当前的优化编译器在许多基准测试中都看到了特例优化,而不是在其他测试中)