diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-02-22 18:16:21 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-02-22 18:16:21 -0800 |
commit | 90710c0c8ee4425c06402cc7831abdee8c519a43 (patch) | |
tree | 7f18dac066988e902e93d4ba8b43fdc68cb6d82c | |
parent | 15595f1ea36fa4268e5db66b8717999f7f363621 (diff) |
asmify memcmp
-rw-r--r-- | src/library.js | 13 | ||||
-rw-r--r-- | src/parseTools.js | 4 | ||||
-rwxr-xr-x | tests/runner.py | 18 |
3 files changed, 28 insertions, 7 deletions
diff --git a/src/library.js b/src/library.js index d8f98d73..885fe1e0 100644 --- a/src/library.js +++ b/src/library.js @@ -4525,11 +4525,16 @@ LibraryManager.library = { return 0; }, + memcmp__asm: 'true', + memcmp__sig: 'iiii', memcmp: function(p1, p2, num) { - for (var i = 0; i < num; i++) { - var v1 = {{{ makeGetValue('p1', 'i', 'i8', 0, 1) }}}; - var v2 = {{{ makeGetValue('p2', 'i', 'i8', 0, 1) }}}; - if (v1 != v2) return v1 > v2 ? 1 : -1; + p1 = p1|0; p2 = p2|0; num = num|0; + var i = 0, v1 = 0, v2 = 0; + while ((i|0) < (num|0)) { + var v1 = {{{ makeGetValueAsm('p1', 'i', 'i8', true) }}}; + var v2 = {{{ makeGetValueAsm('p2', 'i', 'i8', true) }}}; + if ((v1|0) != (v2|0)) return (v1|0) > (v2|0) ? 1 : -1; + i = (i+1)|0; } return 0; }, diff --git a/src/parseTools.js b/src/parseTools.js index ca9ad40a..15c2169b 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -1145,8 +1145,8 @@ function makeGetValue(ptr, pos, type, noNeedFirst, unsigned, ignore, align, noSa } } -function makeGetValueAsm(ptr, pos, type) { - return makeGetValue(ptr, pos, type, null, null, null, null, null, true); +function makeGetValueAsm(ptr, pos, type, unsigned) { + return makeGetValue(ptr, pos, type, null, unsigned, null, null, null, true); } function indexizeFunctions(value, type) { diff --git a/tests/runner.py b/tests/runner.py index 4ec99878..71345743 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -4134,10 +4134,12 @@ The current type of b is: 9 ''' self.do_run(src, '*0.00,0.00,0.00*\n*0,77,0*\n*0,77,0*\n*0,77,0*') - def test_memcpy(self): + def test_memcpy_memcmp(self): src = ''' #include <stdio.h> #include <string.h> + #include <assert.h> + #define MAXX 48 void reset(unsigned char *buffer) { for (int i = 0; i < MAXX; i++) buffer[i] = i+1; @@ -4158,6 +4160,20 @@ The current type of b is: 9 reset(buffer); memcpy(buffer+i, buffer+j, k); dump(buffer); + assert(memcmp(buffer+i, buffer+j, k) == 0); + buffer[i + k/2]++; + if (buffer[i + k/2] != 0) { + assert(memcmp(buffer+i, buffer+j, k) > 0); + } else { + assert(memcmp(buffer+i, buffer+j, k) < 0); + } + buffer[i + k/2]--; + buffer[j + k/2]++; + if (buffer[j + k/2] != 0) { + assert(memcmp(buffer+i, buffer+j, k) < 0); + } else { + assert(memcmp(buffer+i, buffer+j, k) > 0); + } } } } |