Reviewers: Sven Panne,

Message:
It improves the array.join by 30% for short cases and less than 1% regression
for long cases.


Micros

function foo() {
    var fruits = ["Banana", "Orange", "Apple", "Mango"];
    var energy = fruits.join();
    return energy;
}

function fooLong() {
    var fruits = ["BananaBananaBananaBananaBanana",
"OrangeOrangeOrangeOrangeOrange", "AppleAppleAppleAppleAppleAppleApple",
"MangoMangoMangoMangoMangoMangoMango"];
    var energy = fruits.join();
    return energy;
}

Description:
Refine CopyBytes macro instruction in IA32

Use DWORD copy for more short cases

BUG=

Please review this at https://codereview.chromium.org/66073003/

SVN Base: git://github.com/v8/v8.git@master

Affected files (+25, -7 lines):
  M src/ia32/macro-assembler-ia32.cc


Index: src/ia32/macro-assembler-ia32.cc
diff --git a/src/ia32/macro-assembler-ia32.cc b/src/ia32/macro-assembler-ia32.cc index 8414f85d656eb7b9b67029d628eceb43b6e1e3b1..6b38801d4122e7b120b40171389b3f9d6fec6305 100644
--- a/src/ia32/macro-assembler-ia32.cc
+++ b/src/ia32/macro-assembler-ia32.cc
@@ -1986,30 +1986,48 @@ void MacroAssembler::CopyBytes(Register source,
                                Register destination,
                                Register length,
                                Register scratch) {
-  Label loop, done, short_string, short_loop;
- // Experimentation shows that the short string loop is faster if length < 10.
-  cmp(length, Immediate(10));
-  j(less_equal, &short_string);
-
+  Label short_loop, len4, len8, len12, done, short_string;
   ASSERT(source.is(esi));
   ASSERT(destination.is(edi));
   ASSERT(length.is(ecx));
+  cmp(length, Immediate(4));
+  j(below_equal, &short_string, Label::kNear);

   // Because source is 4-byte aligned in our uses of this function,
   // we keep source aligned for the rep_movs call by copying the odd bytes
   // at the end of the ranges.
   mov(scratch, Operand(source, length, times_1, -4));
   mov(Operand(destination, length, times_1, -4), scratch);
+
+  cmp(length, Immediate(8));
+  j(below_equal, &len4, Label::kNear);
+  cmp(length, Immediate(12));
+  j(below_equal, &len8, Label::kNear);
+  cmp(length, Immediate(16));
+  j(below_equal, &len12, Label::kNear);
+
   mov(scratch, ecx);
   shr(ecx, 2);
   rep_movs();
   and_(scratch, Immediate(0x3));
   add(destination, scratch);
-  jmp(&done);
+  jmp(&done, Label::kNear);
+
+  bind(&len12);
+  mov(scratch, Operand(source, 8));
+  mov(Operand(destination, 8), scratch);
+  bind(&len8);
+  mov(scratch, Operand(source, 4));
+  mov(Operand(destination, 4), scratch);
+  bind(&len4);
+  mov(scratch, Operand(source, 0));
+  mov(Operand(destination, 0), scratch);
+  add(destination, length);
+  jmp(&done, Label::kNear);

   bind(&short_string);
   test(length, length);
-  j(zero, &done);
+  j(zero, &done, Label::kNear);

   bind(&short_loop);
   mov_b(scratch, Operand(source, 0));


--
--
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/groups/opt_out.

Reply via email to