| 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());
|
|
|