home bbs files messages ]

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