webruby 0.2.2 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/webruby/config.rb +4 -9
- data/lib/webruby/rake/files.rake +2 -2
- data/modules/emscripten/AUTHORS +9 -1
- data/modules/emscripten/CONTRIBUTING.markdown +5 -0
- data/modules/emscripten/ChangeLog +435 -0
- data/modules/emscripten/cmake/Modules/FindOpenAL.cmake +26 -0
- data/modules/emscripten/cmake/Platform/Emscripten.cmake +9 -2
- data/modules/emscripten/em++ +0 -2
- data/modules/emscripten/emcc +92 -32
- data/modules/emscripten/emlink.py +16 -13
- data/modules/emscripten/emmake +1 -1
- data/modules/emscripten/emrun +918 -0
- data/modules/emscripten/emrun.bat +2 -0
- data/modules/emscripten/emscripten.py +545 -20
- data/modules/emscripten/src/analyzer.js +6 -1
- data/modules/emscripten/src/compiler.js +25 -16
- data/modules/emscripten/src/emrun_postjs.js +20 -0
- data/modules/emscripten/{tests → src}/hello_world.js +0 -0
- data/modules/emscripten/src/intertyper.js +45 -16
- data/modules/emscripten/src/jsifier.js +78 -48
- data/modules/emscripten/src/library.js +381 -96
- data/modules/emscripten/src/library_browser.js +50 -53
- data/modules/emscripten/src/library_egl.js +66 -24
- data/modules/emscripten/src/library_fs.js +122 -90
- data/modules/emscripten/src/library_gl.js +739 -353
- data/modules/emscripten/src/library_glfw.js +9 -3
- data/modules/emscripten/src/library_glut.js +10 -5
- data/modules/emscripten/src/library_idbfs.js +14 -14
- data/modules/emscripten/src/library_memfs.js +65 -41
- data/modules/emscripten/src/library_nodefs.js +61 -9
- data/modules/emscripten/src/library_openal.js +4 -4
- data/modules/emscripten/src/library_path.js +9 -13
- data/modules/emscripten/src/library_sdl.js +301 -64
- data/modules/emscripten/src/library_sockfs.js +7 -5
- data/modules/emscripten/src/modules.js +62 -22
- data/modules/emscripten/src/parseTools.js +135 -102
- data/modules/emscripten/src/postamble.js +3 -4
- data/modules/emscripten/src/preamble.js +49 -29
- data/modules/emscripten/src/proxyClient.js +1 -1
- data/modules/emscripten/src/proxyWorker.js +10 -10
- data/modules/emscripten/src/relooper/Relooper.cpp +15 -4
- data/modules/emscripten/src/runtime.js +32 -8
- data/modules/emscripten/src/settings.js +25 -8
- data/modules/emscripten/src/shell.html +6 -3
- data/modules/emscripten/src/shell.js +13 -11
- data/modules/emscripten/src/simd.js +602 -432
- data/modules/emscripten/src/struct_info.json +22 -2
- data/modules/emscripten/src/utility.js +32 -17
- data/modules/emscripten/system/include/SDL/SDL_events.h +1 -0
- data/modules/emscripten/system/include/compat/ctype.h +17 -0
- data/modules/emscripten/system/include/compat/wchar.h +23 -0
- data/modules/emscripten/system/include/compat/wctype.h +23 -0
- data/modules/emscripten/system/include/emscripten/emmintrin.h +87 -0
- data/modules/emscripten/system/include/emscripten/emscripten.h +30 -4
- data/modules/emscripten/system/include/emscripten/vector.h +29 -1
- data/modules/emscripten/system/include/emscripten/xmmintrin.h +131 -0
- data/modules/emscripten/system/include/libcxx/CREDITS.TXT +9 -1
- data/modules/emscripten/system/include/libcxx/__bit_reference +8 -8
- data/modules/emscripten/system/include/libcxx/__config +95 -17
- data/modules/emscripten/system/include/libcxx/__debug +25 -4
- data/modules/emscripten/system/include/libcxx/__functional_03 +7 -7
- data/modules/emscripten/system/include/libcxx/__functional_base +169 -9
- data/modules/emscripten/system/include/libcxx/__functional_base_03 +1 -1
- data/modules/emscripten/system/include/libcxx/__hash_table +25 -25
- data/modules/emscripten/system/include/libcxx/__locale +21 -19
- data/modules/emscripten/system/include/libcxx/__mutex_base +2 -33
- data/modules/emscripten/system/include/libcxx/__split_buffer +9 -9
- data/modules/emscripten/system/include/libcxx/__std_stream +14 -0
- data/modules/emscripten/system/include/libcxx/__tree +35 -26
- data/modules/emscripten/system/include/libcxx/__tuple +15 -15
- data/modules/emscripten/system/include/libcxx/__tuple_03 +2 -2
- data/modules/emscripten/system/include/libcxx/__undef_min_max +8 -0
- data/modules/emscripten/system/include/libcxx/algorithm +121 -110
- data/modules/emscripten/system/include/libcxx/array +15 -15
- data/modules/emscripten/system/include/libcxx/bitset +4 -4
- data/modules/emscripten/system/include/libcxx/chrono +51 -17
- data/modules/emscripten/system/include/libcxx/cmath +25 -23
- data/modules/emscripten/system/include/libcxx/codecvt +21 -18
- data/modules/emscripten/system/include/libcxx/complex +48 -7
- data/modules/emscripten/system/include/libcxx/cstddef +1 -1
- data/modules/emscripten/system/include/libcxx/cstdio +8 -1
- data/modules/emscripten/system/include/libcxx/cstdlib +1 -1
- data/modules/emscripten/system/include/libcxx/cwchar +1 -1
- data/modules/emscripten/system/include/libcxx/deque +26 -12
- data/modules/emscripten/system/include/libcxx/dynarray +311 -0
- data/modules/emscripten/system/include/libcxx/exception +4 -4
- data/modules/emscripten/system/include/libcxx/ext/__hash +3 -3
- data/modules/emscripten/system/include/libcxx/ext/hash_map +19 -15
- data/modules/emscripten/system/include/libcxx/ext/hash_set +7 -3
- data/modules/emscripten/system/include/libcxx/forward_list +33 -7
- data/modules/emscripten/system/include/libcxx/fstream +4 -4
- data/modules/emscripten/system/include/libcxx/functional +200 -170
- data/modules/emscripten/system/include/libcxx/future +83 -39
- data/modules/emscripten/system/include/libcxx/initializer_list +24 -11
- data/modules/emscripten/system/include/libcxx/iomanip +147 -0
- data/modules/emscripten/system/include/libcxx/ios +24 -16
- data/modules/emscripten/system/include/libcxx/iosfwd +19 -19
- data/modules/emscripten/system/include/libcxx/istream +13 -8
- data/modules/emscripten/system/include/libcxx/iterator +108 -417
- data/modules/emscripten/system/include/libcxx/limits +8 -4
- data/modules/emscripten/system/include/libcxx/list +28 -8
- data/modules/emscripten/system/include/libcxx/locale +153 -390
- data/modules/emscripten/system/include/libcxx/map +280 -100
- data/modules/emscripten/system/include/libcxx/memory +49 -97
- data/modules/emscripten/system/include/libcxx/mutex +2 -2
- data/modules/emscripten/system/include/libcxx/new +43 -14
- data/modules/emscripten/system/include/libcxx/numeric +2 -2
- data/modules/emscripten/system/include/libcxx/optional +697 -0
- data/modules/emscripten/system/include/libcxx/ostream +17 -8
- data/modules/emscripten/system/include/libcxx/queue +5 -5
- data/modules/emscripten/system/include/libcxx/random +53 -51
- data/modules/emscripten/system/include/libcxx/ratio +11 -11
- data/modules/emscripten/system/include/libcxx/readme.txt +1 -1
- data/modules/emscripten/system/include/libcxx/regex +23 -20
- data/modules/emscripten/system/include/libcxx/scoped_allocator +1 -1
- data/modules/emscripten/system/include/libcxx/set +166 -2
- data/modules/emscripten/system/include/libcxx/shared_mutex +419 -0
- data/modules/emscripten/system/include/libcxx/sstream +4 -4
- data/modules/emscripten/system/include/libcxx/stack +3 -3
- data/modules/emscripten/system/include/libcxx/streambuf +5 -5
- data/modules/emscripten/system/include/libcxx/string +372 -324
- data/modules/emscripten/system/include/libcxx/support/ibm/limits.h +99 -0
- data/modules/emscripten/system/include/libcxx/support/ibm/support.h +54 -0
- data/modules/emscripten/system/include/libcxx/support/ibm/xlocale.h +326 -0
- data/modules/emscripten/system/include/libcxx/support/win32/limits_win32.h +6 -6
- data/modules/emscripten/system/include/libcxx/support/win32/locale_win32.h +15 -15
- data/modules/emscripten/system/include/libcxx/support/win32/math_win32.h +2 -0
- data/modules/emscripten/system/include/libcxx/support/win32/support.h +6 -1
- data/modules/emscripten/system/include/libcxx/system_error +14 -8
- data/modules/emscripten/system/include/libcxx/thread +7 -8
- data/modules/emscripten/system/include/libcxx/tuple +29 -88
- data/modules/emscripten/system/include/libcxx/type_traits +253 -209
- data/modules/emscripten/system/include/libcxx/typeindex +3 -3
- data/modules/emscripten/system/include/libcxx/unordered_map +162 -101
- data/modules/emscripten/system/include/libcxx/unordered_set +79 -2
- data/modules/emscripten/system/include/libcxx/utility +20 -20
- data/modules/emscripten/system/include/libcxx/valarray +23 -23
- data/modules/emscripten/system/include/libcxx/vector +114 -91
- data/modules/emscripten/system/lib/libc/musl/src/regex/regcomp.c +3352 -0
- data/modules/emscripten/system/lib/libc/musl/src/regex/regerror.c +35 -0
- data/modules/emscripten/system/lib/libc/musl/src/regex/regexec.c +1011 -0
- data/modules/emscripten/system/lib/libc/musl/src/regex/tre-mem.c +158 -0
- data/modules/emscripten/system/lib/libc/musl/src/regex/tre.h +231 -0
- data/modules/emscripten/system/lib/libcextra.symbols +7 -0
- data/modules/emscripten/system/lib/libcxx/CREDITS.TXT +9 -1
- data/modules/emscripten/system/lib/libcxx/algorithm.cpp +1 -0
- data/modules/emscripten/system/lib/libcxx/debug.cpp +66 -42
- data/modules/emscripten/system/lib/libcxx/exception.cpp +88 -16
- data/modules/emscripten/system/lib/libcxx/future.cpp +6 -0
- data/modules/emscripten/system/lib/libcxx/ios.cpp +7 -2
- data/modules/emscripten/system/lib/libcxx/iostream.cpp +8 -8
- data/modules/emscripten/system/lib/libcxx/locale.cpp +38 -11
- data/modules/emscripten/system/lib/libcxx/mutex.cpp +3 -0
- data/modules/emscripten/system/lib/libcxx/new.cpp +44 -10
- data/modules/emscripten/system/lib/libcxx/optional.cpp +25 -0
- data/modules/emscripten/system/lib/libcxx/random.cpp +26 -0
- data/modules/emscripten/system/lib/libcxx/readme.txt +1 -1
- data/modules/emscripten/system/lib/libcxx/shared_mutex.cpp +101 -0
- data/modules/emscripten/system/lib/libcxx/stdexcept.cpp +11 -7
- data/modules/emscripten/system/lib/libcxx/string.cpp +3 -1
- data/modules/emscripten/system/lib/libcxx/strstream.cpp +7 -7
- data/modules/emscripten/system/lib/libcxx/support/win32/locale_win32.cpp +12 -13
- data/modules/emscripten/system/lib/libcxx/support/win32/support.cpp +33 -36
- data/modules/emscripten/system/lib/libcxx/symbols +187 -168
- data/modules/emscripten/system/lib/libcxx/system_error.cpp +1 -0
- data/modules/emscripten/system/lib/libcxx/thread.cpp +7 -3
- data/modules/emscripten/system/lib/libcxx/typeinfo.cpp +9 -6
- data/modules/emscripten/system/lib/libcxx/valarray.cpp +2 -0
- data/modules/emscripten/third_party/lzma.js/doit.bat +4 -0
- data/modules/emscripten/third_party/lzma.js/doit.sh +9 -2
- data/modules/emscripten/tools/cache.py +5 -7
- data/modules/emscripten/tools/cache.pyc +0 -0
- data/modules/emscripten/tools/eliminator/asm-eliminator-test-output.js +7 -0
- data/modules/emscripten/tools/eliminator/asm-eliminator-test.js +9 -1
- data/modules/emscripten/tools/eliminator/eliminator-test-output.js +3 -0
- data/modules/emscripten/tools/eliminator/eliminator-test.js +9 -1
- data/modules/emscripten/tools/file_packager.py +93 -50
- data/modules/emscripten/tools/js-optimizer.js +98 -48
- data/modules/emscripten/tools/js_optimizer.py +4 -4
- data/modules/emscripten/tools/js_optimizer.pyc +0 -0
- data/modules/emscripten/tools/jsrun.py +1 -1
- data/modules/emscripten/tools/jsrun.pyc +0 -0
- data/modules/emscripten/tools/response_file.py +6 -0
- data/modules/emscripten/tools/response_file.pyc +0 -0
- data/modules/emscripten/tools/settings_template_readonly.py +2 -0
- data/modules/emscripten/tools/shared.py +88 -34
- data/modules/emscripten/tools/shared.pyc +0 -0
- data/modules/emscripten/tools/split.py +21 -13
- data/modules/mruby/build_config.rb +7 -1
- data/modules/mruby/doc/compile/README.md +5 -9
- data/modules/mruby/include/mrbconf.h +5 -2
- data/modules/mruby/include/mruby/array.h +1 -0
- data/modules/mruby/include/mruby/compile.h +2 -4
- data/modules/mruby/include/mruby/dump.h +7 -16
- data/modules/mruby/include/mruby/hash.h +1 -1
- data/modules/mruby/include/mruby/irep.h +14 -2
- data/modules/mruby/include/mruby/khash.h +8 -7
- data/modules/mruby/include/mruby/string.h +1 -0
- data/modules/mruby/include/mruby/value.h +5 -2
- data/modules/mruby/include/mruby.h +12 -13
- data/modules/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +16 -6
- data/modules/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +18 -30
- data/modules/mruby/mrbgems/mruby-fiber/src/fiber.c +21 -0
- data/modules/mruby/mrbgems/mruby-math/src/math.c +1 -1
- data/modules/mruby/mrbgems/mruby-random/src/random.c +144 -47
- data/modules/mruby/mrbgems/mruby-random/test/random.rb +44 -0
- data/modules/mruby/mrbgems/mruby-struct/src/struct.c +5 -5
- data/modules/mruby/mrblib/numeric.rb +99 -33
- data/modules/mruby/src/array.c +11 -4
- data/modules/mruby/src/backtrace.c +2 -2
- data/modules/mruby/src/class.c +49 -30
- data/modules/mruby/src/codegen.c +131 -79
- data/modules/mruby/src/debug.c +1 -1
- data/modules/mruby/src/dump.c +213 -163
- data/modules/mruby/src/error.c +17 -17
- data/modules/mruby/src/error.h +1 -1
- data/modules/mruby/src/etc.c +10 -0
- data/modules/mruby/src/gc.c +35 -17
- data/modules/mruby/src/hash.c +5 -5
- data/modules/mruby/src/kernel.c +36 -14
- data/modules/mruby/src/load.c +238 -296
- data/modules/mruby/src/numeric.c +18 -98
- data/modules/mruby/src/object.c +3 -5
- data/modules/mruby/src/parse.y +63 -56
- data/modules/mruby/src/proc.c +8 -5
- data/modules/mruby/src/re.h +0 -1
- data/modules/mruby/src/state.c +65 -27
- data/modules/mruby/src/string.c +3 -31
- data/modules/mruby/src/symbol.c +3 -3
- data/modules/mruby/src/variable.c +12 -5
- data/modules/mruby/src/vm.c +90 -72
- data/modules/mruby/tasks/mruby_build.rake +10 -1
- data/modules/mruby/tasks/toolchains/gcc.rake +12 -2
- data/modules/mruby/tasks/toolchains/{vs2012.rake → visualcpp.rake} +1 -1
- data/modules/mruby/test/driver.c +3 -3
- data/modules/mruby/test/t/array.rb +5 -5
- data/modules/mruby/test/t/class.rb +14 -1
- data/modules/mruby/test/t/kernel.rb +4 -0
- data/modules/mruby/test/t/module.rb +4 -4
- data/modules/mruby/test/t/nameerror.rb +1 -1
- data/modules/mruby/tools/mrbc/mrbc.c +23 -17
- data/modules/mruby/travis_config.rb +10 -1
- metadata +28 -5
- data/modules/mruby/tasks/toolchains/vs2010.rake +0 -3
@@ -18,8 +18,9 @@ var LLVM = {
|
|
18
18
|
PHI_REACHERS: set('branch', 'switch', 'invoke', 'indirectbr'),
|
19
19
|
EXTENDS: set('sext', 'zext'),
|
20
20
|
COMPS: set('icmp', 'fcmp'),
|
21
|
-
CONVERSIONS: set('inttoptr', 'ptrtoint', 'uitofp', 'sitofp', 'fptosi', 'fptoui'),
|
21
|
+
CONVERSIONS: set('inttoptr', 'ptrtoint', 'uitofp', 'sitofp', 'fptosi', 'fptoui', 'fpext', 'fptrunc'),
|
22
22
|
INTRINSICS_32: set('_llvm_memcpy_p0i8_p0i8_i64', '_llvm_memmove_p0i8_p0i8_i64', '_llvm_memset_p0i8_i64'), // intrinsics that need args converted to i32 in USE_TYPED_ARRAYS == 2
|
23
|
+
MATHOP_IGNORABLES: set('exact', 'nnan', 'ninf', 'nsz', 'arcp', 'fast'),
|
23
24
|
};
|
24
25
|
LLVM.GLOBAL_MODIFIERS = set(keys(LLVM.LINKAGES).concat(['constant', 'global', 'hidden']));
|
25
26
|
|
@@ -253,31 +254,46 @@ var Functions = {
|
|
253
254
|
|
254
255
|
aliases: {}, // in shared modules (MAIN_MODULE or SHARED_MODULE), a list of aliases for functions that have them
|
255
256
|
|
257
|
+
getSignatureLetter: function(type) {
|
258
|
+
switch(type) {
|
259
|
+
case 'float': return 'f';
|
260
|
+
case 'double': return 'd';
|
261
|
+
case 'void': return 'v';
|
262
|
+
default: return 'i';
|
263
|
+
}
|
264
|
+
},
|
265
|
+
|
266
|
+
getSignatureType: function(letter) {
|
267
|
+
switch(letter) {
|
268
|
+
case 'v': return 'void';
|
269
|
+
case 'i': return 'i32';
|
270
|
+
case 'f': return 'float';
|
271
|
+
case 'd': return 'double';
|
272
|
+
default: throw 'what is this sig? ' + sig;
|
273
|
+
}
|
274
|
+
},
|
275
|
+
|
256
276
|
getSignature: function(returnType, argTypes, hasVarArgs) {
|
257
|
-
var sig =
|
277
|
+
var sig = Functions.getSignatureLetter(returnType);
|
258
278
|
for (var i = 0; i < argTypes.length; i++) {
|
259
279
|
var type = argTypes[i];
|
260
280
|
if (!type) break; // varargs
|
261
281
|
if (type in Runtime.FLOAT_TYPES) {
|
262
|
-
sig +=
|
282
|
+
sig += Functions.getSignatureLetter(type);
|
263
283
|
} else {
|
264
284
|
var chunks = getNumIntChunks(type);
|
265
|
-
|
285
|
+
if (chunks > 0) {
|
286
|
+
for (var j = 0; j < chunks; j++) sig += 'i';
|
287
|
+
} else if (type !== '...') {
|
288
|
+
// some special type like a SIMD vector (anything but varargs, which we handle below)
|
289
|
+
sig += Functions.getSignatureLetter(type);
|
290
|
+
}
|
266
291
|
}
|
267
292
|
}
|
268
293
|
if (hasVarArgs) sig += 'i';
|
269
294
|
return sig;
|
270
295
|
},
|
271
296
|
|
272
|
-
getSignatureReturnType: function(sig) {
|
273
|
-
switch(sig[0]) {
|
274
|
-
case 'v': return 'void';
|
275
|
-
case 'i': return 'i32';
|
276
|
-
case 'f': return 'double';
|
277
|
-
default: throw 'what is this sig? ' + sig;
|
278
|
-
}
|
279
|
-
},
|
280
|
-
|
281
297
|
// Mark a function as needing indexing. Python will coordinate them all
|
282
298
|
getIndex: function(ident, sig) {
|
283
299
|
var ret;
|
@@ -331,7 +347,7 @@ var Functions = {
|
|
331
347
|
// Resolve multi-level aliases all the way down
|
332
348
|
while (1) {
|
333
349
|
var varData = Variables.globals[table[i]];
|
334
|
-
if (!(varData && varData.resolvedAlias && varData.resolvedAlias
|
350
|
+
if (!(varData && varData.resolvedAlias && !/(FUNCTION_TABLE_OFFSET|F_BASE_)/.test(varData.resolvedAlias))) break;
|
335
351
|
table[i] = table[+varData.resolvedAlias || eval(varData.resolvedAlias)]; // might need to eval to turn (6) into 6
|
336
352
|
}
|
337
353
|
// Resolve library aliases
|
@@ -350,17 +366,15 @@ var Functions = {
|
|
350
366
|
if (!wrapped[curr]) {
|
351
367
|
var args = '', arg_coercions = '', call = short + '(', retPre = '', retPost = '';
|
352
368
|
if (t[0] != 'v') {
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
} else {
|
357
|
-
retPre = 'return +';
|
358
|
-
}
|
369
|
+
var temp = asmFFICoercion('X', Functions.getSignatureType(t[0])).split('X');
|
370
|
+
retPre = 'return ' + temp[0];
|
371
|
+
retPost = temp[1];
|
359
372
|
}
|
360
373
|
for (var j = 1; j < t.length; j++) {
|
361
374
|
args += (j > 1 ? ',' : '') + 'a' + j;
|
362
|
-
|
363
|
-
|
375
|
+
var type = Functions.getSignatureType(t[j]);
|
376
|
+
arg_coercions += 'a' + j + '=' + asmCoercion('a' + j, type) + ';';
|
377
|
+
call += (j > 1 ? ',' : '') + asmCoercion('a' + j, type === 'float' ? 'double' : type); // ffi arguments must be doubles if they are floats
|
364
378
|
}
|
365
379
|
call += ')';
|
366
380
|
if (short == '_setjmp') printErr('WARNING: setjmp used via a function pointer. If this is for libc setjmp (not something of your own with the same name), it will break things');
|
@@ -415,6 +429,26 @@ var LibraryManager = {
|
|
415
429
|
eval(processMacros(preprocess(read(libraries[i]))));
|
416
430
|
}
|
417
431
|
|
432
|
+
/*
|
433
|
+
// export code for CallHandlers.h
|
434
|
+
printErr('============================');
|
435
|
+
for (var x in this.library) {
|
436
|
+
var y = this.library[x];
|
437
|
+
if (typeof y === 'string' && x.indexOf('__sig') < 0 && x.indexOf('__postset') < 0 && y.indexOf(' ') < 0) {
|
438
|
+
printErr('DEF_REDIRECT_HANDLER(' + x + ', ' + y + ');');
|
439
|
+
}
|
440
|
+
}
|
441
|
+
printErr('============================');
|
442
|
+
for (var x in this.library) {
|
443
|
+
var y = this.library[x];
|
444
|
+
if (typeof y === 'string' && x.indexOf('__sig') < 0 && x.indexOf('__postset') < 0 && y.indexOf(' ') < 0) {
|
445
|
+
printErr(' SETUP_CALL_HANDLER(' + x + ');');
|
446
|
+
}
|
447
|
+
}
|
448
|
+
printErr('============================');
|
449
|
+
// end export code for CallHandlers.h
|
450
|
+
*/
|
451
|
+
|
418
452
|
this.loaded = true;
|
419
453
|
},
|
420
454
|
|
@@ -474,6 +508,11 @@ var PassManager = {
|
|
474
508
|
print('\n//FORWARDED_DATA:' + JSON.stringify({
|
475
509
|
Functions: { tables: Functions.tables }
|
476
510
|
}));
|
511
|
+
} else if (phase == 'glue') {
|
512
|
+
print('\n//FORWARDED_DATA:' + JSON.stringify({
|
513
|
+
Functions: Functions,
|
514
|
+
EXPORTED_FUNCTIONS: EXPORTED_FUNCTIONS
|
515
|
+
}));
|
477
516
|
}
|
478
517
|
},
|
479
518
|
load: function(json) {
|
@@ -487,6 +526,7 @@ var PassManager = {
|
|
487
526
|
for (var i in data.Functions) {
|
488
527
|
Functions[i] = data.Functions[i];
|
489
528
|
}
|
529
|
+
EXPORTED_FUNCTIONS = data.EXPORTED_FUNCTIONS;
|
490
530
|
/*
|
491
531
|
print('\n//LOADED_DATA:' + phase + ':' + JSON.stringify({
|
492
532
|
Types: Types,
|
@@ -157,6 +157,10 @@ function isStructType(type) {
|
|
157
157
|
return type[0] == '%';
|
158
158
|
}
|
159
159
|
|
160
|
+
function isVectorType(type) {
|
161
|
+
return type[type.length-1] === '>';
|
162
|
+
}
|
163
|
+
|
160
164
|
function isStructuralType(type) {
|
161
165
|
return /^{ ?[^}]* ?}$/.test(type); // { i32, i8 } etc. - anonymous struct types
|
162
166
|
}
|
@@ -215,8 +219,22 @@ function isIdenticallyImplemented(type1, type2) {
|
|
215
219
|
}
|
216
220
|
|
217
221
|
function isIllegalType(type) {
|
218
|
-
|
219
|
-
|
222
|
+
switch (type) {
|
223
|
+
case 'i1':
|
224
|
+
case 'i8':
|
225
|
+
case 'i16':
|
226
|
+
case 'i32':
|
227
|
+
case 'float':
|
228
|
+
case 'double':
|
229
|
+
case 'rawJS':
|
230
|
+
case '<2 x float>':
|
231
|
+
case '<4 x float>':
|
232
|
+
case '<2 x i32>':
|
233
|
+
case '<4 x i32>':
|
234
|
+
case 'void': return false;
|
235
|
+
}
|
236
|
+
if (!type || type[type.length-1] === '*') return false;
|
237
|
+
return true;
|
220
238
|
}
|
221
239
|
|
222
240
|
function isVoidType(type) {
|
@@ -287,6 +305,9 @@ function getReturnType(type) {
|
|
287
305
|
if (pointingLevels(type) > 1) return '*'; // the type of a call can be either the return value, or the entire function. ** or more means it is a return value
|
288
306
|
var lastOpen = type.lastIndexOf('(');
|
289
307
|
if (lastOpen > 0) {
|
308
|
+
// handle things like void (i32)* (i32, void (i32)*)*
|
309
|
+
var closeStar = type.indexOf(')*');
|
310
|
+
if (closeStar > 0 && closeStar < type.length-2) lastOpen = closeStar+3;
|
290
311
|
return type.substr(0, lastOpen-1);
|
291
312
|
}
|
292
313
|
return type;
|
@@ -328,28 +349,29 @@ function getVectorSize(type) {
|
|
328
349
|
return parseInt(type.substring(1, type.indexOf(' ')));
|
329
350
|
}
|
330
351
|
|
331
|
-
function
|
352
|
+
function getVectorNativeType(type) {
|
332
353
|
Types.usesSIMD = true;
|
333
354
|
switch (type) {
|
334
355
|
case '<2 x float>':
|
335
356
|
case '<4 x float>': return 'float';
|
336
357
|
case '<2 x i32>':
|
337
|
-
case '<4 x i32>': return '
|
358
|
+
case '<4 x i32>': return 'i32';
|
338
359
|
default: throw 'unknown vector type ' + type;
|
339
360
|
}
|
340
361
|
}
|
341
362
|
|
342
|
-
function
|
343
|
-
Types.usesSIMD = true;
|
363
|
+
function getSIMDName(type) {
|
344
364
|
switch (type) {
|
345
|
-
case '
|
346
|
-
case '
|
347
|
-
|
348
|
-
case '<4 x i32>': return 'i32';
|
349
|
-
default: throw 'unknown vector type ' + type;
|
365
|
+
case 'i32': return 'int';
|
366
|
+
case 'float': return 'float';
|
367
|
+
default: throw 'getSIMDName ' + type;
|
350
368
|
}
|
351
369
|
}
|
352
370
|
|
371
|
+
function getVectorBaseType(type) {
|
372
|
+
return getSIMDName(getVectorNativeType(type));
|
373
|
+
}
|
374
|
+
|
353
375
|
function addIdent(token) {
|
354
376
|
token.ident = token.text;
|
355
377
|
return token;
|
@@ -465,26 +487,13 @@ function parseParamTokens(params) {
|
|
465
487
|
Types.needAnalysis[ret[ret.length-1].type] = 0;
|
466
488
|
anonymousIndex ++;
|
467
489
|
}
|
468
|
-
} else if (segment[1].text in PARSABLE_LLVM_FUNCTIONS) {
|
469
|
-
ret.push(parseLLVMFunctionCall(segment));
|
470
|
-
} else if (segment[1].text === 'blockaddress') {
|
471
|
-
ret.push(parseBlockAddress(segment));
|
472
|
-
} else if (segment[1].type && segment[1].type == '{') {
|
473
|
-
ret.push(parseLLVMSegment(segment));
|
474
490
|
} else {
|
475
491
|
if (segment[2] && segment[2].text == 'to') { // part of bitcast params
|
476
492
|
segment = segment.slice(0, 2);
|
477
493
|
}
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
}
|
482
|
-
ret.push({
|
483
|
-
intertype: 'value',
|
484
|
-
type: segment[0].text,
|
485
|
-
ident: toNiceIdent(parseNumerical(segment[1].text, segment[0].text))
|
486
|
-
});
|
487
|
-
Types.needAnalysis[removeAllPointing(ret[ret.length-1].type)] = 0;
|
494
|
+
var parsed = parseLLVMSegment(segment);
|
495
|
+
if (parsed.intertype === 'value' && !isIllegalType(parsed.type)) parsed.ident = parseNumerical(parsed.ident, parsed.type);
|
496
|
+
ret.push(parsed);
|
488
497
|
}
|
489
498
|
ret[ret.length-1].byVal = byVal;
|
490
499
|
}
|
@@ -558,25 +567,6 @@ function sortGlobals(globals) {
|
|
558
567
|
});
|
559
568
|
}
|
560
569
|
|
561
|
-
function finalizeParam(param) {
|
562
|
-
if (param.intertype in PARSABLE_LLVM_FUNCTIONS) {
|
563
|
-
return finalizeLLVMFunctionCall(param);
|
564
|
-
} else if (param.intertype === 'blockaddress') {
|
565
|
-
return finalizeBlockAddress(param);
|
566
|
-
} else if (param.intertype === 'jsvalue') {
|
567
|
-
return param.ident;
|
568
|
-
} else {
|
569
|
-
if (param.type == 'i64' && USE_TYPED_ARRAYS == 2) {
|
570
|
-
return parseI64Constant(param.ident);
|
571
|
-
}
|
572
|
-
var ret = toNiceIdent(param.ident);
|
573
|
-
if (ret in Variables.globals) {
|
574
|
-
ret = makeGlobalUse(ret);
|
575
|
-
}
|
576
|
-
return ret;
|
577
|
-
}
|
578
|
-
}
|
579
|
-
|
580
570
|
// Segment ==> Parameter
|
581
571
|
function parseLLVMSegment(segment) {
|
582
572
|
var type;
|
@@ -613,10 +603,11 @@ function parseLLVMSegment(segment) {
|
|
613
603
|
type = segment[0].text;
|
614
604
|
if (type[type.length-1] === '>' && segment[1].text[0] === '<') {
|
615
605
|
// vector literal
|
606
|
+
var nativeType = getVectorNativeType(type);
|
616
607
|
return {
|
617
608
|
intertype: 'vector',
|
618
609
|
idents: splitTokenList(segment[1].tokens).map(function(pair) {
|
619
|
-
return pair[1].text;
|
610
|
+
return parseNumerical(pair[1].text, nativeType);
|
620
611
|
}),
|
621
612
|
type: type
|
622
613
|
};
|
@@ -639,6 +630,8 @@ function cleanSegment(segment) {
|
|
639
630
|
|
640
631
|
var MATHOPS = set(['add', 'sub', 'sdiv', 'udiv', 'mul', 'icmp', 'zext', 'urem', 'srem', 'fadd', 'fsub', 'fmul', 'fdiv', 'fcmp', 'frem', 'uitofp', 'sitofp', 'fpext', 'fptrunc', 'fptoui', 'fptosi', 'trunc', 'sext', 'select', 'shl', 'shr', 'ashl', 'ashr', 'lshr', 'lshl', 'xor', 'or', 'and', 'ptrtoint', 'inttoptr']);
|
641
632
|
|
633
|
+
var JS_MATH_BUILTINS = set(['Math_sin', 'Math_cos', 'Math_tan', 'Math_asin', 'Math_acos', 'Math_atan', 'Math_ceil', 'Math_floor', 'Math_exp', 'Math_log', 'Math_sqrt']);
|
634
|
+
|
642
635
|
var PARSABLE_LLVM_FUNCTIONS = set('getelementptr', 'bitcast');
|
643
636
|
mergeInto(PARSABLE_LLVM_FUNCTIONS, MATHOPS);
|
644
637
|
|
@@ -798,8 +791,8 @@ function splitI64(value, floatConversion) {
|
|
798
791
|
var high = makeInlineCalculation(
|
799
792
|
asmCoercion('Math_abs(VALUE)', 'double') + ' >= ' + asmEnsureFloat('1', 'double') + ' ? ' +
|
800
793
|
'(VALUE > ' + asmEnsureFloat('0', 'double') + ' ? ' +
|
801
|
-
asmCoercion('Math_min(' + asmCoercion('Math_floor((VALUE)/' + asmEnsureFloat(4294967296, '
|
802
|
-
' : ' + asmFloatToInt(asmCoercion('Math_ceil((VALUE - +((' + asmFloatToInt('VALUE') + ')>>>0))/' + asmEnsureFloat(4294967296, '
|
794
|
+
asmCoercion('Math_min(' + asmCoercion('Math_floor((VALUE)/' + asmEnsureFloat(4294967296, 'double') + ')', 'double') + ', ' + asmEnsureFloat(4294967295, 'double') + ')', 'i32') + '>>>0' +
|
795
|
+
' : ' + asmFloatToInt(asmCoercion('Math_ceil((VALUE - +((' + asmFloatToInt('VALUE') + ')>>>0))/' + asmEnsureFloat(4294967296, 'double') + ')', 'double')) + '>>>0' +
|
803
796
|
')' +
|
804
797
|
' : 0',
|
805
798
|
value,
|
@@ -991,6 +984,12 @@ function parseLLVMString(str) {
|
|
991
984
|
return ret;
|
992
985
|
}
|
993
986
|
|
987
|
+
function expandLLVMString(str) {
|
988
|
+
return str.replace(/\\../g, function(m) {
|
989
|
+
return String.fromCharCode(parseInt(m.substr(1), '16'));
|
990
|
+
});
|
991
|
+
}
|
992
|
+
|
994
993
|
function getLabelIds(labels) {
|
995
994
|
return labels.map(function(label) { return label.ident });
|
996
995
|
}
|
@@ -1009,11 +1008,9 @@ function getOldLabel(label) {
|
|
1009
1008
|
}
|
1010
1009
|
|
1011
1010
|
function calcAllocatedSize(type) {
|
1012
|
-
|
1013
|
-
|
1014
|
-
|
1015
|
-
return Runtime.getNativeTypeSize(type); // We can really get away with '1', though, at least on the stack...
|
1016
|
-
}
|
1011
|
+
var ret = Runtime.getNativeTypeSize(type);
|
1012
|
+
if (ret) return ret;
|
1013
|
+
return Types.types[type].flatSize; // known type
|
1017
1014
|
}
|
1018
1015
|
|
1019
1016
|
// Generates the type signature for a structure, for each byte, the type that is there.
|
@@ -1173,32 +1170,37 @@ function makeVarDef(js) {
|
|
1173
1170
|
return js;
|
1174
1171
|
}
|
1175
1172
|
|
1173
|
+
function ensureDot(value) {
|
1174
|
+
value = value.toString();
|
1175
|
+
// if already dotted, or Infinity or NaN, nothing to do here
|
1176
|
+
// if smaller than 1 and running js opts, we always need to force a coercion (0.001 will turn into 1e-3, which has no .)
|
1177
|
+
if ((value.indexOf('.') >= 0 || /[IN]/.test(value)) && (!RUNNING_JS_OPTS || Math.abs(value) >= 1)) return value;
|
1178
|
+
if (RUNNING_JS_OPTS) return '(+' + value + ')'; // JS optimizer will run, we must do +x, and it will be corrected later
|
1179
|
+
var e = value.indexOf('e');
|
1180
|
+
if (e < 0) return value + '.0';
|
1181
|
+
return value.substr(0, e) + '.0' + value.substr(e);
|
1182
|
+
}
|
1183
|
+
|
1176
1184
|
function asmEnsureFloat(value, type) { // ensures that a float type has either 5.5 (clearly a float) or +5 (float due to asm coercion)
|
1177
1185
|
if (!ASM_JS) return value;
|
1178
|
-
|
1179
|
-
if (
|
1180
|
-
if (
|
1181
|
-
|
1182
|
-
|
1183
|
-
|
1184
|
-
|
1185
|
-
|
1186
|
-
|
1187
|
-
if (e < 0) return value + '.0';
|
1188
|
-
return value.substr(0, e) + '.0' + value.substr(e);
|
1189
|
-
}
|
1186
|
+
if (!isNumber(value)) return value;
|
1187
|
+
if (PRECISE_F32 && type === 'float') {
|
1188
|
+
// normally ok to just emit Math_fround(0), but if the constant is large we may need a .0 (if it can't fit in an int)
|
1189
|
+
if (value == 0) return 'Math_fround(0)';
|
1190
|
+
value = ensureDot(value);
|
1191
|
+
return 'Math_fround(' + value + ')';
|
1192
|
+
}
|
1193
|
+
if (type in Runtime.FLOAT_TYPES) {
|
1194
|
+
return ensureDot(value);
|
1190
1195
|
} else {
|
1191
1196
|
return value;
|
1192
1197
|
}
|
1193
1198
|
}
|
1194
1199
|
|
1195
|
-
function asmInitializer(type
|
1200
|
+
function asmInitializer(type) {
|
1196
1201
|
if (type in Runtime.FLOAT_TYPES) {
|
1197
|
-
if (
|
1198
|
-
|
1199
|
-
} else {
|
1200
|
-
return '.0';
|
1201
|
-
}
|
1202
|
+
if (PRECISE_F32 && type === 'float') return 'Math_fround(0)';
|
1203
|
+
return RUNNING_JS_OPTS ? '+0' : '.0';
|
1202
1204
|
} else {
|
1203
1205
|
return '0';
|
1204
1206
|
}
|
@@ -1219,7 +1221,11 @@ function asmCoercion(value, type, signedness) {
|
|
1219
1221
|
value = '(' + value + ')|0';
|
1220
1222
|
}
|
1221
1223
|
}
|
1222
|
-
|
1224
|
+
if (PRECISE_F32 && type === 'float') {
|
1225
|
+
return 'Math_fround(' + value + ')';
|
1226
|
+
} else {
|
1227
|
+
return '(+(' + value + '))';
|
1228
|
+
}
|
1223
1229
|
}
|
1224
1230
|
} else {
|
1225
1231
|
return '((' + value + ')|0)';
|
@@ -1448,7 +1454,7 @@ function makeSetValues(ptr, pos, value, type, num, align) {
|
|
1448
1454
|
// If we don't know how to handle this at compile-time, or handling it is best done in a large amount of code, call memset
|
1449
1455
|
// TODO: optimize the case of numeric num but non-numeric value
|
1450
1456
|
if (!isNumber(num) || !isNumber(value) || (parseInt(num)/align >= UNROLL_LOOP_MAX)) {
|
1451
|
-
return '_memset(' + asmCoercion(getFastValue(ptr, '+', pos), 'i32') + ', ' + asmCoercion(value, 'i32') + ', ' + asmCoercion(num, 'i32') + ')';
|
1457
|
+
return '_memset(' + asmCoercion(getFastValue(ptr, '+', pos), 'i32') + ', ' + asmCoercion(value, 'i32') + ', ' + asmCoercion(num, 'i32') + ')|0';
|
1452
1458
|
}
|
1453
1459
|
num = parseInt(num);
|
1454
1460
|
value = parseInt(value);
|
@@ -1809,7 +1815,7 @@ function makeGetSlabs(ptr, type, allowMultiple, unsigned) {
|
|
1809
1815
|
switch(type) {
|
1810
1816
|
case 'i1': case 'i8': return [unsigned ? 'HEAPU8' : 'HEAP8']; break;
|
1811
1817
|
case 'i16': return [unsigned ? 'HEAPU16' : 'HEAP16']; break;
|
1812
|
-
case '<4 x i32>':
|
1818
|
+
case '<4 x i32>':
|
1813
1819
|
case 'i32': case 'i64': return [unsigned ? 'HEAPU32' : 'HEAP32']; break;
|
1814
1820
|
case 'double': {
|
1815
1821
|
if (TARGET_LE32) return ['HEAPF64']; // in le32, we do have the ability to assume 64-bit alignment
|
@@ -2002,6 +2008,8 @@ function finalizeLLVMParameter(param, noIndexizeFunctions) {
|
|
2002
2008
|
} else if (param.ident == 'zeroinitializer') {
|
2003
2009
|
if (isStructType(param.type)) {
|
2004
2010
|
return makeLLVMStruct(zeros(Types.types[param.type].fields.length));
|
2011
|
+
} else if (isVectorType(param.type)) {
|
2012
|
+
return ensureVector(0, getVectorBaseType(param.type));
|
2005
2013
|
} else {
|
2006
2014
|
return '0';
|
2007
2015
|
}
|
@@ -2024,7 +2032,7 @@ function finalizeLLVMParameter(param, noIndexizeFunctions) {
|
|
2024
2032
|
} else if (param.intertype == 'mathop') {
|
2025
2033
|
return processMathop(param);
|
2026
2034
|
} else if (param.intertype === 'vector') {
|
2027
|
-
return '
|
2035
|
+
return getVectorBaseType(param.type) + '32x4(' + param.idents.join(',') + ')';
|
2028
2036
|
} else {
|
2029
2037
|
throw 'invalid llvm parameter: ' + param.intertype;
|
2030
2038
|
}
|
@@ -2051,7 +2059,7 @@ function makeSignOp(value, type, op, force, ignore) {
|
|
2051
2059
|
if (isPointerType(type)) type = 'i32'; // Pointers are treated as 32-bit ints
|
2052
2060
|
if (!value) return value;
|
2053
2061
|
var bits, full;
|
2054
|
-
if (type
|
2062
|
+
if (type[0] === 'i') {
|
2055
2063
|
bits = parseInt(type.substr(1));
|
2056
2064
|
full = op + 'Sign(' + value + ', ' + bits + ', ' + Math.floor(ignore || correctSpecificSign()) + ')';
|
2057
2065
|
// Always sign/unsign constants at compile time, regardless of CHECK/CORRECT
|
@@ -2060,7 +2068,7 @@ function makeSignOp(value, type, op, force, ignore) {
|
|
2060
2068
|
}
|
2061
2069
|
}
|
2062
2070
|
if ((ignore || !correctSigns()) && !CHECK_SIGNS && !force) return value;
|
2063
|
-
if (type
|
2071
|
+
if (type[0] === 'i') {
|
2064
2072
|
// this is an integer, but not a number (or we would have already handled it)
|
2065
2073
|
// shortcuts
|
2066
2074
|
if (!CHECK_SIGNS || ignore) {
|
@@ -2133,14 +2141,14 @@ function makeRounding(value, bits, signed, floatConversion) {
|
|
2133
2141
|
}
|
2134
2142
|
}
|
2135
2143
|
|
2136
|
-
function makeIsNaN(value) {
|
2137
|
-
if (ASM_JS) return makeInlineCalculation('((VALUE) != (VALUE))', value, 'tempDouble');
|
2144
|
+
function makeIsNaN(value, type) {
|
2145
|
+
if (ASM_JS) return makeInlineCalculation('((VALUE) != (VALUE))', value, type === 'float' ? 'tempFloat' : 'tempDouble');
|
2138
2146
|
return 'isNaN(' + value + ')';
|
2139
2147
|
}
|
2140
2148
|
|
2141
2149
|
function makeFloat(value, type) {
|
2142
|
-
if (
|
2143
|
-
return '
|
2150
|
+
if (PRECISE_F32 && type == 'float') {
|
2151
|
+
return 'Math_fround(' + value + ')';
|
2144
2152
|
}
|
2145
2153
|
return value;
|
2146
2154
|
}
|
@@ -2257,8 +2265,8 @@ function processMathop(item) {
|
|
2257
2265
|
case 'lshr': {
|
2258
2266
|
throw 'shifts should have been legalized!';
|
2259
2267
|
}
|
2260
|
-
case 'uitofp': case 'sitofp': return RuntimeGenerator.makeBigInt(low1, high1, op[0] == 'u');
|
2261
|
-
case 'fptoui': case 'fptosi': return finish(splitI64(idents[0], true));
|
2268
|
+
case 'uitofp': case 'sitofp': return makeFloat(RuntimeGenerator.makeBigInt(low1, high1, op[0] == 'u'), item.type);
|
2269
|
+
case 'fptoui': case 'fptosi': return finish(splitI64(asmCoercion(idents[0], 'double'), true)); // coerce to double before conversion to i64
|
2262
2270
|
case 'icmp': {
|
2263
2271
|
switch (variant) {
|
2264
2272
|
case 'uge': return '((' + high1 + '>>>0) >= (' + high2 + '>>>0)) & ((((' + high1 + '>>>0) > (' + high2 + '>>>0)) | ' +
|
@@ -2287,7 +2295,7 @@ function processMathop(item) {
|
|
2287
2295
|
case 'trunc': {
|
2288
2296
|
return '((' + idents[0] + '[0]) & ' + (Math.pow(2, bitsLeft)-1) + ')';
|
2289
2297
|
}
|
2290
|
-
case 'select': return idents[0] + ' ? ' + makeCopyI64(idents[1]) + ' : ' + makeCopyI64(idents[2])
|
2298
|
+
case 'select': return '(' + idents[0] + ' ? ' + makeCopyI64(idents[1]) + ' : ' + makeCopyI64(idents[2]) + ')';;
|
2291
2299
|
case 'ptrtoint': return makeI64(idents[0], 0);
|
2292
2300
|
case 'inttoptr': {
|
2293
2301
|
var m = /\(?\[(\d+),\d+\]\)?/.exec(idents[0]);
|
@@ -2364,26 +2372,28 @@ function processMathop(item) {
|
|
2364
2372
|
// vector/SIMD operation
|
2365
2373
|
Types.usesSIMD = true;
|
2366
2374
|
switch (op) {
|
2367
|
-
case 'fadd': return 'SIMD.add(' + idents[0] + ',' + idents[1] + ')';
|
2368
|
-
case 'fsub': return 'SIMD.sub(' + idents[0] + ',' + idents[1] + ')';
|
2369
|
-
case 'fmul': return 'SIMD.mul(' + idents[0] + ',' + idents[1] + ')';
|
2370
|
-
case 'fdiv': return 'SIMD.div(' + idents[0] + ',' + idents[1] + ')';
|
2371
|
-
case 'add' : return 'SIMD.
|
2372
|
-
case 'sub' : return 'SIMD.
|
2373
|
-
case 'mul' : return 'SIMD.
|
2374
|
-
case 'udiv': return 'SIMD.divu32(' + idents[0] + ',' + idents[1] + ')';
|
2375
|
+
case 'fadd': return 'SIMD.float32x4.add(' + idents[0] + ',' + idents[1] + ')';
|
2376
|
+
case 'fsub': return 'SIMD.float32x4.sub(' + idents[0] + ',' + idents[1] + ')';
|
2377
|
+
case 'fmul': return 'SIMD.float32x4.mul(' + idents[0] + ',' + idents[1] + ')';
|
2378
|
+
case 'fdiv': return 'SIMD.float32x4.div(' + idents[0] + ',' + idents[1] + ')';
|
2379
|
+
case 'add' : return 'SIMD.int32x4.add(' + idents[0] + ',' + idents[1] + ')';
|
2380
|
+
case 'sub' : return 'SIMD.int32x4.sub(' + idents[0] + ',' + idents[1] + ')';
|
2381
|
+
case 'mul' : return 'SIMD.int32x4.mul(' + idents[0] + ',' + idents[1] + ')';
|
2375
2382
|
case 'bitcast': {
|
2376
2383
|
var inType = item.params[0].type;
|
2377
2384
|
var outType = item.type;
|
2378
2385
|
if (inType === '<4 x float>') {
|
2379
2386
|
assert(outType === '<4 x i32>');
|
2380
|
-
return 'SIMD.
|
2387
|
+
return 'SIMD.float32x4.bitsToInt32x4(' + idents[0] + ')';
|
2381
2388
|
} else {
|
2382
2389
|
assert(inType === '<4 x i32>');
|
2383
2390
|
assert(outType === '<4 x float>');
|
2384
|
-
return 'SIMD.
|
2391
|
+
return 'SIMD.int32x4.bitsToFloat32x4(' + idents[0] + ')';
|
2385
2392
|
}
|
2386
2393
|
}
|
2394
|
+
case 'and': return 'SIMD.int32x4.and(' + idents[0] + ',' + idents[1] + ')';
|
2395
|
+
case 'or': return 'SIMD.int32x4.or(' + idents[0] + ',' + idents[1] + ')';
|
2396
|
+
case 'xor': return 'SIMD.int32x4.xor(' + idents[0] + ',' + idents[1] + ')';
|
2387
2397
|
default: throw 'vector op todo: ' + dump(item);
|
2388
2398
|
}
|
2389
2399
|
}
|
@@ -2439,12 +2449,17 @@ function processMathop(item) {
|
|
2439
2449
|
case 'fdiv': return makeFloat(getFastValue(idents[0], '/', idents[1], item.type), item.type);
|
2440
2450
|
case 'fmul': return makeFloat(getFastValue(idents[0], '*', idents[1], item.type), item.type);
|
2441
2451
|
case 'frem': return makeFloat(getFastValue(idents[0], '%', idents[1], item.type), item.type);
|
2442
|
-
case 'uitofp': case 'sitofp': return asmCoercion(idents[0],
|
2452
|
+
case 'uitofp': case 'sitofp': return asmCoercion(idents[0], item.type, op[0]);
|
2443
2453
|
case 'fptoui': case 'fptosi': return makeRounding(idents[0], bitsLeft, op === 'fptosi', true);
|
2444
2454
|
|
2445
2455
|
// TODO: We sometimes generate false instead of 0, etc., in the *cmps. It seemed slightly faster before, but worth rechecking
|
2446
2456
|
// Note that with typed arrays, these become 0 when written. So that is a potential difference with non-typed array runs.
|
2447
2457
|
case 'icmp': {
|
2458
|
+
// unsigned coercions can be (X&Y), which is not a valid asm coercion for comparisons
|
2459
|
+
if (ASM_JS && variant[0] === 'u') {
|
2460
|
+
if (idents[0].indexOf('>>>') < 0) idents[0] = '((' + idents[0] + ')>>>0)';
|
2461
|
+
if (idents[1].indexOf('>>>') < 0) idents[1] = '((' + idents[1] + ')>>>0)';
|
2462
|
+
}
|
2448
2463
|
switch (variant) {
|
2449
2464
|
case 'uge': case 'sge': return idents[0] + '>=' + idents[1];
|
2450
2465
|
case 'ule': case 'sle': return idents[0] + '<=' + idents[1];
|
@@ -2471,8 +2486,8 @@ function processMathop(item) {
|
|
2471
2486
|
case 'ult': case 'olt': return idents[0] + '<' + idents[1];
|
2472
2487
|
case 'une': case 'one': return idents[0] + '!=' + idents[1];
|
2473
2488
|
case 'ueq': case 'oeq': return idents[0] + '==' + idents[1];
|
2474
|
-
case 'ord': return '!' + makeIsNaN(idents[0]) + '&!' + makeIsNaN(idents[1]);
|
2475
|
-
case 'uno': return makeIsNaN(idents[0]) + '|' + makeIsNaN(idents[1]);
|
2489
|
+
case 'ord': return '!' + makeIsNaN(idents[0], paramTypes[0]) + '&!' + makeIsNaN(idents[1], paramTypes[0]);
|
2490
|
+
case 'uno': return makeIsNaN(idents[0], paramTypes[0]) + '|' + makeIsNaN(idents[1], paramTypes[0]);
|
2476
2491
|
case 'true': return '1';
|
2477
2492
|
default: throw 'Unknown fcmp variant: ' + variant;
|
2478
2493
|
}
|
@@ -2486,9 +2501,16 @@ function processMathop(item) {
|
|
2486
2501
|
}
|
2487
2502
|
// otherwise, fall through
|
2488
2503
|
}
|
2489
|
-
case '
|
2490
|
-
case '
|
2491
|
-
|
2504
|
+
case 'sext': return idents[0];
|
2505
|
+
case 'fpext': {
|
2506
|
+
if (PRECISE_F32) return '+(' + idents[0] + ')';
|
2507
|
+
return idents[0];
|
2508
|
+
}
|
2509
|
+
case 'fptrunc': {
|
2510
|
+
if (PRECISE_F32) return 'Math_fround(' + idents[0] + ')';
|
2511
|
+
return idents[0];
|
2512
|
+
}
|
2513
|
+
case 'select': return '(' + idents[0] + '?' + asmEnsureFloat(idents[1], item.type) + ':' + asmEnsureFloat(idents[2], item.type) + ')';
|
2492
2514
|
case 'ptrtoint': case 'inttoptr': {
|
2493
2515
|
var ret = '';
|
2494
2516
|
if (QUANTUM_SIZE == 1) {
|
@@ -2675,6 +2697,17 @@ var simdLane = ['x', 'y', 'z', 'w'];
|
|
2675
2697
|
|
2676
2698
|
function ensureVector(ident, base) {
|
2677
2699
|
Types.usesSIMD = true;
|
2678
|
-
return ident == 0 ? base + '32x4.
|
2700
|
+
return ident == 0 ? base + '32x4.splat(0)' : ident;
|
2701
|
+
}
|
2702
|
+
|
2703
|
+
function ensureValidFFIType(type) {
|
2704
|
+
return type === 'float' ? 'double' : type; // ffi does not tolerate float XXX
|
2705
|
+
}
|
2706
|
+
|
2707
|
+
// FFI return values must arrive as doubles, and we can force them to floats afterwards
|
2708
|
+
function asmFFICoercion(value, type) {
|
2709
|
+
value = asmCoercion(value, ensureValidFFIType(type));
|
2710
|
+
if (PRECISE_F32 && type === 'float') value = asmCoercion(value, 'float');
|
2711
|
+
return value;
|
2679
2712
|
}
|
2680
2713
|
|
@@ -33,12 +33,11 @@ ExitStatus.prototype.constructor = ExitStatus;
|
|
33
33
|
var initialStackTop;
|
34
34
|
var preloadStartTime = null;
|
35
35
|
var calledMain = false;
|
36
|
-
var calledRun = false;
|
37
36
|
|
38
37
|
dependenciesFulfilled = function runCaller() {
|
39
38
|
// If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)
|
40
|
-
if (!calledRun && shouldRunNow) run();
|
41
|
-
if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled
|
39
|
+
if (!Module['calledRun'] && shouldRunNow) run();
|
40
|
+
if (!Module['calledRun']) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled
|
42
41
|
}
|
43
42
|
|
44
43
|
Module['callMain'] = Module.callMain = function callMain(args) {
|
@@ -128,7 +127,7 @@ function run(args) {
|
|
128
127
|
|
129
128
|
preMain();
|
130
129
|
|
131
|
-
calledRun = true;
|
130
|
+
Module['calledRun'] = true;
|
132
131
|
if (Module['_main'] && shouldRunNow) {
|
133
132
|
Module['callMain'](args);
|
134
133
|
}
|