2017-09-09 64 views
5

Możemy permutować wektor w kilku miejscach i potrzebujemy wartości wyróżniającej 0 do użycia z wbudowanym vec_perm. Nie byliśmy w stanie zlokalizować pliku vec_zero() lub podobnego, więc chcielibyśmy wiedzieć, jak powinniśmy postępować.Jak uzyskać wartość VSX równą zero?

Kod aktualnie używa dwóch strategii. Pierwsza strategia jest obciążenie wektor:

__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); 

Druga strategia jest xor użyciu maski zamierzamy użyć:

__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); 

Nie rozpoczęte odniesienia (jeszcze), więc nie zrobić wiedzieć, czy ktoś jest lepszy od drugiego. Pierwsza strategia wykorzystuje obciążenie VMX i może być kosztowna. Druga strategia pozwala uniknąć obciążenia, ale wprowadza zależność od danych.

Jak uzyskać wartość VSX równą zero?

+0

Jeśli tylko zainicjować zmienną wektor do zera w zwykły sposób (zwróć uwagę, że istnieją dwie różne składnie tego, w zależności od tego, jakiego kompilatora używasz), wtedy kompilator zwykle wybierze dowolną metodę, która będzie bardziej wydajna niż zera do wektora. –

+0

Możesz oczywiście użyć bezpośredniej formy vec_splat dla zera i innych małych wartości. –

Odpowiedz

1

Proponuję, aby kompilator sobie z tym poradził. Wystarczy zainicjowania do zera:

const uint8x16_p8 zero = {0}; 

- który najprawdopodobniej skompilować do xor.

Na przykład, prosty test:

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

Na moim komputerze, to kompiluje do:

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