// src에 포함된 null wide byte를 찾습니다.
inline checker_type HawzHelper(checker_type src) const
{
// 0x0001000100010001
// 0x8000800080008000
return (src - (_WMAGIC)) & ((~src & ((_WMAGIC) << 15)));
}
size_t wcountch(wchar_t *ptr, wchar_t ch) const
{
size_t count = 0;
wchar_t *trim = (wchar_t *)
_X_SEL((((checker_type)ptr & -8LL) + 8), (((checker_type)ptr & -4LL) + 4));
checker_type wide_checker =
_X_BRU ( ((checker_type)ch << 48) | )
_X_BRU ( ((checker_type)ch << 32) | )
((checker_type)ch << 16) |
((checker_type)ch << 0 );
if (trim < ptr) trim = ptr;
for (; ptr < trim; ptr++)
if (*ptr == ch) count++;
for (ptr = trim; m_last - _X_SEL(4, 2) >= ptr; ptr += _X_SEL(4, 2))
{
checker_type nptr = *(checker_type *)ptr ^ wide_checker;
if (HawzHelper(nptr))
{
#if 0
checker_type switchZero = 0;
switchZero =
((nptr & 0x000000000000ffff) - (_WMAGIC & 0x000000000000ffff)) & 0x000000000000ffff
| ((nptr & 0x00000000ffff0000) - (_WMAGIC & 0x00000000ffff0000)) & 0x00000000ffff0000
_X_BRU ( | ((nptr & 0x0000ffff00000000) - (_WMAGIC & 0x0000ffff00000000)) & 0x0000ffff00000000 )
_X_BRU ( | ((nptr & 0xffff000000000000) - (_WMAGIC & 0xffff000000000000)) & 0xffff000000000000 )
;
count += (switchZero & ((~nptr & ((_WMAGIC) << 15)))) / 0x8000 % 0xffff;
#else
if ( ptr[0] == ch ) count++;
if ( ptr[1] == ch ) count++;
_X_BRU ( if ( ptr[2] == ch ) count++;)
_X_BRU ( if ( ptr[3] == ch ) count++;)
#endif
}
}
for (; ptr <= m_last; ptr++)
if (*ptr == ch) count++;
return count;
}
ㅡ,ㅡ
댓글 0