aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library.js26
-rwxr-xr-xtests/runner.py30
2 files changed, 32 insertions, 24 deletions
diff --git a/src/library.js b/src/library.js
index 0c6c7a63..6e4e7d0e 100644
--- a/src/library.js
+++ b/src/library.js
@@ -4528,33 +4528,11 @@ LibraryManager.library = {
},
llvm_bswap_i16: function(x) {
- x = unSign(x, 32);
- var bytes = [];
- bytes[0] = x & 255;
- x >>= 8;
- bytes[1] = x & 255;
- x >>= 8;
- var ret = 0;
- ret <<= 8;
- ret += bytes[0];
- ret <<= 8;
- ret += bytes[1];
- return ret;
+ return ((x&0xff)<<8) | ((x>>8)&0xff);
},
llvm_bswap_i32: function(x) {
- x = unSign(x, 32);
- var bytes = [];
- for (var i = 0; i < 4; i++) {
- bytes[i] = x & 255;
- x >>= 8;
- }
- var ret = 0;
- for (i = 0; i < 4; i++) {
- ret <<= 8;
- ret += bytes[i];
- }
- return ret;
+ return ((x&0xff)<<24) | (((x>>8)&0xff)<<16) | (((x>>16)&0xff)<<8) | (x>>>24);
},
llvm_ctlz_i32: function(x) {
diff --git a/tests/runner.py b/tests/runner.py
index f3438e64..bf971996 100755
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -978,6 +978,36 @@ m_divisor is 1091269979
'''
self.do_run(src, ',0,,2,C!,0,C!,0,,65535,C!,0,')
+ def test_bswap(self):
+ if self.emcc_args == None: return self.skip('needs ta2')
+
+ src = r'''
+ #include <stdio.h>
+
+ extern "C" {
+ extern unsigned short llvm_bswap_i16(unsigned short x);
+ extern unsigned int llvm_bswap_i32(unsigned int x);
+ }
+
+ int main(void) {
+ unsigned short x = 0xc8ef;
+ printf("%x,%x\n", x&0xff, x >> 8);
+ x = llvm_bswap_i16(x);
+ printf("%x,%x\n", x&0xff, x >> 8);
+
+ unsigned int y = 0xc5de158a;
+ printf("%x,%x,%x,%x\n", y&0xff, (y>>8)&0xff, (y>>16)&0xff, (y>>24)&0xff);
+ y = llvm_bswap_i32(y);
+ printf("%x,%x,%x,%x\n", y&0xff, (y>>8)&0xff, (y>>16)&0xff, (y>>24)&0xff);
+ return 0;
+ }
+ '''
+ self.do_run(src, '''ef,c8
+c8,ef
+8a,15,de,c5
+c5,de,15,8a
+''')
+
def test_sha1(self):
if self.emcc_args == None: return self.skip('needs ta2')