ruby/coroutine/loongarch64/Context.S
小MAO钓鱼 65ef20d2a7
Add support for LoongArch (#7343)
* vm_dump.c: Dump machine registers on loongarch64 Linux.

* coroutines: Support for native loongarch64 coroutines.

---------

Co-authored-by: zangruochen <zangruochen@loongson.cn>
2023-02-22 13:11:33 +09:00

73 lines
1.5 KiB
ArmAsm

#define TOKEN_PASTE(x,y) x##y
#define PREFIXED_SYMBOL(prefix,name) TOKEN_PASTE(prefix,name)
.text
.align 2
.global PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer)
PREFIXED_SYMBOL(SYMBOL_PREFIX,coroutine_transfer):
# Make space on the stack for caller registers
addi.d $sp, $sp, -0xa0
# Save caller registers
st.d $s0, $sp, 0x00
st.d $s1, $sp, 0x08
st.d $s2, $sp, 0x10
st.d $s3, $sp, 0x18
st.d $s4, $sp, 0x20
st.d $s5, $sp, 0x28
st.d $s6, $sp, 0x30
st.d $s7, $sp, 0x38
st.d $s8, $sp, 0x40
st.d $fp, $sp, 0x48
fst.d $fs0, $sp, 0x50
fst.d $fs1, $sp, 0x58
fst.d $fs2, $sp, 0x60
fst.d $fs3, $sp, 0x68
fst.d $fs4, $sp, 0x70
fst.d $fs5, $sp, 0x78
fst.d $fs6, $sp, 0x80
fst.d $fs7, $sp, 0x88
# Save return address
st.d $ra, $sp, 0x90
# Save stack pointer to a0 (first argument)
st.d $sp, $a0, 0x00
# Load stack pointer from a1 (second argument)
ld.d $sp, $a1, 0x00
# Restore caller registers
ld.d $s0, $sp, 0x00
ld.d $s1, $sp, 0x08
ld.d $s2, $sp, 0x10
ld.d $s3, $sp, 0x18
ld.d $s4, $sp, 0x20
ld.d $s5, $sp, 0x28
ld.d $s6, $sp, 0x30
ld.d $s7, $sp, 0x38
ld.d $s8, $sp, 0x40
ld.d $fp, $sp, 0x48
fld.d $fs0, $sp, 0x50
fld.d $fs1, $sp, 0x58
fld.d $fs2, $sp, 0x60
fld.d $fs3, $sp, 0x68
fld.d $fs4, $sp, 0x70
fld.d $fs5, $sp, 0x78
fld.d $fs6, $sp, 0x80
fld.d $fs7, $sp, 0x88
# Load return address
ld.d $ra, $sp, 0x90
# Pop stack frame
addi.d $sp, $sp, 0xa0
# Jump to return address
jr $ra
#if defined(__linux__) && defined(__ELF__)
.section .note.GNU-stack,"",%progbits
#endif