Портативный способ доступа к битам в представлении FP заключается в записи в объединение, которое записывается в память. По крайней мере, это то, что делает glibc. Но приведенный ниже код выглядит дико чрезмерно сложным, а также медленным. Мне интересно, есть ли инструкция x86 для копирования 64 доступных битов регистра FP в целочисленный регистр, чтобы можно было манипулировать битами? Это не будет переносимым, но идея состоит в том, чтобы иметь встроенную функцию, и каждый порт должен реализовать стандартную чистую (и быструю) процедуру.x86 сборка для получения регистра как int?
В этом случае я смотрю на 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);
}
Реестр FP имеет ширину 80 бит, поэтому он не будет вписываться в обычный регистр ... –
Обратите также внимание, что доступ к битам через объединение определенно * не * переносится. Инфраструктура компилятора может уйти от него, потому что, по определению, они были написаны для конкретной платформы. –
На самом деле, код glibc переносимый. он работает для математики IEEE 754, которая является стандартом. 80-битное оборудование не является стандартным, да. Мне было любопытно, можно ли извлечь 64 бита, как и в случае записи в память. – Dov