Fix a harmless assert and a genuine bug in the GC-safety of stub
authorerik.corry@gmail.com <erik.corry@gmail.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Mon, 19 Sep 2011 07:38:48 +0000 (07:38 +0000)
committererik.corry@gmail.com <erik.corry@gmail.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Mon, 19 Sep 2011 07:38:48 +0000 (07:38 +0000)
generation on ARM without VFP3.
Review URL: http://codereview.chromium.org/7937004

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

src/arm/code-stubs-arm.cc
src/arm/code-stubs-arm.h

index 383803d103525577c202d8df33a029da7d09b041..8351ebe94bca281c2b5bb8b0777e88d23ba955d8 100644 (file)
@@ -859,6 +859,29 @@ void FloatingPointHelper::CallCCodeForDoubleOperation(
 }
 
 
+bool WriteInt32ToHeapNumberStub::CompilingCallsToThisStubIsGCSafe() {
+  // These variants are compiled ahead of time.  See next method.
+  if (the_int_.is(r1) && the_heap_number_.is(r0) && scratch_.is(r2)) {
+    return true;
+  }
+  if (the_int_.is(r2) && the_heap_number_.is(r0) && scratch_.is(r3)) {
+    return true;
+  }
+  // Other register combinations are generated as and when they are needed,
+  // so it is unsafe to call them from stubs (we can't generate a stub while
+  // we are generating a stub).
+  return false;
+}
+
+
+void WriteInt32ToHeapNumberStub::GenerateStubsAheadOfTime() {
+  WriteInt32ToHeapNumberStub stub1(r1, r0, r2);
+  WriteInt32ToHeapNumberStub stub2(r2, r0, r3);
+  Handle<Code> code1 = stub1.GetCode();
+  Handle<Code> code2 = stub2.GetCode();
+}
+
+
 // See comment for class.
 void WriteInt32ToHeapNumberStub::Generate(MacroAssembler* masm) {
   Label max_negative_int;
@@ -1199,6 +1222,8 @@ static void EmitTwoNonNanDoubleComparison(MacroAssembler* masm,
       __ vmov(d0, r0, r1);
       __ vmov(d1, r2, r3);
     }
+
+    AllowExternalCallThatCantCauseGC scope(masm);
     __ CallCFunction(ExternalReference::compare_doubles(masm->isolate()),
                      0, 2);
     __ pop(pc);  // Return.
@@ -3341,6 +3366,7 @@ bool CEntryStub::CompilingCallsToThisStubIsGCSafe() {
 
 
 void CodeStub::GenerateStubsAheadOfTime() {
+  WriteInt32ToHeapNumberStub::GenerateStubsAheadOfTime();
 }
 
 
index 2346077e9fc65b76d09c1d38e1f1801ed123ca8b..b14f9fc19380d4aa044428510916ff5d529c864e 100644 (file)
@@ -323,6 +323,9 @@ class WriteInt32ToHeapNumberStub : public CodeStub {
         the_heap_number_(the_heap_number),
         scratch_(scratch) { }
 
+  bool CompilingCallsToThisStubIsGCSafe();
+  static void GenerateStubsAheadOfTime();
+
  private:
   Register the_int_;
   Register the_heap_number_;