Revision: 17044
Author:   [email protected]
Date:     Tue Oct  1 11:56:42 2013 UTC
Log: Lazily save double registers for HCallRuntime instructions within Hydrogen code stubs.

Right now we eagerly save all allocatable double registers upon
entry to every Hydrogen code stub that uses HCallRuntime, and
restore them when we return. Since the HCallRuntime is on the
fallback path for code stubs, this is both a waste of time and
stack space in almost every case.

This patch adds a flag to the HCallRuntime, which controls whether
the instruction saves the double register itself (using the save
doubles flag for the CEntryStub), or whether its up the surrounding
code to handle the clobbering of double registers.

[email protected]

Review URL: https://codereview.chromium.org/23530066
http://code.google.com/p/v8/source/detail?r=17044

Modified:
 /branches/bleeding_edge/src/arm/lithium-arm.cc
 /branches/bleeding_edge/src/arm/lithium-arm.h
 /branches/bleeding_edge/src/arm/lithium-codegen-arm.cc
 /branches/bleeding_edge/src/arm/lithium-codegen-arm.h
 /branches/bleeding_edge/src/arm/macro-assembler-arm.cc
 /branches/bleeding_edge/src/arm/macro-assembler-arm.h
 /branches/bleeding_edge/src/hydrogen-instructions.cc
 /branches/bleeding_edge/src/hydrogen-instructions.h
 /branches/bleeding_edge/src/hydrogen.h
 /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc
 /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.h
 /branches/bleeding_edge/src/ia32/lithium-ia32.cc
 /branches/bleeding_edge/src/ia32/lithium-ia32.h
 /branches/bleeding_edge/src/ia32/macro-assembler-ia32.cc
 /branches/bleeding_edge/src/ia32/macro-assembler-ia32.h
 /branches/bleeding_edge/src/x64/lithium-codegen-x64.cc
 /branches/bleeding_edge/src/x64/lithium-codegen-x64.h
 /branches/bleeding_edge/src/x64/lithium-x64.cc
 /branches/bleeding_edge/src/x64/lithium-x64.h
 /branches/bleeding_edge/src/x64/macro-assembler-x64.cc
 /branches/bleeding_edge/src/x64/macro-assembler-x64.h

=======================================
--- /branches/bleeding_edge/src/arm/lithium-arm.cc Tue Oct 1 10:44:00 2013 UTC +++ /branches/bleeding_edge/src/arm/lithium-arm.cc Tue Oct 1 11:56:42 2013 UTC
@@ -863,6 +863,10 @@
   LInstruction* instr = current->CompileToLithium(this);

   if (instr != NULL) {
+    // Associate the hydrogen instruction first, since we may need it for
+    // the ClobbersRegisters() or ClobbersDoubleRegisters() calls below.
+    instr->set_hydrogen_value(current);
+
 #if DEBUG
     // Make sure that the lithium instruction has either no fixed register
     // constraints in temps or the result OR no uses that are only used at
@@ -899,7 +903,6 @@
     if (FLAG_stress_environments && !instr->HasEnvironment()) {
       instr = AssignEnvironment(instr);
     }
-    instr->set_hydrogen_value(current);
     chunk_->AddInstruction(instr, current_block_);
   }
   current_instruction_ = old_current;
=======================================
--- /branches/bleeding_edge/src/arm/lithium-arm.h Sat Sep 28 00:48:08 2013 UTC +++ /branches/bleeding_edge/src/arm/lithium-arm.h Tue Oct 1 11:56:42 2013 UTC
@@ -277,7 +277,7 @@
   // Interface to the register allocator and iterators.
   bool ClobbersTemps() const { return IsCall(); }
   bool ClobbersRegisters() const { return IsCall(); }
-  bool ClobbersDoubleRegisters() const { return IsCall(); }
+  virtual bool ClobbersDoubleRegisters() const { return IsCall(); }

   // Interface to the register allocator and iterators.
   bool IsMarkedAsCall() const { return IsCall(); }
@@ -2052,8 +2052,13 @@
   DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime")
   DECLARE_HYDROGEN_ACCESSOR(CallRuntime)

+  virtual bool ClobbersDoubleRegisters() const V8_OVERRIDE {
+    return save_doubles() == kDontSaveFPRegs;
+  }
+
const Runtime::Function* function() const { return hydrogen()->function(); }
   int arity() const { return hydrogen()->argument_count(); }
+ SaveFPRegsMode save_doubles() const { return hydrogen()->save_doubles(); }
 };


=======================================
--- /branches/bleeding_edge/src/arm/lithium-codegen-arm.cc Tue Oct 1 10:44:00 2013 UTC +++ /branches/bleeding_edge/src/arm/lithium-codegen-arm.cc Tue Oct 1 11:56:42 2013 UTC
@@ -750,13 +750,15 @@

 void LCodeGen::CallRuntime(const Runtime::Function* function,
                            int num_arguments,
-                           LInstruction* instr) {
+                           LInstruction* instr,
+                           SaveFPRegsMode save_doubles) {
   ASSERT(instr != NULL);
   LPointerMap* pointers = instr->pointer_map();
   ASSERT(pointers != NULL);
   RecordPosition(pointers->position());

-  __ CallRuntime(function, num_arguments);
+  __ CallRuntime(function, num_arguments, save_doubles);
+
   RecordSafepointWithLazyDeopt(instr, RECORD_SIMPLE_SAFEPOINT);
 }

=======================================
--- /branches/bleeding_edge/src/arm/lithium-codegen-arm.h Fri Sep 27 13:59:28 2013 UTC +++ /branches/bleeding_edge/src/arm/lithium-codegen-arm.h Tue Oct 1 11:56:42 2013 UTC
@@ -249,7 +249,8 @@

   void CallRuntime(const Runtime::Function* function,
                    int num_arguments,
-                   LInstruction* instr);
+                   LInstruction* instr,
+                   SaveFPRegsMode save_doubles = kDontSaveFPRegs);

   void CallRuntime(Runtime::FunctionId id,
                    int num_arguments,
=======================================
--- /branches/bleeding_edge/src/arm/macro-assembler-arm.cc Fri Sep 27 13:59:28 2013 UTC +++ /branches/bleeding_edge/src/arm/macro-assembler-arm.cc Tue Oct 1 11:56:42 2013 UTC
@@ -2617,7 +2617,8 @@


 void MacroAssembler::CallRuntime(const Runtime::Function* f,
-                                 int num_arguments) {
+                                 int num_arguments,
+                                 SaveFPRegsMode save_doubles) {
   // All parameters are on the stack.  r0 has the return value after call.

   // If the expected number of arguments of the runtime function is
@@ -2634,21 +2635,7 @@
   // smarter.
   mov(r0, Operand(num_arguments));
   mov(r1, Operand(ExternalReference(f, isolate())));
-  CEntryStub stub(1);
-  CallStub(&stub);
-}
-
-
-void MacroAssembler::CallRuntime(Runtime::FunctionId fid, int num_arguments) {
-  CallRuntime(Runtime::FunctionForId(fid), num_arguments);
-}
-
-
-void MacroAssembler::CallRuntimeSaveDoubles(Runtime::FunctionId id) {
-  const Runtime::Function* function = Runtime::FunctionForId(id);
-  mov(r0, Operand(function->nargs));
-  mov(r1, Operand(ExternalReference(function, isolate())));
-  CEntryStub stub(1, kSaveFPRegs);
+  CEntryStub stub(1, save_doubles);
   CallStub(&stub);
 }

=======================================
--- /branches/bleeding_edge/src/arm/macro-assembler-arm.h Mon Sep 23 15:01:33 2013 UTC +++ /branches/bleeding_edge/src/arm/macro-assembler-arm.h Tue Oct 1 11:56:42 2013 UTC
@@ -1045,11 +1045,18 @@
   void TailCallStub(CodeStub* stub, Condition cond = al);

   // Call a runtime routine.
-  void CallRuntime(const Runtime::Function* f, int num_arguments);
-  void CallRuntimeSaveDoubles(Runtime::FunctionId id);
+  void CallRuntime(const Runtime::Function* f,
+                   int num_arguments,
+                   SaveFPRegsMode save_doubles = kDontSaveFPRegs);
+  void CallRuntimeSaveDoubles(Runtime::FunctionId id) {
+    const Runtime::Function* function = Runtime::FunctionForId(id);
+    CallRuntime(function, function->nargs, kSaveFPRegs);
+  }

   // Convenience function: Same as above, but takes the fid instead.
-  void CallRuntime(Runtime::FunctionId fid, int num_arguments);
+  void CallRuntime(Runtime::FunctionId id, int num_arguments) {
+    CallRuntime(Runtime::FunctionForId(id), num_arguments);
+  }

   // Convenience function: call an external reference.
   void CallExternalReference(const ExternalReference& ext,
=======================================
--- /branches/bleeding_edge/src/hydrogen-instructions.cc Thu Sep 26 15:28:46 2013 UTC +++ /branches/bleeding_edge/src/hydrogen-instructions.cc Tue Oct 1 11:56:42 2013 UTC
@@ -973,6 +973,9 @@

 void HCallRuntime::PrintDataTo(StringStream* stream) {
   stream->Add("%o ", *name());
+  if (save_doubles() == kSaveFPRegs) {
+    stream->Add("[save doubles] ");
+  }
   stream->Add("#%d", argument_count());
 }

=======================================
--- /branches/bleeding_edge/src/hydrogen-instructions.h Fri Sep 27 13:48:19 2013 UTC +++ /branches/bleeding_edge/src/hydrogen-instructions.h Tue Oct 1 11:56:42 2013 UTC
@@ -2345,6 +2345,10 @@
   HValue* context() { return OperandAt(0); }
   const Runtime::Function* function() const { return c_function_; }
   Handle<String> name() const { return name_; }
+  SaveFPRegsMode save_doubles() const { return save_doubles_; }
+  void set_save_doubles(SaveFPRegsMode save_doubles) {
+    save_doubles_ = save_doubles;
+  }

virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
     return Representation::Tagged();
@@ -2357,12 +2361,14 @@
                Handle<String> name,
                const Runtime::Function* c_function,
                int argument_count)
-      : HCall<1>(argument_count), c_function_(c_function), name_(name) {
+      : HCall<1>(argument_count), c_function_(c_function), name_(name),
+        save_doubles_(kDontSaveFPRegs) {
     SetOperandAt(0, context);
   }

   const Runtime::Function* c_function_;
   Handle<String> name_;
+  SaveFPRegsMode save_doubles_;
 };


=======================================
--- /branches/bleeding_edge/src/hydrogen.h      Tue Oct  1 08:22:01 2013 UTC
+++ /branches/bleeding_edge/src/hydrogen.h      Tue Oct  1 11:56:42 2013 UTC
@@ -1705,6 +1705,23 @@
inline HInstruction* HGraphBuilder::AddUncasted<HReturn>(HConstant* value) {
   return AddUncasted<HReturn>(static_cast<HValue*>(value));
 }
+
+
+template<>
+inline HInstruction* HGraphBuilder::AddUncasted<HCallRuntime>(
+    Handle<String> name,
+    const Runtime::Function* c_function,
+    int argument_count) {
+ HCallRuntime* instr = New<HCallRuntime>(name, c_function, argument_count);
+  if (graph()->info()->IsStub()) {
+ // When compiling code stubs, we don't want to save all double registers + // upon entry to the stub, but instead have the call runtime instruction
+    // save the double registers only on-demand (in the fallback case).
+    instr->set_save_doubles(kSaveFPRegs);
+  }
+  AddInstruction(instr);
+  return instr;
+}


 template<>
=======================================
--- /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc Fri Sep 27 12:43:37 2013 UTC +++ /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc Tue Oct 1 11:56:42 2013 UTC
@@ -1000,13 +1000,14 @@

 void LCodeGen::CallRuntime(const Runtime::Function* fun,
                            int argc,
-                           LInstruction* instr) {
+                           LInstruction* instr,
+                           SaveFPRegsMode save_doubles) {
   ASSERT(instr != NULL);
   ASSERT(instr->HasPointerMap());
   LPointerMap* pointers = instr->pointer_map();
   RecordPosition(pointers->position());

-  __ CallRuntime(fun, argc);
+  __ CallRuntime(fun, argc, save_doubles);

   RecordSafepointWithLazyDeopt(instr, RECORD_SIMPLE_SAFEPOINT);

@@ -4445,7 +4446,7 @@


 void LCodeGen::DoCallRuntime(LCallRuntime* instr) {
-  CallRuntime(instr->function(), instr->arity(), instr);
+ CallRuntime(instr->function(), instr->arity(), instr, instr->save_doubles());
 }


=======================================
--- /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.h Tue Sep 24 09:29:00 2013 UTC +++ /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.h Tue Oct 1 11:56:42 2013 UTC
@@ -254,7 +254,8 @@

   void CallRuntime(const Runtime::Function* fun,
                    int argc,
-                   LInstruction* instr);
+                   LInstruction* instr,
+                   SaveFPRegsMode save_doubles = kDontSaveFPRegs);

   void CallRuntime(Runtime::FunctionId id,
                    int argc,
=======================================
--- /branches/bleeding_edge/src/ia32/lithium-ia32.cc Sat Sep 28 00:48:08 2013 UTC +++ /branches/bleeding_edge/src/ia32/lithium-ia32.cc Tue Oct 1 11:56:42 2013 UTC
@@ -912,6 +912,10 @@
   LInstruction* instr = current->CompileToLithium(this);

   if (instr != NULL) {
+    // Associate the hydrogen instruction first, since we may need it for
+    // the ClobbersRegisters() or ClobbersDoubleRegisters() calls below.
+    instr->set_hydrogen_value(current);
+
 #if DEBUG
     // Make sure that the lithium instruction has either no fixed register
     // constraints in temps or the result OR no uses that are only used at
@@ -958,7 +962,6 @@
       clobber->set_hydrogen_value(current);
       chunk_->AddInstruction(clobber, current_block_);
     }
-    instr->set_hydrogen_value(current);
     chunk_->AddInstruction(instr, current_block_);
   }
   current_instruction_ = old_current;
=======================================
--- /branches/bleeding_edge/src/ia32/lithium-ia32.h Sat Sep 28 00:48:08 2013 UTC +++ /branches/bleeding_edge/src/ia32/lithium-ia32.h Tue Oct 1 11:56:42 2013 UTC
@@ -2052,8 +2052,13 @@
   DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime")
   DECLARE_HYDROGEN_ACCESSOR(CallRuntime)

+  virtual bool ClobbersDoubleRegisters() const V8_OVERRIDE {
+    return save_doubles() == kDontSaveFPRegs;
+  }
+
const Runtime::Function* function() const { return hydrogen()->function(); }
   int arity() const { return hydrogen()->argument_count(); }
+ SaveFPRegsMode save_doubles() const { return hydrogen()->save_doubles(); }
 };


=======================================
--- /branches/bleeding_edge/src/ia32/macro-assembler-ia32.cc Fri Sep 20 09:27:40 2013 UTC +++ /branches/bleeding_edge/src/ia32/macro-assembler-ia32.cc Tue Oct 1 11:56:42 2013 UTC
@@ -2147,25 +2147,11 @@
     mov(index, hash);
   }
 }
-
-
-void MacroAssembler::CallRuntime(Runtime::FunctionId id, int num_arguments) {
-  CallRuntime(Runtime::FunctionForId(id), num_arguments);
-}
-
-
-void MacroAssembler::CallRuntimeSaveDoubles(Runtime::FunctionId id) {
-  const Runtime::Function* function = Runtime::FunctionForId(id);
-  Set(eax, Immediate(function->nargs));
-  mov(ebx, Immediate(ExternalReference(function, isolate())));
-  CEntryStub ces(1, CpuFeatures::IsSupported(SSE2) ? kSaveFPRegs
-                                                   : kDontSaveFPRegs);
-  CallStub(&ces);
-}


 void MacroAssembler::CallRuntime(const Runtime::Function* f,
-                                 int num_arguments) {
+                                 int num_arguments,
+                                 SaveFPRegsMode save_doubles) {
   // If the expected number of arguments of the runtime function is
   // constant, we check that the actual number of arguments match the
   // expectation.
@@ -2180,7 +2166,8 @@
   // smarter.
   Set(eax, Immediate(num_arguments));
   mov(ebx, Immediate(ExternalReference(f, isolate())));
-  CEntryStub ces(1);
+  CEntryStub ces(1, CpuFeatures::IsSupported(SSE2) ? save_doubles
+                                                   : kDontSaveFPRegs);
   CallStub(&ces);
 }

=======================================
--- /branches/bleeding_edge/src/ia32/macro-assembler-ia32.h Thu Sep 19 06:07:23 2013 UTC +++ /branches/bleeding_edge/src/ia32/macro-assembler-ia32.h Tue Oct 1 11:56:42 2013 UTC
@@ -760,11 +760,18 @@
   void StubReturn(int argc);

   // Call a runtime routine.
-  void CallRuntime(const Runtime::Function* f, int num_arguments);
-  void CallRuntimeSaveDoubles(Runtime::FunctionId id);
+  void CallRuntime(const Runtime::Function* f,
+                   int num_arguments,
+                   SaveFPRegsMode save_doubles = kDontSaveFPRegs);
+  void CallRuntimeSaveDoubles(Runtime::FunctionId id) {
+    const Runtime::Function* function = Runtime::FunctionForId(id);
+    CallRuntime(function, function->nargs, kSaveFPRegs);
+  }

   // Convenience function: Same as above, but takes the fid instead.
-  void CallRuntime(Runtime::FunctionId id, int num_arguments);
+  void CallRuntime(Runtime::FunctionId id, int num_arguments) {
+    CallRuntime(Runtime::FunctionForId(id), num_arguments);
+  }

   // Convenience function: call an external reference.
   void CallExternalReference(ExternalReference ref, int num_arguments);
=======================================
--- /branches/bleeding_edge/src/x64/lithium-codegen-x64.cc Fri Sep 27 12:43:37 2013 UTC +++ /branches/bleeding_edge/src/x64/lithium-codegen-x64.cc Tue Oct 1 11:56:42 2013 UTC
@@ -637,13 +637,15 @@

 void LCodeGen::CallRuntime(const Runtime::Function* function,
                            int num_arguments,
-                           LInstruction* instr) {
+                           LInstruction* instr,
+                           SaveFPRegsMode save_doubles) {
   ASSERT(instr != NULL);
   ASSERT(instr->HasPointerMap());
   LPointerMap* pointers = instr->pointer_map();
   RecordPosition(pointers->position());

-  __ CallRuntime(function, num_arguments);
+  __ CallRuntime(function, num_arguments, save_doubles);
+
   RecordSafepointWithLazyDeopt(instr, RECORD_SIMPLE_SAFEPOINT, 0);
 }

@@ -3906,7 +3908,7 @@


 void LCodeGen::DoCallRuntime(LCallRuntime* instr) {
-  CallRuntime(instr->function(), instr->arity(), instr);
+ CallRuntime(instr->function(), instr->arity(), instr, instr->save_doubles());
 }


=======================================
--- /branches/bleeding_edge/src/x64/lithium-codegen-x64.h Fri Sep 20 06:01:25 2013 UTC +++ /branches/bleeding_edge/src/x64/lithium-codegen-x64.h Tue Oct 1 11:56:42 2013 UTC
@@ -213,7 +213,8 @@

   void CallRuntime(const Runtime::Function* function,
                    int num_arguments,
-                   LInstruction* instr);
+                   LInstruction* instr,
+                   SaveFPRegsMode save_doubles = kDontSaveFPRegs);

   void CallRuntime(Runtime::FunctionId id,
                    int num_arguments,
=======================================
--- /branches/bleeding_edge/src/x64/lithium-x64.cc Sat Sep 28 00:48:08 2013 UTC +++ /branches/bleeding_edge/src/x64/lithium-x64.cc Tue Oct 1 11:56:42 2013 UTC
@@ -863,6 +863,10 @@
   LInstruction* instr = current->CompileToLithium(this);

   if (instr != NULL) {
+    // Associate the hydrogen instruction first, since we may need it for
+    // the ClobbersRegisters() or ClobbersDoubleRegisters() calls below.
+    instr->set_hydrogen_value(current);
+
 #if DEBUG
     // Make sure that the lithium instruction has either no fixed register
     // constraints in temps or the result OR no uses that are only used at
@@ -899,7 +903,6 @@
     if (FLAG_stress_environments && !instr->HasEnvironment()) {
       instr = AssignEnvironment(instr);
     }
-    instr->set_hydrogen_value(current);
     chunk_->AddInstruction(instr, current_block_);
   }
   current_instruction_ = old_current;
=======================================
--- /branches/bleeding_edge/src/x64/lithium-x64.h Sat Sep 28 00:48:08 2013 UTC +++ /branches/bleeding_edge/src/x64/lithium-x64.h Tue Oct 1 11:56:42 2013 UTC
@@ -272,7 +272,7 @@
   // Interface to the register allocator and iterators.
   bool ClobbersTemps() const { return IsCall(); }
   bool ClobbersRegisters() const { return IsCall(); }
-  bool ClobbersDoubleRegisters() const { return IsCall(); }
+  virtual bool ClobbersDoubleRegisters() const { return IsCall(); }

virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment* env) { }

@@ -1919,8 +1919,13 @@
   DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime")
   DECLARE_HYDROGEN_ACCESSOR(CallRuntime)

+  virtual bool ClobbersDoubleRegisters() const V8_OVERRIDE {
+    return save_doubles() == kDontSaveFPRegs;
+  }
+
const Runtime::Function* function() const { return hydrogen()->function(); }
   int arity() const { return hydrogen()->argument_count(); }
+ SaveFPRegsMode save_doubles() const { return hydrogen()->save_doubles(); }
 };


=======================================
--- /branches/bleeding_edge/src/x64/macro-assembler-x64.cc Mon Sep 30 13:36:39 2013 UTC +++ /branches/bleeding_edge/src/x64/macro-assembler-x64.cc Tue Oct 1 11:56:42 2013 UTC
@@ -603,24 +603,11 @@
   // there is no difference in using either key.
   Integer32ToSmi(index, hash);
 }
-
-
-void MacroAssembler::CallRuntime(Runtime::FunctionId id, int num_arguments) {
-  CallRuntime(Runtime::FunctionForId(id), num_arguments);
-}
-
-
-void MacroAssembler::CallRuntimeSaveDoubles(Runtime::FunctionId id) {
-  const Runtime::Function* function = Runtime::FunctionForId(id);
-  Set(rax, function->nargs);
-  LoadAddress(rbx, ExternalReference(function, isolate()));
-  CEntryStub ces(1, kSaveFPRegs);
-  CallStub(&ces);
-}


 void MacroAssembler::CallRuntime(const Runtime::Function* f,
-                                 int num_arguments) {
+                                 int num_arguments,
+                                 SaveFPRegsMode save_doubles) {
   // If the expected number of arguments of the runtime function is
   // constant, we check that the actual number of arguments match the
   // expectation.
@@ -635,7 +622,7 @@
   // smarter.
   Set(rax, num_arguments);
   LoadAddress(rbx, ExternalReference(f, isolate()));
-  CEntryStub ces(f->result_size);
+  CEntryStub ces(f->result_size, save_doubles);
   CallStub(&ces);
 }

=======================================
--- /branches/bleeding_edge/src/x64/macro-assembler-x64.h Mon Sep 30 13:36:39 2013 UTC +++ /branches/bleeding_edge/src/x64/macro-assembler-x64.h Tue Oct 1 11:56:42 2013 UTC
@@ -1239,13 +1239,20 @@
   void StubReturn(int argc);

   // Call a runtime routine.
-  void CallRuntime(const Runtime::Function* f, int num_arguments);
+  void CallRuntime(const Runtime::Function* f,
+                   int num_arguments,
+                   SaveFPRegsMode save_doubles = kDontSaveFPRegs);

   // Call a runtime function and save the value of XMM registers.
-  void CallRuntimeSaveDoubles(Runtime::FunctionId id);
+  void CallRuntimeSaveDoubles(Runtime::FunctionId id) {
+    const Runtime::Function* function = Runtime::FunctionForId(id);
+    CallRuntime(function, function->nargs, kSaveFPRegs);
+  }

   // Convenience function: Same as above, but takes the fid instead.
-  void CallRuntime(Runtime::FunctionId id, int num_arguments);
+  void CallRuntime(Runtime::FunctionId id, int num_arguments) {
+    CallRuntime(Runtime::FunctionForId(id), num_arguments);
+  }

   // Convenience function: call an external reference.
   void CallExternalReference(const ExternalReference& ext,

--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to