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