clz が SIMD になりました。16並列で 32bit clz します。
clz は上のほうから見ます。0 の場合は32になります。
僕はいつまでたっても、clz, ctz どっちがどっちで、bsr, bsf がどっちなのか忘れますね。(どうでもいい情報。)
http://en.wikipedia.org/wiki/Find_first_set#Hardware_support なるほど?
#include <immintrin.h>
#include <stdio.h>
unsigned int in[16] = {
1,
1<<31,
(1<<31) | 1,
(1<<16),
0xaaaaaaaa,
0x55555555,
~0,
0,
};
unsigned int out[16];
void
dump_bits32(unsigned int a)
{
for (int i=0; i<32; i++) {
if (a & (1<<(31-i))) {
putchar('1');
} else {
putchar('0');
}
}
putchar(':');
}
int
main()
{
__m512i v0 = _mm512_loadu_si512(in);
v0 = _mm512_lzcnt_epi32(v0);
_mm512_storeu_si512(out, v0);
for (int i=0; i<8; i++) {
dump_bits32(in[i]);
printf("%d\n", out[i]);
}
}
00000000000000000000000000000001:31
10000000000000000000000000000000:0
10000000000000000000000000000001:0
00000000000000010000000000000000:15
10101010101010101010101010101010:0
01010101010101010101010101010101:1
11111111111111111111111111111111:0
00000000000000000000000000000000:32
何故か、AVX-512CD(conflict detection)拡張です。
明日は、@tanakmura が vrangeps について書きます。