xref: /plan9/sys/src/ape/lib/ap/arm/strcpy.s (revision 2ddf2468114832cf7379e5290d3756505dc39637)
180ee5cbfSDavid du ColombierTEXT strcpy(SB), $-4
280ee5cbfSDavid du Colombier	MOVW		R0, to+0(FP)	/* need to save for return value */
380ee5cbfSDavid du Colombier	MOVW		from+4(FP), R1
480ee5cbfSDavid du Colombier	MOVW		$0xFF, R2	/* mask */
580ee5cbfSDavid du Colombier
6*2ddf2468SDavid du Colombiersalign:					/* align source on 4 */
780ee5cbfSDavid du Colombier	AND.S		$3, R1, R3
8*2ddf2468SDavid du Colombier	BEQ		dalign
980ee5cbfSDavid du Colombier	MOVBU.P		1(R1), R3	/* implicit write back */
1080ee5cbfSDavid du Colombier	TST		R3, R2
1180ee5cbfSDavid du Colombier	MOVBU.P		R3, 1(R0)	/* implicit write back */
12*2ddf2468SDavid du Colombier	BNE		salign
13*2ddf2468SDavid du Colombier	B		return
1480ee5cbfSDavid du Colombier
15*2ddf2468SDavid du Colombierdalign:				/* is destination now aligned? */
1680ee5cbfSDavid du Colombier	AND.S		$3, R0, R3
17*2ddf2468SDavid du Colombier	BNE		uloop
1880ee5cbfSDavid du Colombier
19*2ddf2468SDavid du Colombieraloop:
20*2ddf2468SDavid du Colombier	MOVW.P		4(R1), R4	/* read 4, write 4 */
2180ee5cbfSDavid du Colombier	TST		R4, R2		/* AND.S R3, R2, Rx */
2280ee5cbfSDavid du Colombier	TST.NE		R4>>8, R2
2380ee5cbfSDavid du Colombier	TST.NE		R4>>16, R2
2480ee5cbfSDavid du Colombier	TST.NE		R4>>24, R2
25*2ddf2468SDavid du Colombier	BEQ		tail
2680ee5cbfSDavid du Colombier	MOVW.P		R4, 4(R0)
27*2ddf2468SDavid du Colombier	B		aloop
2880ee5cbfSDavid du Colombier
29*2ddf2468SDavid du Colombieruloop:
30*2ddf2468SDavid du Colombier	MOVW.P		4(R1), R4	/* read 4, write 1,1,1,1 */
31*2ddf2468SDavid du Colombier
32*2ddf2468SDavid du Colombiertail:
3380ee5cbfSDavid du Colombier	AND.S		R4, R2, R3
34*2ddf2468SDavid du Colombier	MOVBU.NE.P	R3, 1(R0)
3580ee5cbfSDavid du Colombier	AND.NE.S	R4>>8, R2, R3
3680ee5cbfSDavid du Colombier	MOVBU.NE.P	R3, 1(R0)
3780ee5cbfSDavid du Colombier	AND.NE.S	R4>>16, R2, R3
3880ee5cbfSDavid du Colombier	MOVBU.NE.P	R3, 1(R0)
3980ee5cbfSDavid du Colombier	AND.NE.S	R4>>24, R2, R3
40*2ddf2468SDavid du Colombier	MOVBU.P		R3, 1(R0)
41*2ddf2468SDavid du Colombier	BNE		uloop
42*2ddf2468SDavid du Colombier	B		return
4380ee5cbfSDavid du Colombier
44*2ddf2468SDavid du Colombierreturn:
45*2ddf2468SDavid du Colombier	MOVW		to+0(FP), R0
46*2ddf2468SDavid du Colombier	RET
47