diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gen-s-parser.inc | 94 | ||||
-rw-r--r-- | src/passes/Print.cpp | 7 | ||||
-rw-r--r-- | src/wasm-s-parser.h | 2 | ||||
-rw-r--r-- | src/wasm/wasm-s-parser.cpp | 8 |
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; } |