cutil/arch/x86_64.S
2022-05-15 23:13:42 +03:00

156 lines
2 KiB
ArmAsm

.globl hw_bswap16
.globl hw_bswap32
.globl hw_bswap64
.globl _cu_memcpy
.globl _cu_memmove
.globl _cu_memset
.globl cu_memzero
.globl cu_memtest
.globl cu_va_start
.globl cu_va_arg
.text
hw_bswap16:
mov %edi, %eax
xchg %al, %ah
ret
hw_bswap32:
mov %edi, %eax
bswap %eax
ret
hw_bswap64:
mov %rdi, %rax
bswap %rax
ret
_cu_memcpy:
// RDI - dst, RSI - src, RDX - size
mov %rdx, %rcx
shr $3, %rcx
je .cpy1
rep movsq
.cpy1:
mov %rdx, %rcx
and $7, %rcx
rep movsb
ret
_cu_memmove:
// RDI - dst, RSI - src, RDX - size
cmp %rsi, %rdi
je .retmove
jl .lessmove
.greatermove: // dst > src
add %rdx, %rdi
add %rdx, %rsi
std
dec %rdi
dec %rsi
mov %rdx, %rcx
rep movsb
cld
jmp .retmove
.lessmove: // dst < src
mov %rdx, %rcx
rep movsb
.retmove:
ret
_cu_memset:
// RDI - ptr, RSI - val, RDX - size
mov %rdx, %rax
mov %rsi, %rcx
shr $3, %rcx
je .set1
rep stosq
.set1:
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
mov %rdi, %rcx
shr $3, %rcx
je .skipq
.testq:
lodsq
test %rax, %rax
jnz .testfail
loop .testq
.skipq:
mov %rdi, %rcx
and $7, %rcx
je .testok
.testb:
lodsb
test %al, %al
jnz .testfail
loop .testb
.testok:
xor %rax, %rax
ret
.testfail:
mov %rsi, %rax
ret
cu_va_start:
// RDI - va
mov %rsp, %rax
mov %rdi, %rsp
add $0x30, %rsp
push %r9
push %r8
push %rcx
push %rdx
push %rsi
push %rdi
mov %rax, %rsp
ret
cu_va_arg:
// RDI - va, RSI - index
push %rbx
mov %rsi, %rbx
shl $3, %rbx
cmp $6, %rsi
jge .va_stack
mov (%rbx,%rdi),%rax
pop %rbx
ret
.va_stack:
sub $0x30, %rbx
add $0x10, %rbx
mov (%rbx,%rbp),%rax
pop %rbx
ret