Index: src/arm/code-stubs-arm.cc |
=================================================================== |
--- src/arm/code-stubs-arm.cc (revision 9318) |
+++ src/arm/code-stubs-arm.cc (working copy) |
@@ -859,6 +859,29 @@ |
} |
+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 @@ |
__ 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 @@ |
void CodeStub::GenerateStubsAheadOfTime() { |
+ WriteInt32ToHeapNumberStub::GenerateStubsAheadOfTime(); |
} |