X64 implementation: GenerateAdaptor builtin.
authorwhesse@chromium.org <whesse@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 24 Jun 2009 15:02:46 +0000 (15:02 +0000)
committerwhesse@chromium.org <whesse@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 24 Jun 2009 15:02:46 +0000 (15:02 +0000)
Review URL: http://codereview.chromium.org/146085

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2266 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/x64/builtins-x64.cc

index e08de1d..1fe4a6c 100644 (file)
@@ -34,11 +34,20 @@ namespace internal {
 
 #define __ ACCESS_MASM(masm)
 
-void Builtins::Generate_Adaptor(MacroAssembler* masm,
-                                Builtins::CFunctionId id) {
-  masm->int3();  // UNIMPLEMENTED.
+void Builtins::Generate_Adaptor(MacroAssembler* masm, CFunctionId id) {
+  // TODO(1238487): Don't pass the function in a static variable.
+  ExternalReference passed = ExternalReference::builtin_passed_function();
+  __ movq(kScratchRegister, passed.address(), RelocInfo::EXTERNAL_REFERENCE);
+  __ movq(Operand(kScratchRegister, 0), rdi);
+
+  // The actual argument count has already been loaded into register
+  // rax, but JumpToBuiltin expects rax to contain the number of
+  // arguments including the receiver.
+  __ incq(rax);
+  __ JumpToBuiltin(ExternalReference(id));
 }
 
+
 static void EnterArgumentsAdaptorFrame(MacroAssembler* masm) {
   __ push(rbp);
   __ movq(rbp, rsp);
@@ -161,10 +170,12 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
 
 void Builtins::Generate_FunctionApply(MacroAssembler* masm) {
   masm->int3();  // UNIMPLEMENTED.
+  masm->movq(kScratchRegister, Immediate(0xBEFA));  // Debugging aid.
 }
 
 void Builtins::Generate_FunctionCall(MacroAssembler* masm) {
   masm->int3();  // UNIMPLEMENTED.
+  masm->movq(kScratchRegister, Immediate(0xBEFC));  // Debugging aid.
 }