// 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_lp64) #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_lp64)