[vm,compiler] Support SIMD constants in IL serialization

TEST=vm/dart/isolates/fast_object_copy2_test

Change-Id: I934d92f54f9ab51bbdd42edd90588d404bc9be37
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/401920
Reviewed-by: Alexander Aprelev <aam@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
diff --git a/runtime/tests/vm/dart/isolates/fast_object_copy2_test.dart b/runtime/tests/vm/dart/isolates/fast_object_copy2_test.dart
index 6cd4ba2..bab4a74 100644
--- a/runtime/tests/vm/dart/isolates/fast_object_copy2_test.dart
+++ b/runtime/tests/vm/dart/isolates/fast_object_copy2_test.dart
@@ -6,6 +6,7 @@
 // VMOptions=--enable-fast-object-copy
 // VMOptions=--no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
 // VMOptions=--enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
+// VMOptions=--test_il_serialization
 
 import 'dart:async';
 import 'dart:ffi';
diff --git a/runtime/vm/compiler/backend/il_serializer.cc b/runtime/vm/compiler/backend/il_serializer.cc
index 4d124e4..4138ff9 100644
--- a/runtime/vm/compiler/backend/il_serializer.cc
+++ b/runtime/vm/compiler/backend/il_serializer.cc
@@ -1600,6 +1600,18 @@
       ASSERT(x.IsCanonical());
       Write<double>(Double::Cast(x).value());
       break;
+    case kFloat32x4Cid:
+      ASSERT(x.IsCanonical());
+      Write<simd128_value_t>(Float32x4::Cast(x).value());
+      break;
+    case kFloat64x2Cid:
+      ASSERT(x.IsCanonical());
+      Write<simd128_value_t>(Float64x2::Cast(x).value());
+      break;
+    case kInt32x4Cid:
+      ASSERT(x.IsCanonical());
+      Write<simd128_value_t>(Int32x4::Cast(x).value());
+      break;
     case kFieldCid: {
       const auto& field = Field::Cast(x);
       const auto& owner = Class::Handle(Z, field.Owner());
@@ -1877,6 +1889,24 @@
     }
     case kDoubleCid:
       return Double::ZoneHandle(Z, Double::NewCanonical(Read<double>()));
+    case kFloat32x4Cid: {
+      auto& simd_value =
+          Float32x4::ZoneHandle(Z, Float32x4::New(Read<simd128_value_t>()));
+      simd_value ^= simd_value.Canonicalize(thread());
+      return simd_value;
+    }
+    case kFloat64x2Cid: {
+      auto& simd_value =
+          Float64x2::ZoneHandle(Z, Float64x2::New(Read<simd128_value_t>()));
+      simd_value ^= simd_value.Canonicalize(thread());
+      return simd_value;
+    }
+    case kInt32x4Cid: {
+      auto& simd_value =
+          Int32x4::ZoneHandle(Z, Int32x4::New(Read<simd128_value_t>()));
+      simd_value ^= simd_value.Canonicalize(thread());
+      return simd_value;
+    }
     case kFieldCid: {
       const classid_t owner_class_id = Read<classid_t>();
       const intptr_t field_index = Read<intptr_t>();
@@ -2291,6 +2321,21 @@
 }
 
 template <>
+void FlowGraphSerializer::WriteTrait<simd128_value_t>::Write(
+    FlowGraphSerializer* s,
+    simd128_value_t x) {
+  s->stream()->WriteBytes(&x, sizeof(simd128_value_t));
+}
+
+template <>
+simd128_value_t FlowGraphDeserializer::ReadTrait<simd128_value_t>::Read(
+    FlowGraphDeserializer* d) {
+  simd128_value_t value;
+  d->stream()->ReadBytes(&value, sizeof(simd128_value_t));
+  return value;
+}
+
+template <>
 void FlowGraphSerializer::WriteTrait<const Slot&>::Write(FlowGraphSerializer* s,
                                                          const Slot& x) {
   x.Write(s);
diff --git a/runtime/vm/compiler/backend/il_serializer.h b/runtime/vm/compiler/backend/il_serializer.h
index 33485ff..62c3b6a 100644
--- a/runtime/vm/compiler/backend/il_serializer.h
+++ b/runtime/vm/compiler/backend/il_serializer.h
@@ -109,6 +109,7 @@
   V(Range*)                                                                    \
   V(RecordShape)                                                               \
   V(Representation)                                                            \
+  V(simd128_value_t)                                                           \
   V(const Slot&)                                                               \
   V(const Slot*)                                                               \
   V(const String&)                                                             \