diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-01-17 09:54:03 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-01-17 09:54:03 -0800 |
commit | d59d14ffa46bcf9d061a6f3d1e941ac8a70d5bda (patch) | |
tree | c319f1ce3787f9f21ea93ffad293f3b7ac543bce | |
parent | 5cbf5020590d61a5d9dbfcc77d7eb7cc144694c7 (diff) | |
parent | 0c78665777e244741bfe6e2ab30fedded96354bd (diff) | |
download | binaryen-d59d14ffa46bcf9d061a6f3d1e941ac8a70d5bda.tar.gz binaryen-d59d14ffa46bcf9d061a6f3d1e941ac8a70d5bda.tar.bz2 binaryen-d59d14ffa46bcf9d061a6f3d1e941ac8a70d5bda.zip |
Merge pull request #116 from JSStats/br-value
The break operation may have a value, and must with the v8 encoding.
-rw-r--r-- | src/wasm-binary.h | 6 | ||||
-rw-r--r-- | src/wasm.h | 4 | ||||
-rw-r--r-- | test/emcc_O2_hello_world.wast.fromBinary | 52 | ||||
-rw-r--r-- | test/emcc_hello_world.wast.fromBinary | 299 |
4 files changed, 285 insertions, 76 deletions
diff --git a/src/wasm-binary.h b/src/wasm-binary.h index 6b2e960d4..0b8663497 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -607,6 +607,11 @@ public: abort(); } if (curr->condition) recurse(curr->condition); + if (curr->value) { + recurse(curr->value); + } else { + o << int8_t(BinaryConsts::Nop); + } } void visitSwitch(Switch *curr) { if (debug) std::cerr << "zz node: Switch" << std::endl; @@ -1267,6 +1272,7 @@ public: auto offset = getInt8(); curr->name = breakStack[breakStack.size() - 1 - offset]; if (code == BinaryConsts::BrIf) readExpression(curr->condition); + readExpression(curr->value); } void visitSwitch(Switch *curr) { if (debug) std::cerr << "zz node: Switch" << std::endl; diff --git a/src/wasm.h b/src/wasm.h index 8a3ceac7c..9edd7645e 100644 --- a/src/wasm.h +++ b/src/wasm.h @@ -432,14 +432,14 @@ public: doIndent(o, indent) << name << '\n'; } else { printOpening(o, "br ") << name; - if (!value) { + if (!value || value->is<Nop>()) { // avoid a new line just for the parens o << ")"; return o; } incIndent(o, indent); } - if (value) printFullLine(o, indent, value); + if (value && !value->is<Nop>()) printFullLine(o, indent, value); return decIndent(o, indent); } }; diff --git a/test/emcc_O2_hello_world.wast.fromBinary b/test/emcc_O2_hello_world.wast.fromBinary index d1be1157e..3eb3aec1d 100644 --- a/test/emcc_O2_hello_world.wast.fromBinary +++ b/test/emcc_O2_hello_world.wast.fromBinary @@ -334,7 +334,9 @@ (set_local $var$0 (get_local $var$0) ) - (br $label$0) + (br $label$0 + (get_local $var$0) + ) ) ) (set_local $var$0 @@ -765,7 +767,9 @@ (set_local $var$0 (get_local $var$0) ) - (br $label$0) + (br $label$0 + (get_local $var$0) + ) ) ) (set_local $var$0 @@ -1711,7 +1715,9 @@ (i32.const 8) ) ) - (br $label$0) + (br $label$0 + (get_local $var$0) + ) ) (set_local $var$0 (get_local $var$1) @@ -3565,7 +3571,9 @@ (i32.const 8) ) ) - (br $label$0) + (br $label$0 + (get_local $var$0) + ) ) (set_local $var$0 (get_local $var$0) @@ -3707,7 +3715,9 @@ (i32.const 8) ) ) - (br $label$0) + (br $label$0 + (get_local $var$0) + ) ) ) (set_local $var$0 @@ -3778,7 +3788,9 @@ (i32.const 8) ) ) - (br $label$0) + (br $label$0 + (get_local $var$0) + ) ) ) (block $label$123 @@ -3900,7 +3912,9 @@ (set_local $var$0 (i32.const 0) ) - (br $label$0) + (br $label$0 + (get_local $var$0) + ) ) ) (set_local $var$0 @@ -3957,7 +3971,9 @@ (set_local $var$0 (i32.const 0) ) - (br $label$0) + (br $label$0 + (get_local $var$0) + ) ) ) (block $label$130 @@ -6357,7 +6373,9 @@ (i32.const 8) ) ) - (br $label$0) + (br $label$0 + (get_local $var$0) + ) ) (set_local $var$0 (i32.const 624) @@ -7491,7 +7509,9 @@ (i32.const 8) ) ) - (br $label$0) + (br $label$0 + (get_local $var$0) + ) ) ) ) @@ -12626,7 +12646,13 @@ (get_local $var$0) (i32.const 4096) ) - (br $label$0) + (br $label$0 + (call_import $_emscripten_memcpy_big + (get_local $var$0) + (get_local $var$0) + (get_local $var$0) + ) + ) ) (set_local $var$3 (get_local $var$0) @@ -12659,7 +12685,9 @@ (get_local $var$0) (i32.const 0) ) - (br $label$0) + (br $label$0 + (get_local $var$3) + ) ) (i32.store8 align=1 (get_local $var$0) diff --git a/test/emcc_hello_world.wast.fromBinary b/test/emcc_hello_world.wast.fromBinary index 6b23fc782..48b486d28 100644 --- a/test/emcc_hello_world.wast.fromBinary +++ b/test/emcc_hello_world.wast.fromBinary @@ -29693,7 +29693,9 @@ (set_local $var$0 (get_local $var$0) ) - (br $label$0) + (br $label$0 + (get_local $var$0) + ) ) ) (set_local $var$0 @@ -30271,7 +30273,9 @@ (set_local $var$0 (get_local $var$0) ) - (br $label$0) + (br $label$0 + (get_local $var$0) + ) ) ) (set_local $var$0 @@ -31553,7 +31557,9 @@ (set_local $var$0 (get_local $var$0) ) - (br $label$0) + (br $label$0 + (get_local $var$0) + ) ) ) ) @@ -34054,7 +34060,9 @@ (set_local $var$0 (get_local $var$0) ) - (br $label$0) + (br $label$0 + (get_local $var$0) + ) ) (set_local $var$0 (get_local $var$0) @@ -34235,7 +34243,9 @@ (set_local $var$0 (get_local $var$0) ) - (br $label$0) + (br $label$0 + (get_local $var$0) + ) ) ) (set_local $var$0 @@ -34324,7 +34334,9 @@ (set_local $var$0 (get_local $var$0) ) - (br $label$0) + (br $label$0 + (get_local $var$0) + ) ) ) (set_local $var$0 @@ -34476,7 +34488,9 @@ (set_local $var$0 (i32.const 0) ) - (br $label$0) + (br $label$0 + (get_local $var$0) + ) ) ) (set_local $var$0 @@ -34543,7 +34557,9 @@ (set_local $var$0 (i32.const 0) ) - (br $label$0) + (br $label$0 + (get_local $var$0) + ) ) ) ) @@ -38025,7 +38041,9 @@ (set_local $var$0 (get_local $var$0) ) - (br $label$0) + (br $label$0 + (get_local $var$0) + ) ) (set_local $var$0 (i32.const 624) @@ -39323,7 +39341,9 @@ (set_local $var$0 (get_local $var$0) ) - (br $label$0) + (br $label$0 + (get_local $var$0) + ) ) ) ) @@ -59418,7 +59438,24 @@ (get_local $var$116) ) ) - (br $label$0) + (br $label$0 + (i32.or + (i32.shr_u + (get_local $var$114) + (get_local $var$116) + ) + (i32.shl + (i32.and + (get_local $var$115) + (get_local $var$0) + ) + (i32.sub + (i32.const 32) + (get_local $var$116) + ) + ) + ) + ) ) ) (i32.store align=4 @@ -62816,7 +62853,12 @@ ) ) ) - (br $label$0) + (br $label$0 + (i32.shl + (get_local $var$118) + (get_local $var$118) + ) + ) ) ) (i32.store align=4 @@ -66180,7 +66222,13 @@ (get_local $var$119) (i32.const 4096) ) - (br $label$0) + (br $label$0 + (call_import $_emscripten_memcpy_big + (get_local $var$118) + (get_local $var$118) + (get_local $var$119) + ) + ) ) (set_local $var$0 (get_local $var$118) @@ -66213,7 +66261,9 @@ (get_local $var$119) (i32.const 0) ) - (br $label$0) + (br $label$0 + (get_local $var$0) + ) ) (i32.store8 align=1 (get_local $var$118) @@ -69692,7 +69742,24 @@ (get_local $var$119) ) ) - (br $label$0) + (br $label$0 + (i32.or + (i32.shr_u + (get_local $var$119) + (get_local $var$119) + ) + (i32.shl + (i32.and + (get_local $var$119) + (get_local $var$0) + ) + (i32.sub + (i32.const 32) + (get_local $var$119) + ) + ) + ) + ) ) ) (i32.store align=4 @@ -73078,7 +73145,9 @@ (get_local $var$1) (i32.const 8) ) - (br $label$0) + (br $label$0 + (get_local $var$1) + ) ) (set_local $var$1 (i32.load8_s align=1 @@ -73101,7 +73170,12 @@ (get_local $var$1) (i32.const 8) ) - (br $label$0) + (br $label$0 + (i32.add + (get_local $var$1) + (i32.const 8) + ) + ) ) (set_local $var$1 (i32.load8_s align=1 @@ -73124,7 +73198,12 @@ (get_local $var$1) (i32.const 8) ) - (br $label$0) + (br $label$0 + (i32.add + (get_local $var$1) + (i32.const 16) + ) + ) ) (i32.add (i32.load8_s align=1 @@ -97452,22 +97531,38 @@ (i32.const 0) ) ) - (br $label$0) + (br $label$0 + (block $label$4 + (i32.store align=4 + (i32.const 168) + (get_local $var$0) + ) + (get_local $var$0) + ) + ) ) - (block $label$4 + (block $label$5 (if (i32.eq (get_local $var$0) (i32.const 0) ) - (block $label$5 + (block $label$6 (set_local $var$0 (i32.const 0) ) (set_local $var$0 (i32.const 0) ) - (br $label$0) + (br $label$0 + (block $label$7 + (i32.store align=4 + (i32.const 168) + (get_local $var$0) + ) + (get_local $var$0) + ) + ) ) ) (i32.store align=4 @@ -97493,7 +97588,15 @@ (set_local $var$0 (i32.const 0) ) - (br $label$0) + (br $label$0 + (block $label$8 + (i32.store align=4 + (i32.const 168) + (get_local $var$0) + ) + (get_local $var$0) + ) + ) ) ) ) @@ -97504,22 +97607,22 @@ (i32.const 0) ) ) - (block $label$6 + (block $label$9 (if_else (i32.eq (get_local $var$0) (i32.const 0) ) - (block $label$7 + (block $label$10 (if (get_local $var$0) - (block $label$8 + (block $label$11 (if (i32.ne (get_local $var$140) (i32.const 0) ) - (block $label$9 + (block $label$12 (i32.store align=4 (get_local $var$140) (i32.rem_u @@ -97560,7 +97663,15 @@ (i32.const 0) ) ) - (br $label$0) + (br $label$0 + (block $label$13 + (i32.store align=4 + (i32.const 168) + (get_local $var$0) + ) + (get_local $var$0) + ) + ) ) ) (if @@ -97568,13 +97679,13 @@ (get_local $var$0) (i32.const 0) ) - (block $label$10 + (block $label$14 (if (i32.ne (get_local $var$140) (i32.const 0) ) - (block $label$11 + (block $label$15 (i32.store align=4 (get_local $var$140) (i32.const 0) @@ -97615,7 +97726,15 @@ (i32.const 0) ) ) - (br $label$0) + (br $label$0 + (block $label$16 + (i32.store align=4 + (i32.const 168) + (get_local $var$0) + ) + (get_local $var$0) + ) + ) ) ) (set_local $var$0 @@ -97632,13 +97751,13 @@ ) (i32.const 0) ) - (block $label$12 + (block $label$17 (if (i32.ne (get_local $var$140) (i32.const 0) ) - (block $label$13 + (block $label$18 (i32.store align=4 (get_local $var$140) (i32.or @@ -97681,7 +97800,15 @@ ) ) ) - (br $label$0) + (br $label$0 + (block $label$19 + (i32.store align=4 + (i32.const 168) + (get_local $var$0) + ) + (get_local $var$0) + ) + ) ) ) (set_local $var$0 @@ -97705,7 +97832,7 @@ ) (i32.const 30) ) - (block $label$14 + (block $label$20 (set_local $var$0 (i32.add (get_local $var$0) @@ -97754,7 +97881,7 @@ (get_local $var$0) ) ) - (br $label$6) + (br $label$9) ) ) (if @@ -97762,14 +97889,22 @@ (get_local $var$140) (i32.const 0) ) - (block $label$15 + (block $label$21 (set_local $var$0 (i32.const 0) ) (set_local $var$0 (i32.const 0) ) - (br $label$0) + (br $label$0 + (block $label$22 + (i32.store align=4 + (i32.const 168) + (get_local $var$0) + ) + (get_local $var$0) + ) + ) ) ) (i32.store align=4 @@ -97801,15 +97936,23 @@ (set_local $var$0 (i32.const 0) ) - (br $label$0) + (br $label$0 + (block $label$23 + (i32.store align=4 + (i32.const 168) + (get_local $var$0) + ) + (get_local $var$0) + ) + ) ) - (block $label$16 + (block $label$24 (if (i32.eq (get_local $var$0) (i32.const 0) ) - (block $label$17 + (block $label$25 (set_local $var$0 (i32.clz (get_local $var$0) @@ -97831,7 +97974,7 @@ ) (i32.const 31) ) - (block $label$18 + (block $label$26 (set_local $var$0 (i32.add (get_local $var$0) @@ -97895,7 +98038,7 @@ (get_local $var$0) ) ) - (br $label$6) + (br $label$9) ) ) (if @@ -97903,14 +98046,22 @@ (get_local $var$140) (i32.const 0) ) - (block $label$19 + (block $label$27 (set_local $var$0 (i32.const 0) ) (set_local $var$0 (i32.const 0) ) - (br $label$0) + (br $label$0 + (block $label$28 + (i32.store align=4 + (i32.const 168) + (get_local $var$0) + ) + (get_local $var$0) + ) + ) ) ) (i32.store align=4 @@ -97942,7 +98093,15 @@ (set_local $var$0 (i32.const 0) ) - (br $label$0) + (br $label$0 + (block $label$29 + (i32.store align=4 + (i32.const 168) + (get_local $var$0) + ) + (get_local $var$0) + ) + ) ) ) (set_local $var$0 @@ -97959,7 +98118,7 @@ ) (i32.const 0) ) - (block $label$20 + (block $label$30 (set_local $var$0 (i32.add (i32.clz @@ -98099,7 +98258,7 @@ ) ) ) - (br $label$6) + (br $label$9) ) ) (if @@ -98107,7 +98266,7 @@ (get_local $var$140) (i32.const 0) ) - (block $label$21 + (block $label$31 (i32.store align=4 (get_local $var$140) (i32.and @@ -98129,7 +98288,7 @@ (get_local $var$0) (i32.const 1) ) - (block $label$22 + (block $label$32 (set_local $var$0 (i32.or (get_local $var$0) @@ -98148,9 +98307,17 @@ ) ) ) - (br $label$0) + (br $label$0 + (block $label$33 + (i32.store align=4 + (i32.const 168) + (get_local $var$0) + ) + (get_local $var$0) + ) + ) ) - (block $label$23 + (block $label$34 (set_local $var$0 (call $_llvm_cttz_i32 (get_local $var$0) @@ -98186,7 +98353,15 @@ ) ) ) - (br $label$0) + (br $label$0 + (block $label$35 + (i32.store align=4 + (i32.const 168) + (get_local $var$0) + ) + (get_local $var$0) + ) + ) ) ) ) @@ -98197,7 +98372,7 @@ (get_local $var$0) (i32.const 0) ) - (block $label$24 + (block $label$36 (set_local $var$0 (get_local $var$0) ) @@ -98217,7 +98392,7 @@ (i32.const 0) ) ) - (block $label$25 + (block $label$37 (set_local $var$0 (i32.or (i32.const 0) @@ -98267,8 +98442,8 @@ (set_local $var$0 (i32.const 0) ) - (loop $label$26 $label$27 - (block $label$28 + (loop $label$38 $label$39 + (block $label$40 (set_local $var$0 (i32.or (i32.shr_u @@ -98409,8 +98584,8 @@ (get_local $var$0) (i32.const 0) ) - (br $label$26) - (block $label$29 + (br $label$38) + (block $label$41 (set_local $var$0 (get_local $var$0) ) @@ -98431,7 +98606,7 @@ ) ) ) - (br $label$27) + (br $label$39) ) ) (set_local $var$0 @@ -98471,7 +98646,7 @@ (get_local $var$140) (i32.const 0) ) - (block $label$30 + (block $label$42 (i32.store align=4 (get_local $var$140) (i32.or @@ -98539,7 +98714,7 @@ (get_local $var$0) ) ) - (block $label$31 + (block $label$43 (i32.store align=4 (i32.const 168) (get_local $var$0) |