Tweaks towards web version working, again...
This commit is contained in:
6
Makefile
6
Makefile
@ -229,7 +229,11 @@ ESP32_BOOT = $(COMMON_PHASE1) \
|
||||
$(GEN)/esp32_boot.h: tools/source_to_string.js $(ESP32_BOOT) | $(GEN)
|
||||
$< boot $(VERSION) $(REVISION) $(ESP32_BOOT) >$@
|
||||
|
||||
$(GEN)/dump_web_opcodes: web/dump_web_opcodes.c common/opcodes.h | $(GEN)
|
||||
$(GEN)/dump_web_opcodes: \
|
||||
web/dump_web_opcodes.c \
|
||||
common/opcodes.h \
|
||||
common/extra_opcodes.h \
|
||||
common/floats.h | $(GEN)
|
||||
$(CXX) $(CFLAGS) $< -o $@
|
||||
|
||||
$(GEN)/web_cases.js: $(GEN)/dump_web_opcodes | $(GEN)
|
||||
|
||||
@ -15,11 +15,11 @@
|
||||
#define EXTRA_OPCODE_LIST \
|
||||
Y(nip, NIP) \
|
||||
Y(rdrop, --rp) \
|
||||
X("*/", STARSLASH, SSMOD_FUNC; NIP) \
|
||||
XV(forth, "*/", STARSLASH, SSMOD_FUNC; NIP) \
|
||||
X("*", STAR, tos *= *sp--) \
|
||||
X("/mod", SLASHMOD, DUP; *sp = 1; SSMOD_FUNC) \
|
||||
X("/", SLASH, DUP; *sp = 1; SSMOD_FUNC; NIP) \
|
||||
Y(mod, DUP; *sp = 1; SSMOD_FUNC; DROP) \
|
||||
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) \
|
||||
Y(invert, tos = ~tos) \
|
||||
Y(negate, tos = -tos) \
|
||||
X("-", MINUS, tos = (*sp--) - tos) \
|
||||
@ -37,14 +37,14 @@
|
||||
Y(nl, DUP; tos = '\n') \
|
||||
X("1+", ONEPLUS, ++tos) \
|
||||
X("1-", ONEMINUS, --tos) \
|
||||
X("2*", TWOSTAR, tos <<= 1) \
|
||||
X("2/", TWOSLASH, tos >>= 1) \
|
||||
X("4*", FOURSTAR, tos <<= 2) \
|
||||
X("4/", FOURSLASH, tos >>= 2) \
|
||||
X("2*", TWOSTAR, tos = tos << 1) \
|
||||
X("2/", TWOSLASH, tos = tos >> 1) \
|
||||
X("4*", FOURSTAR, tos = tos << 2) \
|
||||
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)) \
|
||||
X("cell/", CELLSLASH, DUP; tos = sizeof(cell_t); DUP; *sp = 1; SSMOD_FUNC; NIP) \
|
||||
XV(forth, "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,9 +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)) \
|
||||
X(",", COMMA, *g_sys.heap++ = tos; DROP) \
|
||||
X("c,", CCOMMA, *((uint8_t *) g_sys.heap) = tos; DROP; \
|
||||
g_sys.heap = (cell_t *) (1 + ((cell_t) g_sys.heap))) \
|
||||
XV(forth, ",", COMMA, COMMA(tos); DROP) \
|
||||
XV(forth, "c,", CCOMMA, CCOMMA(tos); DROP) \
|
||||
X(">flags", TOFLAGS, tos = *TOFLAGS(tos)) \
|
||||
X(">params", TOPARAMS, tos = *TOPARAMS(tos)) \
|
||||
X(">size", TOSIZE, tos = TOSIZE(tos)) \
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
#include <math.h>
|
||||
|
||||
#define FLOATING_POINT_LIST \
|
||||
YV(internals, DOFLIT, *++fp = *(float *) ip++) \
|
||||
YV(internals, DOFLIT, *++fp = *(float *) ip; ++ip) \
|
||||
X("FP@", FPAT, DUP; tos = (cell_t) fp) \
|
||||
X("FP!", FPSTORE, fp = (float *) tos; DROP) \
|
||||
X("SF@", FAT, *++fp = *(float *) tos; DROP) \
|
||||
@ -24,21 +24,21 @@
|
||||
Y(FNIP, fp[-1] = *fp; --fp) \
|
||||
Y(FDROP, --fp) \
|
||||
Y(FOVER, fp[1] = fp[-1]; ++fp) \
|
||||
Y(FSWAP, float ft = fp[-1]; fp[-1] = *fp; *fp = ft) \
|
||||
Y(FROT, float ft = fp[-2]; fp[-2] = fp[-1]; fp[-1] = *fp; *fp = ft) \
|
||||
Y(FSWAP, ft = fp[-1]; fp[-1] = *fp; *fp = ft) \
|
||||
Y(FROT, ft = fp[-2]; fp[-2] = fp[-1]; fp[-1] = *fp; *fp = ft) \
|
||||
Y(FNEGATE, *fp = -*fp) \
|
||||
X("F0<", FZLESS, DUP; tos = *fp-- < 0.0f ? -1 : 0) \
|
||||
X("F0=", FZEQUAL, DUP; tos = *fp-- == 0.0f ? -1 : 0) \
|
||||
X("F0<", FZLESS, DUP; tos = *fp < 0.0f ? -1 : 0; --fp) \
|
||||
X("F0=", FZEQUAL, DUP; tos = *fp == 0.0f ? -1 : 0; --fp) \
|
||||
X("F=", FEQUAL, DUP; tos = fp[-1] == fp[0] ? -1 : 0; fp -= 2) \
|
||||
X("F<", FLESS, DUP; tos = fp[-1] < fp[0] ? -1 : 0; fp -= 2) \
|
||||
X("F>", FGREATER, DUP; tos = fp[-1] > fp[0] ? -1 : 0; fp -= 2) \
|
||||
X("F<>", FNEQUAL, DUP; tos = fp[-1] != fp[0] ? -1 : 0; fp -= 2) \
|
||||
X("F<=", FLESSEQ, DUP; tos = fp[-1] <= fp[0] ? -1 : 0; fp -= 2) \
|
||||
X("F>=", FGREATEREQ, DUP; tos = fp[-1] >= fp[0] ? -1 : 0; fp -= 2) \
|
||||
X("F+", FPLUS, fp[-1] += *fp; --fp) \
|
||||
X("F-", FMINUS, fp[-1] -= *fp; --fp) \
|
||||
X("F*", FSTAR, fp[-1] *= *fp; --fp) \
|
||||
X("F/", FSLASH, fp[-1] /= *fp; --fp) \
|
||||
X("F+", FPLUS, fp[-1] = fp[-1] + *fp; --fp) \
|
||||
X("F-", FMINUS, fp[-1] = fp[-1] - *fp; --fp) \
|
||||
X("F*", FSTAR, fp[-1] = fp[-1] * *fp; --fp) \
|
||||
X("F/", FSLASH, fp[-1] = fp[-1] / *fp; --fp) \
|
||||
X("1/F", FINVERSE, *fp = 1.0 / *fp) \
|
||||
X("S>F", STOF, *++fp = (float) tos; DROP) \
|
||||
X("F>S", FTOS, DUP; tos = (cell_t) *fp--) \
|
||||
@ -46,7 +46,7 @@
|
||||
Y(SFLOAT, DUP; tos = sizeof(float)) \
|
||||
Y(SFLOATS, tos *= sizeof(float)) \
|
||||
X("SFLOAT+", SFLOATPLUS, tos += sizeof(float)) \
|
||||
X("PI", PI_CONST, *++fp = 3.14159265359f) \
|
||||
X("PI", PI_CONST, *++fp = (float) 3.14159265359) \
|
||||
Y(FSIN, *fp = sin(*fp)) \
|
||||
Y(FCOS, *fp = cos(*fp)) \
|
||||
Y(FSINCOS, fp[1] = cos(*fp); *fp = sin(*fp); ++fp) \
|
||||
|
||||
@ -34,7 +34,7 @@ static cell_t *forth_run(cell_t *init_rp) {
|
||||
return 0;
|
||||
}
|
||||
register cell_t *ip, *rp, *sp, tos, w;
|
||||
register float *fp;
|
||||
register float *fp, ft;
|
||||
rp = init_rp; UNPARK; NEXT;
|
||||
#define XV(flags, name, op, code) OP_ ## op: { code; } NEXT;
|
||||
PLATFORM_OPCODE_LIST
|
||||
|
||||
@ -31,6 +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 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
|
||||
@ -80,10 +81,10 @@ 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) \
|
||||
X("*/MOD", SSMOD, SSMOD_FUNC) \
|
||||
Y(LSHIFT, tos = (*sp-- << tos)) \
|
||||
Y(RSHIFT, tos = (((ucell_t) *sp--) >> tos)) \
|
||||
Y(ARSHIFT, tos = (*sp-- >> tos)) \
|
||||
XV(forth, "*/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--) \
|
||||
@ -113,7 +114,7 @@ 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, DOSET, *((cell_t *) *ip++) = tos; DROP) \
|
||||
YV(internals, DOSET, *((cell_t *) *ip) = tos; ++ip; DROP) \
|
||||
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)) \
|
||||
|
||||
@ -16,13 +16,17 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "common/opcodes.h"
|
||||
#include "common/extra_opcodes.h"
|
||||
#include "common/floats.h"
|
||||
|
||||
#define PLATFORM_OPCODE_LIST \
|
||||
X("CALL", CALL, sp = Call(sp|0, tos|0) | 0; DROP) \
|
||||
FLOATING_POINT_LIST
|
||||
|
||||
enum {
|
||||
#define XV(flags, name, op, code) OP_ ## op,
|
||||
PLATFORM_OPCODE_LIST
|
||||
EXTRA_OPCODE_LIST
|
||||
OPCODE_LIST
|
||||
#undef XV
|
||||
};
|
||||
@ -32,11 +36,13 @@ 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 {
|
||||
|
||||
@ -33,27 +33,45 @@ cases = ReplaceAll(cases, 'DROP', 'tos = *sp--');
|
||||
cases = ReplaceAll(cases, 'DUP', '*++sp = tos');
|
||||
cases = ReplaceAll(cases, 'tos += *sp--', 'tos = (tos + *sp)|0; --sp');
|
||||
cases = ReplaceAll(cases, /tos (.)= /, 'tos = tos $1 ');
|
||||
cases = ReplaceAll(cases, '*((cell_t *) *ip) = ', 'i32[i32[ip>>2]>>2] = ');
|
||||
cases = ReplaceAll(cases, /[*](.)p[+][+]/, '*$1p, ++$1p');
|
||||
cases = ReplaceAll(cases, /[*](.)p[-][-]/, '*$1p, --$1p');
|
||||
cases = ReplaceAll(cases, /[*][+][+](.)p/, '++$1p, *$1p');
|
||||
cases = ReplaceAll(cases, '*(cell_t *) tos = ', 'i32[tos>>2] = ');
|
||||
cases = ReplaceAll(cases, '*(int32_t *) tos = ', 'i32[tos>>2] = ');
|
||||
cases = ReplaceAll(cases, '*(int16_t *) tos = ', 'i16[tos>>2] = ');
|
||||
cases = ReplaceAll(cases, '*(uint8_t *) tos = ', 'u8[tos] = ');
|
||||
cases = ReplaceAll(cases, '*(float *) tos = ', 'f32[tos>>2] = ');
|
||||
cases = ReplaceAll(cases, '*(cell_t *) tos', '(i32[tos>>2]|0)');
|
||||
cases = ReplaceAll(cases, '*(int32_t *) tos', '(i32[tos>>2]|0)');
|
||||
cases = ReplaceAll(cases, '*(uint32_t *) tos', '(i32[tos>>2]>>>0)');
|
||||
cases = ReplaceAll(cases, '*(int16_t *) tos', '(i16[tos>>2]|0)');
|
||||
cases = ReplaceAll(cases, '*(uint16_t *) tos', '(i16[tos>>2]>>>0)');
|
||||
cases = ReplaceAll(cases, '*(uint8_t *) tos', '(u8[tos]|0)');
|
||||
cases = ReplaceAll(cases, '*(float *) tos', 'f32[tos>>2]');
|
||||
cases = ReplaceAll(cases, '*(float *) ip', 'f32[ip>>2]');
|
||||
cases = ReplaceAll(cases, '*fp = ', 'f32[fp>>2] = ');
|
||||
cases = ReplaceAll(cases, /[*](.)p = /, 'i32[$1p>>2] = ');
|
||||
cases = ReplaceAll(cases, 'sp[-1] = ', 'i32[(sp - 4)>>2] = ');
|
||||
cases = ReplaceAll(cases, 'fp[-1] = ', 'f32[(fp - 4)>>2] = ');
|
||||
cases = ReplaceAll(cases, '*fp', 'f32[fp>>2]');
|
||||
cases = ReplaceAll(cases, /[*](.)p/, '(i32[$1p>>2]|0)');
|
||||
cases = ReplaceAll(cases, 'sp[-1]', '(i32[(sp - 4)>>2]|0)');
|
||||
cases = ReplaceAll(cases, 'fp[-1]', '(f32[(fp - 4)>>2]|0)');
|
||||
cases = ReplaceAll(cases, /([+-]).(.)p/, '$2p = ($2p $1 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');
|
||||
cases = ReplaceAll(cases, 'sizeof(float)', '4');
|
||||
cases = ReplaceAll(cases, '(void *) ', '');
|
||||
cases = ReplaceAll(cases, '(const char *) ', '');
|
||||
cases = ReplaceAll(cases, '(cell_t *) ', '');
|
||||
cases = ReplaceAll(cases, '(cell_t) ', '');
|
||||
cases = ReplaceAll(cases, '(float *) ', '');
|
||||
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');
|
||||
|
||||
@ -156,9 +156,22 @@ function VM(stdlib, foreign, heap) {
|
||||
|
||||
var imul = stdlib.Math.imul;
|
||||
|
||||
var sqrt = stdlib.Math.sqrt;
|
||||
var sin = stdlib.Math.sin;
|
||||
var cos = stdlib.Math.cos;
|
||||
var atan2 = stdlib.Math.atan2;
|
||||
var floor = stdlib.Math.floor;
|
||||
var exp = stdlib.Math.exp;
|
||||
var log = stdlib.Math.log;
|
||||
var pow = stdlib.Math.pow;
|
||||
var fabs = stdlib.Math.abs;
|
||||
var fmin = stdlib.Math.min;
|
||||
var fmax = stdlib.Math.max;
|
||||
|
||||
var SSMOD = foreign.SSMOD;
|
||||
var Call = foreign.Call;
|
||||
var COMMA = foreign.COMMA;
|
||||
var CCOMMA = foreign.CCOMMA;
|
||||
var DOES = foreign.DOES;
|
||||
var DOIMMEDIATE = foreign.DOIMMEDIATE;
|
||||
var UNSMUDGE = foreign.UNSMUDGE;
|
||||
@ -172,7 +185,9 @@ function VM(stdlib, foreign, heap) {
|
||||
var log = foreign.log;
|
||||
|
||||
var u8 = new stdlib.Uint8Array(heap);
|
||||
var i16 = new stdlib.Int16Array(heap);
|
||||
var i32 = new stdlib.Int32Array(heap);
|
||||
var f32 = new stdlib.Float32Array(heap);
|
||||
|
||||
const g_sys = 256;
|
||||
const g_ip = 296; // g_sys + 10 * 4
|
||||
@ -184,6 +199,7 @@ function VM(stdlib, foreign, heap) {
|
||||
var ip = 0;
|
||||
var sp = 0;
|
||||
var rp = 0;
|
||||
var fp = 0;
|
||||
var w = 0;
|
||||
var ir = 0;
|
||||
sp = i32[g_sp>>2]|0;
|
||||
@ -232,6 +248,7 @@ var ffi = {
|
||||
create: function() { console.log('create'); },
|
||||
parse: function() { console.log('parse'); },
|
||||
COMMA: function(n) { i32[i32[g_heap>>2]] = n; i32[g_heap>>2] += 4; console.log('comma'); },
|
||||
CCOMMA: function(n) { u8[i32[g_heap>>2]] = n; i32[g_heap>>2] += 1; console.log('ccomma'); },
|
||||
SSMOD: function() { console.log('ssmod'); },
|
||||
DOES: function() { console.log('does'); },
|
||||
DOIMMEDIATE: function() { console.log('immediate'); },
|
||||
|
||||
@ -42,7 +42,7 @@ static cell_t *forth_run(cell_t *init_rp) {
|
||||
return 0;
|
||||
}
|
||||
register cell_t *ip, *rp, *sp, tos, w;
|
||||
register float *fp;
|
||||
register float *fp, ft;
|
||||
rp = init_rp; UNPARK;
|
||||
for (;;) {
|
||||
next:
|
||||
|
||||
Reference in New Issue
Block a user