From 0ddfc1e07ca9e51009a07baf8f3cd3171873b7be Mon Sep 17 00:00:00 2001 From: Brad Nelson Date: Sun, 10 Jul 2022 15:12:08 -0700 Subject: [PATCH] Tweaks for asmjs. --- Makefile | 3 +- common/opcodes.h | 20 ++++++------- web/dump_web_opcodes.c | 4 --- web/fuse_web.js | 6 ++-- web/web.template.js | 67 +++++++++++++++++++++++++++++++----------- 5 files changed, 63 insertions(+), 37 deletions(-) diff --git a/Makefile b/Makefile index 9570099..cbcb8cf 100644 --- a/Makefile +++ b/Makefile @@ -232,7 +232,6 @@ $(GEN)/esp32_boot.h: tools/source_to_string.js $(ESP32_BOOT) | $(GEN) $(GEN)/dump_web_opcodes: \ web/dump_web_opcodes.c \ common/opcodes.h \ - common/extra_opcodes.h \ common/floats.h | $(GEN) $(CXX) $(CFLAGS) $< -o $@ @@ -242,7 +241,7 @@ $(GEN)/web_cases.js: $(GEN)/dump_web_opcodes | $(GEN) $(GEN)/web_dict.js: $(GEN)/dump_web_opcodes | $(GEN) $< dict >$@ -WEB_BOOT = $(COMMON_PHASE1) \ +WEB_BOOT = $(COMMON_PHASE1) common/extra.fs \ posix/posix.fs posix/allocation.fs posix/termios.fs \ $(COMMON_PHASE2) \ posix/autoboot.fs \ diff --git a/common/opcodes.h b/common/opcodes.h index b449a43..ece43b4 100644 --- a/common/opcodes.h +++ b/common/opcodes.h @@ -123,7 +123,7 @@ typedef struct { YV(internals, DODOES, DUP; tos = w + sizeof(cell_t) * 2; \ ++rp; *rp = (cell_t) ip; \ ip = (cell_t *) *(cell_t *) (w + sizeof(cell_t))) \ - YV(internals, ALITERAL, COMMA(g_sys->DOLIT_XT); COMMA(tos); DROP) \ + XV(internals, "ALITERAL", ALITERAL, COMMA(g_sys->DOLIT_XT); COMMA(tos); DROP) \ Y(CELL, DUP; tos = sizeof(cell_t)) \ XV(internals, "LONG-SIZE", LONG_SIZE, DUP; tos = sizeof(long)) \ Y(FIND, tos = find((const char *) *sp, tos); --sp) \ @@ -131,15 +131,15 @@ typedef struct { XV(internals, "S>NUMBER?", \ CONVERT, tos = convert((const char *) *sp, tos, g_sys->base, sp); \ if (!tos) --sp) \ - Y(CREATE, DUP; DUP; tos = parse(32, sp); \ - create((const char *) *sp, tos, 0, ADDROF(DOCREATE)); \ - COMMA(0); DROPn(2)) \ - Y(VARIABLE, DUP; DUP; tos = parse(32, sp); \ - create((const char *) *sp, tos, 0, ADDROF(DOVAR)); \ - COMMA(0); DROPn(2)) \ - Y(CONSTANT, DUP; DUP; tos = parse(32, sp); \ - create((const char *) *sp, tos, 0, ADDROF(DOCON)); \ - DROPn(2); COMMA(tos); DROP) \ + XV(forth, "CREATE", CREATE, DUP; DUP; tos = parse(32, sp); \ + create((const char *) *sp, tos, 0, ADDROF(DOCREATE)); \ + COMMA(0); DROPn(2)) \ + XV(forth, "VARIABLE", VARIABLE, DUP; DUP; tos = parse(32, sp); \ + create((const char *) *sp, tos, 0, ADDROF(DOVAR)); \ + COMMA(0); DROPn(2)) \ + XV(forth, "CONSTANT", CONSTANT, DUP; DUP; tos = parse(32, sp); \ + create((const char *) *sp, tos, 0, ADDROF(DOCON)); \ + DROPn(2); COMMA(tos); DROP) \ X("DOES>", DOES, DOES(ip); ip = (cell_t *) *rp; --rp) \ Y(IMMEDIATE, DOIMMEDIATE()) \ XV(internals, "'SYS", SYS, DUP; tos = (cell_t) g_sys) \ diff --git a/web/dump_web_opcodes.c b/web/dump_web_opcodes.c index 3ba9da2..03fe0ce 100644 --- a/web/dump_web_opcodes.c +++ b/web/dump_web_opcodes.c @@ -16,7 +16,6 @@ #include #include "common/opcodes.h" -#include "common/extra_opcodes.h" #include "common/floats.h" #define PLATFORM_OPCODE_LIST \ @@ -26,7 +25,6 @@ enum { #define XV(flags, name, op, code) OP_ ## op, PLATFORM_OPCODE_LIST - EXTRA_OPCODE_LIST OPCODE_LIST #undef XV }; @@ -36,13 +34,11 @@ int main(int argc, char *argv[]) { #define XV(flags, name, op, code) \ printf(" case %d: // %s\n %s; break;\n", OP_ ## op, name, #code); PLATFORM_OPCODE_LIST - EXTRA_OPCODE_LIST OPCODE_LIST #undef XV } else if (argc == 2 && strcmp(argv[1], "dict") == 0) { #define XV(flags, name, op, code) printf(" create(" #name ", %d);\n", OP_ ## op); PLATFORM_OPCODE_LIST - EXTRA_OPCODE_LIST OPCODE_LIST #undef XV } else { diff --git a/web/fuse_web.js b/web/fuse_web.js index 8e5a779..68ea16b 100755 --- a/web/fuse_web.js +++ b/web/fuse_web.js @@ -72,10 +72,8 @@ cases = ReplaceAll(cases, '(float) ', ''); cases = ReplaceAll(cases, '0.0f', '0.0'); cases = ReplaceAll(cases, /[(]ucell_t[)] ([^ ;)]+)/, '($1>>>0)'); cases = ReplaceAll(cases, '*(w + 4)', '((i32[w>>2]|0+4||0))'); -cases = ReplaceAll(cases, 'g_sys.state', 'i32[(i32[g_sys>>2] + (3 * 4))>>2]'); -cases = ReplaceAll(cases, 'g_sys.DOLIT_XT', 'i32[(i32[g_sys>>2] + (10 * 4))>>2]|0'); -cases = ReplaceAll(cases, 'g_sys.DOEXIT_XT', 'i32[(i32[g_sys>>2] + (11 * 4))>>2]|0'); -cases = ReplaceAll(cases, '&g_sys', 'g_sys'); +cases = ReplaceAll(cases, /[&]g_sys[-][>]([A-Za-z_]+)/, 'g_sys_$1'); +cases = ReplaceAll(cases, /g_sys[-][>]([A-Za-z_]+)/, 'i32[g_sys_$1>>2]'); cases = ReplaceAll(cases, '&& OP_DOCOL', '0'); cases = ReplaceAll(cases, '&& OP_DOVAR', '1'); cases = ReplaceAll(cases, 'goto **(void **) w', 'break decode'); diff --git a/web/web.template.js b/web/web.template.js index bd39e3c..b12e8ac 100644 --- a/web/web.template.js +++ b/web/web.template.js @@ -26,20 +26,31 @@ var i32 = new Int32Array(heap); var u8 = new Uint8Array(heap); var objects = [SetEval]; var g_sys = 256; // Placed past a gap. -var g_tib = g_sys + 0 * 4; -var g_ntib = g_sys + 1 * 4; -var g_tin = g_sys + 2 * 4; -var g_state = g_sys + 3 * 4; -var g_base = g_sys + 4 * 4; -var g_heap = g_sys + 5 * 4; -var g_current = g_sys + 6 * 4; -var g_context = g_sys + 7 * 4; -var g_notfound = g_sys + 8 * 4; -var g_argc = g_sys + 9 * 4; -var g_argv = g_sys + 10 * 4; -var g_ip = g_sys + 11 * 4; -var g_sp = g_sys + 12 * 4; -var g_rp = g_sys + 13 * 4; +var g_sys_heap = g_sys + 0 * 4; +var g_sys_current = g_sys + 1 * 4; +var g_sys_context = g_sys + 2 * 4; +var g_sys_latestxt = g_sys + 3 * 4; +var g_sys_notfound = g_sys + 4 * 4; +var g_sys_heap_start = g_sys + 5 * 4; +var g_sys_heap_size = g_sys + 6 * 4; +var g_sys_stack_cells = g_sys + 7 * 4; +var g_sys_boot = g_sys + 8 * 4; +var g_sys_boot_size = g_sys + 9 * 4; +var g_sys_tib = g_sys + 10 * 4; +var g_sys_ntib = g_sys + 11 * 4; +var g_sys_tin = g_sys + 12 * 4; +var g_sys_state = g_sys + 13 * 4; +var g_sys_base = g_sys + 14 * 4; +var g_sys_argc = g_sys + 15 * 4; +var g_sys_argv = g_sys + 16 * 4; +var g_sys_runner = g_sys + 17 * 4; +var g_sys_rp = g_sys + 18 * 4; +var g_sys_DOLIT_XT = g_sys + 19 * 4; +var g_sys_DOFLIT_XT = g_sys + 20 * 4; +var g_sys_DOEXIT_XT = g_sys + 21 * 4; +var g_sys_YIELD_XT = g_sys + 22 * 4; +var g_sys_DOCREATE_OP = g_sys + 23 * 4; +var g_sys_builtins = g_sys + 24 * 4; function SetEval(sp) { var index = i32[sp--]; @@ -190,9 +201,31 @@ function VM(stdlib, foreign, heap) { var f32 = new stdlib.Float32Array(heap); const g_sys = 256; - const g_ip = 296; // g_sys + 10 * 4 - const g_sp = 300; // g_sys + 11 * 4 - const g_rp = 304; // g_sys + 12 * 4 + var g_sys_heap = g_sys + 0 * 4; + var g_sys_current = g_sys + 1 * 4; + var g_sys_context = g_sys + 2 * 4; + var g_sys_latestxt = g_sys + 3 * 4; + var g_sys_notfound = g_sys + 4 * 4; + var g_sys_heap_start = g_sys + 5 * 4; + var g_sys_heap_size = g_sys + 6 * 4; + var g_sys_stack_cells = g_sys + 7 * 4; + var g_sys_boot = g_sys + 8 * 4; + var g_sys_boot_size = g_sys + 9 * 4; + var g_sys_tib = g_sys + 10 * 4; + var g_sys_ntib = g_sys + 11 * 4; + var g_sys_tin = g_sys + 12 * 4; + var g_sys_state = g_sys + 13 * 4; + var g_sys_base = g_sys + 14 * 4; + var g_sys_argc = g_sys + 15 * 4; + var g_sys_argv = g_sys + 16 * 4; + var g_sys_runner = g_sys + 17 * 4; + var g_sys_rp = g_sys + 18 * 4; + var g_sys_DOLIT_XT = g_sys + 19 * 4; + var g_sys_DOFLIT_XT = g_sys + 20 * 4; + var g_sys_DOEXIT_XT = g_sys + 21 * 4; + var g_sys_YIELD_XT = g_sys + 22 * 4; + var g_sys_DOCREATE_OP = g_sys + 23 * 4; + var g_sys_builtins = g_sys + 24 * 4; function run() { var tos = 0;