MIPS: port Handlify the stub cache lookup and patching for CallIC and KeyedCallIC.
Port r9729 (4aa1f5a6) BUG= TEST= Review URL: http://codereview.chromium.org/8365026 Patch from Paul Lind <plind44@gmail.com>. git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@9731 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
1959409f6d
commit
6c305c244e
@ -3616,24 +3616,16 @@ void MacroAssembler::InvokeFunction(JSFunction* function,
|
|||||||
// You can't call a function without a valid frame.
|
// You can't call a function without a valid frame.
|
||||||
ASSERT(flag == JUMP_FUNCTION || has_frame());
|
ASSERT(flag == JUMP_FUNCTION || has_frame());
|
||||||
|
|
||||||
ASSERT(function->is_compiled());
|
|
||||||
|
|
||||||
// Get the function and setup the context.
|
// Get the function and setup the context.
|
||||||
li(a1, Operand(Handle<JSFunction>(function)));
|
li(a1, Operand(Handle<JSFunction>(function)));
|
||||||
lw(cp, FieldMemOperand(a1, JSFunction::kContextOffset));
|
lw(cp, FieldMemOperand(a1, JSFunction::kContextOffset));
|
||||||
|
|
||||||
// Invoke the cached code.
|
|
||||||
Handle<Code> code(function->code());
|
|
||||||
ParameterCount expected(function->shared()->formal_parameter_count());
|
ParameterCount expected(function->shared()->formal_parameter_count());
|
||||||
if (V8::UseCrankshaft()) {
|
// We call indirectly through the code field in the function to
|
||||||
// TODO(kasperl): For now, we always call indirectly through the
|
// allow recompilation to take effect without changing any of the
|
||||||
// code field in the function to allow recompilation to take effect
|
// call sites.
|
||||||
// without changing any of the call sites.
|
lw(a3, FieldMemOperand(a1, JSFunction::kCodeEntryOffset));
|
||||||
lw(a3, FieldMemOperand(a1, JSFunction::kCodeEntryOffset));
|
InvokeCode(a3, expected, actual, flag, NullCallWrapper(), call_kind);
|
||||||
InvokeCode(a3, expected, actual, flag, NullCallWrapper(), call_kind);
|
|
||||||
} else {
|
|
||||||
InvokeCode(code, expected, actual, RelocInfo::CODE_TARGET, flag, call_kind);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1501,9 +1501,9 @@ void CallStubCompiler::GenerateLoadFunctionFromCell(JSGlobalPropertyCell* cell,
|
|||||||
|
|
||||||
MaybeObject* CallStubCompiler::GenerateMissBranch() {
|
MaybeObject* CallStubCompiler::GenerateMissBranch() {
|
||||||
MaybeObject* maybe_obj =
|
MaybeObject* maybe_obj =
|
||||||
isolate()->stub_cache()->ComputeCallMiss(arguments().immediate(),
|
isolate()->stub_cache()->TryComputeCallMiss(arguments().immediate(),
|
||||||
kind_,
|
kind_,
|
||||||
extra_ic_state_);
|
extra_state_);
|
||||||
Object* obj;
|
Object* obj;
|
||||||
if (!maybe_obj->ToObject(&obj)) return maybe_obj;
|
if (!maybe_obj->ToObject(&obj)) return maybe_obj;
|
||||||
__ Jump(Handle<Code>(Code::cast(obj)), RelocInfo::CODE_TARGET);
|
__ Jump(Handle<Code>(Code::cast(obj)), RelocInfo::CODE_TARGET);
|
||||||
@ -1534,7 +1534,7 @@ MaybeObject* CallStubCompiler::CompileCallField(JSObject* object,
|
|||||||
Register reg = CheckPrototypes(object, a0, holder, a1, a3, t0, name, &miss);
|
Register reg = CheckPrototypes(object, a0, holder, a1, a3, t0, name, &miss);
|
||||||
GenerateFastPropertyLoad(masm(), a1, reg, holder, index);
|
GenerateFastPropertyLoad(masm(), a1, reg, holder, index);
|
||||||
|
|
||||||
GenerateCallFunction(masm(), object, arguments(), &miss, extra_ic_state_);
|
GenerateCallFunction(masm(), object, arguments(), &miss, extra_state_);
|
||||||
|
|
||||||
// Handle call cache miss.
|
// Handle call cache miss.
|
||||||
__ bind(&miss);
|
__ bind(&miss);
|
||||||
@ -1853,7 +1853,7 @@ MaybeObject* CallStubCompiler::CompileStringCharCodeAtCall(
|
|||||||
Label* index_out_of_range_label = &index_out_of_range;
|
Label* index_out_of_range_label = &index_out_of_range;
|
||||||
|
|
||||||
if (kind_ == Code::CALL_IC &&
|
if (kind_ == Code::CALL_IC &&
|
||||||
(CallICBase::StringStubState::decode(extra_ic_state_) ==
|
(CallICBase::StringStubState::decode(extra_state_) ==
|
||||||
DEFAULT_STRING_STUB)) {
|
DEFAULT_STRING_STUB)) {
|
||||||
index_out_of_range_label = &miss;
|
index_out_of_range_label = &miss;
|
||||||
}
|
}
|
||||||
@ -1939,7 +1939,7 @@ MaybeObject* CallStubCompiler::CompileStringCharAtCall(
|
|||||||
Label* index_out_of_range_label = &index_out_of_range;
|
Label* index_out_of_range_label = &index_out_of_range;
|
||||||
|
|
||||||
if (kind_ == Code::CALL_IC &&
|
if (kind_ == Code::CALL_IC &&
|
||||||
(CallICBase::StringStubState::decode(extra_ic_state_) ==
|
(CallICBase::StringStubState::decode(extra_state_) ==
|
||||||
DEFAULT_STRING_STUB)) {
|
DEFAULT_STRING_STUB)) {
|
||||||
index_out_of_range_label = &miss;
|
index_out_of_range_label = &miss;
|
||||||
}
|
}
|
||||||
@ -2484,7 +2484,7 @@ MaybeObject* CallStubCompiler::CompileCallConstant(Object* object,
|
|||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
}
|
}
|
||||||
|
|
||||||
CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_)
|
CallKind call_kind = CallICBase::Contextual::decode(extra_state_)
|
||||||
? CALL_AS_FUNCTION
|
? CALL_AS_FUNCTION
|
||||||
: CALL_AS_METHOD;
|
: CALL_AS_METHOD;
|
||||||
__ InvokeFunction(function, arguments(), JUMP_FUNCTION, call_kind);
|
__ InvokeFunction(function, arguments(), JUMP_FUNCTION, call_kind);
|
||||||
@ -2521,7 +2521,7 @@ MaybeObject* CallStubCompiler::CompileCallInterceptor(JSObject* object,
|
|||||||
// Get the receiver from the stack.
|
// Get the receiver from the stack.
|
||||||
__ lw(a1, MemOperand(sp, argc * kPointerSize));
|
__ lw(a1, MemOperand(sp, argc * kPointerSize));
|
||||||
|
|
||||||
CallInterceptorCompiler compiler(this, arguments(), a2, extra_ic_state_);
|
CallInterceptorCompiler compiler(this, arguments(), a2, extra_state_);
|
||||||
MaybeObject* result = compiler.Compile(masm(),
|
MaybeObject* result = compiler.Compile(masm(),
|
||||||
object,
|
object,
|
||||||
holder,
|
holder,
|
||||||
@ -2541,7 +2541,7 @@ MaybeObject* CallStubCompiler::CompileCallInterceptor(JSObject* object,
|
|||||||
// Restore receiver.
|
// Restore receiver.
|
||||||
__ lw(a0, MemOperand(sp, argc * kPointerSize));
|
__ lw(a0, MemOperand(sp, argc * kPointerSize));
|
||||||
|
|
||||||
GenerateCallFunction(masm(), object, arguments(), &miss, extra_ic_state_);
|
GenerateCallFunction(masm(), object, arguments(), &miss, extra_state_);
|
||||||
|
|
||||||
// Handle call cache miss.
|
// Handle call cache miss.
|
||||||
__ bind(&miss);
|
__ bind(&miss);
|
||||||
@ -2595,23 +2595,17 @@ MaybeObject* CallStubCompiler::CompileCallGlobal(JSObject* object,
|
|||||||
// Jump to the cached code (tail call).
|
// Jump to the cached code (tail call).
|
||||||
Counters* counters = masm()->isolate()->counters();
|
Counters* counters = masm()->isolate()->counters();
|
||||||
__ IncrementCounter(counters->call_global_inline(), 1, a3, t0);
|
__ IncrementCounter(counters->call_global_inline(), 1, a3, t0);
|
||||||
ASSERT(function->is_compiled());
|
|
||||||
Handle<Code> code(function->code());
|
Handle<Code> code(function->code());
|
||||||
ParameterCount expected(function->shared()->formal_parameter_count());
|
ParameterCount expected(function->shared()->formal_parameter_count());
|
||||||
CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_)
|
CallKind call_kind = CallICBase::Contextual::decode(extra_state_)
|
||||||
? CALL_AS_FUNCTION
|
? CALL_AS_FUNCTION
|
||||||
: CALL_AS_METHOD;
|
: CALL_AS_METHOD;
|
||||||
if (V8::UseCrankshaft()) {
|
// We call indirectly through the code field in the function to
|
||||||
// TODO(kasperl): For now, we always call indirectly through the
|
// allow recompilation to take effect without changing any of the
|
||||||
// code field in the function to allow recompilation to take effect
|
// call sites.
|
||||||
// without changing any of the call sites.
|
__ lw(a3, FieldMemOperand(a1, JSFunction::kCodeEntryOffset));
|
||||||
__ lw(a3, FieldMemOperand(a1, JSFunction::kCodeEntryOffset));
|
__ InvokeCode(a3, expected, arguments(), JUMP_FUNCTION,
|
||||||
__ InvokeCode(a3, expected, arguments(), JUMP_FUNCTION,
|
NullCallWrapper(), call_kind);
|
||||||
NullCallWrapper(), call_kind);
|
|
||||||
} else {
|
|
||||||
__ InvokeCode(code, expected, arguments(), RelocInfo::CODE_TARGET,
|
|
||||||
JUMP_FUNCTION, call_kind);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle call cache miss.
|
// Handle call cache miss.
|
||||||
__ bind(&miss);
|
__ bind(&miss);
|
||||||
|
Loading…
Reference in New Issue
Block a user