Reduce opcodes.
This commit is contained in:
@ -121,7 +121,7 @@ static void ueforth(int argc, char *argv[], void *heap,
|
|||||||
g_sys.heap = (cell_t *) heap;
|
g_sys.heap = (cell_t *) heap;
|
||||||
register cell_t *sp = g_sys.heap; g_sys.heap += STACK_SIZE;
|
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 *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;
|
dcell_t d;
|
||||||
udcell_t ud;
|
udcell_t ud;
|
||||||
cell_t tmp;
|
cell_t tmp;
|
||||||
|
|||||||
@ -34,7 +34,7 @@ typedef uint64_t udcell_t;
|
|||||||
X("OR", OP_OR, tos = tos | *sp; --sp) \
|
X("OR", OP_OR, tos = tos | *sp; --sp) \
|
||||||
X("XOR", OP_XOR, tos = tos ^ *sp; --sp) \
|
X("XOR", OP_XOR, tos = tos ^ *sp; --sp) \
|
||||||
X("DUP", OP_DUP, DUP) \
|
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("OVER", OP_OVER, DUP; tos = sp[-1]) \
|
||||||
X("DROP", OP_DROP, DROP) \
|
X("DROP", OP_DROP, DROP) \
|
||||||
X("@", OP_AT, tos = *(cell_t *) tos) \
|
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("BRANCH", OP_BRANCH, ip = (cell_t *) *ip) \
|
||||||
X("0BRANCH", OP_ZBRANCH, if (!tos) ip = (cell_t *) *ip; else ++ip; DROP) \
|
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("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("ALITERAL", OP_ALITERAL, COMMA(g_sys.DOLIT_XT); COMMA(tos); DROP) \
|
||||||
X("CELL", OP_CELL, DUP; tos = sizeof(cell_t)) \
|
X("CELL", OP_CELL, DUP; tos = sizeof(cell_t)) \
|
||||||
X("FIND", OP_FIND, tos = find((const char *) *sp, tos); --sp) \
|
X("FIND", OP_FIND, tos = find((const char *) *sp, tos); --sp) \
|
||||||
X("PARSE", OP_PARSE, DUP; tos = parse(tos, sp)) \
|
X("PARSE", OP_PARSE, DUP; tos = parse(tos, sp)) \
|
||||||
X("S>NUMBER?", OP_CONVERT, tos = convert((const char *) *sp, tos, sp); \
|
X("S>NUMBER?", OP_CONVERT, tos = convert((const char *) *sp, tos, sp); \
|
||||||
if (!tos) --sp) \
|
if (!tos) --sp) \
|
||||||
X("CREATE", OP_CREATE, t = parse(32, &tmp); \
|
X("CREATE", OP_CREATE, DUP; DUP; tos = parse(32, sp); \
|
||||||
create((const char *) tmp, t, 0, && OP_DOCREATE); \
|
create((const char *) *sp, tos, 0, && OP_DOCREATE); \
|
||||||
COMMA(0)) \
|
COMMA(0); --sp; DROP) \
|
||||||
X("DOES>", OP_DOES, DOES(ip); ip = (void *) *rp; --rp) \
|
X("DOES>", OP_DOES, DOES(ip); ip = (void *) *rp; --rp) \
|
||||||
X("IMMEDIATE", OP_IMMEDIATE, g_sys.last[-1] |= 1) \
|
X("IMMEDIATE", OP_IMMEDIATE, g_sys.last[-1] |= 1) \
|
||||||
X("'SYS", OP_SYS, DUP; tos = (cell_t) &g_sys) \
|
X("'SYS", OP_SYS, DUP; tos = (cell_t) &g_sys) \
|
||||||
X(":", OP_COLON, t = parse(32, &tmp); \
|
X(":", OP_COLON, DUP; DUP; tos = parse(32, sp); \
|
||||||
create((const char *) tmp, t, 0, && OP_DOCOL); \
|
create((const char *) *sp, tos, 0, && OP_DOCOL); \
|
||||||
g_sys.state = -1) \
|
g_sys.state = -1; --sp; DROP) \
|
||||||
X("EVALUATE1", OP_EVALUATE1, DUP; sp = evaluate1(sp, &tmp); \
|
X("EVALUATE1", OP_EVALUATE1, DUP; sp = evaluate1(sp, &tmp); \
|
||||||
DROP; if (tmp) (w = tmp); \
|
DROP; if (tmp) (w = tmp); \
|
||||||
if (tmp) goto **(void **) w) \
|
if (tmp) goto **(void **) w) \
|
||||||
|
|||||||
@ -43,43 +43,16 @@ function Interpreter(stdlib, foreign, heap) {
|
|||||||
var imul = stdlib.Math.imul;
|
var imul = stdlib.Math.imul;
|
||||||
|
|
||||||
var Call = foreign.Call;
|
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 u8 = new stdlib.Uint8Array(heap);
|
||||||
var i32 = new stdlib.Int32Array(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) {
|
function run(initrp) {
|
||||||
initrp = initrp | 0;
|
initrp = initrp | 0;
|
||||||
var tos = 0;
|
var tos = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user