diff options
Diffstat (limited to 'src/library.js')
-rw-r--r-- | src/library.js | 54 |
1 files changed, 49 insertions, 5 deletions
diff --git a/src/library.js b/src/library.js index c537ba57..647aa738 100644 --- a/src/library.js +++ b/src/library.js @@ -4862,13 +4862,25 @@ LibraryManager.library = { #endif }, - llvm_ctlz_i32: function(x) { - for (var i=0; i<32; i++) { - if ( (x & (1 << (31-i))) != 0 ) { - return i; + llvm_ctlz_i32__deps: [function() { + function ctlz(x) { + for (var i = 0; i < 8; i++) { + if (x & (1 << (7-i))) { + return i; } + } + return 8; } - return 32; + return 'var ctlz_i8 = [' + range(256).map(function(x) { return ctlz(x) }).join(',') + '];'; + }], + llvm_ctlz_i32: function(x) { + var ret = ctlz_i8[x >>> 24]; + if (ret < 8) return ret; + var ret = ctlz_i8[(x >> 16)&0xff]; + if (ret < 8) return ret + 8; + var ret = ctlz_i8[(x >> 8)&0xff]; + if (ret < 8) return ret + 16; + return ctlz_i8[x&0xff] + 24; }, llvm_ctlz_i64__deps: ['llvm_ctlz_i32'], @@ -4882,6 +4894,38 @@ LibraryManager.library = { #endif }, + llvm_cttz_i32__deps: [function() { + function cttz(x) { + for (var i = 0; i < 8; i++) { + if (x & (1 << i)) { + return i; + } + } + return 8; + } + return 'var cttz_i8 = [' + range(256).map(function(x) { return cttz(x) }).join(',') + '];'; + }], + llvm_cttz_i32: function(x) { + var ret = cttz_i8[x & 0xff]; + if (ret < 8) return ret; + var ret = cttz_i8[(x >> 8)&0xff]; + if (ret < 8) return ret + 8; + var ret = cttz_i8[(x >> 16)&0xff]; + if (ret < 8) return ret + 16; + return cttz_i8[x >>> 24] + 24; + }, + + llvm_cttz_i64__deps: ['llvm_cttz_i32'], + llvm_cttz_i64: function(l, h) { + var ret = _llvm_cttz_i32(l); + if (ret == 32) ret += _llvm_cttz_i32(h); +#if USE_TYPED_ARRAYS == 2 + {{{ makeStructuralReturn(['ret', '0']) }}}; +#else + return ret; +#endif + }, + llvm_trap: function() { throw 'trap! ' + new Error().stack; }, |