Index: src/ia32/macro-assembler-ia32.cc |
diff --git a/src/ia32/macro-assembler-ia32.cc b/src/ia32/macro-assembler-ia32.cc |
index c673727bb358e4162519a0694d301a129b7baed1..1bdd382604e47549b9335c713b5dcfbac7abab64 100644 |
--- a/src/ia32/macro-assembler-ia32.cc |
+++ b/src/ia32/macro-assembler-ia32.cc |
@@ -2010,30 +2010,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, &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)); |