2010-11-15 3 views
0

Портативный способ доступа к битам в представлении 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); 
} 
+0

Реестр FP имеет ширину 80 бит, поэтому он не будет вписываться в обычный регистр ... –

+1

Обратите также внимание, что доступ к битам через объединение определенно * не * переносится. Инфраструктура компилятора может уйти от него, потому что, по определению, они были написаны для конкретной платформы. –

+0

На самом деле, код glibc переносимый. он работает для математики IEEE 754, которая является стандартом. 80-битное оборудование не является стандартным, да. Мне было любопытно, можно ли извлечь 64 бита, как и в случае записи в память. – Dov

ответ

0

Там нет инструкции x86 скопировать FP регистр в целочисленный регистр или наоборот. Вероятно, вы можете получить то, что хотите, используя instrinsics SSE, поскольку регистр SSE может содержать как значения целых чисел, так и значения с плавающей запятой.

+0

есть аппаратный тест для «специальных» значений, таких как Nan и Inf? – Dov

+0

@ Дов, я так не думаю. Вы можете сделать a! = A для NaN и QNaN и, вероятно, сравнить напрямую с Inf или -Inf, но поскольку они могут быть медленными в любом случае, вы можете также использовать функции в math.h. – MSN

Смежные вопросы