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