1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* memcpy.S: Sparc optimized memcpy and memmove code
2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Hand optimized from GNU libc's memcpy and memmove
3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (C) 1991,1996 Free Software Foundation
4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (C) 1995 Linus Torvalds (Linus.Torvalds@helsinki.fi)
5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (C) 1996 Eddie C. Dost (ecd@skynet.be)
7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define FUNC(x) 		\
11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	.globl	x;		\
12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	.type	x,@function;	\
13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	.align	4;		\
14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengx:
15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* Both these macros have to start with exactly the same insn */
17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define MOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \
18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src + (offset) + 0x00], %t0; \
19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src + (offset) + 0x08], %t2; \
20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src + (offset) + 0x10], %t4; \
21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src + (offset) + 0x18], %t6; \
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t0, [%dst + (offset) + 0x00]; \
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t1, [%dst + (offset) + 0x04]; \
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t2, [%dst + (offset) + 0x08]; \
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t3, [%dst + (offset) + 0x0c]; \
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t4, [%dst + (offset) + 0x10]; \
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t5, [%dst + (offset) + 0x14]; \
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t6, [%dst + (offset) + 0x18]; \
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t7, [%dst + (offset) + 0x1c];
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define MOVE_BIGALIGNCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src + (offset) + 0x00], %t0; \
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src + (offset) + 0x08], %t2; \
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src + (offset) + 0x10], %t4; \
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src + (offset) + 0x18], %t6; \
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	std	%t0, [%dst + (offset) + 0x00]; \
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	std	%t2, [%dst + (offset) + 0x08]; \
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	std	%t4, [%dst + (offset) + 0x10]; \
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	std	%t6, [%dst + (offset) + 0x18];
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define MOVE_LASTCHUNK(src, dst, offset, t0, t1, t2, t3) \
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src - (offset) - 0x10], %t0; \
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src - (offset) - 0x08], %t2; \
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t0, [%dst - (offset) - 0x10]; \
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t1, [%dst - (offset) - 0x0c]; \
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t2, [%dst - (offset) - 0x08]; \
47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t3, [%dst - (offset) - 0x04];
48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define MOVE_LASTALIGNCHUNK(src, dst, offset, t0, t1, t2, t3) \
50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src - (offset) - 0x10], %t0; \
51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src - (offset) - 0x08], %t2; \
52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	std	%t0, [%dst - (offset) - 0x10]; \
53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	std	%t2, [%dst - (offset) - 0x08];
54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define MOVE_SHORTCHUNK(src, dst, offset, t0, t1) \
56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldub	[%src - (offset) - 0x02], %t0; \
57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldub	[%src - (offset) - 0x01], %t1; \
58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	stb	%t0, [%dst - (offset) - 0x02]; \
59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	stb	%t1, [%dst - (offset) - 0x01];
60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* Both these macros have to start with exactly the same insn */
62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define RMOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \
63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src - (offset) - 0x20], %t0; \
64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src - (offset) - 0x18], %t2; \
65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src - (offset) - 0x10], %t4; \
66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src - (offset) - 0x08], %t6; \
67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t0, [%dst - (offset) - 0x20]; \
68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t1, [%dst - (offset) - 0x1c]; \
69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t2, [%dst - (offset) - 0x18]; \
70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t3, [%dst - (offset) - 0x14]; \
71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t4, [%dst - (offset) - 0x10]; \
72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t5, [%dst - (offset) - 0x0c]; \
73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t6, [%dst - (offset) - 0x08]; \
74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t7, [%dst - (offset) - 0x04];
75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define RMOVE_BIGALIGNCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \
77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src - (offset) - 0x20], %t0; \
78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src - (offset) - 0x18], %t2; \
79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src - (offset) - 0x10], %t4; \
80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src - (offset) - 0x08], %t6; \
81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	std	%t0, [%dst - (offset) - 0x20]; \
82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	std	%t2, [%dst - (offset) - 0x18]; \
83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	std	%t4, [%dst - (offset) - 0x10]; \
84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	std	%t6, [%dst - (offset) - 0x08];
85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define RMOVE_LASTCHUNK(src, dst, offset, t0, t1, t2, t3) \
87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src + (offset) + 0x00], %t0; \
88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src + (offset) + 0x08], %t2; \
89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t0, [%dst + (offset) + 0x00]; \
90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t1, [%dst + (offset) + 0x04]; \
91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t2, [%dst + (offset) + 0x08]; \
92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st	%t3, [%dst + (offset) + 0x0c];
93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define RMOVE_SHORTCHUNK(src, dst, offset, t0, t1) \
95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldub	[%src + (offset) + 0x00], %t0; \
96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldub	[%src + (offset) + 0x01], %t1; \
97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	stb	%t0, [%dst + (offset) + 0x00]; \
98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	stb	%t1, [%dst + (offset) + 0x01];
99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define SMOVE_CHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, prev, shil, shir, offset2) \
101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src + (offset) + 0x00], %t0; \
102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src + (offset) + 0x08], %t2; \
103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	srl	%t0, shir, %t5; \
104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	srl	%t1, shir, %t6; \
105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll	%t0, shil, %t0; \
106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or	%t5, %prev, %t5; \
107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll	%t1, shil, %prev; \
108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or	%t6, %t0, %t0; \
109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	srl	%t2, shir, %t1; \
110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	srl	%t3, shir, %t6; \
111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll	%t2, shil, %t2; \
112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or	%t1, %prev, %t1; \
113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	std	%t4, [%dst + (offset) + (offset2) - 0x04]; \
114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	std	%t0, [%dst + (offset) + (offset2) + 0x04]; \
115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll	%t3, shil, %prev; \
116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or	%t6, %t2, %t4;
117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define SMOVE_ALIGNCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, prev, shil, shir, offset2) \
119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src + (offset) + 0x00], %t0; \
120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd	[%src + (offset) + 0x08], %t2; \
121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	srl	%t0, shir, %t4;	\
122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	srl	%t1, shir, %t5;	\
123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll	%t0, shil, %t6;	\
124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or	%t4, %prev, %t0; \
125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll	%t1, shil, %prev; \
126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or	%t5, %t6, %t1; \
127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	srl	%t2, shir, %t4;	\
128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	srl	%t3, shir, %t5;	\
129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll	%t2, shil, %t6; \
130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or	%t4, %prev, %t2; \
131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll	%t3, shil, %prev; \
132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or	%t5, %t6, %t3; \
133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	std	%t0, [%dst + (offset) + (offset2) + 0x00]; \
134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	std	%t2, [%dst + (offset) + (offset2) + 0x08];
135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	.text
137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	.align	4
138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng0:
140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	retl
141e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 nop		! Only bcopy returns here and it retuns void...
142e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
143e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifdef __KERNEL__
144e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengFUNC(amemmove)
145e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengFUNC(__memmove)
146e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif
147e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengFUNC(memmove)
148e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cmp		%o0, %o1
149e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mov		%o0, %g7
150e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bleu		9f
151e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 sub		%o0, %o1, %o4
152e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
153e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o1, %o2, %o3
154e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cmp		%o3, %o0
155e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bleu		0f
156e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 andcc		%o4, 3, %o5
157e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
158e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o1, %o2, %o1
159e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o0, %o2, %o0
160e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sub		%o1, 1, %o1
161e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sub		%o0, 1, %o0
162e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
163e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng1:	/* reverse_bytes */
164e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
165e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldub		[%o1], %o4
166e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	subcc		%o2, 1, %o2
167e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	stb		%o4, [%o0]
168e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sub		%o1, 1, %o1
169e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bne		1b
170e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 sub		%o0, 1, %o0
171e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
172e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	retl
173e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 mov		%g7, %o0
174e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
175e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* NOTE: This code is executed just for the cases,
176e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         where %src (=%o1) & 3 is != 0.
177e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 We need to align it to 4. So, for (%src & 3)
178e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 1 we need to do ldub,lduh
179e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 2 lduh
180e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 3 just ldub
181e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         so even if it looks weird, the branches
182e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng         are correct here. -jj
183e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
184e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng78:	/* dword_align */
185e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
186e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	andcc		%o1, 1, %g0
187e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	be		4f
188e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 andcc		%o1, 2, %g0
189e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
190e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldub		[%o1], %g2
191e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o1, 1, %o1
192e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	stb		%g2, [%o0]
193e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sub		%o2, 1, %o2
194e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bne		3f
195e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 add		%o0, 1, %o0
196e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng4:
197e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	lduh		[%o1], %g2
198e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o1, 2, %o1
199e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sth		%g2, [%o0]
200e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sub		%o2, 2, %o2
201e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	b		3f
202e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 add		%o0, 2, %o0
203e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
204e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen ChengFUNC(memcpy)	/* %o0=dst %o1=src %o2=len */
205e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
206e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sub		%o0, %o1, %o4
207e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mov		%o0, %g7
208e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng9:
209e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	andcc		%o4, 3, %o5
210e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng0:
211e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bne		86f
212e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 cmp		%o2, 15
213e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
214e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bleu		90f
215e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 andcc		%o1, 3, %g0
216e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
217e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bne		78b
218e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng3:
219e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 andcc		%o1, 4, %g0
220e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
221e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	be		2f
222e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 mov		%o2, %g1
223e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
224e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ld		[%o1], %o4
225e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sub		%g1, 4, %g1
226e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st		%o4, [%o0]
227e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o1, 4, %o1
228e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o0, 4, %o0
229e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng2:
230e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	andcc		%g1, 0xffffff80, %g0
231e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	be		3f
232e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 andcc		%o0, 4, %g0
233e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
234e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	be		82f + 4
235e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng5:
236e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_BIGCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5)
237e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
238e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
239e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
240e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sub		%g1, 128, %g1
241e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o1, 128, %o1
242e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cmp		%g1, 128
243e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bge		5b
244e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 add		%o0, 128, %o0
245e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng3:
246e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	andcc		%g1, 0x70, %g4
247e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	be		80f
248e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 andcc		%g1, 8, %g0
249e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
250e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sethi		%hi(80f), %o5
251e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	srl		%g4, 1, %o4
252e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%g4, %o4, %o4
253e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o1, %g4, %o1
254e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sub		%o5, %o4, %o5
255e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	jmpl		%o5 + %lo(80f), %g0
256e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 add		%o0, %g4, %o0
257e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
258e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng79:	/* memcpy_table */
259e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
260e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_LASTCHUNK(o1, o0, 0x60, g2, g3, g4, g5)
261e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_LASTCHUNK(o1, o0, 0x50, g2, g3, g4, g5)
262e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_LASTCHUNK(o1, o0, 0x40, g2, g3, g4, g5)
263e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_LASTCHUNK(o1, o0, 0x30, g2, g3, g4, g5)
264e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_LASTCHUNK(o1, o0, 0x20, g2, g3, g4, g5)
265e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_LASTCHUNK(o1, o0, 0x10, g2, g3, g4, g5)
266e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_LASTCHUNK(o1, o0, 0x00, g2, g3, g4, g5)
267e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
268e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng80:	/* memcpy_table_end */
269e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	be		81f
270e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 andcc		%g1, 4, %g0
271e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
272e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd		[%o1], %g2
273e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o0, 8, %o0
274e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st		%g2, [%o0 - 0x08]
275e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o1, 8, %o1
276e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st		%g3, [%o0 - 0x04]
277e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
278e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng81:	/* memcpy_last7 */
279e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
280e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	be		1f
281e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 andcc		%g1, 2, %g0
282e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
283e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ld		[%o1], %g2
284e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o1, 4, %o1
285e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st		%g2, [%o0]
286e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o0, 4, %o0
287e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng1:
288e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	be		1f
289e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 andcc		%g1, 1, %g0
290e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
291e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	lduh		[%o1], %g2
292e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o1, 2, %o1
293e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sth		%g2, [%o0]
294e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o0, 2, %o0
295e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng1:
296e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	be		1f
297e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 nop
298e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
299e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldub		[%o1], %g2
300e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	stb		%g2, [%o0]
301e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng1:
302e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	retl
303e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 mov		%g7, %o0
304e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
305e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng82:	/* ldd_std */
306e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_BIGALIGNCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5)
307e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
308e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
309e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
310e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	subcc		%g1, 128, %g1
311e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o1, 128, %o1
312e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cmp		%g1, 128
313e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bge		82b
314e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 add		%o0, 128, %o0
315e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
316e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	andcc		%g1, 0x70, %g4
317e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	be		84f
318e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 andcc		%g1, 8, %g0
319e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
320e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sethi		%hi(84f), %o5
321e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o1, %g4, %o1
322e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sub		%o5, %g4, %o5
323e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	jmpl		%o5 + %lo(84f), %g0
324e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 add		%o0, %g4, %o0
325e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
326e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng83:	/* amemcpy_table */
327e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
328e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_LASTALIGNCHUNK(o1, o0, 0x60, g2, g3, g4, g5)
329e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_LASTALIGNCHUNK(o1, o0, 0x50, g2, g3, g4, g5)
330e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_LASTALIGNCHUNK(o1, o0, 0x40, g2, g3, g4, g5)
331e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_LASTALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5)
332e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_LASTALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5)
333e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_LASTALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5)
334e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_LASTALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5)
335e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
336e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng84:	/* amemcpy_table_end */
337e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	be		85f
338e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 andcc		%g1, 4, %g0
339e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
340e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldd		[%o1], %g2
341e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o0, 8, %o0
342e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	std		%g2, [%o0 - 0x08]
343e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o1, 8, %o1
344e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng85:	/* amemcpy_last7 */
345e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	be		1f
346e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 andcc		%g1, 2, %g0
347e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
348e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ld		[%o1], %g2
349e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o1, 4, %o1
350e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st		%g2, [%o0]
351e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o0, 4, %o0
352e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng1:
353e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	be		1f
354e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 andcc		%g1, 1, %g0
355e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
356e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	lduh		[%o1], %g2
357e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o1, 2, %o1
358e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sth		%g2, [%o0]
359e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o0, 2, %o0
360e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng1:
361e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	be		1f
362e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 nop
363e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
364e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldub		[%o1], %g2
365e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	stb		%g2, [%o0]
366e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng1:
367e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	retl
368e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 mov		%g7, %o0
369e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
370e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng86:	/* non_aligned */
371e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cmp		%o2, 6
372e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bleu		88f
373e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 nop
374e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
375e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	save		%sp, -96, %sp
376e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	andcc		%i0, 3, %g0
377e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	be		61f
378e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 andcc		%i0, 1, %g0
379e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	be		60f
380e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 andcc		%i0, 2, %g0
381e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
382e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldub		[%i1], %g5
383e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%i1, 1, %i1
384e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	stb		%g5, [%i0]
385e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sub		%i2, 1, %i2
386e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bne		61f
387e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 add		%i0, 1, %i0
388e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng60:
389e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldub		[%i1], %g3
390e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%i1, 2, %i1
391e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	stb		%g3, [%i0]
392e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sub		%i2, 2, %i2
393e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldub		[%i1 - 1], %g3
394e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%i0, 2, %i0
395e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	stb		%g3, [%i0 - 1]
396e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng61:
397e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	and		%i1, 3, %g2
398e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	and		%i2, 0xc, %g3
399e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	and		%i1, -4, %i1
400e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cmp		%g3, 4
401e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll		%g2, 3, %g4
402e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	mov		32, %g2
403e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	be		4f
404e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 sub		%g2, %g4, %l0
405e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
406e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	blu		3f
407e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 cmp		%g3, 0x8
408e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
409e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	be		2f
410e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 srl		%i2, 2, %g3
411e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
412e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ld		[%i1], %i3
413e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%i0, -8, %i0
414e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ld		[%i1 + 4], %i4
415e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	b		8f
416e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 add		%g3, 1, %g3
417e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng2:
418e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ld		[%i1], %i4
419e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%i0, -12, %i0
420e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ld		[%i1 + 4], %i5
421e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%g3, 2, %g3
422e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	b		9f
423e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 add		%i1, -4, %i1
424e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng3:
425e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ld		[%i1], %g1
426e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%i0, -4, %i0
427e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ld		[%i1 + 4], %i3
428e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	srl		%i2, 2, %g3
429e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	b		7f
430e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 add		%i1, 4, %i1
431e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng4:
432e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ld		[%i1], %i5
433e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	cmp		%i2, 7
434e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ld		[%i1 + 4], %g1
435e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	srl		%i2, 2, %g3
436e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bleu		10f
437e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 add		%i1, 8, %i1
438e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
439e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ld		[%i1], %i3
440e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%g3, -1, %g3
441e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng5:
442e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll		%i5, %g4, %g2
443e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	srl		%g1, %l0, %g5
444e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or		%g2, %g5, %g2
445e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st		%g2, [%i0]
446e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng7:
447e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ld		[%i1 + 4], %i4
448e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll		%g1, %g4, %g2
449e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	srl		%i3, %l0, %g5
450e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or		%g2, %g5, %g2
451e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st		%g2, [%i0 + 4]
452e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng8:
453e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ld		[%i1 + 8], %i5
454e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll		%i3, %g4, %g2
455e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	srl		%i4, %l0, %g5
456e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or		%g2, %g5, %g2
457e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st		%g2, [%i0 + 8]
458e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng9:
459e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ld		[%i1 + 12], %g1
460e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll		%i4, %g4, %g2
461e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	srl		%i5, %l0, %g5
462e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	addcc		%g3, -4, %g3
463e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or		%g2, %g5, %g2
464e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%i1, 16, %i1
465e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st		%g2, [%i0 + 12]
466e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%i0, 16, %i0
467e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bne,a		5b
468e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 ld		[%i1], %i3
469e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng10:
470e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll		%i5, %g4, %g2
471e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	srl		%g1, %l0, %g5
472e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	srl		%l0, 3, %g3
473e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	or		%g2, %g5, %g2
474e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sub		%i1, %g3, %i1
475e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	andcc		%i2, 2, %g0
476e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st		%g2, [%i0]
477e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	be		1f
478e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 andcc		%i2, 1, %g0
479e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
480e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldub		[%i1], %g2
481e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%i1, 2, %i1
482e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	stb		%g2, [%i0 + 4]
483e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%i0, 2, %i0
484e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldub		[%i1 - 1], %g2
485e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	stb		%g2, [%i0 + 3]
486e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng1:
487e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	be		1f
488e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 nop
489e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldub		[%i1], %g2
490e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	stb		%g2, [%i0 + 4]
491e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng1:
492e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ret
493e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 restore	%g7, %g0, %o0
494e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
495e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng88:	/* short_end */
496e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
497e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	and		%o2, 0xe, %o3
498e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng20:
499e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sethi		%hi(89f), %o5
500e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sll		%o3, 3, %o4
501e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o0, %o3, %o0
502e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	sub		%o5, %o4, %o5
503e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o1, %o3, %o1
504e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	jmpl		%o5 + %lo(89f), %g0
505e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 andcc		%o2, 1, %g0
506e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
507e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_SHORTCHUNK(o1, o0, 0x0c, g2, g3)
508e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_SHORTCHUNK(o1, o0, 0x0a, g2, g3)
509e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_SHORTCHUNK(o1, o0, 0x08, g2, g3)
510e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_SHORTCHUNK(o1, o0, 0x06, g2, g3)
511e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_SHORTCHUNK(o1, o0, 0x04, g2, g3)
512e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_SHORTCHUNK(o1, o0, 0x02, g2, g3)
513e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	MOVE_SHORTCHUNK(o1, o0, 0x00, g2, g3)
514e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
515e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng89:	/* short_table_end */
516e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
517e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	be		1f
518e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 nop
519e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
520e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ldub		[%o1], %g2
521e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	stb		%g2, [%o0]
522e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng1:
523e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	retl
524e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 mov		%g7, %o0
525e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
526e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng90:	/* short_aligned_end */
527e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bne		88b
528e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 andcc		%o2, 8, %g0
529e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
530e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	be		1f
531e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 andcc		%o2, 4, %g0
532e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
533e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ld		[%o1 + 0x00], %g2
534e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ld		[%o1 + 0x04], %g3
535e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o1, 8, %o1
536e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st		%g2, [%o0 + 0x00]
537e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	st		%g3, [%o0 + 0x04]
538e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	add		%o0, 8, %o0
539e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng1:
540e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	b		81b
541e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 mov		%o2, %g1
542