87 lines
2.4 KiB
ArmAsm
87 lines
2.4 KiB
ArmAsm
// 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
|