Ich muss überprüfen, dass alle Vektorelemente nicht Null sind. Bisher habe ich folgende Lösung gefunden. Gibt es einen besseren Weg, dies zu tun? Ich verwende gcc 4.8.2 unter Linux/x86_64, Anweisungen bis zu SSE4.2.SIMD/SSE: Wie überprüft man, dass alle Vektorelemente nicht Null sind
typedef char ChrVect __attribute__((vector_size(16), aligned(16)));
inline bool testNonzero(ChrVect vect)
{
const ChrVect vzero = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
return (0 == (__int128_t)(vzero == vect));
}
Update: Code über folgende Assembler-Code kompiliert wird (wenn sie als nicht-Inline-Funktion kompiliert):
movdqa %xmm0, -24(%rsp)
pxor %xmm0, %xmm0
pcmpeqb -24(%rsp), %xmm0
movdqa %xmm0, -24(%rsp)
movq -24(%rsp), %rax
orq -16(%rsp), %rax
sete %al
ret
Für welche Architektur interessieren Sie sich? x86? LEISTUNG? ARM? ...? –
x86_64, Anweisungen bis SSE4.2 –
Warum nicht? Return ((__int128_t) (vzero == vect) == 0) 'aber' return (0 == (__int128_t) (vzero == vect)) '? Vielleicht ist es "modern"? – i486