#if defined(__x86_64__) || defined(__ia64__) || defined(_M_AMD64) || defined(_M_IA64) \ || defined(_WIN64) || defined(__alpha__) || defined(__s390__) #define _X64_MODE typedef uint64_t checker_type; #define _X_BRU(x) x #define _X_SEL(x,y) x #else typedef uint32_t checker_type; #define _X_BRU(x) #define _X_SEL(x,y) y #endif #define _WMAGIC checker_type(~0ULL/0xffff) size_t wcountch(wchar_t *ptr, wchar_t ch, wchar_t *last) { 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++; // _X_SEL(4,2) == sizeof(checker_type) / 2 for (ptr = trim; last - _X_SEL(4, 2) >= ptr; ptr += _X_SEL(4, 2)) { checker_type nptr = *(checker_type *)ptr ^ wide_checker; checker_type switchZero = 0; _X_BRU ( switchZero |= ((nptr & 0xffff000000000000) - (_WMAGIC & 0xffff000000000000)) & 0xffff000000000000; ) _X_BRU ( switchZero |= ((nptr & 0x0000ffff00000000) - (_WMAGIC & 0x0000ffff00000000)) & 0x0000ffff00000000; ) switchZero |= ((nptr & 0x00000000ffff0000) - (_WMAGIC & 0x00000000ffff0000)) & 0x00000000ffff0000; switchZero |= ((nptr & 0x000000000000ffff) - (_WMAGIC & 0x000000000000ffff)) & 0x000000000000ffff; count += (switchZero & ((~nptr & ((_WMAGIC) << 15)))) / 0x8000 % 0xffff; } for (; ptr <= last; ptr++) if (*ptr == ch) count++; return count; }