xref: /plan9/sys/src/libc/sparc/memmove.s (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier	TEXT	memmove(SB), $0
2*3e12c5d1SDavid du Colombier	JMP	move
3*3e12c5d1SDavid du Colombier
4*3e12c5d1SDavid du Colombier	TEXT	memcpy(SB), $0
5*3e12c5d1SDavid du Colombiermove:
6*3e12c5d1SDavid du Colombier
7*3e12c5d1SDavid du Colombier/*
8*3e12c5d1SDavid du Colombier * performance:
9*3e12c5d1SDavid du Colombier * (tba)
10*3e12c5d1SDavid du Colombier */
11*3e12c5d1SDavid du Colombier
12*3e12c5d1SDavid du Colombier	MOVW	R7, s1+0(FP)
13*3e12c5d1SDavid du Colombier	MOVW	n+8(FP), R9		/* R9 is count */
14*3e12c5d1SDavid du Colombier	MOVW	R7, R10			/* R10 is to-pointer */
15*3e12c5d1SDavid du Colombier	SUBCC	R0,R9, R0
16*3e12c5d1SDavid du Colombier	BGE	ok
17*3e12c5d1SDavid du Colombier	MOVW	0(R0), R0
18*3e12c5d1SDavid du Colombier
19*3e12c5d1SDavid du Colombierok:
20*3e12c5d1SDavid du Colombier	MOVW	s2+4(FP), R11		/* R11 is from-pointer */
21*3e12c5d1SDavid du Colombier	ADD	R9,R11, R13		/* R13 is end from-pointer */
22*3e12c5d1SDavid du Colombier	ADD	R9,R10, R12		/* R12 is end to-pointer */
23*3e12c5d1SDavid du Colombier
24*3e12c5d1SDavid du Colombier/*
25*3e12c5d1SDavid du Colombier * easiest test is copy backwards if
26*3e12c5d1SDavid du Colombier * destination string has higher mem address
27*3e12c5d1SDavid du Colombier */
28*3e12c5d1SDavid du Colombier	SUBCC	R11,R10, R0
29*3e12c5d1SDavid du Colombier	BGU	back
30*3e12c5d1SDavid du Colombier
31*3e12c5d1SDavid du Colombier/*
32*3e12c5d1SDavid du Colombier * if not at least 8 chars,
33*3e12c5d1SDavid du Colombier * dont even mess around.
34*3e12c5d1SDavid du Colombier * 7 chars to guarantee any
35*3e12c5d1SDavid du Colombier * rounding up to a word
36*3e12c5d1SDavid du Colombier * boundary and 8 characters
37*3e12c5d1SDavid du Colombier * to get at least maybe one
38*3e12c5d1SDavid du Colombier * full word store.
39*3e12c5d1SDavid du Colombier */
40*3e12c5d1SDavid du Colombier	SUBCC	$8,R9, R0
41*3e12c5d1SDavid du Colombier	BL	fout
42*3e12c5d1SDavid du Colombier
43*3e12c5d1SDavid du Colombier/*
44*3e12c5d1SDavid du Colombier * test if both pointers
45*3e12c5d1SDavid du Colombier * are similarly word aligned
46*3e12c5d1SDavid du Colombier */
47*3e12c5d1SDavid du Colombier	XOR	R10,R11, R7
48*3e12c5d1SDavid du Colombier	ANDCC	$7,R7, R0
49*3e12c5d1SDavid du Colombier	BNE	fout
50*3e12c5d1SDavid du Colombier
51*3e12c5d1SDavid du Colombier/*
52*3e12c5d1SDavid du Colombier * byte at a time to double align
53*3e12c5d1SDavid du Colombier */
54*3e12c5d1SDavid du Colombierf1:
55*3e12c5d1SDavid du Colombier	ANDCC	$7,R10, R0
56*3e12c5d1SDavid du Colombier	BE	f2
57*3e12c5d1SDavid du Colombier	MOVB	0(R11), R16
58*3e12c5d1SDavid du Colombier	ADD	$1, R11
59*3e12c5d1SDavid du Colombier	MOVB	R16, 0(R10)
60*3e12c5d1SDavid du Colombier	ADD	$1, R10
61*3e12c5d1SDavid du Colombier	JMP	f1
62*3e12c5d1SDavid du Colombier
63*3e12c5d1SDavid du Colombier/*
64*3e12c5d1SDavid du Colombier * turn R9 into to-end pointer-15
65*3e12c5d1SDavid du Colombier * copy 16 at a time while theres room.
66*3e12c5d1SDavid du Colombier * R12 is smaller than R13 --
67*3e12c5d1SDavid du Colombier * there are problems if R13 is 0.
68*3e12c5d1SDavid du Colombier */
69*3e12c5d1SDavid du Colombierf2:
70*3e12c5d1SDavid du Colombier	SUB	$15,R12, R9
71*3e12c5d1SDavid du Colombierf3:
72*3e12c5d1SDavid du Colombier	SUBCC	R10,R9, R0
73*3e12c5d1SDavid du Colombier	BLEU	f4
74*3e12c5d1SDavid du Colombier	MOVD	0(R11), R16
75*3e12c5d1SDavid du Colombier	MOVD	R16, 0(R10)
76*3e12c5d1SDavid du Colombier	MOVD	8(R11), R16
77*3e12c5d1SDavid du Colombier	ADD	$16, R11
78*3e12c5d1SDavid du Colombier	MOVD	R16, 8(R10)
79*3e12c5d1SDavid du Colombier	ADD	$16, R10
80*3e12c5d1SDavid du Colombier	JMP	f3
81*3e12c5d1SDavid du Colombier
82*3e12c5d1SDavid du Colombier/*
83*3e12c5d1SDavid du Colombier * turn R9 into to-end pointer-3
84*3e12c5d1SDavid du Colombier * copy 4 at a time while theres room
85*3e12c5d1SDavid du Colombier */
86*3e12c5d1SDavid du Colombierf4:
87*3e12c5d1SDavid du Colombier	SUB	$3,R12, R9
88*3e12c5d1SDavid du Colombierf5:
89*3e12c5d1SDavid du Colombier	SUBCC	R10,R9, R0
90*3e12c5d1SDavid du Colombier	BLEU	fout
91*3e12c5d1SDavid du Colombier	MOVW	0(R11), R16
92*3e12c5d1SDavid du Colombier	ADD	$4, R11
93*3e12c5d1SDavid du Colombier	MOVW	R16, 0(R10)
94*3e12c5d1SDavid du Colombier	ADD	$4, R10
95*3e12c5d1SDavid du Colombier	JMP	f5
96*3e12c5d1SDavid du Colombier
97*3e12c5d1SDavid du Colombier/*
98*3e12c5d1SDavid du Colombier * last loop, copy byte at a time
99*3e12c5d1SDavid du Colombier */
100*3e12c5d1SDavid du Colombierfout:
101*3e12c5d1SDavid du Colombier	SUBCC	R11,R13, R0
102*3e12c5d1SDavid du Colombier	BLEU	ret
103*3e12c5d1SDavid du Colombier	MOVB	0(R11), R16
104*3e12c5d1SDavid du Colombier	ADD	$1, R11
105*3e12c5d1SDavid du Colombier	MOVB	R16, 0(R10)
106*3e12c5d1SDavid du Colombier	ADD	$1, R10
107*3e12c5d1SDavid du Colombier	JMP	fout
108*3e12c5d1SDavid du Colombier
109*3e12c5d1SDavid du Colombier/*
110*3e12c5d1SDavid du Colombier * whole thing repeated for backwards
111*3e12c5d1SDavid du Colombier */
112*3e12c5d1SDavid du Colombierback:
113*3e12c5d1SDavid du Colombier	SUBCC	$8,R9, R0
114*3e12c5d1SDavid du Colombier	BL	bout
115*3e12c5d1SDavid du Colombier
116*3e12c5d1SDavid du Colombier	XOR	R12,R13, R7
117*3e12c5d1SDavid du Colombier	ANDCC	$7,R7, R0
118*3e12c5d1SDavid du Colombier	BNE	bout
119*3e12c5d1SDavid du Colombierb1:
120*3e12c5d1SDavid du Colombier	ANDCC	$7,R13, R0
121*3e12c5d1SDavid du Colombier	BE	b2
122*3e12c5d1SDavid du Colombier	MOVB	-1(R13), R16
123*3e12c5d1SDavid du Colombier	SUB	$1, R13
124*3e12c5d1SDavid du Colombier	MOVB	R16, -1(R12)
125*3e12c5d1SDavid du Colombier	SUB	$1, R12
126*3e12c5d1SDavid du Colombier	JMP	b1
127*3e12c5d1SDavid du Colombierb2:
128*3e12c5d1SDavid du Colombier	ADD	$15,R11, R9
129*3e12c5d1SDavid du Colombierb3:
130*3e12c5d1SDavid du Colombier	SUBCC	R9,R13, R0
131*3e12c5d1SDavid du Colombier	BLEU	b4
132*3e12c5d1SDavid du Colombier
133*3e12c5d1SDavid du Colombier	MOVD	-8(R13), R16
134*3e12c5d1SDavid du Colombier	MOVD	R16, -8(R12)
135*3e12c5d1SDavid du Colombier	MOVD	-16(R13), R16
136*3e12c5d1SDavid du Colombier	SUB	$16, R13
137*3e12c5d1SDavid du Colombier	MOVD	R16, -16(R12);
138*3e12c5d1SDavid du Colombier	SUB	$16, R12
139*3e12c5d1SDavid du Colombier	JMP	b3
140*3e12c5d1SDavid du Colombierb4:
141*3e12c5d1SDavid du Colombier	ADD	$3,R11, R9
142*3e12c5d1SDavid du Colombierb5:
143*3e12c5d1SDavid du Colombier	SUBCC	R9,R13, R0
144*3e12c5d1SDavid du Colombier	BLEU	bout
145*3e12c5d1SDavid du Colombier	MOVW	-4(R13), R16
146*3e12c5d1SDavid du Colombier	SUB	$4, R13
147*3e12c5d1SDavid du Colombier	MOVW	R16, -4(R12)
148*3e12c5d1SDavid du Colombier	SUB	$4, R12
149*3e12c5d1SDavid du Colombier	JMP	b5
150*3e12c5d1SDavid du Colombier
151*3e12c5d1SDavid du Colombierbout:
152*3e12c5d1SDavid du Colombier	SUBCC	R11,R13, R0
153*3e12c5d1SDavid du Colombier	BLEU	ret
154*3e12c5d1SDavid du Colombier	MOVB	-1(R13), R16
155*3e12c5d1SDavid du Colombier	SUB	$1, R13
156*3e12c5d1SDavid du Colombier	MOVB	R16, -1(R12)
157*3e12c5d1SDavid du Colombier	SUB	$1, R12
158*3e12c5d1SDavid du Colombier	JMP	bout
159*3e12c5d1SDavid du Colombier
160*3e12c5d1SDavid du Colombierret:
161*3e12c5d1SDavid du Colombier	MOVW	s1+0(FP), R7
162*3e12c5d1SDavid du Colombier	RETURN
163