1
#define APHELEIA_SETJMP_NO_MACRO
2
3
#include <setjmp.h>
4
5
// clang-format off
6
#if defined(__riscv) && __riscv_xlen == 64
7
__asm__(
8
".globl setjmp\n"
9
"setjmp:\n"
10
"sd ra, 0(a0)\n"
11
"sd s0, 8(a0)\n"
12
"sd s1, 16(a0)\n"
13
"sd s2, 24(a0)\n"
14
"sd s3, 32(a0)\n"
15
"sd s4, 40(a0)\n"
16
"sd s5, 48(a0)\n"
17
"sd s6, 56(a0)\n"
18
"sd s7, 64(a0)\n"
19
"sd s8, 72(a0)\n"
20
"sd s9, 80(a0)\n"
21
"sd s10, 88(a0)\n"
22
"sd s11, 96(a0)\n"
23
"sd sp, 104(a0)\n"
24
"li a0, 0\n"
25
"ret\n"
26
"\n"
27
".globl longjmp\n"
28
"longjmp:\n"
29
"mv t0, a0\n"
30
"mv t1, a1\n"
31
"bnez t1, 0f\n"
32
"li t1, 1\n"
33
"0:\n"
34
"ld ra, 0(t0)\n"
35
"ld s0, 8(t0)\n"
36
"ld s1, 16(t0)\n"
37
"ld s2, 24(t0)\n"
38
"ld s3, 32(t0)\n"
39
"ld s4, 40(t0)\n"
40
"ld s5, 48(t0)\n"
41
"ld s6, 56(t0)\n"
42
"ld s7, 64(t0)\n"
43
"ld s8, 72(t0)\n"
44
"ld s9, 80(t0)\n"
45
"ld s10, 88(t0)\n"
46
"ld s11, 96(t0)\n"
47
"ld sp, 104(t0)\n"
48
"mv a0, t1\n"
49
"jr ra\n"
50
);
51
#elif defined(__riscv) && __riscv_xlen == 32
52
__asm__(
53
".globl setjmp\n"
54
"setjmp:\n"
55
"sw ra, 0(a0)\n"
56
"sw s0, 4(a0)\n"
57
"sw s1, 8(a0)\n"
58
"sw s2, 12(a0)\n"
59
"sw s3, 16(a0)\n"
60
"sw s4, 20(a0)\n"
61
"sw s5, 24(a0)\n"
62
"sw s6, 28(a0)\n"
63
"sw s7, 32(a0)\n"
64
"sw s8, 36(a0)\n"
65
"sw s9, 40(a0)\n"
66
"sw s10, 44(a0)\n"
67
"sw s11, 48(a0)\n"
68
"sw sp, 52(a0)\n"
69
"li a0, 0\n"
70
"ret\n"
71
"\n"
72
".globl longjmp\n"
73
"longjmp:\n"
74
"mv t0, a0\n"
75
"mv t1, a1\n"
76
"bnez t1, 0f\n"
77
"li t1, 1\n"
78
"0:\n"
79
"lw ra, 0(t0)\n"
80
"lw s0, 4(t0)\n"
81
"lw s1, 8(t0)\n"
82
"lw s2, 12(t0)\n"
83
"lw s3, 16(t0)\n"
84
"lw s4, 20(t0)\n"
85
"lw s5, 24(t0)\n"
86
"lw s6, 28(t0)\n"
87
"lw s7, 32(t0)\n"
88
"lw s8, 36(t0)\n"
89
"lw s9, 40(t0)\n"
90
"lw s10, 44(t0)\n"
91
"lw s11, 48(t0)\n"
92
"lw sp, 52(t0)\n"
93
"mv a0, t1\n"
94
"jr ra\n"
95
);
96
#elif defined(__x86_64__)
97
__asm__(
98
".globl setjmp\n"
99
"setjmp:\n"
100
"movq %rbx, 0(%rdi)\n"
101
"movq %rbp, 8(%rdi)\n"
102
"movq %r12, 16(%rdi)\n"
103
"movq %r13, 24(%rdi)\n"
104
"movq %r14, 32(%rdi)\n"
105
"movq %r15, 40(%rdi)\n"
106
"movq (%rsp), %rax\n"
107
"movq %rax, 48(%rdi)\n"
108
"leaq 8(%rsp), %rax\n"
109
"movq %rax, 56(%rdi)\n"
110
"xorl %eax, %eax\n"
111
"ret\n"
112
"\n"
113
".globl longjmp\n"
114
"longjmp:\n"
115
"movq %rdi, %rdx\n"
116
"movl %esi, %eax\n"
117
"testl %eax, %eax\n"
118
"jnz 0f\n"
119
"movl $1, %eax\n"
120
"0:\n"
121
"movq 0(%rdx), %rbx\n"
122
"movq 8(%rdx), %rbp\n"
123
"movq 16(%rdx), %r12\n"
124
"movq 24(%rdx), %r13\n"
125
"movq 32(%rdx), %r14\n"
126
"movq 40(%rdx), %r15\n"
127
"movq 56(%rdx), %rsp\n"
128
"jmp *48(%rdx)\n"
129
);
130
#elif defined(__i386__)
131
__asm__(
132
".globl setjmp\n"
133
"setjmp:\n"
134
"movl 4(%esp), %edx\n"
135
"movl %ebx, 0(%edx)\n"
136
"movl %esi, 4(%edx)\n"
137
"movl %edi, 8(%edx)\n"
138
"movl %ebp, 12(%edx)\n"
139
"movl (%esp), %eax\n"
140
"movl %eax, 16(%edx)\n"
141
"leal 4(%esp), %eax\n"
142
"movl %eax, 20(%edx)\n"
143
"xorl %eax, %eax\n"
144
"ret\n"
145
"\n"
146
".globl longjmp\n"
147
"longjmp:\n"
148
"movl 4(%esp), %edx\n"
149
"movl 8(%esp), %eax\n"
150
"testl %eax, %eax\n"
151
"jnz 0f\n"
152
"movl $1, %eax\n"
153
"0:\n"
154
"movl 0(%edx), %ebx\n"
155
"movl 4(%edx), %esi\n"
156
"movl 8(%edx), %edi\n"
157
"movl 12(%edx), %ebp\n"
158
"movl 20(%edx), %esp\n"
159
"jmp *16(%edx)\n"
160
);
161
#else162
#error "Unsupported architecture"
163
#endif164
// clang-format on