J'essaie de convertir un code écrit en SSE3 intrinsèque en NEON SIMD et je suis bloqué à cause d'une fonction shuffle. GCC Intrinsèque s , Manuels ARM et d'autres forums, mais je n'ai pas trouvé de solution.
CODE :
_m128i upper = _mm_loadu_si128((__m128i*)p1);
register __m128i mask1 = _mm_set_epi8 (0x80,0x80,0x80,0x80,0x80,0x80,0x80,12,0x80,10,0x80,7,0x80,4,0x80,1);
register __m128i mask2 = _mm_set_epi8 (0x80,0x80,0x80,0x80,0x80,0x80,12,0x80,10,0x80,7,0x80,4,0x80,1,0x80);
__m128i temp1_upper = _mm_or_si128(_mm_shuffle_epi8(upper,mask1),_mm_shuffle_epi8(upper,mask2));
Bien que l'instruction vtbl1_u8(uint8x8_t,uint8x8_t) crée une table de recherche qui peut être utilisée pour affecter des valeurs à un registre de destination, elle n'opère que sur des registres de 64 bits. De plus, l'opération de mélange effectue une comparaison au départ qui doit être effectuée dans NEON et je ne sais pas comment le faire efficacement.
r0 = (mask0 & 0x80) ? 0 : SELECT(a, mask0 & 0x0f) // SELECT(a,n) extrait le nième paramètre de 8 bits de a.
r1 = (mask1 & 0x80) ? 0 : SELECT(a, mask1 & 0x0f)
...
Je ne trouve pas d'instruction qui vérifie d'abord le bit de poids fort du masque et qui sélectionne ensuite les 4 bits inférieurs du masque de manière efficace.Je sais que nous pouvons comparer chaque bit dans le registre et sélectionner ensuite les 4 bits inférieurs si la condition est spécifiée,mais j'espérais le faire de manière efficace.J'espère que quelqu'un pourra m'aider ou me fournir une référence.
Merci beaucoup,
Santé !