• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2022 The Marl Authors.
2//
3// Licensed under the Apache License. Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//      https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#if defined(__loongarch_lp64)
16
17#define MARL_BUILD_ASM 1
18#include "osfiber_asm_loongarch64.h"
19
20// void marl_fiber_swap(marl_fiber_context* from, const marl_fiber_context* to)
21// a0: from
22// a1: to
23.text
24.global marl_fiber_swap
25.align 4
26marl_fiber_swap:
27
28    // Save context 'from'
29
30    // Store callee-preserved registers
31    st.d $s0, $a0, MARL_REG_s0
32    st.d $s1, $a0, MARL_REG_s1
33    st.d $s2, $a0, MARL_REG_s2
34    st.d $s3, $a0, MARL_REG_s3
35    st.d $s4, $a0, MARL_REG_s4
36    st.d $s5, $a0, MARL_REG_s5
37    st.d $s6, $a0, MARL_REG_s6
38    st.d $s7, $a0, MARL_REG_s7
39    st.d $s8, $a0, MARL_REG_s8
40
41    fst.d $fs0, $a0, MARL_REG_fs0
42    fst.d $fs1, $a0, MARL_REG_fs1
43    fst.d $fs2, $a0, MARL_REG_fs2
44    fst.d $fs3, $a0, MARL_REG_fs3
45    fst.d $fs4, $a0, MARL_REG_fs4
46    fst.d $fs5, $a0, MARL_REG_fs5
47    fst.d $fs6, $a0, MARL_REG_fs6
48    fst.d $fs7, $a0, MARL_REG_fs7
49
50    st.d $ra, $a0, MARL_REG_ra
51    st.d $sp, $a0, MARL_REG_sp
52    st.d $fp, $a0, MARL_REG_fp
53
54    // Recover callee-preserved registers
55    ld.d $s0, $a1, MARL_REG_s0
56    ld.d $s1, $a1, MARL_REG_s1
57    ld.d $s2, $a1, MARL_REG_s2
58    ld.d $s3, $a1, MARL_REG_s3
59    ld.d $s4, $a1, MARL_REG_s4
60    ld.d $s5, $a1, MARL_REG_s5
61    ld.d $s6, $a1, MARL_REG_s6
62    ld.d $s7, $a1, MARL_REG_s7
63    ld.d $s8, $a1, MARL_REG_s8
64
65    fld.d $fs0, $a1, MARL_REG_fs0
66    fld.d $fs1, $a1, MARL_REG_fs1
67    fld.d $fs2, $a1, MARL_REG_fs2
68    fld.d $fs3, $a1, MARL_REG_fs3
69    fld.d $fs4, $a1, MARL_REG_fs4
70    fld.d $fs5, $a1, MARL_REG_fs5
71    fld.d $fs6, $a1, MARL_REG_fs6
72    fld.d $fs7, $a1, MARL_REG_fs7
73
74    ld.d $ra, $a1, MARL_REG_ra
75    ld.d $sp, $a1, MARL_REG_sp
76    ld.d $fp, $a1, MARL_REG_fp
77
78    // Recover arguments
79    ld.d $a0, $a1, MARL_REG_a0
80    ld.d $a1, $a1, MARL_REG_a1
81
82    jr $ra // Jump to the trampoline
83
84#endif // defined(__loongarch_lp64)
85