Ben Clayton | ec288e2 | 2020-02-09 19:20:01 +0000 | [diff] [blame] | 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 |