xref: /plan9/sys/src/ape/lib/ap/sparc/strcpy.s (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1	TEXT	strcpy(SB), $0
2
3MOVW	R7, 0(FP)
4	MOVW	s1+0(FP), R9		/* R9 is to pointer */
5	MOVW	s2+4(FP), R10		/* R10 is from pointer */
6
7/*
8 * test if both pointers
9 * are similarly word aligned
10 */
11	XOR	R9,R10, R7
12	ANDCC	$3,R7, R0
13	BNE	una
14
15/*
16 * make byte masks
17 */
18	MOVW	$0xff, R17
19	SLL	$8,R17, R16
20	SLL	$16,R17, R13
21	SLL	$24,R17, R12
22
23/*
24 * byte at a time to word align
25 */
26al1:
27	ANDCC	$3,R10, R0
28	BE	al2
29	MOVB	(R10), R11
30	ADD	$1, R10
31	MOVB	R11, (R9)
32	ADD	$1, R9
33	SUBCC	R0,R11, R0
34	BNE	al1
35	JMP	out
36
37/*
38 * word at a time
39 */
40al2:
41	ADD	$4, R9
42	MOVW	(R10), R11	/* fetch */
43	ADD	$4, R10
44	ANDCC	R12,R11, R0	/* is it byte 0 */
45	BE	b0
46	ANDCC	R13,R11, R0	/* is it byte 1 */
47	BE	b1
48	ANDCC	R16,R11, R0	/* is it byte 2 */
49	BE	b2
50	MOVW	R11, -4(R9)	/* store */
51	ANDCC	R17,R11, R0	/* is it byte 3 */
52	BNE	al2
53
54	JMP	out
55
56b0:
57	MOVB	R0, -4(R9)
58	JMP	out
59
60b1:
61	SRL	$24, R11
62	MOVB	R11, -4(R9)
63	MOVB	R0, -3(R9)
64	JMP	out
65
66b2:
67	SRL	$24,R11, R7
68	MOVB	R7, -4(R9)
69	SRL	$16, R11
70	MOVB	R11, -3(R9)
71	MOVB	R0, -2(R9)
72	JMP	out
73
74una:
75	MOVB	(R10), R11
76	ADD	$1, R10
77	MOVB	R11, (R9)
78	ADD	$1, R9
79	SUBCC	R0,R11, R0
80	BNE	una
81
82out:
83	MOVW	s1+0(FP),R7
84	RETURN
85