diff --git a/arch/x86_64.S b/arch/x86_64.S index d8f805e..927069c 100644 --- a/arch/x86_64.S +++ b/arch/x86_64.S @@ -3,6 +3,7 @@ .globl hw_bswap64 .globl _cu_memcpy .globl _cu_memmove +.globl _cu_memcmp .globl _cu_memset .globl cu_memzero .globl cu_memtest @@ -60,6 +61,30 @@ _cu_memmove: .retmove: ret +_cu_memcmp: + mov %rdx, %rcx + shr $3, %rcx + jz .test1 +.cmp8: + cmpsq + jnz .not_equal + loop .cmp8 +.test1: + mov %rdx, %rcx + and $7, %rcx +.cmp1: + cmpsb + jnz .not_equal + loop .cmp1 + jmp .equal +.not_equal: + xor %rax, %rax + inc %rax + ret +.equal: + xor %rax, %rax + ret + _cu_memset: // RDI - ptr, RSI - val, RDX - size mov %rdx, %rax diff --git a/cutil.c b/cutil.c index c79c133..49696ad 100644 --- a/cutil.c +++ b/cutil.c @@ -8,6 +8,7 @@ void (*cu_free)(void*) = NULL; void* (*cu_memset)(void*,int,size_t) = _cu_memset; void* (*cu_memcpy)(void*,const void*,size_t) = _cu_memcpy; void* (*cu_memmove)(void*,const void*,size_t) = _cu_memmove; +void* (*cu_memcmp)(const void*,const void*, size_t) = _cu_memcmp; #else # include # include @@ -18,6 +19,7 @@ void (*cu_free)(void*) = free; void* (*cu_memset)(void*,int,size_t) = memset; void* (*cu_memcpy)(void*,const void*,size_t) = memcpy; void* (*cu_memmove)(void*,const void*,size_t) = memmove; +void* (*cu_memcmp)(const void*,const void*, size_t) = memcmp; #endif void cutil_init() diff --git a/cutil.h b/cutil.h index 2a9ec8e..0620343 100644 --- a/cutil.h +++ b/cutil.h @@ -7,6 +7,8 @@ extern void* _cu_memset(void* dst, int val, size_t size); extern void* _cu_memcpy(void* dst, const void* src, size_t size); extern void* _cu_memmove(void* dst, const void* src, size_t size); +extern void* _cu_memcmp(const void* dst, const void* src, size_t size); + void __cu_memmove(void* dst, void* src, size_t size); extern void* (*cu_malloc)(size_t); @@ -15,6 +17,7 @@ extern void (*cu_free)(void*); extern void* (*cu_memset)(void*,int,size_t); extern void* (*cu_memcpy)(void*,const void*,size_t); extern void* (*cu_memmove)(void*,const void*,size_t); +extern void* (*cu_memcmp)(const void*,const void*, size_t); void cutil_init(); void cutil_exit();