-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathesp32s3_engine_asm.S
More file actions
206 lines (164 loc) · 3.2 KB
/
esp32s3_engine_asm.S
File metadata and controls
206 lines (164 loc) · 3.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
#define MCP_FORTH_GENERATED_DEFINES
#include "mcp_forth_generated.h"
#undef MCP_FORTH_GENERATED_DEFINES
#define M4_ESP32S3_DEFINE_REG_ALIASES
#include "esp32s3.h"
.altmacro
.extern m4_global_get_ctx
.extern m4_lit
.globl m4_esp32s3_engine_run_asm
.macro CALLBACK_TARGET_DECL n
.globl m4_esp32s3_engine_callback_target_\n
.endm
.set i, 0
.rept M4_MAX_CALLBACKS
CALLBACK_TARGET_DECL %i
.set i, i+1
.endr
.align 4
m4_esp32s3_engine_run_asm:
entry sp, 48
mov s0, a3
l32i rs, cs, RETURN_STACK_DATA
addi rs, rs, -rso - 4
l32i dp, cs, MEMORY
l32i va, cs, VARIABLES
l32i la, cs, LITERALS
movi rc, call_runtime_word
movi n1, -1
movi n4, -4
l32i ds, cs, STACK_DATA
addi ds, ds, -dso - 4
l32i dt, ds, dso
s32i lr, sp, 0
callx0 s0
l32i lr, sp, 0
// save state
s32i rs, cs, RETURN_STACK_DATA
s32i dp, cs, MEMORY
addi ds, ds, dso+4
s32i dt, ds, 0
l32i s2, cs, DEPTH
sub s2, ds, s2
srli s2, s2, 2
addi ds, ds, 4
s32i ds, cs, STACK_DATA
s32i s2, cs, STACK_LEN
retw
.align 4
call_runtime_word:
addi ds, ds, 4
s32i dt, ds, dso
addi s1, cs, RUNTIME_CBS
addi s2, s1, SPECIAL_RUNTIME_CBS - RUNTIME_CBS
movltz s1, s2, s0
srai s2, s0, 31
xor s0, s0, s2
l32i s1, s1, 0
addx4 s0, s0, s1
l32i s0, s0, 0
l32i dt, s0, 0
movi s2, m4_lit
bne dt, s2, 1f
l32i dt, s0, 4
ret
1:
// save state
s32i rs, cs, RETURN_STACK_DATA
s32i dp, cs, MEMORY
addi ds, ds, dso
l32i s2, cs, DEPTH
sub s2, ds, s2
srli s2, s2, 2
addi ds, ds, 4
s32i ds, cs, STACK_DATA
s32i s2, cs, STACK_LEN
l32i s2, s0, 4
mov s1, cs
callx8 dt
l32i rs, cs, RETURN_STACK_DATA
l32i dp, cs, MEMORY
movi rc, call_runtime_word
movi n1, -1
movi n4, -4
l32i ds, cs, STACK_DATA
addi ds, ds, -dso - 8
l32i dt, ds, dso + 4
ret
.macro CALLBACK_TARGET n
.align 4
m4_esp32s3_engine_callback_target_\n:
entry sp, 48
movi a10, \n
j callback_handler
.endm
.set i, 0
.rept M4_MAX_CALLBACKS
CALLBACK_TARGET %i
.set i, i+1
.endr
callback_handler:
s32i a10, sp, 0
_call8 m4_global_get_ctx
l32i a8, sp, 0
l32i a9, a10, CALLBACK_INFO
add a9, a9, a8
l8ui a9, a9, 0
s32i a9, sp, 4
srli a9, a9, 1
l32i a15, a10, STACK_DATA
addx4 a13, a9, a15
s32i a2, a15, 0
beqi a9, 1, 2f
s32i a3, a15, 4
beqi a9, 2, 2f
s32i a4, a15, 8
beqi a9, 3, 2f
s32i a5, a15, 12
beqi a9, 4, 2f
s32i a6, a15, 16
beqi a9, 5, 2f
s32i a7, a15, 20
beqi a9, 6, 2f
mov a12, sp
addi a11, a15, 24
1:
l32i a14, a12, 48
s32i a14, a11, 0
addi a12, a12, 4
addi a11, a11, 4
bne a11, a13, 1b
2:
mov a2, a10
addi a13, a13, -dso - 8
l32i a14, a13, dso + 4
l32i rs, cs, RETURN_STACK_DATA
l32i dp, cs, MEMORY
l32i va, cs, VARIABLES
l32i la, cs, LITERALS
l32i a10, cs, CALLBACK_LOCATIONS
addx4 a10, a8, a10
l32i a10, a10, 0
movi rc, call_runtime_word
movi n1, -1
movi n4, -4
s32i lr, sp, 0
callx0 a10
l32i lr, sp, 0
l32i s0, sp, 4
bbsi.l s0, 0, 1f
addi ds, ds, 4
s32i dt, ds, dso
1:
// save state
s32i rs, cs, RETURN_STACK_DATA
s32i dp, cs, MEMORY
addi ds, ds, dso
l32i s2, cs, DEPTH
sub s2, ds, s2
srli s2, s2, 2
addi ds, ds, 4
s32i ds, cs, STACK_DATA
s32i s2, cs, STACK_LEN
mov a2, dt
retw