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