diff --git a/pkg/dart2wasm/lib/intrinsics.dart b/pkg/dart2wasm/lib/intrinsics.dart index 5b231aae90f..be87a15f42f 100644 --- a/pkg/dart2wasm/lib/intrinsics.dart +++ b/pkg/dart2wasm/lib/intrinsics.dart @@ -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 @@ -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); @@ -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 diff --git a/pkg/dart2wasm/lib/translator.dart b/pkg/dart2wasm/lib/translator.dart index 6bb6a63806b..41bfaad2dd9 100644 --- a/pkg/dart2wasm/lib/translator.dart +++ b/pkg/dart2wasm/lib/translator.dart @@ -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; @@ -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"); diff --git a/sdk/lib/_internal/vm/lib/typed_data_patch.dart b/sdk/lib/_internal/vm/lib/typed_data_patch.dart index 08db168c14f..5d33e9596c7 100644 --- a/sdk/lib/_internal/vm/lib/typed_data_patch.dart +++ b/sdk/lib/_internal/vm/lib/typed_data_patch.dart @@ -4627,6 +4627,7 @@ class _Float64ArrayView extends _TypedListView } @pragma("vm:entry-point") +@pragma("wasm:entry-point") class _Float32x4ArrayView extends _TypedListView with _Float32x4ListMixin implements Float32x4List { @@ -4666,6 +4667,7 @@ class _Float32x4ArrayView extends _TypedListView } @pragma("vm:entry-point") +@pragma("wasm:entry-point") class _Int32x4ArrayView extends _TypedListView with _Int32x4ListMixin implements Int32x4List { @@ -4705,6 +4707,7 @@ class _Int32x4ArrayView extends _TypedListView } @pragma("vm:entry-point") +@pragma("wasm:entry-point") class _Float64x2ArrayView extends _TypedListView with _Float64x2ListMixin implements Float64x2List { @@ -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") @@ -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") @@ -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") @@ -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") @@ -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") @@ -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") @@ -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") @@ -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") @@ -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") @@ -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") @@ -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") @@ -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") @@ -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") @@ -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") @@ -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") diff --git a/sdk/lib/_internal/wasm/lib/simd_patch.dart b/sdk/lib/_internal/wasm/lib/simd_patch.dart index 1b3876c30d2..4598e67b688 100644 --- a/sdk/lib/_internal/wasm/lib/simd_patch.dart +++ b/sdk/lib/_internal/wasm/lib/simd_patch.dart @@ -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 @@ -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 @@ -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');