#------------------------------------------------------------------------------ | |
# | |
# Set/Long jump for LoongArch | |
# | |
# Copyright (c) 2022, Loongson Technology Corporation Limited. All rights reserved.<BR> | |
# | |
# SPDX-License-Identifier: BSD-2-Clause-Patent | |
# | |
#------------------------------------------------------------------------------ | |
#define STORE st.d /* 64 bit mode regsave instruction */ | |
#define LOAD ld.d /* 64 bit mode regload instruction */ | |
#define RSIZE 8 /* 64 bit mode register size */ | |
ASM_GLOBAL ASM_PFX(SetJump) | |
ASM_GLOBAL ASM_PFX(InternalLongJump) | |
ASM_PFX(SetJump): | |
STORE $s0, $a0, RSIZE * 0 | |
STORE $s1, $a0, RSIZE * 1 | |
STORE $s2, $a0, RSIZE * 2 | |
STORE $s3, $a0, RSIZE * 3 | |
STORE $s4, $a0, RSIZE * 4 | |
STORE $s5, $a0, RSIZE * 5 | |
STORE $s6, $a0, RSIZE * 6 | |
STORE $s7, $a0, RSIZE * 7 | |
STORE $s8, $a0, RSIZE * 8 | |
STORE $sp, $a0, RSIZE * 9 | |
STORE $fp, $a0, RSIZE * 10 | |
STORE $ra, $a0, RSIZE * 11 | |
li.w $a0, 0 # Setjmp return | |
jirl $zero, $ra, 0 | |
ASM_PFX(InternalLongJump): | |
LOAD $ra, $a0, RSIZE * 11 | |
LOAD $s0, $a0, RSIZE * 0 | |
LOAD $s1, $a0, RSIZE * 1 | |
LOAD $s2, $a0, RSIZE * 2 | |
LOAD $s3, $a0, RSIZE * 3 | |
LOAD $s4, $a0, RSIZE * 4 | |
LOAD $s5, $a0, RSIZE * 5 | |
LOAD $s6, $a0, RSIZE * 6 | |
LOAD $s7, $a0, RSIZE * 7 | |
LOAD $s8, $a0, RSIZE * 8 | |
LOAD $sp, $a0, RSIZE * 9 | |
LOAD $fp, $a0, RSIZE * 10 | |
move $a0, $a1 | |
jirl $zero, $ra, 0 | |
.end |