Minor adjustments to the object migration code: When copying
authorkasperl@chromium.org <kasperl@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 8 Oct 2008 09:01:10 +0000 (09:01 +0000)
committerkasperl@chromium.org <kasperl@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 8 Oct 2008 09:01:10 +0000 (09:01 +0000)
large objects we use memcpy. If this turns out to be a wash
on the benchmarks, I'd be happy to rip it out again.
Review URL: http://codereview.chromium.org/6576

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

src/heap.cc

index 9029819..c2bef29 100644 (file)
@@ -733,10 +733,20 @@ HeapObject* Heap::MigrateObject(HeapObject** source_p,
                                 int size) {
   void** src = reinterpret_cast<void**>((*source_p)->address());
   void** dst = reinterpret_cast<void**>(target->address());
-  int counter = size/kPointerSize - 1;
-  do {
-    *dst++ = *src++;
-  } while (counter-- > 0);
+
+  // Use block copying memcpy if the object we're migrating is big
+  // enough to justify the extra call/setup overhead.
+  static const int kBlockCopyLimit = 16 * kPointerSize;
+
+  if (size >= kBlockCopyLimit) {
+    memcpy(dst, src, size);
+  } else {
+    int remaining = size / kPointerSize;
+    do {
+      remaining--;
+      *dst++ = *src++;
+    } while (remaining > 0);
+  }
 
   // Set the forwarding address.
   (*source_p)->set_map_word(MapWord::FromForwardingAddress(target));