2012-01-30 3 views
5

Je suis intéressé à trouver le moyen le plus rapide de comparer les valeurs stockées dans les registres NEON (disons Q0 et Q3) sur un noyau Cortex-A9 (instructions VFP autorisées).ARM NEON: comparaison de 128 bits

Jusqu'à présent, je donne les résultats suivants:

(1) En utilisant la comparaison à virgule flottante VFP:

vcmp.f64  d0, d6 
vmrs   APSR_nzcv, fpscr 
vcmpeq.f64  d1, d7 
vmrseq   APSR_nzcv, fpscr 

Si le 64bit "flotte" sont équivalentes à NaN, cette version ne fonctionnera pas.

(2) Utilisation du rétrécissement NEON et la comparaison VFP (cette fois-ci une seule fois et d'une manière NaN-safe):

vceq.i32  q15, q0, q3 
vmovn.i32  d31, q15 
vshl.s16  d31, d31, #8 
vcmp.f64  d31, d29 
vmrs   APSR_nzcv, fpscr 

Le registre D29 est déjà pré-chargé avec le motif droit 16bit:

vmov.i16  d29, #65280  ; 0xff00 

Ma question est la suivante: y a-t-il mieux que cela? Est-ce que je supervise une façon évidente de le faire?

Répondre

2

Je crois que vous pouvez le réduire d'une instruction. En utilisant le décalage vers la gauche et l'insertion (VLSI), vous pouvez combiner les 4 valeurs de 32 bits de Q15 en 4 valeurs de 16 bits dans D31. Vous pouvez ensuite comparer avec 0 et obtenir les indicateurs de virgule flottante.

vceq.i32 q15, q0, q3 
vlsi.32 d31, d30, #16 
vcmp.f64 d31, #0 
vmrs  APSR_nzcv, fpscr 
+0

Le premier intruction « écrase » l'ensemble Q15 (à savoir D30 et D31), tandis que le second a seulement D31 comme _destination_, certaines informations sont donc perdues et la comparaison donnera pas toujours le bon résultat. – Mircea

+0

Lorsque vous utilisez vceq.i32, il place tous les 1 ou tous les 0 dans chacune des 4 voies 32 bits. La première instruction combine les informations utiles de D30 et D31 en D31 (les 16 bits inférieurs des 4 comparés). La seconde instruction compare les 64 bits inférieurs qui ont toutes les informations utiles. – BitBank

+0

La première instruction (c'est-à-dire vceq.i32) ne "combine" rien. De plus, le second n'utilise pas D31 comme entrée ... – Mircea