Skip to content

Commit a73e8c2

Browse files
joshualittCommit Queue
authored andcommitted
[dart2wasm] Support unmodifiable typed data views.
Also wires up a couple of missing APIs for some of the simd lists. Change-Id: I9da5be59bc3b4553cb27c570f9d7c0b98b10409b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/264890 Reviewed-by: Ömer Ağacan <omersa@google.com> Commit-Queue: Joshua Litt <joshualitt@google.com>
1 parent 27d417d commit a73e8c2

File tree

4 files changed

+120
-7
lines changed

4 files changed

+120
-7
lines changed

pkg/dart2wasm/lib/intrinsics.dart

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1307,8 +1307,9 @@ class Intrinsifier {
13071307
if (member.isFactory) {
13081308
String className = member.enclosingClass!.name;
13091309

1310-
Match? match = RegExp("^(Int|Uint|Float)(8|16|32|64)(Clamped)?List\$")
1311-
.matchAsPrefix(className);
1310+
Match? match =
1311+
RegExp("^(Int|Uint|Float)(8|16|32|64|32x4|64x2)(Clamped)?List\$")
1312+
.matchAsPrefix(className);
13121313
if (match != null) {
13131314
int shift = int.parse(match.group(2)!).bitLength - 4;
13141315
Class cls = member.enclosingLibrary.classes
@@ -1334,10 +1335,7 @@ class Intrinsifier {
13341335
return true;
13351336
}
13361337

1337-
match = RegExp("^_(Int|Uint|Float)(8|16|32|64)(Clamped)?ArrayView\$")
1338-
.matchAsPrefix(className);
1339-
if (match != null ||
1340-
member.enclosingClass == translator.byteDataViewClass) {
1338+
bool _createView() {
13411339
ClassInfo info = translator.classInfo[member.enclosingClass]!;
13421340
translator.functions.allocateClass(info.classId);
13431341

@@ -1354,6 +1352,22 @@ class Intrinsifier {
13541352
b.struct_new(info.struct);
13551353
return true;
13561354
}
1355+
1356+
match = RegExp(
1357+
"^_(Int|Uint|Float)(8|16|32|64|32x4|64x2)(Clamped)?ArrayView\$")
1358+
.matchAsPrefix(className);
1359+
if (match != null ||
1360+
member.enclosingClass == translator.byteDataViewClass) {
1361+
return _createView();
1362+
}
1363+
1364+
match = RegExp(
1365+
"^_Unmodifiable(Int|Uint|Float)(8|16|32|64|32x4|64x2)(Clamped)?ArrayView\$")
1366+
.matchAsPrefix(className);
1367+
if (match != null ||
1368+
member.enclosingClass == translator.unmodifiableByteDataViewClass) {
1369+
return _createView();
1370+
}
13571371
}
13581372

13591373
// _TypedListBase.length

pkg/dart2wasm/lib/translator.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ class Translator {
105105
late final Class typedListClass;
106106
late final Class typedListViewClass;
107107
late final Class byteDataViewClass;
108+
late final Class unmodifiableByteDataViewClass;
108109
late final Class typeErrorClass;
109110
late final Class typeUniverseClass;
110111
late final Class symbolClass;
@@ -249,6 +250,8 @@ class Translator {
249250
typedListClass = lookupTypedData("_TypedList");
250251
typedListViewClass = lookupTypedData("_TypedListView");
251252
byteDataViewClass = lookupTypedData("_ByteDataView");
253+
unmodifiableByteDataViewClass =
254+
lookupTypedData("_UnmodifiableByteDataView");
252255
symbolClass = lookupInternal("Symbol");
253256
wasmFunctionCall =
254257
wasmFunctionClass.procedures.firstWhere((p) => p.name.text == "call");

sdk/lib/_internal/vm/lib/typed_data_patch.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4627,6 +4627,7 @@ class _Float64ArrayView extends _TypedListView
46274627
}
46284628

46294629
@pragma("vm:entry-point")
4630+
@pragma("wasm:entry-point")
46304631
class _Float32x4ArrayView extends _TypedListView
46314632
with _Float32x4ListMixin
46324633
implements Float32x4List {
@@ -4666,6 +4667,7 @@ class _Float32x4ArrayView extends _TypedListView
46664667
}
46674668

46684669
@pragma("vm:entry-point")
4670+
@pragma("wasm:entry-point")
46694671
class _Int32x4ArrayView extends _TypedListView
46704672
with _Int32x4ListMixin
46714673
implements Int32x4List {
@@ -4705,6 +4707,7 @@ class _Int32x4ArrayView extends _TypedListView
47054707
}
47064708

47074709
@pragma("vm:entry-point")
4710+
@pragma("wasm:entry-point")
47084711
class _Float64x2ArrayView extends _TypedListView
47094712
with _Float64x2ListMixin
47104713
implements Float64x2List {
@@ -5250,6 +5253,7 @@ abstract class UnmodifiableFloat64ListView implements Float64List {
52505253
}
52515254

52525255
@pragma("vm:entry-point")
5256+
@pragma("wasm:entry-point")
52535257
class _UnmodifiableInt8ArrayView extends _Int8ArrayView
52545258
implements UnmodifiableInt8ListView {
52555259
@pragma("vm:recognized", "other")
@@ -5266,6 +5270,7 @@ class _UnmodifiableInt8ArrayView extends _Int8ArrayView
52665270
}
52675271

52685272
@pragma("vm:entry-point")
5273+
@pragma("wasm:entry-point")
52695274
class _UnmodifiableUint8ArrayView extends _Uint8ArrayView
52705275
implements UnmodifiableUint8ListView {
52715276
@pragma("vm:recognized", "other")
@@ -5282,6 +5287,7 @@ class _UnmodifiableUint8ArrayView extends _Uint8ArrayView
52825287
}
52835288

52845289
@pragma("vm:entry-point")
5290+
@pragma("wasm:entry-point")
52855291
class _UnmodifiableUint8ClampedArrayView extends _Uint8ClampedArrayView
52865292
implements UnmodifiableUint8ClampedListView {
52875293
@pragma("vm:recognized", "other")
@@ -5298,6 +5304,7 @@ class _UnmodifiableUint8ClampedArrayView extends _Uint8ClampedArrayView
52985304
}
52995305

53005306
@pragma("vm:entry-point")
5307+
@pragma("wasm:entry-point")
53015308
class _UnmodifiableInt16ArrayView extends _Int16ArrayView
53025309
implements UnmodifiableInt16ListView {
53035310
@pragma("vm:recognized", "other")
@@ -5314,6 +5321,7 @@ class _UnmodifiableInt16ArrayView extends _Int16ArrayView
53145321
}
53155322

53165323
@pragma("vm:entry-point")
5324+
@pragma("wasm:entry-point")
53175325
class _UnmodifiableUint16ArrayView extends _Uint16ArrayView
53185326
implements UnmodifiableUint16ListView {
53195327
@pragma("vm:recognized", "other")
@@ -5330,6 +5338,7 @@ class _UnmodifiableUint16ArrayView extends _Uint16ArrayView
53305338
}
53315339

53325340
@pragma("vm:entry-point")
5341+
@pragma("wasm:entry-point")
53335342
class _UnmodifiableInt32ArrayView extends _Int32ArrayView
53345343
implements UnmodifiableInt32ListView {
53355344
@pragma("vm:recognized", "other")
@@ -5346,6 +5355,7 @@ class _UnmodifiableInt32ArrayView extends _Int32ArrayView
53465355
}
53475356

53485357
@pragma("vm:entry-point")
5358+
@pragma("wasm:entry-point")
53495359
class _UnmodifiableUint32ArrayView extends _Uint32ArrayView
53505360
implements UnmodifiableUint32ListView {
53515361
@pragma("vm:recognized", "other")
@@ -5362,6 +5372,7 @@ class _UnmodifiableUint32ArrayView extends _Uint32ArrayView
53625372
}
53635373

53645374
@pragma("vm:entry-point")
5375+
@pragma("wasm:entry-point")
53655376
class _UnmodifiableInt64ArrayView extends _Int64ArrayView
53665377
implements UnmodifiableInt64ListView {
53675378
@pragma("vm:recognized", "other")
@@ -5378,6 +5389,7 @@ class _UnmodifiableInt64ArrayView extends _Int64ArrayView
53785389
}
53795390

53805391
@pragma("vm:entry-point")
5392+
@pragma("wasm:entry-point")
53815393
class _UnmodifiableUint64ArrayView extends _Uint64ArrayView
53825394
implements UnmodifiableUint64ListView {
53835395
@pragma("vm:recognized", "other")
@@ -5394,6 +5406,7 @@ class _UnmodifiableUint64ArrayView extends _Uint64ArrayView
53945406
}
53955407

53965408
@pragma("vm:entry-point")
5409+
@pragma("wasm:entry-point")
53975410
class _UnmodifiableFloat32ArrayView extends _Float32ArrayView
53985411
implements UnmodifiableFloat32ListView {
53995412
@pragma("vm:recognized", "other")
@@ -5410,6 +5423,7 @@ class _UnmodifiableFloat32ArrayView extends _Float32ArrayView
54105423
}
54115424

54125425
@pragma("vm:entry-point")
5426+
@pragma("wasm:entry-point")
54135427
class _UnmodifiableFloat64ArrayView extends _Float64ArrayView
54145428
implements UnmodifiableFloat64ListView {
54155429
@pragma("vm:recognized", "other")
@@ -5426,6 +5440,7 @@ class _UnmodifiableFloat64ArrayView extends _Float64ArrayView
54265440
}
54275441

54285442
@pragma("vm:entry-point")
5443+
@pragma("wasm:entry-point")
54295444
class _UnmodifiableFloat32x4ArrayView extends _Float32x4ArrayView
54305445
implements UnmodifiableFloat32x4ListView {
54315446
@pragma("vm:recognized", "other")
@@ -5442,6 +5457,7 @@ class _UnmodifiableFloat32x4ArrayView extends _Float32x4ArrayView
54425457
}
54435458

54445459
@pragma("vm:entry-point")
5460+
@pragma("wasm:entry-point")
54455461
class _UnmodifiableInt32x4ArrayView extends _Int32x4ArrayView
54465462
implements UnmodifiableInt32x4ListView {
54475463
@pragma("vm:recognized", "other")
@@ -5458,6 +5474,7 @@ class _UnmodifiableInt32x4ArrayView extends _Int32x4ArrayView
54585474
}
54595475

54605476
@pragma("vm:entry-point")
5477+
@pragma("wasm:entry-point")
54615478
class _UnmodifiableFloat64x2ArrayView extends _Float64x2ArrayView
54625479
implements UnmodifiableFloat64x2ListView {
54635480
@pragma("vm:recognized", "other")
@@ -5474,6 +5491,7 @@ class _UnmodifiableFloat64x2ArrayView extends _Float64x2ArrayView
54745491
}
54755492

54765493
@pragma("vm:entry-point")
5494+
@pragma("wasm:entry-point")
54775495
class _UnmodifiableByteDataView extends _ByteDataView
54785496
implements UnmodifiableByteDataView {
54795497
@pragma("vm:recognized", "other")

sdk/lib/_internal/wasm/lib/simd_patch.dart

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'dart:collection' show ListMixin;
6-
import 'dart:_internal' show patch, FixedLengthListMixin;
6+
import 'dart:_internal' show patch, FixedLengthListMixin, unsafeCast;
77
import 'dart:math' as math;
88

99
// These are naive patches for SIMD typed data which we can use until Wasm
@@ -40,6 +40,35 @@ class Float64x2List {
4040
_NaiveFloat64x2List.fromList;
4141
}
4242

43+
@patch
44+
abstract class UnmodifiableInt32x4ListView implements Int32x4List {
45+
factory UnmodifiableInt32x4ListView(Int32x4List list) =>
46+
new _UnmodifiableInt32x4ArrayView._(
47+
unsafeCast<_TypedList>(unsafeCast<_NaiveInt32x4List>(list)._storage),
48+
list.offsetInBytes,
49+
list.length);
50+
}
51+
52+
@patch
53+
abstract class UnmodifiableFloat32x4ListView implements Float32x4List {
54+
factory UnmodifiableFloat32x4ListView(Float32x4List list) =>
55+
new _UnmodifiableFloat32x4ArrayView._(
56+
unsafeCast<_TypedList>(
57+
unsafeCast<_NaiveFloat32x4List>(list)._storage),
58+
list.offsetInBytes,
59+
list.length);
60+
}
61+
62+
@patch
63+
abstract class UnmodifiableFloat64x2ListView implements Float64x2List {
64+
factory UnmodifiableFloat64x2ListView(Float64x2List list) =>
65+
new _UnmodifiableFloat64x2ArrayView._(
66+
unsafeCast<_TypedList>(
67+
unsafeCast<_NaiveFloat64x2List>(list)._storage),
68+
list.offsetInBytes,
69+
list.length);
70+
}
71+
4372
@patch
4473
class Int32x4 {
4574
@patch
@@ -834,6 +863,55 @@ class _NaiveInt32x4 implements Int32x4 {
834863
}
835864
}
836865

866+
@patch
867+
abstract class _TypedList extends _TypedListBase {
868+
Float32x4 _getFloat32x4(int offsetInBytes) {
869+
ByteData data = buffer.asByteData();
870+
return Float32x4(
871+
data.getFloat32(offsetInBytes + 0 * 4, Endian.host),
872+
data.getFloat32(offsetInBytes + 1 * 4, Endian.host),
873+
data.getFloat32(offsetInBytes + 2 * 4, Endian.host),
874+
data.getFloat32(offsetInBytes + 3 * 4, Endian.host));
875+
}
876+
877+
void _setFloat32x4(int offsetInBytes, Float32x4 value) {
878+
ByteData data = buffer.asByteData();
879+
data.setFloat32(offsetInBytes + 0 * 4, value.x, Endian.host);
880+
data.setFloat32(offsetInBytes + 1 * 4, value.y, Endian.host);
881+
data.setFloat32(offsetInBytes + 2 * 4, value.z, Endian.host);
882+
data.setFloat32(offsetInBytes + 3 * 4, value.w, Endian.host);
883+
}
884+
885+
Int32x4 _getInt32x4(int offsetInBytes) {
886+
ByteData data = buffer.asByteData();
887+
return Int32x4(
888+
data.getInt32(offsetInBytes + 0 * 4, Endian.host),
889+
data.getInt32(offsetInBytes + 1 * 4, Endian.host),
890+
data.getInt32(offsetInBytes + 2 * 4, Endian.host),
891+
data.getInt32(offsetInBytes + 3 * 4, Endian.host));
892+
}
893+
894+
void _setInt32x4(int offsetInBytes, Int32x4 value) {
895+
ByteData data = buffer.asByteData();
896+
data.setInt32(offsetInBytes + 0 * 4, value.x, Endian.host);
897+
data.setInt32(offsetInBytes + 1 * 4, value.y, Endian.host);
898+
data.setInt32(offsetInBytes + 2 * 4, value.z, Endian.host);
899+
data.setInt32(offsetInBytes + 3 * 4, value.w, Endian.host);
900+
}
901+
902+
Float64x2 _getFloat64x2(int offsetInBytes) {
903+
ByteData data = buffer.asByteData();
904+
return Float64x2(data.getFloat64(offsetInBytes + 0 * 8, Endian.host),
905+
data.getFloat64(offsetInBytes + 1 * 8, Endian.host));
906+
}
907+
908+
void _setFloat64x2(int offsetInBytes, Float64x2 value) {
909+
ByteData data = buffer.asByteData();
910+
data.setFloat64(offsetInBytes + 0 * 8, value.x, Endian.host);
911+
data.setFloat64(offsetInBytes + 1 * 8, value.y, Endian.host);
912+
}
913+
}
914+
837915
int _checkValidRange(int start, int? end, int length) {
838916
if (start > length) {
839917
throw RangeError.range(start, 0, length, 'checkValidRange');

0 commit comments

Comments
 (0)