Il n'y a pas beaucoup de choses conditionnelles dans NEON, mais ce qu'il y a est vraiment seulement faisable avec la logique binaire, plutôt que booléenne, voir par exemple. vbsl
.
Si vous avez des souvenirs horribles de BASIC et détestez vraiment les valeurs de vérité au niveau du bit, le moyen trivial de convertir le masque à une valeur booléenne est de prendre juste le bit haut de chaque élément:
vshr.u32 q9, q9, #31
Bien que la négation, tout sans doute moins évident de lire un coup d'oeil, pourrait être mieux sage microscopiquement les performances dans certains cas:
vneg.s32 q9, q9
(à partir d'une navigation par timings microarchitecture, les deux opérations sont à peu près identiques, mais certains avantages théoriques de vneg
sur vshr
sont qu'il consomme ses entrées plus tard Cortex-A8, et peut émettre sur les deux tuyaux ASIMD de Cortex-A57/A72)
Quoi qu'il en soit, comme dit en haut, cela ne fait vraiment sens pour stocker les résultat retour à la mémoire pour être regardé par le code non-vectorisé.
Il produit tous les 1 bits, ce qui est en effet -1 si vous l'interprétez comme le complément à 2 signé. Si vous n'avez besoin que d'un seul bit, que diriez-vous d'utiliser 'AND' bitwise. – Jester
Donc c'est un résultat normal? Je pensais que c'était une sorte d'erreur. Merci – Andrey
Oui, c'est normal. Ceci est plus utile pour les opérations de masquage, et vous pouvez facilement obtenir celui que vous voulez. – Jester