diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ir/literal-utils.h | 10 | ||||
-rw-r--r-- | src/wasm-interpreter.h | 46 |
2 files changed, 16 insertions, 40 deletions
diff --git a/src/ir/literal-utils.h b/src/ir/literal-utils.h index 45119f2bd..abc48f636 100644 --- a/src/ir/literal-utils.h +++ b/src/ir/literal-utils.h @@ -32,18 +32,14 @@ inline Expression* makeFromInt32(int32_t x, Type type, Module& wasm) { } inline Expression* makeZero(Type type, Module& wasm) { - // TODO: Switch to using v128.const once V8 supports it + // TODO: Remove this function once V8 supports v128.const // (https://bugs.chromium.org/p/v8/issues/detail?id=8460) + Builder builder(wasm); if (type == Type::v128) { - Builder builder(wasm); return builder.makeUnary(SplatVecI32x4, builder.makeConst(Literal(int32_t(0)))); } - if (type.isRef()) { - Builder builder(wasm); - return builder.makeRefNull(); - } - return makeFromInt32(0, type, wasm); + return builder.makeConstExpression(Literal::makeZero(type)); } } // namespace LiteralUtils diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 9508acbfc..5051385a2 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -52,7 +52,8 @@ class Flow { public: Flow() : values() {} Flow(Literal value) : values{value} { assert(value.type.isConcrete()); } - Flow(Literals&& values) : values(values) {} + Flow(Literals& values) : values(values) {} + Flow(Literals&& values) : values(std::move(values)) {} Flow(Name breakTo) : values(), breakTo(breakTo) {} Literals values; @@ -69,15 +70,7 @@ public: Expression* getConstExpression(Module& module) { assert(values.size() > 0); Builder builder(module); - if (values.size() == 1) { - return builder.makeConstExpression(getSingleValue()); - } else { - std::vector<Expression*> consts; - for (auto& val : values) { - consts.push_back(builder.makeConstExpression(val)); - } - return builder.makeTupleMake(std::move(consts)); - } + return builder.makeConstExpression(values); } bool breaking() { return breakTo.is(); } @@ -170,7 +163,7 @@ protected: if (flow.breaking()) { return flow; } - NOTE_EVAL1(flow.getSingleValue()); + NOTE_EVAL1(flow.values); arguments.push_back(flow.getSingleValue()); } return Flow(); @@ -242,7 +235,7 @@ public: if (flow.breaking()) { return flow; } - NOTE_EVAL1(flow.getSingleValue()); + NOTE_EVAL1(flow.values); if (flow.getSingleValue().geti32()) { Flow flow = visit(curr->ifTrue); if (!flow.breaking() && !curr->ifFalse) { @@ -1542,7 +1535,7 @@ private: class FunctionScope { public: - std::vector<Literal> locals; + std::vector<Literals> locals; Function* function; FunctionScope(Function* function, const LiteralList& arguments) @@ -1564,10 +1557,10 @@ private: << arguments[i].type << "." << std::endl; WASM_UNREACHABLE("invalid param count"); } - locals[i] = arguments[i]; + locals[i] = {arguments[i]}; } else { assert(function->isVar(i)); - locals[i] = Literal::makeSingleZero(function->getLocalType(i)); + locals[i] = Literal::makeZero(function->getLocalType(i)); } } } @@ -1606,14 +1599,8 @@ private: std::cout << "(returned to " << scope.function->name << ")\n"; #endif // TODO: make this a proper tail call (return first) - // TODO: handle multivalue return_calls if (curr->isReturn) { - Const c; - c.value = ret.getSingleValue(); - c.finalize(); - Return return_; - return_.value = &c; - return this->visit(&return_); + ret.breakTo = RETURN_FLOW; } return ret; } @@ -1633,14 +1620,8 @@ private: Flow ret = instance.externalInterface->callTable( index, curr->sig, arguments, type, *instance.self()); // TODO: make this a proper tail call (return first) - // TODO: handle multivalue return_call_indirects if (curr->isReturn) { - Const c; - c.value = ret.getSingleValue(); - c.finalize(); - Return return_; - return_.value = &c; - return this->visit(&return_); + ret.breakTo = RETURN_FLOW; } return ret; } @@ -1661,10 +1642,9 @@ private: } NOTE_EVAL1(index); NOTE_EVAL1(flow.getSingleValue()); - assert(curr->isTee() - ? Type::isSubType(flow.getSingleValue().type, curr->type) - : true); - scope.locals[index] = flow.getSingleValue(); + assert(curr->isTee() ? Type::isSubType(flow.getType(), curr->type) + : true); + scope.locals[index] = flow.values; return curr->isTee() ? flow : Flow(); } |