• The fastest strlen() ever

    From Bonita Montero@Bonita.Montero@gmail.com to comp.lang.c++ on Wed Nov 19 15:02:01 2025
    From Newsgroup: comp.lang.c++

    size_t xstrlen( char const *s )
    {
    -a -a char const *begin = s;
    -a -a __m512i zero = _mm512_setzero_si512();
    -a -a uintptr_t
    -a -a -a -a up = (uintptr_t)s,
    -a -a -a -a base = up & ~(uintptr_t)63;
    -a -a unsigned skip = (unsigned)(up - base);
    -a -a s = (char *)base;
    -a -a uint64_t matches = _mm512_cmpeq_epi8_mask( _mm512_load_si512( (void
    *)s ), zero );
    -a -a matches = matches >> skip;
    -a -a if( matches )
    -a -a -a -a return countr_zero( matches );
    -a -a s += 64;
    -a -a for( ; ; s += 64 )
    -a -a -a -a if( matches = _mm512_cmpeq_epi8_mask( _mm512_load_si512( (void *)s ), zero ); matches )
    -a -a -a -a -a -a return s - begin + countr_zero( matches );
    }

    Everything with AVX-512.


    --- Synchronet 3.21a-Linux NewsLink 1.2