diff options
author | Alon Zakai <azakai@google.com> | 2023-02-03 12:32:25 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-03 12:32:25 -0800 |
commit | 90c726a606cf8f99307a41d8f889de4e1221c4f8 (patch) | |
tree | 8dcecebb36a2aa437a8abbebd8e225aeb4a516cb /src | |
parent | 42b859f01df94dfffb01258b2305df8ec4d05304 (diff) | |
download | binaryen-90c726a606cf8f99307a41d8f889de4e1221c4f8.tar.gz binaryen-90c726a606cf8f99307a41d8f889de4e1221c4f8.tar.bz2 binaryen-90c726a606cf8f99307a41d8f889de4e1221c4f8.zip |
[Strings] Add experimental string.hash instruction (#5480)
See WebAssembly/stringref#60
Diffstat (limited to 'src')
-rw-r--r-- | src/gen-s-parser.inc | 10 | ||||
-rw-r--r-- | src/passes/Print.cpp | 3 | ||||
-rw-r--r-- | src/wasm-binary.h | 1 | ||||
-rw-r--r-- | src/wasm.h | 1 | ||||
-rw-r--r-- | src/wasm/wasm-binary.cpp | 2 | ||||
-rw-r--r-- | src/wasm/wasm-stack.cpp | 3 |
6 files changed, 20 insertions, 0 deletions
diff --git a/src/gen-s-parser.inc b/src/gen-s-parser.inc index 489066284..6bb1ed7dd 100644 --- a/src/gen-s-parser.inc +++ b/src/gen-s-parser.inc @@ -3194,6 +3194,9 @@ switch (buf[0]) { case 'f': if (op == "string.from_code_point"sv) { return makeStringNew(s, StringNewFromCodePoint, false); } goto parse_error; + case 'h': + if (op == "string.hash"sv) { return makeStringMeasure(s, StringMeasureHash); } + goto parse_error; case 'i': if (op == "string.is_usv_sequence"sv) { return makeStringMeasure(s, StringMeasureIsUSV); } goto parse_error; @@ -8931,6 +8934,13 @@ switch (buf[0]) { return *ret; } goto parse_error; + case 'h': + if (op == "string.hash"sv) { + auto ret = makeStringMeasure(ctx, pos, StringMeasureHash); + CHECK_ERR(ret); + return *ret; + } + goto parse_error; case 'i': if (op == "string.is_usv_sequence"sv) { auto ret = makeStringMeasure(ctx, pos, StringMeasureIsUSV); diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp index 8c112d6a5..f7cfb7746 100644 --- a/src/passes/Print.cpp +++ b/src/passes/Print.cpp @@ -2404,6 +2404,9 @@ struct PrintExpressionContents case StringMeasureWTF16View: printMedium(o, "stringview_wtf16.length"); break; + case StringMeasureHash: + printMedium(o, "string.hash"); + break; default: WASM_UNREACHABLE("invalid string.measure*"); } diff --git a/src/wasm-binary.h b/src/wasm-binary.h index a40a96c00..4d9f4f5ae 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -1165,6 +1165,7 @@ enum ASTNodes { StringViewIterSlice = 0xa4, StringCompare = 0xa8, StringFromCodePoint = 0xa9, + StringHash = 0xaa, StringNewWTF8Array = 0xb0, StringNewWTF16Array = 0xb1, StringEncodeWTF8Array = 0xb2, diff --git a/src/wasm.h b/src/wasm.h index 931c560c1..eec68ebd5 100644 --- a/src/wasm.h +++ b/src/wasm.h @@ -596,6 +596,7 @@ enum StringMeasureOp { StringMeasureWTF16, StringMeasureIsUSV, StringMeasureWTF16View, + StringMeasureHash, }; enum StringEncodeOp { diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 431c39631..b616b5a31 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -7286,6 +7286,8 @@ bool WasmBinaryBuilder::maybeVisitStringMeasure(Expression*& out, op = StringMeasureIsUSV; } else if (code == BinaryConsts::StringViewWTF16Length) { op = StringMeasureWTF16View; + } else if (code == BinaryConsts::StringHash) { + op = StringMeasureHash; } else { return false; } diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp index a2fba3907..1c12718ce 100644 --- a/src/wasm/wasm-stack.cpp +++ b/src/wasm/wasm-stack.cpp @@ -2338,6 +2338,9 @@ void BinaryInstWriter::visitStringMeasure(StringMeasure* curr) { case StringMeasureWTF16View: o << U32LEB(BinaryConsts::StringViewWTF16Length); break; + case StringMeasureHash: + o << U32LEB(BinaryConsts::StringHash); + break; default: WASM_UNREACHABLE("invalid string.new*"); } |