MIPS: Fix performance regression on sunspider string-unpack-code.
authorplind44@gmail.com <plind44@gmail.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 19 Feb 2014 18:30:22 +0000 (18:30 +0000)
committerplind44@gmail.com <plind44@gmail.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 19 Feb 2014 18:30:22 +0000 (18:30 +0000)
Regression surfaced with r19009, but latent error was present since
r17767.

BUG=
R=dusan.milosavljevic@rt-rk.com

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

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

src/mips/stub-cache-mips.cc

index a6f050d..b1f2126 100644 (file)
@@ -1439,10 +1439,11 @@ Handle<Code> BaseLoadStoreStubCompiler::CompilePolymorphicIC(
   }
 
   Label number_case;
+  Register match = scratch1();
   Label* smi_target = IncludesNumberType(types) ? &number_case : &miss;
-  __ JumpIfSmi(receiver(), smi_target);
+  __ JumpIfSmi(receiver(), smi_target, match);  // Reg match is 0 if Smi.
 
-  Register map_reg = scratch1();
+  Register map_reg = scratch2();
 
   int receiver_count = types->length();
   int number_of_handled_maps = 0;
@@ -1452,12 +1453,15 @@ Handle<Code> BaseLoadStoreStubCompiler::CompilePolymorphicIC(
     Handle<Map> map = IC::TypeToMap(*type, isolate());
     if (!map->is_deprecated()) {
       number_of_handled_maps++;
+      // Check map and tail call if there's a match.
+      // Separate compare from branch, to provide path for above JumpIfSmi().
+      __ Subu(match, map_reg, Operand(map));
       if (type->Is(HeapType::Number())) {
         ASSERT(!number_case.is_unused());
         __ bind(&number_case);
       }
       __ Jump(handlers->at(current), RelocInfo::CODE_TARGET,
-          eq, map_reg, Operand(map));
+          eq, match, Operand(zero_reg));
     }
   }
   ASSERT(number_of_handled_maps != 0);