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

Unified Diff: runtime/vm/intermediate_language_arm64.cc

Issue 264753002: Adds Simulator Longjmp and enables many tests 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/heap_test.cc ('k') | runtime/vm/isolate_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/intermediate_language_arm64.cc
===================================================================
--- runtime/vm/intermediate_language_arm64.cc (revision 35592)
+++ runtime/vm/intermediate_language_arm64.cc (working copy)
@@ -1425,14 +1425,69 @@
LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary(
bool opt) const {
- UNIMPLEMENTED();
- return NULL;
+ const intptr_t kNumInputs = 1;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* locs =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+ locs->set_in(0, Location::RegisterLocation(R0));
+ locs->set_out(0, Location::RegisterLocation(R0));
+ return locs;
}
void InstantiateTypeArgumentsInstr::EmitNativeCode(
FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ Register instantiator_reg = locs()->in(0).reg();
+ Register result_reg = locs()->out(0).reg();
+ ASSERT(instantiator_reg == R0);
+ ASSERT(instantiator_reg == result_reg);
+
+ // 'instantiator_reg' is the instantiator TypeArguments object (or null).
+ ASSERT(!type_arguments().IsUninstantiatedIdentity() &&
+ !type_arguments().CanShareInstantiatorTypeArguments(
+ instantiator_class()));
+ // If the instantiator is null and if the type argument vector
+ // instantiated from null becomes a vector of dynamic, then use null as
+ // the type arguments.
+ Label type_arguments_instantiated;
+ const intptr_t len = type_arguments().Length();
+ if (type_arguments().IsRawInstantiatedRaw(len)) {
+ __ CompareObject(instantiator_reg, Object::null_object(), PP);
+ __ b(&type_arguments_instantiated, EQ);
+ }
+
+ __ LoadObject(R2, type_arguments(), PP);
+ __ LoadFieldFromOffset(R2, R2, TypeArguments::instantiations_offset());
+ __ AddImmediate(R2, R2, Array::data_offset() - kHeapObjectTag, PP);
+ // The instantiations cache is initialized with Object::zero_array() and is
+ // therefore guaranteed to contain kNoInstantiator. No length check needed.
+ Label loop, found, slow_case;
+ __ Bind(&loop);
+ __ LoadFromOffset(R1, R2, 0 * kWordSize); // Cached instantiator.
+ __ CompareRegisters(R1, R0);
+ __ b(&found, EQ);
+ __ AddImmediate(R2, R2, 2 * kWordSize, PP);
+ __ CompareImmediate(R1, Smi::RawValue(StubCode::kNoInstantiator), PP);
+ __ b(&loop, NE);
+ __ b(&slow_case);
+ __ Bind(&found);
+ __ LoadFromOffset(R0, R2, 1 * kWordSize); // Cached instantiated args.
+ __ b(&type_arguments_instantiated);
+
+ __ Bind(&slow_case);
+ // Instantiate non-null type arguments.
+ // A runtime call to instantiate the type arguments is required.
+ __ PushObject(Object::ZoneHandle(), PP); // Make room for the result.
+ __ PushObject(type_arguments(), PP);
+ __ Push(instantiator_reg); // Push instantiator type arguments.
+ compiler->GenerateRuntimeCall(token_pos(),
+ deopt_id(),
+ kInstantiateTypeArgumentsRuntimeEntry,
+ 2,
+ locs());
+ __ Drop(2); // Drop instantiator and uninstantiated type arguments.
+ __ Pop(result_reg); // Pop instantiated type arguments.
+ __ Bind(&type_arguments_instantiated);
}
@@ -1462,13 +1517,29 @@
LocationSummary* CloneContextInstr::MakeLocationSummary(bool opt) const {
- UNIMPLEMENTED();
- return NULL;
+ const intptr_t kNumInputs = 1;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* locs =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+ locs->set_in(0, Location::RegisterLocation(R0));
+ locs->set_out(0, Location::RegisterLocation(R0));
+ return locs;
}
void CloneContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- UNIMPLEMENTED();
+ Register context_value = locs()->in(0).reg();
+ Register result = locs()->out(0).reg();
+
+ __ PushObject(Object::ZoneHandle(), PP); // Make room for the result.
+ __ Push(context_value);
+ compiler->GenerateRuntimeCall(token_pos(),
+ deopt_id(),
+ kCloneContextRuntimeEntry,
+ 1,
+ locs());
+ __ Drop(1); // Remove argument.
+ __ Pop(result); // Get result (cloned context).
}
« no previous file with comments | « runtime/vm/heap_test.cc ('k') | runtime/vm/isolate_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698