MIPS: Port function call type-feedback cells to x64 and ARM.
Port r11391 (789b1078) BUG= TEST= Review URL: https://chromiumcodereview.appspot.com/10124013 Patch from Akos Palfi <palfia@homejinni.com>. git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@11401 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
91ccfce2d9
commit
29f0463536
@ -5402,9 +5402,9 @@ void CallFunctionStub::Generate(MacroAssembler* masm) {
|
|||||||
__ LoadRoot(at, Heap::kTheHoleValueRootIndex);
|
__ LoadRoot(at, Heap::kTheHoleValueRootIndex);
|
||||||
__ Branch(&call, ne, t0, Operand(at));
|
__ Branch(&call, ne, t0, Operand(at));
|
||||||
// Patch the receiver on the stack with the global receiver object.
|
// Patch the receiver on the stack with the global receiver object.
|
||||||
__ lw(a2, MemOperand(cp, Context::SlotOffset(Context::GLOBAL_INDEX)));
|
__ lw(a3, MemOperand(cp, Context::SlotOffset(Context::GLOBAL_INDEX)));
|
||||||
__ lw(a2, FieldMemOperand(a2, GlobalObject::kGlobalReceiverOffset));
|
__ lw(a3, FieldMemOperand(a3, GlobalObject::kGlobalReceiverOffset));
|
||||||
__ sw(a2, MemOperand(sp, argc_ * kPointerSize));
|
__ sw(a3, MemOperand(sp, argc_ * kPointerSize));
|
||||||
__ bind(&call);
|
__ bind(&call);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5412,8 +5412,12 @@ void CallFunctionStub::Generate(MacroAssembler* masm) {
|
|||||||
// a1: pushed function (to be verified)
|
// a1: pushed function (to be verified)
|
||||||
__ JumpIfSmi(a1, &non_function);
|
__ JumpIfSmi(a1, &non_function);
|
||||||
// Get the map of the function object.
|
// Get the map of the function object.
|
||||||
__ GetObjectType(a1, a2, a2);
|
__ GetObjectType(a1, a3, a3);
|
||||||
__ Branch(&slow, ne, a2, Operand(JS_FUNCTION_TYPE));
|
__ Branch(&slow, ne, a3, Operand(JS_FUNCTION_TYPE));
|
||||||
|
|
||||||
|
if (RecordCallTarget()) {
|
||||||
|
GenerateRecordCallTarget(masm);
|
||||||
|
}
|
||||||
|
|
||||||
// Fast-case: Invoke the function now.
|
// Fast-case: Invoke the function now.
|
||||||
// a1: pushed function
|
// a1: pushed function
|
||||||
@ -5438,8 +5442,17 @@ void CallFunctionStub::Generate(MacroAssembler* masm) {
|
|||||||
|
|
||||||
// Slow-case: Non-function called.
|
// Slow-case: Non-function called.
|
||||||
__ bind(&slow);
|
__ bind(&slow);
|
||||||
|
if (RecordCallTarget()) {
|
||||||
|
// If there is a call target cache, mark it megamorphic in the
|
||||||
|
// non-function case. MegamorphicSentinel is an immortal immovable
|
||||||
|
// object (undefined) so no write barrier is needed.
|
||||||
|
ASSERT_EQ(*TypeFeedbackCells::MegamorphicSentinel(masm->isolate()),
|
||||||
|
masm->isolate()->heap()->undefined_value());
|
||||||
|
__ LoadRoot(at, Heap::kUndefinedValueRootIndex);
|
||||||
|
__ sw(at, FieldMemOperand(a2, JSGlobalPropertyCell::kValueOffset));
|
||||||
|
}
|
||||||
// Check for function proxy.
|
// Check for function proxy.
|
||||||
__ Branch(&non_function, ne, a2, Operand(JS_FUNCTION_PROXY_TYPE));
|
__ Branch(&non_function, ne, a3, Operand(JS_FUNCTION_PROXY_TYPE));
|
||||||
__ push(a1); // Put proxy as additional argument.
|
__ push(a1); // Put proxy as additional argument.
|
||||||
__ li(a0, Operand(argc_ + 1, RelocInfo::NONE));
|
__ li(a0, Operand(argc_ + 1, RelocInfo::NONE));
|
||||||
__ li(a2, Operand(0, RelocInfo::NONE));
|
__ li(a2, Operand(0, RelocInfo::NONE));
|
||||||
|
@ -2388,6 +2388,18 @@ void FullCodeGenerator::EmitCallWithStub(Call* expr, CallFunctionFlags flags) {
|
|||||||
}
|
}
|
||||||
// Record source position for debugger.
|
// Record source position for debugger.
|
||||||
SetSourcePosition(expr->position());
|
SetSourcePosition(expr->position());
|
||||||
|
|
||||||
|
// Record call targets in unoptimized code, but not in the snapshot.
|
||||||
|
if (!Serializer::enabled()) {
|
||||||
|
flags = static_cast<CallFunctionFlags>(flags | RECORD_CALL_TARGET);
|
||||||
|
Handle<Object> uninitialized =
|
||||||
|
TypeFeedbackCells::UninitializedSentinel(isolate());
|
||||||
|
Handle<JSGlobalPropertyCell> cell =
|
||||||
|
isolate()->factory()->NewJSGlobalPropertyCell(uninitialized);
|
||||||
|
RecordTypeFeedbackCell(expr->id(), cell);
|
||||||
|
__ li(a2, Operand(cell));
|
||||||
|
}
|
||||||
|
|
||||||
CallFunctionStub stub(arg_count, flags);
|
CallFunctionStub stub(arg_count, flags);
|
||||||
__ lw(a1, MemOperand(sp, (arg_count + 1) * kPointerSize));
|
__ lw(a1, MemOperand(sp, (arg_count + 1) * kPointerSize));
|
||||||
__ CallStub(&stub);
|
__ CallStub(&stub);
|
||||||
|
Loading…
Reference in New Issue
Block a user