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