#include #include #define aliases __attribute__((__may_alias__)) int memcmp(const void *_l, const void *_r, size_t n) { const unsigned char *l = _l, *r = _r; const size_t aliases *wl, aliases *wr; if (n < sizeof(size_t) * 3 || ((uintptr_t)l | (uintptr_t)r) & sizeof(size_t) - 1) goto bytewise; for (; (uintptr_t)l & sizeof(size_t) - 1 && *l == *r; l++, r++, n--); if ((uintptr_t)l & sizeof(size_t) -1) return *l - *r; wl = (const void *)l; wr = (const void *)r; for (; n >= sizeof(size_t) && *wl == *wr ; wl++, wr++, n -= sizeof(size_t)); l = (const void *)wl; r = (const void *)wr; bytewise: for (; n && *l == *r; l++, r++, n--); return n ? *l - *r : 0; }