1// Copyright 2015 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5#include "go_asm.h"
6#include "go_tls.h"
7#include "funcdata.h"
8#include "textflag.h"
9#include "tls_arm64.h"
10
11TEXT runtime·load_g(SB),NOSPLIT,$0
12#ifndef GOOS_darwin
13#ifndef GOOS_openbsd
14#ifndef GOOS_windows
15	MOVB	runtime·iscgo(SB), R0
16	CBZ	R0, nocgo
17#endif
18#endif
19#endif
20
21	MRS_TPIDR_R0
22#ifdef TLS_darwin
23	// Darwin sometimes returns unaligned pointers
24	AND	$0xfffffffffffffff8, R0
25#endif
26	MOVD	runtime·tls_g(SB), R27
27	MOVD	(R0)(R27), g
28
29nocgo:
30	RET
31
32TEXT runtime·save_g(SB),NOSPLIT,$0
33#ifndef GOOS_darwin
34#ifndef GOOS_openbsd
35#ifndef GOOS_windows
36	MOVB	runtime·iscgo(SB), R0
37	CBZ	R0, nocgo
38#endif
39#endif
40#endif
41
42	MRS_TPIDR_R0
43#ifdef TLS_darwin
44	// Darwin sometimes returns unaligned pointers
45	AND	$0xfffffffffffffff8, R0
46#endif
47	MOVD	runtime·tls_g(SB), R27
48	MOVD	g, (R0)(R27)
49
50nocgo:
51	RET
52
53#ifdef TLSG_IS_VARIABLE
54#ifdef GOOS_android
55// Use the free TLS_SLOT_APP slot #2 on Android Q.
56// Earlier androids are set up in gcc_android.c.
57DATA runtime·tls_g+0(SB)/8, $16
58#endif
59GLOBL runtime·tls_g+0(SB), NOPTR, $8
60#else
61GLOBL runtime·tls_g+0(SB), TLSBSS, $8
62#endif
63