@@ -145,7 +145,7 @@ class BaseSerializer : public StackResource {
145145 void WriteWordWith32BitWrites (uword value) {
146146 stream_.WriteWordWith32BitWrites (value);
147147 }
148- void WriteBytes (const uint8_t * addr, intptr_t len) {
148+ void WriteBytes (const void * addr, intptr_t len) {
149149 stream_.WriteBytes (addr, len);
150150 }
151151 void WriteAscii (const String& str) {
@@ -344,7 +344,7 @@ class BaseDeserializer : public ValueObject {
344344 }
345345 intptr_t ReadUnsigned () { return stream_.ReadUnsigned (); }
346346 uword ReadWordWith32BitReads () { return stream_.ReadWordWith32BitReads (); }
347- void ReadBytes (uint8_t * addr, intptr_t len) { stream_.ReadBytes (addr, len); }
347+ void ReadBytes (void * addr, intptr_t len) { stream_.ReadBytes (addr, len); }
348348 const char * ReadAscii () {
349349 intptr_t len = ReadUnsigned ();
350350 const char * result = reinterpret_cast <const char *>(CurrentBufferAddress ());
@@ -1572,8 +1572,7 @@ class TypedDataMessageDeserializationCluster
15721572 d->AssignRef (data.ptr ());
15731573 const intptr_t length_in_bytes = length * element_size;
15741574 NoSafepointScope no_safepoint;
1575- uint8_t * cdata = reinterpret_cast <uint8_t *>(data.untag ()->data ());
1576- d->ReadBytes (cdata, length_in_bytes);
1575+ d->ReadBytes (data.untag ()->data (), length_in_bytes);
15771576 }
15781577 }
15791578
@@ -2066,6 +2065,60 @@ class TransferableTypedDataMessageDeserializationCluster
20662065 }
20672066};
20682067
2068+ class Simd128MessageSerializationCluster : public MessageSerializationCluster {
2069+ public:
2070+ explicit Simd128MessageSerializationCluster (intptr_t cid)
2071+ : MessageSerializationCluster(" Simd128" ,
2072+ MessagePhase::kBeforeTypes ,
2073+ cid) {}
2074+ ~Simd128MessageSerializationCluster () {}
2075+
2076+ void Trace (MessageSerializer* s, Object* object) { objects_.Add (object); }
2077+
2078+ void WriteNodes (MessageSerializer* s) {
2079+ intptr_t count = objects_.length ();
2080+ s->WriteUnsigned (count);
2081+ for (intptr_t i = 0 ; i < count; i++) {
2082+ Object* vector = objects_[i];
2083+ s->AssignRef (vector);
2084+ ASSERT_EQUAL (Int32x4::value_offset (), Float32x4::value_offset ());
2085+ ASSERT_EQUAL (Int32x4::value_offset (), Float64x2::value_offset ());
2086+ s->WriteBytes (&(static_cast <Int32x4Ptr>(vector->ptr ())->untag ()->value_ ),
2087+ sizeof (simd128_value_t ));
2088+ }
2089+ }
2090+
2091+ private:
2092+ GrowableArray<Object*> objects_;
2093+ };
2094+
2095+ class Simd128MessageDeserializationCluster
2096+ : public MessageDeserializationCluster {
2097+ public:
2098+ explicit Simd128MessageDeserializationCluster (intptr_t cid)
2099+ : MessageDeserializationCluster(" Simd128" ), cid_(cid) {}
2100+ ~Simd128MessageDeserializationCluster () {}
2101+
2102+ void ReadNodes (MessageDeserializer* d) {
2103+ intptr_t count = d->ReadUnsigned ();
2104+ for (intptr_t i = 0 ; i < count; i++) {
2105+ ASSERT_EQUAL (Int32x4::InstanceSize (), Float32x4::InstanceSize ());
2106+ ASSERT_EQUAL (Int32x4::InstanceSize (), Float64x2::InstanceSize ());
2107+ ObjectPtr vector =
2108+ Object::Allocate (cid_, Int32x4::InstanceSize (), Heap::kNew ,
2109+ Int32x4::ContainsCompressedPointers ());
2110+ d->AssignRef (vector);
2111+ ASSERT_EQUAL (Int32x4::value_offset (), Float32x4::value_offset ());
2112+ ASSERT_EQUAL (Int32x4::value_offset (), Float64x2::value_offset ());
2113+ d->ReadBytes (&(static_cast <Int32x4Ptr>(vector)->untag ()->value_ ),
2114+ sizeof (simd128_value_t ));
2115+ }
2116+ }
2117+
2118+ private:
2119+ const intptr_t cid_;
2120+ };
2121+
20692122class RegExpMessageSerializationCluster : public MessageSerializationCluster {
20702123 public:
20712124 RegExpMessageSerializationCluster ()
@@ -3233,6 +3286,10 @@ MessageSerializationCluster* BaseSerializer::NewClusterForClass(
32333286 return new (Z) OneByteStringMessageSerializationCluster (Z, is_canonical);
32343287 case kTwoByteStringCid :
32353288 return new (Z) TwoByteStringMessageSerializationCluster (Z, is_canonical);
3289+ case kInt32x4Cid :
3290+ case kFloat32x4Cid :
3291+ case kFloat64x2Cid :
3292+ return new (Z) Simd128MessageSerializationCluster (cid);
32363293 default :
32373294 break ;
32383295 }
@@ -3321,6 +3378,11 @@ MessageDeserializationCluster* BaseDeserializer::ReadCluster() {
33213378 return new (Z) OneByteStringMessageDeserializationCluster (is_canonical);
33223379 case kTwoByteStringCid :
33233380 return new (Z) TwoByteStringMessageDeserializationCluster (is_canonical);
3381+ case kInt32x4Cid :
3382+ case kFloat32x4Cid :
3383+ case kFloat64x2Cid :
3384+ ASSERT (!is_canonical);
3385+ return new (Z) Simd128MessageDeserializationCluster (cid);
33243386 default :
33253387 break ;
33263388 }
0 commit comments