From 45fa56d271a2ead413af9b646d59ed363c1ce64d Mon Sep 17 00:00:00 2001 From: Brad Nelson Date: Fri, 25 Feb 2022 20:51:58 -0800 Subject: [PATCH] Simplify and unify ADDR_ opcodes. --- ueforth/common/interp.h | 14 ++------------ ueforth/common/opcodes.h | 29 ++++++++++++++++++----------- ueforth/web/dump_web_opcodes.c | 3 --- ueforth/windows/interp.h | 20 ++------------------ 4 files changed, 22 insertions(+), 44 deletions(-) diff --git a/ueforth/common/interp.h b/ueforth/common/interp.h index 3efff23..97b9701 100644 --- a/ueforth/common/interp.h +++ b/ueforth/common/interp.h @@ -14,11 +14,7 @@ #define JMPW goto **(void **) w #define NEXT w = *ip++; JMPW -#define ADDR_DOCOL && OP_DOCOL -#define ADDR_DOCON && OP_DOCON -#define ADDR_DOVAR && OP_DOVAR -#define ADDR_DOCREATE && OP_DOCREATE -#define ADDR_DODOES && OP_DODOES +#define ADDROF(x) (&& OP_ ## x) static cell_t *forth_run(cell_t *init_rp) { static const BUILTIN_WORD builtins[] = { @@ -33,7 +29,7 @@ static cell_t *forth_run(cell_t *init_rp) { }; if (!init_rp) { - g_sys.DOCREATE_OP = ADDR_DOCREATE; + g_sys.DOCREATE_OP = ADDROF(DOCREATE); g_sys.builtins = builtins; return 0; } @@ -45,10 +41,4 @@ static cell_t *forth_run(cell_t *init_rp) { EXTRA_OPCODE_LIST OPCODE_LIST #undef XV - OP_DOCOL: ++rp; *rp = (cell_t) ip; ip = (cell_t *) (w + sizeof(cell_t)); NEXT; - OP_DOCON: DUP; tos = *(cell_t *) (w + sizeof(cell_t)); NEXT; - OP_DOVAR: DUP; tos = w + sizeof(cell_t); NEXT; - OP_DOCREATE: DUP; tos = w + sizeof(cell_t) * 2; NEXT; - OP_DODOES: DUP; tos = w + sizeof(cell_t) * 2; - ++rp; *rp = (cell_t) ip; ip = (cell_t *) *(cell_t *) (w + sizeof(cell_t)); NEXT; } diff --git a/ueforth/common/opcodes.h b/ueforth/common/opcodes.h index 725df52..84dba4a 100644 --- a/ueforth/common/opcodes.h +++ b/ueforth/common/opcodes.h @@ -20,9 +20,9 @@ typedef intptr_t cell_t; typedef uintptr_t ucell_t; -#define YV(flags, op, code) XV(flags, #op, ID_ ## op, code) +#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, ID_ ## op, code) +#define Y(op, code) XV(forth, #op, op, code) #define NIP (--sp) #define NIPn(n) (sp -= (n)) @@ -31,7 +31,7 @@ typedef uintptr_t ucell_t; #define DUP (*++sp = tos) #define PUSH DUP; tos = (cell_t) #define COMMA(n) *g_sys.heap++ = (n) -#define DOES(ip) **g_sys.current = (cell_t) ADDR_DODOES; (*g_sys.current)[1] = (cell_t) ip +#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 @@ -43,8 +43,8 @@ typedef uintptr_t ucell_t; #define TOLINK(xt) (((cell_t *) (xt)) - 2) #define TONAME(xt) ((*TOFLAGS(xt) & BUILTIN_MARK) ? (*(char **) TOLINK(xt)) \ : (((char *) TOLINK(xt)) - CELL_ALIGNED(*TONAMELEN(xt)))) -#define TOBODY(xt) (((cell_t *) xt) + ((void *) *((cell_t *) xt) == ADDR_DOCREATE || \ - (void *) *((cell_t *) xt) == ADDR_DODOES ? 2 : 1)) +#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() @@ -86,10 +86,10 @@ typedef struct { Y(AND, tos &= *sp--) \ Y(OR, tos |= *sp--) \ Y(XOR, tos ^= *sp--) \ - Y(DUP, DUP) \ + XV(forth, "DUP", ALTDUP, DUP) \ Y(SWAP, w = tos; tos = *sp; *sp = w) \ Y(OVER, DUP; tos = sp[-1]) \ - Y(DROP, DROP) \ + XV(forth, "DROP", ALTDROP, DROP) \ X("@", AT, tos = *(cell_t *) tos) \ X("SL@", SLAT, tos = *(int32_t *) tos) \ X("UL@", ULAT, tos = *(uint32_t *) tos) \ @@ -112,6 +112,13 @@ typedef struct { YV(internals, 0BRANCH, if (!tos) ip = (cell_t *) *ip; else ++ip; DROP) \ YV(internals, DONEXT, *rp = *rp - 1; if (~*rp) ip = (cell_t *) *ip; else (--rp, ++ip)) \ YV(internals, DOLIT, DUP; tos = *ip++) \ + YV(internals, DOCOL, ++rp; *rp = (cell_t) ip; ip = (cell_t *) (w + sizeof(cell_t))) \ + YV(internals, DOCON, DUP; tos = *(cell_t *) (w + sizeof(cell_t))) \ + YV(internals, DOVAR, DUP; tos = w + sizeof(cell_t)) \ + YV(internals, DOCREATE, DUP; tos = w + sizeof(cell_t) * 2) \ + 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) \ Y(CELL, DUP; tos = sizeof(cell_t)) \ XV(internals, "LONG-SIZE", LONG_SIZE, DUP; tos = sizeof(long)) \ @@ -121,20 +128,20 @@ typedef struct { 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, ADDR_DOCREATE); \ + 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, ADDR_DOVAR); \ + 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, ADDR_DOCON); \ + 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); \ - create((const char *) *sp, tos, SMUDGE, ADDR_DOCOL); \ + create((const char *) *sp, tos, SMUDGE, ADDROF(DOCOL)); \ g_sys.state = -1; --sp; DROP) \ YV(internals, EVALUATE1, DUP; float *tfp = fp; \ sp = evaluate1(sp, &tfp); \ diff --git a/ueforth/web/dump_web_opcodes.c b/ueforth/web/dump_web_opcodes.c index 79c6b7c..45237a9 100644 --- a/ueforth/web/dump_web_opcodes.c +++ b/ueforth/web/dump_web_opcodes.c @@ -21,9 +21,6 @@ X("CALL", CALL, sp = Call(sp|0, tos|0) | 0; DROP) \ enum { - OP_DOCOL = 0, - OP_DOVAR = 1, - OP_DODOES = 2, #define XV(flags, name, op, code) OP_ ## op, PLATFORM_OPCODE_LIST OPCODE_LIST diff --git a/ueforth/windows/interp.h b/ueforth/windows/interp.h index 1193418..0543527 100644 --- a/ueforth/windows/interp.h +++ b/ueforth/windows/interp.h @@ -14,18 +14,9 @@ #define NEXT goto next #define JMPW goto work -#define ADDR_DOCOL ((void *) OP_DOCOL) -#define ADDR_DOCON ((void *) OP_DOCON) -#define ADDR_DOVAR ((void *) OP_DOVAR) -#define ADDR_DOCREATE ((void *) OP_DOCREATE) -#define ADDR_DODOES ((void *) OP_DODOES) +#define ADDROF(x) ((void *) OP_ ## x) enum { - OP_DOCOL = 0, - OP_DOCON, - OP_DOVAR, - OP_DOCREATE, - OP_DODOES, #define XV(flags, name, op, code) OP_ ## op, PLATFORM_OPCODE_LIST EXTRA_OPCODE_LIST @@ -46,7 +37,7 @@ static cell_t *forth_run(cell_t *init_rp) { }; if (!init_rp) { - g_sys.DOCREATE_OP = ADDR_DOCREATE; + g_sys.DOCREATE_OP = ADDROF(DOCREATE); g_sys.builtins = builtins; return 0; } @@ -63,13 +54,6 @@ work: EXTRA_OPCODE_LIST OPCODE_LIST #undef XV - case OP_DOCOL: ++rp; *rp = (cell_t) ip; ip = (cell_t *) (w + sizeof(cell_t)); NEXT; - case OP_DOCON: DUP; tos = *(cell_t *) (w + sizeof(cell_t)); NEXT; - case OP_DOVAR: DUP; tos = w + sizeof(cell_t); NEXT; - case OP_DOCREATE: DUP; tos = w + sizeof(cell_t) * 2; NEXT; - case OP_DODOES: DUP; tos = w + sizeof(cell_t) * 2; - ++rp; *rp = (cell_t) ip; - ip = (cell_t *) *(cell_t *) (w + sizeof(cell_t)); NEXT; } } }