diff options
Diffstat (limited to 'src/wasm')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 9 | ||||
-rw-r--r-- | src/wasm/wasm-s-parser.cpp | 6 | ||||
-rw-r--r-- | src/wasm/wasm-stack.cpp | 12 | ||||
-rw-r--r-- | src/wasm/wat-parser.cpp | 5 |
4 files changed, 24 insertions, 8 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index abd51fcef..65734e68d 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -7345,12 +7345,17 @@ bool WasmBinaryBuilder::maybeVisitStringConcat(Expression*& out, } bool WasmBinaryBuilder::maybeVisitStringEq(Expression*& out, uint32_t code) { - if (code != BinaryConsts::StringEq) { + StringEqOp op; + if (code == BinaryConsts::StringEq) { + op = StringEqEqual; + } else if (code == BinaryConsts::StringCompare) { + op = StringEqCompare; + } else { return false; } auto* right = popNonVoidExpression(); auto* left = popNonVoidExpression(); - out = Builder(wasm).makeStringEq(left, right); + out = Builder(wasm).makeStringEq(op, left, right); return true; } diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp index 0c413af2a..829025a2c 100644 --- a/src/wasm/wasm-s-parser.cpp +++ b/src/wasm/wasm-s-parser.cpp @@ -3090,9 +3090,9 @@ Expression* SExpressionWasmBuilder::makeStringConcat(Element& s) { parseExpression(s[2])); } -Expression* SExpressionWasmBuilder::makeStringEq(Element& s) { - return Builder(wasm).makeStringEq(parseExpression(s[1]), - parseExpression(s[2])); +Expression* SExpressionWasmBuilder::makeStringEq(Element& s, StringEqOp op) { + return Builder(wasm).makeStringEq( + op, parseExpression(s[1]), parseExpression(s[2])); } Expression* SExpressionWasmBuilder::makeStringAs(Element& s, StringAsOp op) { diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp index 35ef12993..1f5722b59 100644 --- a/src/wasm/wasm-stack.cpp +++ b/src/wasm/wasm-stack.cpp @@ -2370,7 +2370,17 @@ void BinaryInstWriter::visitStringConcat(StringConcat* curr) { } void BinaryInstWriter::visitStringEq(StringEq* curr) { - o << int8_t(BinaryConsts::GCPrefix) << U32LEB(BinaryConsts::StringEq); + o << int8_t(BinaryConsts::GCPrefix); + switch (curr->op) { + case StringEqEqual: + o << U32LEB(BinaryConsts::StringEq); + break; + case StringEqCompare: + o << U32LEB(BinaryConsts::StringCompare); + break; + default: + WASM_UNREACHABLE("invalid string.eq*"); + } } void BinaryInstWriter::visitStringAs(StringAs* curr) { diff --git a/src/wasm/wat-parser.cpp b/src/wasm/wat-parser.cpp index 66bba8862..dfc2190f3 100644 --- a/src/wasm/wat-parser.cpp +++ b/src/wasm/wat-parser.cpp @@ -2383,7 +2383,8 @@ template<typename Ctx> Result<typename Ctx::InstrT> makeStringEncode(Ctx&, Index, StringEncodeOp op); template<typename Ctx> Result<typename Ctx::InstrT> makeStringConcat(Ctx&, Index); -template<typename Ctx> Result<typename Ctx::InstrT> makeStringEq(Ctx&, Index); +template<typename Ctx> +Result<typename Ctx::InstrT> makeStringEq(Ctx&, Index, StringEqOp); template<typename Ctx> Result<typename Ctx::InstrT> makeStringAs(Ctx&, Index, StringAsOp op); template<typename Ctx> @@ -3589,7 +3590,7 @@ Result<typename Ctx::InstrT> makeStringConcat(Ctx& ctx, Index pos) { } template<typename Ctx> -Result<typename Ctx::InstrT> makeStringEq(Ctx& ctx, Index pos) { +Result<typename Ctx::InstrT> makeStringEq(Ctx& ctx, Index pos, StringEqOp op) { return ctx.in.err("unimplemented instruction"); } |