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

Unified Diff: runtime/vm/intermediate_language_mips.cc

Issue 22915008: Tests for GuardField length check along with bug fixes (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 4 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/intermediate_language_mips.cc
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 3d2f33861449362c830992484b512fe362400c37..e108482504340073c507bc81ed570203e4c85948 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -1662,15 +1662,41 @@ void GuardFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
// Field guard may have remembered list length, check it.
if ((field_cid == kArrayCid) || (field_cid == kImmutableArrayCid)) {
__ lw(TMP, FieldAddress(value_reg, Array::length_offset()));
- __ LoadImmediate(CMPRES1, field_length);
+ __ LoadImmediate(CMPRES1, Smi::RawValue(field_length));
__ subu(CMPRES1, TMP, CMPRES1);
} else if (RawObject::IsTypedDataClassId(field_cid)) {
__ lw(TMP, FieldAddress(value_reg, TypedData::length_offset()));
- __ LoadImmediate(CMPRES1, field_length);
+ __ LoadImmediate(CMPRES1, Smi::RawValue(field_length));
__ subu(CMPRES1, TMP, CMPRES1);
} else {
ASSERT(field_cid == kIllegalCid);
- __ LoadImmediate(CMPRES1, 0x1);
+ Label check_array, local_exit, local_fail;
+ __ BranchEqual(value_cid_reg, kNullCid, &local_fail);
+ // Check for typed data array.
+ __ BranchSignedGreater(value_cid_reg, kTypedDataFloat32x4ArrayCid,
+ &local_fail);
+ __ BranchSignedLess(value_cid_reg, kTypedDataInt8ArrayCid,
+ &check_array);
+ __ lw(TMP, FieldAddress(value_reg, TypedData::length_offset()));
+ __ lw(CMPRES1, field_length_operand);
+ __ subu(CMPRES1, TMP, CMPRES1);
+ __ b(&local_exit);
+ // Check for regular array.
+ __ Bind(&check_array);
+ __ BranchSignedGreater(value_cid_reg, kImmutableArrayCid,
+ &local_fail);
+ __ BranchSignedLess(value_cid_reg, kArrayCid, &local_fail);
+ __ lw(TMP, FieldAddress(value_reg, Array::length_offset()));
+ __ lw(CMPRES1, field_length_operand);
+ __ subu(CMPRES1, TMP, CMPRES1);
+ __ b(&local_exit);
+
+ __ Bind(&local_fail);
+ // TODO(regis): TMP1 may conflict. Revisit.
+ __ LoadImmediate(TMP1, Smi::RawValue(Field::kNoFixedLength));
+ __ sw(TMP1, field_length_operand);
+
+ __ Bind(&local_exit);
}
__ bne(CMPRES1, ZR, fail);
}
@@ -1697,18 +1723,18 @@ void GuardFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
ASSERT((value_cid_reg != value_reg) && (field_reg != value_cid_reg));
}
ASSERT(value_cid_reg != kNoRegister);
- if ((field_cid == kArrayCid) || (field_cid == kImmutableArrayCid)) {
+ if ((value_cid == kArrayCid) || (value_cid == kImmutableArrayCid)) {
__ lw(TMP, FieldAddress(value_reg, Array::length_offset()));
- __ LoadImmediate(CMPRES, field_length);
+ __ LoadImmediate(CMPRES, Smi::RawValue(field_length));
__ subu(CMPRES, TMP, CMPRES);
- } else if (RawObject::IsTypedDataClassId(field_cid)) {
+ } else if (RawObject::IsTypedDataClassId(value_cid)) {
__ lw(TMP, FieldAddress(value_reg, TypedData::length_offset()));
- __ LoadImmediate(CMPRES, field_length);
+ __ LoadImmediate(CMPRES, Smi::RawValue(field_length));
__ subu(CMPRES, TMP, CMPRES);
} else {
ASSERT(field_cid == kIllegalCid);
- __ LoadImmediate(CMPRES, 0x1);
}
+ __ bne(CMPRES, ZR, fail);
}
__ Bind(&skip_length_check);
}
@@ -1746,7 +1772,7 @@ void GuardFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
__ Bind(&local_fail);
// TODO(regis): TMP1 may conflict. Revisit.
- __ LoadImmediate(TMP1, Field::kNoFixedLength);
+ __ LoadImmediate(TMP1, Smi::RawValue(Field::kNoFixedLength));
__ sw(TMP1, field_length_operand);
__ Bind(&local_exit);
@@ -1762,23 +1788,24 @@ void GuardFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
__ LoadImmediate(TMP1, value_cid);
__ sw(TMP1, field_cid_operand);
__ sw(TMP1, field_nullability_operand);
- if ((value_cid == kArrayCid) || (value_cid == kImmutableArrayCid)) {
- // Destroy value_cid_reg (safe because we are finished with it).
- __ lw(value_cid_reg,
- FieldAddress(value_reg, Array::length_offset()));
- __ sw(value_cid_reg, field_length_operand);
- } else if (RawObject::IsTypedDataClassId(value_cid)) {
- // Destroy value_cid_reg (safe because we are finished with it).
- __ lw(value_cid_reg,
- FieldAddress(value_reg, TypedData::length_offset()));
- __ sw(value_cid_reg, field_length_operand);
- } else {
- // Destroy value_cid_reg (safe because we are finished with it).
- __ LoadImmediate(value_cid_reg, Field::kNoFixedLength);
- __ sw(value_cid_reg, field_length_operand);
+ if (field_has_length) {
+ if ((value_cid == kArrayCid) || (value_cid == kImmutableArrayCid)) {
+ // Destroy value_cid_reg (safe because we are finished with it).
+ __ lw(value_cid_reg,
+ FieldAddress(value_reg, Array::length_offset()));
+ __ sw(value_cid_reg, field_length_operand);
+ } else if (RawObject::IsTypedDataClassId(value_cid)) {
+ // Destroy value_cid_reg (safe because we are finished with it).
+ __ lw(value_cid_reg,
+ FieldAddress(value_reg, TypedData::length_offset()));
+ __ sw(value_cid_reg, field_length_operand);
+ } else {
+ // Destroy value_cid_reg (safe because we are finished with it).
+ __ LoadImmediate(value_cid_reg, Smi::RawValue(Field::kNoFixedLength));
+ __ sw(value_cid_reg, field_length_operand);
+ }
}
}
-
if (!ok_is_fall_through) {
__ b(&ok);
}
@@ -1846,7 +1873,7 @@ void GuardFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
__ lw(value_cid_reg,
FieldAddress(value_reg, TypedData::length_offset()));
}
- __ LoadImmediate(TMP1, field_length);
+ __ LoadImmediate(TMP1, Smi::RawValue(field_length));
__ subu(CMPRES, value_cid_reg, TMP1);
if (ok_is_fall_through) {
__ bne(CMPRES, ZR, fail);

Powered by Google App Engine
This is Rietveld 408576698