Skip to content

Commit

Permalink
[dart2wasm] Support unmodifiable typed data views.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
joshualitt authored and Commit Queue committed Oct 21, 2022
1 parent 27d417d commit a73e8c2
Show file tree
Hide file tree
Showing 4 changed files with 120 additions and 7 deletions.
26 changes: 20 additions & 6 deletions pkg/dart2wasm/lib/intrinsics.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1307,8 +1307,9 @@ class Intrinsifier {
if (member.isFactory) {
String className = member.enclosingClass!.name;

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

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

Expand All @@ -1354,6 +1352,22 @@ class Intrinsifier {
b.struct_new(info.struct);
return true;
}

match = RegExp(
"^_(Int|Uint|Float)(8|16|32|64|32x4|64x2)(Clamped)?ArrayView\$")
.matchAsPrefix(className);
if (match != null ||
member.enclosingClass == translator.byteDataViewClass) {
return _createView();
}

match = RegExp(
"^_Unmodifiable(Int|Uint|Float)(8|16|32|64|32x4|64x2)(Clamped)?ArrayView\$")
.matchAsPrefix(className);
if (match != null ||
member.enclosingClass == translator.unmodifiableByteDataViewClass) {
return _createView();
}
}

// _TypedListBase.length
Expand Down
3 changes: 3 additions & 0 deletions pkg/dart2wasm/lib/translator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ class Translator {
late final Class typedListClass;
late final Class typedListViewClass;
late final Class byteDataViewClass;
late final Class unmodifiableByteDataViewClass;
late final Class typeErrorClass;
late final Class typeUniverseClass;
late final Class symbolClass;
Expand Down Expand Up @@ -249,6 +250,8 @@ class Translator {
typedListClass = lookupTypedData("_TypedList");
typedListViewClass = lookupTypedData("_TypedListView");
byteDataViewClass = lookupTypedData("_ByteDataView");
unmodifiableByteDataViewClass =
lookupTypedData("_UnmodifiableByteDataView");
symbolClass = lookupInternal("Symbol");
wasmFunctionCall =
wasmFunctionClass.procedures.firstWhere((p) => p.name.text == "call");
Expand Down
18 changes: 18 additions & 0 deletions sdk/lib/_internal/vm/lib/typed_data_patch.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4627,6 +4627,7 @@ class _Float64ArrayView extends _TypedListView
}

@pragma("vm:entry-point")
@pragma("wasm:entry-point")
class _Float32x4ArrayView extends _TypedListView
with _Float32x4ListMixin
implements Float32x4List {
Expand Down Expand Up @@ -4666,6 +4667,7 @@ class _Float32x4ArrayView extends _TypedListView
}

@pragma("vm:entry-point")
@pragma("wasm:entry-point")
class _Int32x4ArrayView extends _TypedListView
with _Int32x4ListMixin
implements Int32x4List {
Expand Down Expand Up @@ -4705,6 +4707,7 @@ class _Int32x4ArrayView extends _TypedListView
}

@pragma("vm:entry-point")
@pragma("wasm:entry-point")
class _Float64x2ArrayView extends _TypedListView
with _Float64x2ListMixin
implements Float64x2List {
Expand Down Expand Up @@ -5250,6 +5253,7 @@ abstract class UnmodifiableFloat64ListView implements Float64List {
}

@pragma("vm:entry-point")
@pragma("wasm:entry-point")
class _UnmodifiableInt8ArrayView extends _Int8ArrayView
implements UnmodifiableInt8ListView {
@pragma("vm:recognized", "other")
Expand All @@ -5266,6 +5270,7 @@ class _UnmodifiableInt8ArrayView extends _Int8ArrayView
}

@pragma("vm:entry-point")
@pragma("wasm:entry-point")
class _UnmodifiableUint8ArrayView extends _Uint8ArrayView
implements UnmodifiableUint8ListView {
@pragma("vm:recognized", "other")
Expand All @@ -5282,6 +5287,7 @@ class _UnmodifiableUint8ArrayView extends _Uint8ArrayView
}

@pragma("vm:entry-point")
@pragma("wasm:entry-point")
class _UnmodifiableUint8ClampedArrayView extends _Uint8ClampedArrayView
implements UnmodifiableUint8ClampedListView {
@pragma("vm:recognized", "other")
Expand All @@ -5298,6 +5304,7 @@ class _UnmodifiableUint8ClampedArrayView extends _Uint8ClampedArrayView
}

@pragma("vm:entry-point")
@pragma("wasm:entry-point")
class _UnmodifiableInt16ArrayView extends _Int16ArrayView
implements UnmodifiableInt16ListView {
@pragma("vm:recognized", "other")
Expand All @@ -5314,6 +5321,7 @@ class _UnmodifiableInt16ArrayView extends _Int16ArrayView
}

@pragma("vm:entry-point")
@pragma("wasm:entry-point")
class _UnmodifiableUint16ArrayView extends _Uint16ArrayView
implements UnmodifiableUint16ListView {
@pragma("vm:recognized", "other")
Expand All @@ -5330,6 +5338,7 @@ class _UnmodifiableUint16ArrayView extends _Uint16ArrayView
}

@pragma("vm:entry-point")
@pragma("wasm:entry-point")
class _UnmodifiableInt32ArrayView extends _Int32ArrayView
implements UnmodifiableInt32ListView {
@pragma("vm:recognized", "other")
Expand All @@ -5346,6 +5355,7 @@ class _UnmodifiableInt32ArrayView extends _Int32ArrayView
}

@pragma("vm:entry-point")
@pragma("wasm:entry-point")
class _UnmodifiableUint32ArrayView extends _Uint32ArrayView
implements UnmodifiableUint32ListView {
@pragma("vm:recognized", "other")
Expand All @@ -5362,6 +5372,7 @@ class _UnmodifiableUint32ArrayView extends _Uint32ArrayView
}

@pragma("vm:entry-point")
@pragma("wasm:entry-point")
class _UnmodifiableInt64ArrayView extends _Int64ArrayView
implements UnmodifiableInt64ListView {
@pragma("vm:recognized", "other")
Expand All @@ -5378,6 +5389,7 @@ class _UnmodifiableInt64ArrayView extends _Int64ArrayView
}

@pragma("vm:entry-point")
@pragma("wasm:entry-point")
class _UnmodifiableUint64ArrayView extends _Uint64ArrayView
implements UnmodifiableUint64ListView {
@pragma("vm:recognized", "other")
Expand All @@ -5394,6 +5406,7 @@ class _UnmodifiableUint64ArrayView extends _Uint64ArrayView
}

@pragma("vm:entry-point")
@pragma("wasm:entry-point")
class _UnmodifiableFloat32ArrayView extends _Float32ArrayView
implements UnmodifiableFloat32ListView {
@pragma("vm:recognized", "other")
Expand All @@ -5410,6 +5423,7 @@ class _UnmodifiableFloat32ArrayView extends _Float32ArrayView
}

@pragma("vm:entry-point")
@pragma("wasm:entry-point")
class _UnmodifiableFloat64ArrayView extends _Float64ArrayView
implements UnmodifiableFloat64ListView {
@pragma("vm:recognized", "other")
Expand All @@ -5426,6 +5440,7 @@ class _UnmodifiableFloat64ArrayView extends _Float64ArrayView
}

@pragma("vm:entry-point")
@pragma("wasm:entry-point")
class _UnmodifiableFloat32x4ArrayView extends _Float32x4ArrayView
implements UnmodifiableFloat32x4ListView {
@pragma("vm:recognized", "other")
Expand All @@ -5442,6 +5457,7 @@ class _UnmodifiableFloat32x4ArrayView extends _Float32x4ArrayView
}

@pragma("vm:entry-point")
@pragma("wasm:entry-point")
class _UnmodifiableInt32x4ArrayView extends _Int32x4ArrayView
implements UnmodifiableInt32x4ListView {
@pragma("vm:recognized", "other")
Expand All @@ -5458,6 +5474,7 @@ class _UnmodifiableInt32x4ArrayView extends _Int32x4ArrayView
}

@pragma("vm:entry-point")
@pragma("wasm:entry-point")
class _UnmodifiableFloat64x2ArrayView extends _Float64x2ArrayView
implements UnmodifiableFloat64x2ListView {
@pragma("vm:recognized", "other")
Expand All @@ -5474,6 +5491,7 @@ class _UnmodifiableFloat64x2ArrayView extends _Float64x2ArrayView
}

@pragma("vm:entry-point")
@pragma("wasm:entry-point")
class _UnmodifiableByteDataView extends _ByteDataView
implements UnmodifiableByteDataView {
@pragma("vm:recognized", "other")
Expand Down
80 changes: 79 additions & 1 deletion sdk/lib/_internal/wasm/lib/simd_patch.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.

import 'dart:collection' show ListMixin;
import 'dart:_internal' show patch, FixedLengthListMixin;
import 'dart:_internal' show patch, FixedLengthListMixin, unsafeCast;
import 'dart:math' as math;

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

@patch
abstract class UnmodifiableInt32x4ListView implements Int32x4List {
factory UnmodifiableInt32x4ListView(Int32x4List list) =>
new _UnmodifiableInt32x4ArrayView._(
unsafeCast<_TypedList>(unsafeCast<_NaiveInt32x4List>(list)._storage),
list.offsetInBytes,
list.length);
}

@patch
abstract class UnmodifiableFloat32x4ListView implements Float32x4List {
factory UnmodifiableFloat32x4ListView(Float32x4List list) =>
new _UnmodifiableFloat32x4ArrayView._(
unsafeCast<_TypedList>(
unsafeCast<_NaiveFloat32x4List>(list)._storage),
list.offsetInBytes,
list.length);
}

@patch
abstract class UnmodifiableFloat64x2ListView implements Float64x2List {
factory UnmodifiableFloat64x2ListView(Float64x2List list) =>
new _UnmodifiableFloat64x2ArrayView._(
unsafeCast<_TypedList>(
unsafeCast<_NaiveFloat64x2List>(list)._storage),
list.offsetInBytes,
list.length);
}

@patch
class Int32x4 {
@patch
Expand Down Expand Up @@ -834,6 +863,55 @@ class _NaiveInt32x4 implements Int32x4 {
}
}

@patch
abstract class _TypedList extends _TypedListBase {
Float32x4 _getFloat32x4(int offsetInBytes) {
ByteData data = buffer.asByteData();
return Float32x4(
data.getFloat32(offsetInBytes + 0 * 4, Endian.host),
data.getFloat32(offsetInBytes + 1 * 4, Endian.host),
data.getFloat32(offsetInBytes + 2 * 4, Endian.host),
data.getFloat32(offsetInBytes + 3 * 4, Endian.host));
}

void _setFloat32x4(int offsetInBytes, Float32x4 value) {
ByteData data = buffer.asByteData();
data.setFloat32(offsetInBytes + 0 * 4, value.x, Endian.host);
data.setFloat32(offsetInBytes + 1 * 4, value.y, Endian.host);
data.setFloat32(offsetInBytes + 2 * 4, value.z, Endian.host);
data.setFloat32(offsetInBytes + 3 * 4, value.w, Endian.host);
}

Int32x4 _getInt32x4(int offsetInBytes) {
ByteData data = buffer.asByteData();
return Int32x4(
data.getInt32(offsetInBytes + 0 * 4, Endian.host),
data.getInt32(offsetInBytes + 1 * 4, Endian.host),
data.getInt32(offsetInBytes + 2 * 4, Endian.host),
data.getInt32(offsetInBytes + 3 * 4, Endian.host));
}

void _setInt32x4(int offsetInBytes, Int32x4 value) {
ByteData data = buffer.asByteData();
data.setInt32(offsetInBytes + 0 * 4, value.x, Endian.host);
data.setInt32(offsetInBytes + 1 * 4, value.y, Endian.host);
data.setInt32(offsetInBytes + 2 * 4, value.z, Endian.host);
data.setInt32(offsetInBytes + 3 * 4, value.w, Endian.host);
}

Float64x2 _getFloat64x2(int offsetInBytes) {
ByteData data = buffer.asByteData();
return Float64x2(data.getFloat64(offsetInBytes + 0 * 8, Endian.host),
data.getFloat64(offsetInBytes + 1 * 8, Endian.host));
}

void _setFloat64x2(int offsetInBytes, Float64x2 value) {
ByteData data = buffer.asByteData();
data.setFloat64(offsetInBytes + 0 * 8, value.x, Endian.host);
data.setFloat64(offsetInBytes + 1 * 8, value.y, Endian.host);
}
}

int _checkValidRange(int start, int? end, int length) {
if (start > length) {
throw RangeError.range(start, 0, length, 'checkValidRange');
Expand Down

0 comments on commit a73e8c2

Please sign in to comment.