From 9d874a08fb9d533cca43f8b088125b588b4c365f Mon Sep 17 00:00:00 2001 From: Brad Nelson Date: Tue, 12 Jul 2022 18:13:56 -0700 Subject: [PATCH] Replaced XV with Z to make things uniform + fixed remaining non-valid asm.js. --- common/extra_opcodes.h | 14 +++++------ common/interp.h | 8 +++---- common/opcodes.h | 51 +++++++++++++++++++++------------------- esp32/print-builtins.cpp | 13 +++++----- esp32/sim_main.cpp | 4 ++-- web/dump_web_opcodes.c | 14 ++++++----- web/fuse_web.js | 2 ++ web/web.template.js | 4 ++++ windows/interp.h | 12 +++++----- 9 files changed, 67 insertions(+), 55 deletions(-) diff --git a/common/extra_opcodes.h b/common/extra_opcodes.h index b20105d..b208b22 100644 --- a/common/extra_opcodes.h +++ b/common/extra_opcodes.h @@ -17,9 +17,9 @@ Y(rdrop, --rp) \ XV(forth, "*/", STARSLASH, SSMOD_FUNC; NIP) \ X("*", STAR, tos *= *sp--) \ - XV(forth, "/mod", SLASHMOD, DUP; *sp = 1; SSMOD_FUNC) \ - XV(forth, "/", SLASH, DUP; *sp = 1; SSMOD_FUNC; NIP) \ - XV(forth, "mod", mod, DUP; *sp = 1; SSMOD_FUNC; DROP) \ + X("/mod", SLASHMOD, DUP; *sp = 1; SSMOD_FUNC) \ + X("/", SLASH, DUP; *sp = 1; SSMOD_FUNC; NIP) \ + Y(mod, DUP; *sp = 1; SSMOD_FUNC; DROP) \ Y(invert, tos = ~tos) \ Y(negate, tos = -tos) \ X("-", MINUS, tos = (*sp--) - tos) \ @@ -43,8 +43,8 @@ X("4/", FOURSLASH, tos = tos >> 2) \ X("+!", PLUSSTORE, *(cell_t *) tos += *sp--; DROP) \ X("cell+", CELLPLUS, tos += sizeof(cell_t)) \ - X("cells", CELLSTAR, tos *= sizeof(cell_t)) \ - XV(forth, "cell/", CELLSLASH, DUP; tos = sizeof(cell_t); DUP; *sp = 1; SSMOD_FUNC; NIP) \ + Y(cells, tos *= sizeof(cell_t)) \ + X("cell/", CELLSLASH, DUP; tos = sizeof(cell_t); DUP; *sp = 1; SSMOD_FUNC; NIP) \ X("2drop", TWODROP, NIP; DROP) \ X("2dup", TWODUP, DUP; tos = sp[-1]; DUP; tos = sp[-1]) \ X("2@", TWOAT, DUP; *sp = *(cell_t *) tos; tos = ((cell_t *) tos)[1]) \ @@ -62,8 +62,8 @@ Y(allot, g_sys->heap = (cell_t *) (tos + (cell_t) g_sys->heap); DROP) \ Y(aligned, tos = CELL_ALIGNED(tos)) \ Y(align, g_sys->heap = (cell_t *) CELL_ALIGNED(g_sys->heap)) \ - XV(forth, ",", COMMA, COMMA(tos); DROP) \ - XV(forth, "c,", CCOMMA, CCOMMA(tos); DROP) \ + X(",", COMMA, COMMA(tos); DROP) \ + X("c,", CCOMMA, CCOMMA(tos); DROP) \ X(">flags", TOFLAGS, tos = *TOFLAGS(tos)) \ X(">params", TOPARAMS, tos = *TOPARAMS(tos)) \ X(">size", TOSIZE, tos = TOSIZE(tos)) \ diff --git a/common/interp.h b/common/interp.h index 84b0aad..095aeae 100644 --- a/common/interp.h +++ b/common/interp.h @@ -18,13 +18,13 @@ static cell_t *forth_run(cell_t *init_rp) { static const BUILTIN_WORD builtins[] = { -#define XV(flags, name, op, code) \ +#define Z(flags, name, op, code) \ name, ((VOC_ ## flags >> 8) & 0xff) | BUILTIN_MARK, \ sizeof(name) - 1, (VOC_ ## flags & 0xff), && OP_ ## op, PLATFORM_OPCODE_LIST EXTRA_OPCODE_LIST OPCODE_LIST -#undef XV +#undef Z 0, 0, 0, 0, 0, }; @@ -36,9 +36,9 @@ static cell_t *forth_run(cell_t *init_rp) { register cell_t *ip, *rp, *sp, tos, w; register float *fp, ft; rp = init_rp; UNPARK; NEXT; -#define XV(flags, name, op, code) OP_ ## op: { code; } NEXT; +#define Z(flags, name, op, code) OP_ ## op: { code; } NEXT; PLATFORM_OPCODE_LIST EXTRA_OPCODE_LIST OPCODE_LIST -#undef XV +#undef Z } diff --git a/common/opcodes.h b/common/opcodes.h index e57b038..346c556 100644 --- a/common/opcodes.h +++ b/common/opcodes.h @@ -20,9 +20,10 @@ typedef intptr_t cell_t; typedef uintptr_t ucell_t; -#define YV(flags, op, code) XV(flags, #op, op, code) -#define X(name, op, code) XV(forth, name, op, code) -#define Y(op, code) XV(forth, #op, op, code) +#define XV(flags, name, op, code) Z(flags, name, op, code) +#define YV(flags, op, code) Z(flags, #op, op, code) +#define X(name, op, code) Z(forth, name, op, code) +#define Y(op, code) Z(forth, #op, op, code) #define NIP (--sp) #define NIPn(n) (sp -= (n)) @@ -30,10 +31,6 @@ typedef uintptr_t ucell_t; #define DROPn(n) (NIPn(n-1), DROP) #define DUP (*++sp = tos) #define PUSH DUP; tos = (cell_t) -#define COMMA(n) *g_sys->heap++ = (n) -#define CCOMMA(n) *(uint8_t *) g_sys->heap = (n); \ - g_sys->heap = (cell_t *) (1 + ((cell_t) g_sys->heap)); -#define DOES(ip) **g_sys->current = (cell_t) ADDROF(DODOES); (*g_sys->current)[1] = (cell_t) ip #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 @@ -48,8 +45,14 @@ typedef uintptr_t ucell_t; #define TOBODY(xt) (((cell_t *) xt) + ((void *) *((cell_t *) xt) == ADDROF(DOCREATE) || \ (void *) *((cell_t *) xt) == ADDROF(DODOES) ? 2 : 1)) -#define DOIMMEDIATE() *TOFLAGS(*g_sys->current) |= IMMEDIATE -#define UNSMUDGE() *TOFLAGS(*g_sys->current) &= ~SMUDGE; finish() +#ifndef COMMA +# define COMMA(n) *g_sys->heap++ = (n) +# define CCOMMA(n) *(uint8_t *) g_sys->heap = (n); \ + g_sys->heap = (cell_t *) (1 + ((cell_t) g_sys->heap)); +# define DOES(ip) **g_sys->current = (cell_t) ADDROF(DODOES); (*g_sys->current)[1] = (cell_t) ip +# define DOIMMEDIATE() *TOFLAGS(*g_sys->current) |= IMMEDIATE +# define UNSMUDGE() *TOFLAGS(*g_sys->current) &= ~SMUDGE; finish() +#endif #ifndef SSMOD_FUNC # if __SIZEOF_POINTER__ == 8 @@ -82,17 +85,17 @@ typedef struct { X("+", PLUS, tos += *sp--) \ X("U/MOD", USMOD, w = *sp; *sp = (ucell_t) w % (ucell_t) tos; \ tos = (ucell_t) w / (ucell_t) tos) \ - XV(forth, "*/MOD", SSMOD, SSMOD_FUNC) \ + X("*/MOD", SSMOD, SSMOD_FUNC) \ Y(LSHIFT, tos = (*sp << tos); --sp) \ Y(RSHIFT, tos = (((ucell_t) *sp) >> tos); --sp) \ Y(ARSHIFT, tos = (*sp >> tos); --sp) \ Y(AND, tos &= *sp--) \ Y(OR, tos |= *sp--) \ Y(XOR, tos ^= *sp--) \ - XV(forth, "DUP", ALTDUP, DUP) \ + X("DUP", ALTDUP, DUP) \ Y(SWAP, w = tos; tos = *sp; *sp = w) \ Y(OVER, DUP; tos = sp[-1]) \ - XV(forth, "DROP", ALTDROP, DROP) \ + X("DROP", ALTDROP, DROP) \ X("@", AT, tos = *(cell_t *) tos) \ X("SL@", SLAT, tos = *(int32_t *) tos) \ X("UL@", ULAT, tos = *(uint32_t *) tos) \ @@ -123,7 +126,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))) \ - XV(internals, "ALITERAL", ALITERAL, COMMA(g_sys->DOLIT_XT); COMMA(tos); DROP) \ + YV(internals, 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,17 +134,17 @@ typedef struct { XV(internals, "S>NUMBER?", \ CONVERT, tos = convert((const char *) *sp, tos, g_sys->base, sp); \ if (!tos) --sp) \ - 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) \ - XV(forth, "DOES>", DOES, DOES(ip); ip = (cell_t *) *rp; --rp) \ - XV(forth, "IMMEDIATE", IMMEDIATE, DOIMMEDIATE()) \ + 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) \ + X("DOES>", DOES, DOES(ip); ip = (cell_t *) *rp; --rp) \ + Y(IMMEDIATE, DOIMMEDIATE()) \ XV(internals, "'SYS", SYS, DUP; tos = (cell_t) g_sys) \ YV(internals, YIELD, PARK; return rp) \ X(":", COLON, DUP; DUP; tos = parse(32, sp); \ diff --git a/esp32/print-builtins.cpp b/esp32/print-builtins.cpp index 9d96fac..eba45ff 100644 --- a/esp32/print-builtins.cpp +++ b/esp32/print-builtins.cpp @@ -23,16 +23,17 @@ #define USER_WORDS #include "builtins.h" -#define YV(flags, op, code) XV(flags, #op, op, code) -#define X(name, op, code) XV(forth, name, op, code) -#define Y(op, code) XV(forth, #op, op, code) +#define XV(flags, name, op, code) Z(flags, name, op, code) +#define YV(flags, op, code) Z(flags, #op, op, code) +#define X(name, op, code) Z(forth, name, op, code) +#define Y(op, code) Z(forth, #op, op, code) int main() { printf("#define PLATFORM_SIMULATED_OPCODE_LIST \\\n"); -#define XV(flags, str, name, code) \ - printf(" XV(%s, \"%s\", %s, DUP; sp = simulated(sp, STR_%s); DROP) \\\n", #flags, str, #name, #name); +#define Z(flags, str, name, code) \ + printf(" Z(%s, \"%s\", %s, DUP; sp = simulated(sp, STR_%s); DROP) \\\n", #flags, str, #name, #name); PLATFORM_OPCODE_LIST -#undef XV +#undef Z printf("\n"); return 0; } diff --git a/esp32/sim_main.cpp b/esp32/sim_main.cpp index 4a25c76..38bfd9b 100644 --- a/esp32/sim_main.cpp +++ b/esp32/sim_main.cpp @@ -28,9 +28,9 @@ static cell_t *simulated(cell_t *sp, const char *op); #include "gen/esp32_sim_opcodes.h" -#define XV(flags, str, name, code) static const char *STR_ ## name = str; +#define Z(flags, str, name, code) static const char *STR_ ## name = str; PLATFORM_SIMULATED_OPCODE_LIST -#undef XV +#undef Z #define MALLOC_CAP_INTERNAL 0 #define heap_caps_get_largest_free_block(x) SIM_HEAP_SIZE diff --git a/web/dump_web_opcodes.c b/web/dump_web_opcodes.c index 25c374b..2113eaf 100644 --- a/web/dump_web_opcodes.c +++ b/web/dump_web_opcodes.c @@ -16,6 +16,8 @@ #include #define JMPW break decode +#define SSMOD_FUNC SSMOD_FUNC +#define COMMA COMMA #include "common/opcodes.h" #include "common/floats.h" @@ -28,10 +30,10 @@ FLOATING_POINT_LIST enum { -#define XV(flags, name, op, code) OP_ ## op, +#define Z(flags, name, op, code) OP_ ## op, PLATFORM_OPCODE_LIST OPCODE_LIST -#undef XV +#undef Z }; enum { @@ -49,24 +51,24 @@ enum { int main(int argc, char *argv[]) { if (argc == 2 && strcmp(argv[1], "cases") == 0) { -#define XV(flags, name, op, code) \ +#define Z(flags, name, op, code) \ printf(" case %d: // %s\n %s; break;\n", OP_ ## op, name, #code); PLATFORM_OPCODE_LIST OPCODE_LIST -#undef XV +#undef Z } else if (argc == 2 && strcmp(argv[1], "dict") == 0) { #define V(name) \ printf(" create(\"" #name "-builtins\", %d);\n", BUILTIN_FORK, OP_DOCREATE); \ printf(" comma(%d);\n", VOC_ ## name); VOCABULARY_LIST #undef V -#define XV(flags, name, op, code) \ +#define Z(flags, name, op, code) \ printf(" builtin(" #name ", %d, %d, %d);\n", \ ((VOC_ ## flags >> 8) & 0xff) | BUILTIN_MARK, \ (VOC_ ## flags & 0xff), OP_ ## op); PLATFORM_OPCODE_LIST OPCODE_LIST -#undef XV +#undef Z } else if (argc == 2 && strcmp(argv[1], "sys") == 0) { G_SYS *g_sys = 0; #define G_SYS 256 diff --git a/web/fuse_web.js b/web/fuse_web.js index 5f77616..5f72420 100755 --- a/web/fuse_web.js +++ b/web/fuse_web.js @@ -74,6 +74,7 @@ cases = ReplaceAll(cases, /[*](.)p/, '(i32[$1p>>2]|0)'); cases = ReplaceAll(cases, 'sp[-1]', '(i32[(sp - 4)>>2]|0)'); cases = ReplaceAll(cases, /([+-]).(.)p/, '$2p = ($2p $1 4) | 0'); +cases = ReplaceAll(cases, 'sp -= (2-1)', 'sp = (sp - 4) | 0'); cases = ReplaceAll(cases, 'sp -= 2', 'sp = (sp - 8) | 0'); cases = ReplaceAll(cases, 'fp -= 2', 'fp = (fp - 8) | 0'); cases = ReplaceAll(cases, 'sizeof(cell_t)', '4'); @@ -112,6 +113,7 @@ cases = ReplaceAll(cases, /tos ([^=]?)= /, 'txx $1= '); cases = ReplaceAll(cases, ' tos', ' (tos|0)'); cases = ReplaceAll(cases, /txx ([^=]?)= /, 'tos $1= '); // Keep Together ^^^ +cases = ReplaceAll(cases, 'fp)', 'fp|0)'); cases = ReplaceAll(cases, ' (w>>>0) / (tos>>>0)', ' ((w>>>0) / (tos>>>0))|0'); cases = ReplaceAll(cases, 'COMMA(tos)', 'COMMA(tos|0)'); cases = ReplaceAll(cases, /find\(([^\n]+)\);/, 'find($1)|0;'); diff --git a/web/web.template.js b/web/web.template.js index a1dac6e..16331ed 100644 --- a/web/web.template.js +++ b/web/web.template.js @@ -207,6 +207,7 @@ function VM(stdlib, foreign, heap) { var memset = foreign.memset; var memmove = foreign.memmove; var convert = foreign.convert; + var fconvert = foreign.fconvert; var evaluate1 = foreign.evaluate1; var emitlog = foreign.log; @@ -264,7 +265,10 @@ var ffi = { UNSMUDGE: function() { console.log('unsmudge'); }, parse: function() { console.log('parse'); }, find: function() { console.log('find'); }, + memmove: function() { console.log('memmove'); }, + memset: function() { console.log('memset'); }, convert: function() { console.log('convert'); }, + fconvert: function() { console.log('fconvert'); }, evaluate1: function() { console.log('evaluate1'); }, log: function(n) { console.log(n); } }; diff --git a/windows/interp.h b/windows/interp.h index bee4b3e..9d80c87 100644 --- a/windows/interp.h +++ b/windows/interp.h @@ -17,22 +17,22 @@ #define ADDROF(x) ((void *) OP_ ## x) enum { -#define XV(flags, name, op, code) OP_ ## op, +#define Z(flags, name, op, code) OP_ ## op, PLATFORM_OPCODE_LIST EXTRA_OPCODE_LIST OPCODE_LIST -#undef XV +#undef Z }; static cell_t *forth_run(cell_t *init_rp) { static const BUILTIN_WORD builtins[] = { -#define XV(flags, name, op, code) \ +#define Z(flags, name, op, code) \ name, ((VOC_ ## flags >> 8) & 0xff) | BUILTIN_MARK, sizeof(name) - 1, \ (VOC_ ## flags & 0xff), (void *) OP_ ## op, PLATFORM_OPCODE_LIST EXTRA_OPCODE_LIST OPCODE_LIST -#undef XV +#undef Z 0, 0, 0, }; @@ -49,11 +49,11 @@ next: w = *ip++; work: switch (*(cell_t *) w & 0xff) { -#define XV(flags, name, op, code) case OP_ ## op: { code; } NEXT; +#define Z(flags, name, op, code) case OP_ ## op: { code; } NEXT; PLATFORM_OPCODE_LIST EXTRA_OPCODE_LIST OPCODE_LIST -#undef XV +#undef Z } } }