Forums before death by AOL, social media and spammers... "We can't have nice things"
|    comp.lang.c    |    Meh, in C you gotta define EVERYTHING    |    243,242 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 242,016 of 243,242    |
|    Bonita Montero to All    |
|    Re: Unicode...    |
|    21 Nov 25 11:10:39    |
   
   From: Bonita.Montero@gmail.com   
      
   Am 21.11.2025 um 03:21 schrieb Michael Sanders:   
   > Hi Bonita! These are nice c++/c examples you've provided.   
   > Thanks for your input, I appreciate your code & remarks.   
      
   That's an even cooler solution with AVX-512 and without validation.   
      
   size_t utf8Width( const char *s )   
   {   
    __m512i   
    zero = _mm512_setzero_si512(),   
    oneMask = _mm512_set1_epi8( (char)0x80 ),   
    oneHead = zero,   
    twoMask = _mm512_set1_epi8( (char)0xE0 ),   
    twoHead = _mm512_set1_epi8( (char)0xC0 ),   
    threeMask = _mm512_set1_epi8( (char)0xF0 ),   
    threeHead = _mm512_set1_epi8( (char)0xE0 ),   
    fourMask = _mm512_set1_epi8( (char)0xF8 ),   
    fourHead = _mm512_set1_epi8( (char)0xF0 );   
    uintptr_t   
    up = (uintptr_t)s,   
    base = up & ~(uintptr_t)63;   
    unsigned skip = (unsigned)(up - base);   
    s = (char *)base;   
    size_t count = 0;   
    size_t i = 0;   
    uint64_t nzMatches;   
    do   
    {   
    __m512i chunk = _mm512_loadu_si512( (void *)s );   
    nzMatches = ~(_mm512_cmpeq_epi8_mask( chunk, zero ) >> skip);   
    nzMatches = nzMatches != -1 ? (1ull << countr_one( nzMatches ))   
   - 1 : -1;   
    uint64_t   
    one = _mm512_cmpeq_epi8_mask( _mm512_and_si512( chunk,   
   oneMask ), oneHead ) >> skip & nzMatches,   
    two = _mm512_cmpeq_epi8_mask( _mm512_and_si512( chunk,   
   twoMask ), twoHead ) >> skip & nzMatches,   
    three = _mm512_cmpeq_epi8_mask( _mm512_and_si512( chunk,   
   threeMask ), threeHead ) >> skip & nzMatches,   
    four = _mm512_cmpeq_epi8_mask( _mm512_and_si512( chunk,   
   fourMask ), fourHead ) >> skip & nzMatches;   
    count += _mm_popcnt_u64( one ) + _mm_popcnt_u64( two ) +   
   _mm_popcnt_u64( three ) + _mm_popcnt_u64( four );   
    skip = 0;   
    } while( nzMatches == -1 );   
    return count;   
   }   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   
|
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca