Tweaks towards web version working, again...

This commit is contained in:
Brad Nelson
2022-07-10 13:43:07 -07:00
parent a7f25d8819
commit ddd878ae20
9 changed files with 75 additions and 30 deletions

View File

@ -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 {

View File

@ -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');

View File

@ -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'); },