| Index: runtime/vm/intrinsifier_arm64.cc
|
| diff --git a/runtime/vm/intrinsifier_arm64.cc b/runtime/vm/intrinsifier_arm64.cc
|
| index 3fd338a5a0849f9ae79e5b349dc4f20df8f4a1e5..4441fe21e7cbb99e052052e4958f2ffaf46d8395 100644
|
| --- a/runtime/vm/intrinsifier_arm64.cc
|
| +++ b/runtime/vm/intrinsifier_arm64.cc
|
| @@ -33,56 +33,14 @@ DECLARE_FLAG(bool, interpret_irregexp);
|
| intptr_t Intrinsifier::ParameterSlotFromSp() { return -1; }
|
|
|
|
|
| -static intptr_t ComputeObjectArrayTypeArgumentsOffset() {
|
| - const Library& core_lib = Library::Handle(Library::CoreLibrary());
|
| - const Class& cls = Class::Handle(
|
| - core_lib.LookupClassAllowPrivate(Symbols::_List()));
|
| - ASSERT(!cls.IsNull());
|
| - ASSERT(cls.NumTypeArguments() == 1);
|
| - const intptr_t field_offset = cls.type_arguments_field_offset();
|
| - ASSERT(field_offset != Class::kNoTypeArguments);
|
| - return field_offset;
|
| -}
|
| -
|
| -
|
| // Intrinsify only for Smi value and index. Non-smi values need a store buffer
|
| // update. Array length is always a Smi.
|
| void Intrinsifier::ObjectArraySetIndexed(Assembler* assembler) {
|
| - Label fall_through;
|
| -
|
| if (Isolate::Current()->flags().type_checks()) {
|
| - const intptr_t type_args_field_offset =
|
| - ComputeObjectArrayTypeArgumentsOffset();
|
| - // Inline simple tests (Smi, null), fallthrough if not positive.
|
| - Label checked_ok;
|
| - __ ldr(R2, Address(SP, 0 * kWordSize)); // Value.
|
| -
|
| - // Null value is valid for any type.
|
| - __ CompareObject(R2, Object::null_object());
|
| - __ b(&checked_ok, EQ);
|
| -
|
| - __ ldr(R1, Address(SP, 2 * kWordSize)); // Array.
|
| - __ ldr(R1, FieldAddress(R1, type_args_field_offset));
|
| -
|
| - // R1: Type arguments of array.
|
| - __ CompareObject(R1, Object::null_object());
|
| - __ b(&checked_ok, EQ);
|
| -
|
| - // Check if it's dynamic.
|
| - // Get type at index 0.
|
| - __ ldr(R0, FieldAddress(R1, TypeArguments::type_at_offset(0)));
|
| - __ CompareObject(R0, Type::ZoneHandle(Type::DynamicType()));
|
| - __ b(&checked_ok, EQ);
|
| -
|
| - // Check for int and num.
|
| - __ tsti(R2, Immediate(Immediate(kSmiTagMask))); // Value is Smi?
|
| - __ b(&fall_through, NE); // Non-smi value.
|
| - __ CompareObject(R0, Type::ZoneHandle(Type::IntType()));
|
| - __ b(&checked_ok, EQ);
|
| - __ CompareObject(R0, Type::ZoneHandle(Type::Number()));
|
| - __ b(&fall_through, NE);
|
| - __ Bind(&checked_ok);
|
| + return;
|
| }
|
| +
|
| + Label fall_through;
|
| __ ldr(R1, Address(SP, 1 * kWordSize)); // Index.
|
| __ tsti(R1, Immediate(kSmiTagMask));
|
| // Index not Smi.
|
|
|