setjmp.S revision 1.1 1 /* $NetBSD: setjmp.S,v 1.1 2018/08/16 18:17:47 jmcneill Exp $ */
2
3 /*
4 * Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.
5 * This program and the accompanying materials are licensed and made
6 available
7 * under the terms and conditions of the BSD License which accompanies
8 this
9 * distribution. The full text of the license may be found at
10 * http://opensource.org/licenses/bsd-license.php.
11 *
12 * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
13 BASIS,
14 * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR
15 * IMPLIED.
16 */
17 .text
18 .p2align 3
19
20 #define GPR_LAYOUT \
21 REG_PAIR (x19, x20, 0); \
22 REG_PAIR (x21, x22, 16); \
23 REG_PAIR (x23, x24, 32); \
24 REG_PAIR (x25, x26, 48); \
25 REG_PAIR (x27, x28, 64); \
26 REG_PAIR (x29, x30, 80); \
27 REG_ONE (x16, 96)
28
29 #define FPR_LAYOUT \
30 REG_PAIR(d8, d9, 112); \
31 REG_PAIR(d10, d11, 128); \
32 REG_PAIR(d12, d13, 144); \
33 REG_PAIR(d14, d15, 160);
34
35 #define REG_PAIR(REG1, REG2, OFFS) stp REG1, REG2, [x0, OFFS]
36 #define REG_ONE(REG1, OFFS) str REG1, [x0, OFFS]
37
38 .globl setjmp
39 .type setjmp, @function
40 setjmp:
41 mov x16, sp
42 GPR_LAYOUT
43 FPR_LAYOUT
44 mov w0, #0
45 ret
46
47 #undef REG_PAIR
48 #undef REG_ONE
49
50 #define REG_PAIR(REG1, REG2, OFFS) ldp REG1, REG2, [x0, OFFS]
51 #define REG_ONE(REG1, OFFS) ldr REG1, [x0, OFFS]
52
53 .globl longjmp
54 .type longjmp, @function
55 longjmp:
56 GPR_LAYOUT
57 FPR_LAYOUT
58 mov sp, x16
59 cmp w1, #0
60 mov w0, #1
61 csel w0, w1, w0, ne
62 br x30
63