| // Copyright 2022 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(__loongarch__) && _LOONGARCH_SIM == _ABILP64 |
| |
| #define MARL_BUILD_ASM 1 |
| #include "osfiber_asm_loongarch64.h" |
| |
| // void marl_fiber_swap(marl_fiber_context* from, const marl_fiber_context* to) |
| // a0: from |
| // a1: to |
| .text |
| .global marl_fiber_swap |
| .align 4 |
| marl_fiber_swap: |
| |
| // Save context 'from' |
| |
| // Store callee-preserved registers |
| st.d $s0, $a0, MARL_REG_s0 |
| st.d $s1, $a0, MARL_REG_s1 |
| st.d $s2, $a0, MARL_REG_s2 |
| st.d $s3, $a0, MARL_REG_s3 |
| st.d $s4, $a0, MARL_REG_s4 |
| st.d $s5, $a0, MARL_REG_s5 |
| st.d $s6, $a0, MARL_REG_s6 |
| st.d $s7, $a0, MARL_REG_s7 |
| st.d $s8, $a0, MARL_REG_s8 |
| |
| fst.d $fs0, $a0, MARL_REG_fs0 |
| fst.d $fs1, $a0, MARL_REG_fs1 |
| fst.d $fs2, $a0, MARL_REG_fs2 |
| fst.d $fs3, $a0, MARL_REG_fs3 |
| fst.d $fs4, $a0, MARL_REG_fs4 |
| fst.d $fs5, $a0, MARL_REG_fs5 |
| fst.d $fs6, $a0, MARL_REG_fs6 |
| fst.d $fs7, $a0, MARL_REG_fs7 |
| |
| st.d $ra, $a0, MARL_REG_ra |
| st.d $sp, $a0, MARL_REG_sp |
| st.d $fp, $a0, MARL_REG_fp |
| |
| // Recover callee-preserved registers |
| ld.d $s0, $a1, MARL_REG_s0 |
| ld.d $s1, $a1, MARL_REG_s1 |
| ld.d $s2, $a1, MARL_REG_s2 |
| ld.d $s3, $a1, MARL_REG_s3 |
| ld.d $s4, $a1, MARL_REG_s4 |
| ld.d $s5, $a1, MARL_REG_s5 |
| ld.d $s6, $a1, MARL_REG_s6 |
| ld.d $s7, $a1, MARL_REG_s7 |
| ld.d $s8, $a1, MARL_REG_s8 |
| |
| fld.d $fs0, $a1, MARL_REG_fs0 |
| fld.d $fs1, $a1, MARL_REG_fs1 |
| fld.d $fs2, $a1, MARL_REG_fs2 |
| fld.d $fs3, $a1, MARL_REG_fs3 |
| fld.d $fs4, $a1, MARL_REG_fs4 |
| fld.d $fs5, $a1, MARL_REG_fs5 |
| fld.d $fs6, $a1, MARL_REG_fs6 |
| fld.d $fs7, $a1, MARL_REG_fs7 |
| |
| ld.d $ra, $a1, MARL_REG_ra |
| ld.d $sp, $a1, MARL_REG_sp |
| ld.d $fp, $a1, MARL_REG_fp |
| |
| // Recover arguments |
| ld.d $a0, $a1, MARL_REG_a0 |
| ld.d $a1, $a1, MARL_REG_a1 |
| |
| jr $ra // Jump to the trampoline |
| |
| #endif // defined(__loongarch__) && _LOONGARCH_SIM == _ABILP64 |