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