| Index: runtime/vm/assembler_arm64.cc
|
| ===================================================================
|
| --- runtime/vm/assembler_arm64.cc (revision 35439)
|
| +++ runtime/vm/assembler_arm64.cc (working copy)
|
| @@ -48,6 +48,30 @@
|
| object_pool_.Add(Bool::False(), Heap::kOld);
|
| patchable_pool_entries_.Add(kNotPatchable);
|
| object_pool_index_table_.Insert(ObjIndexPair(Bool::False().raw(), 2));
|
| +
|
| + if (StubCode::UpdateStoreBuffer_entry() != NULL) {
|
| + FindExternalLabel(&StubCode::UpdateStoreBufferLabel(), kNotPatchable);
|
| + } else {
|
| + object_pool_.Add(Object::null_object(), Heap::kOld);
|
| + patchable_pool_entries_.Add(kNotPatchable);
|
| + }
|
| +
|
| + if (StubCode::CallToRuntime_entry() != NULL) {
|
| + FindExternalLabel(&StubCode::CallToRuntimeLabel(), kNotPatchable);
|
| + } else {
|
| + object_pool_.Add(Object::null_object(), Heap::kOld);
|
| + patchable_pool_entries_.Add(kNotPatchable);
|
| + }
|
| +
|
| + // Create fixed object pool entry for debugger stub.
|
| + if (StubCode::BreakpointRuntime_entry() != NULL) {
|
| + intptr_t index =
|
| + FindExternalLabel(&StubCode::BreakpointRuntimeLabel(), kNotPatchable);
|
| + ASSERT(index == kBreakpointRuntimeCPIndex);
|
| + } else {
|
| + object_pool_.Add(Object::null_object(), Heap::kOld);
|
| + patchable_pool_entries_.Add(kNotPatchable);
|
| + }
|
| }
|
| }
|
|
|
| @@ -676,6 +700,40 @@
|
| }
|
|
|
|
|
| +void Assembler::LoadClassId(Register result, Register object) {
|
| + ASSERT(RawObject::kClassIdTagBit == 16);
|
| + ASSERT(RawObject::kClassIdTagSize == 16);
|
| + const intptr_t class_id_offset = Object::tags_offset() +
|
| + RawObject::kClassIdTagBit / kBitsPerByte;
|
| + LoadFromOffset(result, object, class_id_offset - kHeapObjectTag,
|
| + kUnsignedHalfword);
|
| +}
|
| +
|
| +
|
| +void Assembler::LoadClassById(Register result, Register class_id) {
|
| + ASSERT(result != class_id);
|
| + LoadFieldFromOffset(result, CTX, Context::isolate_offset());
|
| + const intptr_t table_offset_in_isolate =
|
| + Isolate::class_table_offset() + ClassTable::table_offset();
|
| + LoadFromOffset(result, result, table_offset_in_isolate);
|
| + ldr(result, Address(result, class_id, UXTX, Address::Scaled));
|
| +}
|
| +
|
| +
|
| +void Assembler::LoadClass(Register result, Register object) {
|
| + ASSERT(object != TMP);
|
| + LoadClassId(TMP, object);
|
| + LoadClassById(result, TMP);
|
| +}
|
| +
|
| +
|
| +void Assembler::CompareClassId(Register object,
|
| + intptr_t class_id) {
|
| + LoadClassId(TMP, object);
|
| + CompareImmediate(TMP, class_id, PP);
|
| +}
|
| +
|
| +
|
| // Frame entry and exit.
|
| void Assembler::ReserveAlignedFrameSpace(intptr_t frame_space) {
|
| // Reserve space for arguments and align frame before entering
|
| @@ -709,7 +767,7 @@
|
|
|
| void Assembler::EnterDartFrame(intptr_t frame_size) {
|
| // Setup the frame.
|
| - adr(TMP, 0); // TMP gets PC of this instruction.
|
| + adr(TMP, -CodeSize()); // TMP gets PC marker.
|
| EnterFrame(0);
|
| Push(TMP); // Save PC Marker.
|
| TagAndPushPP(); // Save PP.
|
| @@ -719,14 +777,14 @@
|
|
|
| // Reserve space.
|
| if (frame_size > 0) {
|
| - sub(SP, SP, Operand(frame_size));
|
| + AddImmediate(SP, SP, -frame_size, PP);
|
| }
|
| }
|
|
|
|
|
| void Assembler::EnterDartFrameWithInfo(intptr_t frame_size, Register new_pp) {
|
| // Setup the frame.
|
| - adr(TMP, 0); // TMP gets PC of this instruction.
|
| + adr(TMP, -CodeSize()); // TMP gets PC marker.
|
| EnterFrame(0);
|
| Push(TMP); // Save PC Marker.
|
| TagAndPushPP(); // Save PP.
|
| @@ -740,7 +798,7 @@
|
|
|
| // Reserve space.
|
| if (frame_size > 0) {
|
| - sub(SP, SP, Operand(frame_size));
|
| + AddImmediate(SP, SP, -frame_size, PP);
|
| }
|
| }
|
|
|
| @@ -754,7 +812,7 @@
|
| const intptr_t offset = CodeSize();
|
|
|
| Comment("EnterOsrFrame");
|
| - adr(TMP, 0);
|
| + adr(TMP, -CodeSize());
|
|
|
| AddImmediate(TMP, TMP, -offset, kNoRegister);
|
| StoreToOffset(TMP, FP, kPcMarkerSlotFromFp * kWordSize);
|
| @@ -767,7 +825,7 @@
|
| }
|
|
|
| if (extra_size > 0) {
|
| - sub(SP, SP, Operand(extra_size));
|
| + AddImmediate(SP, SP, -extra_size, PP);
|
| }
|
| }
|
|
|
| @@ -787,7 +845,9 @@
|
|
|
| for (int i = kDartFirstVolatileCpuReg; i <= kDartLastVolatileCpuReg; i++) {
|
| const Register reg = static_cast<Register>(i);
|
| - Push(reg);
|
| + if ((reg != R16) && (reg != R17)) {
|
| + Push(reg);
|
| + }
|
| }
|
|
|
| ReserveAlignedFrameSpace(frame_size);
|
| @@ -804,7 +864,9 @@
|
| AddImmediate(SP, FP, -kPushedRegistersSize, PP);
|
| for (int i = kDartLastVolatileCpuReg; i >= kDartFirstVolatileCpuReg; i--) {
|
| const Register reg = static_cast<Register>(i);
|
| - Pop(reg);
|
| + if ((reg != R16) && (reg != R17)) {
|
| + Pop(reg);
|
| + }
|
| }
|
|
|
| Pop(FP);
|
|
|