Reviewers: Benedikt Meurer, Sven Panne, Rodolph Perfetta,
Message:
On 2013/09/03 14:47:06, Rodolph Perfetta wrote:
DBC
https://codereview.chromium.org/23480027/diff/3001/src/arm/macro-assembler-arm.cc
File src/arm/macro-assembler-arm.cc (right):
https://codereview.chromium.org/23480027/diff/3001/src/arm/macro-assembler-arm.cc#newcode3199
src/arm/macro-assembler-arm.cc:3199: tst(src, Operand(kPointerSize - 1));
This code could be improve further, see the tail end of the copy in
codegen-arm.cc:CreateMemCopyUint8Function.
https://codereview.chromium.org/23480027/diff/3001/src/arm/macro-assembler-arm.cc#newcode3247
src/arm/macro-assembler-arm.cc:3247: bind(&byte_loop);
here too you could avoid the small loop.
Good suggestion, I am working on it.
Thanks a lot.
Description:
The current CopyBytes() doesn't fully support unaligned copies. This patch
supports unaligned word copy with software alignment if ARM HW supports.
In worst case, the optimized CopyBytes() could speed up by 3 times.
BUG=NONE
TEST=NONE
Please review this at https://codereview.chromium.org/23480027/
SVN Base: git://github.com/v8/v8.git@master
Affected files:
M src/arm/macro-assembler-arm.cc
Index: src/arm/macro-assembler-arm.cc
diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc
index
7628f23a5be9f137b24bc184bc7c2ba664f8ef5c..e1ff88e93f1bb8ca64809357203f0dfa23c7d17e
100644
--- a/src/arm/macro-assembler-arm.cc
+++ b/src/arm/macro-assembler-arm.cc
@@ -3186,37 +3186,52 @@ void MacroAssembler::CopyFields(Register dst,
}
}
-
void MacroAssembler::CopyBytes(Register src,
Register dst,
Register length,
Register scratch) {
- Label align_loop, align_loop_1, word_loop, byte_loop, byte_loop_1, done;
+ Label word_loop, byte_loop, byte_loop_1, done;
+
+ cmp(length, Operand(8));
+ b(lt, &byte_loop);
// Align src before copying in word size chunks.
- bind(&align_loop);
- cmp(length, Operand::Zero());
- b(eq, &done);
- bind(&align_loop_1);
tst(src, Operand(kPointerSize - 1));
b(eq, &word_loop);
+
+ ldrb(scratch, MemOperand(src, 1, PostIndex));
+ sub(length, length, Operand(1));
+ tst(src, Operand(kPointerSize - 1));
+ strb(scratch, MemOperand(dst, 1, PostIndex));
+ b(eq, &word_loop);
+
ldrb(scratch, MemOperand(src, 1, PostIndex));
+ sub(length, length, Operand(1));
+ tst(src, Operand(kPointerSize - 1));
+ strb(scratch, MemOperand(dst, 1, PostIndex));
+ b(eq, &word_loop);
+
+ ldrb(scratch, MemOperand(src, 1, PostIndex));
+ sub(length, length, Operand(1));
strb(scratch, MemOperand(dst, 1, PostIndex));
- sub(length, length, Operand(1), SetCC);
- b(ne, &byte_loop_1);
// Copy bytes in word size chunks.
bind(&word_loop);
- if (emit_debug_code()) {
- tst(src, Operand(kPointerSize - 1));
- Assert(eq, kExpectingAlignmentForCopyBytes);
- }
- cmp(length, Operand(kPointerSize));
- b(lt, &byte_loop);
- ldr(scratch, MemOperand(src, kPointerSize, PostIndex));
+
if (CpuFeatures::IsSupported(UNALIGNED_ACCESSES)) {
+ ldr(scratch, MemOperand(src, kPointerSize, PostIndex));
+ sub(length, length, Operand(kPointerSize));
+ cmp(length, Operand(kPointerSize));
str(scratch, MemOperand(dst, kPointerSize, PostIndex));
} else {
+ if (emit_debug_code()) {
+ tst(src, Operand(kPointerSize - 1));
+ Assert(eq, kExpectingAlignmentForCopyBytes);
+ }
+ cmp(length, Operand(kPointerSize));
+ b(lt, &byte_loop);
+ ldr(scratch, MemOperand(src, kPointerSize, PostIndex));
+ sub(length, length, Operand(kPointerSize));
strb(scratch, MemOperand(dst, 1, PostIndex));
mov(scratch, Operand(scratch, LSR, 8));
strb(scratch, MemOperand(dst, 1, PostIndex));
@@ -3225,8 +3240,8 @@ void MacroAssembler::CopyBytes(Register src,
mov(scratch, Operand(scratch, LSR, 8));
strb(scratch, MemOperand(dst, 1, PostIndex));
}
- sub(length, length, Operand(kPointerSize));
- b(&word_loop);
+
+ b(ge, &word_loop);
// Copy the last bytes if any left.
bind(&byte_loop);
@@ -3234,13 +3249,12 @@ void MacroAssembler::CopyBytes(Register src,
b(eq, &done);
bind(&byte_loop_1);
ldrb(scratch, MemOperand(src, 1, PostIndex));
- strb(scratch, MemOperand(dst, 1, PostIndex));
sub(length, length, Operand(1), SetCC);
+ strb(scratch, MemOperand(dst, 1, PostIndex));
b(ne, &byte_loop_1);
bind(&done);
}
-
void MacroAssembler::InitializeFieldsWithFiller(Register start_offset,
Register end_offset,
Register filler) {
--
--
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.