2009-11-13 2 views
4

Quelle est la meilleure façon (sse2) de réduire un _m128 (4 mots a b c d) en un mot? Je veux la partie basse de chaque composants _m128:SSE2: Comment réduire un _m128 en un mot

int result = (_m128.a & 0x000000ff) << 24 
     | (_m128.b & 0x000000ff) << 16 
     | (_m128.c & 0x000000ff) << 8 
     | (_m128.d & 0x000000ff) << 0 

Y at-il un intrinsics pour cela? Merci !

Répondre

2

Pour votre information, les intrinsics SSE3 _mm_shuffle_epi8 faire le travail: (avec le 0x0004080c masque dans ce cas)

+0

'_mm_shuffle_epi8' (' PSHUFB') est ** SSSE3 ** (alias ** SSE3.5 ** alias ** MNI **). Sinon bonne réponse: +1. –

1

La réponse SSE2 prend plus d'un instructions:

unsigned benoit(__m128i x) 
{ 
    __m128i zero = _mm_setzero_si128(), mask = _mm_set1_epi32(255); 
    return _mm_cvtsi128_si32(
       _mm_packus_epi16(
         _mm_packus_epi16(
           _mm_and_si128(x, mask), zero), zero)); 
} 

Les montants ci-dessus à 5 opérations de la machine , compte tenu de l'entrée en% XMM1 et la sortie en% rax:

pxor  %xmm0, %xmm0 
pand  MASK, %xmm1 
packuswb %xmm0, %xmm1 
packuswb %xmm0, %xmm1 
movd  %xmm1, %rax 

Si vous voulez voir quelques utilisations inhabituelles de SSE2, y compris transpose bit matrice à grande vitesse, s Tring search et le type bitonique (GPGPU-style), vous voudrez peut-être vérifier mon blog, Coding on the edges.

Quoi qu'il en soit, espérons que cela aide.

Questions connexes