| Index: src/mips/full-codegen-mips.cc
|
| diff --git a/src/mips/full-codegen-mips.cc b/src/mips/full-codegen-mips.cc
|
| index 4225270e672e7dedc40184015d62078930e1bf5a..519a48370667da340df180ae1bb58df965e9a19d 100644
|
| --- a/src/mips/full-codegen-mips.cc
|
| +++ b/src/mips/full-codegen-mips.cc
|
| @@ -672,7 +672,7 @@ void FullCodeGenerator::DoTest(Expression* condition,
|
| Label* fall_through) {
|
| __ mov(a0, result_register());
|
| Handle<Code> ic = ToBooleanStub::GetUninitialized(isolate());
|
| - CallIC(ic, RelocInfo::CODE_TARGET, condition->test_id());
|
| + CallIC(ic, NOT_CONTEXTUAL, condition->test_id());
|
| __ mov(at, zero_reg);
|
| Split(ne, v0, Operand(at), if_true, if_false, fall_through);
|
| }
|
| @@ -1037,7 +1037,7 @@ void FullCodeGenerator::VisitSwitchStatement(SwitchStatement* stmt) {
|
| // Record position before stub call for type feedback.
|
| SetSourcePosition(clause->position());
|
| Handle<Code> ic = CompareIC::GetUninitialized(isolate(), Token::EQ_STRICT);
|
| - CallIC(ic, RelocInfo::CODE_TARGET, clause->CompareId());
|
| + CallIC(ic, NOT_CONTEXTUAL, clause->CompareId());
|
| patch_site.EmitPatchInfo();
|
|
|
| Label skip;
|
| @@ -1400,11 +1400,10 @@ void FullCodeGenerator::EmitLoadGlobalCheckExtensions(Variable* var,
|
|
|
| __ lw(a0, GlobalObjectOperand());
|
| __ li(a2, Operand(var->name()));
|
| - RelocInfo::Mode mode = (typeof_state == INSIDE_TYPEOF)
|
| - ? RelocInfo::CODE_TARGET
|
| - : RelocInfo::CODE_TARGET_CONTEXT;
|
| - Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
|
| - CallIC(ic, mode);
|
| + ContextualMode mode = (typeof_state == INSIDE_TYPEOF)
|
| + ? NOT_CONTEXTUAL
|
| + : CONTEXTUAL;
|
| + CallLoadIC(mode);
|
| }
|
|
|
|
|
| @@ -1487,8 +1486,7 @@ void FullCodeGenerator::EmitVariableLoad(VariableProxy* proxy) {
|
| // object (receiver) in a0.
|
| __ lw(a0, GlobalObjectOperand());
|
| __ li(a2, Operand(var->name()));
|
| - Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
|
| - CallIC(ic, RelocInfo::CODE_TARGET_CONTEXT);
|
| + CallLoadIC(CONTEXTUAL);
|
| context()->Plug(v0);
|
| break;
|
| }
|
| @@ -1700,10 +1698,7 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
|
| __ mov(a0, result_register());
|
| __ li(a2, Operand(key->value()));
|
| __ lw(a1, MemOperand(sp));
|
| - Handle<Code> ic = is_classic_mode()
|
| - ? isolate()->builtins()->StoreIC_Initialize()
|
| - : isolate()->builtins()->StoreIC_Initialize_Strict();
|
| - CallIC(ic, RelocInfo::CODE_TARGET, key->LiteralFeedbackId());
|
| + CallStoreIC(NOT_CONTEXTUAL, key->LiteralFeedbackId());
|
| PrepareForBailoutForId(key->id(), NO_REGISTERS);
|
| } else {
|
| VisitForEffect(value);
|
| @@ -1793,8 +1788,7 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) {
|
| Handle<FixedArrayBase> constant_elements_values(
|
| FixedArrayBase::cast(constant_elements->get(1)));
|
|
|
| - AllocationSiteMode allocation_site_mode = FLAG_track_allocation_sites
|
| - ? TRACK_ALLOCATION_SITE : DONT_TRACK_ALLOCATION_SITE;
|
| + AllocationSiteMode allocation_site_mode = TRACK_ALLOCATION_SITE;
|
| if (has_fast_elements && !FLAG_allocation_site_pretenuring) {
|
| // If the only customer of allocation sites is transitioning, then
|
| // we can turn it off if we don't have anywhere else to transition to.
|
| @@ -2118,8 +2112,7 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
|
| __ mov(a0, v0);
|
| __ push(a0); // save result
|
| __ LoadRoot(a2, Heap::kdone_stringRootIndex); // "done"
|
| - Handle<Code> done_ic = isolate()->builtins()->LoadIC_Initialize();
|
| - CallIC(done_ic); // result.done in v0
|
| + CallLoadIC(NOT_CONTEXTUAL); // result.done in v0
|
| __ mov(a0, v0);
|
| Handle<Code> bool_ic = ToBooleanStub::GetUninitialized(isolate());
|
| CallIC(bool_ic);
|
| @@ -2128,8 +2121,7 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
|
| // result.value
|
| __ pop(a0); // result
|
| __ LoadRoot(a2, Heap::kvalue_stringRootIndex); // "value"
|
| - Handle<Code> value_ic = isolate()->builtins()->LoadIC_Initialize();
|
| - CallIC(value_ic); // result.value in v0
|
| + CallLoadIC(NOT_CONTEXTUAL); // result.value in v0
|
| context()->DropAndPlug(2, v0); // drop iter and g
|
| break;
|
| }
|
| @@ -2277,8 +2269,7 @@ void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) {
|
| __ mov(a0, result_register());
|
| __ li(a2, Operand(key->value()));
|
| // Call load IC. It has arguments receiver and property name a0 and a2.
|
| - Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
|
| - CallIC(ic, RelocInfo::CODE_TARGET, prop->PropertyFeedbackId());
|
| + CallLoadIC(NOT_CONTEXTUAL, prop->PropertyFeedbackId());
|
| }
|
|
|
|
|
| @@ -2287,7 +2278,7 @@ void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) {
|
| __ mov(a0, result_register());
|
| // Call keyed load IC. It has arguments key and receiver in a0 and a1.
|
| Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize();
|
| - CallIC(ic, RelocInfo::CODE_TARGET, prop->PropertyFeedbackId());
|
| + CallIC(ic, NOT_CONTEXTUAL, prop->PropertyFeedbackId());
|
| }
|
|
|
|
|
| @@ -2315,8 +2306,8 @@ void FullCodeGenerator::EmitInlineSmiBinaryOp(BinaryOperation* expr,
|
|
|
| __ bind(&stub_call);
|
| BinaryOpICStub stub(op, mode);
|
| - CallIC(stub.GetCode(isolate()), RelocInfo::CODE_TARGET,
|
| - expr->BinaryOperationFeedbackId());
|
| + CallIC(stub.GetCode(isolate()), NOT_CONTEXTUAL,
|
| + expr->BinaryOperationFeedbackId());
|
| patch_site.EmitPatchInfo();
|
| __ jmp(&done);
|
|
|
| @@ -2398,7 +2389,7 @@ void FullCodeGenerator::EmitBinaryOp(BinaryOperation* expr,
|
| __ pop(a1);
|
| BinaryOpICStub stub(op, mode);
|
| JumpPatchSite patch_site(masm_); // unbound, signals no inlined smi code.
|
| - CallIC(stub.GetCode(isolate()), RelocInfo::CODE_TARGET,
|
| + CallIC(stub.GetCode(isolate()), NOT_CONTEXTUAL,
|
| expr->BinaryOperationFeedbackId());
|
| patch_site.EmitPatchInfo();
|
| context()->Plug(v0);
|
| @@ -2437,10 +2428,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr) {
|
| __ mov(a1, result_register());
|
| __ pop(a0); // Restore value.
|
| __ li(a2, Operand(prop->key()->AsLiteral()->value()));
|
| - Handle<Code> ic = is_classic_mode()
|
| - ? isolate()->builtins()->StoreIC_Initialize()
|
| - : isolate()->builtins()->StoreIC_Initialize_Strict();
|
| - CallIC(ic);
|
| + CallStoreIC(NOT_CONTEXTUAL);
|
| break;
|
| }
|
| case KEYED_PROPERTY: {
|
| @@ -2467,11 +2455,7 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var,
|
| __ mov(a0, result_register());
|
| __ li(a2, Operand(var->name()));
|
| __ lw(a1, GlobalObjectOperand());
|
| - Handle<Code> ic = is_classic_mode()
|
| - ? isolate()->builtins()->StoreIC_Initialize()
|
| - : isolate()->builtins()->StoreIC_Initialize_Strict();
|
| - CallIC(ic, RelocInfo::CODE_TARGET_CONTEXT);
|
| -
|
| + CallStoreIC(CONTEXTUAL);
|
| } else if (op == Token::INIT_CONST) {
|
| // Const initializers need a write barrier.
|
| ASSERT(!var->IsParameter()); // No const parameters.
|
| @@ -2569,10 +2553,7 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
|
| __ li(a2, Operand(prop->key()->AsLiteral()->value()));
|
| __ pop(a1);
|
|
|
| - Handle<Code> ic = is_classic_mode()
|
| - ? isolate()->builtins()->StoreIC_Initialize()
|
| - : isolate()->builtins()->StoreIC_Initialize_Strict();
|
| - CallIC(ic, RelocInfo::CODE_TARGET, expr->AssignmentFeedbackId());
|
| + CallStoreIC(NOT_CONTEXTUAL, expr->AssignmentFeedbackId());
|
|
|
| PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
|
| context()->Plug(v0);
|
| @@ -2595,7 +2576,7 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
|
| Handle<Code> ic = is_classic_mode()
|
| ? isolate()->builtins()->KeyedStoreIC_Initialize()
|
| : isolate()->builtins()->KeyedStoreIC_Initialize_Strict();
|
| - CallIC(ic, RelocInfo::CODE_TARGET, expr->AssignmentFeedbackId());
|
| + CallIC(ic, NOT_CONTEXTUAL, expr->AssignmentFeedbackId());
|
|
|
| PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
|
| context()->Plug(v0);
|
| @@ -2622,16 +2603,17 @@ void FullCodeGenerator::VisitProperty(Property* expr) {
|
|
|
|
|
| void FullCodeGenerator::CallIC(Handle<Code> code,
|
| - RelocInfo::Mode rmode,
|
| + ContextualMode mode,
|
| TypeFeedbackId id) {
|
| ic_total_count_++;
|
| - __ Call(code, rmode, id);
|
| + ASSERT(mode != CONTEXTUAL || id.IsNone());
|
| + __ Call(code, RelocInfo::CODE_TARGET, id);
|
| }
|
|
|
|
|
| void FullCodeGenerator::EmitCallWithIC(Call* expr,
|
| Handle<Object> name,
|
| - RelocInfo::Mode mode) {
|
| + ContextualMode mode) {
|
| // Code common for calls using the IC.
|
| ZoneList<Expression*>* args = expr->arguments();
|
| int arg_count = args->length();
|
| @@ -2646,7 +2628,10 @@ void FullCodeGenerator::EmitCallWithIC(Call* expr,
|
| // Call the IC initialization code.
|
| Handle<Code> ic =
|
| isolate()->stub_cache()->ComputeCallInitialize(arg_count, mode);
|
| - CallIC(ic, mode, expr->CallFeedbackId());
|
| + TypeFeedbackId ast_id = mode == CONTEXTUAL
|
| + ? TypeFeedbackId::None()
|
| + : expr->CallFeedbackId();
|
| + CallIC(ic, mode, ast_id);
|
| RecordJSReturnSite(expr);
|
| // Restore context register.
|
| __ lw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
|
| @@ -2679,7 +2664,7 @@ void FullCodeGenerator::EmitKeyedCallWithIC(Call* expr,
|
| Handle<Code> ic =
|
| isolate()->stub_cache()->ComputeKeyedCallInitialize(arg_count);
|
| __ lw(a2, MemOperand(sp, (arg_count + 1) * kPointerSize)); // Key.
|
| - CallIC(ic, RelocInfo::CODE_TARGET, expr->CallFeedbackId());
|
| + CallIC(ic, NOT_CONTEXTUAL, expr->CallFeedbackId());
|
| RecordJSReturnSite(expr);
|
| // Restore context register.
|
| __ lw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
|
| @@ -2795,7 +2780,7 @@ void FullCodeGenerator::VisitCall(Call* expr) {
|
| // Push global object as receiver for the call IC.
|
| __ lw(a0, GlobalObjectOperand());
|
| __ push(a0);
|
| - EmitCallWithIC(expr, proxy->name(), RelocInfo::CODE_TARGET_CONTEXT);
|
| + EmitCallWithIC(expr, proxy->name(), CONTEXTUAL);
|
| } else if (proxy != NULL && proxy->var()->IsLookupSlot()) {
|
| // Call to a lookup slot (dynamically introduced variable).
|
| Label slow, done;
|
| @@ -2842,7 +2827,7 @@ void FullCodeGenerator::VisitCall(Call* expr) {
|
| if (property->key()->IsPropertyName()) {
|
| EmitCallWithIC(expr,
|
| property->key()->AsLiteral()->value(),
|
| - RelocInfo::CODE_TARGET);
|
| + NOT_CONTEXTUAL);
|
| } else {
|
| EmitKeyedCallWithIC(expr, property->key());
|
| }
|
| @@ -2851,12 +2836,12 @@ void FullCodeGenerator::VisitCall(Call* expr) {
|
| { PreservePositionScope scope(masm()->positions_recorder());
|
| VisitForStackValue(callee);
|
| }
|
| - // Load global receiver object.
|
| - __ lw(a1, GlobalObjectOperand());
|
| - __ lw(a1, FieldMemOperand(a1, GlobalObject::kGlobalReceiverOffset));
|
| + // Push the hole as receiver.
|
| + // It will be correctly replaced in the call stub.
|
| + __ LoadRoot(a1, Heap::kTheHoleValueRootIndex);
|
| __ push(a1);
|
| // Emit function call.
|
| - EmitCallWithStub(expr, NO_CALL_FUNCTION_FLAGS);
|
| + EmitCallWithStub(expr, RECEIVER_IS_IMPLICIT);
|
| }
|
|
|
| #ifdef DEBUG
|
| @@ -4213,7 +4198,7 @@ void FullCodeGenerator::VisitCallRuntime(CallRuntime* expr) {
|
| if (expr->is_jsruntime()) {
|
| // Call the JS runtime function.
|
| __ li(a2, Operand(expr->name()));
|
| - RelocInfo::Mode mode = RelocInfo::CODE_TARGET;
|
| + ContextualMode mode = NOT_CONTEXTUAL;
|
| Handle<Code> ic =
|
| isolate()->stub_cache()->ComputeCallInitialize(arg_count, mode);
|
| CallIC(ic, mode, expr->CallRuntimeFeedbackId());
|
| @@ -4467,7 +4452,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
|
|
|
| BinaryOpICStub stub(Token::ADD, NO_OVERWRITE);
|
| CallIC(stub.GetCode(isolate()),
|
| - RelocInfo::CODE_TARGET,
|
| + NOT_CONTEXTUAL,
|
| expr->CountBinOpFeedbackId());
|
| patch_site.EmitPatchInfo();
|
| __ bind(&done);
|
| @@ -4498,10 +4483,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
|
| __ mov(a0, result_register()); // Value.
|
| __ li(a2, Operand(prop->key()->AsLiteral()->value())); // Name.
|
| __ pop(a1); // Receiver.
|
| - Handle<Code> ic = is_classic_mode()
|
| - ? isolate()->builtins()->StoreIC_Initialize()
|
| - : isolate()->builtins()->StoreIC_Initialize_Strict();
|
| - CallIC(ic, RelocInfo::CODE_TARGET, expr->CountStoreFeedbackId());
|
| + CallStoreIC(NOT_CONTEXTUAL, expr->CountStoreFeedbackId());
|
| PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
|
| if (expr->is_postfix()) {
|
| if (!context()->IsEffect()) {
|
| @@ -4518,7 +4500,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
|
| Handle<Code> ic = is_classic_mode()
|
| ? isolate()->builtins()->KeyedStoreIC_Initialize()
|
| : isolate()->builtins()->KeyedStoreIC_Initialize_Strict();
|
| - CallIC(ic, RelocInfo::CODE_TARGET, expr->CountStoreFeedbackId());
|
| + CallIC(ic, NOT_CONTEXTUAL, expr->CountStoreFeedbackId());
|
| PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
|
| if (expr->is_postfix()) {
|
| if (!context()->IsEffect()) {
|
| @@ -4541,10 +4523,9 @@ void FullCodeGenerator::VisitForTypeofValue(Expression* expr) {
|
| Comment cmnt(masm_, "Global variable");
|
| __ lw(a0, GlobalObjectOperand());
|
| __ li(a2, Operand(proxy->name()));
|
| - Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
|
| // Use a regular load, not a contextual load, to avoid a reference
|
| // error.
|
| - CallIC(ic);
|
| + CallLoadIC(NOT_CONTEXTUAL);
|
| PrepareForBailout(expr, TOS_REG);
|
| context()->Plug(v0);
|
| } else if (proxy != NULL && proxy->var()->IsLookupSlot()) {
|
| @@ -4704,7 +4685,7 @@ void FullCodeGenerator::VisitCompareOperation(CompareOperation* expr) {
|
| // Record position and call the compare IC.
|
| SetSourcePosition(expr->position());
|
| Handle<Code> ic = CompareIC::GetUninitialized(isolate(), op);
|
| - CallIC(ic, RelocInfo::CODE_TARGET, expr->CompareOperationFeedbackId());
|
| + CallIC(ic, NOT_CONTEXTUAL, expr->CompareOperationFeedbackId());
|
| patch_site.EmitPatchInfo();
|
| PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
|
| Split(cc, v0, Operand(zero_reg), if_true, if_false, fall_through);
|
| @@ -4738,7 +4719,7 @@ void FullCodeGenerator::EmitLiteralCompareNil(CompareOperation* expr,
|
| Split(eq, a0, Operand(a1), if_true, if_false, fall_through);
|
| } else {
|
| Handle<Code> ic = CompareNilICStub::GetUninitialized(isolate(), nil);
|
| - CallIC(ic, RelocInfo::CODE_TARGET, expr->CompareOperationFeedbackId());
|
| + CallIC(ic, NOT_CONTEXTUAL, expr->CompareOperationFeedbackId());
|
| Split(ne, v0, Operand(zero_reg), if_true, if_false, fall_through);
|
| }
|
| context()->Plug(if_true, if_false);
|
|
|