summaryrefslogtreecommitdiff
path: root/sys/src/libc/arm64/memmove.s
blob: 76174800c82bb40b1ffec122d761a821a80adb54 (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
41
42
43
44
45
46
47
48
49
50
51
TEXT memcpy(SB), $-4
TEXT memmove(SB), $-4
	MOV	from+8(FP), R1
	MOV	n+16(FP), R2

	CMP	R0, R1
	BEQ	_done
	BLT	_backward

_forward:
	MOV	R0, R7
	ADD	R0, R2, R3
	BIC	$15, R2, R4
	CBZ	R4, _floop1
	ADD	R0, R4, R4

_floop16:
	MOVP	(R1)16!, R5, R6
	MOVP	R5, R6, (R7)16!
	CMP	R4, R7
	BNE	_floop16

_floop1:
	CMP	R3, R7
	BEQ	_done
	MOVBU	(R1)1!, R5
	MOVBU	R5, (R7)1!
	B	_floop1

_done:
	RETURN

_backward:
	ADD	R2, R1, R1
	ADD	R2, R0, R3
	BIC	$15, R2, R4
	CBZ	R4, _bloop1
	SUB	R4, R3, R4

_bloop16:
	MOVP	-16(R1)!, R5, R6
	MOVP	R5, R6, -16(R3)!
	CMP	R4, R3
	BNE	_bloop16

_bloop1:
	CMP	R0, R3
	BEQ	_done
	MOVBU	-1(R1)!, R5
	MOVBU	R5, -1(R3)!
	B	_bloop1