implement x86-64 assembly-optimized functions _cu_memcpy, _cu_memset, cu_memzero

This commit is contained in:
mykola2312 2022-05-11 19:51:24 +03:00
parent f2a1dddbca
commit 3229779aff
3 changed files with 57 additions and 0 deletions

View file

@ -1,6 +1,9 @@
.globl hw_bswap16
.globl hw_bswap32
.globl hw_bswap64
.globl _cu_memcpy
.globl _cu_memset
.globl cu_memzero
.globl cu_memtest
.text
@ -20,6 +23,45 @@ hw_bswap64:
bswap %rax
ret
_cu_memcpy:
// RDI - dst, RSI - src, RDX - size
mov %rdx, %rcx
shr $3, %rcx
rep movsq
mov %rdx, %rcx
and $7, %rcx
rep movsb
ret
_cu_memset:
// RDI - ptr, RSI - val, RDX - size
mov %rdx, %rax
mov %rsi, %rcx
shr $3, %rcx
rep stosq
mov %rsi, %rcx
and $7, %rcx
rep stosb
ret
cu_memzero:
xor %rax, %rax
mov %rsi, %rcx
shr $3, %rcx
rep stosq
mov %rsi, %rcx
and $7, %rcx
rep stosb
ret
cu_memtest:
// RDI - ptr, RSI - size
xchg %rsi, %rdi

View file

@ -4,6 +4,9 @@
#include "cutypes.h"
#include <stdlib.h>
extern void* _cu_memset(void* dst, int val, size_t size);
extern void* _cu_memcpy(void* dst, const void* src, size_t size);
#define CUTIL_MALLOC malloc
#define CUTIL_REALLOC realloc
#define CUTIL_FREE free
@ -22,5 +25,6 @@ void cutil_init();
void cutil_exit();
extern const void* cu_memtest(const void* mem, uint size);
extern void cu_memzero(void* dst, size_t size);
#endif

11
test.c
View file

@ -109,6 +109,17 @@ int main()
char val2[] = {0,0,0,1,0,0,0,0,0,0,4,0,0};
printf("val2\tcu_memtest\t%p\n", cu_memtest(val2, sizeof(val2)));
uint val3[4] = {1, 2, 3, 4};
uint val4[4];
_cu_memcpy(val4, val3, sizeof(val3));
cu_memzero(val3, sizeof(val3));
printf("cu_memzero test\t%p\n", cu_memtest(val3, sizeof(val3)));
printf("val4 values\n");
for (unsigned i = 0; i < 4; i++)
printf("\t%u\n", val4[i]);
printf("\n");
printf("[endian]\n");
printf("cutil_endian\t%u\n", cu_endian);
printf("%x\t%x\n", 0x1234, cu_bswap16(0x1234));