Revision: 22418
Author:   [email protected]
Date:     Wed Jul 16 07:11:05 2014 UTC
Log:      Version 3.28.25 (based on bleeding_edge revision r22416)

Performance and stability improvements on all platforms.
http://code.google.com/p/v8/source/detail?r=22418

Modified:
 /trunk/ChangeLog
 /trunk/src/mips/codegen-mips.cc
 /trunk/src/mips/stub-cache-mips.cc
 /trunk/src/mips64/codegen-mips64.cc
 /trunk/src/mips64/stub-cache-mips64.cc
 /trunk/src/version.cc
 /trunk/src/x87/ic-x87.cc

=======================================
--- /trunk/ChangeLog    Wed Jul 16 00:04:33 2014 UTC
+++ /trunk/ChangeLog    Wed Jul 16 07:11:05 2014 UTC
@@ -1,3 +1,8 @@
+2014-07-16: Version 3.28.25
+
+        Performance and stability improvements on all platforms.
+
+
 2014-07-16: Version 3.28.24

Removed some copy-n-paste from StackFrame::Foo API entries (issue 3436).
=======================================
--- /trunk/src/mips/codegen-mips.cc     Tue Jul 15 09:27:33 2014 UTC
+++ /trunk/src/mips/codegen-mips.cc     Wed Jul 16 07:11:05 2014 UTC
@@ -786,7 +786,7 @@
                       HeapObject::kMapOffset,
                       target_map,
                       scratch2,
-                      kRAHasNotBeenSaved,
+                      kRAHasBeenSaved,
                       kDontSaveFPRegs,
                       OMIT_REMEMBERED_SET,
                       OMIT_SMI_CHECK);
@@ -794,8 +794,9 @@

   // Call into runtime if GC is required.
   __ bind(&gc_required);
+  __ lw(ra, MemOperand(sp, 0));
   __ Branch(USE_DELAY_SLOT, fail);
-  __ pop(ra);
+  __ addiu(sp, sp, kPointerSize);  // In delay slot.

   // Convert and copy elements.
   __ bind(&loop);
@@ -825,12 +826,12 @@
   // exponent
   __ sw(hole_upper, MemOperand(scratch3, Register::kExponentOffset));
   __ bind(&entry);
-  __ addiu(scratch3, scratch3, kDoubleSize);  // In delay slot.
+  __ addiu(scratch3, scratch3, kDoubleSize);

   __ Branch(&loop, lt, scratch3, Operand(array_end));

+  __ bind(&done);
   __ pop(ra);
-  __ bind(&done);
 }


=======================================
--- /trunk/src/mips/stub-cache-mips.cc  Wed Jul 16 00:04:33 2014 UTC
+++ /trunk/src/mips/stub-cache-mips.cc  Wed Jul 16 07:11:05 2014 UTC
@@ -1384,12 +1384,12 @@
   }

   Label number_case;
-  Register match = scratch1();
+  Register match = scratch2();
   Label* smi_target = IncludesNumberType(types) ? &number_case : &miss;
   __ JumpIfSmi(receiver(), smi_target, match);  // Reg match is 0 if Smi.

   // Polymorphic keyed stores may use the map register
-  Register map_reg = scratch2();
+  Register map_reg = scratch1();
   ASSERT(kind() != Code::KEYED_STORE_IC ||
          map_reg.is(KeyedStoreIC::MapRegister()));

=======================================
--- /trunk/src/mips64/codegen-mips64.cc Tue Jul 15 09:27:33 2014 UTC
+++ /trunk/src/mips64/codegen-mips64.cc Wed Jul 16 07:11:05 2014 UTC
@@ -661,17 +661,17 @@
   __ SmiScale(array_end, length, kDoubleSizeLog2);
   __ Daddu(array_end, array_end, scratch3);

-// Repurpose registers no longer in use.
+  // Repurpose registers no longer in use.
   Register hole_lower = elements;
   Register hole_upper = length;
   __ li(hole_lower, Operand(kHoleNanLower32));
-  __ li(hole_upper, Operand(kHoleNanUpper32));
   // scratch1: begin of source FixedArray element fields, not tagged
   // hole_lower: kHoleNanLower32
   // hole_upper: kHoleNanUpper32
   // array_end: end of destination FixedDoubleArray, not tagged
   // scratch3: begin of FixedDoubleArray element fields, not tagged
-  __ Branch(&entry);
+  __ Branch(USE_DELAY_SLOT, &entry);
+  __ li(hole_upper, Operand(kHoleNanUpper32));  // In delay slot.

   __ bind(&only_change_map);
   __ sd(target_map, FieldMemOperand(receiver, HeapObject::kMapOffset));
@@ -679,7 +679,7 @@
                       HeapObject::kMapOffset,
                       target_map,
                       scratch2,
-                      kRAHasNotBeenSaved,
+                      kRAHasBeenSaved,
                       kDontSaveFPRegs,
                       OMIT_REMEMBERED_SET,
                       OMIT_SMI_CHECK);
@@ -687,8 +687,9 @@

   // Call into runtime if GC is required.
   __ bind(&gc_required);
-  __ pop(ra);
-  __ Branch(fail);
+  __ ld(ra, MemOperand(sp, 0));
+  __ Branch(USE_DELAY_SLOT, fail);
+  __ daddiu(sp, sp, kPointerSize);  // In delay slot.

   // Convert and copy elements.
   __ bind(&loop);
@@ -702,9 +703,8 @@
   __ mtc1(scratch2, f0);
   __ cvt_d_w(f0, f0);
   __ sdc1(f0, MemOperand(scratch3));
-  __ Daddu(scratch3, scratch3, kDoubleSize);
-
-  __ Branch(&entry);
+  __ Branch(USE_DELAY_SLOT, &entry);
+  __ daddiu(scratch3, scratch3, kDoubleSize);  // In delay slot.

   // Hole found, store the-hole NaN.
   __ bind(&convert_hole);
@@ -723,8 +723,8 @@
   __ bind(&entry);
   __ Branch(&loop, lt, scratch3, Operand(array_end));

+  __ bind(&done);
   __ pop(ra);
-  __ bind(&done);
 }


=======================================
--- /trunk/src/mips64/stub-cache-mips64.cc      Wed Jul 16 00:04:33 2014 UTC
+++ /trunk/src/mips64/stub-cache-mips64.cc      Wed Jul 16 07:11:05 2014 UTC
@@ -1385,12 +1385,12 @@
   }

   Label number_case;
-  Register match = scratch1();
+  Register match = scratch2();
   Label* smi_target = IncludesNumberType(types) ? &number_case : &miss;
   __ JumpIfSmi(receiver(), smi_target, match);  // Reg match is 0 if Smi.

   // Polymorphic keyed stores may use the map register
-  Register map_reg = scratch2();
+  Register map_reg = scratch1();
   ASSERT(kind() != Code::KEYED_STORE_IC ||
          map_reg.is(KeyedStoreIC::MapRegister()));

=======================================
--- /trunk/src/version.cc       Wed Jul 16 00:04:33 2014 UTC
+++ /trunk/src/version.cc       Wed Jul 16 07:11:05 2014 UTC
@@ -34,7 +34,7 @@
 // system so their names cannot be changed without changing the scripts.
 #define MAJOR_VERSION     3
 #define MINOR_VERSION     28
-#define BUILD_NUMBER      24
+#define BUILD_NUMBER      25
 #define PATCH_LEVEL       0
 // Use 1 for candidates and 0 otherwise.
 // (Boolean macro values are not supported by all preprocessors.)
=======================================
--- /trunk/src/x87/ic-x87.cc    Wed Jul 16 00:04:33 2014 UTC
+++ /trunk/src/x87/ic-x87.cc    Wed Jul 16 07:11:05 2014 UTC
@@ -33,45 +33,6 @@
   __ cmp(type, JS_GLOBAL_PROXY_TYPE);
   __ j(equal, global_object);
 }
-
-
-// Generated code falls through if the receiver is a regular non-global
-// JS object with slow properties and no interceptors.
-static void GenerateNameDictionaryReceiverCheck(MacroAssembler* masm,
-                                                Register receiver,
-                                                Register r0,
-                                                Register r1,
-                                                Label* miss) {
-  // Register usage:
-  //   receiver: holds the receiver on entry and is unchanged.
-  //   r0: used to hold receiver instance type.
-  //       Holds the property dictionary on fall through.
-  //   r1: used to hold receivers map.
-
-  // Check that the receiver isn't a smi.
-  __ JumpIfSmi(receiver, miss);
-
-  // Check that the receiver is a valid JS object.
-  __ mov(r1, FieldOperand(receiver, HeapObject::kMapOffset));
-  __ movzx_b(r0, FieldOperand(r1, Map::kInstanceTypeOffset));
-  __ cmp(r0, FIRST_SPEC_OBJECT_TYPE);
-  __ j(below, miss);
-
-  // If this assert fails, we have to check upper bound too.
-  STATIC_ASSERT(LAST_TYPE == LAST_SPEC_OBJECT_TYPE);
-
-  GenerateGlobalInstanceTypeCheck(masm, r0, miss);
-
-  // Check for non-global object that requires access check.
-  __ test_b(FieldOperand(r1, Map::kBitFieldOffset),
-            (1 << Map::kIsAccessCheckNeeded) |
-            (1 << Map::kHasNamedInterceptor));
-  __ j(not_zero, miss);
-
-  __ mov(r0, FieldOperand(receiver, JSObject::kPropertiesOffset));
-  __ CheckMap(r0, masm->isolate()->factory()->hash_table_map(), miss,
-              DONT_DO_SMI_CHECK);
-}


 // Helper function used to load a property from a dictionary backing
@@ -942,30 +903,21 @@


 void LoadIC::GenerateNormal(MacroAssembler* masm) {
-  // ----------- S t a t e -------------
-  //  -- ecx    : name
-  //  -- edx    : receiver
-  //  -- esp[0] : return address
-  // -----------------------------------
-  ASSERT(edx.is(ReceiverRegister()));
-  ASSERT(ecx.is(NameRegister()));
+  Register dictionary = eax;
+  ASSERT(!dictionary.is(ReceiverRegister()));
+  ASSERT(!dictionary.is(NameRegister()));

-  Label miss, slow;
+  Label slow;

-  GenerateNameDictionaryReceiverCheck(masm, edx, eax, ebx, &miss);
-
-  // eax: elements
-  // Search the dictionary placing the result in eax.
-  GenerateDictionaryLoad(masm, &slow, eax, ecx, edi, ebx, eax);
+  __ mov(dictionary,
+         FieldOperand(ReceiverRegister(), JSObject::kPropertiesOffset));
+  GenerateDictionaryLoad(masm, &slow, dictionary, NameRegister(), edi, ebx,
+                         eax);
   __ ret(0);

   // Dictionary load failed, go slow (but don't miss).
   __ bind(&slow);
   GenerateRuntimeGetProperty(masm);
-
-  // Cache miss: Jump to runtime.
-  __ bind(&miss);
-  GenerateMiss(masm);
 }


@@ -1094,19 +1046,20 @@


 void StoreIC::GenerateNormal(MacroAssembler* masm) {
-  // Return address is on the stack.
-  Label miss, restore_miss;
+  Label restore_miss;
   Register receiver = ReceiverRegister();
   Register name = NameRegister();
   Register value = ValueRegister();
+  Register dictionary = ebx;

-  GenerateNameDictionaryReceiverCheck(masm, receiver, ebx, edi, &miss);
+  __ mov(dictionary, FieldOperand(receiver, JSObject::kPropertiesOffset));

   // A lot of registers are needed for storing to slow case
   // objects. Push and restore receiver but rely on
   // GenerateDictionaryStore preserving the value and name.
   __ push(receiver);
- GenerateDictionaryStore(masm, &restore_miss, ebx, name, value, receiver, edi);
+  GenerateDictionaryStore(masm, &restore_miss, dictionary, name, value,
+                          receiver, edi);
   __ Drop(1);
   Counters* counters = masm->isolate()->counters();
   __ IncrementCounter(counters->store_normal_hit(), 1);
@@ -1114,8 +1067,6 @@

   __ bind(&restore_miss);
   __ pop(receiver);
-
-  __ bind(&miss);
   __ IncrementCounter(counters->store_normal_miss(), 1);
   GenerateMiss(masm);
 }

--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to