Align PARK/UNPARK with THROW/CATCH.

This commit is contained in:
Brad Nelson
2023-01-14 22:53:30 -08:00
parent 2f79192ea0
commit 75d9185027
4 changed files with 23 additions and 13 deletions

View File

@ -285,9 +285,9 @@ static void forth_init(int argc, char *argv[],
g_sys->tib = src;
g_sys->ntib = src_len;
*++rp = (cell_t) start;
*++rp = (cell_t) fp;
*++rp = (cell_t) sp;
*++rp = (cell_t) start;
g_sys->rp = rp;
g_sys->runner = forth_run;
}

View File

@ -32,11 +32,11 @@ typedef uintptr_t ucell_t;
#define DUP (*++sp = tos)
#define PUSH DUP; tos = (cell_t)
#define PARK DUP; *++rp = (cell_t) fp; *++rp = (cell_t) sp; *++rp = (cell_t) ip
#define UNPARK ip = (cell_t *) *rp--; sp = (cell_t *) *rp--; fp = (float *) *rp--; DROP
#define THROWIT(n) rp = *g_sys->throw_handler; *g_sys->throw_handler = (cell_t *) *rp--; \
sp = (cell_t *) *rp--; fp = (float *) *rp--; ip = (cell_t *) *rp--; \
NIP; tos = (n);
#define PARK *++rp = (cell_t) ip; *++rp = (cell_t) fp; DUP; *++rp = (cell_t) sp;
#define UNPARK sp = (cell_t *) *rp--; DROP; fp = (float *) *rp--; ip = (cell_t *) *rp--;
#define THROWIT(n) \
rp = *g_sys->throw_handler; *g_sys->throw_handler = (cell_t *) *rp--; UNPARK; tos = (n);
#define TOFLAGS(xt) ((uint8_t *) (((cell_t *) (xt)) - 1))
#define TONAMELEN(xt) (TOFLAGS(xt) + 1)

View File

@ -68,9 +68,9 @@ static void IRAM_ATTR HandleInterrupt(void *arg) {
cell_t stack[INTERRUPT_STACK_CELLS];
stack[0] = args->arg;
cell_t *rp = rstack;
*++rp = (cell_t) code;
*++rp = (cell_t) (fstack + 1);
*++rp = (cell_t) (stack + 1);
*++rp = (cell_t) code;
forth_run(rp);
}

View File

@ -340,15 +340,22 @@ function FConvert(pos, n, ret) {
function Evaluate1(rp) {
var call = 0;
var tos, sp, ip, fp;
// UNPARK
ip = i32[rp>>2]; rp -= 4; sp = i32[rp>>2]; rp -= 4; fp = i32[rp>>2]; rp -= 4; tos = i32[sp>>2]; sp -= 4;
sp = i32[rp>>2]; rp -= 4;
tos = i32[sp>>2]; sp -= 4;
fp = i32[rp>>2]; rp -= 4;
ip = i32[rp>>2]; rp -= 4;
var name = sp + 8;
var len = Parse(32, name);
if (len == 0) { // ignore empty
sp += 4; i32[sp>>2] = tos; tos = 0;
// PARK
sp += 4; i32[sp>>2] = tos; rp += 4; i32[rp>>2] = fp; rp += 4; i32[rp>>2] = sp; rp += 4; i32[rp>>2] = ip;
rp += 4; i32[rp>>2] = ip;
rp += 4; i32[rp>>2] = fp;
sp += 4; i32[sp>>2] = tos;
rp += 4; i32[rp>>2] = sp;
return rp;
}
name = i32[name>>2];
@ -388,7 +395,10 @@ function Evaluate1(rp) {
}
sp += 4; i32[sp>>2] = tos; tos = call;
// PARK
sp += 4; i32[sp>>2] = tos; rp += 4; i32[rp>>2] = fp; rp += 4; i32[rp>>2] = sp; rp += 4; i32[rp>>2] = ip;
rp += 4; i32[rp>>2] = ip;
rp += 4; i32[rp>>2] = fp;
sp += 4; i32[sp>>2] = tos;
rp += 4; i32[rp>>2] = sp;
return rp;
}
@ -452,9 +462,9 @@ function Init() {
i32[g_sys_ntib>>2] = source_len;
i32[g_sys_ntib>>2] = source_len;
rp += 4; i32[rp>>2] = start;
rp += 4; i32[rp>>2] = fp;
rp += 4; i32[rp>>2] = sp;
rp += 4; i32[rp>>2] = start;
i32[g_sys_rp>>2] = rp;
}
@ -546,10 +556,10 @@ function VM(stdlib, foreign, heap) {
// UNPARK
rp = i32[g_sys_rp>>2]|0;
ip = i32[rp>>2]|0; rp = (rp - 4)|0;
sp = i32[rp>>2]|0; rp = (rp - 4)|0;
fp = i32[rp>>2]|0; rp = (rp - 4)|0;
tos = i32[sp>>2]|0; sp = (sp - 4)|0;
fp = i32[rp>>2]|0; rp = (rp - 4)|0;
ip = i32[rp>>2]|0; rp = (rp - 4)|0;
for (;;) {
//trace(ip|0, sp|0, tos|0);
w = i32[ip>>2]|0;