X87: Use weak cells to embed maps in store handler.
authorcdai2 <chunyang.dai@intel.com>
Thu, 4 Dec 2014 04:32:42 +0000 (12:32 +0800)
committercdai2 <chunyang.dai@intel.com>
Thu, 4 Dec 2014 04:32:07 +0000 (04:32 +0000)
port 3fc9c9b665baaa434c672efcbff632a2eae86f56

original commit message:

  Use weak cells to embed maps in store handler.
  BUG=v8:3629
R=weiliang.lin@intel.com

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

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

src/ic/x87/handler-compiler-x87.cc
src/x87/macro-assembler-x87.cc
src/x87/macro-assembler-x87.h

index 909f97e..b23b235 100644 (file)
@@ -329,10 +329,23 @@ void NamedStoreHandlerCompiler::GenerateRestoreName(Label* label,
 }
 
 
-void NamedStoreHandlerCompiler::GenerateRestoreNameAndMap(
-    Handle<Name> name, Handle<Map> transition) {
+void NamedStoreHandlerCompiler::GenerateRestoreName(Handle<Name> name) {
   __ mov(this->name(), Immediate(name));
-  __ mov(StoreTransitionDescriptor::MapRegister(), Immediate(transition));
+}
+
+
+void NamedStoreHandlerCompiler::GenerateRestoreMap(Handle<Map> transition,
+                                                   Register scratch,
+                                                   Label* miss) {
+  Handle<WeakCell> cell = Map::WeakCellForMap(transition);
+  Register map_reg = StoreTransitionDescriptor::MapRegister();
+  DCHECK(!map_reg.is(scratch));
+  __ LoadWeakValue(map_reg, cell, miss);
+  if (transition->CanBeDeprecated()) {
+    __ mov(scratch, FieldOperand(map_reg, Map::kBitField3Offset));
+    __ and_(scratch, Immediate(Map::Deprecated::kMask));
+    __ j(not_zero, miss);
+  }
 }
 
 
index 0d23cff..9fa5c8e 100644 (file)
@@ -3087,18 +3087,6 @@ void MacroAssembler::CheckPageFlagForMap(
 }
 
 
-void MacroAssembler::CheckMapDeprecated(Handle<Map> map,
-                                        Register scratch,
-                                        Label* if_deprecated) {
-  if (map->CanBeDeprecated()) {
-    mov(scratch, map);
-    mov(scratch, FieldOperand(scratch, Map::kBitField3Offset));
-    and_(scratch, Immediate(Map::Deprecated::kMask));
-    j(not_zero, if_deprecated);
-  }
-}
-
-
 void MacroAssembler::JumpIfBlack(Register object,
                                  Register scratch0,
                                  Register scratch1,
index 32f58e9..16a323f 100644 (file)
@@ -93,10 +93,6 @@ class MacroAssembler: public Assembler {
       Label* condition_met,
       Label::Distance condition_met_distance = Label::kFar);
 
-  void CheckMapDeprecated(Handle<Map> map,
-                          Register scratch,
-                          Label* if_deprecated);
-
   // Check if object is in new space.  Jumps if the object is not in new space.
   // The register scratch can be object itself, but scratch will be clobbered.
   void JumpIfNotInNewSpace(Register object,