[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>
This commit is contained in:
Joshua Litt
2022-10-21 17:28:35 +00:00
committed by Commit Queue
parent 27d417dc09
commit a73e8c2cf2
4 changed files with 120 additions and 7 deletions
+20 -6
View File
@@ -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
+3
View File
@@ -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");
@@ -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")
+79 -1
View File
@@ -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');