// Copyright 2018 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. #include "textflag.h" // See memmove Go doc for important implementation constraints. // func memmove(to, from unsafe.Pointer, n uintptr) TEXT runtime·memmove(SB), NOSPLIT, $0-24 MOVD to+0(FP), R0 MOVD from+8(FP), R1 MOVD n+16(FP), R2 Get R0 Get R1 I64LtU If // forward exit_forward_64: Block loop_forward_64: Loop Get R2 I64Const $8 I64LtU BrIf exit_forward_64 MOVD 0(R1), 0(R0) Get R0 I64Const $8 I64Add Set R0 Get R1 I64Const $8 I64Add Set R1 Get R2 I64Const $8 I64Sub Set R2 Br loop_forward_64 End End loop_forward_8: Loop Get R2 I64Eqz If RET End Get R0 I32WrapI64 I64Load8U (R1) I64Store8 $0 Get R0 I64Const $1 I64Add Set R0 Get R1 I64Const $1 I64Add Set R1 Get R2 I64Const $1 I64Sub Set R2 Br loop_forward_8 End Else // backward Get R0 Get R2 I64Add Set R0 Get R1 Get R2 I64Add Set R1 exit_backward_64: Block loop_backward_64: Loop Get R2 I64Const $8 I64LtU BrIf exit_backward_64 Get R0 I64Const $8 I64Sub Set R0 Get R1 I64Const $8 I64Sub Set R1 Get R2 I64Const $8 I64Sub Set R2 MOVD 0(R1), 0(R0) Br loop_backward_64 End End loop_backward_8: Loop Get R2 I64Eqz If RET End Get R0 I64Const $1 I64Sub Set R0 Get R1 I64Const $1 I64Sub Set R1 Get R2 I64Const $1 I64Sub Set R2 Get R0 I32WrapI64 I64Load8U (R1) I64Store8 $0 Br loop_backward_8 End End UNDEF