• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
26MARL_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