summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-01-17 09:54:03 -0800
committerAlon Zakai <alonzakai@gmail.com>2016-01-17 09:54:03 -0800
commitd59d14ffa46bcf9d061a6f3d1e941ac8a70d5bda (patch)
treec319f1ce3787f9f21ea93ffad293f3b7ac543bce
parent5cbf5020590d61a5d9dbfcc77d7eb7cc144694c7 (diff)
parent0c78665777e244741bfe6e2ab30fedded96354bd (diff)
downloadbinaryen-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.h6
-rw-r--r--src/wasm.h4
-rw-r--r--test/emcc_O2_hello_world.wast.fromBinary52
-rw-r--r--test/emcc_hello_world.wast.fromBinary299
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)