2010-11-15 4 views
0

La manière portable d'accéder aux bits dans la représentation FP est d'écrire dans une union, qui écrit en mémoire. Au moins, c'est ce que fait la glibc. Mais le code ci-dessous semble follement trop compliqué, aussi bien que lent. Je me demande s'il existe une instruction x86 pour copier 64 bits accessibles d'un registre FP dans un registre entier afin que les bits puissent être manipulés? Ce ne serait pas portable, mais l'idée est d'avoir une fonction en ligne, et chaque port doit implémenter une routine standard propre (et rapide).assemblage x86 pour se faire enregistrer comme int?

Dans ce cas, je suis à la recherche isnan, qui est mis en œuvre:

#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

Un registre FP a une largeur de 80 bits, donc ne rentrera pas dans un registre normal ... –

+1

Notez également que l'accès aux bits via une union est définitivement * non * portable. Les intrinsèques du compilateur peuvent s'en tirer parce que, par définition, ils ont été écrits pour une plate-forme spécifique. –

+0

En fait, le code de la glibc est portable. cela fonctionne pour les mathématiques IEEE 754, qui est une norme. Le matériel 80 bits n'est pas standard, oui. J'étais curieux de savoir si l'on pouvait extraire les 64 bits, comme vous le feriez si vous écrivez à la mémoire. – Dov

Répondre

0

Il n'y a pas d'instructions x86 pour copier un FP enregistrer dans un registre entier ou vice-versa. Vous pouvez probablement obtenir ce que vous voulez en utilisant SSE instrinsics à la place, car un registre SSE peut contenir à la fois des valeurs entières et des valeurs à virgule flottante.

+0

Y at-il un test de matériel pour les valeurs "spéciales" comme Nan et Inf? – Dov

+0

@Dov, je ne pense pas. Vous pouvez faire un! = A pour NaN et QNaN et probablement comparer directement avec Inf ou -Inf, mais comme ceux-ci peuvent être lents de toute façon, vous pouvez aussi utiliser les fonctions de math.h. – MSN

Questions connexes