сборка x86 чтобы зарегистрироваться как int? - PullRequest
0 голосов
/ 16 ноября 2010

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

1 Ответ

0 голосов
/ 16 ноября 2010

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

...