64,656
社区成员
发帖
与我相关
我的任务
分享
#define hasNulByte(x) ((x - 0x01010101) & ~x & 0x80808080)
#define SW (sizeof (int) / sizeof (char))
int xstrlen (const char *s) {
const char *p;
int d;
p = s - 1;
do {
p++;
if ((((int) p) & (SW - 1)) == 0) {
do {
d = *((int *) p);
p += SW;
} while (!hasNulByte (d));
p -= SW;
}
} while (*p != 0);
return p - s;
}
size_t myStrlen(const char* str)
{
const char* start = str;
__m128i m = _mm_load_si128((const __m128i*)str), zero = _mm_setzero_si128();
size_t pos;
for (pos = 0; !(pos = _mm_movemask_epi8(_mm_cmpeq_epi8(m, zero))); str += 16, m = _mm_load_si128((const __m128i*)str));
for (; (pos & 1) != 1; pos >>= 1, ++str);
return str - start;
}