#include int memcmp(const void* s1, const void* s2, size_t n) { const unsigned char* c1 = s1; const unsigned char* c2 = s2; int d = 0; while (n--) { d = (int)*c1++ - (int)*c2++; if (d) break; } return d; } void* memmove(void* dst, const void* src, size_t n) { const char* p = src; char* q = dst; #if defined(__i386__) || defined(__x86_64__) if (q < p) { __asm__ volatile("cld; rep; movsb" : "+c"(n), "+S"(p), "+D"(q)); } else { p += (n - 1); q += (n - 1); __asm__ volatile("std; rep; movsb; cld" : "+c"(n), "+S"(p), "+D"(q)); } #else if (q < p) { while (n--) { *q++ = *p++; } } else { p += n; q += n; while (n--) { *--q = *--p; } } #endif return dst; } void* memcpy(void* dst, const void* src, size_t n) { const char* p = src; char* q = dst; #if defined(__i386__) size_t nl = n >> 2; __asm__ volatile("cld ; rep ; movsl ; movl %3,%0 ; rep ; movsb" : "+c"(nl), "+S"(p), "+D"(q) : "r"(n & 3)); #elif defined(__x86_64__) size_t nq = n >> 3; __asm__ volatile("cld ; rep ; movsq ; movl %3,%%ecx ; rep ; movsb" : "+c"(nq), "+S"(p), "+D"(q) : "r"((uint32_t)(n & 7))); #else while (n--) { *q++ = *p++; } #endif return dst; } void* memset(void* dst, int c, size_t n) { char* q = dst; #if defined(__i386__) size_t nl = n >> 2; __asm__ volatile("cld ; rep ; stosl ; movl %3,%0 ; rep ; stosb" : "+c"(nl), "+D"(q) : "a"((unsigned char)c * 0x01010101U), "r"(n & 3)); #elif defined(__x86_64__) size_t nq = n >> 3; __asm__ volatile("cld ; rep ; stosq ; movl %3,%%ecx ; rep ; stosb" : "+c"(nq), "+D"(q) : "a"((unsigned char)c * 0x0101010101010101U), "r"((uint32_t)n & 7)); #else while (n--) { *q++ = c; } #endif return dst; } size_t strlen(const char* s) { const char* ss = s; while (*ss) ss++; return ss - s; } int strcmp(const char* s1, const char* s2) { const unsigned char* c1 = (const unsigned char*)s1; const unsigned char* c2 = (const unsigned char*)s2; unsigned char ch; int d = 0; while (1) { d = (int)(ch = *c1++) - (int)*c2++; if (d || !ch) break; } return d; }