MIPS64: Reland r22082 "Replace HeapNumber as doublebox with an explicit MutableHeapN...
authordusan.milosavljevic@rt-rk.com <dusan.milosavljevic@rt-rk.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Tue, 15 Jul 2014 16:57:04 +0000 (16:57 +0000)
committerdusan.milosavljevic@rt-rk.com <dusan.milosavljevic@rt-rk.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Tue, 15 Jul 2014 16:57:04 +0000 (16:57 +0000)
Port r22129 (676bb14).

TEST=
BUG=
R=balazs.kilvady@imgtec.com, paul.lind@imgtec.com

Review URL: https://codereview.chromium.org/395803002

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

src/mips64/macro-assembler-mips64.cc
src/mips64/macro-assembler-mips64.h
src/mips64/stub-cache-mips64.cc

index 7b9683f..3d59b39 100644 (file)
@@ -3385,14 +3385,19 @@ void MacroAssembler::AllocateHeapNumber(Register result,
                                         Register scratch2,
                                         Register heap_number_map,
                                         Label* need_gc,
-                                        TaggingMode tagging_mode) {
+                                        TaggingMode tagging_mode,
+                                        MutableMode mode) {
   // Allocate an object in the heap for the heap number and tag it as a heap
   // object.
   Allocate(HeapNumber::kSize, result, scratch1, scratch2, need_gc,
            tagging_mode == TAG_RESULT ? TAG_OBJECT : NO_ALLOCATION_FLAGS);
 
+  Heap::RootListIndex map_index = mode == MUTABLE
+      ? Heap::kMutableHeapNumberMapRootIndex
+      : Heap::kHeapNumberMapRootIndex;
+  AssertIsRoot(heap_number_map, map_index);
+
   // Store heap number map in the allocated object.
-  AssertIsRoot(heap_number_map, Heap::kHeapNumberMapRootIndex);
   if (tagging_mode == TAG_RESULT) {
     sd(heap_number_map, FieldMemOperand(result, HeapObject::kMapOffset));
   } else {
index 04a3723..88cf773 100644 (file)
@@ -574,7 +574,9 @@ class MacroAssembler: public Assembler {
                           Register scratch2,
                           Register heap_number_map,
                           Label* gc_required,
-                          TaggingMode tagging_mode = TAG_RESULT);
+                          TaggingMode tagging_mode = TAG_RESULT,
+                          MutableMode mode = IMMUTABLE);
+
   void AllocateHeapNumberWithValue(Register result,
                                    FPURegister value,
                                    Register scratch1,
index 5260eb3..8a6b02e 100644 (file)
@@ -414,8 +414,9 @@ void StoreStubCompiler::GenerateStoreTransition(MacroAssembler* masm,
     }
   } else if (representation.IsDouble()) {
     Label do_store, heap_number;
-    __ LoadRoot(scratch3, Heap::kHeapNumberMapRootIndex);
-    __ AllocateHeapNumber(storage_reg, scratch1, scratch2, scratch3, slow);
+    __ LoadRoot(scratch3, Heap::kMutableHeapNumberMapRootIndex);
+    __ AllocateHeapNumber(storage_reg, scratch1, scratch2, scratch3, slow,
+                          TAG_RESULT, MUTABLE);
 
     __ JumpIfNotSmi(value_reg, &heap_number);
     __ SmiUntag(scratch1, value_reg);