我已经编写了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
?
答案 0 :(得分:4)
你的前提是错误的:
如何完成以下代码,以便C可以读取long double %XMM0寄存器。
sysv abi不会在long double
寄存器中返回xmm0
,而是st0
。
documentation的相关部分:
long double类型的64位尾数属于class X87,16位指数加上6个字节的填充属于类 X87UP。
如果类是X87UP,则返回值与 %st0中的前一个X87值。
显然你已经拥有了st0
中的值,所以你不必做任何事情就把它留在那里,这意味着删除你的例子中的fstpt
。