1+ #include <limits.h>
2+ #include <stddef.h>
3+ #include <stdint.h>
4+
5+ #if defined(__wasm_bulk_memory__ )
6+ #define memset __builtin_memset
7+ #define memcpy __builtin_memcpy
8+ #define memmove __builtin_memmove
9+ #endif
10+
11+ #define ONES (~(uintmax_t)(0) / UCHAR_MAX)
12+ #define HIGHS (ONES * (UCHAR_MAX / 2 + 1))
13+ #define HASZERO (x ) ((x) - (typeof(x))(ONES) & ~(x) & (typeof(x))(HIGHS))
14+ #define UNALIGNED (x ) ((uintptr_t)(x) & (sizeof(*x) - 1))
15+
16+ int memcmp (const void * v1 , const void * v2 , size_t n ) {
17+ typedef uint64_t __attribute__ ( (__may_alias__ )) word ;
18+
19+ const word * w1 = v1 ;
20+ const word * w2 = v2 ;
21+ if (!(UNALIGNED (w1 ) | UNALIGNED (w2 ))) {
22+ while (n >= sizeof (word ) && * w1 == * w2 ) {
23+ n -= sizeof (word );
24+ w1 ++ ;
25+ w2 ++ ;
26+ }
27+ }
28+
29+ const unsigned char * u1 = (const void * )w1 ;
30+ const unsigned char * u2 = (const void * )w2 ;
31+ while (n -- ) {
32+ if (* u1 != * u2 ) return * u1 - * u2 ;
33+ u1 ++ ;
34+ u2 ++ ;
35+ }
36+ return 0 ;
37+ }
38+
39+ int strcmp (const char * c1 , const char * c2 ) {
40+ typedef uintptr_t __attribute__ ( (__may_alias__ )) word ;
41+
42+ const word * w1 = (const void * )c1 ;
43+ const word * w2 = (const void * )c2 ;
44+ if (!(UNALIGNED (w1 ) | UNALIGNED (w2 ))) {
45+ while (* w1 == * w2 ) {
46+ if (HASZERO (* w1 )) return 0 ;
47+ w1 ++ ;
48+ w2 ++ ;
49+ }
50+ c1 = (const void * )w1 ;
51+ c2 = (const void * )w2 ;
52+ }
53+
54+ while (* c1 == * c2 && * c1 ) {
55+ c1 ++ ;
56+ c2 ++ ;
57+ }
58+ return * (unsigned char * )c1 - * (unsigned char * )c2 ;
59+ }
60+
61+ int strncmp (const char * c1 , const char * c2 , size_t n ) {
62+ typedef uintptr_t __attribute__ ( (__may_alias__ )) word ;
63+
64+ const word * w1 = (const void * )c1 ;
65+ const word * w2 = (const void * )c2 ;
66+ if (!(UNALIGNED (w1 ) | UNALIGNED (w2 ))) {
67+ while (n >= sizeof (word ) && * w1 == * w2 ) {
68+ if ((n -= sizeof (word )) == 0 || HASZERO (* w1 )) return 0 ;
69+ w1 ++ ;
70+ w2 ++ ;
71+ }
72+ c1 = (const void * )w1 ;
73+ c2 = (const void * )w2 ;
74+ }
75+
76+ while (n -- && * c1 == * c2 ) {
77+ if (n == 0 || * c1 == 0 ) return 0 ;
78+ c1 ++ ;
79+ c2 ++ ;
80+ }
81+ return * (unsigned char * )c1 - * (unsigned char * )c2 ;
82+ }
83+
84+ #undef UNALIGNED
85+ #undef HASZERO
86+ #undef HIGHS
87+ #undef ONES
0 commit comments