summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2023-02-03 12:32:25 -0800
committerGitHub <noreply@github.com>2023-02-03 12:32:25 -0800
commit90c726a606cf8f99307a41d8f889de4e1221c4f8 (patch)
tree8dcecebb36a2aa437a8abbebd8e225aeb4a516cb /src
parent42b859f01df94dfffb01258b2305df8ec4d05304 (diff)
downloadbinaryen-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.inc10
-rw-r--r--src/passes/Print.cpp3
-rw-r--r--src/wasm-binary.h1
-rw-r--r--src/wasm.h1
-rw-r--r--src/wasm/wasm-binary.cpp2
-rw-r--r--src/wasm/wasm-stack.cpp3
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*");
}