2011-03-11 9 views
0

Quelqu'un peut-il suggérer un moyen rapide de calculer float sol/plafond en utilisant pre-SSE4.1 SIMD? J'ai besoin de gérer correctement tous les cas de coin, par ex. quand j'ai une valeur float, ce n'est pas représentable par int 32 bits.ceil/sol dans sse simd

Actuellement, je suis en utilisant similaire au code suivant (j'utilise intrinsics C, converti en Asm pour plus de clarté):

;make many copies of the data 
movaps  xmm0, [float_value] 
movaps  xmm1, xmm0 
movaps  xmm2, xmm0 

;check if the value is not too large in magnitude 
andps  xmm1, [exp_mask] 
pcmpgtd  xmm1, [max_exp] 

;calculate the floor() 
cvttps2dq xmm3, xmm2 
psrld  xmm2, 31 
psubd  xmm3, xmm2 
cvtsq2ps  xmm2, xmm3 

;combine the results 
andps  xmm0, xmm1 
andnps  xmm1, xmm2 
orps   xmm0, xmm1 

est-il un moyen plus efficace de vérifier si la valeur flottante est pas trop grand pour 32bit int?

Répondre

0

Voici quelques-uns pour un élément pseudocode unique qui devrait être directement convertible en instructions vectorielles:

float f; 
int i = (int)f; /* 0x80000000 if out of range (as from cvtps2dq) */ 
if (i == 0x80000000) 
    return f; 
else 
    return (float)i; 

Vous utiliserez votre mode d'arrondi pour la distribution à int dans la deuxième ligne. Vous pouvez également tester l'indicateur IE dans MXCSR pour détecter les valeurs hors limites.