2014-01-26 31 views
1

我知道由eax返回的1/2/4字节整数和由eax:edx返回的8字节整数。Visual C++ x86 ABI:VC++如何返回值

顺便说一句,4/8/16字节浮点数如何是 (也许我记得 long double可能是16byte ..) 在cdecl/stdcall中返回?


由于@MatteoItalia,我知道VC++的long double是8字节; 那么,我怎样才能使用16字节的浮点?

(不要说我 “只用8个字节的!” 我真的需要它。)

嗯,我想我应该满足于10字节浮点...

回答

4

FP返回值在ST0 x87寄存器中返回(请参阅here)。

顺便说一句,在VC++ long double(其中x87是80位)实际上是double的同义词。

+0

哎唷!那么,我怎样才能使用16byte浮点? – ikh

+0

@ikh:在x86上(或者我知道的任何广泛的平台上)没有原生的128位FP支持,您可能必须寻找一些在软件中实现它的库(但它将比基于硬件FP)。顺便说一下,为什么你需要这样一个精确的类型? –

+0

@MetoItalia嗯,我应该满足于10个字节的浮点数..我正在编写一个小字节代码,解释型语言,并且有一些需要16字节浮点...但是我应该使用10byte一个16byte – ikh

0

你不提供架构,但86返回在XMM0https://en.wikipedia.org/wiki/X86_calling_conventionsST(0)和x86_64回报

在VC

long double用于x86和x86_64是the same as double,不会提供你更多的精度浮点值。因此,在Windows上执行80位浮点操作时,需要使用其他编译器,如gcc or Intel compiler。而且,80位长的double是由x87计算的,所以它可能比一个好的SSE库更差。

如果您需要超过10个字节的长度,那么您必须实现自己的浮点库或使用一个可用的浮点库。 GCC 4.3 and above通过软库支持__float128

另一种方法是使用double-double来实现接近四倍的精度值,如PowerPC或SPARC。这不是IEEE兼容,但你可以利用硬件双操作来加速,所以也许它比软更快__float128