1313/* Masks selecting the bits that are set in a C 'size_t' holding several
1414 characters when at least one of them is wider than ASCII, UCS1 or UCS2. */
1515#if STRINGLIB_SIZEOF_CHAR == 1
16- # if SIZEOF_SIZE_T == 8
17- # define MASK_ASCII 0x8080808080808080ULL
18- # elif SIZEOF_SIZE_T == 4
19- # define MASK_ASCII 0x80808080U
20- # else
21- # error C 'size_t' size should be either 4 or 8!
22- # endif
23- # define MASK_MAX_CHAR MASK_ASCII
24- # define MAX_CHAR MAX_CHAR_UCS1
16+ # if SIZEOF_SIZE_T == 8
17+ # define MASK_ASCII 0x8080808080808080ULL
18+ # elif SIZEOF_SIZE_T == 4
19+ # define MASK_ASCII 0x80808080U
20+ # else
21+ # error C 'size_t' size should be either 4 or 8!
22+ # endif
23+ # define MASK_MAX_CHAR MASK_ASCII
24+ # define MAX_CHAR MAX_CHAR_UCS1
2525#elif STRINGLIB_SIZEOF_CHAR == 2
26- # if SIZEOF_SIZE_T == 8
27- # define MASK_ASCII 0xFF80FF80FF80FF80ULL
28- # define MASK_UCS1 0xFF00FF00FF00FF00ULL
29- # elif SIZEOF_SIZE_T == 4
30- # define MASK_ASCII 0xFF80FF80U
31- # define MASK_UCS1 0xFF00FF00U
32- # else
33- # error C 'size_t' size should be either 4 or 8!
34- # endif
35- # define MASK_MAX_CHAR MASK_UCS1
36- # define MAX_CHAR MAX_CHAR_UCS2
26+ # if SIZEOF_SIZE_T == 8
27+ # define MASK_ASCII 0xFF80FF80FF80FF80ULL
28+ # define MASK_UCS1 0xFF00FF00FF00FF00ULL
29+ # elif SIZEOF_SIZE_T == 4
30+ # define MASK_ASCII 0xFF80FF80U
31+ # define MASK_UCS1 0xFF00FF00U
32+ # else
33+ # error C 'size_t' size should be either 4 or 8!
34+ # endif
35+ # define MASK_MAX_CHAR MASK_UCS1
36+ # define MAX_CHAR MAX_CHAR_UCS2
3737#elif STRINGLIB_SIZEOF_CHAR == 4
38- # if SIZEOF_SIZE_T == 8
39- # define MASK_ASCII 0xFFFFFF80FFFFFF80ULL
40- # define MASK_UCS1 0xFFFFFF00FFFFFF00ULL
41- # define MASK_UCS2 0xFFFF0000FFFF0000ULL
42- # elif SIZEOF_SIZE_T == 4
43- # define MASK_ASCII 0xFFFFFF80U
44- # define MASK_UCS1 0xFFFFFF00U
45- # define MASK_UCS2 0xFFFF0000U
46- # else
47- # error C 'size_t' size should be either 4 or 8!
48- # endif
49- # define MASK_MAX_CHAR MASK_UCS2
50- # define MAX_CHAR MAX_CHAR_UCS4
38+ # if SIZEOF_SIZE_T == 8
39+ # define MASK_ASCII 0xFFFFFF80FFFFFF80ULL
40+ # define MASK_UCS1 0xFFFFFF00FFFFFF00ULL
41+ # define MASK_UCS2 0xFFFF0000FFFF0000ULL
42+ # elif SIZEOF_SIZE_T == 4
43+ # define MASK_ASCII 0xFFFFFF80U
44+ # define MASK_UCS1 0xFFFFFF00U
45+ # define MASK_UCS2 0xFFFF0000U
46+ # else
47+ # error C 'size_t' size should be either 4 or 8!
48+ # endif
49+ # define MASK_MAX_CHAR MASK_UCS2
50+ # define MAX_CHAR MAX_CHAR_UCS4
5151#else
52- #error Invalid STRINGLIB_SIZEOF_CHAR (must be 1, 2 or 4)
52+ # error Invalid STRINGLIB_SIZEOF_CHAR (must be 1, 2 or 4)
5353#endif
5454
5555/* OR all characters into a single size_t accumulator and test the high bits
@@ -70,15 +70,15 @@ STRINGLIB(find_max_char)(const STRINGLIB_CHAR *begin, const STRINGLIB_CHAR *end)
7070 one register when the compiler does not vectorize it. */
7171 size_t v0 = 0 , v1 = 0 , v2 = 0 , v3 = 0 ;
7272 for (int i = 0 ; i < 16 * SIZEOF_SIZE_T ; i += 4 * SIZEOF_SIZE_T ) {
73- size_t a , b , c , d ;
74- memcpy (& a , p + i , SIZEOF_SIZE_T );
75- memcpy (& b , p + i + SIZEOF_SIZE_T , SIZEOF_SIZE_T );
76- memcpy (& c , p + i + 2 * SIZEOF_SIZE_T , SIZEOF_SIZE_T );
77- memcpy (& d , p + i + 3 * SIZEOF_SIZE_T , SIZEOF_SIZE_T );
78- v0 |= a ;
79- v1 |= b ;
80- v2 |= c ;
81- v3 |= d ;
73+ size_t w0 , w1 , w2 , w3 ;
74+ memcpy (& w0 , p + i , SIZEOF_SIZE_T );
75+ memcpy (& w1 , p + i + SIZEOF_SIZE_T , SIZEOF_SIZE_T );
76+ memcpy (& w2 , p + i + 2 * SIZEOF_SIZE_T , SIZEOF_SIZE_T );
77+ memcpy (& w3 , p + i + 3 * SIZEOF_SIZE_T , SIZEOF_SIZE_T );
78+ v0 |= w0 ;
79+ v1 |= w1 ;
80+ v2 |= w2 ;
81+ v3 |= w3 ;
8282 }
8383 value |= v0 | v1 | v2 | v3 ;
8484 if (value & MASK_MAX_CHAR ) {
0 commit comments