summaryrefslogtreecommitdiff
path: root/libc/string/metag/strcpy.S
blob: 529ac927960dbd31f6289ea854d59d4ff27d02f6 (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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
!    Copyright (C) 2013 Imagination Technologies Ltd.

!    Licensed under LGPL v2.1 or later, see the file COPYING.LIB in this tarball.


	.text
	.global	_strcpy
	.type	_strcpy,function
! D1Ar1 dst
! D0Ar2 src

_strcpy:
	MOV	A1.2, D1Ar1

	! test 4 byte alignment of src
	ANDS	D0Ar4, D0Ar2, #3
	BNZ	$Lbyteloop

	! test 4 byte alignment of dest
	ANDS	D1Ar5, D1Ar1, #3
	BNZ	$Lbyteloop

	! load mask values for aligned loops
	MOVT	D1Ar3, #HI(0xfefefeff)
	ADD	D1Ar3, D1Ar3, #LO(0xfefefeff)
	MOVT	D0FrT, #HI(0x80808080)
	ADD	D0FrT, D0FrT, #LO(0x80808080)

	! test 8 byte alignment of src
	ANDS	D0Ar4, D0Ar2, #7
	BNZ	$Lwordloop

	! test 8 byte alignment of dest
	ANDS	D1Ar5, D1Ar1, #7
	BNZ	$Lwordloop

$L8byteloop:
	GETL	D1Ar5, D0Ar6, [D0Ar2++]
	MOV	D1Re0, D1Ar5
	MOV	D0Re0, D1Ar5
	ADD	D1Re0, D1Re0, D1Ar3
	XOR	D0Re0, D0Re0, #-1
	AND	D1Re0, D1Re0, D0Re0
	ANDS	D1Re0, D1Re0, D0FrT
	BNZ	$Lnullfound		! NULL in first word

	MOV	D1Re0, D0Ar6
	MOV	D0Re0, D0Ar6
	ADD	D1Re0, D1Re0, D1Ar3
	XOR	D0Re0, D0Re0, #-1
	AND	D1Re0, D1Re0, D0Re0
	ANDS	D1Re0, D1Re0, D0FrT
	BNZ	$Lnullfound2		! NULL in the second word

	SETL	[A1.2++], D1Ar5, D0Ar6
	B	$L8byteloop

$Lwordloop:
	GETD	D0Ar6, [D0Ar2++]
	MOV	D1Re0, D0Ar6
	MOV	D0Re0, D0Ar6
	ADD	D1Re0, D1Re0, D1Ar3
	XOR	D0Re0, D0Re0, #-1
	AND	D1Re0, D1Re0, D0Re0
	ANDS	D1Re0, D1Re0, D0FrT
	MOV	D1Ar5, D0Ar6
	BNZ	$Lnullfound
	SETD	[A1.2++], D0Ar6
	B	$Lwordloop

$Lnullfound2:
	SETD	[A1.2++], D1Ar5
	MOV	D1Ar5, D0Ar6

$Lnullfound:
	SETB	[A1.2++], D1Ar5
	ANDS	D0Ar6, D1Ar5, #0xff
	LSR	D1Ar5, D1Ar5, #8
	BNZ	$Lnullfound
	B	$Lend

$Lbyteloop:
	GETB	D0Ar6, [D0Ar2++]
	SETB	[A1.2++], D0Ar6
	CMP	D0Ar6, #0
	BNZ	$Lbyteloop

$Lend:
	MOV	D0Re0, D1Ar1
	MOV	PC, D1RtP

	.size _strcpy,.-_strcpy

libc_hidden_def(strcpy)