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