Index: src/x64/macro-assembler-x64.cc |
=================================================================== |
--- src/x64/macro-assembler-x64.cc (revision 3824) |
+++ src/x64/macro-assembler-x64.cc (working copy) |
@@ -39,7 +39,6 @@ |
MacroAssembler::MacroAssembler(void* buffer, int size) |
: Assembler(buffer, size), |
- unresolved_(0), |
generating_stub_(false), |
allow_stub_calls_(true), |
code_object_(Heap::undefined_value()) { |
@@ -415,38 +414,31 @@ |
} |
-void MacroAssembler::GetBuiltinEntry(Register target, Builtins::JavaScript id) { |
- bool resolved; |
- Handle<Code> code = ResolveBuiltin(id, &resolved); |
+void MacroAssembler::InvokeBuiltin(Builtins::JavaScript id, InvokeFlag flag) { |
+ // Calls are not allowed in some stubs. |
+ ASSERT(flag == JUMP_FUNCTION || allow_stub_calls()); |
- const char* name = Builtins::GetName(id); |
- int argc = Builtins::GetArgumentsCount(id); |
- |
- movq(target, code, RelocInfo::EMBEDDED_OBJECT); |
- if (!resolved) { |
- uint32_t flags = |
- Bootstrapper::FixupFlagsArgumentsCount::encode(argc) | |
- Bootstrapper::FixupFlagsUseCodeObject::encode(true); |
- Unresolved entry = { pc_offset() - sizeof(intptr_t), flags, name }; |
- unresolved_.Add(entry); |
- } |
- addq(target, Immediate(Code::kHeaderSize - kHeapObjectTag)); |
+ // Rely on the assertion to check that the number of provided |
+ // arguments match the expected number of arguments. Fake a |
+ // parameter count to avoid emitting code to do the check. |
+ ParameterCount expected(0); |
+ GetBuiltinEntry(rdx, id); |
+ InvokeCode(rdx, expected, expected, flag); |
} |
-Handle<Code> MacroAssembler::ResolveBuiltin(Builtins::JavaScript id, |
- bool* resolved) { |
- // Move the builtin function into the temporary function slot by |
- // reading it from the builtins object. NOTE: We should be able to |
- // reduce this to two instructions by putting the function table in |
- // the global object instead of the "builtins" object and by using a |
- // real register for the function. |
- movq(rdx, Operand(rsi, Context::SlotOffset(Context::GLOBAL_INDEX))); |
- movq(rdx, FieldOperand(rdx, GlobalObject::kBuiltinsOffset)); |
+ |
+void MacroAssembler::GetBuiltinEntry(Register target, Builtins::JavaScript id) { |
+ // Load the JavaScript builtin function from the builtins object |
+ // using the target register as a scratch register. |
+ movq(target, Operand(rsi, Context::SlotOffset(Context::GLOBAL_INDEX))); |
+ movq(target, FieldOperand(target, GlobalObject::kBuiltinsOffset)); |
int builtins_offset = |
JSBuiltinsObject::kJSBuiltinsOffset + (id * kPointerSize); |
- movq(rdi, FieldOperand(rdx, builtins_offset)); |
- |
- return Builtins::GetCode(id, resolved); |
+ movq(rdi, FieldOperand(target, builtins_offset)); |
+ // Load the code entry point from the function into the target register. |
+ movq(target, FieldOperand(rdi, JSFunction::kSharedFunctionInfoOffset)); |
+ movq(target, FieldOperand(target, SharedFunctionInfo::kCodeOffset)); |
+ addq(target, Immediate(Code::kHeaderSize - kHeapObjectTag)); |
} |
@@ -1784,38 +1776,6 @@ |
#endif // ENABLE_DEBUGGER_SUPPORT |
-void MacroAssembler::InvokeBuiltin(Builtins::JavaScript id, InvokeFlag flag) { |
- bool resolved; |
- Handle<Code> code = ResolveBuiltin(id, &resolved); |
- |
- // Calls are not allowed in some stubs. |
- ASSERT(flag == JUMP_FUNCTION || allow_stub_calls()); |
- |
- // Rely on the assertion to check that the number of provided |
- // arguments match the expected number of arguments. Fake a |
- // parameter count to avoid emitting code to do the check. |
- ParameterCount expected(0); |
- InvokeCode(Handle<Code>(code), |
- expected, |
- expected, |
- RelocInfo::CODE_TARGET, |
- flag); |
- |
- const char* name = Builtins::GetName(id); |
- int argc = Builtins::GetArgumentsCount(id); |
- // The target address for the jump is stored as an immediate at offset |
- // kInvokeCodeAddressOffset. |
- if (!resolved) { |
- uint32_t flags = |
- Bootstrapper::FixupFlagsArgumentsCount::encode(argc) | |
- Bootstrapper::FixupFlagsUseCodeObject::encode(false); |
- Unresolved entry = |
- { pc_offset() - kCallTargetAddressOffset, flags, name }; |
- unresolved_.Add(entry); |
- } |
-} |
- |
- |
void MacroAssembler::InvokePrologue(const ParameterCount& expected, |
const ParameterCount& actual, |
Handle<Code> code_constant, |