diff options
-rw-r--r-- | src/asm2wasm.cpp | 16 | ||||
-rw-r--r-- | src/simple_ast.h | 8 | ||||
-rw-r--r-- | test/emcc_hello_world.wast | 90 |
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) |