документы GCC для дополнительных плавающих типов:
ISO/IEC TS 18661-3:2015 определяет поддержку C для дополнительных плавающих типов _Floatn
и _Floatnx
.
... В настоящее время GCC не поддерживает _Float128x ни на каких системах.
Я думаю, что _Float128x
- это двоичный файл IEEE128, то есть настоящее 128-битное число с плавающей запятой с огромным диапазоном показателей. См. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1691.pdf.
__float80
, очевидно, является 10-байтовым типом x87. В x86-64 SysV ABI это то же самое, что и long double
; оба имеют 16-байтовое выравнивание в этом ABI.
__float80 доступен для целей i386, x86_64 и IA-64 и поддерживает 80-битный (XFmode) плавающий тип. Это псевдоним имени типа _Float64x для этих целей.
Я думаю, что __float128
- это тип повышенной точности, использующий SSE2, предположительно двойной двойной формат с удвоенной шириной мантиссы, но теми же ограничениями экспоненты, что и 64-битный double
. (т.е. меньший диапазон показателей, чем __float80
)
В i386, x86_64 и... __float128 является псевдонимом для _Float128.
Вероятно, это те же самые doubledouble, которые дает вам gcc с __float128
. Или может быть это 128-битная программа с плавающей запятой
Проводник компилятора Godbolt а> для gcc7.3 -O3 (то же, что и gcc4.6, очевидно, эти типы не новы)
//long double add_ld(long double x) { return x+x; } // same as __float80
__float80 add80(__float80 x) { return x+x; }
fld TBYTE PTR [rsp+8] # arg on the stack
fadd st, st(0)
ret # and returned in st(0)
__float128 add128(__float128 x) { return x+x; }
# IDK why not movapd or better movaps, silly compiler
movdqa xmm1, xmm0 # x arg in xmm0
sub rsp, 8 # align the stack
call __addtf3 # args in xmm0, xmm1
add rsp, 8
ret # return value in xmm0, I assume
int size80 = sizeof(__float80); // 16
int sizeld = sizeof(long double); // 16
int size128 = sizeof(__float128); // 16
Таким образом, gcc вызывает функцию libgcc для __float128
добавления, не встраивая приращение в экспоненту или что-то в этом роде.
person
Peter Cordes
schedule
18.04.2018