1 | // Copyright 2020 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(__mips__) && _MIPS_SIM == _ABI64 |
16 | |
17 | #define MARL_BUILD_ASM 1 |
18 | #include "osfiber_asm_mips64.h" |
19 | |
20 | // void marl_fiber_swap(marl_fiber_context* from, const marl_fiber_context* to) |
21 | // a0: from |
22 | // v0: to |
23 | .text |
24 | .global MARL_ASM_SYMBOL(marl_fiber_swap) |
25 | .align 4 |
26 | MARL_ASM_SYMBOL(marl_fiber_swap): |
27 | |
28 | // Save context 'from' |
29 | |
30 | // Store callee-preserved registers |
31 | sd $s0, MARL_REG_s0($a0) |
32 | sd $s1, MARL_REG_s1($a0) |
33 | sd $s2, MARL_REG_s2($a0) |
34 | sd $s3, MARL_REG_s3($a0) |
35 | sd $s4, MARL_REG_s4($a0) |
36 | sd $s5, MARL_REG_s5($a0) |
37 | sd $s6, MARL_REG_s6($a0) |
38 | sd $s7, MARL_REG_s7($a0) |
39 | |
40 | s.d $f24, MARL_REG_f24($a0) |
41 | s.d $f25, MARL_REG_f25($a0) |
42 | s.d $f26, MARL_REG_f26($a0) |
43 | s.d $f27, MARL_REG_f27($a0) |
44 | s.d $f28, MARL_REG_f28($a0) |
45 | s.d $f29, MARL_REG_f29($a0) |
46 | s.d $f31, MARL_REG_f30($a0) |
47 | s.d $f31, MARL_REG_f31($a0) |
48 | |
49 | sd $gp, MARL_REG_gp($a0) |
50 | sd $sp, MARL_REG_sp($a0) |
51 | sd $fp, MARL_REG_fp($a0) |
52 | sd $ra, MARL_REG_ra($a0) |
53 | |
54 | move $v0, $a1 // Function have no return, so safe to touch v0 |
55 | |
56 | // Recover callee-preserved registers |
57 | ld $s0, MARL_REG_s0($v0) |
58 | ld $s1, MARL_REG_s1($v0) |
59 | ld $s2, MARL_REG_s2($v0) |
60 | ld $s3, MARL_REG_s3($v0) |
61 | ld $s4, MARL_REG_s4($v0) |
62 | ld $s5, MARL_REG_s5($v0) |
63 | ld $s6, MARL_REG_s6($v0) |
64 | ld $s7, MARL_REG_s7($v0) |
65 | |
66 | l.d $f24, MARL_REG_f24($v0) |
67 | l.d $f25, MARL_REG_f25($v0) |
68 | l.d $f26, MARL_REG_f26($v0) |
69 | l.d $f27, MARL_REG_f27($v0) |
70 | l.d $f28, MARL_REG_f28($v0) |
71 | l.d $f29, MARL_REG_f29($v0) |
72 | l.d $f31, MARL_REG_f30($v0) |
73 | l.d $f31, MARL_REG_f31($v0) |
74 | |
75 | ld $gp, MARL_REG_gp($v0) |
76 | ld $sp, MARL_REG_sp($v0) |
77 | ld $fp, MARL_REG_fp($v0) |
78 | ld $ra, MARL_REG_ra($v0) |
79 | |
80 | // Recover arguments |
81 | ld $a0, MARL_REG_a0($v0) |
82 | ld $a1, MARL_REG_a1($v0) |
83 | |
84 | jr $ra |
85 | |
86 | #endif // defined(__mips__) && _MIPS_SIM == _ABI64 |
87 | |