[vm/compiler/dbc] Make LoadIndexedInstr load unboxed values and StoreIndexedInstr take unboxed values
Closes https://github.com/dart-lang/sdk/issues/37046
Change-Id: I5de2d55b6d5aa2e4707d7dfca00d7a9774590e10
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/103301
Commit-Queue: Martin Kustermann <kustermann@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
diff --git a/runtime/vm/compiler/backend/il_dbc.cc b/runtime/vm/compiler/backend/il_dbc.cc
index dad840e..9236612 100644
--- a/runtime/vm/compiler/backend/il_dbc.cc
+++ b/runtime/vm/compiler/backend/il_dbc.cc
@@ -1392,18 +1392,23 @@
case kTypedDataUint8ClampedArrayCid:
case kExternalTypedDataUint8ArrayCid:
case kExternalTypedDataUint8ClampedArrayCid:
- case kTypedDataInt16ArrayCid:
- case kTypedDataUint16ArrayCid:
+
case kOneByteStringCid:
case kTwoByteStringCid:
case kExternalOneByteStringCid:
- case kExternalTwoByteStringCid:
return CompileType::FromCid(kSmiCid);
case kTypedDataInt32ArrayCid:
case kTypedDataUint32ArrayCid:
return CompileType::Int();
+ // These are unsupported on DBC and will cause a bailout during
+ // EmitNativeCode.
+ case kTypedDataInt16ArrayCid:
+ case kTypedDataUint16ArrayCid:
+ case kExternalTwoByteStringCid:
+ return CompileType::FromCid(kSmiCid);
+
default:
UNREACHABLE();
return CompileType::Dynamic();
@@ -1414,18 +1419,16 @@
switch (class_id_) {
case kArrayCid:
case kImmutableArrayCid:
+ return kTagged;
+ case kOneByteStringCid:
+ case kTwoByteStringCid:
case kTypedDataInt8ArrayCid:
case kTypedDataUint8ArrayCid:
case kTypedDataUint8ClampedArrayCid:
+ case kExternalOneByteStringCid:
case kExternalTypedDataUint8ArrayCid:
case kExternalTypedDataUint8ClampedArrayCid:
- case kTypedDataInt16ArrayCid:
- case kTypedDataUint16ArrayCid:
- case kOneByteStringCid:
- case kTwoByteStringCid:
- case kExternalOneByteStringCid:
- case kExternalTwoByteStringCid:
- return kTagged;
+ return kUnboxedIntPtr;
case kTypedDataInt32ArrayCid:
return kUnboxedInt32;
case kTypedDataUint32ArrayCid:
@@ -1439,6 +1442,14 @@
return kUnboxedFloat32x4;
case kTypedDataFloat64x2ArrayCid:
return kUnboxedFloat64x2;
+
+ // These are unsupported on DBC and will cause a bailout during
+ // EmitNativeCode.
+ case kTypedDataInt16ArrayCid:
+ case kTypedDataUint16ArrayCid:
+ case kExternalTwoByteStringCid:
+ return kUnboxedIntPtr;
+
default:
UNREACHABLE();
return kTagged;
@@ -1457,18 +1468,13 @@
ASSERT(idx == 2);
switch (class_id_) {
case kArrayCid:
+ return kTagged;
case kOneByteStringCid:
- case kTwoByteStringCid:
- case kExternalOneByteStringCid:
- case kExternalTwoByteStringCid:
case kTypedDataInt8ArrayCid:
case kTypedDataUint8ArrayCid:
+ case kExternalOneByteStringCid:
case kExternalTypedDataUint8ArrayCid:
- case kTypedDataUint8ClampedArrayCid:
- case kExternalTypedDataUint8ClampedArrayCid:
- case kTypedDataInt16ArrayCid:
- case kTypedDataUint16ArrayCid:
- return kTagged;
+ return kUnboxedIntPtr;
case kTypedDataInt32ArrayCid:
return kUnboxedInt32;
case kTypedDataUint32ArrayCid:
@@ -1482,6 +1488,14 @@
return kUnboxedInt32x4;
case kTypedDataFloat64x2ArrayCid:
return kUnboxedFloat64x2;
+
+ // These are unsupported on DBC and will cause a bailout during
+ // EmitNativeCode.
+ case kTypedDataUint8ClampedArrayCid:
+ case kExternalTypedDataUint8ClampedArrayCid:
+ case kTypedDataInt16ArrayCid:
+ case kTypedDataUint16ArrayCid:
+ return kUnboxedIntPtr;
default:
UNREACHABLE();
return kTagged;
diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
index 21c3382..99726ee 100644
--- a/runtime/vm/simulator_dbc.cc
+++ b/runtime/vm/simulator_dbc.cc
@@ -3852,7 +3852,7 @@
{
BYTECODE(StoreIndexedUint8, A_B_C);
uint8_t* data = SimulatorHelpers::GetTypedData(FP[rA], FP[rB]);
- *data = Smi::Value(RAW_CAST(Smi, FP[rC]));
+ *data = static_cast<uint8_t>(reinterpret_cast<word>(FP[rC]));
DISPATCH();
}
@@ -3860,8 +3860,8 @@
BYTECODE(StoreIndexedUntaggedUint8, A_B_C);
uint8_t* array = reinterpret_cast<uint8_t*>(FP[rA]);
RawSmi* index = RAW_CAST(Smi, FP[rB]);
- RawSmi* value = RAW_CAST(Smi, FP[rC]);
- array[Smi::Value(index)] = Smi::Value(value);
+ array[Smi::Value(index)] =
+ static_cast<uint8_t>(reinterpret_cast<word>(FP[rC]));
DISPATCH();
}
@@ -3896,9 +3896,9 @@
BYTECODE(StoreIndexedOneByteString, A_B_C);
RawOneByteString* array = RAW_CAST(OneByteString, FP[rA]);
RawSmi* index = RAW_CAST(Smi, FP[rB]);
- RawSmi* value = RAW_CAST(Smi, FP[rC]);
ASSERT(SimulatorHelpers::CheckIndex(index, array->ptr()->length_));
- array->ptr()->data()[Smi::Value(index)] = Smi::Value(value);
+ array->ptr()->data()[Smi::Value(index)] =
+ static_cast<uint8_t>(reinterpret_cast<word>(FP[rC]));
DISPATCH();
}
@@ -4007,14 +4007,15 @@
{
BYTECODE(LoadIndexedUint8, A_B_C);
uint8_t* data = SimulatorHelpers::GetTypedData(FP[rB], FP[rC]);
- FP[rA] = Smi::New(*data);
+ FP[rA] = reinterpret_cast<RawObject*>(static_cast<word>(*data));
DISPATCH();
}
{
BYTECODE(LoadIndexedInt8, A_B_C);
- uint8_t* data = SimulatorHelpers::GetTypedData(FP[rB], FP[rC]);
- FP[rA] = Smi::New(*reinterpret_cast<int8_t*>(data));
+ int8_t* data = reinterpret_cast<int8_t*>(
+ SimulatorHelpers::GetTypedData(FP[rB], FP[rC]));
+ FP[rA] = reinterpret_cast<RawObject*>(static_cast<word>(*data));
DISPATCH();
}
@@ -4036,9 +4037,10 @@
{
BYTECODE(LoadIndexedUntaggedInt8, A_B_C);
- uint8_t* data = reinterpret_cast<uint8_t*>(FP[rB]);
+ int8_t* data = reinterpret_cast<int8_t*>(FP[rB]);
RawSmi* index = RAW_CAST(Smi, FP[rC]);
- FP[rA] = Smi::New(*reinterpret_cast<int8_t*>(data + Smi::Value(index)));
+ FP[rA] = reinterpret_cast<RawObject*>(
+ static_cast<word>(data[Smi::Value(index)]));
DISPATCH();
}
@@ -4046,7 +4048,8 @@
BYTECODE(LoadIndexedUntaggedUint8, A_B_C);
uint8_t* data = reinterpret_cast<uint8_t*>(FP[rB]);
RawSmi* index = RAW_CAST(Smi, FP[rC]);
- FP[rA] = Smi::New(*reinterpret_cast<uint8_t*>(data + Smi::Value(index)));
+ FP[rA] = reinterpret_cast<RawObject*>(
+ static_cast<word>(data[Smi::Value(index)]));
DISPATCH();
}
@@ -4092,7 +4095,8 @@
RawOneByteString* array = RAW_CAST(OneByteString, FP[rB]);
RawSmi* index = RAW_CAST(Smi, FP[rC]);
ASSERT(SimulatorHelpers::CheckIndex(index, array->ptr()->length_));
- FP[rA] = Smi::New(array->ptr()->data()[Smi::Value(index)]);
+ FP[rA] = reinterpret_cast<RawObject*>(
+ static_cast<word>(array->ptr()->data()[Smi::Value(index)]));
DISPATCH();
}
@@ -4101,7 +4105,8 @@
RawTwoByteString* array = RAW_CAST(TwoByteString, FP[rB]);
RawSmi* index = RAW_CAST(Smi, FP[rC]);
ASSERT(SimulatorHelpers::CheckIndex(index, array->ptr()->length_));
- FP[rA] = Smi::New(array->ptr()->data()[Smi::Value(index)]);
+ FP[rA] = reinterpret_cast<RawObject*>(
+ static_cast<word>(array->ptr()->data()[Smi::Value(index)]));
DISPATCH();
}