xref: /plan9/sys/src/libc/arm/strcpy.s (revision 6ca8a7e31df69aa273b57c9a8727a3aa1ead4d4b)
1*6ca8a7e3SDavid du ColombierTEXT strcpy(SB), $0
27dd7cddfSDavid du Colombier	MOVW		R0, to+0(FP)	/* need to save for return value */
37dd7cddfSDavid du Colombier	MOVW		from+4(FP), R1
47dd7cddfSDavid du Colombier	MOVW		$0xFF, R2	/* mask */
57dd7cddfSDavid du Colombier
680ee5cbfSDavid du Colombiersalign:					/* align source on 4 */
77dd7cddfSDavid du Colombier	AND.S		$3, R1, R3
880ee5cbfSDavid du Colombier	BEQ		dalign
97dd7cddfSDavid du Colombier	MOVBU.P		1(R1), R3	/* implicit write back */
107dd7cddfSDavid du Colombier	TST		R3, R2
117dd7cddfSDavid du Colombier	MOVBU.P		R3, 1(R0)	/* implicit write back */
1280ee5cbfSDavid du Colombier	BNE		salign
1380ee5cbfSDavid du Colombier	B		return
147dd7cddfSDavid du Colombier
1580ee5cbfSDavid du Colombierdalign:				/* is destination now aligned? */
167dd7cddfSDavid du Colombier	AND.S		$3, R0, R3
1780ee5cbfSDavid du Colombier	BNE		uloop
187dd7cddfSDavid du Colombier
1980ee5cbfSDavid du Colombieraloop:
2080ee5cbfSDavid du Colombier	MOVW.P		4(R1), R4	/* read 4, write 4 */
217dd7cddfSDavid du Colombier	TST		R4, R2		/* AND.S R3, R2, Rx */
227dd7cddfSDavid du Colombier	TST.NE		R4>>8, R2
237dd7cddfSDavid du Colombier	TST.NE		R4>>16, R2
247dd7cddfSDavid du Colombier	TST.NE		R4>>24, R2
2580ee5cbfSDavid du Colombier	BEQ		tail
267dd7cddfSDavid du Colombier	MOVW.P		R4, 4(R0)
2780ee5cbfSDavid du Colombier	B		aloop
287dd7cddfSDavid du Colombier
2980ee5cbfSDavid du Colombieruloop:
3080ee5cbfSDavid du Colombier	MOVW.P		4(R1), R4	/* read 4, write 1,1,1,1 */
3180ee5cbfSDavid du Colombier
3280ee5cbfSDavid du Colombiertail:
337dd7cddfSDavid du Colombier	AND.S		R4, R2, R3
3480ee5cbfSDavid du Colombier	MOVBU.NE.P	R3, 1(R0)
357dd7cddfSDavid du Colombier	AND.NE.S	R4>>8, R2, R3
367dd7cddfSDavid du Colombier	MOVBU.NE.P	R3, 1(R0)
377dd7cddfSDavid du Colombier	AND.NE.S	R4>>16, R2, R3
387dd7cddfSDavid du Colombier	MOVBU.NE.P	R3, 1(R0)
397dd7cddfSDavid du Colombier	AND.NE.S	R4>>24, R2, R3
4080ee5cbfSDavid du Colombier	MOVBU.P		R3, 1(R0)
4180ee5cbfSDavid du Colombier	BNE		uloop
4280ee5cbfSDavid du Colombier	B		return
437dd7cddfSDavid du Colombier
4480ee5cbfSDavid du Colombierreturn:
4580ee5cbfSDavid du Colombier	MOVW		to+0(FP), R0
4680ee5cbfSDavid du Colombier	RET
47