More asm.js
This commit is contained in:
@ -3,8 +3,7 @@
|
|||||||
(function() {
|
(function() {
|
||||||
|
|
||||||
const HEAP_SIZE = (1024 * 1024);
|
const HEAP_SIZE = (1024 * 1024);
|
||||||
const DSTACK_SIZE = 4096;
|
const STACK_SIZE = 4096;
|
||||||
const RSTACK_SIZE = 4096;
|
|
||||||
|
|
||||||
const boot = `
|
const boot = `
|
||||||
{{boot}}
|
{{boot}}
|
||||||
@ -41,7 +40,7 @@ function SetEval(sp) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function Call(sp, tos) {
|
function Call(sp, tos) {
|
||||||
return objects[tos](sp);
|
return objects[tos](sp);
|
||||||
}
|
}
|
||||||
|
|
||||||
function Load(addr, content) {
|
function Load(addr, content) {
|
||||||
@ -51,7 +50,46 @@ function Load(addr, content) {
|
|||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Same(a, b) {
|
||||||
|
if (a.length != b.length) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (var i = 0; i < a.length; ++i) {
|
||||||
|
if ((a.charCodeAt(i) & 95) != (b.charCodeAt(i) & 95)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function GetName(xt) {
|
||||||
|
var clen = i32[(xt - 3*4)>>2];
|
||||||
|
var ret = '';
|
||||||
|
for (var i = 0; i < clen; ++i) {
|
||||||
|
ret += String.fromCharCode(u8[xt - 3 * 4 - clen + i]);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function Find(name) {
|
||||||
|
var pos = i32[g_last>>2];
|
||||||
|
while (pos) {
|
||||||
|
if (Same(GetName(pos), name)) {
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
pos = i32[(pos - 2*4)>>2];
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
function create(name, opcode) {
|
function create(name, opcode) {
|
||||||
|
i32[g_heap>>2] = Load(i32[g_heap>>2], name); // name
|
||||||
|
g_heap = (g_heap + 3) & ~3;
|
||||||
|
i32[g_heap>>2] = name.length; // length
|
||||||
|
i32[g_heap>>2] = i32[g_last>>2]; // link
|
||||||
|
i32[g_heap>>2] = 0; // flags
|
||||||
|
i32[g_last>>2] = i32[g_heap>>2];
|
||||||
|
i32[g_last>>2] = opcode; // code
|
||||||
}
|
}
|
||||||
|
|
||||||
function InitDictionary() {
|
function InitDictionary() {
|
||||||
@ -71,9 +109,7 @@ function Init() {
|
|||||||
i32[g_rp>>2] = i32[g_heap>>2] + 1;
|
i32[g_rp>>2] = i32[g_heap>>2] + 1;
|
||||||
i32[g_heap>>2] += STACK_SIZE;
|
i32[g_heap>>2] += STACK_SIZE;
|
||||||
i32[(g_last - 4)>>2] = 1; // Make ; IMMMEDIATE
|
i32[(g_last - 4)>>2] = 1; // Make ; IMMMEDIATE
|
||||||
g_DOLIT_XT = Find('DOLIT');
|
// Do not need DOLIT_XT, DOEXIT_XT, YIELD_XT (do by convention)
|
||||||
g_DOEXIT_XT = Find('EXIT');
|
|
||||||
g_YIELD_XT = Find('YIELD');
|
|
||||||
i32[g_notfound>>2] = Find('DROP');
|
i32[g_notfound>>2] = Find('DROP');
|
||||||
i32[g_ip>>2] = i32[g_heap>>2];
|
i32[g_ip>>2] = i32[g_heap>>2];
|
||||||
i32[g_heap>>2] = Find('EVALUATE1');
|
i32[g_heap>>2] = Find('EVALUATE1');
|
||||||
@ -109,10 +145,10 @@ function VM(stdlib, foreign, heap) {
|
|||||||
var u8 = new stdlib.Uint8Array(heap);
|
var u8 = new stdlib.Uint8Array(heap);
|
||||||
var i32 = new stdlib.Int32Array(heap);
|
var i32 = new stdlib.Int32Array(heap);
|
||||||
|
|
||||||
var g_sys = 256;
|
const g_sys = 256;
|
||||||
var g_ip = g_sys + 10 * 4;
|
const g_ip = 296; // g_sys + 10 * 4
|
||||||
var g_sp = g_sys + 11 * 4;
|
const g_sp = 300; // g_sys + 11 * 4
|
||||||
var g_rp = g_sys + 12 * 4;
|
const g_rp = 304; // g_sys + 12 * 4
|
||||||
|
|
||||||
function run() {
|
function run() {
|
||||||
var tos = 0;
|
var tos = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user