2017-09-09 10 views
5

Nous permutons un vecteur dans quelques endroits, et nous avons besoin de la valeur 0 distinguée à utiliser avec le vec_perm intégré. Nous n'avons pas été en mesure de localiser un vec_zero() ou similaire, donc nous aimerions savoir comment nous devrions gérer les choses.Comment obtenir une valeur VSX de zéro?

Le code utilise actuellement deux stratégies. La première stratégie est une charge de vecteur:

__attribute__((aligned(16))) 
static const uint8_t z[16] = 
    { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }; 

const uint8x16_p8 zero = vec_ld(0, z); 

La deuxième stratégie est un XOR en utilisant le masque nous avons l'intention d'utiliser:

__attribute__((aligned(16))) 
static const uint8_t m[16] = 
    { 15,14,13,12, 11,10,9,8, 7,6,5,4, 3,2,1,0 }; 

const uint8x16_p8 mask = vec_ld(0, m); 
const uint8x16_p8 zero = vec_xor(mask, mask); 

Nous avons pas commencé repères (encore), donc nous ne savoir si l'un est meilleur que l'autre. La première stratégie utilise une charge VMX et cela pourrait être coûteux. La seconde stratégie évite la charge mais introduit une dépendance aux données. Comment obtenir une valeur VSX de zéro?

+0

Si vous venez initialisez la variable de vecteur à zéro de la manière habituelle (notez qu'il ya deux syntaxes différentes pour cela, en fonction du compilateur que vous utilisez), le compilateur choisira généralement quelle méthode est la plus efficace pour splat zéro au vecteur. –

+0

Vous pouvez bien sûr utiliser la forme immédiate de vec_splat pour zéro et d'autres petites valeurs. –

Répondre

1

Je suggère de laisser le compilateur le gérer pour vous. Juste à zéro initialise:

const uint8x16_p8 zero = {0}; 

- qui compilera probablement un xor.

Par exemple, un test simple:

vector char foo(void) 
{ 
    const vector char zero = {0}; 
    return zero; 
} 

Sur ma machine, ce compile à:

0000000000000000 <foo>: 
    0: d7 14 42 f0  xxlxor vs34,vs34,vs34 
    4: 20 00 80 4e  blr 
    ...