diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-11-01 21:31:41 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-11-01 21:31:41 -0700 |
commit | 0ff4359de75b4dd2a786dfa50cb17b3ec01a701a (patch) | |
tree | 78210cf7cae6e79e7d0fb94cc685b34b6f90f9b2 | |
parent | 1bcbf5fd9b6cbedf302309eaae719115b2d83d4a (diff) | |
download | binaryen-0ff4359de75b4dd2a786dfa50cb17b3ec01a701a.tar.gz binaryen-0ff4359de75b4dd2a786dfa50cb17b3ec01a701a.tar.bz2 binaryen-0ff4359de75b4dd2a786dfa50cb17b3ec01a701a.zip |
fix large f32 consts, fixes #817 (#820)
-rw-r--r-- | src/asm2wasm.h | 14 | ||||
-rw-r--r-- | src/emscripten-optimizer/simple_ast.h | 4 | ||||
-rw-r--r-- | test/unit.asm.js | 4 | ||||
-rw-r--r-- | test/unit.fromasm.imprecise.no-opts | 5 | ||||
-rw-r--r-- | test/unit.fromasm.no-opts | 5 |
5 files changed, 24 insertions, 8 deletions
diff --git a/src/asm2wasm.h b/src/asm2wasm.h index 377b6b20b..87fd10649 100644 --- a/src/asm2wasm.h +++ b/src/asm2wasm.h @@ -443,9 +443,13 @@ private: std::map<unsigned, Ref> tempNums; - Literal checkLiteral(Ref ast) { + Literal checkLiteral(Ref ast, bool rawIsInteger = true) { if (ast[0] == NUM) { - return Literal((int32_t)ast[1]->getInteger()); + if (rawIsInteger) { + return Literal((int32_t)ast[1]->getInteger()); + } else { + return Literal(ast[1]->getNumber()); + } } else if (ast[0] == UNARY_PREFIX) { if (ast[1] == PLUS && ast[2][0] == NUM) { return Literal((double)ast[2][1]->getNumber()); @@ -1475,10 +1479,8 @@ Function* Asm2WasmBuilder::processFunction(Ref ast) { } if (name == Math_fround) { assert(ast[2]->size() == 1); - Literal lit = checkLiteral(ast[2][0]); - if (lit.type == i32) { - return builder.makeConst(Literal((float)lit.geti32())); - } else if (lit.type == f64) { + Literal lit = checkLiteral(ast[2][0], false /* raw is float */); + if (lit.type == f64) { return builder.makeConst(Literal((float)lit.getf64())); } auto ret = allocator.alloc<Unary>(); diff --git a/src/emscripten-optimizer/simple_ast.h b/src/emscripten-optimizer/simple_ast.h index 3f0d363df..20de952c1 100644 --- a/src/emscripten-optimizer/simple_ast.h +++ b/src/emscripten-optimizer/simple_ast.h @@ -225,9 +225,9 @@ struct Value { return boo; } - int getInteger() { // convenience function to get a known integer + int32_t getInteger() { // convenience function to get a known integer assert(fmod(getNumber(), 1) == 0); - int ret = int(getNumber()); + int32_t ret = getNumber(); assert(double(ret) == getNumber()); // no loss in conversion return ret; } diff --git a/test/unit.asm.js b/test/unit.asm.js index 6ccf6c489..f002965ec 100644 --- a/test/unit.asm.js +++ b/test/unit.asm.js @@ -589,6 +589,10 @@ function asm(global, env, buffer) { return; } + function big_fround() { + return Math_fround(4294967295); + } + function dropIgnoredImportsInIf($0,$1,$2) { $0 = $0|0; $1 = $1|0; diff --git a/test/unit.fromasm.imprecise.no-opts b/test/unit.fromasm.imprecise.no-opts index f372b2d57..608d68dcb 100644 --- a/test/unit.fromasm.imprecise.no-opts +++ b/test/unit.fromasm.imprecise.no-opts @@ -1677,6 +1677,11 @@ ) (return) ) + (func $big_fround (result f32) + (return + (f32.const 4294967296) + ) + ) (func $dropIgnoredImportsInIf (param $$0 i32) (param $$1 i32) (param $$2 i32) (block $do-once (if diff --git a/test/unit.fromasm.no-opts b/test/unit.fromasm.no-opts index 0b90cb3b8..0b8a67ca7 100644 --- a/test/unit.fromasm.no-opts +++ b/test/unit.fromasm.no-opts @@ -1683,6 +1683,11 @@ ) (return) ) + (func $big_fround (result f32) + (return + (f32.const 4294967296) + ) + ) (func $dropIgnoredImportsInIf (param $$0 i32) (param $$1 i32) (param $$2 i32) (block $do-once (if |