aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xemscripten.py7
-rw-r--r--src/library.js40
2 files changed, 31 insertions, 16 deletions
diff --git a/emscripten.py b/emscripten.py
index bfcc3ea5..7d1d82f2 100755
--- a/emscripten.py
+++ b/emscripten.py
@@ -391,6 +391,13 @@ var i64Math_multiply = function(a, b, c, d) { i64Math.multiply(a, b, c, d) };
var i64Math_divide = function(a, b, c, d, e) { i64Math.divide(a, b, c, d, e) };
var i64Math_modulo = function(a, b, c, d, e) { i64Math.modulo(a, b, c, d, e) };
'''
+
+ if forwarded_json['Functions']['libraryFunctions'].get('llvm_cttz_i32') or \
+ forwarded_json['Functions']['libraryFunctions'].get('llvm_ctlz_i32') or \
+ forwarded_json['Functions']['libraryFunctions'].get('llvm_cttz_i64') or \
+ forwarded_json['Functions']['libraryFunctions'].get('llvm_ctlz_i64'):
+ basic_vars += ['cttz_i8', 'ctlz_i8']
+
asm_runtime_funcs = ['stackAlloc', 'stackSave', 'stackRestore', 'setThrew'] + ['setTempRet%d' % i for i in range(10)]
# function tables
def asm_coerce(value, sig):
diff --git a/src/library.js b/src/library.js
index a792a681..c9f161f2 100644
--- a/src/library.js
+++ b/src/library.js
@@ -4913,16 +4913,20 @@ LibraryManager.library = {
}
return 8;
}
- return 'var ctlz_i8 = [' + range(256).map(function(x) { return ctlz(x) }).join(',') + '];';
+ return 'var ctlz_i8 = allocate([' + range(256).map(function(x) { return ctlz(x) }).join(',') + '], "i8", ALLOC_STACK);';
}],
+ llvm_ctlz_i32__asm: true,
+ llvm_ctlz_i32__sig: 'ii',
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;
+ x = x|0;
+ var ret = 0;
+ ret = {{{ makeGetValueAsm('ctlz_i8', 'x >>> 24', 'i8') }}};
+ if ((ret|0) < 8) return ret|0;
+ var ret = {{{ makeGetValueAsm('ctlz_i8', '(x >> 16)&0xff', 'i8') }}};
+ if ((ret|0) < 8) return (ret + 8)|0;
+ var ret = {{{ makeGetValueAsm('ctlz_i8', '(x >> 8)&0xff', 'i8') }}};
+ if ((ret|0) < 8) return (ret + 16)|0;
+ return ({{{ makeGetValueAsm('ctlz_i8', 'x&0xff', 'i8') }}} + 24)|0;
},
llvm_ctlz_i64__deps: ['llvm_ctlz_i32'],
@@ -4945,16 +4949,20 @@ LibraryManager.library = {
}
return 8;
}
- return 'var cttz_i8 = [' + range(256).map(function(x) { return cttz(x) }).join(',') + '];';
+ return 'var cttz_i8 = allocate([' + range(256).map(function(x) { return cttz(x) }).join(',') + '], "i8", ALLOC_STACK);';
}],
+ llvm_cttz_i32__asm: true,
+ llvm_cttz_i32__sig: 'ii',
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;
+ x = x|0;
+ var ret = 0;
+ ret = {{{ makeGetValueAsm('cttz_i8', 'x & 0xff', 'i8') }}};
+ if ((ret|0) < 8) return ret|0;
+ var ret = {{{ makeGetValueAsm('cttz_i8', '(x >> 8)&0xff', 'i8') }}};
+ if ((ret|0) < 8) return (ret + 8)|0;
+ var ret = {{{ makeGetValueAsm('cttz_i8', '(x >> 16)&0xff', 'i8') }}};
+ if ((ret|0) < 8) return (ret + 16)|0;
+ return ({{{ makeGetValueAsm('cttz_i8', 'x >>> 24', 'i8') }}} + 24)|0;
},
llvm_cttz_i64__deps: ['llvm_cttz_i32'],