1/*
2 * Copyright (c) 2021 BayLibre SAS
3 * Written by: Nicolas Pitre
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#include <zephyr/toolchain.h>
9#include <zephyr/linker/sections.h>
10
11_ASM_FILE_PROLOGUE
12
13GTEXT(z_arm64_fpu_save)
14SECTION_FUNC(TEXT, z_arm64_fpu_save)
15
16	stp	q0,  q1,  [x0, #(16 *  0)]
17	stp	q2,  q3,  [x0, #(16 *  2)]
18	stp	q4,  q5,  [x0, #(16 *  4)]
19	stp	q6,  q7,  [x0, #(16 *  6)]
20	stp	q8,  q9,  [x0, #(16 *  8)]
21	stp	q10, q11, [x0, #(16 * 10)]
22	stp	q12, q13, [x0, #(16 * 12)]
23	stp	q14, q15, [x0, #(16 * 14)]
24	stp	q16, q17, [x0, #(16 * 16)]
25	stp	q18, q19, [x0, #(16 * 18)]
26	stp	q20, q21, [x0, #(16 * 20)]
27	stp	q22, q23, [x0, #(16 * 22)]
28	stp	q24, q25, [x0, #(16 * 24)]
29	stp	q26, q27, [x0, #(16 * 26)]
30	stp	q28, q29, [x0, #(16 * 28)]
31	stp	q30, q31, [x0, #(16 * 30)]
32
33	mrs	x1, fpsr
34	mrs	x2, fpcr
35	str	w1, [x0, #(16 * 32 + 0)]
36	str	w2, [x0, #(16 * 32 + 4)]
37
38	ret
39
40GTEXT(z_arm64_fpu_restore)
41SECTION_FUNC(TEXT, z_arm64_fpu_restore)
42
43	ldp	q0,  q1,  [x0, #(16 *  0)]
44	ldp	q2,  q3,  [x0, #(16 *  2)]
45	ldp	q4,  q5,  [x0, #(16 *  4)]
46	ldp	q6,  q7,  [x0, #(16 *  6)]
47	ldp	q8,  q9,  [x0, #(16 *  8)]
48	ldp	q10, q11, [x0, #(16 * 10)]
49	ldp	q12, q13, [x0, #(16 * 12)]
50	ldp	q14, q15, [x0, #(16 * 14)]
51	ldp	q16, q17, [x0, #(16 * 16)]
52	ldp	q18, q19, [x0, #(16 * 18)]
53	ldp	q20, q21, [x0, #(16 * 20)]
54	ldp	q22, q23, [x0, #(16 * 22)]
55	ldp	q24, q25, [x0, #(16 * 24)]
56	ldp	q26, q27, [x0, #(16 * 26)]
57	ldp	q28, q29, [x0, #(16 * 28)]
58	ldp	q30, q31, [x0, #(16 * 30)]
59
60	ldr	w1, [x0, #(16 * 32 + 0)]
61	ldr	w2, [x0, #(16 * 32 + 4)]
62	msr	fpsr, x1
63	msr	fpcr, x2
64
65	ret
66