Chromium Code Reviews| 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. |