xref: /plan9/sys/src/libc/arm/strcpy.s (revision 6ca8a7e31df69aa273b57c9a8727a3aa1ead4d4b)
1TEXT strcpy(SB), $0
2	MOVW		R0, to+0(FP)	/* need to save for return value */
3	MOVW		from+4(FP), R1
4	MOVW		$0xFF, R2	/* mask */
5
6salign:					/* align source on 4 */
7	AND.S		$3, R1, R3
8	BEQ		dalign
9	MOVBU.P		1(R1), R3	/* implicit write back */
10	TST		R3, R2
11	MOVBU.P		R3, 1(R0)	/* implicit write back */
12	BNE		salign
13	B		return
14
15dalign:				/* is destination now aligned? */
16	AND.S		$3, R0, R3
17	BNE		uloop
18
19aloop:
20	MOVW.P		4(R1), R4	/* read 4, write 4 */
21	TST		R4, R2		/* AND.S R3, R2, Rx */
22	TST.NE		R4>>8, R2
23	TST.NE		R4>>16, R2
24	TST.NE		R4>>24, R2
25	BEQ		tail
26	MOVW.P		R4, 4(R0)
27	B		aloop
28
29uloop:
30	MOVW.P		4(R1), R4	/* read 4, write 1,1,1,1 */
31
32tail:
33	AND.S		R4, R2, R3
34	MOVBU.NE.P	R3, 1(R0)
35	AND.NE.S	R4>>8, R2, R3
36	MOVBU.NE.P	R3, 1(R0)
37	AND.NE.S	R4>>16, R2, R3
38	MOVBU.NE.P	R3, 1(R0)
39	AND.NE.S	R4>>24, R2, R3
40	MOVBU.P		R3, 1(R0)
41	BNE		uloop
42	B		return
43
44return:
45	MOVW		to+0(FP), R0
46	RET
47