2017-10-04 12 views
2

J'ai un résultat de comparaison de comparaison de deux opérandes à virgule flottante comme suit; Ce que je dois faire est basée sur le résultat de la comparaison doivent effectuer les opérations suivantes: i.e.:NEON pack vector compare résultat en bitmap

neon_gt_res = vcgtq_f32(temp1, temp2); 
if(neon_gt_res[0]) array[0] |= (unsigned char)0x01; 
if(neon_gt_res[1]) array[0] |= (unsigned char)0x02; 
if(neon_gt_res[2]) array[0] |= (unsigned char)0x04; 
if(neon_gt_res[3]) array[0] |= (unsigned char)0x08; 

Mais l'écriture comme celui-ci est à nouveau équivalent à la comparaison multiple. Comment puis-je l'écrire de manière optimale dans les néons C intrinsèques.

Sur x86, ce serait array[0] |= _mm_movemask_ps(cmp_gt_res);

+0

De quel type est le tableau ' [] '? Je suppose que c'est un tableau d'octets, mais que votre type C implique. Vous voudriez un vecteur de '1 2 4 8' que vous masquez avec le résultat de la comparaison. Mais alors vous auriez besoin d'un shuffle pour empaqueter ce résultat dans les 4 octets bas d'un registre NEON, je pense. Je ne connais pas très bien NEON, mais probablement si vous pouvez le faire, vous voudrez alors faire un chargement de 32 bits de la matrice, faire un OU emballé, et stocker. –

+0

array [] est de type unsigned char. Le résultat de la comparaison est de type int32x4_t, donc je ne peux pas utiliser ce masque. Existe-t-il un autre moyen de m'aider avec ce – Lakshmi

+0

Mais NEON at-il pas d'instructions de byte-shuffle que vous pouvez utiliser pour empaqueter 1 octet de chaque élément du résultat de la comparaison? –

Répondre

3
vmov.i32 qmask, #1 
vand qres, qmask, qres 
vsra.u64 qres, qres, #30 
vsli.64 dres_bottom, dres_top, #2 

Et vous avez les bits dont vous avez besoin aux quatre bits les moins significatifs de qres.

//////////////////////// modifier

Une version améliorée ci-dessus:

vshr.u64 qres, qres, #31 
vsli.64 dres_bot, dres_top, #2 
// the four LSBs already contain the bitmap, the rest is optional: 
vbic.i16 dres_bot, #0xf0 
// you can now use byte 0 of dres_bot as the result.