1//===-- elfnix_tlv.aarch64.s ---------------------------------------*- ASM -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file is a part of the ORC runtime support library.
10//
11//===----------------------------------------------------------------------===//
12
13// The content of this file is aarch64-only
14#if defined(__arm64__) || defined(__aarch64__)
15
16#define REGISTER_SAVE_SPACE_SIZE     32 * 24
17
18        .text
19
20  // returns address of TLV in x0, all other registers preserved
21  // TODO: add fast-path for repeat access
22  .globl ___orc_rt_elfnix_tlsdesc_resolver
23___orc_rt_elfnix_tlsdesc_resolver:
24        sub  sp,  sp, #REGISTER_SAVE_SPACE_SIZE
25        stp x29, x30, [sp, #16 * 1]
26        stp x27, x28, [sp, #16 * 2]
27        stp x25, x26, [sp, #16 * 3]
28        stp x23, x24, [sp, #16 * 4]
29        stp x21, x22, [sp, #16 * 5]
30        stp x19, x20, [sp, #16 * 6]
31        stp x17, x18, [sp, #16 * 7]
32        stp x15, x16, [sp, #16 * 8]
33        stp x13, x14, [sp, #16 * 9]
34        stp x11, x12, [sp, #16 * 10]
35        stp  x9, x10, [sp, #16 * 11]
36        stp  x7,  x8, [sp, #16 * 12]
37        stp  x5,  x6, [sp, #16 * 13]
38        stp  x3,  x4, [sp, #16 * 14]
39        stp  x1,  x2, [sp, #16 * 15]
40        stp q30, q31, [sp, #32 * 8]
41        stp q28, q29, [sp, #32 * 9]
42        stp q26, q27, [sp, #32 * 10]
43        stp q24, q25, [sp, #32 * 11]
44        stp q22, q23, [sp, #32 * 12]
45        stp q20, q21, [sp, #32 * 13]
46        stp q18, q19, [sp, #32 * 14]
47        stp q16, q17, [sp, #32 * 15]
48        stp q14, q15, [sp, #32 * 16]
49        stp q12, q13, [sp, #32 * 17]
50        stp q10, q11, [sp, #32 * 18]
51        stp  q8,  q9, [sp, #32 * 19]
52        stp  q6,  q7, [sp, #32 * 20]
53        stp  q4,  q5, [sp, #32 * 21]
54        stp  q2,  q3, [sp, #32 * 22]
55        stp  q0,  q1, [sp, #32 * 23]
56
57        mrs x1, TPIDR_EL0 // get thread pointer
58        bl ___orc_rt_elfnix_tlsdesc_resolver_impl
59
60        ldp  q0,  q1, [sp, #32 * 23]
61        ldp  q2,  q3, [sp, #32 * 22]
62        ldp  q4,  q5, [sp, #32 * 21]
63        ldp  q6,  q7, [sp, #32 * 20]
64        ldp  q8,  q9, [sp, #32 * 19]
65        ldp q10, q11, [sp, #32 * 18]
66        ldp q12, q13, [sp, #32 * 17]
67        ldp q14, q15, [sp, #32 * 16]
68        ldp q16, q17, [sp, #32 * 15]
69        ldp q18, q19, [sp, #32 * 14]
70        ldp q20, q21, [sp, #32 * 13]
71        ldp q22, q23, [sp, #32 * 12]
72        ldp q24, q25, [sp, #32 * 11]
73        ldp q26, q27, [sp, #32 * 10]
74        ldp q28, q29, [sp, #32 * 9]
75        ldp q30, q31, [sp, #32 * 8]
76        ldp  x1,  x2, [sp, #16 * 15]
77        ldp  x3,  x4, [sp, #16 * 14]
78        ldp  x5,  x6, [sp, #16 * 13]
79        ldp  x7,  x8, [sp, #16 * 12]
80        ldp  x9, x10, [sp, #16 * 11]
81        ldp x11, x12, [sp, #16 * 10]
82        ldp x13, x14, [sp, #16 * 9]
83        ldp x15, x16, [sp, #16 * 8]
84        ldp x17, x18, [sp, #16 * 7]
85        ldp x19, x20, [sp, #16 * 6]
86        ldp x21, x22, [sp, #16 * 5]
87        ldp x23, x24, [sp, #16 * 4]
88        ldp x25, x26, [sp, #16 * 3]
89        ldp x27, x28, [sp, #16 * 2]
90        ldp x29, x30, [sp, #16 * 1]
91        add  sp,  sp, #REGISTER_SAVE_SPACE_SIZE
92        ret
93
94#endif // defined(__arm64__) || defined(__aarch64__)
95