2

我编写了一个 AT&T 汇编函数来计算积分。我需要将它作为返回值传递,因为它是由用 C 编写的代码调用的。我已经成功地将它作为单精度float和双精度返回double。但我知道我可以以 80 位双扩展精度计算它,我很想将它传递给 C。

假设我要传递的值指向 TOP 指向的 FPU 寄存器。下面是我如何调用函数。

对于浮动:

//C
double  integ_fo=integ_asm_fpu_fl();

#asm
...  
fstps   max        # Fpu STore and Pop Short <- short for 32-bit
movss   max, %xmm0 # MOVe Scalar Single precision   

双倍:

//C
double  integ_do=integ_asm_fpu_do();

#asm
...  
fstpl   max        # Fpu STore and Pop Long <- long for 64-bit
movsd   max, %xmm0 # MOVe Scalar Dingle precision 

我现在的问题是:如何完成以下代码,以便 C 可以long double%XMM0寄存器中读取。

对于长双:

//C
long double  integ_lo=integ_asm_fpu_lo();

#asm
...  
fstpt   max        # FPU Store and Pop exTended <- extended for 80-bit

之后我该怎么办?我将如何将 80 位从 移动max%XMM0

4

1 回答 1

4

你的前提是错误的:

如何完成以下代码,以便 C 可以从 %XMM0 寄存器读取 long double。

sysv abi 不在寄存器中返回,而是long double在. 文档的相关部分:xmm0st0

long double 类型参数的 64 位尾数属于 X87 类,16 位指数加上 6 个字节的填充属于 X87UP 类。

如果类是 X87UP,则该值与 %st0 中的先前 X87 值一起返回。

显然你已经拥有了价值,st0所以你不必做任何事情,只要把它留在那里,这意味着fstpt在你的例子中删除。

于 2016-05-04T16:01:48.893 回答