xref: /plan9/sys/src/ape/lib/ap/sparc/strcpy.s (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier	TEXT	strcpy(SB), $0
2*219b2ee8SDavid du Colombier
3*219b2ee8SDavid du ColombierMOVW	R7, 0(FP)
4*219b2ee8SDavid du Colombier	MOVW	s1+0(FP), R9		/* R9 is to pointer */
5*219b2ee8SDavid du Colombier	MOVW	s2+4(FP), R10		/* R10 is from pointer */
6*219b2ee8SDavid du Colombier
7*219b2ee8SDavid du Colombier/*
8*219b2ee8SDavid du Colombier * test if both pointers
9*219b2ee8SDavid du Colombier * are similarly word aligned
10*219b2ee8SDavid du Colombier */
11*219b2ee8SDavid du Colombier	XOR	R9,R10, R7
12*219b2ee8SDavid du Colombier	ANDCC	$3,R7, R0
13*219b2ee8SDavid du Colombier	BNE	una
14*219b2ee8SDavid du Colombier
15*219b2ee8SDavid du Colombier/*
16*219b2ee8SDavid du Colombier * make byte masks
17*219b2ee8SDavid du Colombier */
18*219b2ee8SDavid du Colombier	MOVW	$0xff, R17
19*219b2ee8SDavid du Colombier	SLL	$8,R17, R16
20*219b2ee8SDavid du Colombier	SLL	$16,R17, R13
21*219b2ee8SDavid du Colombier	SLL	$24,R17, R12
22*219b2ee8SDavid du Colombier
23*219b2ee8SDavid du Colombier/*
24*219b2ee8SDavid du Colombier * byte at a time to word align
25*219b2ee8SDavid du Colombier */
26*219b2ee8SDavid du Colombieral1:
27*219b2ee8SDavid du Colombier	ANDCC	$3,R10, R0
28*219b2ee8SDavid du Colombier	BE	al2
29*219b2ee8SDavid du Colombier	MOVB	(R10), R11
30*219b2ee8SDavid du Colombier	ADD	$1, R10
31*219b2ee8SDavid du Colombier	MOVB	R11, (R9)
32*219b2ee8SDavid du Colombier	ADD	$1, R9
33*219b2ee8SDavid du Colombier	SUBCC	R0,R11, R0
34*219b2ee8SDavid du Colombier	BNE	al1
35*219b2ee8SDavid du Colombier	JMP	out
36*219b2ee8SDavid du Colombier
37*219b2ee8SDavid du Colombier/*
38*219b2ee8SDavid du Colombier * word at a time
39*219b2ee8SDavid du Colombier */
40*219b2ee8SDavid du Colombieral2:
41*219b2ee8SDavid du Colombier	ADD	$4, R9
42*219b2ee8SDavid du Colombier	MOVW	(R10), R11	/* fetch */
43*219b2ee8SDavid du Colombier	ADD	$4, R10
44*219b2ee8SDavid du Colombier	ANDCC	R12,R11, R0	/* is it byte 0 */
45*219b2ee8SDavid du Colombier	BE	b0
46*219b2ee8SDavid du Colombier	ANDCC	R13,R11, R0	/* is it byte 1 */
47*219b2ee8SDavid du Colombier	BE	b1
48*219b2ee8SDavid du Colombier	ANDCC	R16,R11, R0	/* is it byte 2 */
49*219b2ee8SDavid du Colombier	BE	b2
50*219b2ee8SDavid du Colombier	MOVW	R11, -4(R9)	/* store */
51*219b2ee8SDavid du Colombier	ANDCC	R17,R11, R0	/* is it byte 3 */
52*219b2ee8SDavid du Colombier	BNE	al2
53*219b2ee8SDavid du Colombier
54*219b2ee8SDavid du Colombier	JMP	out
55*219b2ee8SDavid du Colombier
56*219b2ee8SDavid du Colombierb0:
57*219b2ee8SDavid du Colombier	MOVB	R0, -4(R9)
58*219b2ee8SDavid du Colombier	JMP	out
59*219b2ee8SDavid du Colombier
60*219b2ee8SDavid du Colombierb1:
61*219b2ee8SDavid du Colombier	SRL	$24, R11
62*219b2ee8SDavid du Colombier	MOVB	R11, -4(R9)
63*219b2ee8SDavid du Colombier	MOVB	R0, -3(R9)
64*219b2ee8SDavid du Colombier	JMP	out
65*219b2ee8SDavid du Colombier
66*219b2ee8SDavid du Colombierb2:
67*219b2ee8SDavid du Colombier	SRL	$24,R11, R7
68*219b2ee8SDavid du Colombier	MOVB	R7, -4(R9)
69*219b2ee8SDavid du Colombier	SRL	$16, R11
70*219b2ee8SDavid du Colombier	MOVB	R11, -3(R9)
71*219b2ee8SDavid du Colombier	MOVB	R0, -2(R9)
72*219b2ee8SDavid du Colombier	JMP	out
73*219b2ee8SDavid du Colombier
74*219b2ee8SDavid du Colombieruna:
75*219b2ee8SDavid du Colombier	MOVB	(R10), R11
76*219b2ee8SDavid du Colombier	ADD	$1, R10
77*219b2ee8SDavid du Colombier	MOVB	R11, (R9)
78*219b2ee8SDavid du Colombier	ADD	$1, R9
79*219b2ee8SDavid du Colombier	SUBCC	R0,R11, R0
80*219b2ee8SDavid du Colombier	BNE	una
81*219b2ee8SDavid du Colombier
82*219b2ee8SDavid du Colombierout:
83*219b2ee8SDavid du Colombier	MOVW	s1+0(FP),R7
84*219b2ee8SDavid du Colombier	RETURN
85