Tweaks for asmjs.
This commit is contained in:
3
Makefile
3
Makefile
@ -232,7 +232,6 @@ $(GEN)/esp32_boot.h: tools/source_to_string.js $(ESP32_BOOT) | $(GEN)
|
|||||||
$(GEN)/dump_web_opcodes: \
|
$(GEN)/dump_web_opcodes: \
|
||||||
web/dump_web_opcodes.c \
|
web/dump_web_opcodes.c \
|
||||||
common/opcodes.h \
|
common/opcodes.h \
|
||||||
common/extra_opcodes.h \
|
|
||||||
common/floats.h | $(GEN)
|
common/floats.h | $(GEN)
|
||||||
$(CXX) $(CFLAGS) $< -o $@
|
$(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)
|
$(GEN)/web_dict.js: $(GEN)/dump_web_opcodes | $(GEN)
|
||||||
$< dict >$@
|
$< dict >$@
|
||||||
|
|
||||||
WEB_BOOT = $(COMMON_PHASE1) \
|
WEB_BOOT = $(COMMON_PHASE1) common/extra.fs \
|
||||||
posix/posix.fs posix/allocation.fs posix/termios.fs \
|
posix/posix.fs posix/allocation.fs posix/termios.fs \
|
||||||
$(COMMON_PHASE2) \
|
$(COMMON_PHASE2) \
|
||||||
posix/autoboot.fs \
|
posix/autoboot.fs \
|
||||||
|
|||||||
@ -123,7 +123,7 @@ typedef struct {
|
|||||||
YV(internals, DODOES, DUP; tos = w + sizeof(cell_t) * 2; \
|
YV(internals, DODOES, DUP; tos = w + sizeof(cell_t) * 2; \
|
||||||
++rp; *rp = (cell_t) ip; \
|
++rp; *rp = (cell_t) ip; \
|
||||||
ip = (cell_t *) *(cell_t *) (w + sizeof(cell_t))) \
|
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)) \
|
Y(CELL, DUP; tos = sizeof(cell_t)) \
|
||||||
XV(internals, "LONG-SIZE", LONG_SIZE, DUP; tos = sizeof(long)) \
|
XV(internals, "LONG-SIZE", LONG_SIZE, DUP; tos = sizeof(long)) \
|
||||||
Y(FIND, tos = find((const char *) *sp, tos); --sp) \
|
Y(FIND, tos = find((const char *) *sp, tos); --sp) \
|
||||||
@ -131,15 +131,15 @@ typedef struct {
|
|||||||
XV(internals, "S>NUMBER?", \
|
XV(internals, "S>NUMBER?", \
|
||||||
CONVERT, tos = convert((const char *) *sp, tos, g_sys->base, sp); \
|
CONVERT, tos = convert((const char *) *sp, tos, g_sys->base, sp); \
|
||||||
if (!tos) --sp) \
|
if (!tos) --sp) \
|
||||||
Y(CREATE, DUP; DUP; tos = parse(32, sp); \
|
XV(forth, "CREATE", CREATE, DUP; DUP; tos = parse(32, sp); \
|
||||||
create((const char *) *sp, tos, 0, ADDROF(DOCREATE)); \
|
create((const char *) *sp, tos, 0, ADDROF(DOCREATE)); \
|
||||||
COMMA(0); DROPn(2)) \
|
COMMA(0); DROPn(2)) \
|
||||||
Y(VARIABLE, DUP; DUP; tos = parse(32, sp); \
|
XV(forth, "VARIABLE", VARIABLE, DUP; DUP; tos = parse(32, sp); \
|
||||||
create((const char *) *sp, tos, 0, ADDROF(DOVAR)); \
|
create((const char *) *sp, tos, 0, ADDROF(DOVAR)); \
|
||||||
COMMA(0); DROPn(2)) \
|
COMMA(0); DROPn(2)) \
|
||||||
Y(CONSTANT, DUP; DUP; tos = parse(32, sp); \
|
XV(forth, "CONSTANT", CONSTANT, DUP; DUP; tos = parse(32, sp); \
|
||||||
create((const char *) *sp, tos, 0, ADDROF(DOCON)); \
|
create((const char *) *sp, tos, 0, ADDROF(DOCON)); \
|
||||||
DROPn(2); COMMA(tos); DROP) \
|
DROPn(2); COMMA(tos); DROP) \
|
||||||
X("DOES>", DOES, DOES(ip); ip = (cell_t *) *rp; --rp) \
|
X("DOES>", DOES, DOES(ip); ip = (cell_t *) *rp; --rp) \
|
||||||
Y(IMMEDIATE, DOIMMEDIATE()) \
|
Y(IMMEDIATE, DOIMMEDIATE()) \
|
||||||
XV(internals, "'SYS", SYS, DUP; tos = (cell_t) g_sys) \
|
XV(internals, "'SYS", SYS, DUP; tos = (cell_t) g_sys) \
|
||||||
|
|||||||
@ -16,7 +16,6 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "common/opcodes.h"
|
#include "common/opcodes.h"
|
||||||
#include "common/extra_opcodes.h"
|
|
||||||
#include "common/floats.h"
|
#include "common/floats.h"
|
||||||
|
|
||||||
#define PLATFORM_OPCODE_LIST \
|
#define PLATFORM_OPCODE_LIST \
|
||||||
@ -26,7 +25,6 @@
|
|||||||
enum {
|
enum {
|
||||||
#define XV(flags, name, op, code) OP_ ## op,
|
#define XV(flags, name, op, code) OP_ ## op,
|
||||||
PLATFORM_OPCODE_LIST
|
PLATFORM_OPCODE_LIST
|
||||||
EXTRA_OPCODE_LIST
|
|
||||||
OPCODE_LIST
|
OPCODE_LIST
|
||||||
#undef XV
|
#undef XV
|
||||||
};
|
};
|
||||||
@ -36,13 +34,11 @@ int main(int argc, char *argv[]) {
|
|||||||
#define XV(flags, name, op, code) \
|
#define XV(flags, name, op, code) \
|
||||||
printf(" case %d: // %s\n %s; break;\n", OP_ ## op, name, #code);
|
printf(" case %d: // %s\n %s; break;\n", OP_ ## op, name, #code);
|
||||||
PLATFORM_OPCODE_LIST
|
PLATFORM_OPCODE_LIST
|
||||||
EXTRA_OPCODE_LIST
|
|
||||||
OPCODE_LIST
|
OPCODE_LIST
|
||||||
#undef XV
|
#undef XV
|
||||||
} else if (argc == 2 && strcmp(argv[1], "dict") == 0) {
|
} else if (argc == 2 && strcmp(argv[1], "dict") == 0) {
|
||||||
#define XV(flags, name, op, code) printf(" create(" #name ", %d);\n", OP_ ## op);
|
#define XV(flags, name, op, code) printf(" create(" #name ", %d);\n", OP_ ## op);
|
||||||
PLATFORM_OPCODE_LIST
|
PLATFORM_OPCODE_LIST
|
||||||
EXTRA_OPCODE_LIST
|
|
||||||
OPCODE_LIST
|
OPCODE_LIST
|
||||||
#undef XV
|
#undef XV
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -72,10 +72,8 @@ cases = ReplaceAll(cases, '(float) ', '');
|
|||||||
cases = ReplaceAll(cases, '0.0f', '0.0');
|
cases = ReplaceAll(cases, '0.0f', '0.0');
|
||||||
cases = ReplaceAll(cases, /[(]ucell_t[)] ([^ ;)]+)/, '($1>>>0)');
|
cases = ReplaceAll(cases, /[(]ucell_t[)] ([^ ;)]+)/, '($1>>>0)');
|
||||||
cases = ReplaceAll(cases, '*(w + 4)', '((i32[w>>2]|0+4||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[-][>]([A-Za-z_]+)/, 'g_sys_$1');
|
||||||
cases = ReplaceAll(cases, 'g_sys.DOLIT_XT', 'i32[(i32[g_sys>>2] + (10 * 4))>>2]|0');
|
cases = ReplaceAll(cases, /g_sys[-][>]([A-Za-z_]+)/, 'i32[g_sys_$1>>2]');
|
||||||
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, '&& OP_DOCOL', '0');
|
cases = ReplaceAll(cases, '&& OP_DOCOL', '0');
|
||||||
cases = ReplaceAll(cases, '&& OP_DOVAR', '1');
|
cases = ReplaceAll(cases, '&& OP_DOVAR', '1');
|
||||||
cases = ReplaceAll(cases, 'goto **(void **) w', 'break decode');
|
cases = ReplaceAll(cases, 'goto **(void **) w', 'break decode');
|
||||||
|
|||||||
@ -26,20 +26,31 @@ var i32 = new Int32Array(heap);
|
|||||||
var u8 = new Uint8Array(heap);
|
var u8 = new Uint8Array(heap);
|
||||||
var objects = [SetEval];
|
var objects = [SetEval];
|
||||||
var g_sys = 256; // Placed past a gap.
|
var g_sys = 256; // Placed past a gap.
|
||||||
var g_tib = g_sys + 0 * 4;
|
var g_sys_heap = g_sys + 0 * 4;
|
||||||
var g_ntib = g_sys + 1 * 4;
|
var g_sys_current = g_sys + 1 * 4;
|
||||||
var g_tin = g_sys + 2 * 4;
|
var g_sys_context = g_sys + 2 * 4;
|
||||||
var g_state = g_sys + 3 * 4;
|
var g_sys_latestxt = g_sys + 3 * 4;
|
||||||
var g_base = g_sys + 4 * 4;
|
var g_sys_notfound = g_sys + 4 * 4;
|
||||||
var g_heap = g_sys + 5 * 4;
|
var g_sys_heap_start = g_sys + 5 * 4;
|
||||||
var g_current = g_sys + 6 * 4;
|
var g_sys_heap_size = g_sys + 6 * 4;
|
||||||
var g_context = g_sys + 7 * 4;
|
var g_sys_stack_cells = g_sys + 7 * 4;
|
||||||
var g_notfound = g_sys + 8 * 4;
|
var g_sys_boot = g_sys + 8 * 4;
|
||||||
var g_argc = g_sys + 9 * 4;
|
var g_sys_boot_size = g_sys + 9 * 4;
|
||||||
var g_argv = g_sys + 10 * 4;
|
var g_sys_tib = g_sys + 10 * 4;
|
||||||
var g_ip = g_sys + 11 * 4;
|
var g_sys_ntib = g_sys + 11 * 4;
|
||||||
var g_sp = g_sys + 12 * 4;
|
var g_sys_tin = g_sys + 12 * 4;
|
||||||
var g_rp = g_sys + 13 * 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) {
|
function SetEval(sp) {
|
||||||
var index = i32[sp--];
|
var index = i32[sp--];
|
||||||
@ -190,9 +201,31 @@ function VM(stdlib, foreign, heap) {
|
|||||||
var f32 = new stdlib.Float32Array(heap);
|
var f32 = new stdlib.Float32Array(heap);
|
||||||
|
|
||||||
const g_sys = 256;
|
const g_sys = 256;
|
||||||
const g_ip = 296; // g_sys + 10 * 4
|
var g_sys_heap = g_sys + 0 * 4;
|
||||||
const g_sp = 300; // g_sys + 11 * 4
|
var g_sys_current = g_sys + 1 * 4;
|
||||||
const g_rp = 304; // g_sys + 12 * 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() {
|
function run() {
|
||||||
var tos = 0;
|
var tos = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user