aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2011-09-17 23:49:38 -0700
committerAlon Zakai <alonzakai@gmail.com>2011-09-17 23:49:38 -0700
commit00d573c696084b8cc5f3beb8c2eead00552dbc22 (patch)
tree7e7f788b24153fab846f319d596a0279080cc5dd
parent6654bb5bb6cbd78fff9802922dd2a5001ee006aa (diff)
fix ta2 memcpy bug, and enable ta2 in sqlite test
-rw-r--r--src/parseTools.js18
-rw-r--r--tests/runner.py36
2 files changed, 40 insertions, 14 deletions
diff --git a/src/parseTools.js b/src/parseTools.js
index f9f46b06..ab67cbf7 100644
--- a/src/parseTools.js
+++ b/src/parseTools.js
@@ -843,21 +843,15 @@ function makeCopyValues(dest, src, num, type, modifier) {
}).join('; ') + '; ' + safety()
) + '\n' + '}';
} else { // USE_TYPED_ARRAYS == 2
-/*
- return 'for (var $mcpi$ = 0; $mcpi$ < ' + num + '; $mcpi$++) {\n' +
- ' HEAP8[' + dest + '+$mcpi$] = HEAP8[' + src + '+$mcpi$]; ' + safety() + ';\n' +
- '}';
-*/
return '' +
'var $src$, $dest$, $stop$, $stop4$, $fast$;\n' +
'$src$ = ' + src + ';\n' +
'$dest$ = ' + dest + ';\n' +
'$stop$ = $src$ + ' + num + ';\n' +
- '$fast$ = ($dest$%4) === ($src$%4);\n' +
- 'while ($src$%4 !== 0 && $src$ < $stop$) {\n' +
- ' ' + safety('$dest$', '$src$') + '; HEAP8[$dest$++] = HEAP8[$src$++];\n' +
- '}\n' +
- 'if ($fast$) {\n' +
+ 'if (($dest$%4) == ($src$%4) && ' + num + ' > 8) {\n' +
+ ' while ($src$%4 !== 0 && $src$ < $stop$) {\n' +
+ ' ' + safety('$dest$', '$src$') + '; HEAP8[$dest$++] = HEAP8[$src$++];\n' +
+ ' }\n' +
' $src$ >>= 2;\n' +
' $dest$ >>= 2;\n' +
' $stop4$ = $stop$ >> 2;\n' +
@@ -868,10 +862,10 @@ function makeCopyValues(dest, src, num, type, modifier) {
' }\n' +
' $src$ <<= 2;\n' +
' $dest$ <<= 2;\n' +
- '}\n' +
+ '}' +
'while ($src$ < $stop$) {\n' +
' ' + safety('$dest$', '$src$') + '; HEAP8[$dest$++] = HEAP8[$src$++];\n' +
- '}'
+ '}';
}
return null;
}
diff --git a/tests/runner.py b/tests/runner.py
index 306df8f5..3642da26 100644
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -1779,6 +1779,38 @@ if 'benchmark' not in str(sys.argv):
'''
self.do_test(src, '*0.00,0.00,0.00*\n*0,77,0*\n*0,77,0*\n*0,77,0*')
+ def test_memcpy(self):
+ src = '''
+ #include <stdio.h>
+ #include <string.h>
+ #define MAXX 48
+ void reset(unsigned char *buffer) {
+ for (int i = 0; i < MAXX; i++) buffer[i] = i+1;
+ }
+ void dump(unsigned char *buffer) {
+ for (int i = 0; i < MAXX-1; i++) printf("%2d,", buffer[i]);
+ printf("%d\\n", buffer[MAXX-1]);
+ }
+ int main() {
+ unsigned char buffer[MAXX];
+ for (int i = MAXX/4; i < MAXX-MAXX/4; i++) {
+ for (int j = MAXX/4; j < MAXX-MAXX/4; j++) {
+ for (int k = 1; k < MAXX/4; k++) {
+ if (i == j) continue;
+ if (i < j && i+k > j) continue;
+ if (j < i && j+k > i) continue;
+ printf("[%d,%d,%d]\\n", i, j, k);
+ reset(buffer);
+ memcpy(buffer+i, buffer+j, k);
+ dump(buffer);
+ }
+ }
+ }
+ return 0;
+ }
+ '''
+ self.do_test(src)
+
def test_nestedstructs(self):
src = '''
#include <stdio.h>
@@ -3105,7 +3137,7 @@ if 'benchmark' not in str(sys.argv):
def test_sqlite(self):
# gcc -O3 -I/home/alon/Dev/emscripten/tests/sqlite -ldl src.c
global QUANTUM_SIZE, OPTIMIZE, RELOOP, USE_TYPED_ARRAYS
- if QUANTUM_SIZE == 1 or USE_TYPED_ARRAYS == 2: return self.skip('TODO FIXME')
+ if QUANTUM_SIZE == 1: return self.skip('TODO FIXME')
RELOOP = 0 # too slow
auto_optimize_data = read_auto_optimize_data(path_from_root('tests', 'sqlite', 'sqlite-autooptimize.fails.txt'))
@@ -4178,7 +4210,7 @@ else:
def do_benchmark(self, src, args=[], expected_output='FAIL', main_file=None):
global USE_TYPED_ARRAYS
- self.pick_llvm_opts(3, True, allow_nonportable=USE_TYPED_ARRAYS == 2)
+ self.pick_llvm_opts(3, True) # XXX nonportable fails with dlmalloc #, allow_nonportable=USE_TYPED_ARRAYS == 2)
dirname = self.get_dir()
filename = os.path.join(dirname, 'src.cpp')