Neon Comparison

Selon la documentation Neon:

  • Si la comparaison est vraie pour une piste, le résultat dans cette piste est défini sur un bit. Si la comparaison est fausse pour une voie, tous les bits sont mis à zéro. Le type de retour est un type entier non signé.

J’ai écrit un petit morceau de code pour vérifier ceci et j’ai observé le résultat comme étant 0 et -1 au lieu de 0 et 1. Quelqu’un peut-il me dire la raison derrière cela?

Code:

float c1[4] = {12.0f,12.0f,12.0f,12.0f}; float c2[4] = {13.0f,12.0f,9.0f,12.0f}; float32x4_t t1,t2; uint32x4_t rq; t1 = vld1q_f32(c1); t2 = vld1q_f32(c2); rq = vceqq_f32(t1,t2); printf("start\n"); for( int i = 0;i < 4; i++){ printf("%d\n",rq[i]); } printf("end\n"); 

Résultat:

 start 0 -1 0 -1 end 

Vous affichez les valeurs comme si elles étaient signées, car vous utilisez %d comme printf format printf . Si vous utilisez %u vous verrez les valeurs non signées équivalentes ( 0 ou UINT_MAX ).

Notez que la signature n’est pas particulièrement importante dans ce contexte – vous pouvez traiter les résultats de la comparaison comme des masques non signés (tous les 0 ou tous les 1) ou comme des valeurs entières signées (0 ou -1). Il s’agit du même motif de bits sous-jacent. tout ce qui a du sens dans le contexte particulier où vous utilisez le résultat.

Ici, comme dans le document néon, il est également mentionné car tous les bits seront mis à un.

C’est ici:

Binary 1111 1111 1111 1111 1111 1111 1111 1111 = Decimal 4294967295

Et utilisez% u au lieu de% d .Vous obtiendrez le résultat suivant:

Résultat: 0 4294967295 0 4294967295

Vous obtenez un résultat égal à -1, ce qui signifie que tous les bits sont réglés sur un. Vous pouvez l’utiliser pour d’autres opérations logiques, comme au niveau des bits et des bits ou des opérations.