aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library.js16
-rw-r--r--src/library_sdl.js2
-rw-r--r--src/parseTools.js26
-rw-r--r--tests/runner.py2
4 files changed, 29 insertions, 17 deletions
diff --git a/src/library.js b/src/library.js
index 6562ff1c..74918a95 100644
--- a/src/library.js
+++ b/src/library.js
@@ -229,7 +229,7 @@ var Library = {
var text = __formatString(-src, ptr); // |-|src tells formatstring to use C-style params (typically they are from varargs)
var i;
for (i = 0; i < num; i++) {
- {{{ makeCopyValue('dst+i', 'text+i', 1, 'i8') }}}
+ {{{ makeCopyValues('dst+i', 'text+i', 1, 'i8') }}}
if ({{{ makeGetValue('dst', 'i', 'i8') }}} == 0) break;
}
return i; // Actually, should return how many *would* have been written, if the |num| had not stopped us.
@@ -624,7 +624,7 @@ var Library = {
#endif
// TODO: optimize for the typed arrays case
// || 0, since memcpy sometimes copies uninitialized areas XXX: Investigate why initializing alloc'ed memory does not fix that too
- {{{ makeCopyValue('dest', 'src', 'num', 'null', ' || 0') }}};
+ {{{ makeCopyValues('dest', 'src', 'num', 'null', ' || 0') }}};
},
llvm_memcpy_i32: 'memcpy',
llvm_memcpy_i64: 'memcpy',
@@ -646,9 +646,7 @@ var Library = {
llvm_memmove_p0i8_p0i8_i64: 'memmove',
memset: function(ptr, value, num) {
- for (var i = 0; i < num; i++) {
- {{{ makeSetValue('ptr', 'i', 'value', 'null') }}}
- }
+ {{{ makeSetValues('ptr', '0', 'value', 'null', 'num') }}}
},
llvm_memset_i32: 'memset',
llvm_memset_p0i8_i32: 'memset',
@@ -677,7 +675,7 @@ var Library = {
strcpy: function(pdest, psrc) {
var i = 0;
do {
- {{{ makeCopyValue('pdest+i', 'psrc+i', 1, 'i8') }}}
+ {{{ makeCopyValues('pdest+i', 'psrc+i', 1, 'i8') }}}
i ++;
} while ({{{ makeGetValue('psrc', 'i-1', 'i8') }}} != 0);
},
@@ -695,7 +693,7 @@ var Library = {
var len = Pointer_stringify(pdest).length; // TODO: use strlen, but need dependencies system
var i = 0;
do {
- {{{ makeCopyValue('pdest+len+i', 'psrc+i', 1, 'i8') }}}
+ {{{ makeCopyValues('pdest+len+i', 'psrc+i', 1, 'i8') }}}
i ++;
} while ({{{ makeGetValue('psrc', 'i-1', 'i8') }}} != 0);
return pdest;
@@ -705,7 +703,7 @@ var Library = {
var len = Pointer_stringify(pdest).length; // TODO: use strlen, but need dependencies system
var i = 0;
while(1) {
- {{{ makeCopyValue('pdest+len+i', 'psrc+i', 1, 'i8') }}}
+ {{{ makeCopyValues('pdest+len+i', 'psrc+i', 1, 'i8') }}}
if ({{{ makeGetValue('pdest', 'len+i', 'i8') }}} == 0) break;
i ++;
if (i == num) {
@@ -915,7 +913,7 @@ var Library = {
// LLVM specifics
llvm_va_copy: function(ppdest, ppsrc) {
- {{{ makeCopyValue('ppdest', 'ppsrc', QUANTUM_SIZE, 'null') }}}
+ {{{ makeCopyValues('ppdest', 'ppsrc', QUANTUM_SIZE, 'null') }}}
/* Alternate implementation that copies the actual DATA; it assumes the va_list is prefixed by its size
var psrc = IHEAP[ppsrc]-1;
var num = IHEAP[psrc]; // right before the data, is the number of (flattened) values
diff --git a/src/library_sdl.js b/src/library_sdl.js
index abff2cab..27bb8744 100644
--- a/src/library_sdl.js
+++ b/src/library_sdl.js
@@ -288,7 +288,7 @@ mergeInto(Library, {
var srcData = SDL.surfaces[src];
var dstData = SDL.surfaces[dst];
assert(srcData.width === dstData.width && srcData.height === dstData.height);
- {{{ makeCopyValue('dstData.buffer', 'srcData.buffer', 'srcData.width*srcData.height*4', 'i8') }}}
+ {{{ makeCopyValues('dstData.buffer', 'srcData.buffer', 'srcData.width*srcData.height*4', 'i8') }}}
return 0;
},
diff --git a/src/parseTools.js b/src/parseTools.js
index 40f97fdd..4db740db 100644
--- a/src/parseTools.js
+++ b/src/parseTools.js
@@ -725,7 +725,21 @@ function makeSetValue(ptr, pos, value, type, noNeedFirst, ignore) {
}
}
-function makeCopyValue(dest, src, num, type, modifier) {
+function makeSetValues(ptr, pos, value, type, num) {
+ function safety() {
+ return ';' + (SAFE_HEAP ? 'SAFE_HEAP_ACCESS(' + dest + '+$mcpi$, ' + type + ', 1)' : '');
+ }
+ if (USE_TYPED_ARRAYS in set(0, 1)) {
+ return 'for (var $mspi$ = 0; $mspi$ < ' + num + '; $mspi$++) {\n' +
+ makeSetValue(ptr, getFastValue(pos, '+', '$mspi$'), value, type) + ';\n}';
+ } else { // USE_TYPED_ARRAYS == 2
+ return 'for (var $mspi$ = 0; $mspi$ < ' + num + '; $mspi$++) {\n' +
+ ' HEAP8[' + getFastValue(ptr, '+', pos) + '+$mspi$] = ' + value + safety() + '\n}';
+ // TODO: optimize this, setting 4 values at a time etc. like makeCopyValues
+ }
+}
+
+function makeCopyValues(dest, src, num, type, modifier) {
function safety() {
return ';' + (SAFE_HEAP ? 'SAFE_HEAP_COPY_HISTORY(' + dest + '+$mcpi$, ' + src + '+$mcpi$)' : '');
}
@@ -739,7 +753,7 @@ function makeCopyValue(dest, src, num, type, modifier) {
) + '\n' + '}';
} else { // USE_TYPED_ARRAYS == 2
return 'for (var $mcpi$ = 0; $mcpi$ < ' + num + '; $mcpi$++) {\n' +
- ' HEAP8[' + dest + '+$mcpi$] = HEAP8[' + src + '+$mcpi$]; ' + safety() + ';\n';
+ ' HEAP8[' + dest + '+$mcpi$] = HEAP8[' + src + '+$mcpi$]; ' + safety() + ';\n' +
'}';
/* TODO: rework something like this potential optimizing code
if (isNumber(num) && num < 12) {
@@ -761,6 +775,7 @@ function makeCopyValue(dest, src, num, type, modifier) {
}
*/
}
+ return null;
}
// Given two values and an operation, returns the result of that operation.
@@ -802,7 +817,7 @@ function makeGetPos(ptr) {
function makePointer(slab, pos, allocator, type) {
assert(type, 'makePointer requires type info');
- if (slab in set('HEAP', 'IHEAP', 'FHEAP')) return pos;
+ if (slab.substr(0, 4) === 'HEAP' || (USE_TYPED_ARRAYS == 1 && slab in set('IHEAP', 'FHEAP'))) return pos;
var types = generateStructTypes(type);
if (dedup(types).length === 1) types = types[0];
return 'Pointer_make(' + slab + ', ' + (pos ? pos : 0) + (allocator ? ', ' + allocator : '') + ', ' +
@@ -815,7 +830,7 @@ function makeGetSlabs(ptr, type, allowMultiple) {
if (!USE_TYPED_ARRAYS) {
return ['HEAP'];
} else if (USE_TYPED_ARRAYS == 1) {
- if (type in Runtime.FLOAT_TYPES || type === 'int64') {
+ if (type in Runtime.FLOAT_TYPES || type === 'int64') { // XXX should be i64, no?
return ['FHEAP'];
} else if (type in Runtime.INT_TYPES || isPointerType(type)) {
return ['IHEAP'];
@@ -824,6 +839,7 @@ function makeGetSlabs(ptr, type, allowMultiple) {
return ['IHEAP', 'FHEAP']; // unknown, so assign to both typed arrays
}
} else { // USE_TYPED_ARRAYS == 2)
+ if (isPointerType(type)) type = 'i32'; // Hardcoded 32-bit
switch(type) {
case 'i8': return ['HEAP8']; break;
case 'i16': return ['HEAP16']; break;
@@ -832,9 +848,7 @@ function makeGetSlabs(ptr, type, allowMultiple) {
case 'float': return ['HEAPF32']; break;
case 'double': return ['HEAPF64']; break;
default: {
- assert(allowMultiple, 'Unknown slab type and !allowMultiple: ' + type);
throw 'what, exactly, can we do for unknown types in TA2?! ' + new Error().stack;
- return ['IHEAP', 'FHEAP'];
}
}
}
diff --git a/tests/runner.py b/tests/runner.py
index 65a5ecfa..489196e3 100644
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -301,7 +301,7 @@ if 'benchmark' not in sys.argv:
# Run in both JavaScript engines, if optimizing - significant differences there (typed arrays)
if js_engines is None:
- js_engines = [V8_ENGINE, SPIDERMONKEY_ENGINE]
+ js_engines = [SPIDERMONKEY_ENGINE, V8_ENGINE]
for engine in js_engines:
js_output = self.run_generated_code(engine, filename + '.o.js', args)
if output_nicerizer is not None: