Passes but does not run for asm.js
This commit is contained in:
@ -28,7 +28,7 @@ typedef uint64_t udcell_t;
|
|||||||
|
|
||||||
#define OPCODE_LIST \
|
#define OPCODE_LIST \
|
||||||
X("0=", OP_ZEQUAL, tos = !tos ? -1 : 0) \
|
X("0=", OP_ZEQUAL, tos = !tos ? -1 : 0) \
|
||||||
X("0<", OP_ZLESS, tos = tos < 0 ? -1 : 0) \
|
X("0<", OP_ZLESS, tos = (tos|0) < 0 ? -1 : 0) \
|
||||||
X("+", OP_PLUS, tos = (tos + *sp) | 0; --sp) \
|
X("+", OP_PLUS, tos = (tos + *sp) | 0; --sp) \
|
||||||
X("UM/MOD", OP_UMSMOD, UMSMOD) \
|
X("UM/MOD", OP_UMSMOD, UMSMOD) \
|
||||||
X("*/MOD", OP_SSMOD, SSMOD) \
|
X("*/MOD", OP_SSMOD, SSMOD) \
|
||||||
@ -36,47 +36,50 @@ 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, w = tos; tos = *sp; *sp = w) \
|
X("SWAP", OP_SWAP, w = tos; tos = (*sp)|0; *sp = w) \
|
||||||
X("OVER", OP_OVER, DUP; tos = sp[-1]) \
|
X("OVER", OP_OVER, DUP; tos = sp[-1] | 0) \
|
||||||
X("DROP", OP_DROP, DROP) \
|
X("DROP", OP_DROP, DROP) \
|
||||||
X("@", OP_AT, tos = *(cell_t *) tos) \
|
X("@", OP_AT, tos = (*(cell_t *) tos)|0) \
|
||||||
X("L@", OP_LAT, tos = *(int32_t *) tos) \
|
X("L@", OP_LAT, tos = (*(int32_t *) tos)|0) \
|
||||||
X("C@", OP_CAT, tos = *(uint8_t *) tos) \
|
X("C@", OP_CAT, tos = (*(uint8_t *) tos)|0) \
|
||||||
X("!", OP_STORE, *(cell_t *) tos = *sp; --sp; DROP) \
|
X("!", OP_STORE, *(cell_t *) tos = (*sp)|0; --sp; DROP) \
|
||||||
X("L!", OP_LSTORE, *(int32_t *) tos = *sp; --sp; DROP) \
|
X("L!", OP_LSTORE, *(int32_t *) tos = (*sp)|0; --sp; DROP) \
|
||||||
X("C!", OP_CSTORE, *(uint8_t *) tos = *sp; --sp; DROP) \
|
X("C!", OP_CSTORE, *(uint8_t *) tos = (*sp)|0; --sp; DROP) \
|
||||||
X("FILL", OP_FILL, memset((void *) sp[-1], tos, *sp); sp -= 2; DROP) \
|
X("FILL", OP_FILL, memset((void *) (sp[-1] | 0), tos | 0, (*sp | 0)); sp -= 2; DROP) \
|
||||||
X("MOVE", OP_MOVE, memmove((void *) sp[-1], (void *) *sp, tos); sp -= 2; DROP) \
|
X("MOVE", OP_MOVE, memmove((void *) (sp[-1] | 0), (void *) (*sp | 0), tos | 0); sp -= 2; DROP) \
|
||||||
X("SP@", OP_SPAT, DUP; tos = (cell_t) sp) \
|
X("SP@", OP_SPAT, DUP; tos = (cell_t) sp) \
|
||||||
X("SP!", OP_SPSTORE, sp = (cell_t *) tos; DROP) \
|
X("SP!", OP_SPSTORE, sp = (cell_t *) tos; DROP) \
|
||||||
X("RP@", OP_RPAT, DUP; tos = (cell_t) rp) \
|
X("RP@", OP_RPAT, DUP; tos = (cell_t) rp) \
|
||||||
X("RP!", OP_RPSTORE, rp = (cell_t *) tos; DROP) \
|
X("RP!", OP_RPSTORE, rp = (cell_t *) tos; DROP) \
|
||||||
X(">R", OP_TOR, ++rp; *rp = tos; DROP) \
|
X(">R", OP_TOR, ++rp; *rp = tos; DROP) \
|
||||||
X("R>", OP_FROMR, DUP; tos = *rp; --rp) \
|
X("R>", OP_FROMR, DUP; tos = (*rp)|0; --rp) \
|
||||||
X("R@", OP_RAT, DUP; tos = *rp) \
|
X("R@", OP_RAT, DUP; tos = (*rp)|0) \
|
||||||
X("EXECUTE", OP_EXECUTE, w = tos; DROP; goto **(void **) w) \
|
X("EXECUTE", OP_EXECUTE, w = tos; DROP; goto **(void **) w) \
|
||||||
X("BRANCH", OP_BRANCH, ip = (cell_t *) *ip) \
|
X("BRANCH", OP_BRANCH, ip = (cell_t *) (*ip | 0)) \
|
||||||
X("0BRANCH", OP_ZBRANCH, if (!tos) ip = (cell_t *) *ip; else ++ip; DROP) \
|
X("0BRANCH", OP_ZBRANCH, if (!tos) ip = (cell_t *) (*ip | 0); 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|0) - 1) | 0; \
|
||||||
X("DOLIT", OP_DOLIT, DUP; tos = *ip; ++ip) \
|
if ((*rp|0)) ip = (cell_t *) (*ip | 0); else (--rp, ++ip)) \
|
||||||
X("ALITERAL", OP_ALITERAL, COMMA(g_sys.DOLIT_XT); COMMA(tos); DROP) \
|
X("DOLIT", OP_DOLIT, DUP; tos = (*ip | 0); ++ip) \
|
||||||
|
X("ALITERAL", OP_ALITERAL, COMMA(g_sys.DOLIT_XT | 0); COMMA(tos | 0); 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 | 0), tos|0)|0; --sp) \
|
||||||
X("PARSE", OP_PARSE, DUP; tos = parse(tos, sp)) \
|
X("PARSE", OP_PARSE, DUP; tos = parse(tos|0, (cell_t *) ((cell_t) sp | 0))|0) \
|
||||||
X("S>NUMBER?", OP_CONVERT, tos = convert((const char *) *sp, tos, sp); \
|
X("S>NUMBER?", OP_CONVERT, \
|
||||||
if (!tos) --sp) \
|
tos = convert((const char *) (*sp | 0), tos|0, (cell_t *) ((cell_t) sp | 0))|0; \
|
||||||
X("CREATE", OP_CREATE, DUP; DUP; tos = parse(32, sp); \
|
if (!tos) --sp) \
|
||||||
create((const char *) *sp, tos, 0, && OP_DOCREATE); \
|
X("CREATE", OP_CREATE, DUP; DUP; tos = parse(32, (cell_t *) ((cell_t) sp | 0))|0; \
|
||||||
|
create((const char *) (*sp | 0), tos|0, 0, && OP_DOCREATE); \
|
||||||
COMMA(0); --sp; DROP) \
|
COMMA(0); --sp; DROP) \
|
||||||
X("DOES>", OP_DOES, DOES(ip); ip = (void *) *rp; --rp) \
|
X("DOES>", OP_DOES, DOES((cell_t *) ((cell_t) ip|0)); ip = (void *) (*rp | 0); --rp) \
|
||||||
X("IMMEDIATE", OP_IMMEDIATE, g_sys.last[-1] |= 1) \
|
X("IMMEDIATE", OP_IMMEDIATE, IMMEDIATE()) \
|
||||||
X("'SYS", OP_SYS, DUP; tos = (cell_t) &g_sys) \
|
X("'SYS", OP_SYS, DUP; tos = (cell_t) &g_sys) \
|
||||||
X(":", OP_COLON, DUP; DUP; tos = parse(32, sp); \
|
X(":", OP_COLON, DUP; DUP; tos = parse(32, (cell_t *) ((cell_t) sp | 0))|0; \
|
||||||
create((const char *) *sp, tos, 0, && OP_DOCOLON); \
|
create((const char *) (*sp | 0), tos|0, 0, && OP_DOCOLON); \
|
||||||
g_sys.state = -1; --sp; DROP) \
|
g_sys.state = -1; --sp; DROP) \
|
||||||
X("EVALUATE1", OP_EVALUATE1, DUP; sp = evaluate1(sp); \
|
X("EVALUATE1", OP_EVALUATE1, \
|
||||||
w = *sp; --sp; DROP; \
|
DUP; sp = (cell_t *) ((cell_t) evaluate1((cell_t *) ((cell_t) sp | 0))|0); \
|
||||||
if (w) goto **(void **) w) \
|
w = (*sp | 0); --sp; DROP; \
|
||||||
X("EXIT", OP_EXIT, ip = (void *) *rp; --rp) \
|
if (w) goto **(void **) w) \
|
||||||
X(";", OP_SEMICOLON, COMMA(g_sys.DOEXIT_XT); g_sys.state = 0) \
|
X("EXIT", OP_EXIT, ip = (void *) (*rp | 0); --rp) \
|
||||||
|
X(";", OP_SEMICOLON, COMMA(g_sys.DOEXIT_XT | 0); g_sys.state = 0) \
|
||||||
|
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
#include "common/opcodes.h"
|
#include "common/opcodes.h"
|
||||||
|
|
||||||
#define PLATFORM_OPCODE_LIST \
|
#define PLATFORM_OPCODE_LIST \
|
||||||
X("CALL", OP_CALL, sp = Call(sp, tos); DROP) \
|
X("CALL", OP_CALL, sp = Call(sp|0, tos|0) | 0; DROP) \
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
OP_DOCOLON = 0,
|
OP_DOCOLON = 0,
|
||||||
|
|||||||
@ -16,7 +16,7 @@ function ReplaceAll(haystack, needle, replacement) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cases = ReplaceAll(cases, 'DROP', 'tos = i32[sp>>2]; sp = (sp - 4) | 0');
|
cases = ReplaceAll(cases, 'DROP', 'tos = i32[sp>>2] | 0; sp = (sp - 4) | 0');
|
||||||
cases = ReplaceAll(cases, 'DUP', 'sp = (sp + 4) | 0; i32[sp>>2] = tos');
|
cases = ReplaceAll(cases, 'DUP', 'sp = (sp + 4) | 0; i32[sp>>2] = tos');
|
||||||
cases = ReplaceAll(cases, '*(cell_t *) tos', 'i32[tos>>2]');
|
cases = ReplaceAll(cases, '*(cell_t *) tos', 'i32[tos>>2]');
|
||||||
cases = ReplaceAll(cases, '*(int32_t *) tos', 'i32[tos>>2]');
|
cases = ReplaceAll(cases, '*(int32_t *) tos', 'i32[tos>>2]');
|
||||||
@ -30,7 +30,8 @@ cases = ReplaceAll(cases, '++sp', 'sp = (sp + 4) | 0');
|
|||||||
cases = ReplaceAll(cases, '++rp', 'rp = (rp + 4) | 0');
|
cases = ReplaceAll(cases, '++rp', 'rp = (rp + 4) | 0');
|
||||||
cases = ReplaceAll(cases, '--sp', 'sp = (sp - 4) | 0');
|
cases = ReplaceAll(cases, '--sp', 'sp = (sp - 4) | 0');
|
||||||
cases = ReplaceAll(cases, '--rp', 'rp = (rp - 4) | 0');
|
cases = ReplaceAll(cases, '--rp', 'rp = (rp - 4) | 0');
|
||||||
cases = ReplaceAll(cases, 'sizeof(cell_t) ', '4');
|
cases = ReplaceAll(cases, 'sp -= 2', 'sp = (sp - 8) | 0');
|
||||||
|
cases = ReplaceAll(cases, 'sizeof(cell_t)', '4');
|
||||||
cases = ReplaceAll(cases, '(void *) ', '');
|
cases = ReplaceAll(cases, '(void *) ', '');
|
||||||
cases = ReplaceAll(cases, '(const char *) ', '');
|
cases = ReplaceAll(cases, '(const char *) ', '');
|
||||||
cases = ReplaceAll(cases, '(cell_t *) ', '');
|
cases = ReplaceAll(cases, '(cell_t *) ', '');
|
||||||
@ -42,6 +43,8 @@ cases = ReplaceAll(cases, '&g_sys', 'g_sys');
|
|||||||
cases = ReplaceAll(cases, '&& OP_DOCOLON', '0');
|
cases = ReplaceAll(cases, '&& OP_DOCOLON', '0');
|
||||||
cases = ReplaceAll(cases, '&& OP_DOCREATE', '1');
|
cases = ReplaceAll(cases, '&& OP_DOCREATE', '1');
|
||||||
cases = ReplaceAll(cases, 'goto **(void **) w', 'break decode');
|
cases = ReplaceAll(cases, 'goto **(void **) w', 'break decode');
|
||||||
|
cases = ReplaceAll(cases, 'UMSMOD', '');
|
||||||
|
cases = ReplaceAll(cases, 'SSMOD', '');
|
||||||
|
|
||||||
code = code.replace('{{boot}}', function() { return boot; });
|
code = code.replace('{{boot}}', function() { return boot; });
|
||||||
code = code.replace('{{dict}}', function() { return dict; });
|
code = code.replace('{{dict}}', function() { return dict; });
|
||||||
|
|||||||
@ -10,9 +10,9 @@ const boot = `
|
|||||||
{{boot}}
|
{{boot}}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
var buffer = new ArrayBuffer(HEAP_SIZE);
|
var heap = new ArrayBuffer(HEAP_SIZE);
|
||||||
var i32 = new Int32Array(buffer);
|
var i32 = new Int32Array(heap);
|
||||||
var u8 = new Uint8Array(buffer);
|
var u8 = new Uint8Array(heap);
|
||||||
var objects = [SetEval];
|
var objects = [SetEval];
|
||||||
|
|
||||||
function SetEval(sp) {
|
function SetEval(sp) {
|
||||||
@ -37,22 +37,30 @@ function InitDictionary() {
|
|||||||
{{dict}}
|
{{dict}}
|
||||||
}
|
}
|
||||||
|
|
||||||
function Interpreter(stdlib, foreign, heap) {
|
function VM(stdlib, foreign, heap) {
|
||||||
"use asm";
|
"use asm";
|
||||||
|
|
||||||
var imul = stdlib.Math.imul;
|
var imul = stdlib.Math.imul;
|
||||||
|
|
||||||
|
var UMSMOD = foreign.UMSMOD;
|
||||||
|
var SSMOD = foreign.SSMOD;
|
||||||
var Call = foreign.Call;
|
var Call = foreign.Call;
|
||||||
var COMMA = foreign.COMMA;
|
var COMMA = foreign.COMMA;
|
||||||
|
var DOES = foreign.DOES;
|
||||||
var IMMEDIATE = foreign.IMMEDIATE;
|
var IMMEDIATE = foreign.IMMEDIATE;
|
||||||
var find = foreign.parse;
|
var create = foreign.create;
|
||||||
|
var find = foreign.find;
|
||||||
var parse = foreign.parse;
|
var parse = foreign.parse;
|
||||||
|
var memset = foreign.memset;
|
||||||
|
var memmove = foreign.memmove;
|
||||||
var convert = foreign.convert;
|
var convert = foreign.convert;
|
||||||
var evaluate1 = foreign.evaluate1;
|
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);
|
||||||
|
|
||||||
|
var g_sys = 128;
|
||||||
|
|
||||||
function run(initrp) {
|
function run(initrp) {
|
||||||
initrp = initrp | 0;
|
initrp = initrp | 0;
|
||||||
var tos = 0;
|
var tos = 0;
|
||||||
@ -70,22 +78,34 @@ function Interpreter(stdlib, foreign, heap) {
|
|||||||
decode: for (;;) {
|
decode: for (;;) {
|
||||||
ir = u8[w]|0;
|
ir = u8[w]|0;
|
||||||
ip = (ip + 4)|0;
|
ip = (ip + 4)|0;
|
||||||
switch (ir) {
|
switch (ir&0xff) {
|
||||||
case 0: // OP_DOCOLON
|
case 0: // OP_DOCOLON
|
||||||
rp = (rp + 4) | 0; i32[rp] = ip; ip = (w + 4) | 0;
|
rp = (rp + 4) | 0; i32[rp>>2] = ip; ip = (w + 4) | 0;
|
||||||
break;
|
break;
|
||||||
case 1: // OP_DOCREATE
|
case 1: // OP_DOCREATE
|
||||||
sp = (sp + 4) | 0; i32[sp] = tos; tos = (w + 8) | 0; // 4 * 2
|
sp = (sp + 4) | 0; i32[sp>>2] = tos; tos = (w + 8) | 0; // 4 * 2
|
||||||
break;
|
break;
|
||||||
case 2: // OP_DODOES
|
case 2: // OP_DODOES
|
||||||
sp = (sp + 4) | 0; i32[sp] = tos; tos = (w + 8) | 0; // 4 * 2
|
sp = (sp + 4) | 0; i32[sp>>2] = tos; tos = (w + 8) | 0; // 4 * 2
|
||||||
rp = (rp + 4) | 0; i32[rp] = ip; ip = i32[(w + 4) >> 2];
|
rp = (rp + 4) | 0; i32[rp>>2] = ip; ip = i32[(w + 4)>>2] | 0;
|
||||||
break;
|
break;
|
||||||
{{cases}}
|
{{cases}}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return {run: run};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var ffi = {
|
||||||
|
Call: Call,
|
||||||
|
create: function() {},
|
||||||
|
parse: function() {},
|
||||||
|
COMMA: function() {},
|
||||||
|
};
|
||||||
|
|
||||||
|
heap[128 + 6] = 256 * 4; // set g_sys.heap = 256 * 4;
|
||||||
|
|
||||||
|
var module = VM(window, ffi, heap);
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|||||||
Reference in New Issue
Block a user