106 lines
2.0 KiB
ArmAsm
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
|