Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(167)

Unified Diff: src/arm/macro-assembler-arm.cc

Issue 23480027: ARM: Add tests for CopyBytes. (Closed) Base URL: git://github.com/v8/v8.git@master
Patch Set: ARM fix: CopyBytes() Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
+
Benedikt Meurer 2013/09/03 11:54:35 Please add ASSERTs that src, dst, length and scrat
+ 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));
Rodolph Perfetta 2013/09/03 14:47:07 This code could be improve further, see the tail e
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);
Rodolph Perfetta 2013/09/03 14:47:07 here too you could avoid the small 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) {
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698