xref: /plan9/sys/src/libc/mips/strcpy.s (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1TEXT	strcpy(SB), $0
2
3	MOVW	s2+4(FP),R2		/* R2 is from pointer */
4	MOVW	R1, R3			/* R3 is to pointer */
5
6/*
7 * align 'from' pointer
8 */
9l1:
10	AND	$3, R2, R5
11	ADDU	$1, R2
12	BEQ	R5, l2
13	MOVB	-1(R2), R5
14	ADDU	$1, R3
15	MOVB	R5, -1(R3)
16	BNE	R5, l1
17	RET
18
19/*
20 * test if 'to' is also alligned
21 */
22l2:
23	AND	$3,R3, R5
24	BEQ	R5, l4
25
26/*
27 * copy 4 at a time, 'to' not aligned
28 */
29l3:
30	MOVW	-1(R2), R4
31	ADD	$4, R2
32	ADD	$4, R3
33	SRL	$24,R4, R5
34	MOVB	R5, -4(R3)
35	BEQ	R5, out
36
37	SRL	$16,R4, R5
38	AND	$0xff, R5
39	MOVB	R5, -3(R3)
40	BEQ	R5, out
41
42	SRL	$8,R4, R5
43	AND	$0xff, R5
44	MOVB	R5, -2(R3)
45	BEQ	R5, out
46
47	AND	$0xff,R4, R5
48	MOVB	R5, -1(R3)
49	BNE	R5, l3
50
51out:
52	RET
53
54/*
55 * word at a time both aligned
56 */
57l4:
58	MOVW	$0xff000000, R7
59	MOVW	$0x00ff0000, R8
60
61l5:
62	ADDU	$4, R3
63	MOVW	-1(R2), R4	/* fetch */
64
65	ADDU	$4, R2
66	AND	R7,R4, R5	/* is it byte 0 */
67	AND	R8,R4, R6	/* is it byte 1 */
68	BEQ	R5, b0
69
70	AND	$0xff00,R4, R5	/* is it byte 2 */
71	BEQ	R6, b1
72
73	AND	$0xff,R4, R6	/* is it byte 3 */
74	BEQ	R5, b2
75
76	MOVW	R4, -4(R3)	/* store */
77	BNE	R6, l5
78	JMP	out
79
80b0:
81	MOVB	$0, -4(R3)
82	JMP	out
83
84b1:
85	SRL	$24, R4
86	MOVB	R4, -4(R3)
87	MOVB	$0, -3(R3)
88	JMP	out
89
90b2:
91	SRL	$24,R4, R5
92	MOVB	R5, -4(R3)
93	SRL	$16, R4
94	MOVB	R4, -3(R3)
95	MOVB	$0, -2(R3)
96	JMP	out
97