Index: src/a64/macro-assembler-a64.cc |
diff --git a/src/a64/macro-assembler-a64.cc b/src/a64/macro-assembler-a64.cc |
index 25edc06161dc533d02e718cc09d9fe4fc4312cda..661e1dd8912641ed5db8b7e8299bfe90faf467cd 100644 |
--- a/src/a64/macro-assembler-a64.cc |
+++ b/src/a64/macro-assembler-a64.cc |
@@ -737,7 +737,6 @@ void MacroAssembler::Abs(const Register& rd, const Register& rm, |
void MacroAssembler::Push(const CPURegister& src0, const CPURegister& src1, |
const CPURegister& src2, const CPURegister& src3) { |
ASSERT(AreSameSizeAndType(src0, src1, src2, src3)); |
- ASSERT(src0.IsValid()); |
int count = 1 + src1.IsValid() + src2.IsValid() + src3.IsValid(); |
int size = src0.SizeInBytes(); |
@@ -747,6 +746,21 @@ void MacroAssembler::Push(const CPURegister& src0, const CPURegister& src1, |
} |
+void MacroAssembler::Push(const CPURegister& src0, const CPURegister& src1, |
+ const CPURegister& src2, const CPURegister& src3, |
+ const CPURegister& src4, const CPURegister& src5, |
+ const CPURegister& src6, const CPURegister& src7) { |
+ ASSERT(AreSameSizeAndType(src0, src1, src2, src3, src4, src5, src6, src7)); |
+ |
+ int count = 5 + src5.IsValid() + src6.IsValid() + src6.IsValid(); |
+ int size = src0.SizeInBytes(); |
+ |
+ PrepareForPush(count, size); |
+ PushHelper(4, size, src0, src1, src2, src3); |
+ PushHelper(count - 4, size, src4, src5, src6, src7); |
+} |
+ |
+ |
void MacroAssembler::Pop(const CPURegister& dst0, const CPURegister& dst1, |
const CPURegister& dst2, const CPURegister& dst3) { |
// It is not valid to pop into the same register more than once in one |
@@ -2423,10 +2437,12 @@ void MacroAssembler::CopyBytes(Register dst, |
Register length, |
Register scratch, |
CopyHint hint) { |
- ASSERT(!AreAliased(src, dst, length, scratch)); |
+ UseScratchRegisterScope temps(this); |
+ Register tmp1 = temps.AcquireX(); |
+ Register tmp2 = temps.AcquireX(); |
+ ASSERT(!AreAliased(src, dst, length, scratch, tmp1, tmp2)); |
+ ASSERT(!AreAliased(src, dst, csp)); |
- // TODO(all): Implement a faster copy function, and use hint to determine |
- // which algorithm to use for copies. |
if (emit_debug_code()) { |
// Check copy length. |
Cmp(length, 0); |
@@ -2440,14 +2456,33 @@ void MacroAssembler::CopyBytes(Register dst, |
Assert(le, kCopyBuffersOverlap); |
} |
- Label loop, done; |
- Cbz(length, &done); |
+ Label short_copy, short_loop, bulk_loop, done; |
- Bind(&loop); |
+ if ((hint == kCopyLong || hint == kCopyUnknown) && !FLAG_optimize_for_size) { |
+ Register bulk_length = scratch; |
+ int pair_size = 2 * kXRegSize; |
+ int pair_mask = pair_size - 1; |
+ |
+ Bics(bulk_length, length, pair_mask); |
+ Cbz(bulk_length, &short_copy); |
ulan
2014/03/18 12:51:14
You probably wanted to use flags set by Bics.
Alexandre Rames
2014/03/18 13:35:24
Yes. Fixed that.
|
+ Bind(&bulk_loop); |
+ Sub(bulk_length, bulk_length, pair_size); |
+ Ldp(tmp1, tmp2, MemOperand(src, pair_size, PostIndex)); |
+ Stp(tmp1, tmp2, MemOperand(dst, pair_size, PostIndex)); |
+ Cbnz(bulk_length, &bulk_loop); |
+ |
+ And(length, length, pair_mask); |
+ } |
+ |
+ Bind(&short_copy); |
+ Cbz(length, &done); |
+ Bind(&short_loop); |
Sub(length, length, 1); |
- Ldrb(scratch, MemOperand(src, 1, PostIndex)); |
- Strb(scratch, MemOperand(dst, 1, PostIndex)); |
- Cbnz(length, &loop); |
+ Ldrb(tmp1, MemOperand(src, 1, PostIndex)); |
+ Strb(tmp1, MemOperand(dst, 1, PostIndex)); |
+ Cbnz(length, &short_loop); |
+ |
+ |
Bind(&done); |
} |
@@ -2926,7 +2961,6 @@ void MacroAssembler::ExitFrameRestoreFPRegs() { |
} |
-// TODO(jbramley): Check that we're handling the frame pointer correctly. |
void MacroAssembler::EnterExitFrame(bool save_doubles, |
const Register& scratch, |
int extra_space) { |
@@ -2970,7 +3004,7 @@ void MacroAssembler::EnterExitFrame(bool save_doubles, |
// fp -> fp[0]: CallerFP (old fp) |
// fp[-8]: Space reserved for SPOffset. |
// fp[-16]: CodeObject() |
- // jssp[-16 - fp_size]: Saved doubles (if save_doubles is true). |
+ // fp[-16 - fp_size]: Saved doubles (if save_doubles is true). |
// jssp[8]: Extra space reserved for caller (if extra_space != 0). |
// jssp -> jssp[0]: Space reserved for the return address. |
@@ -2982,7 +3016,7 @@ void MacroAssembler::EnterExitFrame(bool save_doubles, |
// fp -> fp[0]: CallerFP (old fp) |
// fp[-8]: Space reserved for SPOffset. |
// fp[-16]: CodeObject() |
- // csp[...]: Saved doubles, if saved_doubles is true. |
+ // fp[-16 - fp_size]: Saved doubles (if save_doubles is true). |
// csp[8]: Memory reserved for the caller if extra_space != 0. |
// Alignment padding, if necessary. |
// csp -> csp[0]: Space reserved for the return address. |