Commit c471c9e8 authored by plind44@gmail.com's avatar plind44@gmail.com

MIPS: Customized support for feedback on calls to Array.

Port r21429 (a88ba79)

Original commit message:
Gather transition feedback on array calls, and inline the Array
function call when it makes sense.

BUG=
R=plind44@gmail.com

Review URL: https://codereview.chromium.org/293063012

Patch from Balazs Kilvady <kilvadyb@homejinni.com>.

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21445 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 9f3183f7
......@@ -3094,11 +3094,13 @@ static void EmitWrapCase(MacroAssembler* masm, int argc, Label* cont) {
}
void CallFunctionStub::Generate(MacroAssembler* masm) {
static void CallFunctionNoFeedback(MacroAssembler* masm,
int argc, bool needs_checks,
bool call_as_method) {
// a1 : the function to call
Label slow, non_function, wrap, cont;
if (NeedsChecks()) {
if (needs_checks) {
// Check that the function is really a JavaScript function.
// a1: pushed function (to be verified)
__ JumpIfSmi(a1, &non_function);
......@@ -3110,18 +3112,17 @@ void CallFunctionStub::Generate(MacroAssembler* masm) {
// Fast-case: Invoke the function now.
// a1: pushed function
int argc = argc_;
ParameterCount actual(argc);
if (CallAsMethod()) {
if (NeedsChecks()) {
if (call_as_method) {
if (needs_checks) {
EmitContinueIfStrictOrNative(masm, &cont);
}
// Compute the receiver in sloppy mode.
__ lw(a3, MemOperand(sp, argc * kPointerSize));
if (NeedsChecks()) {
if (needs_checks) {
__ JumpIfSmi(a3, &wrap);
__ GetObjectType(a3, t0, t0);
__ Branch(&wrap, lt, t0, Operand(FIRST_SPEC_OBJECT_TYPE));
......@@ -3134,13 +3135,13 @@ void CallFunctionStub::Generate(MacroAssembler* masm) {
__ InvokeFunction(a1, actual, JUMP_FUNCTION, NullCallWrapper());
if (NeedsChecks()) {
if (needs_checks) {
// Slow-case: Non-function called.
__ bind(&slow);
EmitSlowCase(masm, argc, &non_function);
}
if (CallAsMethod()) {
if (call_as_method) {
__ bind(&wrap);
// Wrap the receiver and patch it back onto the stack.
EmitWrapCase(masm, argc, &cont);
......@@ -3148,6 +3149,11 @@ void CallFunctionStub::Generate(MacroAssembler* masm) {
}
void CallFunctionStub::Generate(MacroAssembler* masm) {
CallFunctionNoFeedback(masm, argc_, NeedsChecks(), CallAsMethod());
}
void CallConstructStub::Generate(MacroAssembler* masm) {
// a0 : number of arguments
// a1 : the function to call
......@@ -3207,8 +3213,8 @@ void CallConstructStub::Generate(MacroAssembler* masm) {
__ bind(&do_call);
// Set expected number of arguments to zero (not changing r0).
__ li(a2, Operand(0, RelocInfo::NONE32));
__ Jump(isolate()->builtins()->ArgumentsAdaptorTrampoline(),
RelocInfo::CODE_TARGET);
__ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(),
RelocInfo::CODE_TARGET);
}
......@@ -3221,6 +3227,51 @@ static void EmitLoadTypeFeedbackVector(MacroAssembler* masm, Register vector) {
}
void CallICStub::Generate_MonomorphicArray(MacroAssembler* masm, Label* miss) {
// a1 - function
// a2 - feedback vector
// a3 - slot id
__ LoadGlobalFunction(Context::ARRAY_FUNCTION_INDEX, at);
__ Branch(miss, ne, a1, Operand(at));
__ li(a0, Operand(arg_count()));
__ sll(at, a3, kPointerSizeLog2 - kSmiTagSize);
__ Addu(at, a2, Operand(at));
__ lw(a2, FieldMemOperand(at, FixedArray::kHeaderSize));
// Verify that a2 contains an AllocationSite
__ AssertUndefinedOrAllocationSite(a2, at);
ArrayConstructorStub stub(masm->isolate(), arg_count());
__ TailCallStub(&stub);
}
void CallICStub::Generate_CustomFeedbackCall(MacroAssembler* masm) {
// a1 - function
// a2 - feedback vector
// a3 - slot id
Label miss;
if (state_.stub_type() == CallIC::MONOMORPHIC_ARRAY) {
Generate_MonomorphicArray(masm, &miss);
} else {
// So far there is only one customer for our custom feedback scheme.
UNREACHABLE();
}
__ bind(&miss);
GenerateMiss(masm);
// The slow case, we need this no matter what to complete a call after a miss.
CallFunctionNoFeedback(masm,
arg_count(),
true,
CallAsMethod());
// Unreachable.
__ stop("Unexpected code address");
}
void CallICStub::Generate(MacroAssembler* masm) {
// r1 - function
// r3 - slot id (Smi)
......@@ -3232,6 +3283,11 @@ void CallICStub::Generate(MacroAssembler* masm) {
EmitLoadTypeFeedbackVector(masm, a2);
if (state_.stub_type() != CallIC::DEFAULT) {
Generate_CustomFeedbackCall(masm);
return;
}
// The checks. First, does r1 match the recorded monomorphic target?
__ sll(t0, a3, kPointerSizeLog2 - kSmiTagSize);
__ Addu(t0, a2, Operand(t0));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment