成瀬です。

サイボウズの光成さんの所に SSE2 を用いた strlen が載っているのですが、
これを取り込みませんか。
http://labs.cybozu.co.jp/blog/mitsunari/

SSE2 は CPU 依存が・・・とお思いになるかもしれませんが、
本家の Intel では Pentium4 (2000年11月) から搭載されていますし、
AMD でも Athlon64 から搭載されています。
また、AMD64 規格では SSE2 が必須であるため、今後の両者の CPU、
さらに (もし登場すれば) 他の AMD64 な CPU でも恩恵を受けることができます。

許諾等はわたしがやります。

#if __SSE2__
#  ifdef _WIN32
#    include <intrin.h>
#    define bsf(x) (_BitScanForward((unsigned long*)(&x), x), x)
#  else
#    include <xmmintrin.h>
#    define bsf(x) __builtin_ctz(x)
#  endif
size_t
rb_strlen(const char *p)
{
    const char *const top = p;
    __m128i c16 = _mm_set1_epi8(0);
    /* 16 byte alignment */
    size_t ip = (size_t)(p);
    size_t n = ip & 15;
    if (n > 0) {
        ip &= ~15;
        __m128i x = *(const __m128i*)ip;
        __m128i a = _mm_cmpeq_epi8(x, c16);
        unsigned int mask = _mm_movemask_epi8(a);
        mask &= -(1 << n);
        if (mask) {
            return bsf(mask) - n;
        }
        p += 16 - n;
    }
    for (;;) {
        __m128i x = *(const __m128i*)&p[0];
        __m128i y = *(const __m128i*)&p[16];
        __m128i a = _mm_cmpeq_epi8(x, c16);
        __m128i b = _mm_cmpeq_epi8(y, c16);
        unsigned int mask = (_mm_movemask_epi8(b) << 16) | _mm_movemask_epi8(a);
        if (mask) {
            return p + bsf(mask) - top;
        }
        p += 32;
    }
}
#else
#  define rb_strlen(s) strlen(s)
#endif


-- 
NARUSE, Yui  <naruse / airemix.jp>