| // Copyright 2020 The Marl Authors. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #if defined(__mips__) && _MIPS_SIM == _ABI64 |
| |
| #define MARL_BUILD_ASM 1 |
| #include "osfiber_asm_mips64.h" |
| |
| // void marl_fiber_swap(marl_fiber_context* from, const marl_fiber_context* to) |
| // a0: from |
| // v0: to |
| .text |
| .global MARL_ASM_SYMBOL(marl_fiber_swap) |
| .align 4 |
| MARL_ASM_SYMBOL(marl_fiber_swap): |
| |
| // Save context 'from' |
| |
| // Store callee-preserved registers |
| sd $s0, MARL_REG_s0($a0) |
| sd $s1, MARL_REG_s1($a0) |
| sd $s2, MARL_REG_s2($a0) |
| sd $s3, MARL_REG_s3($a0) |
| sd $s4, MARL_REG_s4($a0) |
| sd $s5, MARL_REG_s5($a0) |
| sd $s6, MARL_REG_s6($a0) |
| sd $s7, MARL_REG_s7($a0) |
| |
| s.d $f24, MARL_REG_f24($a0) |
| s.d $f25, MARL_REG_f25($a0) |
| s.d $f26, MARL_REG_f26($a0) |
| s.d $f27, MARL_REG_f27($a0) |
| s.d $f28, MARL_REG_f28($a0) |
| s.d $f29, MARL_REG_f29($a0) |
| s.d $f31, MARL_REG_f30($a0) |
| s.d $f31, MARL_REG_f31($a0) |
| |
| sd $gp, MARL_REG_gp($a0) |
| sd $sp, MARL_REG_sp($a0) |
| sd $fp, MARL_REG_fp($a0) |
| sd $ra, MARL_REG_ra($a0) |
| |
| move $v0, $a1 // Function have no return, so safe to touch v0 |
| |
| // Recover callee-preserved registers |
| ld $s0, MARL_REG_s0($v0) |
| ld $s1, MARL_REG_s1($v0) |
| ld $s2, MARL_REG_s2($v0) |
| ld $s3, MARL_REG_s3($v0) |
| ld $s4, MARL_REG_s4($v0) |
| ld $s5, MARL_REG_s5($v0) |
| ld $s6, MARL_REG_s6($v0) |
| ld $s7, MARL_REG_s7($v0) |
| |
| l.d $f24, MARL_REG_f24($v0) |
| l.d $f25, MARL_REG_f25($v0) |
| l.d $f26, MARL_REG_f26($v0) |
| l.d $f27, MARL_REG_f27($v0) |
| l.d $f28, MARL_REG_f28($v0) |
| l.d $f29, MARL_REG_f29($v0) |
| l.d $f31, MARL_REG_f30($v0) |
| l.d $f31, MARL_REG_f31($v0) |
| |
| ld $gp, MARL_REG_gp($v0) |
| ld $sp, MARL_REG_sp($v0) |
| ld $fp, MARL_REG_fp($v0) |
| ld $ra, MARL_REG_ra($v0) |
| |
| // Recover arguments |
| ld $a0, MARL_REG_a0($v0) |
| ld $a1, MARL_REG_a1($v0) |
| |
| jr $ra |
| |
| #endif // defined(__mips__) && _MIPS_SIM == _ABI64 |