diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-01-31 14:50:26 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-01-31 14:50:26 -0800 |
commit | db418cbf5c42759fc880345c602e50d3bc4a9e00 (patch) | |
tree | e3bae17d9dff0acf97532445441fc61117e02268 /src/library.js | |
parent | fdf62e89373283f644be32e6c1749f5cb120bac7 (diff) |
hand-optimize memcpy/asm
Diffstat (limited to 'src/library.js')
-rw-r--r-- | src/library.js | 39 |
1 files changed, 27 insertions, 12 deletions
diff --git a/src/library.js b/src/library.js index 53fc8617..bc8502bc 100644 --- a/src/library.js +++ b/src/library.js @@ -4217,16 +4217,31 @@ LibraryManager.library = { return ret; }, + memcpy__asm: 'true', + memcpy__sig: 'iiii', memcpy: function (dest, src, num) { - // simple version, in general it should not be used - we should pull it in from libc - if (!_memcpy.shown) { - _memcpy.shown = true; - Module.printErr('warning: library.js memcpy should not be running, it is only for testing!'); + dest = dest|0; src = src|0; num = num|0; + if ((dest&3) == (src&3)) { + while (dest & 3 & num) { + {{{ makeSetValueAsm('dest', 0, makeGetValueAsm('src', 0, 'i8'), 'i8') }}}; + dest = (dest+1)|0; + src = (src+1)|0; + num = (num-1)|0; + } + while (num|0 >= 4) { + {{{ makeSetValueAsm('dest', 0, makeGetValueAsm('src', 0, 'i32'), 'i32') }}}; + dest = (dest+4)|0; + src = (src+4)|0; + num = (num-4)|0; + } } -#endif - while (num--) { - HEAP8[dest++] = HEAP8[src++]; + while (num|0 > 0) { + {{{ makeSetValueAsm('dest', 0, makeGetValueAsm('src', 0, 'i8'), 'i8') }}}; + dest = (dest+1)|0; + src = (src+1)|0; + num = (num-1)|0; } + return dest|0; }, wmemcpy: function() { throw 'wmemcpy not implemented' }, @@ -5601,11 +5616,11 @@ LibraryManager.library = { // ========================================================================== __utsname_struct_layout: Runtime.generateStructInfo([ - 'sysname', - 'nodename', - 'release', - 'version', - 'machine'], '%struct.utsname'), + 'sysname', + 'nodename', + 'release', + 'version', + 'machine'], '%struct.utsname'), uname__deps: ['__utsname_struct_layout'], uname: function(name) { // int uname(struct utsname *name); |