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

Unified Diff: runtime/vm/intermediate_language_ia32.cc

Issue 10873027: Use the location summary to represent safepoint information. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 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
« no previous file with comments | « runtime/vm/intermediate_language.cc ('k') | runtime/vm/intermediate_language_x64.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/intermediate_language_ia32.cc
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 74a54a879f569c36f91b9f521e4a7a33c667ae4b..73e1c3e3e9e2ec00cff0b35eb6a92d89ff0522f3 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -88,7 +88,7 @@ void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
0,
CatchClauseNode::kInvalidTryIndex,
kTraceFunctionExitRuntimeEntry,
- locs()->stack_bitmap());
+ locs());
__ popl(temp); // Remove argument.
__ popl(result); // Restore result.
}
@@ -215,7 +215,7 @@ void AssertBooleanComp::EmitNativeCode(FlowGraphCompiler* compiler) {
token_pos(),
try_index(),
kConditionTypeErrorRuntimeEntry,
- locs()->stack_bitmap());
+ locs());
// We should never return here.
__ int3();
__ Bind(&done);
@@ -280,7 +280,7 @@ static void EmitEqualityAsInstanceCall(FlowGraphCompiler* compiler,
intptr_t token_pos,
intptr_t try_index,
Token::Kind kind,
- const LocationSummary& locs) {
+ LocationSummary* locs) {
compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
deopt_id,
token_pos,
@@ -291,8 +291,8 @@ static void EmitEqualityAsInstanceCall(FlowGraphCompiler* compiler,
const int kNumArgumentsChecked = 2;
Label done, false_label, true_label;
- Register left = locs.in(0).reg();
- Register right = locs.in(1).reg();
+ Register left = locs->in(0).reg();
+ Register right = locs->in(1).reg();
__ popl(right);
__ popl(left);
const Immediate raw_null =
@@ -327,7 +327,7 @@ static void EmitEqualityAsInstanceCall(FlowGraphCompiler* compiler,
kNumberOfArguments,
kNoArgumentNames,
kNumArgumentsChecked,
- locs.stack_bitmap());
+ locs);
if (kind == Token::kNE) {
// Negate the condition: true label returns false and vice versa.
__ CompareObject(EAX, compiler->bool_true());
@@ -344,22 +344,21 @@ static void EmitEqualityAsInstanceCall(FlowGraphCompiler* compiler,
static void EmitEqualityAsPolymorphicCall(FlowGraphCompiler* compiler,
const ICData& orig_ic_data,
- const LocationSummary& locs,
+ LocationSummary* locs,
BranchInstr* branch,
Token::Kind kind,
intptr_t deopt_id,
intptr_t token_pos,
- intptr_t try_index,
- BitmapBuilder* stack_bitmap) {
+ intptr_t try_index) {
ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
const ICData& ic_data = ICData::Handle(orig_ic_data.AsUnaryClassChecks());
ASSERT(ic_data.NumberOfChecks() > 0);
ASSERT(ic_data.num_args_tested() == 1);
Label* deopt = compiler->AddDeoptStub(deopt_id, try_index, kDeoptEquality);
- Register left = locs.in(0).reg();
- Register right = locs.in(1).reg();
+ Register left = locs->in(0).reg();
+ Register right = locs->in(1).reg();
__ testl(left, Immediate(kSmiTagMask));
- Register temp = locs.temp(0).reg();
+ Register temp = locs->temp(0).reg();
if (ic_data.GetReceiverClassIdAt(0) == kSmiCid) {
Label done, load_class_id;
__ j(NOT_ZERO, &load_class_id, Assembler::kNearJump);
@@ -390,7 +389,7 @@ static void EmitEqualityAsPolymorphicCall(FlowGraphCompiler* compiler,
if (branch != NULL) {
branch->EmitBranchOnCondition(compiler, cond);
} else {
- Register result = locs.out().reg();
+ Register result = locs->out().reg();
Label load_true;
__ j(cond, &load_true, Assembler::kNearJump);
__ LoadObject(result, compiler->bool_false());
@@ -407,7 +406,7 @@ static void EmitEqualityAsPolymorphicCall(FlowGraphCompiler* compiler,
target,
kNumberOfArguments,
kNoArgumentNames,
- stack_bitmap);
+ locs);
if (branch == NULL) {
if (kind == Token::kNE) {
Label false_label;
@@ -494,7 +493,7 @@ static void EmitCheckedStrictEqual(FlowGraphCompiler* compiler,
// If type feedback was provided (lists of <class-id, target>), do a
// type by type check (either === or static call to the operator.
static void EmitGenericEqualityCompare(FlowGraphCompiler* compiler,
- const LocationSummary& locs,
+ LocationSummary* locs,
Token::Kind kind,
BranchInstr* branch,
const ICData& ic_data,
@@ -503,8 +502,8 @@ static void EmitGenericEqualityCompare(FlowGraphCompiler* compiler,
intptr_t try_index) {
ASSERT((kind == Token::kEQ) || (kind == Token::kNE));
ASSERT(!ic_data.IsNull() && (ic_data.NumberOfChecks() > 0));
- Register left = locs.in(0).reg();
- Register right = locs.in(1).reg();
+ Register left = locs->in(0).reg();
+ Register right = locs->in(1).reg();
const Immediate raw_null =
Immediate(reinterpret_cast<intptr_t>(Object::null()));
Label done, identity_compare, non_null_compare;
@@ -519,7 +518,7 @@ static void EmitGenericEqualityCompare(FlowGraphCompiler* compiler,
if (branch != NULL) {
branch->EmitBranchOnCondition(compiler, cond);
} else {
- Register result = locs.out().reg();
+ Register result = locs->out().reg();
Label load_true;
__ j(cond, &load_true, Assembler::kNearJump);
__ LoadObject(result, compiler->bool_false());
@@ -532,8 +531,7 @@ static void EmitGenericEqualityCompare(FlowGraphCompiler* compiler,
__ pushl(left);
__ pushl(right);
EmitEqualityAsPolymorphicCall(compiler, ic_data, locs, branch, kind,
- deopt_id, token_pos, try_index,
- locs.stack_bitmap());
+ deopt_id, token_pos, try_index);
__ Bind(&done);
}
@@ -644,7 +642,7 @@ void EqualityCompareComp::EmitNativeCode(FlowGraphCompiler* compiler) {
return;
}
if (HasICData() && (ic_data()->NumberOfChecks() > 0)) {
- EmitGenericEqualityCompare(compiler, *locs(), kind(), NULL, *ic_data(),
+ EmitGenericEqualityCompare(compiler, locs(), kind(), NULL, *ic_data(),
deopt_id(), token_pos(), try_index());
} else {
Register left = locs()->in(0).reg();
@@ -656,7 +654,7 @@ void EqualityCompareComp::EmitNativeCode(FlowGraphCompiler* compiler) {
token_pos(),
try_index(),
kind(),
- *locs());
+ locs());
ASSERT(locs()->out().reg() == EAX);
}
}
@@ -727,7 +725,7 @@ void RelationalOpComp::EmitNativeCode(FlowGraphCompiler* compiler) {
deopt_id(),
token_pos(),
try_index(),
- locs()->stack_bitmap());
+ locs());
ASSERT(locs()->out().reg() == EAX);
return;
}
@@ -746,7 +744,7 @@ void RelationalOpComp::EmitNativeCode(FlowGraphCompiler* compiler) {
kNumArguments,
Array::ZoneHandle(), // No optional arguments.
kNumArgsChecked,
- locs()->stack_bitmap());
+ locs());
ASSERT(locs()->out().reg() == EAX);
}
@@ -789,7 +787,7 @@ void NativeCallComp::EmitNativeCode(FlowGraphCompiler* compiler) {
try_index(),
&StubCode::CallNativeCFunctionLabel(),
PcDescriptors::kOther,
- locs()->stack_bitmap());
+ locs());
__ popl(result);
}
@@ -995,7 +993,7 @@ void InstanceOfComp::EmitNativeCode(FlowGraphCompiler* compiler) {
try_index(),
type(),
negate_result(),
- locs()->stack_bitmap());
+ locs());
ASSERT(locs()->out().reg() == EAX);
}
@@ -1019,7 +1017,7 @@ void CreateArrayComp::EmitNativeCode(FlowGraphCompiler* compiler) {
try_index(),
&StubCode::AllocateArrayLabel(),
PcDescriptors::kOther,
- locs()->stack_bitmap());
+ locs());
ASSERT(locs()->out().reg() == EAX);
// Pop the element values from the stack into the array.
@@ -1060,7 +1058,7 @@ void AllocateObjectWithBoundsCheckComp::EmitNativeCode(
token_pos(),
try_index(),
kAllocateObjectWithBoundsCheckRuntimeEntry,
- locs()->stack_bitmap());
+ locs());
// Pop instantiator type arguments, type arguments, and class.
// source location.
__ Drop(3);
@@ -1148,7 +1146,7 @@ void InstantiateTypeArgumentsComp::EmitNativeCode(
token_pos(),
try_index(),
kInstantiateTypeArgumentsRuntimeEntry,
- locs()->stack_bitmap());
+ locs());
__ Drop(2); // Drop instantiator and uninstantiated type arguments.
__ popl(result_reg); // Pop instantiated type arguments.
__ Bind(&type_arguments_instantiated);
@@ -1305,7 +1303,7 @@ void AllocateContextComp::EmitNativeCode(FlowGraphCompiler* compiler) {
try_index(),
&label,
PcDescriptors::kOther,
- locs()->stack_bitmap());
+ locs());
}
@@ -1330,7 +1328,7 @@ void CloneContextComp::EmitNativeCode(FlowGraphCompiler* compiler) {
token_pos(),
try_index(),
kCloneContextRuntimeEntry,
- locs()->stack_bitmap());
+ locs());
__ popl(result); // Remove argument.
__ popl(result); // Get result (cloned context).
}
@@ -1386,7 +1384,7 @@ class CheckStackOverflowSlowPath : public SlowPathCode {
computation_->token_pos(),
computation_->try_index(),
kStackOverflowRuntimeEntry,
- computation_->locs()->stack_bitmap());
+ computation_->locs());
compiler->RestoreLiveRegisters(computation_->locs());
__ jmp(exit_label());
}
@@ -1578,7 +1576,7 @@ void BinarySmiOpComp::EmitNativeCode(FlowGraphCompiler* compiler) {
target,
kArgumentCount,
Array::Handle(), // No argument names.
- locs()->stack_bitmap());
+ locs());
ASSERT(result == EAX);
}
__ Bind(&done);
@@ -1686,7 +1684,7 @@ void BinaryMintOpComp::EmitNativeCode(FlowGraphCompiler* compiler) {
target,
instance_call()->ArgumentCount(),
instance_call()->argument_names(),
- locs()->stack_bitmap());
+ locs());
ASSERT(result == EAX);
__ jmp(&done);
}
@@ -1708,7 +1706,7 @@ void BinaryMintOpComp::EmitNativeCode(FlowGraphCompiler* compiler) {
target,
instance_call()->ArgumentCount(),
instance_call()->argument_names(),
- locs()->stack_bitmap());
+ locs());
ASSERT(result == EAX);
}
}
@@ -1735,7 +1733,7 @@ void BinaryDoubleOpComp::EmitNativeCode(FlowGraphCompiler* compiler) {
instance_call()->try_index(),
&label,
PcDescriptors::kOther,
- locs()->stack_bitmap());
+ locs());
// Newly allocated object is now in the result register (RAX).
ASSERT(result == EAX);
__ movl(right, Address(ESP, 0));
@@ -1861,7 +1859,7 @@ void NumberNegateComp::EmitNativeCode(FlowGraphCompiler* compiler) {
instance_call()->try_index(),
&label,
PcDescriptors::kOther,
- locs()->stack_bitmap());
+ locs());
// Result is in EAX.
ASSERT(result != temp);
__ movl(result, EAX);
@@ -1926,7 +1924,7 @@ void SmiToDoubleComp::EmitNativeCode(FlowGraphCompiler* compiler) {
instance_call()->try_index(),
&label,
PcDescriptors::kOther,
- locs()->stack_bitmap());
+ locs());
ASSERT(result == EAX);
Register value = EBX;
// Preserve argument on the stack until after the deoptimization point.
@@ -1976,7 +1974,7 @@ void PolymorphicInstanceCallComp::EmitNativeCode(FlowGraphCompiler* compiler) {
instance_call()->deopt_id(),
instance_call()->token_pos(),
instance_call()->try_index(),
- locs()->stack_bitmap());
+ locs());
if (is_smi_label == &handle_smi) {
__ Bind(&handle_smi);
ASSERT(ic_data()->GetReceiverClassIdAt(0) == kSmiCid);
@@ -1987,7 +1985,7 @@ void PolymorphicInstanceCallComp::EmitNativeCode(FlowGraphCompiler* compiler) {
target,
instance_call()->ArgumentCount(),
instance_call()->argument_names(),
- locs()->stack_bitmap());
+ locs());
}
__ Bind(&done);
}
@@ -2087,7 +2085,7 @@ void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
// TODO(srdjan): Add Smi/Double, Double/Smi comparisons.
if ((kind() == Token::kEQ) || (kind() == Token::kNE)) {
- EmitGenericEqualityCompare(compiler, *locs(), kind(), this, *ic_data(),
+ EmitGenericEqualityCompare(compiler, locs(), kind(), this, *ic_data(),
deopt_id(), token_pos(), try_index());
return;
}
@@ -2103,7 +2101,7 @@ void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
token_pos(),
try_index(),
Token::kEQ, // kNE reverse occurs at branch.
- *locs());
+ locs());
} else {
const String& function_name =
String::ZoneHandle(Symbols::New(Token::Str(kind())));
@@ -2120,7 +2118,7 @@ void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
kNumArguments,
Array::ZoneHandle(), // No optional args.
kNumArgsChecked,
- locs()->stack_bitmap());
+ locs());
}
Condition branch_condition = (kind() == Token::kNE) ? NOT_EQUAL : EQUAL;
__ CompareObject(EAX, compiler->bool_true());
« no previous file with comments | « runtime/vm/intermediate_language.cc ('k') | runtime/vm/intermediate_language_x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698