diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-01-06 20:38:59 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-01-06 20:38:59 -0800 |
commit | 7770587b94dc0ffafaebf43a57dc0bebfc99c24a (patch) | |
tree | 05b6da26aee1fedb5369609a382d2c62d94b51bb | |
parent | 8da5865eeb26b1b4945c1e8b4a17a78912f5bfc4 (diff) |
optimize memmove
-rw-r--r-- | src/library.js | 17 | ||||
-rw-r--r-- | tests/runner.py | 13 |
2 files changed, 23 insertions, 7 deletions
diff --git a/src/library.js b/src/library.js index 61ef90fd..03dc5cbd 100644 --- a/src/library.js +++ b/src/library.js @@ -3696,14 +3696,17 @@ LibraryManager.library = { llvm_memcpy_p0i8_p0i8_i32: 'memcpy', llvm_memcpy_p0i8_p0i8_i64: 'memcpy', - memmove__deps: ['memcpy'], memmove: function(dest, src, num, idunno) { - // not optimized! - if (num === 0) return; // will confuse malloc if 0 - var tmp = _malloc(num); - _memcpy(tmp, src, num); - _memcpy(dest, tmp, num); - _free(tmp); + if (src < dest && dest < src + num) { + // Copy backwards in a safe manner + src += num; + dest += num; + while (num--) { + {{{ makeSetValue('--dest', '0', makeGetValue('--src', '0', 'i8'), 'i8') }}}; + } + } else { + {{{ makeCopyValues('dest', 'src', 'num', 'null') }}}; + } }, llvm_memmove_i32: 'memmove', llvm_memmove_i64: 'memmove', diff --git a/tests/runner.py b/tests/runner.py index 5c2f5e13..ca3fe473 100644 --- a/tests/runner.py +++ b/tests/runner.py @@ -2272,6 +2272,19 @@ def process(filename): ''' self.do_run(src) + def test_memmove(self): + src = ''' + #include <stdio.h> + #include <string.h> + int main() { + char str[] = "memmove can be very useful....!"; + memmove (str+20, str+15, 11); + puts(str); + return 0; + } + ''' + self.do_run(src) + def test_bsearch(self): if Settings.QUANTUM_SIZE == 1: return self.skip('Test cannot work with q1') |