diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/library.js | 26 | ||||
-rw-r--r-- | src/preamble.js | 8 | ||||
-rw-r--r-- | src/runtime.js | 24 |
3 files changed, 34 insertions, 24 deletions
diff --git a/src/library.js b/src/library.js index 8a77850f..b60bd07f 100644 --- a/src/library.js +++ b/src/library.js @@ -561,14 +561,9 @@ var Library = { llvm_memmove_p0i8_p0i8_i32: 'memmove', llvm_memmove_p0i8_p0i8_i64: 'memmove', - memset: function(ptr, value, num) { - for (var i = 0; i < num; i++) { - {{{ makeSetValue('ptr', 'i', 'value', 'null') }}} - } - }, - llvm_memset_i32: 'memset', - llvm_memset_p0i8_i32: 'memset', - llvm_memset_p0i8_i64: 'memset', + llvm_memset_i32: 'Runtime.memset', + llvm_memset_p0i8_i32: 'Runtime.memset', + llvm_memset_p0i8_i64: 'Runtime.memset', strlen: function(ptr) { return String_len(ptr); @@ -822,6 +817,21 @@ var Library = { */ }, + llvm_bswap_i32: function(x) { + x = unSign(x, 32); + var bytes = []; + for (var i = 0; i < 4; i++) { + bytes[i] = x & 255; + x >>= 8; + } + var ret = 0; + for (i = 0; i < 4; i++) { + ret <<= 8; + ret += bytes[i]; + } + return ret; + }, + __assert_fail: function(condition, file, line) { ABORT = true; throw 'Assertion failed: ' + Pointer_stringify(condition);//JSON.stringify(arguments)//condition; diff --git a/src/preamble.js b/src/preamble.js index ade02496..38c18f35 100644 --- a/src/preamble.js +++ b/src/preamble.js @@ -221,7 +221,11 @@ var TOTAL_MEMORY = 50*1024*1024; function __initializeRuntime__() { // If we don't have malloc/free implemented, use a simple implementation. Module['_malloc'] = _malloc = __Znwj = __Znaj = __Znam = __Znwm = Module['_malloc'] ? Module['_malloc'] : Runtime.staticAlloc; - Module['_calloc'] = _calloc = Module['_calloc'] ? Module['_calloc'] : function(n, s) { return _malloc(n*s) }; + Module['_calloc'] = _calloc = Module['_calloc'] ? Module['_calloc'] : function(n, s) { + var ret = _malloc(n*s); + Runtime.memset(ret, 0, n*s); + return ret; + }; Module['_free'] = _free = __ZdlPv = __ZdaPv = Module['_free'] ? Module['_free'] : function() { }; #if USE_TYPED_ARRAYS @@ -252,7 +256,7 @@ function __initializeRuntime__() { Module['FHEAP'] = FHEAP; STACK_ROOT = STACKTOP = alignMemoryPage(10); - if (!this['TOTAL_STACK']) TOTAL_STACK = 1024*1024; // Reserved room for stack + if (!this['TOTAL_STACK']) TOTAL_STACK = 1024*1024; // Reserved room for stack XXX: Changing this value can lead to bad perf on v8! STACK_MAX = STACK_ROOT + TOTAL_STACK; STATICTOP = alignMemoryPage(STACK_MAX); diff --git a/src/runtime.js b/src/runtime.js index 6b0d4be6..4de337f7 100644 --- a/src/runtime.js +++ b/src/runtime.js @@ -8,15 +8,10 @@ RuntimeGenerator = { alloc: function(size, type, init) { var ret = type + 'TOP'; if (GUARD_MEMORY) { - ret += '; assert(' + size + ' > 0)'; + ret += '; assert(' + size + ' > 0, "Trying to allocate 0")'; } if (init) { - var initMemory = 'for (var i = 0; i < ' + size + '; i++) ' + ( - USE_TYPED_ARRAYS ? - 'IHEAP[' + type + 'TOP+i] = FHEAP[' + type + 'TOP+i] = 0' : - 'HEAP[' + type + 'TOP+i] = 0' - ); - ret += '; ' + initMemory; + ret += '; Runtime.memset(' + type + 'TOP, 0, ' + size + ')'; } ret += '; ' + type + 'TOP += ' + size; if (QUANTUM_SIZE > 1) { @@ -29,7 +24,7 @@ RuntimeGenerator = { stackAlloc: function(size) { var ret = RuntimeGenerator.alloc(size, 'STACK', INIT_STACK); if (GUARD_MEMORY) { - ret += '; assert(STACKTOP < STACK_ROOT + STACK_MAX)'; + ret += '; assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack")'; } return ret; }, @@ -44,13 +39,8 @@ RuntimeGenerator = { ret += '; assert(STACKTOP < STACK_MAX)'; } if (INIT_STACK) { - var initMemory = 'for (var i = __stackBase__; i < STACKTOP; i++) {' + ( - USE_TYPED_ARRAYS ? - 'IHEAP[i] = FHEAP[i] = 0' : // TODO: Benchmark this. Suboptimal due to type differences? - 'HEAP[i] = 0' - ) + (SAFE_HEAP ? '; SAFE_HEAP_ACCESS(i, null, true)' : '') + ' }'; + ret += '; Runtime.memset(__stackBase__, 0, ' + initial + ')'; } - ret += '; ' + initMemory; return ret; }, @@ -87,6 +77,12 @@ Runtime = { staticAlloc: unInline('staticAlloc', ['size']), alignMemory: unInline('alignMemory', ['size', 'quantum']), + memset: function(ptr, value, num) { + for (var i = 0; i < num; i++) { + {{{ makeSetValue('ptr', 'i', 'value', 'null') }}} + } + }, + getFunctionIndex: function getFunctionIndex(func, ident) { var key = FUNCTION_TABLE.length; FUNCTION_TABLE[key] = func; |