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

Unified Diff: runtime/vm/assembler_arm64.cc

Issue 253623003: Enables all startup code for arm64. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 8 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
« no previous file with comments | « runtime/vm/assembler_arm64.h ('k') | runtime/vm/assembler_arm64_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « runtime/vm/assembler_arm64.h ('k') | runtime/vm/assembler_arm64_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698