zeek/auxil/spicy/3rdparty/fiber/src/fiber_asm_aarch64_apcs.S
Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

106 lines
2.0 KiB
ArmAsm

.altmacro
.arch armv8-a
.text
#include <hu/objfmt.h>
#define CONC0(a, b) a ## b
#define CONC(a, b) CONC0(a, b)
#if HU_OBJFMT_ELF_P
.macro func_entry sym
.align 4
.global \sym
.hidden \sym
.type \sym, @function
.endm
#define ENTRY(sym) sym
#define END_FUNC(sym) .size ENTRY(sym), .-ENTRY(sym)
#elif HU_OBJFMT_MACHO_P
.macro func_entry sym
.align 4
.global \sym
.endm
#define ENTRY(sym) CONC(_, sym)
#define END_FUNC(sym)
#else
#error "HU_OBJFMT_*_P neither ELF nor MACHO"
#endif
#define FUNC(sym) func_entry ENTRY(sym)
.macro check_stack_alignment_nomove reg
#ifdef FIBER_ASM_CHECK_ALIGNMENT
tst \reg, 0xF
bne align_check_failed
#endif
.endm
.macro check_stack_alignment_move reg
#ifdef FIBER_ASM_CHECK_ALIGNMENT
mov \reg, sp
check_stack_alignment_nomove \reg
#endif
.endm
FUNC(fiber_asm_switch)
ENTRY(fiber_asm_switch):
mov x3, sp
str x3, [x0], 8
ldr x3, [x1], 8
mov sp, x3
check_stack_alignment_nomove x3
stp x30, x29, [x0], 16
ldp x30, x29, [x1], 16
stp x19, x20, [x0], 16
ldp x19, x20, [x1], 16
stp x21, x22, [x0], 16
ldp x21, x22, [x1], 16
stp x23, x24, [x0], 16
ldp x23, x24, [x1], 16
stp x25, x26, [x0], 16
ldp x25, x26, [x1], 16
stp x27, x28, [x0], 16
ldp x27, x28, [x1], 16
stp d8, d9, [x0], 16
ldp d8, d9, [x1], 16
stp d10, d11, [x0], 16
ldp d10, d11, [x1], 16
stp d12, d13, [x0], 16
ldp d12, d13, [x1], 16
stp d14, d15, [x0]
ldp d14, d15, [x1]
ret
END_FUNC(fiber_asm_switch)
FUNC(fiber_asm_invoke)
ENTRY(fiber_asm_invoke):
ldp x0, x1, [sp], 16
check_stack_alignment_move x3
blr x1
ldp x3, lr, [sp]
mov sp, x3
check_stack_alignment_nomove x3
ret
END_FUNC(fiber_asm_invoke)
FUNC(fiber_asm_exec_on_stack)
ENTRY(fiber_asm_exec_on_stack):
mov x3, sp
stp x3, lr, [x2, #-16]!
mov sp, x2
check_stack_alignment_nomove x2
blr x1
ldp x3, lr, [sp]
mov sp, x3
ret
END_FUNC(fiber_asm_exec_on_stack)
#ifdef FIBER_ASM_CHECK_ALIGNMENT
align_check_failed:
b ENTRY(fiber_align_check_failed)
#endif