summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/RemoveUnusedBrs.cpp36
-rw-r--r--src/tools/translate-to-fuzz.h18
-rw-r--r--src/tools/wasm-opt.cpp69
-rw-r--r--src/wasm-builder.h4
-rw-r--r--src/wasm/wasm.cpp4
-rw-r--r--test/passes/remove-unused-brs.txt46
-rw-r--r--test/passes/remove-unused-brs.wast46
-rw-r--r--test/passes/simplify-locals.txt16
-rw-r--r--test/passes/simplify-locals.wast13
-rw-r--r--test/passes/translate-to-fuzz.txt1738
10 files changed, 1230 insertions, 760 deletions
diff --git a/src/passes/RemoveUnusedBrs.cpp b/src/passes/RemoveUnusedBrs.cpp
index 8994c7fe2..e627ce138 100644
--- a/src/passes/RemoveUnusedBrs.cpp
+++ b/src/passes/RemoveUnusedBrs.cpp
@@ -31,6 +31,8 @@ namespace wasm {
// condition and possible value, and the possible value must
// not have side effects (as they would run unconditionally)
static bool canTurnIfIntoBrIf(Expression* ifCondition, Expression* brValue, PassOptions& options) {
+ // if the if isn't even taken, this is all dead code anyhow
+ if (ifCondition->type == unreachable) return false;
if (!brValue) return true;
EffectAnalyzer value(options, brValue);
if (value.hasSideEffects()) return false;
@@ -72,7 +74,7 @@ struct RemoveUnusedBrs : public WalkerPass<PostWalker<RemoveUnusedBrs>> {
flows.push_back(currp);
self->valueCanFlow = true; // start optimistic
} else {
- self->valueCanFlow = false;
+ self->stopValueFlow();
}
} else if (curr->is<Return>()) {
flows.clear();
@@ -80,6 +82,11 @@ struct RemoveUnusedBrs : public WalkerPass<PostWalker<RemoveUnusedBrs>> {
self->valueCanFlow = true; // start optimistic
} else if (curr->is<If>()) {
auto* iff = curr->cast<If>();
+ if (iff->condition->type == unreachable) {
+ // avoid trying to optimize this, we never reach it anyhow
+ self->stopFlow();
+ return;
+ }
if (iff->ifFalse) {
assert(self->ifStack.size() > 0);
for (auto* flow : self->ifStack.back()) {
@@ -88,7 +95,7 @@ struct RemoveUnusedBrs : public WalkerPass<PostWalker<RemoveUnusedBrs>> {
self->ifStack.pop_back();
} else {
// if without else stops the flow of values
- self->valueCanFlow = false;
+ self->stopValueFlow();
}
} else if (curr->is<Block>()) {
// any breaks flowing to here are unnecessary, as we get here anyhow
@@ -126,16 +133,31 @@ struct RemoveUnusedBrs : public WalkerPass<PostWalker<RemoveUnusedBrs>> {
}
} else if (curr->is<Nop>()) {
// ignore (could be result of a previous cycle)
- self->valueCanFlow = false;
+ self->stopValueFlow();
} else if (curr->is<Loop>()) {
// do nothing - it's ok for values to flow out
} else {
// anything else stops the flow
- flows.clear();
- self->valueCanFlow = false;
+ self->stopFlow();
}
}
+ void stopFlow() {
+ flows.clear();
+ valueCanFlow = false;
+ }
+
+ void stopValueFlow() {
+ flows.erase(std::remove_if(flows.begin(), flows.end(), [&](Expression** currp) {
+ auto* curr = *currp;
+ if (auto* ret = curr->dynCast<Return>()) {
+ return ret->value;
+ }
+ return curr->cast<Break>()->value;
+ }), flows.end());
+ valueCanFlow = false;
+ }
+
static void clear(RemoveUnusedBrs* self, Expression** currp) {
self->flows.clear();
}
@@ -171,6 +193,10 @@ struct RemoveUnusedBrs : public WalkerPass<PostWalker<RemoveUnusedBrs>> {
auto* iff = (*currp)->dynCast<If>();
if (iff) {
+ if (iff->condition->type == unreachable) {
+ // avoid trying to optimize this, we never reach it anyhow
+ return;
+ }
self->pushTask(doVisitIf, currp);
if (iff->ifFalse) {
// we need to join up if-else control flow, and clear after the condition
diff --git a/src/tools/translate-to-fuzz.h b/src/tools/translate-to-fuzz.h
index a7f86af13..307604af6 100644
--- a/src/tools/translate-to-fuzz.h
+++ b/src/tools/translate-to-fuzz.h
@@ -87,7 +87,7 @@ private:
// the number of runtime iterations (function calls, loop backbranches) we
// allow before we stop execution with a trap, to prevent hangs. 0 means
// no hang protection.
- static const int HANG_LIMIT = 25;
+ static const int HANG_LIMIT = 100;
// Optionally remove NaNs, which are a source of nondeterminism (which makes
// cross-VM comparisons harder)
@@ -452,14 +452,20 @@ private:
// make something with no chance of infinite recursion
Expression* makeTrivial(WasmType type) {
if (isConcreteWasmType(type)) {
- return makeConst(type);
+ if (oneIn(2)) {
+ return makeGetLocal(type);
+ } else {
+ return makeConst(type);
+ }
} else if (type == none) {
return makeNop(type);
}
assert(type == unreachable);
- return builder.makeReturn(
- isConcreteWasmType(func->result) ? makeConst(func->result) : nullptr
- );
+ Expression* ret = nullptr;
+ if (isConcreteWasmType(func->result)) {
+ ret = makeTrivial(func->result);
+ }
+ return builder.makeReturn(ret);
}
// specific expression creators
@@ -650,7 +656,7 @@ private:
Expression* makeGetLocal(WasmType type) {
auto& locals = typeLocals[type];
- if (locals.empty()) return makeTrivial(type);
+ if (locals.empty()) return makeConst(type);
return builder.makeGetLocal(vectorPick(locals), type);
}
diff --git a/src/tools/wasm-opt.cpp b/src/tools/wasm-opt.cpp
index c34331366..a66bc612f 100644
--- a/src/tools/wasm-opt.cpp
+++ b/src/tools/wasm-opt.cpp
@@ -39,6 +39,23 @@
using namespace wasm;
+// runs a command and returns its output TODO: portability, return code checking
+std::string runCommand(std::string command) {
+#ifdef __linux__
+ std::string output;
+ const int MAX_BUFFER = 1024;
+ char buffer[MAX_BUFFER];
+ FILE *stream = popen(command.c_str(), "r");
+ while (fgets(buffer, MAX_BUFFER, stream) != NULL) {
+ output.append(buffer);
+ }
+ pclose(stream);
+ return output;
+#else
+ Fatal() << "TODO: portability for wasm-opt runCommand";
+#endif
+}
+
//
// main
//
@@ -50,6 +67,7 @@ int main(int argc, const char* argv[]) {
bool debugInfo = false;
bool fuzzExec = false;
bool fuzzBinary = false;
+ std::string extraFuzzCommand;
bool translateToFuzz = false;
std::string emitJSWrapper;
std::string emitSpecWrapper;
@@ -74,6 +92,9 @@ int main(int argc, const char* argv[]) {
.add("--fuzz-binary", "-fb", "Convert to binary and back after optimizations and before fuzz-exec, helping fuzzing find binary format bugs",
Options::Arguments::Zero,
[&](Options *o, const std::string &arguments) { fuzzBinary = true; })
+ .add("--extra-fuzz-command", "-efc", "An extra command to run on the output before and after optimizing. The output is compared between the two, and an error occurs if they are not equal",
+ Options::Arguments::One,
+ [&](Options *o, const std::string &arguments) { extraFuzzCommand = arguments; })
.add("--translate-to-fuzz", "-ttf", "Translate the input into a valid wasm module *somehow*, useful for fuzzing",
Options::Arguments::Zero,
[&](Options *o, const std::string &arguments) { translateToFuzz = true; })
@@ -123,6 +144,33 @@ int main(int argc, const char* argv[]) {
results.get(wasm);
}
+ if (emitJSWrapper.size() > 0) {
+ std::ofstream outfile;
+ outfile.open(emitJSWrapper, std::ofstream::out);
+ outfile << generateJSWrapper(wasm);
+ outfile.close();
+ }
+
+ if (emitSpecWrapper.size() > 0) {
+ std::ofstream outfile;
+ outfile.open(emitSpecWrapper, std::ofstream::out);
+ outfile << generateSpecWrapper(wasm);
+ outfile.close();
+ }
+
+ std::string firstOutput;
+
+ if (extraFuzzCommand.size() > 0 && options.extra.count("output") > 0) {
+ if (options.debug) std::cerr << "writing binary before opts, for extra fuzz command..." << std::endl;
+ ModuleWriter writer;
+ writer.setDebug(options.debug);
+ writer.setBinary(emitBinary);
+ writer.setDebugInfo(debugInfo);
+ writer.write(wasm, options.extra["output"]);
+ firstOutput = runCommand(extraFuzzCommand);
+ std::cout << "[extra-fuzz-command first output:]\n" << firstOutput << '\n';
+ }
+
if (options.runningPasses()) {
if (options.debug) std::cerr << "running passes...\n";
PassRunner passRunner = options.getPassRunner(wasm);
@@ -155,19 +203,14 @@ int main(int argc, const char* argv[]) {
writer.setBinary(emitBinary);
writer.setDebugInfo(debugInfo);
writer.write(wasm, options.extra["output"]);
- }
-
- if (emitJSWrapper.size() > 0) {
- std::ofstream outfile;
- outfile.open(emitJSWrapper, std::ofstream::out);
- outfile << generateJSWrapper(wasm);
- outfile.close();
- }
- if (emitSpecWrapper.size() > 0) {
- std::ofstream outfile;
- outfile.open(emitSpecWrapper, std::ofstream::out);
- outfile << generateSpecWrapper(wasm);
- outfile.close();
+ if (extraFuzzCommand.size() > 0) {
+ auto secondOutput = runCommand(extraFuzzCommand);
+ std::cout << "[extra-fuzz-command second output:]\n" << firstOutput << '\n';
+ if (firstOutput != secondOutput) {
+ std::cerr << "extra fuzz command output differs\n";
+ abort();
+ }
+ }
}
}
diff --git a/src/wasm-builder.h b/src/wasm-builder.h
index 4ef4b1e0b..7432562d1 100644
--- a/src/wasm-builder.h
+++ b/src/wasm-builder.h
@@ -164,14 +164,14 @@ public:
auto* ret = allocator.alloc<SetLocal>();
ret->index = index;
ret->value = value;
- ret->type = none;
+ ret->finalize();
return ret;
}
SetLocal* makeTeeLocal(Index index, Expression* value) {
auto* ret = allocator.alloc<SetLocal>();
ret->index = index;
ret->value = value;
- ret->type = value->type;
+ ret->setTee(true);
return ret;
}
GetGlobal* makeGetGlobal(Name name, WasmType type) {
diff --git a/src/wasm/wasm.cpp b/src/wasm/wasm.cpp
index f82a06e68..ab2db6bd5 100644
--- a/src/wasm/wasm.cpp
+++ b/src/wasm/wasm.cpp
@@ -332,6 +332,10 @@ void SetLocal::setTee(bool is) {
void SetLocal::finalize() {
if (value->type == unreachable) {
type = unreachable;
+ } else if (isTee()) {
+ type = value->type;
+ } else {
+ type = none;
}
}
diff --git a/test/passes/remove-unused-brs.txt b/test/passes/remove-unused-brs.txt
index fe0c59fca..7951cf18f 100644
--- a/test/passes/remove-unused-brs.txt
+++ b/test/passes/remove-unused-brs.txt
@@ -6,6 +6,8 @@
(type $4 (func (param i32 i32)))
(type $5 (func (param f32 i32 f32 i32 i32 f64 f32) (result i32)))
(type $6 (func (param i32) (result i64)))
+ (type $7 (func (result i64)))
+ (type $8 (func (result f32)))
(memory $0 256 256)
(func $b0-yes (type $0) (param $i1 i32)
(block $topmost
@@ -1059,4 +1061,48 @@
)
)
)
+ (func $unreachable-if-that-could-be-a-br_if (type $7) (result i64)
+ (loop $label$3
+ (if
+ (unreachable)
+ (f64.const 1)
+ (br $label$3)
+ )
+ (i64.const 1)
+ )
+ )
+ (func $nop-br-might-update-type (type $1)
+ (block $label$39
+ (if
+ (unreachable)
+ (if (result i32)
+ (i32.const 1)
+ (br $label$39)
+ (i32.const 0)
+ )
+ (i32.const 0)
+ )
+ )
+ )
+ (func $no-flow-through-if-without-else (type $8) (result f32)
+ (local $0 i32)
+ (local $2 f32)
+ (block $label$0 (result f32)
+ (if (result f32)
+ (get_local $0)
+ (block $label$11
+ (return
+ (f32.const 239)
+ )
+ (if
+ (i32.const 0)
+ (return
+ (get_local $2)
+ )
+ )
+ )
+ (f32.const -9223372036854775808)
+ )
+ )
+ )
)
diff --git a/test/passes/remove-unused-brs.wast b/test/passes/remove-unused-brs.wast
index 996b05264..20441d9e4 100644
--- a/test/passes/remove-unused-brs.wast
+++ b/test/passes/remove-unused-brs.wast
@@ -943,5 +943,51 @@
)
)
)
+ (func $unreachable-if-that-could-be-a-br_if (result i64)
+ (loop $label$3
+ (if
+ (unreachable)
+ (f64.const 1)
+ (br $label$3)
+ )
+ (i64.const 1)
+ )
+ )
+ (func $nop-br-might-update-type
+ (block $label$39
+ (if
+ (unreachable)
+ (if (result i32)
+ (i32.const 1)
+ (br $label$39) ;; if we nop this, then the parent type must change
+ (i32.const 0)
+ )
+ (i32.const 0)
+ )
+ )
+ )
+ (func $no-flow-through-if-without-else (result f32)
+ (local $0 i32)
+ (local $2 f32)
+ (block $label$0
+ (if
+ (get_local $0)
+ (block $label$11
+ (return
+ (f32.const 239)
+ )
+ (if
+ (i32.const 0)
+ (return
+ (get_local $2)
+ )
+ )
+ )
+ (return
+ (f32.const -9223372036854775808)
+ )
+ )
+ )
+ )
)
diff --git a/test/passes/simplify-locals.txt b/test/passes/simplify-locals.txt
index a46f74c69..39fc1d97d 100644
--- a/test/passes/simplify-locals.txt
+++ b/test/passes/simplify-locals.txt
@@ -9,6 +9,7 @@
(type $FUNCSIG$iii (func (param i32 i32) (result i32)))
(type $8 (func (param i32 i32)))
(type $9 (func (param i32 i32 i32) (result i32)))
+ (type $10 (func (param i64)))
(import "env" "waka" (func $waka))
(import "env" "waka_int" (func $waka_int (result i32)))
(import "env" "i64sub" (func $_i64Subtract (param i32 i32 i32 i32) (result i32)))
@@ -875,6 +876,21 @@
(get_local $x)
)
)
+ (func $if-return-but-unreachable (type $10) (param $var$0 i64)
+ (tee_local $var$0
+ (if
+ (unreachable)
+ (block (result i64)
+ (nop)
+ (get_local $var$0)
+ )
+ (block (result i64)
+ (nop)
+ (i64.const 1)
+ )
+ )
+ )
+ )
)
(module
(type $FUNCSIG$v (func))
diff --git a/test/passes/simplify-locals.wast b/test/passes/simplify-locals.wast
index 344e0934e..eff5ff6be 100644
--- a/test/passes/simplify-locals.wast
+++ b/test/passes/simplify-locals.wast
@@ -871,6 +871,17 @@
(get_local $x)
)
)
+ (func $if-return-but-unreachable (param $var$0 i64)
+ (if
+ (unreachable)
+ (set_local $var$0
+ (get_local $var$0)
+ )
+ (set_local $var$0
+ (i64.const 1)
+ )
+ )
+ )
)
(module
(memory 256 256 shared)
@@ -929,4 +940,4 @@
(drop (i32.atomic.load (i32.const 1028)))
(drop (get_local $x))
)
-) \ No newline at end of file
+)
diff --git a/test/passes/translate-to-fuzz.txt b/test/passes/translate-to-fuzz.txt
index daab102ad..b426766b5 100644
--- a/test/passes/translate-to-fuzz.txt
+++ b/test/passes/translate-to-fuzz.txt
@@ -1,10 +1,12 @@
(module
- (global $hangLimit (mut i32) (i32.const 25))
+ (global $hangLimit (mut i32) (i32.const 100))
(memory $0 1 1)
(export "func_0" (func $func_0))
- (export "func_1" (func $func_1))
+ (export "func_2" (func $func_2))
(export "func_4" (func $func_4))
(export "func_5" (func $func_5))
+ (export "func_7" (func $func_7))
+ (export "func_8" (func $func_8))
(export "hangLimitInitializer" (func $hangLimitInitializer))
(func $func_0 (result i32)
(local $0 f32)
@@ -16,7 +18,7 @@
(get_global $hangLimit)
)
(return
- (i32.const -118)
+ (i32.const -5)
)
)
(set_global $hangLimit
@@ -35,7 +37,7 @@
(get_global $hangLimit)
)
(return
- (i32.const 127)
+ (i32.const -37)
)
)
(set_global $hangLimit
@@ -46,58 +48,63 @@
)
)
(select
- (i64.ne
- (if (result i64)
- (i32.eqz
- (loop $label$5 (result i32)
- (block
- (if
- (i32.eqz
- (get_global $hangLimit)
- )
- (return
- (i32.const 190)
- )
- )
- (set_global $hangLimit
- (i32.sub
- (get_global $hangLimit)
- (i32.const 1)
- )
- )
- )
- (block $label$6 (result i32)
- (i32.const 104)
- )
+ (loop $label$10 (result i32)
+ (block
+ (if
+ (i32.eqz
+ (get_global $hangLimit)
)
- )
- (block $label$7 (result i64)
(return
- (i32.const 387928603)
+ (i32.const 32767)
)
)
- (block $label$8 (result i64)
- (br $label$1)
+ (set_global $hangLimit
+ (i32.sub
+ (get_global $hangLimit)
+ (i32.const 1)
+ )
)
)
- (i64.const -1)
+ (block $label$11 (result i32)
+ (i32.const 24342)
+ )
)
- (br_if $label$0
- (br_if $label$0
- (i32.popcnt
- (i32.const 75)
- )
- (i32.eqz
- (select
- (if (result i32)
- (loop $label$9 (result i32)
+ (i32.load8_s offset=2
+ (i32.and
+ (br_if $label$0
+ (i32.trunc_s/f64
+ (loop $label$14 (result f64)
+ (block
+ (if
+ (i32.eqz
+ (get_global $hangLimit)
+ )
+ (return
+ (i32.const 0)
+ )
+ )
+ (set_global $hangLimit
+ (i32.sub
+ (get_global $hangLimit)
+ (i32.const 1)
+ )
+ )
+ )
+ (block $label$15 (result f64)
+ (br $label$1)
+ )
+ )
+ )
+ (i32.eqz
+ (i32.trunc_u/f64
+ (loop $label$12 (result f64)
(block
(if
(i32.eqz
(get_global $hangLimit)
)
(return
- (i32.const 828535924)
+ (i32.const -128)
)
)
(set_global $hangLimit
@@ -107,79 +114,17 @@
)
)
)
- (block $label$10 (result i32)
- (block $label$11
- (set_local $1
- (get_local $1)
- )
+ (block $label$13 (result f64)
+ (return
+ (i32.const -10)
)
- (br $label$1)
)
)
- (block $label$12 (result i32)
- (i32.const 1767927669)
- )
- (block $label$13 (result i32)
- (if (result i32)
- (i32.const -32768)
- (i32.const 127)
- (i32.const 269491029)
- )
- )
- )
- (if (result i32)
- (i32.eqz
- (loop $label$14 (result i32)
- (block
- (if
- (i32.eqz
- (get_global $hangLimit)
- )
- (return
- (i32.const -71)
- )
- )
- (set_global $hangLimit
- (i32.sub
- (get_global $hangLimit)
- (i32.const 1)
- )
- )
- )
- (block $label$15 (result i32)
- (br $label$1)
- )
- )
- )
- (block $label$16 (result i32)
- (br $label$1)
- )
- (i32.ge_u
- (br_if $label$0
- (i32.const -98)
- (i32.const 65419)
- )
- (i32.load offset=22 align=1
- (i32.and
- (i32.const 0)
- (i32.const 31)
- )
- )
- )
- )
- (br_if $label$0
- (i32.load offset=22
- (i32.and
- (i32.const -1)
- (i32.const 31)
- )
- )
- (i32.const 1561467741)
)
)
)
+ (i32.const 31)
)
- (i32.const 32767)
)
(br_if $label$0
(loop $label$2 (result i32)
@@ -189,7 +134,7 @@
(get_global $hangLimit)
)
(return
- (i32.const 469762305)
+ (i32.const 1)
)
)
(set_global $hangLimit
@@ -202,31 +147,161 @@
(block $label$3 (result i32)
(i32.popcnt
(select
- (br_if $label$0
- (i32.const 573448231)
- (select
- (i32.const 1917992040)
- (i32.const -25)
- (i32.const -105)
+ (if (result i32)
+ (i32.eqz
+ (if (result i32)
+ (i32.eqz
+ (i32.const -1)
+ )
+ (i32.const 0)
+ (i32.const 0)
+ )
)
+ (block $label$5 (result i32)
+ (loop $label$6 (result i32)
+ (block
+ (if
+ (i32.eqz
+ (get_global $hangLimit)
+ )
+ (return
+ (i32.const -41)
+ )
+ )
+ (set_global $hangLimit
+ (i32.sub
+ (get_global $hangLimit)
+ (i32.const 1)
+ )
+ )
+ )
+ (i64.lt_s
+ (i64.const 1100)
+ (if (result i64)
+ (i32.eqz
+ (i32.const -88)
+ )
+ (get_local $1)
+ (get_local $1)
+ )
+ )
+ )
+ )
+ (block $label$7 (result i32)
+ (br $label$1)
+ )
+ )
+ (select
+ (br_if $label$3
+ (i32.const 65535)
+ (loop $label$8 (result i32)
+ (block
+ (if
+ (i32.eqz
+ (get_global $hangLimit)
+ )
+ (return
+ (i32.const 10)
+ )
+ )
+ (set_global $hangLimit
+ (i32.sub
+ (get_global $hangLimit)
+ (i32.const 1)
+ )
+ )
+ )
+ (block $label$9 (result i32)
+ (i32.const 127)
+ )
+ )
+ )
+ (i32.const 67372036)
+ (i32.const -72)
)
- (i32.const 65535)
(br_if $label$3
- (i32.lt_u
- (select
+ (block $label$4 (result i32)
+ (br $label$2)
+ )
+ (i32.const -2147483648)
+ )
+ )
+ )
+ )
+ )
+ (i32.eqz
+ (i32.const -1)
+ )
+ )
+ )
+ )
+ (block $label$16
+ (br_if $label$16
+ (i32.eqz
+ (block $label$17 (result i32)
+ (br $label$16)
+ )
+ )
+ )
+ (f32.store offset=3
+ (i32.const 5661)
+ (call $deNan32
+ (select
+ (if (result f32)
+ (i32.eqz
+ (i32.const 23)
+ )
+ (block $label$23 (result f32)
+ (if (result f32)
+ (i32.eqz
+ (i32.const 3330)
+ )
+ (block $label$24 (result f32)
+ (br $label$16)
+ )
+ (f32.load offset=22
+ (block $label$25 (result i32)
+ (i32.const -1)
+ )
+ )
+ )
+ )
+ (f32.load offset=1 align=1
+ (i32.and
+ (if (result i32)
+ (i32.trunc_u/f32
+ (call $deNan32
(select
- (br_if $label$3
- (i32.const 188)
- (i32.const 1)
+ (loop $label$27 (result f32)
+ (block
+ (if
+ (i32.eqz
+ (get_global $hangLimit)
+ )
+ (return
+ (i32.const -31)
+ )
+ )
+ (set_global $hangLimit
+ (i32.sub
+ (get_global $hangLimit)
+ (i32.const 1)
+ )
+ )
+ )
+ (get_local $0)
+ )
+ (block $label$28 (result f32)
+ (br $label$16)
)
- (loop $label$4 (result i32)
+ (loop $label$26 (result i32)
(block
(if
(i32.eqz
(get_global $hangLimit)
)
(return
- (i32.const 255)
+ (i32.const 65518)
)
)
(set_global $hangLimit
@@ -236,173 +311,218 @@
)
)
)
- (i32.const 65448)
+ (if (result i32)
+ (i32.const 1)
+ (i32.const -32768)
+ (i32.const 1392974931)
+ )
)
- (i32.const 31021)
)
- (i32.const 1562845246)
- (i32.const 1)
)
- (i32.const 2147483647)
)
- (i32.const 127)
+ (call $func_0)
+ (i32.trunc_s/f32
+ (tee_local $2
+ (f32.const 9223372036854775808)
+ )
+ )
)
+ (i32.const 31)
)
)
)
- )
- (i32.eqz
- (i32.const -1)
- )
- )
- )
- )
- (block $label$17
- (if
- (i32.eqz
- (select
- (i64.gt_s
- (tee_local $1
- (if (result i64)
- (select
- (select
- (br_if $label$0
- (i32.const 4)
- (i32.const 1)
- )
- (br_if $label$0
- (i32.const -120)
- (i32.const 26)
- )
- (i32.const 32767)
- )
- (select
- (i32.const 909534506)
- (i32.const 6424)
- (select
- (i32.const -2147483648)
- (i32.const -1)
- (i32.const 32767)
+ (f32.load offset=4
+ (i32.and
+ (br_if $label$0
+ (i32.load8_u offset=3
+ (i32.and
+ (loop $label$36 (result i32)
+ (block
+ (if
+ (i32.eqz
+ (get_global $hangLimit)
+ )
+ (return
+ (i32.const -128)
+ )
+ )
+ (set_global $hangLimit
+ (i32.sub
+ (get_global $hangLimit)
+ (i32.const 1)
+ )
+ )
+ )
+ (block $label$37 (result i32)
+ (br $label$16)
+ )
)
- )
- (i32.const 1)
- )
- (block $label$19 (result i64)
- (i64.extend_u/i32
- (i32.const 255)
+ (i32.const 31)
)
)
- (block $label$20 (result i64)
- (if (result i64)
- (block $label$21 (result i32)
- (block $label$22 (result i32)
- (i32.const -42)
+ (i32.eqz
+ (block $label$29 (result i32)
+ (if (result i32)
+ (i32.const 0)
+ (block $label$30 (result i32)
+ (if (result i32)
+ (i32.eqz
+ (select
+ (f32.lt
+ (get_local $2)
+ (get_local $2)
+ )
+ (select
+ (select
+ (i32.const -101)
+ (i32.const 52)
+ (i32.const 2147483647)
+ )
+ (i32.const 6733)
+ (i32.const -12)
+ )
+ (i32.load8_s offset=22
+ (i32.and
+ (i32.const 976638003)
+ (i32.const 31)
+ )
+ )
+ )
+ )
+ (block $label$31 (result i32)
+ (br $label$16)
+ )
+ (block $label$32 (result i32)
+ (br $label$16)
+ )
+ )
)
- )
- (i64.div_s
- (i64.const -9223372036854775808)
- (loop $label$23 (result i64)
- (block
- (if
- (i32.eqz
- (get_global $hangLimit)
+ (block $label$33 (result i32)
+ (f64.store offset=2
+ (i32.and
+ (loop $label$34 (result i32)
+ (block
+ (if
+ (i32.eqz
+ (get_global $hangLimit)
+ )
+ (return
+ (i32.const -2147483648)
+ )
+ )
+ (set_global $hangLimit
+ (i32.sub
+ (get_global $hangLimit)
+ (i32.const 1)
+ )
+ )
+ )
+ (block $label$35 (result i32)
+ (i32.trunc_u/f32
+ (get_local $2)
+ )
+ )
)
+ (i32.const 31)
+ )
+ (f64.const 6409)
+ )
+ (br $label$16)
+ )
+ )
+ )
+ )
+ )
+ (i32.const 31)
+ )
+ )
+ (if (result i32)
+ (i32.const 2147483647)
+ (block $label$18 (result i32)
+ (f32.store offset=1
+ (i32.and
+ (br_if $label$18
+ (i32.load8_s offset=22
+ (i32.and
+ (br_if $label$0
+ (block $label$19 (result i32)
(return
- (i32.const -15)
+ (i32.const 201)
)
)
- (set_global $hangLimit
- (i32.sub
- (get_global $hangLimit)
- (i32.const 1)
+ (i32.const 1465323825)
+ )
+ (i32.const 31)
+ )
+ )
+ (i32.load8_u offset=4
+ (i32.and
+ (br_if $label$0
+ (i32.load16_s offset=3
+ (i32.and
+ (f32.gt
+ (get_local $0)
+ (f32.load offset=2 align=1
+ (i32.and
+ (i32.const 65453)
+ (i32.const 31)
+ )
+ )
+ )
+ (i32.const 31)
)
)
+ (i32.const 2147483647)
)
- (get_local $1)
+ (i32.const 31)
)
)
- (if (result i64)
- (select
- (i32.const -20)
- (i32.const 84)
- (i32.const 706834235)
- )
- (block $label$24 (result i64)
- (br $label$17)
- )
- (block $label$25 (result i64)
- (return
- (i32.const -44)
+ )
+ (i32.const 31)
+ )
+ (block $label$20 (result f32)
+ (call $deNan32
+ (f32.convert_u/i64
+ (i64.trunc_u/f32
+ (call $deNan32
+ (f32.min
+ (tee_local $0
+ (f32.const 2.8411366687849113e-29)
+ )
+ (block $label$21 (result f32)
+ (br $label$16)
+ )
+ )
)
)
)
)
)
)
+ (br $label$16)
)
- (i64.popcnt
- (block $label$26 (result i64)
- (br $label$17)
- )
- )
- )
- (i32.reinterpret/f32
- (block $label$27 (result f32)
- (return
- (i32.const 1112421928)
- )
- )
- )
- (br_if $label$0
- (i32.const 18)
- (block $label$18 (result i32)
- (br $label$17)
+ (block $label$22 (result i32)
+ (i32.const -44)
)
)
)
)
- (block $label$28
- (drop
- (f32.const -2147483648)
- )
- )
- (block $label$31
- (drop
- (block $label$32 (result f64)
- (f64.const 3777575208023997706127184e35)
- )
- )
- (nop)
- )
)
)
- (block $label$33
- (loop $label$34
- (block
- (if
- (i32.eqz
- (get_global $hangLimit)
- )
- (return
- (i32.const 73)
- )
- )
- (set_global $hangLimit
- (i32.sub
- (get_global $hangLimit)
- (i32.const 1)
- )
- )
+ (block $label$38
+ (if
+ (i32.eqz
+ (i32.const 73)
)
- (block $label$35
- (loop $label$36
+ (block $label$39
+ (loop $label$40
(block
(if
(i32.eqz
(get_global $hangLimit)
)
(return
- (i32.const 155802894)
+ (i32.const 2147483647)
)
)
(set_global $hangLimit
@@ -412,126 +532,19 @@
)
)
)
- (br_if $label$36
- (i32.eqz
- (block $label$37 (result i32)
- (i32.const -1)
- )
- )
- )
- )
- )
- )
- )
- )
- (set_local $1
- (i64.trunc_s/f32
- (f32.const 18446744073709551615)
- )
- )
- (return
- (i32.const -57)
- )
- )
- )
- (func $func_1 (param $0 i64) (param $1 i32) (result i64)
- (block
- (if
- (i32.eqz
- (get_global $hangLimit)
- )
- (return
- (i64.const -40)
- )
- )
- (set_global $hangLimit
- (i32.sub
- (get_global $hangLimit)
- (i32.const 1)
- )
- )
- )
- (call $func_1
- (tee_local $0
- (i64.shl
- (if (result i64)
- (i32.eqz
- (tee_local $1
- (get_local $1)
- )
- )
- (block $label$0 (result i64)
- (return
- (i64.const 18469)
- )
- )
- (block $label$1 (result i64)
- (return
- (i64.const -1)
- )
- )
- )
- (tee_local $0
- (tee_local $0
- (block $label$2 (result i64)
- (block $label$3 (result i64)
- (return
- (i64.const 127)
- )
- )
+ (nop)
)
)
- )
- )
- )
- (get_local $1)
- )
- )
- (func $func_2
- (block
- (if
- (i32.eqz
- (get_global $hangLimit)
- )
- (return)
- )
- (set_global $hangLimit
- (i32.sub
- (get_global $hangLimit)
- (i32.const 1)
- )
- )
- )
- (if
- (i32.eqz
- (if (result i32)
- (i32.const 5662)
- (block $label$0 (result i32)
- (return)
- )
- (block $label$1 (result i32)
- (return)
- )
- )
- )
- (nop)
- (if
- (i32.const 508363275)
- (block $label$2
- (if
- (i32.const -1)
- (block $label$3
- (nop)
- (nop)
- )
- (block $label$4
- (loop $label$5
+ (block $label$41
+ (loop $label$42
(block
(if
(i32.eqz
(get_global $hangLimit)
)
- (return)
+ (return
+ (i32.const 167857947)
+ )
)
(set_global $hangLimit
(i32.sub
@@ -540,41 +553,57 @@
)
)
)
- (block $label$6
+ (block $label$43
(if
- (i32.eqz
- (i64.eqz
- (block $label$7 (result i64)
- (block $label$8 (result i64)
- (loop $label$9 (result i64)
- (block
- (if
- (i32.eqz
- (get_global $hangLimit)
- )
- (return)
- )
- (set_global $hangLimit
- (i32.sub
- (get_global $hangLimit)
- (i32.const 1)
- )
- )
+ (block $label$44 (result i32)
+ (if
+ (select
+ (i32.const 68027396)
+ (call $func_0)
+ (i32.const 127)
+ )
+ (loop $label$45
+ (block
+ (if
+ (i32.eqz
+ (get_global $hangLimit)
+ )
+ (return
+ (i32.const 2147483647)
)
- (i64.const 5787412799727686208)
+ )
+ (set_global $hangLimit
+ (i32.sub
+ (get_global $hangLimit)
+ (i32.const 1)
+ )
+ )
+ )
+ (set_local $2
+ (if (result f32)
+ (i32.eqz
+ (i32.const 0)
+ )
+ (block $label$46 (result f32)
+ (br $label$43)
+ )
+ (f32.const 70)
)
)
)
+ (block $label$47
+ (nop)
+ )
)
- )
- (block $label$10
- (loop $label$11
+ (loop $label$48 (result i32)
(block
(if
(i32.eqz
(get_global $hangLimit)
)
- (return)
+ (return
+ (i32.const 218628885)
+ )
)
(set_global $hangLimit
(i32.sub
@@ -583,140 +612,160 @@
)
)
)
- (block $label$12
- (f64.store offset=4
- (i32.and
- (i32.const 48)
- (i32.const 31)
+ (i32.const 134561796)
+ )
+ )
+ (block $label$49
+ (loop $label$50
+ (block
+ (if
+ (i32.eqz
+ (get_global $hangLimit)
+ )
+ (return
+ (i32.const -73)
+ )
+ )
+ (set_global $hangLimit
+ (i32.sub
+ (get_global $hangLimit)
+ (i32.const 1)
)
- (f64.const -nan:0xfffffffffffae)
)
)
- )
- )
- (block $label$13
- (block $label$14
- (loop $label$15
- (block
- (if
+ (f32.store offset=1
+ (i32.and
+ (if (result i32)
(i32.eqz
- (get_global $hangLimit)
+ (i32.const -1)
)
- (return)
- )
- (set_global $hangLimit
- (i32.sub
- (get_global $hangLimit)
- (i32.const 1)
+ (f64.gt
+ (f64.const 2.314826290848667e-289)
+ (f64.const 2.5152972121526945e-172)
)
+ (i32.const -71)
)
+ (i32.const 31)
)
- (block $label$16
- (nop)
+ (call $deNan32
+ (f32.convert_u/i32
+ (i32.const -32)
+ )
)
)
)
)
+ (block $label$51
+ (nop)
+ )
)
)
)
)
)
)
- (block $label$17
- (br_if $label$17
- (i32.eqz
- (if (result i32)
- (if (result i32)
- (select
- (block $label$19 (result i32)
- (i32.store offset=4 align=1
- (i32.and
- (block $label$20 (result i32)
- (i32.const 19534)
- )
- (i32.const 31)
- )
- (br_if $label$19
- (i32.const 488444703)
- (i32.eqz
- (i32.const -128)
- )
- )
- )
- (select
- (i32.const -97)
- (i32.const -2147483648)
- (i32.const -125)
- )
- )
- (if (result i32)
- (block $label$21 (result i32)
- (br $label$17)
- )
- (block $label$22 (result i32)
- (i32.load16_u offset=22
- (select
- (loop $label$23 (result i32)
- (block
- (if
- (i32.eqz
- (get_global $hangLimit)
- )
- (return)
- )
- (set_global $hangLimit
- (i32.sub
- (get_global $hangLimit)
- (i32.const 1)
- )
- )
- )
- (i32.const 15448)
- )
- (i32.rem_u
- (i32.const 1026110509)
- (i32.const 1)
- )
- (i32.const 97)
- )
- )
- )
- (block $label$24 (result i32)
- (i32.trunc_u/f64
- (call $deNan64
- (select
- (f64.const 6.013471909394168e-154)
- (f64.const -nan:0xfffffffffffbb)
- (call $func_0)
- )
- )
- )
- )
- )
- (block $label$18 (result i32)
- (br_if $label$18
- (i32.const -76)
- (i32.eqz
- (i32.clz
- (i64.le_u
- (i64.const 7)
- (i64.const -30)
- )
- )
- )
- )
- )
- )
- (i32.const -10)
- (block $label$25 (result i32)
- (loop $label$26 (result i32)
+ )
+ (block $label$52
+ (f64.store offset=4 align=4
+ (i32.and
+ (block $label$53 (result i32)
+ (return
+ (i32.const -11)
+ )
+ )
+ (i32.const 31)
+ )
+ (f64.const 3402823466385288598117041e14)
+ )
+ )
+ (return
+ (i32.const 22064)
+ )
+ )
+ )
+ (func $func_1 (result f32)
+ (block
+ (if
+ (i32.eqz
+ (get_global $hangLimit)
+ )
+ (return
+ (f32.const -nan:0x7fffd7)
+ )
+ )
+ (set_global $hangLimit
+ (i32.sub
+ (get_global $hangLimit)
+ (i32.const 1)
+ )
+ )
+ )
+ (block $label$0 (result f32)
+ (nop)
+ (return
+ (f32.const -nan:0x7fffcc)
+ )
+ )
+ )
+ (func $func_2 (result i64)
+ (local $0 f64)
+ (local $1 f32)
+ (block
+ (if
+ (i32.eqz
+ (get_global $hangLimit)
+ )
+ (return
+ (i64.const 65535)
+ )
+ )
+ (set_global $hangLimit
+ (i32.sub
+ (get_global $hangLimit)
+ (i32.const 1)
+ )
+ )
+ )
+ (i64.const -75)
+ )
+ (func $func_3 (result f32)
+ (block
+ (if
+ (i32.eqz
+ (get_global $hangLimit)
+ )
+ (return
+ (f32.const 0)
+ )
+ )
+ (set_global $hangLimit
+ (i32.sub
+ (get_global $hangLimit)
+ (i32.const 1)
+ )
+ )
+ )
+ (block $label$0 (result f32)
+ (if (result f32)
+ (i32.eqz
+ (call $func_0)
+ )
+ (block $label$1 (result f32)
+ (nop)
+ (call $deNan32
+ (select
+ (f32.load offset=22 align=1
+ (i32.and
+ (i32.wrap/i64
+ (loop $label$2 (result i64)
(block
(if
(i32.eqz
(get_global $hangLimit)
)
- (return)
+ (return
+ (f32.const -88)
+ )
)
(set_global $hangLimit
(i32.sub
@@ -725,83 +774,150 @@
)
)
)
- (br_if $label$25
- (i32.const 32767)
- (i32.eqz
- (i32.load offset=4 align=1
- (i32.and
- (i32.const 32767)
- (i32.const 31)
+ (block $label$3 (result i64)
+ (select
+ (block $label$5 (result i64)
+ (return
+ (f32.const 65479)
+ )
+ )
+ (if (result i64)
+ (i32.const 0)
+ (block $label$6 (result i64)
+ (br $label$2)
+ )
+ (block $label$7 (result i64)
+ (return
+ (f32.const -109)
+ )
+ )
+ )
+ (block $label$4 (result i32)
+ (return
+ (f32.const 1.9142481055608796e-22)
)
)
)
)
)
)
- )
- (block $label$27 (result i32)
- (br $label$17)
- )
- (block $label$28 (result i32)
- (i32.const -124)
- )
- )
- )
- )
- (block $label$29
- (loop $label$30
- (block
- (if
- (i32.eqz
- (get_global $hangLimit)
- )
- (return)
- )
- (set_global $hangLimit
- (i32.sub
- (get_global $hangLimit)
- (i32.const 1)
- )
+ (i32.const 31)
)
)
- (loop $label$31
- (block
- (if
- (i32.eqz
- (get_global $hangLimit)
- )
- (return)
- )
- (set_global $hangLimit
- (i32.sub
- (get_global $hangLimit)
- (i32.const 1)
- )
- )
- )
- (block $label$32
- (loop $label$33
- (block
- (if
- (i32.eqz
- (get_global $hangLimit)
- )
- (return)
- )
- (set_global $hangLimit
- (i32.sub
- (get_global $hangLimit)
- (i32.const 1)
- )
- )
- )
- (block $label$34
- (block $label$35
- (drop
- (f64.load offset=22
- (i32.and
- (i32.const -31)
- (i32.const 31)
+ (call $deNan32
+ (f32.demote/f64
+ (call $deNan64
+ (f64.add
+ (f64.const -nan:0xfffffffffffe6)
+ (call $deNan64
+ (select
+ (f64.const 6.146610220788184e-183)
+ (loop $label$18 (result f64)
+ (block
+ (if
+ (i32.eqz
+ (get_global $hangLimit)
+ )
+ (return
+ (f32.const -93)
+ )
+ )
+ (set_global $hangLimit
+ (i32.sub
+ (get_global $hangLimit)
+ (i32.const 1)
+ )
+ )
+ )
+ (block $label$19 (result f64)
+ (call $deNan64
+ (f64.nearest
+ (call $deNan64
+ (f64.convert_u/i32
+ (i32.const -45)
+ )
+ )
+ )
+ )
+ )
+ )
+ (block $label$10 (result i32)
+ (br_if $label$10
+ (if (result i32)
+ (select
+ (call $func_0)
+ (i32.trunc_s/f64
+ (f64.const -nan:0xfffffffffffdd)
+ )
+ (if (result i32)
+ (i32.eqz
+ (i32.const 2113936401)
+ )
+ (select
+ (loop $label$15 (result i32)
+ (block
+ (if
+ (i32.eqz
+ (get_global $hangLimit)
+ )
+ (return
+ (f32.const -nan:0x7fffea)
+ )
+ )
+ (set_global $hangLimit
+ (i32.sub
+ (get_global $hangLimit)
+ (i32.const 1)
+ )
+ )
+ )
+ (i32.const -90)
+ )
+ (i32.const 2097561141)
+ (i32.const 127)
+ )
+ (i32.const 5918)
+ )
+ )
+ (block $label$16 (result i32)
+ (return
+ (f32.const 18446744073709551615)
+ )
+ )
+ (block $label$17 (result i32)
+ (return
+ (f32.const 253)
+ )
+ )
+ )
+ (f64.le
+ (loop $label$11 (result f64)
+ (block
+ (if
+ (i32.eqz
+ (get_global $hangLimit)
+ )
+ (return
+ (f32.const 1.1754943508222875e-38)
+ )
+ )
+ (set_global $hangLimit
+ (i32.sub
+ (get_global $hangLimit)
+ (i32.const 1)
+ )
+ )
+ )
+ (block $label$12 (result f64)
+ (block $label$13 (result f64)
+ (return
+ (f32.const 3402823466385288598117041e14)
+ )
+ )
+ )
+ )
+ (f64.const -88)
+ )
)
)
)
@@ -810,32 +926,21 @@
)
)
)
- )
- (block $label$36
- (br_if $label$17
- (i32.eqz
- (i32.const 1)
- )
- )
- (block $label$37
- (block $label$38
- (block $label$39
- (block $label$40
- (block $label$41
- (nop)
- )
- )
- )
- )
- )
+ (i32.const 74)
)
)
+ )
+ (block $label$20 (result f32)
+ (nop)
(nop)
+ (return
+ (f32.const -3)
+ )
)
)
)
)
- (func $func_3 (result f32)
+ (func $func_4 (result i64)
(local $0 i32)
(block
(if
@@ -843,7 +948,7 @@
(get_global $hangLimit)
)
(return
- (f32.const 3595217802362880)
+ (i64.const 9223372036854775807)
)
)
(set_global $hangLimit
@@ -853,16 +958,48 @@
)
)
)
- (f32.const 1.1754943508222875e-38)
+ (block $label$0 (result i64)
+ (return
+ (i64.const 9223372036854775807)
+ )
+ )
)
- (func $func_4 (result i32)
+ (func $func_5
+ (local $0 f64)
+ (local $1 i32)
+ (local $2 i32)
+ (block
+ (if
+ (i32.eqz
+ (get_global $hangLimit)
+ )
+ (return)
+ )
+ (set_global $hangLimit
+ (i32.sub
+ (get_global $hangLimit)
+ (i32.const 1)
+ )
+ )
+ )
+ (drop
+ (call $func_3)
+ )
+ )
+ (func $func_6 (result f32)
+ (local $0 i64)
+ (local $1 f32)
+ (local $2 f64)
+ (local $3 i64)
+ (local $4 i64)
+ (local $5 f32)
(block
(if
(i32.eqz
(get_global $hangLimit)
)
(return
- (i32.const 11)
+ (f32.const -1)
)
)
(set_global $hangLimit
@@ -872,17 +1009,18 @@
)
)
)
- (i32.const 71)
+ (call $func_1)
)
- (func $func_5 (param $0 i64) (param $1 i32) (param $2 i32) (result i64)
- (local $3 f32)
+ (func $func_7 (result f32)
+ (local $0 f32)
+ (local $1 i32)
(block
(if
(i32.eqz
(get_global $hangLimit)
)
(return
- (i64.const -77)
+ (get_local $0)
)
)
(set_global $hangLimit
@@ -892,167 +1030,253 @@
)
)
)
- (call $func_1
- (if (result i64)
- (if (result i32)
- (i32.ctz
- (block $label$0 (result i32)
- (return
- (i64.const -94)
- )
+ (if (result f32)
+ (tee_local $1
+ (tee_local $1
+ (i32.const 65535)
+ )
+ )
+ (loop $label$0 (result f32)
+ (block
+ (if
+ (i32.eqz
+ (get_global $hangLimit)
)
- )
- (block $label$1 (result i32)
(return
- (i64.const -71)
+ (get_local $0)
)
)
- (block $label$2 (result i32)
- (call $func_4)
+ (set_global $hangLimit
+ (i32.sub
+ (get_global $hangLimit)
+ (i32.const 1)
+ )
)
)
- (tee_local $0
- (select
- (select
- (loop $label$7 (result i64)
- (block
- (if
- (i32.eqz
- (get_global $hangLimit)
- )
- (return
- (i64.const -9223372036854775808)
+ (block $label$1 (result f32)
+ (tee_local $0
+ (tee_local $0
+ (if (result f32)
+ (i32.load16_s offset=22 align=1
+ (i32.and
+ (if (result i32)
+ (tee_local $1
+ (get_local $1)
+ )
+ (block $label$2 (result i32)
+ (return
+ (get_local $0)
+ )
+ )
+ (block $label$3 (result i32)
+ (return
+ (get_local $0)
+ )
+ )
)
+ (i32.const 31)
)
- (set_global $hangLimit
- (i32.sub
- (get_global $hangLimit)
- (i32.const 1)
+ )
+ (tee_local $0
+ (f32.load offset=22
+ (i32.and
+ (i32.const 32767)
+ (i32.const 31)
)
)
)
- (block $label$8 (result i64)
- (return
- (i64.const 4627)
- )
+ (block $label$4 (result f32)
+ (br $label$0)
)
)
- (i64.sub
- (i64.const 30983)
- (if (result i64)
- (i32.eqz
- (i32.const -128)
- )
- (block $label$9 (result i64)
- (i64.rem_s
- (i64.load offset=3 align=4
- (i32.and
- (f32.le
- (f32.load offset=4
- (i32.and
- (i32.const -126)
- (i32.const 31)
+ )
+ )
+ )
+ )
+ (block $label$5 (result f32)
+ (br_if $label$5
+ (tee_local $0
+ (call $deNan32
+ (f32.max
+ (f32.load offset=22
+ (i32.and
+ (select
+ (tee_local $1
+ (call $func_0)
+ )
+ (tee_local $1
+ (i32.load8_s offset=4
+ (i32.and
+ (block $label$10 (result i32)
+ (return
+ (f32.const -27)
)
)
- (tee_local $3
- (call $deNan32
- (select
- (call $deNan32
- (f32.convert_s/i32
- (get_local $1)
- )
+ (i32.const 31)
+ )
+ )
+ )
+ (i32.rem_u
+ (loop $label$8 (result i32)
+ (block
+ (if
+ (i32.eqz
+ (get_global $hangLimit)
+ )
+ (return
+ (get_local $0)
+ )
+ )
+ (set_global $hangLimit
+ (i32.sub
+ (get_global $hangLimit)
+ (i32.const 1)
+ )
+ )
+ )
+ (block $label$9 (result i32)
+ (i32.shr_u
+ (select
+ (i32.const 1497849685)
+ (tee_local $1
+ (tee_local $1
+ (get_local $1)
)
- (f32.const 7.458154094308611e-10)
- (get_local $1)
)
+ (get_local $1)
)
+ (get_local $1)
)
)
- (i32.const 31)
- )
- )
- (block $label$10 (result i64)
- (return
- (i64.const -72)
)
+ (call $func_0)
)
)
- )
- (block $label$11 (result i64)
- (return
- (i64.const 106)
- )
+ (i32.const 31)
)
)
- )
- (i32.const 0)
- )
- (loop $label$12 (result i64)
- (block
- (if
- (i32.eqz
- (get_global $hangLimit)
- )
- (return
- (i64.const 65509)
+ (loop $label$11 (result f32)
+ (block
+ (if
+ (i32.eqz
+ (get_global $hangLimit)
+ )
+ (return
+ (get_local $0)
+ )
+ )
+ (set_global $hangLimit
+ (i32.sub
+ (get_global $hangLimit)
+ (i32.const 1)
+ )
+ )
)
- )
- (set_global $hangLimit
- (i32.sub
- (get_global $hangLimit)
- (i32.const 1)
+ (block $label$12 (result f32)
+ (tee_local $0
+ (block $label$13 (result f32)
+ (return
+ (f32.const -nan:0x7fffec)
+ )
+ )
+ )
)
)
)
- (block $label$13 (result i64)
- (return
- (i64.const 127)
- )
- )
)
- (select
- (f64.ge
- (f64.const 1.1754943508222875e-38)
- (if (result f64)
- (f32.gt
- (get_local $3)
- (call $deNan32
- (f32.sub
- (get_local $3)
- (get_local $3)
+ )
+ (i32.eqz
+ (block $label$6 (result i32)
+ (i32.load16_s offset=4 align=1
+ (i32.and
+ (loop $label$7 (result i32)
+ (block
+ (if
+ (i32.eqz
+ (get_global $hangLimit)
+ )
+ (return
+ (f32.const 65486)
+ )
+ )
+ (set_global $hangLimit
+ (i32.sub
+ (get_global $hangLimit)
+ (i32.const 1)
+ )
)
)
- )
- (block $label$3 (result f64)
- (return
- (i64.const 65457)
- )
- )
- (block $label$4 (result f64)
- (return
- (i64.const 1011356149276677899)
+ (tee_local $1
+ (i32.load offset=22
+ (i32.and
+ (get_local $1)
+ (i32.const 31)
+ )
+ )
)
)
+ (i32.const 31)
)
)
- (i32.reinterpret/f32
- (f32.load offset=2 align=2
- (i32.and
- (select
- (get_local $2)
- (tee_local $2
- (get_local $2)
+ )
+ )
+ )
+ )
+ )
+ )
+ (func $func_8 (result i32)
+ (block
+ (if
+ (i32.eqz
+ (get_global $hangLimit)
+ )
+ (return
+ (i32.const 65535)
+ )
+ )
+ (set_global $hangLimit
+ (i32.sub
+ (get_global $hangLimit)
+ (i32.const 1)
+ )
+ )
+ )
+ (block $label$0 (result i32)
+ (f32.eq
+ (f32.const -nan:0x7ffff1)
+ (call $deNan32
+ (select
+ (block $label$3 (result f32)
+ (return
+ (i32.const 1)
+ )
+ )
+ (if (result f32)
+ (i32.eqz
+ (i32.const 709173281)
+ )
+ (block $label$4 (result f32)
+ (f32.const 8.104309321630391e-21)
+ )
+ (block $label$5 (result f32)
+ (drop
+ (i32.shr_u
+ (br_if $label$0
+ (block $label$7 (result i32)
+ (return
+ (i32.const 65432)
+ )
)
- (i32.load8_u offset=2
- (i32.and
- (loop $label$5 (result i32)
+ (i32.eqz
+ (i32.wrap/i64
+ (loop $label$6 (result i64)
(block
(if
(i32.eqz
(get_global $hangLimit)
)
(return
- (i64.const 0)
+ (i32.const 65425)
)
)
(set_global $hangLimit
@@ -1062,45 +1286,93 @@
)
)
)
- (block $label$6 (result i32)
- (return
- (i64.const -65)
+ (i64.xor
+ (i64.extend_u/i32
+ (br_if $label$0
+ (i32.const 12)
+ (i32.div_u
+ (i32.const -96)
+ (i32.const 0)
+ )
+ )
)
+ (i64.const 8606517916339761162)
)
)
+ )
+ )
+ )
+ (f32.le
+ (call $func_6)
+ (call $deNan32
+ (f32.sub
+ (f32.const 9223372036854775808)
+ (f32.const 22107)
+ )
+ )
+ )
+ )
+ )
+ (if
+ (i32.eqz
+ (i32.const 1543)
+ )
+ (block $label$8
+ (br_if $label$8
+ (i32.load8_u offset=4
+ (i32.and
+ (i32.const 126)
(i32.const 31)
)
)
)
- (i32.const 31)
+ )
+ (nop)
+ )
+ (f32.const 1.1754943508222875e-38)
+ )
+ )
+ (select
+ (loop $label$1 (result i32)
+ (block
+ (if
+ (i32.eqz
+ (get_global $hangLimit)
+ )
+ (return
+ (i32.const -80)
+ )
+ )
+ (set_global $hangLimit
+ (i32.sub
+ (get_global $hangLimit)
+ (i32.const 1)
+ )
+ )
+ )
+ (block $label$2 (result i32)
+ (return
+ (i32.const 65509)
+ )
+ )
+ )
+ (i32.const 509639793)
+ (i32.trunc_s/f64
+ (call $deNan64
+ (f64.convert_u/i32
+ (i32.const 65487)
)
)
)
- (i32.const 10853)
)
)
)
- (block $label$14 (result i64)
- (block $label$15
- (nop)
- )
- (return
- (i64.const -89)
- )
- )
- )
- (block $label$16 (result i32)
- (block $label$17
- (nop)
- )
- (nop)
- (get_local $1)
)
)
)
(func $hangLimitInitializer
(set_global $hangLimit
- (i32.const 25)
+ (i32.const 100)
)
)
(func $deNan32 (param $0 f32) (result f32)