changelog shortlog tags branches changeset files file revisions raw help

Mercurial > hg > plan9front / annotate sys/src/libc/arm64/memmove.s

changeset 7218: 0e07d7fce9f3
child: f6786e3ba3da
author: cinap_lenrek@felloff.net
date: Thu, 09 May 2019 02:32:09 +0200
permissions: -rw-r--r--
description: libc: provide arm64 assembly versions for memmove() and memset()

just a first approximation, uses unaligned 8 byte loads and stores.
MOVP not yet implemented by the linker. no ZVA cache magic yet.
cinap_lenrek@7218 1
 TEXT memcpy(SB), $-4
cinap_lenrek@7218 2
 TEXT memmove(SB), $-4
cinap_lenrek@7218 3
 	MOV	from+8(FP), R1
cinap_lenrek@7218 4
 	MOVWU	n+16(FP), R2
cinap_lenrek@7218 5
 
cinap_lenrek@7218 6
 	CMP	R0, R1
cinap_lenrek@7218 7
 	BEQ	_done
cinap_lenrek@7218 8
 	BLT	_backward
cinap_lenrek@7218 9
 
cinap_lenrek@7218 10
 _forward:
cinap_lenrek@7218 11
 	ADD	R0, R2, R3
cinap_lenrek@7218 12
 	BIC	$7, R2, R4
cinap_lenrek@7218 13
 	CBZ	R4, _floop1
cinap_lenrek@7218 14
 	ADD	R0, R4, R4
cinap_lenrek@7218 15
 
cinap_lenrek@7218 16
 _floop8:
cinap_lenrek@7218 17
 	MOV	(R1)8!, R5
cinap_lenrek@7218 18
 	MOV	R5, (R0)8!
cinap_lenrek@7218 19
 	CMP	R4, R0
cinap_lenrek@7218 20
 	BNE	_floop8
cinap_lenrek@7218 21
 
cinap_lenrek@7218 22
 _floop1:
cinap_lenrek@7218 23
 	CMP	R3, R0
cinap_lenrek@7218 24
 	BEQ	_done
cinap_lenrek@7218 25
 	MOVBU	(R1)1!, R5
cinap_lenrek@7218 26
 	MOVBU	R5, (R0)1!
cinap_lenrek@7218 27
 	B	_floop1
cinap_lenrek@7218 28
 
cinap_lenrek@7218 29
 _done:
cinap_lenrek@7218 30
 	RETURN
cinap_lenrek@7218 31
 
cinap_lenrek@7218 32
 _backward:
cinap_lenrek@7218 33
 	ADD	R2, R1, R1
cinap_lenrek@7218 34
 	ADD	R2, R0, R3
cinap_lenrek@7218 35
 	BIC	$7, R2, R4
cinap_lenrek@7218 36
 	CBZ	R4, _bloop1
cinap_lenrek@7218 37
 	SUB	R4, R3, R4
cinap_lenrek@7218 38
 
cinap_lenrek@7218 39
 _bloop8:
cinap_lenrek@7218 40
 	MOV	-8(R1)!, R5
cinap_lenrek@7218 41
 	MOV	R5, -8(R3)!
cinap_lenrek@7218 42
 	CMP	R4, R3
cinap_lenrek@7218 43
 	BNE	_bloop8
cinap_lenrek@7218 44
 
cinap_lenrek@7218 45
 _bloop1:
cinap_lenrek@7218 46
 	CMP	R0, R3
cinap_lenrek@7218 47
 	BEQ	_done
cinap_lenrek@7218 48
 	MOVBU	-1(R1)!, R5
cinap_lenrek@7218 49
 	MOVBU	R5, -1(R3)!
cinap_lenrek@7218 50
 	B	_bloop1