// 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; }

ㅡ,ㅡ