Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(531)

Unified Diff: runtime/vm/raw_object_snapshot.cc

Issue 12303013: Simd128Float32, Simd128Mask, and Simd128Float32List additions for dart:scalarlist (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/vm/raw_object_snapshot.cc
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 2b4011d4e5579eb88ffb04877370f02edd8d125b..a87db86b8861800d463fc4c463eb96a2d57b8459 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -2045,6 +2045,101 @@ void RawGrowableObjectArray::WriteTo(SnapshotWriter* writer,
}
+RawSimd128Float32* Simd128Float32::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind) {
+ ASSERT(reader != NULL);
+ // Read the values.
+ float value0 = reader->Read<float>();
+ float value1 = reader->Read<float>();
+ float value2 = reader->Read<float>();
+ float value3 = reader->Read<float>();
+
+ // Create a Simd128Float32 object.
+ Simd128Float32& simd = Simd128Float32::ZoneHandle(reader->isolate(),
+ Simd128Float32::null());
+ if (kind == Snapshot::kFull) {
+ simd = reader->NewSimd128Float32(value0, value1, value2, value3);
+ } else {
+ simd = Simd128Float32::New(value0, value1, value2, value3,
+ HEAP_SPACE(kind));
+ }
+ reader->AddBackRef(object_id, &simd, kIsDeserialized);
+ // Set the object tags.
+ simd.set_tags(tags);
+ return simd.raw();
+}
+
+
+void RawSimd128Float32::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind) {
+ ASSERT(writer != NULL);
+
+ // Write out the serialization header value for this object.
+ writer->WriteInlinedObjectHeader(object_id);
+
+ // Write out the class and tags information.
+ writer->WriteIndexedObject(kSimd128Float32Cid);
+ writer->WriteIntptrValue(writer->GetObjectTags(this));
+
+ // Write out the float values.
+ writer->Write<float>(ptr()->value_[0]);
+ writer->Write<float>(ptr()->value_[1]);
+ writer->Write<float>(ptr()->value_[2]);
+ writer->Write<float>(ptr()->value_[3]);
+}
+
+
+RawSimd128Mask* Simd128Mask::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind) {
+ ASSERT(reader != NULL);
+ // Read the values.
+ uint32_t value0 = reader->Read<uint32_t>();
+ uint32_t value1 = reader->Read<uint32_t>();
+ uint32_t value2 = reader->Read<uint32_t>();
+ uint32_t value3 = reader->Read<uint32_t>();
+
+ // Create a Simd128Float32 object.
+ Simd128Mask& simd = Simd128Mask::ZoneHandle(reader->isolate(),
+ Simd128Mask::null());
+
+ if (kind == Snapshot::kFull) {
+ simd = reader->NewSimd128Mask(value0, value1, value2, value3);
+ } else {
+ simd = Simd128Mask::New(value0, value1, value2, value3,
+ HEAP_SPACE(kind));
+ }
+ reader->AddBackRef(object_id, &simd, kIsDeserialized);
+ // Set the object tags.
+ simd.set_tags(tags);
+ return simd.raw();
+}
+
+
+void RawSimd128Mask::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind) {
+ ASSERT(writer != NULL);
+
+ // Write out the serialization header value for this object.
+ writer->WriteInlinedObjectHeader(object_id);
+
+ // Write out the class and tags information.
+ writer->WriteIndexedObject(kSimd128MaskCid);
+ writer->WriteIntptrValue(writer->GetObjectTags(this));
+
+ // Write out the mask values.
+ writer->Write<uint32_t>(ptr()->value_[0]);
+ writer->Write<uint32_t>(ptr()->value_[1]);
+ writer->Write<uint32_t>(ptr()->value_[2]);
+ writer->Write<uint32_t>(ptr()->value_[3]);
+}
+
+
RawByteArray* ByteArray::ReadFrom(SnapshotReader* reader,
intptr_t object_id,
intptr_t tags,
@@ -2106,6 +2201,32 @@ Raw##name##Array* name##Array::ReadFrom(SnapshotReader* reader, \
BYTEARRAY_TYPE_LIST(BYTEARRAY_READ_FROM)
#undef BYTEARRAY_READ_FROM
+RawSimd128Float32Array* Simd128Float32Array::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind) {
+ ASSERT(reader != NULL);
+
+ intptr_t len = reader->ReadSmiValue();
+ Simd128Float32Array& result = Simd128Float32Array::ZoneHandle(
+ reader->isolate(), Simd128Float32Array::New(len, HEAP_SPACE(kind)));
+ reader->AddBackRef(object_id, &result, kIsDeserialized);
+
+ // Set the object tags.
+ result.set_tags(tags);
+
+ // Setup the array elements.
+ float v[4];
+ for (intptr_t i = 0; i < len; ++i) {
+ v[0] = reader->Read<float>();
+ v[1] = reader->Read<float>();
+ v[2] = reader->Read<float>();
+ v[3] = reader->Read<float>();
+ result.SetAt(i, simd_value_safe_load(&v[0]));
+ }
+ return result.raw();
+}
+
#define EXTERNALARRAY_READ_FROM(name, lname, type) \
RawExternal##name##Array* External##name##Array::ReadFrom( \
@@ -2126,8 +2247,8 @@ RawExternal##name##Array* External##name##Array::ReadFrom( \
return obj.raw(); \
} \
-
BYTEARRAY_TYPE_LIST(EXTERNALARRAY_READ_FROM)
+EXTERNALARRAY_READ_FROM(Simd128Float32, simd128float32, simd_value_t)
#undef EXTERNALARRAY_READ_FROM
@@ -2183,6 +2304,28 @@ void Raw##name##Array::WriteTo(SnapshotWriter* writer, \
BYTEARRAY_TYPE_LIST(BYTEARRAY_WRITE_TO)
#undef BYTEARRAY_WRITE_TO
+void RawSimd128Float32Array::WriteTo(SnapshotWriter* writer, intptr_t object_id,
+ Snapshot::Kind kind) {
+ ASSERT(writer != NULL);
+ RawSmi* length = ptr()->length_;
+ float* data = reinterpret_cast<float*>(&ptr()->data_[0]);
+
+ // Write out the serialization header value for this object.
+ writer->WriteInlinedObjectHeader(object_id);
+
+ // Write out the class and tags information.
+ writer->WriteIndexedObject(kSimd128Float32ArrayCid);
+ writer->WriteIntptrValue(writer->GetObjectTags(this));
+
+ // Write out the length field.
+ writer->Write<RawObject*>(length);
+
+ // Write out the array elements as floats.
+ intptr_t len = Smi::Value(length)*4;
+ for (intptr_t i = 0; i < len; i++) {
+ writer->Write(data[i]);
+ }
+}
#define EXTERNALARRAY_WRITE_TO(name, lname, type) \
void RawExternal##name##Array::WriteTo(SnapshotWriter* writer, \
@@ -2200,6 +2343,30 @@ void RawExternal##name##Array::WriteTo(SnapshotWriter* writer, \
BYTEARRAY_TYPE_LIST(EXTERNALARRAY_WRITE_TO)
#undef BYTEARRAY_WRITE_TO
+void RawExternalSimd128Float32Array::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind) {
+ ASSERT(writer != NULL);
+ RawSmi* length = ptr()->length_;
+ float* data = reinterpret_cast<float*>(&ptr()->data_[0]);
+
+ // Write out the serialization header value for this object.
+ writer->WriteInlinedObjectHeader(object_id);
+
+ // Write out the class and tags information.
+ writer->WriteIndexedObject(kExternalSimd128Float32ArrayCid);
+ writer->WriteIntptrValue(writer->GetObjectTags(this));
+
+ // Write out the length field.
+ writer->Write<RawObject*>(length);
+
+ // Write out the array elements as floats.
+ intptr_t len = Smi::Value(length)*4;
+ for (intptr_t i = 0; i < len; i++) {
+ writer->Write(data[i]);
+ }
+}
+
#undef BYTEARRAY_TYPE_LIST

Powered by Google App Engine
This is Rietveld 408576698