Reduce opcodes.

This commit is contained in:
Brad Nelson
2021-01-04 23:43:13 -08:00
parent ce671226db
commit b2d1b5d418
3 changed files with 15 additions and 42 deletions

View File

@ -121,7 +121,7 @@ static void ueforth(int argc, char *argv[], void *heap,
g_sys.heap = (cell_t *) heap;
register cell_t *sp = g_sys.heap; g_sys.heap += STACK_SIZE;
register cell_t *rp = g_sys.heap; g_sys.heap += STACK_SIZE;
register cell_t tos = 0, *ip, t, w;
register cell_t tos = 0, *ip, w;
dcell_t d;
udcell_t ud;
cell_t tmp;

View File

@ -34,7 +34,7 @@ typedef uint64_t udcell_t;
X("OR", OP_OR, tos = tos | *sp; --sp) \
X("XOR", OP_XOR, tos = tos ^ *sp; --sp) \
X("DUP", OP_DUP, DUP) \
X("SWAP", OP_SWAP, t = tos; tos = *sp; *sp = t) \
X("SWAP", OP_SWAP, w = tos; tos = *sp; *sp = w) \
X("OVER", OP_OVER, DUP; tos = sp[-1]) \
X("DROP", OP_DROP, DROP) \
X("@", OP_AT, tos = *(cell_t *) tos) \
@ -56,22 +56,22 @@ typedef uint64_t udcell_t;
X("BRANCH", OP_BRANCH, ip = (cell_t *) *ip) \
X("0BRANCH", OP_ZBRANCH, if (!tos) ip = (cell_t *) *ip; else ++ip; DROP) \
X("DONEXT", OP_DONEXT, *rp = (*rp - 1) | 0; if (*rp) ip = (cell_t *) *ip; else (--rp, ++ip)) \
X("DOLIT", OP_DOLIT, DUP; tos = *(cell_t *) ip; ++ip) \
X("DOLIT", OP_DOLIT, DUP; tos = *ip; ++ip) \
X("ALITERAL", OP_ALITERAL, COMMA(g_sys.DOLIT_XT); COMMA(tos); DROP) \
X("CELL", OP_CELL, DUP; tos = sizeof(cell_t)) \
X("FIND", OP_FIND, tos = find((const char *) *sp, tos); --sp) \
X("PARSE", OP_PARSE, DUP; tos = parse(tos, sp)) \
X("S>NUMBER?", OP_CONVERT, tos = convert((const char *) *sp, tos, sp); \
if (!tos) --sp) \
X("CREATE", OP_CREATE, t = parse(32, &tmp); \
create((const char *) tmp, t, 0, && OP_DOCREATE); \
COMMA(0)) \
X("CREATE", OP_CREATE, DUP; DUP; tos = parse(32, sp); \
create((const char *) *sp, tos, 0, && OP_DOCREATE); \
COMMA(0); --sp; DROP) \
X("DOES>", OP_DOES, DOES(ip); ip = (void *) *rp; --rp) \
X("IMMEDIATE", OP_IMMEDIATE, g_sys.last[-1] |= 1) \
X("'SYS", OP_SYS, DUP; tos = (cell_t) &g_sys) \
X(":", OP_COLON, t = parse(32, &tmp); \
create((const char *) tmp, t, 0, && OP_DOCOL); \
g_sys.state = -1) \
X(":", OP_COLON, DUP; DUP; tos = parse(32, sp); \
create((const char *) *sp, tos, 0, && OP_DOCOL); \
g_sys.state = -1; --sp; DROP) \
X("EVALUATE1", OP_EVALUATE1, DUP; sp = evaluate1(sp, &tmp); \
DROP; if (tmp) (w = tmp); \
if (tmp) goto **(void **) w) \

View File

@ -43,43 +43,16 @@ function Interpreter(stdlib, foreign, heap) {
var imul = stdlib.Math.imul;
var Call = foreign.Call;
var COMMA = foreign.COMMA;
var IMMEDIATE = foreign.IMMEDIATE;
var find = foreign.parse;
var parse = foreign.parse;
var convert = foreign.convert;
var evaluate1 = foreign.evaluate1;
var u8 = new stdlib.Uint8Array(heap);
var i32 = new stdlib.Int32Array(heap);
function convert(pos, n, ret) {
pos = pos | 0;
n = n | 0;
ret = ret | 0;
var negate = 0;
var d = 0;
i32[ret>>2] = 0;
if (!n) { return 0; }
if (u8[pos] == '-') { negate = -1; pos = (pos + 1) | 0; n = (n - 1) | 0; }
for (; n; n = (n - 1) | 0) {
d = (u8[pos] - 48) | 0;
if ((d >>> 0) > 9) {
d = ((d & 59) - 7) | 0;
if (d < 10) { return 0; }
}
if ((d >>> 0) >= (i32[g_base] >>> 0)) { return 0; }
ret = ((imul(ret, i32[g_base]) >>> 0) + d) | 0;
pos = (pos + 1) | 0;
}
if (negate) { i32[ret] = (-i32[ret]) | 0; }
return -1;
}
function same(a, b, len) {
a = a | 0;
b = b | 0;
len = len | 0;
for (;len && (i32[a] & 95) == (i32[b] & 95);
len = (len - 1) | 0, a = (a + 1) | 0, b = (b + 1) | 0);
return len | 0;
}
function run(initrp) {
initrp = initrp | 0;
var tos = 0;