summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-10-29 19:59:10 -0700
committerAlon Zakai <alonzakai@gmail.com>2015-10-29 19:59:10 -0700
commit3e8516cb75e7941da0b16443fbd4b4a298fa3644 (patch)
treecda4a993ac8b30ec507f930edf02920142e25531
parent88b6549b74dd767733cd823de410e00067a79756 (diff)
downloadbinaryen-3e8516cb75e7941da0b16443fbd4b4a298fa3644.tar.gz
binaryen-3e8516cb75e7941da0b16443fbd4b4a298fa3644.tar.bz2
binaryen-3e8516cb75e7941da0b16443fbd4b4a298fa3644.zip
double fixes
-rw-r--r--src/asm2wasm.cpp16
-rw-r--r--src/simple_ast.h8
-rw-r--r--test/emcc_hello_world.wast90
3 files changed, 62 insertions, 52 deletions
diff --git a/src/asm2wasm.cpp b/src/asm2wasm.cpp
index 9a7d36ae5..267e36bf6 100644
--- a/src/asm2wasm.cpp
+++ b/src/asm2wasm.cpp
@@ -624,6 +624,12 @@ void Asm2WasmModule::processAsm(Ref ast) {
}
Function* Asm2WasmModule::processFunction(Ref ast) {
+ if (debug) {
+ std::cout << "func: ";
+ ast->stringify(std::cout);
+ std::cout << '\n';
+ }
+
auto function = allocator.alloc<Function>();
function->name = ast[1]->getIString();
Ref params = ast[2];
@@ -684,9 +690,9 @@ Function* Asm2WasmModule::processFunction(Ref ast) {
std::function<Expression* (Ref)> process = [&](Ref ast) -> Expression* {
AstStackHelper astStackHelper(ast); // TODO: only create one when we need it?
if (debug) {
- std::cerr << "at: ";
- ast->stringify(std::cerr);
- std::cerr << '\n';
+ std::cout << "at: ";
+ ast->stringify(std::cout);
+ std::cout << '\n';
}
IString what = ast[0]->getIString();
if (what == STAT) {
@@ -824,7 +830,7 @@ Function* Asm2WasmModule::processFunction(Ref ast) {
ret->type = BasicType::f64;
return ret;
}
- assert(childType == ASM_NONE); // e.g. a coercion on a call
+ assert(childType == ASM_NONE || childType == ASM_DOUBLE); // e.g. a coercion on a call or for a return
auto ret = process(ast[2]); // just look through the +() coercion
ret->type = BasicType::f64; // we add it here for e.g. call coercions
return ret;
@@ -1203,7 +1209,7 @@ int main(int argc, char **argv) {
}
if (debug) std::cerr << "parsing...\n";
- cashew::Parser<Ref, ValueBuilder> builder;
+ cashew::Parser<Ref, DotZeroValueBuilder> builder;
Ref asmjs = builder.parseToplevel(input);
if (debug) std::cerr << "wasming...\n";
diff --git a/src/simple_ast.h b/src/simple_ast.h
index 5d5e3f201..a04fbf712 100644
--- a/src/simple_ast.h
+++ b/src/simple_ast.h
@@ -1516,3 +1516,11 @@ public:
}
};
+// Tolerates 0.0 in the input; does not trust a +() to be there.
+class DotZeroValueBuilder : public ValueBuilder {
+public:
+ static Ref makeDouble(double num) {
+ return makePrefix(PLUS, ValueBuilder::makeDouble(num));
+ }
+};
+
diff --git a/test/emcc_hello_world.wast b/test/emcc_hello_world.wast
index 358d3f536..3303d930c 100644
--- a/test/emcc_hello_world.wast
+++ b/test/emcc_hello_world.wast
@@ -366,16 +366,16 @@
(local $$4 i32)
(local $$5 i32)
(local $$6 i32)
- (local $$7 i32)
- (local $$call i32)
+ (local $$7 f64)
+ (local $$call f64)
(local $$conv i32)
- (local $$mul i32)
- (local $$retval$0 i32)
+ (local $$mul f64)
+ (local $$retval$0 f64)
(local $$storemerge i32)
(local $$sub i32)
(local $$sub8 i32)
(local $$tobool1 i32)
- (local $$x$addr$0 i32)
+ (local $$x$addr$0 f64)
(local $label i32)
(local $sp i32)
(block $topmost
@@ -427,14 +427,12 @@
)
(nop)
(break $topmost
- (f64.convert_s/i32
- (get_local $$retval$0)
- )
+ (get_local $$retval$0)
)
)
)
(func $_frexpl (param $$x f64) (param $$e i32) (result f64)
- (local $$call i32)
+ (local $$call f64)
(local $label i32)
(local $sp i32)
(block $topmost
@@ -450,9 +448,7 @@
)
)
(break $topmost
- (f64.convert_s/i32
- (get_local $$call)
- )
+ (get_local $$call)
)
)
)
@@ -4717,8 +4713,8 @@
(func $_printf_core (param $$f i32) (param $$fmt i32) (param $$ap i32) (param $$nl_arg i32) (param $$nl_type i32) (result i32)
(local $$$ i32)
(local $$$$i i32)
- (local $$$396$i i32)
- (local $$$404$i i32)
+ (local $$$396$i f64)
+ (local $$$404$i f64)
(local $$$l10n$0 i32)
(local $$$lcssa i32)
(local $$$p$i i32)
@@ -4825,7 +4821,7 @@
(local $$179 i32)
(local $$18 i32)
(local $$180 i32)
- (local $$181 i32)
+ (local $$181 f64)
(local $$182 i32)
(local $$183 i32)
(local $$184 i32)
@@ -5055,7 +5051,7 @@
(local $$add322 i32)
(local $$add355$i i32)
(local $$add395 i32)
- (local $$add410$i i32)
+ (local $$add410$i f64)
(local $$add412 i32)
(local $$add414$i i32)
(local $$add441 i32)
@@ -5068,8 +5064,8 @@
(local $$add67$i i32)
(local $$add737$i i32)
(local $$add810$i i32)
- (local $$add87$i i32)
- (local $$add90$i i32)
+ (local $$add87$i f64)
+ (local $$add90$i f64)
(local $$and i32)
(local $$and$i i32)
(local $$and$i$216 i32)
@@ -5145,7 +5141,7 @@
(local $$call356 i32)
(local $$call384 i32)
(local $$call411 i32)
- (local $$call55$i i32)
+ (local $$call55$i f64)
(local $$carry$0544$i i32)
(local $$carry262$0535$i i32)
(local $$cmp i32)
@@ -5294,14 +5290,14 @@
(local $$conv118$393$i i32)
(local $$conv120 i32)
(local $$conv121$i i32)
- (local $$conv123$i i32)
+ (local $$conv123$i f64)
(local $$conv134 i32)
(local $$conv163 i32)
(local $$conv174 i32)
(local $$conv174$lcssa i32)
(local $$conv207 i32)
(local $$conv216$i i32)
- (local $$conv218$i i32)
+ (local $$conv218$i f64)
(local $$conv229 i32)
(local $$conv232 i32)
(local $$conv242$i$lcssa i32)
@@ -5477,10 +5473,10 @@
(local $$mb i32)
(local $$mul$i i32)
(local $$mul$i$202 i32)
- (local $$mul$i$240 i32)
- (local $$mul125$i i32)
- (local $$mul202$i i32)
- (local $$mul220$i i32)
+ (local $$mul$i$240 f64)
+ (local $$mul125$i f64)
+ (local $$mul202$i f64)
+ (local $$mul220$i f64)
(local $$mul286$i i32)
(local $$mul286$i$lcssa i32)
(local $$mul322$i i32)
@@ -5488,14 +5484,14 @@
(local $$mul335$i i32)
(local $$mul349$i i32)
(local $$mul367$i i32)
- (local $$mul406$i i32)
- (local $$mul407$i i32)
+ (local $$mul406$i f64)
+ (local $$mul407$i f64)
(local $$mul431$i i32)
(local $$mul437$i i32)
(local $$mul499$i i32)
(local $$mul513$i i32)
- (local $$mul80$i i32)
- (local $$mul80$i$lcssa i32)
+ (local $$mul80$i f64)
+ (local $$mul80$i$lcssa f64)
(local $$notlhs$i i32)
(local $$notrhs$i i32)
(local $$or i32)
@@ -5550,8 +5546,8 @@
(local $$rem494$i i32)
(local $$retval$0 i32)
(local $$retval$0$i i32)
- (local $$round$0481$i i32)
- (local $$round377$1$i i32)
+ (local $$round$0481$i f64)
+ (local $$round377$1$i f64)
(local $$s$0$i i32)
(local $$s$1$i i32)
(local $$s$1$i$lcssa i32)
@@ -5572,8 +5568,8 @@
(local $$shr i32)
(local $$shr283$i i32)
(local $$shr285$i i32)
- (local $$small$0$i i32)
- (local $$small$1$i i32)
+ (local $$small$0$i f64)
+ (local $$small$1$i f64)
(local $$st$0 i32)
(local $$st$0$lcssa415 i32)
(local $$storemerge i32)
@@ -5581,7 +5577,7 @@
(local $$storemerge$186309 i32)
(local $$storemerge$191 i32)
(local $$sub i32)
- (local $$sub$i i32)
+ (local $$sub$i f64)
(local $$sub$ptr$div$i i32)
(local $$sub$ptr$div321$i i32)
(local $$sub$ptr$div347$i i32)
@@ -5642,14 +5638,14 @@
(local $$sub$ptr$sub789$i i32)
(local $$sub$ptr$sub813$i i32)
(local $$sub101 i32)
- (local $$sub124$i i32)
+ (local $$sub124$i f64)
(local $$sub135 i32)
(local $$sub146$i i32)
(local $$sub164 i32)
(local $$sub175 i32)
(local $$sub181$i i32)
(local $$sub203$i i32)
- (local $$sub219$i i32)
+ (local $$sub219$i f64)
(local $$sub256$i i32)
(local $$sub264$i i32)
(local $$sub281$i i32)
@@ -5669,10 +5665,10 @@
(local $$sub74$i i32)
(local $$sub806$i i32)
(local $$sub84 i32)
- (local $$sub85$i i32)
- (local $$sub86$i i32)
- (local $$sub88$i i32)
- (local $$sub91$i i32)
+ (local $$sub85$i f64)
+ (local $$sub86$i f64)
+ (local $$sub88$i f64)
+ (local $$sub91$i f64)
(local $$sub97$i i32)
(local $$sum i32)
(local $$t$0 i32)
@@ -5756,11 +5752,11 @@
(local $$xor457 i32)
(local $$xor655$i i32)
(local $$xor816$i i32)
- (local $$y$addr$0$i i32)
- (local $$y$addr$1$i i32)
- (local $$y$addr$2$i i32)
- (local $$y$addr$3$i i32)
- (local $$y$addr$4$i i32)
+ (local $$y$addr$0$i f64)
+ (local $$y$addr$1$i f64)
+ (local $$y$addr$2$i f64)
+ (local $$y$addr$3$i f64)
+ (local $$y$addr$4$i f64)
(local $$z$0$i i32)
(local $$z$0$lcssa i32)
(local $$z$0302 i32)
@@ -9236,7 +9232,7 @@
(local $$100 i32)
(local $$101 i32)
(local $$102 i32)
- (local $$103 i32)
+ (local $$103 f64)
(local $$104 i32)
(local $$105 i32)
(local $$106 i32)
@@ -9244,7 +9240,7 @@
(local $$108 i32)
(local $$109 i32)
(local $$11 i32)
- (local $$110 i32)
+ (local $$110 f64)
(local $$12 i32)
(local $$13 i32)
(local $$14 i32)