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