aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-01-06 20:38:59 -0800
committerAlon Zakai <alonzakai@gmail.com>2012-01-06 20:38:59 -0800
commit7770587b94dc0ffafaebf43a57dc0bebfc99c24a (patch)
tree05b6da26aee1fedb5369609a382d2c62d94b51bb /src
parent8da5865eeb26b1b4945c1e8b4a17a78912f5bfc4 (diff)
optimize memmove
Diffstat (limited to 'src')
-rw-r--r--src/library.js17
1 files changed, 10 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',