Index: src/arm64/macro-assembler-arm64.cc |
diff --git a/src/arm64/macro-assembler-arm64.cc b/src/arm64/macro-assembler-arm64.cc |
index 5b941a2a5a53648433605d6deb502bd7539e0622..e21903d087b3a4bcb851cdb17291405a52527372 100644 |
--- a/src/arm64/macro-assembler-arm64.cc |
+++ b/src/arm64/macro-assembler-arm64.cc |
@@ -2354,38 +2354,35 @@ void MacroAssembler::CopyBytes(Register dst, |
} |
-void MacroAssembler::FillFields(Register dst, |
- Register field_count, |
- Register filler) { |
- DCHECK(!dst.Is(csp)); |
+void MacroAssembler::InitializeFieldsWithFiller(Register current_address, |
+ Register end_address, |
+ Register filler) { |
+ DCHECK(!current_address.Is(csp)); |
UseScratchRegisterScope temps(this); |
- Register field_ptr = temps.AcquireX(); |
- Register counter = temps.AcquireX(); |
+ Register distance_in_words = temps.AcquireX(); |
Label done; |
- // Decrement count. If the result < zero, count was zero, and there's nothing |
- // to do. If count was one, flags are set to fail the gt condition at the end |
- // of the pairs loop. |
- Subs(counter, field_count, 1); |
- B(lt, &done); |
+ // Calculate the distance. If it's <= zero then there's nothing to do. |
+ Subs(distance_in_words, end_address, current_address); |
+ B(le, &done); |
// There's at least one field to fill, so do this unconditionally. |
- Str(filler, MemOperand(dst, kPointerSize, PostIndex)); |
+ Str(filler, MemOperand(current_address)); |
- // If the bottom bit of counter is set, there are an even number of fields to |
- // fill, so pull the start pointer back by one field, allowing the pairs loop |
- // to overwrite the field that was stored above. |
- And(field_ptr, counter, 1); |
- Sub(field_ptr, dst, Operand(field_ptr, LSL, kPointerSizeLog2)); |
+ // If the distance_in_words consists of odd number of words we advance |
+ // start_address by one word, otherwise the pairs loop will ovwerite the |
+ // field that was stored above. |
+ And(distance_in_words, distance_in_words, kPointerSize); |
+ Add(current_address, current_address, distance_in_words); |
// Store filler to memory in pairs. |
- Label entry, loop; |
+ Label loop, entry; |
B(&entry); |
Bind(&loop); |
- Stp(filler, filler, MemOperand(field_ptr, 2 * kPointerSize, PostIndex)); |
- Subs(counter, counter, 2); |
+ Stp(filler, filler, MemOperand(current_address, 2 * kPointerSize, PostIndex)); |
Bind(&entry); |
- B(gt, &loop); |
+ Cmp(current_address, end_address); |
+ B(lo, &loop); |
Bind(&done); |
} |
@@ -3120,30 +3117,27 @@ void MacroAssembler::Allocate(int object_size, |
} |
-void MacroAssembler::Allocate(Register object_size, |
- Register result, |
- Register scratch1, |
- Register scratch2, |
- Label* gc_required, |
- AllocationFlags flags) { |
+void MacroAssembler::Allocate(Register object_size, Register result, |
+ Register result_end, Register scratch, |
+ Label* gc_required, AllocationFlags flags) { |
if (!FLAG_inline_new) { |
if (emit_debug_code()) { |
// Trash the registers to simulate an allocation failure. |
// We apply salt to the original zap value to easily spot the values. |
Mov(result, (kDebugZapValue & ~0xffL) | 0x11L); |
- Mov(scratch1, (kDebugZapValue & ~0xffL) | 0x21L); |
- Mov(scratch2, (kDebugZapValue & ~0xffL) | 0x21L); |
+ Mov(scratch, (kDebugZapValue & ~0xffL) | 0x21L); |
+ Mov(result_end, (kDebugZapValue & ~0xffL) | 0x21L); |
} |
B(gc_required); |
return; |
} |
UseScratchRegisterScope temps(this); |
- Register scratch3 = temps.AcquireX(); |
+ Register scratch2 = temps.AcquireX(); |
- DCHECK(!AreAliased(object_size, result, scratch1, scratch2, scratch3)); |
- DCHECK(object_size.Is64Bits() && result.Is64Bits() && |
- scratch1.Is64Bits() && scratch2.Is64Bits()); |
+ DCHECK(!AreAliased(object_size, result, scratch, scratch2, result_end)); |
+ DCHECK(object_size.Is64Bits() && result.Is64Bits() && scratch.Is64Bits() && |
+ result_end.Is64Bits()); |
// Check relative positions of allocation top and limit addresses. |
// The values must be adjacent in memory to allow the use of LDP. |
@@ -3156,7 +3150,7 @@ void MacroAssembler::Allocate(Register object_size, |
DCHECK((limit - top) == kPointerSize); |
// Set up allocation top address and object size registers. |
- Register top_address = scratch1; |
+ Register top_address = scratch; |
Register allocation_limit = scratch2; |
Mov(top_address, heap_allocation_top); |
@@ -3166,8 +3160,8 @@ void MacroAssembler::Allocate(Register object_size, |
} else { |
if (emit_debug_code()) { |
// Assert that result actually contains top on entry. |
- Ldr(scratch3, MemOperand(top_address)); |
- Cmp(result, scratch3); |
+ Ldr(result_end, MemOperand(top_address)); |
+ Cmp(result, result_end); |
Check(eq, kUnexpectedAllocationTop); |
} |
// Load the allocation limit. 'result' already contains the allocation top. |
@@ -3180,19 +3174,19 @@ void MacroAssembler::Allocate(Register object_size, |
// Calculate new top and bail out if new space is exhausted |
if ((flags & SIZE_IN_WORDS) != 0) { |
- Adds(scratch3, result, Operand(object_size, LSL, kPointerSizeLog2)); |
+ Adds(result_end, result, Operand(object_size, LSL, kPointerSizeLog2)); |
} else { |
- Adds(scratch3, result, object_size); |
+ Adds(result_end, result, object_size); |
} |
if (emit_debug_code()) { |
- Tst(scratch3, kObjectAlignmentMask); |
+ Tst(result_end, kObjectAlignmentMask); |
Check(eq, kUnalignedAllocationInNewSpace); |
} |
- Ccmp(scratch3, allocation_limit, CFlag, cc); |
+ Ccmp(result_end, allocation_limit, CFlag, cc); |
B(hi, gc_required); |
- Str(scratch3, MemOperand(top_address)); |
+ Str(result_end, MemOperand(top_address)); |
// Tag the object if requested. |
if ((flags & TAG_OBJECT) != 0) { |