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