summaryrefslogtreecommitdiff
path: root/src/runtime/memmove_power64x.s
blob: 2b04d8319a3d1a5b573c9c0e4423b9289d1e4f9a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// Copyright 2014 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.

// +build power64 power64le

#include "textflag.h"

// void runtime·memmove(void*, void*, uintptr)
TEXT runtime·memmove(SB), NOSPLIT, $-8-24
	MOVD	to+0(FP), R3
	MOVD	from+8(FP), R4
	MOVD	n+16(FP), R5
	CMP	R5, $0
	BNE	check
	RETURN

check:
	CMP	R3, R4
	BGT	backward

	SUB	$1, R3
	ADD	R3, R5
	SUB	$1, R4
loop:
	MOVBU	1(R4), R6
	MOVBU	R6, 1(R3)
	CMP	R3, R5
	BNE	loop
	RETURN

backward:
	ADD	R5, R4
	ADD	R3, R5
loop1:
	MOVBU	-1(R4), R6
	MOVBU	R6, -1(R5)
	CMP	R3, R5
	BNE	loop1
	RETURN