blob: fa3456ccf30c7fa8c0687164fca1df3b3f14fe2e [file] [log] [blame]
// Copyright 2019 The SwiftShader Authors. All Rights Reserved.
//
// 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
//
// http://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.
#define YARN_REG_r0 0x00
#define YARN_REG_r1 0x08
#define YARN_REG_r16 0x10
#define YARN_REG_r17 0x18
#define YARN_REG_r18 0x20
#define YARN_REG_r19 0x28
#define YARN_REG_r20 0x30
#define YARN_REG_r21 0x38
#define YARN_REG_r22 0x40
#define YARN_REG_r23 0x48
#define YARN_REG_r24 0x50
#define YARN_REG_r25 0x58
#define YARN_REG_r26 0x60
#define YARN_REG_r27 0x68
#define YARN_REG_r28 0x70
#define YARN_REG_v8 0x78
#define YARN_REG_v9 0x80
#define YARN_REG_v10 0x88
#define YARN_REG_v11 0x90
#define YARN_REG_v12 0x98
#define YARN_REG_v13 0xa0
#define YARN_REG_v14 0xa8
#define YARN_REG_v15 0xb0
#define YARN_REG_SP 0xb8
#define YARN_REG_LR 0xc0
#if defined(__APPLE__)
#define YARN_ASM_SYMBOL(x) _##x
#else
#define YARN_ASM_SYMBOL(x) x
#endif
#ifndef YARN_BUILD_ASM
#include <stdint.h>
// Procedure Call Standard for the ARM 64-bit Architecture
// http://infocenter.arm.com/help/topic/com.arm.doc.ihi0055b/IHI0055B_aapcs64.pdf
struct yarn_fiber_context
{
// parameter registers
uintptr_t r0;
uintptr_t r1;
// special purpose registers
uintptr_t r16;
uintptr_t r17;
uintptr_t r18; // platform specific (maybe inter-procedural state)
// callee-saved registers
uintptr_t r19;
uintptr_t r20;
uintptr_t r21;
uintptr_t r22;
uintptr_t r23;
uintptr_t r24;
uintptr_t r25;
uintptr_t r26;
uintptr_t r27;
uintptr_t r28;
uintptr_t v8;
uintptr_t v9;
uintptr_t v10;
uintptr_t v11;
uintptr_t v12;
uintptr_t v13;
uintptr_t v14;
uintptr_t v15;
uintptr_t SP; // stack pointer
uintptr_t LR; // link register (R30)
};
#ifdef __cplusplus
#include <cstddef>
static_assert(offsetof(yarn_fiber_context, r0) == YARN_REG_r0, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, r1) == YARN_REG_r1, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, r16) == YARN_REG_r16, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, r17) == YARN_REG_r17, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, r18) == YARN_REG_r18, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, r19) == YARN_REG_r19, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, r20) == YARN_REG_r20, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, r21) == YARN_REG_r21, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, r22) == YARN_REG_r22, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, r23) == YARN_REG_r23, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, r24) == YARN_REG_r24, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, r25) == YARN_REG_r25, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, r26) == YARN_REG_r26, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, r27) == YARN_REG_r27, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, r28) == YARN_REG_r28, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, v8) == YARN_REG_v8, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, v9) == YARN_REG_v9, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, v10) == YARN_REG_v10, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, v11) == YARN_REG_v11, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, v12) == YARN_REG_v12, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, v13) == YARN_REG_v13, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, v14) == YARN_REG_v14, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, v15) == YARN_REG_v15, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, SP) == YARN_REG_SP, "Bad register offset");
static_assert(offsetof(yarn_fiber_context, LR) == YARN_REG_LR, "Bad register offset");
#endif // __cplusplus
#endif // YARN_BUILD_ASM