Index: src/arm64/macro-assembler-arm64.cc |
diff --git a/src/arm64/macro-assembler-arm64.cc b/src/arm64/macro-assembler-arm64.cc |
index a27f625c5e2ea0e4858e4c018ab0fbbe67e91b1f..d84975c40d441fd1bbeed8dd457855b7b01d5d15 100644 |
--- a/src/arm64/macro-assembler-arm64.cc |
+++ b/src/arm64/macro-assembler-arm64.cc |
@@ -2153,152 +2153,6 @@ void MacroAssembler::ClampDoubleToUint8(Register output, |
} |
-void MacroAssembler::CopyFieldsLoopPairsHelper(Register dst, |
- Register src, |
- unsigned count, |
- Register scratch1, |
- Register scratch2, |
- Register scratch3, |
- Register scratch4, |
- Register scratch5) { |
- // Untag src and dst into scratch registers. |
- // Copy src->dst in a tight loop. |
- DCHECK(!AreAliased(dst, src, |
- scratch1, scratch2, scratch3, scratch4, scratch5)); |
- DCHECK(count >= 2); |
- |
- const Register& remaining = scratch3; |
- Mov(remaining, count / 2); |
- |
- const Register& dst_untagged = scratch1; |
- const Register& src_untagged = scratch2; |
- Sub(dst_untagged, dst, kHeapObjectTag); |
- Sub(src_untagged, src, kHeapObjectTag); |
- |
- // Copy fields in pairs. |
- Label loop; |
- Bind(&loop); |
- Ldp(scratch4, scratch5, |
- MemOperand(src_untagged, kXRegSize* 2, PostIndex)); |
- Stp(scratch4, scratch5, |
- MemOperand(dst_untagged, kXRegSize* 2, PostIndex)); |
- Sub(remaining, remaining, 1); |
- Cbnz(remaining, &loop); |
- |
- // Handle the leftovers. |
- if (count & 1) { |
- Ldr(scratch4, MemOperand(src_untagged)); |
- Str(scratch4, MemOperand(dst_untagged)); |
- } |
-} |
- |
- |
-void MacroAssembler::CopyFieldsUnrolledPairsHelper(Register dst, |
- Register src, |
- unsigned count, |
- Register scratch1, |
- Register scratch2, |
- Register scratch3, |
- Register scratch4) { |
- // Untag src and dst into scratch registers. |
- // Copy src->dst in an unrolled loop. |
- DCHECK(!AreAliased(dst, src, scratch1, scratch2, scratch3, scratch4)); |
- |
- const Register& dst_untagged = scratch1; |
- const Register& src_untagged = scratch2; |
- sub(dst_untagged, dst, kHeapObjectTag); |
- sub(src_untagged, src, kHeapObjectTag); |
- |
- // Copy fields in pairs. |
- for (unsigned i = 0; i < count / 2; i++) { |
- Ldp(scratch3, scratch4, MemOperand(src_untagged, kXRegSize * 2, PostIndex)); |
- Stp(scratch3, scratch4, MemOperand(dst_untagged, kXRegSize * 2, PostIndex)); |
- } |
- |
- // Handle the leftovers. |
- if (count & 1) { |
- Ldr(scratch3, MemOperand(src_untagged)); |
- Str(scratch3, MemOperand(dst_untagged)); |
- } |
-} |
- |
- |
-void MacroAssembler::CopyFieldsUnrolledHelper(Register dst, |
- Register src, |
- unsigned count, |
- Register scratch1, |
- Register scratch2, |
- Register scratch3) { |
- // Untag src and dst into scratch registers. |
- // Copy src->dst in an unrolled loop. |
- DCHECK(!AreAliased(dst, src, scratch1, scratch2, scratch3)); |
- |
- const Register& dst_untagged = scratch1; |
- const Register& src_untagged = scratch2; |
- Sub(dst_untagged, dst, kHeapObjectTag); |
- Sub(src_untagged, src, kHeapObjectTag); |
- |
- // Copy fields one by one. |
- for (unsigned i = 0; i < count; i++) { |
- Ldr(scratch3, MemOperand(src_untagged, kXRegSize, PostIndex)); |
- Str(scratch3, MemOperand(dst_untagged, kXRegSize, PostIndex)); |
- } |
-} |
- |
- |
-void MacroAssembler::CopyFields(Register dst, Register src, CPURegList temps, |
- unsigned count) { |
- // One of two methods is used: |
- // |
- // For high 'count' values where many scratch registers are available: |
- // Untag src and dst into scratch registers. |
- // Copy src->dst in a tight loop. |
- // |
- // For low 'count' values or where few scratch registers are available: |
- // Untag src and dst into scratch registers. |
- // Copy src->dst in an unrolled loop. |
- // |
- // In both cases, fields are copied in pairs if possible, and left-overs are |
- // handled separately. |
- DCHECK(!AreAliased(dst, src)); |
- DCHECK(!temps.IncludesAliasOf(dst)); |
- DCHECK(!temps.IncludesAliasOf(src)); |
- DCHECK(!temps.IncludesAliasOf(xzr)); |
- |
- if (emit_debug_code()) { |
- Cmp(dst, src); |
- Check(ne, kTheSourceAndDestinationAreTheSame); |
- } |
- |
- // The value of 'count' at which a loop will be generated (if there are |
- // enough scratch registers). |
- static const unsigned kLoopThreshold = 8; |
- |
- UseScratchRegisterScope masm_temps(this); |
- if ((temps.Count() >= 3) && (count >= kLoopThreshold)) { |
- CopyFieldsLoopPairsHelper(dst, src, count, |
- Register(temps.PopLowestIndex()), |
- Register(temps.PopLowestIndex()), |
- Register(temps.PopLowestIndex()), |
- masm_temps.AcquireX(), |
- masm_temps.AcquireX()); |
- } else if (temps.Count() >= 2) { |
- CopyFieldsUnrolledPairsHelper(dst, src, count, |
- Register(temps.PopLowestIndex()), |
- Register(temps.PopLowestIndex()), |
- masm_temps.AcquireX(), |
- masm_temps.AcquireX()); |
- } else if (temps.Count() == 1) { |
- CopyFieldsUnrolledHelper(dst, src, count, |
- Register(temps.PopLowestIndex()), |
- masm_temps.AcquireX(), |
- masm_temps.AcquireX()); |
- } else { |
- UNREACHABLE(); |
- } |
-} |
- |
- |
void MacroAssembler::CopyBytes(Register dst, |
Register src, |
Register length, |