summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gen-s-parser.inc94
-rw-r--r--src/passes/Print.cpp7
-rw-r--r--src/wasm-s-parser.h2
-rw-r--r--src/wasm/wasm-s-parser.cpp8
4 files changed, 32 insertions, 79 deletions
diff --git a/src/gen-s-parser.inc b/src/gen-s-parser.inc
index 4b02b09c2..6d9160c88 100644
--- a/src/gen-s-parser.inc
+++ b/src/gen-s-parser.inc
@@ -8,21 +8,13 @@ char op[27] = {'\0'};
strncpy(op, s[0]->c_str(), 26);
switch (op[0]) {
case 'a': {
- switch (op[1]) {
+ switch (op[7]) {
+ case 'f':
+ if (strcmp(op, "atomic.fence") == 0) { return makeAtomicFence(s); }
+ goto parse_error;
case 'n':
- if (strcmp(op, "anyref.pop") == 0) { return makePop(Type::anyref); }
+ if (strcmp(op, "atomic.notify") == 0) { return makeAtomicNotify(s); }
goto parse_error;
- case 't': {
- switch (op[7]) {
- case 'f':
- if (strcmp(op, "atomic.fence") == 0) { return makeAtomicFence(s); }
- goto parse_error;
- case 'n':
- if (strcmp(op, "atomic.notify") == 0) { return makeAtomicNotify(s); }
- goto parse_error;
- default: goto parse_error;
- }
- }
default: goto parse_error;
}
}
@@ -78,25 +70,9 @@ switch (op[0]) {
default: goto parse_error;
}
}
- case 'e': {
- switch (op[1]) {
- case 'l':
- if (strcmp(op, "else") == 0) { return makeThenOrElse(s); }
- goto parse_error;
- case 'x': {
- switch (op[2]) {
- case 'n':
- if (strcmp(op, "exnref.pop") == 0) { return makePop(Type::exnref); }
- goto parse_error;
- case 't':
- if (strcmp(op, "externref.pop") == 0) { return makePop(Type::externref); }
- goto parse_error;
- default: goto parse_error;
- }
- }
- default: goto parse_error;
- }
- }
+ case 'e':
+ if (strcmp(op, "else") == 0) { return makeThenOrElse(s); }
+ goto parse_error;
case 'f': {
switch (op[1]) {
case '3': {
@@ -235,9 +211,6 @@ switch (op[0]) {
default: goto parse_error;
}
}
- case 'p':
- if (strcmp(op, "f32.pop") == 0) { return makePop(Type::f32); }
- goto parse_error;
case 'r':
if (strcmp(op, "f32.reinterpret_i32") == 0) { return makeUnary(s, UnaryOp::ReinterpretInt32); }
goto parse_error;
@@ -536,17 +509,9 @@ switch (op[0]) {
default: goto parse_error;
}
}
- case 'p': {
- switch (op[5]) {
- case 'o':
- if (strcmp(op, "f64.pop") == 0) { return makePop(Type::f64); }
- goto parse_error;
- case 'r':
- if (strcmp(op, "f64.promote_f32") == 0) { return makeUnary(s, UnaryOp::PromoteFloat32); }
- goto parse_error;
- default: goto parse_error;
- }
- }
+ case 'p':
+ if (strcmp(op, "f64.promote_f32") == 0) { return makeUnary(s, UnaryOp::PromoteFloat32); }
+ goto parse_error;
case 'r':
if (strcmp(op, "f64.reinterpret_i64") == 0) { return makeUnary(s, UnaryOp::ReinterpretInt64); }
goto parse_error;
@@ -717,9 +682,6 @@ switch (op[0]) {
default: goto parse_error;
}
}
- case 'u':
- if (strcmp(op, "funcref.pop") == 0) { return makePop(Type::funcref); }
- goto parse_error;
default: goto parse_error;
}
}
@@ -1306,17 +1268,9 @@ switch (op[0]) {
case 'o':
if (strcmp(op, "i32.or") == 0) { return makeBinary(s, BinaryOp::OrInt32); }
goto parse_error;
- case 'p': {
- switch (op[7]) {
- case '\0':
- if (strcmp(op, "i32.pop") == 0) { return makePop(Type::i32); }
- goto parse_error;
- case 'c':
- if (strcmp(op, "i32.popcnt") == 0) { return makeUnary(s, UnaryOp::PopcntInt32); }
- goto parse_error;
- default: goto parse_error;
- }
- }
+ case 'p':
+ if (strcmp(op, "i32.popcnt") == 0) { return makeUnary(s, UnaryOp::PopcntInt32); }
+ goto parse_error;
case 'r': {
switch (op[5]) {
case 'e': {
@@ -2056,17 +2010,9 @@ switch (op[0]) {
case 'o':
if (strcmp(op, "i64.or") == 0) { return makeBinary(s, BinaryOp::OrInt64); }
goto parse_error;
- case 'p': {
- switch (op[7]) {
- case '\0':
- if (strcmp(op, "i64.pop") == 0) { return makePop(Type::i64); }
- goto parse_error;
- case 'c':
- if (strcmp(op, "i64.popcnt") == 0) { return makeUnary(s, UnaryOp::PopcntInt64); }
- goto parse_error;
- default: goto parse_error;
- }
- }
+ case 'p':
+ if (strcmp(op, "i64.popcnt") == 0) { return makeUnary(s, UnaryOp::PopcntInt64); }
+ goto parse_error;
case 'r': {
switch (op[5]) {
case 'e': {
@@ -2571,6 +2517,9 @@ switch (op[0]) {
case 'n':
if (strcmp(op, "nop") == 0) { return makeNop(); }
goto parse_error;
+ case 'p':
+ if (strcmp(op, "pop") == 0) { return makePop(s); }
+ goto parse_error;
case 'r': {
switch (op[2]) {
case 'f': {
@@ -2696,9 +2645,6 @@ switch (op[0]) {
case 'o':
if (strcmp(op, "v128.or") == 0) { return makeBinary(s, BinaryOp::OrVec128); }
goto parse_error;
- case 'p':
- if (strcmp(op, "v128.pop") == 0) { return makePop(Type::v128); }
- goto parse_error;
case 's':
if (strcmp(op, "v128.store") == 0) { return makeStore(s, Type::v128, /*isAtomic=*/false); }
goto parse_error;
diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp
index 04fcdc0b3..f4131db37 100644
--- a/src/passes/Print.cpp
+++ b/src/passes/Print.cpp
@@ -1469,8 +1469,11 @@ struct PrintExpressionContents
void visitNop(Nop* curr) { printMinor(o, "nop"); }
void visitUnreachable(Unreachable* curr) { printMinor(o, "unreachable"); }
void visitPop(Pop* curr) {
- prepareColor(o) << curr->type;
- o << ".pop";
+ prepareColor(o) << "pop";
+ for (auto type : curr->type) {
+ assert(type.isBasic() && "TODO: print and parse compound types");
+ o << " " << type;
+ }
restoreNormalColor(o);
}
void visitTupleMake(TupleMake* curr) { printMedium(o, "tuple.make"); }
diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h
index d77062e33..a4559012d 100644
--- a/src/wasm-s-parser.h
+++ b/src/wasm-s-parser.h
@@ -217,7 +217,7 @@ private:
Expression* makeMemoryCopy(Element& s);
Expression* makeMemoryFill(Element& s);
Expression* makePush(Element& s);
- Expression* makePop(Type type);
+ Expression* makePop(Element& s);
Expression* makeIf(Element& s);
Expression* makeMaybeBlock(Element& s, size_t i, Type type);
Expression* makeLoop(Element& s);
diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp
index e4a33c034..97bfe55f9 100644
--- a/src/wasm/wasm-s-parser.cpp
+++ b/src/wasm/wasm-s-parser.cpp
@@ -1620,9 +1620,13 @@ Expression* SExpressionWasmBuilder::makeMemoryFill(Element& s) {
return ret;
}
-Expression* SExpressionWasmBuilder::makePop(Type type) {
+Expression* SExpressionWasmBuilder::makePop(Element& s) {
auto ret = allocator.alloc<Pop>();
- ret->type = type;
+ std::vector<Type> types;
+ for (size_t i = 1; i < s.size(); ++i) {
+ types.push_back(stringToType(s[i]->str()));
+ }
+ ret->type = Type(types);
ret->finalize();
return ret;
}