如何在AT& T组件中将具有双精度的80位浮点数从存储器移动到XMM0

时间:2016-05-04 15:02:25

标签: c linux assembly x86 long-double

我已经编写了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

1 个答案:

答案 0 :(得分:4)

你的前提是错误的:

  

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

sysv abi不会在long double寄存器中返回xmm0,而是st0documentation的相关部分:

  

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

     

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

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