18. equal orderedの例
src = "ABCA¥0XYZ", text = "BABCAB¥0S";
text文字列
7 6 5 4 3 2 1 0(j)
S ¥0 B A C B A B
src 0(i) A fF fF F T F F T F F
文 1 B fF fF T F F T F x T
字 F
列 2 C fF fF F F T F x x F
3 A fF fF F T F x x x F
F
4 ¥0 fT fT fT fT fT x x x
F
5 X fT fT fT x x x x x F
6 Y fT fT x x x x x x IntRes1
7 Z fT x x x x x x x
'¥0'の後ろはinvalid http://journal.mycom.co.jp/articles/2008/04/10/idf09/008.html
T:True, F:False, fT:force True, fF:force Flase
2011/8/6 18 /41
37. SSE4.2 intrinsc版countWord
do {
p += 16;
ret = _mm_cmpistrm(im, *(const __m128i*)p, 0x4);
x = _mm_slli_epi16(ret, 1);
x = _mm_or_si128(prev, x);
prev = _mm_srli_epi32(ret, 15);
x = _mm_xor_si128(x, ret);
count += _mm_popcnt_u32(_mm_cvtsi128_si32(x));
} while (!_mm_cmpistrz(im, *(const __m128i*)p, 0x4));
retの各ビットに(c in (C)) ? 1 : 0が入る
x = ret << 1;
x = x | prev; // 前回の残りの1bit
prev = ret >> 15;
x = x ^ ret.
count += xのビットの数
文字列の中に'¥0'が見つかるまでループ
2011/8/6 37 /41