Переносимый способ доступа к битам в представлении FP - это запись в объединение, которое записывает в память.По крайней мере, это то, что делает Glibc.Но приведенный ниже код выглядит чрезмерно сложным и медленным.Мне интересно, есть ли инструкция x86 для копирования 64 доступных битов регистра FP в регистр целых чисел, чтобы можно было манипулировать этими битами?Это не было бы переносимо, но идея в том, чтобы иметь встроенную функцию, и каждый порт должен реализовывать стандартную чистую (и быструю) процедуру.
В этом случае я смотрю на isnan, которыйреализовано как:
#define EXTRACT_WORDS(ix0,ix1,d) \
do { \
ieee_double_shape_type ew_u; \
ew_u.value = (d); \
(ix0) = ew_u.parts.msw; \
(ix1) = ew_u.parts.lsw; \
} while (0)
int __isnan(double x)
{
int32_t hx,lx;
EXTRACT_WORDS(hx,lx,x);
hx &= 0x7fffffff;
hx |= (u_int32_t)(lx|(-lx))>>31;
hx = 0x7ff00000 - hx;
return (int)(((u_int32_t)hx)>>31);
}