Revision: 3514
Author: [email protected]
Date: Tue Dec 22 03:35:05 2009
Log: - Increased size of number string cache.
- Change the instruction order for inlined allocation.

Review URL: http://codereview.chromium.org/501170
http://code.google.com/p/v8/source/detail?r=3514

Modified:
  /branches/bleeding_edge/src/heap.cc
  /branches/bleeding_edge/src/heap.h
  /branches/bleeding_edge/src/ia32/macro-assembler-ia32.cc

=======================================
--- /branches/bleeding_edge/src/heap.cc Fri Dec 18 05:38:09 2009
+++ /branches/bleeding_edge/src/heap.cc Tue Dec 22 03:35:05 2009
@@ -1577,6 +1577,7 @@
    CreateFixedStubs();

    // Allocate the number->string conversion cache
+  ASSERT(IsPowerOf2(kNumberStringCacheSize));
    obj = AllocateFixedArray(kNumberStringCacheSize * 2);
    if (obj->IsFailure()) return false;
    set_number_string_cache(FixedArray::cast(obj));
@@ -1610,25 +1611,29 @@
  }


-static inline int double_get_hash(double d) {
-  DoubleRepresentation rep(d);
-  return ((static_cast<int>(rep.bits) ^ static_cast<int>(rep.bits >> 32)) &
-          (Heap::kNumberStringCacheSize - 1));
+static inline int NumberStringTruncateHash(int value) {
+  return (((value >> 16) ^ value)) & (Heap::kNumberStringCacheSize - 1);
  }


-static inline int smi_get_hash(Smi* smi) {
-  return (smi->value() & (Heap::kNumberStringCacheSize - 1));
+static inline int DoubleGetHash(double d) {
+  DoubleRepresentation rep(d);
+  int value = (static_cast<int>(rep.bits) ^ static_cast<int>(rep.bits >>  
32));
+  return NumberStringTruncateHash(value);
  }


+static inline int SmiGetHash(Smi* smi) {
+  return NumberStringTruncateHash(smi->value());
+}
+

  Object* Heap::GetNumberStringCache(Object* number) {
    int hash;
    if (number->IsSmi()) {
-    hash = smi_get_hash(Smi::cast(number));
+    hash = SmiGetHash(Smi::cast(number));
    } else {
-    hash = double_get_hash(number->Number());
+    hash = DoubleGetHash(number->Number());
    }
    Object* key = number_string_cache()->get(hash * 2);
    if (key == number) {
@@ -1645,10 +1650,10 @@
  void Heap::SetNumberStringCache(Object* number, String* string) {
    int hash;
    if (number->IsSmi()) {
-    hash = smi_get_hash(Smi::cast(number));
+    hash = SmiGetHash(Smi::cast(number));
      number_string_cache()->set(hash * 2, number, SKIP_WRITE_BARRIER);
    } else {
-    hash = double_get_hash(number->Number());
+    hash = DoubleGetHash(number->Number());
      number_string_cache()->set(hash * 2, number);
    }
    number_string_cache()->set(hash * 2 + 1, string);
=======================================
--- /branches/bleeding_edge/src/heap.h  Fri Dec 18 05:38:09 2009
+++ /branches/bleeding_edge/src/heap.h  Tue Dec 22 03:35:05 2009
@@ -821,7 +821,7 @@
    static void SetNumberStringCache(Object* number, String* str);

    // Entries in the cache.  Must be a power of 2.
-  static const int kNumberStringCacheSize = 64;
+  static const int kNumberStringCacheSize = 16*KB;

    // Adjusts the amount of registered external memory.
    // Returns the adjusted value.
=======================================
--- /branches/bleeding_edge/src/ia32/macro-assembler-ia32.cc    Mon Dec 21  
02:24:11 2009
+++ /branches/bleeding_edge/src/ia32/macro-assembler-ia32.cc    Tue Dec 22  
03:35:05 2009
@@ -729,13 +729,13 @@
    cmp(result_end, Operand::StaticVariable(new_space_allocation_limit));
    j(above, gc_required, not_taken);

-  // Update allocation top.
-  UpdateAllocationTopHelper(result_end, scratch);
-
    // Tag result if requested.
    if ((flags & TAG_OBJECT) != 0) {
      or_(Operand(result), Immediate(kHeapObjectTag));
    }
+
+  // Update allocation top.
+  UpdateAllocationTopHelper(result_end, scratch);
  }


@@ -759,13 +759,14 @@
    cmp(result_end, Operand::StaticVariable(new_space_allocation_limit));
    j(above, gc_required);

-  // Update allocation top.
-  UpdateAllocationTopHelper(result_end, scratch);
-
    // Tag result if requested.
    if ((flags & TAG_OBJECT) != 0) {
      or_(Operand(result), Immediate(kHeapObjectTag));
    }
+
+  // Update allocation top.
+  UpdateAllocationTopHelper(result_end, scratch);
+
  }


@@ -790,13 +791,13 @@
    cmp(result_end, Operand::StaticVariable(new_space_allocation_limit));
    j(above, gc_required, not_taken);

-  // Update allocation top.
-  UpdateAllocationTopHelper(result_end, scratch);
-
    // Tag result if requested.
    if ((flags & TAG_OBJECT) != 0) {
      or_(Operand(result), Immediate(kHeapObjectTag));
    }
+
+  // Update allocation top.
+  UpdateAllocationTopHelper(result_end, scratch);
  }


-- 
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to