MIPS: CheckPrototypes uses weak cells to embed maps.
authorbalazs.kilvady <balazs.kilvady@imgtec.com>
Wed, 3 Dec 2014 17:37:01 +0000 (09:37 -0800)
committerCommit bot <commit-bot@chromium.org>
Wed, 3 Dec 2014 17:37:15 +0000 (17:37 +0000)
Port 062a032f50291ce181462226ff41b4ef9b11deba

BUG=v8:3629
LOG=N

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

Cr-Commit-Position: refs/heads/master@{#25645}

src/ic/mips/handler-compiler-mips.cc
src/ic/mips64/handler-compiler-mips64.cc

index 8a7b6aa..2a8d3b8 100644 (file)
@@ -412,11 +412,11 @@ Register PropertyHandlerCompiler::CheckPrototypes(
       __ lw(reg, FieldMemOperand(scratch1, Map::kPrototypeOffset));
     } else {
       Register map_reg = scratch1;
+      __ lw(map_reg, FieldMemOperand(reg, HeapObject::kMapOffset));
       if (depth != 1 || check == CHECK_ALL_MAPS) {
-        // CheckMap implicitly loads the map of |reg| into |map_reg|.
-        __ CheckMap(reg, map_reg, current_map, miss, DONT_DO_SMI_CHECK);
-      } else {
-        __ lw(map_reg, FieldMemOperand(reg, HeapObject::kMapOffset));
+        Handle<WeakCell> cell = Map::WeakCellForMap(current_map);
+        __ CmpWeakValue(scratch2, map_reg, cell);
+        __ Branch(miss, ne, scratch2, Operand(zero_reg));
       }
 
       // Check access rights to the global object.  This has to happen after
@@ -447,7 +447,10 @@ Register PropertyHandlerCompiler::CheckPrototypes(
 
   if (depth != 0 || check == CHECK_ALL_MAPS) {
     // Check the holder map.
-    __ CheckMap(reg, scratch1, current_map, miss, DONT_DO_SMI_CHECK);
+    __ lw(scratch1, FieldMemOperand(reg, HeapObject::kMapOffset));
+    Handle<WeakCell> cell = Map::WeakCellForMap(current_map);
+    __ CmpWeakValue(scratch2, scratch1, cell);
+    __ Branch(miss, ne, scratch2, Operand(zero_reg));
   }
 
   // Perform security check for access to the global object.
index d659db2..5e626c3 100644 (file)
@@ -412,11 +412,11 @@ Register PropertyHandlerCompiler::CheckPrototypes(
       __ ld(reg, FieldMemOperand(scratch1, Map::kPrototypeOffset));
     } else {
       Register map_reg = scratch1;
+      __ ld(map_reg, FieldMemOperand(reg, HeapObject::kMapOffset));
       if (depth != 1 || check == CHECK_ALL_MAPS) {
-        // CheckMap implicitly loads the map of |reg| into |map_reg|.
-        __ CheckMap(reg, map_reg, current_map, miss, DONT_DO_SMI_CHECK);
-      } else {
-        __ ld(map_reg, FieldMemOperand(reg, HeapObject::kMapOffset));
+        Handle<WeakCell> cell = Map::WeakCellForMap(current_map);
+        __ CmpWeakValue(scratch2, map_reg, cell);
+        __ Branch(miss, ne, scratch2, Operand(zero_reg));
       }
 
       // Check access rights to the global object.  This has to happen after
@@ -447,7 +447,10 @@ Register PropertyHandlerCompiler::CheckPrototypes(
 
   if (depth != 0 || check == CHECK_ALL_MAPS) {
     // Check the holder map.
-    __ CheckMap(reg, scratch1, current_map, miss, DONT_DO_SMI_CHECK);
+    __ ld(scratch1, FieldMemOperand(reg, HeapObject::kMapOffset));
+    Handle<WeakCell> cell = Map::WeakCellForMap(current_map);
+    __ CmpWeakValue(scratch2, scratch1, cell);
+    __ Branch(miss, ne, scratch2, Operand(zero_reg));
   }
 
   // Perform security check for access to the global object.