Skip to content

Commit 8366df7

Browse files
wingoV8 LUCI CQ
authored andcommitted
[stringrefs] Fold wtf8 policy into instruction set
Instead of having e.g. `string.new_wtf8` that takes an immediate specifying the particular UTF-8 flavor to parse, make one instruction per flavor. See WebAssembly/stringref#46. Bug: v8:12868 Change-Id: I2e9f2735c557b2352b6e75314037e473710d87a9 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3892695 Reviewed-by: Jakob Kummerow <jkummerow@chromium.org> Commit-Queue: Andy Wingo <wingo@igalia.com> Cr-Commit-Position: refs/heads/main@{#83170}
1 parent 6946d1d commit 8366df7

16 files changed

Lines changed: 433 additions & 451 deletions

src/builtins/wasm.tq

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -808,20 +808,20 @@ transitioning javascript builtin ExperimentalWasmConvertStringToArray(
808808
}
809809

810810
builtin WasmStringNewWtf8(
811-
offset: uint32, size: uint32, memory: Smi, policy: Smi): String {
811+
offset: uint32, size: uint32, memory: Smi, utf8Variant: Smi): String {
812812
const instance = LoadInstanceFromFrame();
813813
tail runtime::WasmStringNewWtf8(
814-
LoadContextFromInstance(instance), instance, memory, policy,
814+
LoadContextFromInstance(instance), instance, memory, utf8Variant,
815815
WasmUint32ToNumber(offset), WasmUint32ToNumber(size));
816816
}
817817
builtin WasmStringNewWtf8Array(
818-
start: uint32, end: uint32, array: WasmArray, policy: Smi): String {
818+
start: uint32, end: uint32, array: WasmArray, utf8Variant: Smi): String {
819819
const context = LoadContextFromFrame();
820820
try {
821821
if (array.length < end) goto OffsetOutOfRange;
822822
if (end < start) goto OffsetOutOfRange;
823823
tail runtime::WasmStringNewWtf8Array(
824-
context, policy, array, SmiFromUint32(start), SmiFromUint32(end));
824+
context, utf8Variant, array, SmiFromUint32(start), SmiFromUint32(end));
825825
} label OffsetOutOfRange deferred {
826826
const error = MessageTemplate::kWasmTrapArrayOutOfBounds;
827827
runtime::ThrowWasmError(context, SmiConstant(error));
@@ -863,18 +863,18 @@ builtin WasmStringMeasureWtf8(string: String): int32 {
863863
return Signed(ChangeNumberToUint32(result));
864864
}
865865
builtin WasmStringEncodeWtf8(
866-
string: String, offset: uint32, memory: Smi, policy: Smi): uint32 {
866+
string: String, offset: uint32, memory: Smi, utf8Variant: Smi): uint32 {
867867
const instance = LoadInstanceFromFrame();
868868
const result = runtime::WasmStringEncodeWtf8(
869-
LoadContextFromInstance(instance), instance, memory, policy, string,
869+
LoadContextFromInstance(instance), instance, memory, utf8Variant, string,
870870
WasmUint32ToNumber(offset));
871871
return ChangeNumberToUint32(result);
872872
}
873873
builtin WasmStringEncodeWtf8Array(
874-
string: String, array: WasmArray, start: uint32, policy: Smi): uint32 {
874+
string: String, array: WasmArray, start: uint32, utf8Variant: Smi): uint32 {
875875
const instance = LoadInstanceFromFrame();
876876
const result = runtime::WasmStringEncodeWtf8Array(
877-
LoadContextFromInstance(instance), policy, string, array,
877+
LoadContextFromInstance(instance), utf8Variant, string, array,
878878
WasmUint32ToNumber(start));
879879
return ChangeNumberToUint32(result);
880880
}
@@ -985,7 +985,7 @@ struct NewPositionAndBytesWritten {
985985
}
986986
builtin WasmStringViewWtf8Encode(
987987
addr: uint32, pos: uint32, bytes: uint32, view: ByteArray, memory: Smi,
988-
policy: Smi): NewPositionAndBytesWritten {
988+
utf8Variant: Smi): NewPositionAndBytesWritten {
989989
const start = WasmStringViewWtf8Advance(view, pos, 0);
990990
const end = WasmStringViewWtf8Advance(view, start, bytes);
991991
const instance = LoadInstanceFromFrame();
@@ -999,7 +999,7 @@ builtin WasmStringViewWtf8Encode(
999999

10001000
// Always call out to run-time, to catch invalid addr.
10011001
runtime::WasmStringViewWtf8Encode(
1002-
context, instance, policy, view, WasmUint32ToNumber(addr),
1002+
context, instance, utf8Variant, view, WasmUint32ToNumber(addr),
10031003
WasmUint32ToNumber(start), WasmUint32ToNumber(end));
10041004

10051005
return NewPositionAndBytesWritten{

src/compiler/wasm-compiler.cc

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5732,19 +5732,19 @@ void WasmGraphBuilder::ArrayCopy(Node* dst_array, Node* dst_index,
57325732
}
57335733

57345734
Node* WasmGraphBuilder::StringNewWtf8(uint32_t memory,
5735-
wasm::StringRefWtf8Policy policy,
5735+
unibrow::Utf8Variant variant,
57365736
Node* offset, Node* size) {
57375737
return gasm_->CallBuiltin(Builtin::kWasmStringNewWtf8, Operator::kNoDeopt,
57385738
offset, size, gasm_->SmiConstant(memory),
5739-
gasm_->SmiConstant(static_cast<int32_t>(policy)));
5739+
gasm_->SmiConstant(static_cast<int32_t>(variant)));
57405740
}
57415741

5742-
Node* WasmGraphBuilder::StringNewWtf8Array(wasm::StringRefWtf8Policy policy,
5742+
Node* WasmGraphBuilder::StringNewWtf8Array(unibrow::Utf8Variant variant,
57435743
Node* array, Node* start,
57445744
Node* end) {
57455745
return gasm_->CallBuiltin(Builtin::kWasmStringNewWtf8Array,
57465746
Operator::kNoDeopt, start, end, array,
5747-
gasm_->SmiConstant(static_cast<int32_t>(policy)));
5747+
gasm_->SmiConstant(static_cast<int32_t>(variant)));
57485748
}
57495749

57505750
Node* WasmGraphBuilder::StringNewWtf16(uint32_t memory, Node* offset,
@@ -5794,7 +5794,7 @@ Node* WasmGraphBuilder::StringMeasureWtf16(Node* string,
57945794
}
57955795

57965796
Node* WasmGraphBuilder::StringEncodeWtf8(uint32_t memory,
5797-
wasm::StringRefWtf8Policy policy,
5797+
unibrow::Utf8Variant variant,
57985798
Node* string, CheckForNull null_check,
57995799
Node* offset,
58005800
wasm::WasmCodePosition position) {
@@ -5803,13 +5803,13 @@ Node* WasmGraphBuilder::StringEncodeWtf8(uint32_t memory,
58035803
}
58045804
return gasm_->CallBuiltin(Builtin::kWasmStringEncodeWtf8, Operator::kNoDeopt,
58055805
string, offset, gasm_->SmiConstant(memory),
5806-
gasm_->SmiConstant(policy));
5806+
gasm_->SmiConstant(static_cast<int32_t>(variant)));
58075807
}
58085808

58095809
Node* WasmGraphBuilder::StringEncodeWtf8Array(
5810-
wasm::StringRefWtf8Policy policy, Node* string,
5811-
CheckForNull string_null_check, Node* array, CheckForNull array_null_check,
5812-
Node* start, wasm::WasmCodePosition position) {
5810+
unibrow::Utf8Variant variant, Node* string, CheckForNull string_null_check,
5811+
Node* array, CheckForNull array_null_check, Node* start,
5812+
wasm::WasmCodePosition position) {
58135813
if (string_null_check == kWithNullCheck) {
58145814
string = AssertNotNull(string, position);
58155815
}
@@ -5818,7 +5818,7 @@ Node* WasmGraphBuilder::StringEncodeWtf8Array(
58185818
}
58195819
return gasm_->CallBuiltin(Builtin::kWasmStringEncodeWtf8Array,
58205820
Operator::kNoDeopt, string, array, start,
5821-
gasm_->SmiConstant(policy));
5821+
gasm_->SmiConstant(static_cast<int32_t>(variant)));
58225822
}
58235823

58245824
Node* WasmGraphBuilder::StringEncodeWtf16(uint32_t memory, Node* string,
@@ -5900,15 +5900,16 @@ Node* WasmGraphBuilder::StringViewWtf8Advance(Node* view,
59005900
}
59015901

59025902
void WasmGraphBuilder::StringViewWtf8Encode(
5903-
uint32_t memory, wasm::StringRefWtf8Policy policy, Node* view,
5903+
uint32_t memory, unibrow::Utf8Variant variant, Node* view,
59045904
CheckForNull null_check, Node* addr, Node* pos, Node* bytes,
59055905
Node** next_pos, Node** bytes_written, wasm::WasmCodePosition position) {
59065906
if (null_check == kWithNullCheck) {
59075907
view = AssertNotNull(view, position);
59085908
}
5909-
Node* pair = gasm_->CallBuiltin(
5910-
Builtin::kWasmStringViewWtf8Encode, Operator::kNoDeopt, addr, pos, bytes,
5911-
view, gasm_->SmiConstant(memory), gasm_->SmiConstant(policy));
5909+
Node* pair =
5910+
gasm_->CallBuiltin(Builtin::kWasmStringViewWtf8Encode, Operator::kNoDeopt,
5911+
addr, pos, bytes, view, gasm_->SmiConstant(memory),
5912+
gasm_->SmiConstant(static_cast<int32_t>(variant)));
59125913
*next_pos = gasm_->Projection(0, pair);
59135914
*bytes_written = gasm_->Projection(1, pair);
59145915
}

src/compiler/wasm-compiler.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -516,9 +516,9 @@ class WasmGraphBuilder {
516516
void BrOnI31(Node* object, Node* rtt, WasmTypeCheckConfig config,
517517
Node** match_control, Node** match_effect,
518518
Node** no_match_control, Node** no_match_effect);
519-
Node* StringNewWtf8(uint32_t memory, wasm::StringRefWtf8Policy policy,
519+
Node* StringNewWtf8(uint32_t memory, unibrow::Utf8Variant variant,
520520
Node* offset, Node* size);
521-
Node* StringNewWtf8Array(wasm::StringRefWtf8Policy policy, Node* array,
521+
Node* StringNewWtf8Array(unibrow::Utf8Variant variant, Node* array,
522522
Node* start, Node* end);
523523
Node* StringNewWtf16(uint32_t memory, Node* offset, Node* size);
524524
Node* StringNewWtf16Array(Node* array, Node* start, Node* end);
@@ -529,10 +529,10 @@ class WasmGraphBuilder {
529529
wasm::WasmCodePosition position);
530530
Node* StringMeasureWtf16(Node* string, CheckForNull null_check,
531531
wasm::WasmCodePosition position);
532-
Node* StringEncodeWtf8(uint32_t memory, wasm::StringRefWtf8Policy policy,
532+
Node* StringEncodeWtf8(uint32_t memory, unibrow::Utf8Variant variant,
533533
Node* string, CheckForNull null_check, Node* offset,
534534
wasm::WasmCodePosition position);
535-
Node* StringEncodeWtf8Array(wasm::StringRefWtf8Policy policy, Node* string,
535+
Node* StringEncodeWtf8Array(unibrow::Utf8Variant variant, Node* string,
536536
CheckForNull string_null_check, Node* array,
537537
CheckForNull array_null_check, Node* start,
538538
wasm::WasmCodePosition position);
@@ -553,7 +553,7 @@ class WasmGraphBuilder {
553553
wasm::WasmCodePosition position);
554554
Node* StringViewWtf8Advance(Node* view, CheckForNull null_check, Node* pos,
555555
Node* bytes, wasm::WasmCodePosition position);
556-
void StringViewWtf8Encode(uint32_t memory, wasm::StringRefWtf8Policy policy,
556+
void StringViewWtf8Encode(uint32_t memory, unibrow::Utf8Variant variant,
557557
Node* view, CheckForNull null_check, Node* addr,
558558
Node* pos, Node* bytes, Node** next_pos,
559559
Node** bytes_written,

0 commit comments

Comments
 (0)