2017-06-16 6 views
1

Ensuite, ce que je veux dire, c'est que je veux diviser chaque int non signé de 32 bits en quatre 8 bits. Le bit correspondant ne change pas.Comment convertir uInt32x4_t en uInt8x16_t en Néon?

Si le uInt32x4 est:

01000101001111100000001000010000 | 01000101001111100000001000010000 | 01000101001111100000001000010000 | 01000101001111100000001000010000 

Je veux obtenir:

01000101 | 00111110 | 00000010 | 00010000 | 01000101 | 00111110 | 00000010 | 00010000 | 01000101 | 00111110 | 00000010 | 00010000 | 01000101 | 00111110 | 00000010 | 00010000 | 

Comment puis-je faire cela?

Répondre

1

Avec vreinterpretq_u8_u32. Le prototype est:

uint8x16_t vreinterpretq_u8_u32 (uint32x4_t a); 

Modifier: comme @EOF a souligné dans le commentaire ci-dessous, vous devrez peut-être un swap endian (vrev32q_u8) aussi. GCC et clang définissent __BYTE_ORDER____ORDER_LITTLE_ENDIAN__ pour little-endian et __ORDER_BIG_ENDIAN__ pour le grand-boutiste), ou si vous avez besoin de quelque chose un peu voir plus portable https://github.com/nemequ/portable-snippets/tree/master/endian

+0

Salut, je l'ai essayé, mais il semble que la réponse est correcte. –

+0

Je mets à jour la question.Je ne sais pas comment écrire ceci dans le commentaire. –

+1

@ Y.Zhu: Vous ne connaissez apparemment pas * endianness *. Vous aurez besoin d'un 'VREV32.8' (aka' vrev32q_u8() '). – EOF