// Copyright 2019 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(__aarch64__) #define MARL_BUILD_ASM 1 #include "osfiber_asm_aarch64.h" // void marl_fiber_swap(marl_fiber_context* from, const marl_fiber_context* to) // x0: from // x1: to .text .global MARL_ASM_SYMBOL(marl_fiber_swap) .align 4 MARL_ASM_SYMBOL(marl_fiber_swap): // Save context 'from' // TODO: pairs of str can be combined with stp. // Store special purpose registers str x16, [x0, #MARL_REG_r16] str x17, [x0, #MARL_REG_r17] str x18, [x0, #MARL_REG_r18] // Store callee-preserved registers str x19, [x0, #MARL_REG_r19] str x20, [x0, #MARL_REG_r20] str x21, [x0, #MARL_REG_r21] str x22, [x0, #MARL_REG_r22] str x23, [x0, #MARL_REG_r23] str x24, [x0, #MARL_REG_r24] str x25, [x0, #MARL_REG_r25] str x26, [x0, #MARL_REG_r26] str x27, [x0, #MARL_REG_r27] str x28, [x0, #MARL_REG_r28] str x29, [x0, #MARL_REG_r29] str d8, [x0, #MARL_REG_v8] str d9, [x0, #MARL_REG_v9] str d10, [x0, #MARL_REG_v10] str d11, [x0, #MARL_REG_v11] str d12, [x0, #MARL_REG_v12] str d13, [x0, #MARL_REG_v13] str d14, [x0, #MARL_REG_v14] str d15, [x0, #MARL_REG_v15] // Store sp and lr mov x2, sp str x2, [x0, #MARL_REG_SP] str x30, [x0, #MARL_REG_LR] // Load context 'to' mov x7, x1 // Load special purpose registers ldr x16, [x7, #MARL_REG_r16] ldr x17, [x7, #MARL_REG_r17] ldr x18, [x7, #MARL_REG_r18] // Load callee-preserved registers ldr x19, [x7, #MARL_REG_r19] ldr x20, [x7, #MARL_REG_r20] ldr x21, [x7, #MARL_REG_r21] ldr x22, [x7, #MARL_REG_r22] ldr x23, [x7, #MARL_REG_r23] ldr x24, [x7, #MARL_REG_r24] ldr x25, [x7, #MARL_REG_r25] ldr x26, [x7, #MARL_REG_r26] ldr x27, [x7, #MARL_REG_r27] ldr x28, [x7, #MARL_REG_r28] ldr x29, [x7, #MARL_REG_r29] ldr d8, [x7, #MARL_REG_v8] ldr d9, [x7, #MARL_REG_v9] ldr d10, [x7, #MARL_REG_v10] ldr d11, [x7, #MARL_REG_v11] ldr d12, [x7, #MARL_REG_v12] ldr d13, [x7, #MARL_REG_v13] ldr d14, [x7, #MARL_REG_v14] ldr d15, [x7, #MARL_REG_v15] // Load parameter registers ldr x0, [x7, #MARL_REG_r0] ldr x1, [x7, #MARL_REG_r1] // Load sp and lr ldr x30, [x7, #MARL_REG_LR] ldr x2, [x7, #MARL_REG_SP] mov sp, x2 ret #endif // defined(__aarch64__)