xref: /netbsd-src/sys/arch/powerpc/powerpc/pio_subr.S (revision 8b0f9554ff8762542c4defc4f70e1eb76fb508fa)
1/*	$NetBSD: pio_subr.S,v 1.10 2005/12/11 12:18:46 christos Exp $	*/
2
3/*
4 * Copyright (c) 2003 Matt Thomas
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 *    derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
18 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 */
30/*
31 * Assembly note:
32 *	We use rotlw instead of slw because rotlw ignores bit 26 and slw
33 *	doesn't.  However, this may make the high bits of the offset rotate
34 *	in the low bits but if that happens then the offset was too large
35 *	to being with.
36 */
37#ifdef DEBUG
38#define	DBGSYNC	sync
39#else
40#define	DBGSYNC	/* nothing */
41#endif
42/* LINTSTUB: include <sys/param.h> */
43/* LINTSTUB: include <sys/types.h> */
44/* LINTSTUB: include <machine/bus.h> */
45
46/* LINTSTUB: Func: void out8(volatile u_int8_t *a, u_int8_t v) */
47
48ENTRY_NOPROFILE(out8)
49	stbx	4,0,3
50	eieio			/* memory barrier (reorder protection) */
51	DBGSYNC			/* force exceptions */
52	blr			/* return */
53
54/* LINTSTUB: Func: void bsw1_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int8_t v) */
55/* LINTSTUB: Func: void bsw1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int8_t v) */
56
57ENTRY_NOPROFILE(bsw1_s)
58	lwz	0,0(3)		/* get log2(stride) */
59	rotlw	5,5,0		/* shift offset */
60ENTRY_NOPROFILE(bsw1)
61	stbx	6,4,5		/* store value */
62	eieio			/* memory barrier (reorder protection) */
63	DBGSYNC			/* force exceptions */
64	blr			/* return */
65
66/* LINTSTUB: Func: void out16(volatile u_int16_t *a, u_int16_t v) */
67
68ENTRY_NOPROFILE(out16)
69	sth	4,0(3)
70	eieio			/* memory barrier (reorder protection) */
71	DBGSYNC			/* force exceptions */
72	blr			/* return */
73
74/* LINTSTUB: Func: void bsw2_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t v) */
75/* LINTSTUB: Func: void bsw2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t v) */
76
77ENTRY_NOPROFILE(bsw2_s)
78	lwz	0,0(3)		/* get log2(stride) */
79	rotlw	5,5,0		/* shift offset */
80ENTRY_NOPROFILE(bsw2)
81	sthx	6,4,5		/* store value */
82	eieio			/* memory barrier (reorder protection) */
83	DBGSYNC			/* force exceptions */
84	blr			/* return */
85
86/* LINTSTUB: Func: void out32(volatile u_int32_t *a, u_int32_t v) */
87
88ENTRY_NOPROFILE(out32)
89	stw	4,0(3)
90	eieio			/* memory barrier (reorder protection) */
91	DBGSYNC			/* force exceptions */
92	blr			/* return */
93
94/* LINTSTUB: Func: void bsw4_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t v) */
95/* LINTSTUB: Func: void bsw4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t v) */
96
97ENTRY_NOPROFILE(bsw4_s)
98	lwz	0,0(3)		/* get log2(stride) */
99	rotlw	5,5,0		/* shift offset */
100ENTRY_NOPROFILE(bsw4)
101	stwx	6,4,5		/* store value */
102	eieio			/* memory barrier (reorder protection) */
103	DBGSYNC			/* force exceptions */
104	blr			/* return */
105
106/* LINTSTUB: Func: void bsw8_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t v) */
107/* LINTSTUB: Func: void bsw8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t v) */
108ENTRY_NOPROFILE(bsw8_s)
109	lwz	0,0(3)		/* get log2(stride) */
110	rotlw	5,5,0		/* shift offset */
111ENTRY_NOPROFILE(bsw8)
112#ifdef __ARCH64__
113	stdx	6,4,5		/* store value */
114#else
115	trap			/* die */
116#endif
117	eieio			/* memory barrier (reorder protection) */
118	DBGSYNC			/* force exceptions */
119	blr			/* return */
120
121/* LINTSTUB: Func: void out16rb(volatile u_int16_t *a, u_int16_t v) */
122
123ENTRY_NOPROFILE(out16rb)
124	sthbrx	4,0,3
125	eieio			/* memory barrier (reorder protection) */
126	DBGSYNC			/* force exceptions */
127	blr			/* return */
128
129/* LINTSTUB: Func: void bsw2rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t v) */
130/* LINTSTUB: Func: void bsw2rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t v) */
131
132
133ENTRY_NOPROFILE(bsw2rb_s)
134	lwz	0,0(3)		/* get log2(stride) */
135	rotlw	5,5,0		/* shift offset */
136ENTRY_NOPROFILE(bsw2rb)
137	sthbrx	6,4,5		/* store value */
138	eieio			/* memory barrier (reorder protection) */
139	DBGSYNC			/* force exceptions */
140	blr			/* return */
141
142/* LINTSTUB: Func: void out32rb(volatile u_int32_t *a, u_int32_t v) */
143
144ENTRY_NOPROFILE(out32rb)
145	stwbrx	4,0,3
146	eieio			/* memory barrier (reorder protection) */
147	DBGSYNC			/* force exceptions */
148	blr			/* return */
149
150/* LINTSTUB: Func: void bsw4rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t v) */
151/* LINTSTUB: Func: void bsw4rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t v) */
152
153ENTRY_NOPROFILE(bsw4rb_s)
154	lwz	0,0(3)		/* get log2(stride) */
155	rotlw	5,5,0		/* shift offset */
156ENTRY_NOPROFILE(bsw4rb)
157	stwbrx	6,4,5		/* store value */
158	eieio			/* memory barrier (reorder protection) */
159	DBGSYNC			/* force exceptions */
160	blr			/* return */
161
162/* LINTSTUB: Func: void bsw8rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t v) */
163/* LINTSTUB: Func: void bsw8rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t v) */
164
165ENTRY_NOPROFILE(bsw8rb_s)
166	lwz	0,0(3)		/* get log2(stride) */
167	rotlw	5,5,0		/* shift offset */
168ENTRY_NOPROFILE(bsw8rb)
169#ifdef __ARCH64__
170	stdbrx	6,4,5		/* store value */
171#else
172	trap			/* die */
173#endif
174	eieio			/* memory barrier (reorder protection) */
175	DBGSYNC			/* force exceptions */
176	blr			/* return */
177
178/* LINTSTUB: Func: int in8(const volatile u_int8_t *a) */
179
180ENTRY_NOPROFILE(in8)
181	lbz	3,0(3)
182	eieio			/* memory barrier (reorder protection) */
183	DBGSYNC			/* force exceptions */
184	blr			/* return */
185
186/* LINTSTUB: Func: int bsr1_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
187/* LINTSTUB: Func: int bsr1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
188
189ENTRY_NOPROFILE(bsr1_s)
190	lwz	0,0(3)		/* get log2(stride) */
191	rotlw	5,5,0		/* shift offset */
192ENTRY_NOPROFILE(bsr1)
193	lbzx	3,4,5		/* load value */
194	eieio			/* memory barrier (reorder protection) */
195	DBGSYNC			/* force exceptions */
196	blr			/* return */
197
198/* LINTSTUB: Func: int in16(const volatile u_int16_t *a) */
199
200ENTRY_NOPROFILE(in16)
201	lhz	3,0(3)
202	eieio			/* memory barrier (reorder protection) */
203	DBGSYNC			/* force exceptions */
204	blr			/* return */
205
206/* LINTSTUB: Func: int bsr2_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
207/* LINTSTUB: Func: int bsr2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
208
209ENTRY_NOPROFILE(bsr2_s)
210	lwz	0,0(3)		/* get log2(stride) */
211	rotlw	5,5,0		/* shift offset */
212ENTRY_NOPROFILE(bsr2)
213	lhzx	3,4,5		/* load value */
214	eieio			/* memory barrier (reorder protection) */
215	DBGSYNC			/* force exceptions */
216	blr			/* return */
217
218/* LINTSTUB: Func: int in32(const volatile u_int32_t *a) */
219
220ENTRY_NOPROFILE(in32)
221	lwz	3,0(3)
222	eieio			/* memory barrier (reorder protection) */
223	DBGSYNC			/* force exceptions */
224	blr			/* return */
225
226/* LINTSTUB: Func: int bsr4_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
227/* LINTSTUB: Func: int bsr4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
228
229ENTRY_NOPROFILE(bsr4_s)
230	lwz	0,0(3)		/* get log2(stride) */
231	rotlw	5,5,0		/* shift offset */
232ENTRY_NOPROFILE(bsr4)
233	lwzx	3,4,5		/* load value */
234	eieio			/* memory barrier (reorder protection) */
235	DBGSYNC			/* force exceptions */
236	blr			/* return */
237
238/* LINTSTUB: Func: u_int64_t bsr8_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
239/* LINTSTUB: Func: u_int64_t bsr8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
240
241ENTRY_NOPROFILE(bsr8_s)
242	lwz	0,0(3)		/* get log2(stride) */
243	rotlw	5,5,0		/* shift offset */
244ENTRY_NOPROFILE(bsr8)
245#ifdef __ARCH64__
246	lwdx	3,4,5		/* load value */
247#else
248	trap
249#endif
250	eieio			/* memory barrier (reorder protection) */
251	DBGSYNC			/* force exceptions */
252	blr			/* return */
253
254/* LINTSTUB: Func: int in16rb(const volatile u_int16_t *a) */
255
256ENTRY_NOPROFILE(in16rb)
257	lhbrx	3,0,3
258	eieio			/* memory barrier (reorder protection) */
259	DBGSYNC			/* force exceptions */
260	blr			/* return */
261
262/* LINTSTUB: Func: int bsr2rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
263/* LINTSTUB: Func: int bsr2rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
264
265ENTRY_NOPROFILE(bsr2rb_s)
266	lwz	0,0(3)		/* get log2(stride) */
267	rotlw	5,5,0		/* shift offset */
268ENTRY_NOPROFILE(bsr2rb)
269	lhbrx	3,4,5		/* load value */
270	eieio			/* memory barrier (reorder protection) */
271	DBGSYNC			/* force exceptions */
272	blr			/* return */
273
274/* LINTSTUB: Func: int in32rb(const volatile u_int32_t *a) */
275
276ENTRY_NOPROFILE(in32rb)
277	lwbrx	3,0,3
278	eieio			/* memory barrier (reorder protection) */
279	DBGSYNC			/* force exceptions */
280	blr			/* return */
281
282/* LINTSTUB: Func: int bsr4rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
283/* LINTSTUB: Func: int bsr4rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
284
285ENTRY_NOPROFILE(bsr4rb_s)
286	lwz	0,0(3)		/* get log2(stride) */
287	rotlw	5,5,0		/* shift offset */
288ENTRY_NOPROFILE(bsr4rb)
289	lwbrx	3,4,5		/* load value */
290	eieio			/* memory barrier (reorder protection) */
291	DBGSYNC			/* force exceptions */
292	blr			/* return */
293
294/* LINTSTUB: Func: u_int64_t bsr8rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
295/* LINTSTUB: Func: u_int64_t bsr8rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
296
297ENTRY_NOPROFILE(bsr8rb_s)
298	lwz	0,0(3)		/* get log2(stride) */
299	rotlw	5,5,0		/* shift offset */
300ENTRY_NOPROFILE(bsr8rb)
301#ifdef __ARCH64__
302	ldbrx	3,4,5		/* load value */
303#else
304	trap
305#endif
306	eieio			/* memory barrier (reorder protection) */
307	DBGSYNC			/* force exceptions */
308	blr			/* return */
309
310/* LINTSTUB: Func: void bswm1_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int8_t *addr, bus_size_t len) */
311/* LINTSTUB: Func: void bswm1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int8_t *addr, bus_size_t len) */
312/* LINTSTUB: Func: void outs8(volatile u_int8_t *dst, const u_int8_t *src, size_t len) */
313
314ENTRY_NOPROFILE(bswm1_s)
315	lwz	0,0(3)		/* get log2(stride) */
316	rotlw	5,5,0		/* shift offset */
317ENTRY_NOPROFILE(bswm1)
318	add	3,4,5		/* add offset to handle & place in argument 0 */
319	mr	4,6		/* move addr to argument 1 register */
320	mr	5,7		/* move count to argument 2 register */
321ENTRY_NOPROFILE(outs8)
322	cmpwi	5,0		/* len == 0? */
323	beqlr-			/*   return if len == 0 */
324	addi	5,5,-1		/* len -= 1 */
325	add	5,5,4		/* len += src */
326	addi	4,4,-1		/* pre-decrement */
3271:	lbzu	0,1(4)		/* load and increment */
328	stb	0,0(3)		/* store */
329	cmpl	0,4,5		/* at the end? */
330	bne+	1b		/*   nope, do another pass */
331	eieio			/* memory barrier (reorder protection) */
332	DBGSYNC			/* force exceptions */
333	blr			/* return */
334
335/* LINTSTUB: Func: void bswm2_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t *addr, bus_size_t len) */
336/* LINTSTUB: Func: void bswm2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t *addr, bus_size_t len) */
337/* LINTSTUB: Func: void outs16(volatile u_int16_t *dst, const u_int16_t *src, size_t len) */
338
339ENTRY_NOPROFILE(bswm2_s)
340	lwz	0,0(3)		/* get log2(stride) */
341	rotlw	5,5,0		/* shift offset */
342ENTRY_NOPROFILE(bswm2)
343	add	3,4,5		/* add offset to handle & place in argument 0 */
344	mr	4,6		/* move addr to argument 1 register */
345	mr	5,7		/* move count to argument 2 register */
346ENTRY_NOPROFILE(outs16)
347	cmpwi	5,0		/* len == 0? */
348	beqlr-			/*   return if len == 0 */
349	addi	5,5,-1		/* len -= 1 */
350	slwi	5,5,1		/* len *= 2 */
351	add	5,5,4		/* len += src */
352	addi	4,4,-2		/* pre-decrement */
3531:	lhzu	0,2(4)		/* load and increment */
354	sth	0,0(3)		/* store */
355	cmpl	0,4,5		/* at the end? */
356	bne+	1b		/*   nope, do another pass */
357	eieio			/* memory barrier (reorder protection) */
358	DBGSYNC			/* force exceptions */
359	blr			/* return */
360
361/* LINTSTUB: Func: void bswm4_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t *addr, bus_size_t len) */
362/* LINTSTUB: Func: void bswm4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t *addr, bus_size_t len) */
363/* LINTSTUB: Func: void outs32(volatile u_int32_t *dst, const u_int32_t *src, size_t len) */
364
365ENTRY_NOPROFILE(bswm4_s)
366	lwz	0,0(3)		/* get log2(stride) */
367	rotlw	5,5,0		/* shift offset */
368ENTRY_NOPROFILE(bswm4)
369	add	3,4,5		/* add offset to handle & place in argument 0 */
370	mr	4,6		/* move addr to argument 1 register */
371	mr	5,7		/* move count to argument 2 register */
372ENTRY_NOPROFILE(outs32)
373	cmpwi	5,0		/* len == 0? */
374	beqlr-			/*   return if len == 0 */
375	addi	5,5,-1		/* len -= 1 */
376	slwi	5,5,2		/* len *= 4 */
377	add	5,5,4		/* len += src */
378	addi	4,4,-4		/* pre-decrement */
3791:	lwzu	0,4(4)		/* load and increment */
380	stw	0,0(3)		/* store */
381	cmpl	0,4,5		/* at the end? */
382	bne+	1b		/*   nope, do another pass */
383	eieio			/* memory barrier (reorder protection) */
384	DBGSYNC			/* force exceptions */
385	blr			/* return */
386
387/* LINTSTUB: Func: void bswm8_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t *addr, bus_size_t len) */
388/* LINTSTUB: Func: void bswm8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t *addr, bus_size_t len) */
389
390#ifdef _LP64
391ENTRY_NOPROFILE(bswm8_s)
392	ld	0,0(3)		/* get log2(stride) */
393	rotld	5,5,0		/* shift offset */
394ENTRY_NOPROFILE(bswm8)
395	add	3,4,5		/* add offset to handle & place in argument 0 */
396	mr	4,6		/* move addr to argument 1 register */
397	mr	5,7		/* move count to argument 2 register */
398ENTRY_NOPROFILE(outs32)
399	cmpdi	5,0		/* len == 0? */
400	beqlr-			/*   return if len == 0 */
401	addi	5,5,-1		/* len -= 1 */
402	sldi	5,5,2		/* len *= 4 */
403	add	5,5,4		/* len += src */
404	addi	4,4,-4		/* pre-decrement */
4051:	ldzu	0,4(4)		/* load and increment */
406	std	0,0(3)		/* store */
407	cmpl	0,4,5		/* at the end? */
408	bne+	1b		/*   nope, do another pass */
409	eieio			/* memory barrier (reorder protection) */
410	DBGSYNC			/* force exceptions */
411	blr			/* return */
412#else
413ENTRY_NOPROFILE(bswm8_s)
414ENTRY_NOPROFILE(bswm8)
415	trap			/* die */
416#endif
417
418/* LINTSTUB: Func: void bswm2rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t *addr, bus_size_t len) */
419/* LINTSTUB: Func: void bswm2rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t *addr, bus_size_t len) */
420/* LINTSTUB: Func: void outs16rb(volatile u_int16_t *dst, const u_int16_t *src, size_t len) */
421
422ENTRY_NOPROFILE(bswm2rb_s)
423	lwz	0,0(3)		/* get log2(stride) */
424	rotlw	5,5,0		/* shift offset */
425ENTRY_NOPROFILE(bswm2rb)
426	add	3,4,5		/* add offset to handle & place in argument 0 */
427	mr	4,6		/* move addr to argument 1 register */
428	mr	5,7		/* move count to argument 2 register */
429ENTRY_NOPROFILE(outs16rb)
430	cmpwi	5,0		/* len == 0? */
431	beqlr-			/*   return if len == 0 */
432	addi	5,5,-1		/* len -= 1 */
433	slwi	5,5,1		/* len *= 2 */
434	add	5,5,4		/* len += src */
435	addi	4,4,-2		/* pre-decrement */
4361:	lwzu	0,2(4)		/* load and increment */
437	sthbrx	0,0,3		/* store (byte-reversed) */
438	cmpl	0,4,5		/* at the end? */
439	bne+	1b		/*   nope, do another pass */
440	eieio			/* memory barrier (reorder protection) */
441	DBGSYNC			/* force exceptions */
442	blr			/* return */
443
444/* LINTSTUB: Func: void bswm4rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t *addr, bus_size_t len) */
445/* LINTSTUB: Func: void bswm4rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t *addr, bus_size_t len) */
446/* LINTSTUB: Func: void outs32rb(volatile u_int32_t *dst, const u_int32_t *src, size_t len) */
447
448ENTRY_NOPROFILE(bswm4rb_s)
449	lwz	0,0(3)		/* get log2(stride) */
450	rotlw	5,5,0		/* shift offset */
451ENTRY_NOPROFILE(bswm4rb)
452	add	3,4,5		/* add offset to handle & place in argument 0 */
453	mr	4,6		/* move addr to argument 1 register */
454	mr	5,7		/* move count to argument 2 register */
455ENTRY_NOPROFILE(outs32rb)
456	cmpwi	5,0		/* len == 0? */
457	beqlr-			/*   return if len == 0 */
458	addi	5,5,-1		/* len -= 1 */
459	slwi	5,5,2		/* len *= 4 */
460	add	5,5,4		/* len += src */
461	addi	4,4,-4		/* pre-decrement */
4621:	lwzu	0,4(4)		/* load and increment */
463	stwbrx	0,0,3		/* store (byte-reversed) */
464	cmpl	0,4,5		/* at the end? */
465	bne+	1b		/*   nope, do another pass */
466	eieio			/* memory barrier (reorder protection) */
467	DBGSYNC			/* force exceptions */
468	blr			/* return */
469
470/* LINTSTUB: Func: void bswm8rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t *addr, bus_size_t len) */
471/* LINTSTUB: Func: void bswm8rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t *addr, bus_size_t len) */
472ENTRY_NOPROFILE(bswm8rb_s)
473ENTRY_NOPROFILE(bswm8rb)
474	trap
475
476/* LINTSTUB: Func: void bsrm1_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int8_t *addr, bus_size_t len) */
477/* LINTSTUB: Func: void bsrm1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int8_t *addr, bus_size_t len) */
478/* LINTSTUB: Func: void ins8(const volatile u_int8_t *src, u_int8_t *dst, size_t len) */
479
480ENTRY_NOPROFILE(bsrm1_s)
481	lwz	0,0(3)		/* get log2(stride) */
482	rotlw	5,5,0		/* shift offset */
483ENTRY_NOPROFILE(bsrm1)
484	add	3,4,5		/* add offset to handle & place in argument 0 */
485	mr	4,6		/* move addr to argument 1 register */
486	mr	5,7		/* move count to argument 2 register */
487ENTRY_NOPROFILE(ins8)
488	cmpwi	5,0		/* len == 0? */
489	beqlr-			/*   return if len == 0 */
490	addi	5,5,-1		/* len -= 1 */
491	add	5,5,4		/* len += src */
492	addi	4,4,-1		/* pre-decrement */
4931:	lbz	0,0(3)		/* load value */
494	stbu	0,1(4)		/* store and increment */
495	cmpl	0,4,5		/* at the end? */
496	bne+	1b		/*   nope, do another pass */
497	eieio			/* memory barrier (reorder protection) */
498	DBGSYNC			/* force exceptions */
499	blr			/* return */
500
501/* LINTSTUB: Func: void bsrm2_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t *addr, bus_size_t len) */
502/* LINTSTUB: Func: void bsrm2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t *addr, bus_size_t len) */
503/* LINTSTUB: Func: void ins16(const volatile u_int16_t *src, u_int16_t *dst, size_t len) */
504
505ENTRY_NOPROFILE(bsrm2_s)
506	lwz	0,0(3)		/* get log2(stride) */
507	rotlw	5,5,0		/* shift offset */
508ENTRY_NOPROFILE(bsrm2)
509	add	3,4,5		/* add offset to handle & place in argument 0 */
510	mr	4,6		/* move addr to argument 1 register */
511	mr	5,7		/* move count to argument 2 register */
512ENTRY_NOPROFILE(ins16)
513	cmpwi	5,0		/* len == 0? */
514	beqlr-			/*   return if len == 0 */
515	addi	5,5,-1		/* len -= 1 */
516	slwi	5,5,1		/* len *= 2 */
517	add	5,5,4		/* len += src */
518	addi	4,4,-2		/* pre-decrement */
5191:	lhz	0,0(3)		/* load value */
520	sthu	0,2(4)		/* store and increment */
521	cmpl	0,4,5		/* at the end? */
522	bne+	1b		/*   nope, do another pass */
523	eieio			/* memory barrier (reorder protection) */
524	DBGSYNC			/* force exceptions */
525	blr			/* return */
526
527/* LINTSTUB: Func: void bsrm4_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t *addr, bus_size_t len) */
528/* LINTSTUB: Func: void bsrm4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t *addr, bus_size_t len) */
529/* LINTSTUB: Func: void ins32(const volatile u_int32_t *src, u_int32_t *dst, size_t len) */
530
531ENTRY_NOPROFILE(bsrm4_s)
532	lwz	0,0(3)		/* get log2(stride) */
533	rotlw	5,5,0		/* shift offset */
534ENTRY_NOPROFILE(bsrm4)
535	add	3,4,5		/* add offset to handle & place in argument 0 */
536	mr	4,6		/* move addr to argument 1 register */
537	mr	5,7		/* move count to argument 2 register */
538ENTRY_NOPROFILE(ins32)
539	cmpwi	5,0		/* len == 0? */
540	beqlr-			/*   return if len == 0 */
541	addi	5,5,-1		/* len -= 1 */
542	slwi	5,5,2		/* len *= 4 */
543	add	5,5,4		/* len += src */
544	addi	4,4,-4		/* pre-decrement */
5451:	lwz	0,0(3)		/* load value */
546	stwu	0,4(4)		/* store and increment */
547	cmpl	0,4,5		/* at the end? */
548	bne+	1b		/*   nope, do another pass */
549	eieio			/* memory barrier (reorder protection) */
550	DBGSYNC			/* force exceptions */
551	blr			/* return */
552
553/* LINTSTUB: Func: void bsrm8_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t *addr, bus_size_t len) */
554/* LINTSTUB: Func: void bsrm8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t *addr, bus_size_t len) */
555ENTRY_NOPROFILE(bsrm8_s)
556ENTRY_NOPROFILE(bsrm8)
557	trap
558
559/* LINTSTUB: Func: void bsrm2rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t *addr, bus_size_t len) */
560/* LINTSTUB: Func: void ins16rb(const volatile u_int16_t *src, u_int16_t *dst, size_t len) */
561
562ENTRY_NOPROFILE(bsrm2rb_s)
563	lwz	0,0(3)		/* get log2(stride) */
564	rotlw	5,5,0		/* shift offset */
565ENTRY_NOPROFILE(bsrm2rb)
566	add	3,4,5		/* add offset to handle & place in argument 0 */
567	mr	4,6		/* move addr to argument 1 register */
568	mr	5,7		/* move count to argument 2 register */
569ENTRY_NOPROFILE(ins16rb)
570	cmpwi	5,0		/* len == 0? */
571	beqlr-			/*   return if len == 0 */
572	addi	5,5,-1		/* len -= 1 */
573	slwi	5,5,1		/* len *= 2 */
574	add	5,5,4		/* len += src */
575	addi	4,4,-2		/* pre-decrement */
5761:	lhbrx	0,0,3		/* load value (byte reversed) */
577	sthu	0,2(4)		/* store and increment */
578	cmpl	0,4,5		/* at the end? */
579	bne+	1b		/*   nope, do another pass */
580	eieio			/* memory barrier (reorder protection) */
581	DBGSYNC			/* force exceptions */
582	blr			/* return */
583
584/* LINTSTUB: Func: void bsrm4rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t *addr, bus_size_t len) */
585/* LINTSTUB: Func: void bsrm4rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t *addr, bus_size_t len) */
586/* LINTSTUB: Func: void ins32rb(const volatile u_int32_t *src, u_int32_t *dst, size_t len) */
587ENTRY_NOPROFILE(bsrm4rb_s)
588	lwz	0,0(3)		/* get log2(stride) */
589	rotlw	5,5,0		/* shift offset */
590ENTRY_NOPROFILE(bsrm4rb)
591	add	3,4,5		/* add offset to handle & place in argument 0 */
592	mr	4,6		/* move addr to argument 1 register */
593	mr	5,7		/* move count to argument 2 register */
594ENTRY_NOPROFILE(ins32rb)
595	cmpwi	5,0		/* len == 0? */
596	beqlr-			/*   return if len == 0 */
597	addi	5,5,-1		/* len -= 1 */
598	slwi	5,5,2		/* len *= 4 */
599	add	5,5,4		/* len += src */
600	addi	4,4,-4		/* pre-decrement */
6011:	lwbrx	0,0,3		/* load value (byte reversed) */
602	stwu	0,4(4)		/* store and increment */
603	cmpl	0,4,5		/* at the end? */
604	bne+	1b		/*   nope, do another pass */
605	eieio			/* memory barrier (reorder protection) */
606	DBGSYNC			/* force exceptions */
607	blr			/* return */
608
609/* LINTSTUB: Func: void bsrm8rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t *addr, bus_size_t len) */
610/* LINTSTUB: Func: void bsrm8rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t *addr, bus_size_t len) */
611ENTRY_NOPROFILE(bsrm8rb_s)
612ENTRY_NOPROFILE(bsrm8rb)
613	trap
614
615/* LINTSTUB: Func: void bswr1_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int8_t *a, bus_size_t c); */
616/* LINTSTUB: Func: void bswr1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int8_t *a, bus_size_t c); */
617ENTRY_NOPROFILE(bswr1_s)
618	lwz	0,0(3)		/* get log2(stride) */
619	li	8,1		/* distance between dst bytes */
620	rotlw	5,5,0		/* shift offset */
621	rotlw	8,8,0		/* shift distance */
622	b	.Lbswr1_enter
623ENTRY_NOPROFILE(bswr1)
624	li	8,1		/* distance between dst bytes */
625.Lbswr1_enter:
626	add	3,4,5		/* add offset to handle & place in argument 0 */
627	cmpwi	7,0		/* len == 0? */
628	beqlr-			/*   return if len == 0 */
629	addi	7,7,-1		/* len -= 1 */
630	add	7,7,6		/* len += src */
631	addi	6,6,-1		/* pre-decrement */
632	sub	3,3,8
6331:	lbzu	0,1(6)		/* load and increment */
634	stbux	0,3,8		/* store and add distance */
635	cmpl	0,6,7		/* at the end? */
636	bne+	1b		/*   nope, do another pass */
637	eieio			/* memory barrier (reorder protection) */
638	DBGSYNC			/* force exceptions */
639	blr			/* return */
640
641/* LINTSTUB: Func: void bswr2_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t *a, bus_size_t c); */
642/* LINTSTUB: Func: void bswr2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t *a, bus_size_t c); */
643ENTRY_NOPROFILE(bswr2_s)
644	lwz	0,0(3)		/* get log2(stride) */
645	li	8,2		/* distance between dst halfwords */
646	rotlw	5,5,0		/* shift offset */
647	rotlw	8,8,0		/* shift distance */
648	b	.Lbswr2_enter
649ENTRY_NOPROFILE(bswr2)
650	li	8,2		/* distance between dst halfwords */
651.Lbswr2_enter:
652	add	3,4,5		/* add offset to handle & place in argument 0 */
653	cmpwi	7,0		/* len == 0? */
654	beqlr-			/*   return if len == 0 */
655	addi	7,7,-1		/* len -= 1 */
656	slwi	7,7,1		/* len *= 2 */
657	add	7,7,6		/* len += src */
658	addi	6,6,-2		/* pre-decrement */
659	sub	3,3,8
6601:	lhzu	0,2(6)		/* load and increment */
661	sthux	0,3,8		/* store and add distance */
662	cmpl	0,6,7		/* at the end? */
663	bne+	1b		/*   nope, do another pass */
664	eieio			/* memory barrier (reorder protection) */
665	DBGSYNC			/* force exceptions */
666	blr			/* return */
667
668/* LINTSTUB: Func: void bswr2rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t *a, bus_size_t c); */
669/* LINTSTUB: Func: void bswr2rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t *a, bus_size_t c); */
670ENTRY_NOPROFILE(bswr2rb_s)
671	lwz	0,0(3)		/* get log2(stride) */
672	li	8,2		/* distance between dst halfwords */
673	rotlw	5,5,0		/* shift offset */
674	rotlw	8,8,0		/* shift distance */
675	b	.Lbswr2rb_enter
676ENTRY_NOPROFILE(bswr2rb)
677	li	8,2		/* distance between dst halfwords */
678.Lbswr2rb_enter:
679	add	3,4,5		/* add offset to handle & place in argument 0 */
680	cmpwi	7,0		/* len == 0? */
681	beqlr-			/*   return if len == 0 */
682	addi	7,7,-1		/* len -= 1 */
683	slwi	7,7,1		/* len *= 2 */
684	add	7,7,6		/* len += src */
685	addi	6,6,-2		/* pre-decrement */
6861:	lhzu	0,2(6)		/* load and increment */
687	sthbrx	0,0,3		/* store (reversed) */
688	add	3,3,8		/* dst += distance */
689	cmpl	0,6,7		/* at the end? */
690	bne+	1b		/*   nope, do another pass */
691	eieio			/* memory barrier (reorder protection) */
692	DBGSYNC			/* force exceptions */
693	blr			/* return */
694
695/* LINTSTUB: Func: void bswr4_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t *a, bus_size_t c); */
696/* LINTSTUB: Func: void bswr4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t *a, bus_size_t c); */
697ENTRY_NOPROFILE(bswr4_s)
698	lwz	0,0(3)		/* get log2(stride) */
699	li	8,4		/* distance between dst halfwords */
700	rotlw	5,5,0		/* shift offset */
701	rotlw	8,8,0		/* shift distance */
702	b	.Lbswr4_enter
703ENTRY_NOPROFILE(bswr4)
704	li	8,4		/* distance between dst halfwords */
705.Lbswr4_enter:
706	add	3,4,5		/* add offset to handle & place in argument 0 */
707	cmpwi	7,0		/* len == 0? */
708	beqlr-			/*   return if len == 0 */
709	addi	7,7,-1		/* len -= 1 */
710	slwi	7,7,2		/* len *= 4 */
711	add	7,7,6		/* len += src */
712	addi	6,6,-4		/* pre-decrement */
713	sub	3,3,8
7141:	lwzu	0,4(6)		/* load and increment */
715	stwux	0,3,8		/* store and add distance */
716	cmpl	0,6,7		/* at the end? */
717	bne+	1b		/*   nope, do another pass */
718	eieio			/* memory barrier (reorder protection) */
719	DBGSYNC			/* force exceptions */
720	blr			/* return */
721
722/* LINTSTUB: Func: void bswr4rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t *a, bus_size_t c); */
723/* LINTSTUB: Func: void bswr4rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t *a, bus_size_t c); */
724ENTRY_NOPROFILE(bswr4rb_s)
725	lwz	0,0(3)		/* get log2(stride) */
726	li	8,4		/* distance between dst halfwords */
727	rotlw	5,5,0		/* shift offset */
728	rotlw	8,8,0		/* shift distance */
729	b	.Lbswr4rb_enter
730ENTRY_NOPROFILE(bswr4rb)
731	li	8,4		/* distance between dst halfwords */
732.Lbswr4rb_enter:
733	add	3,4,5		/* add offset to handle & place in argument 0 */
734	cmpwi	7,0		/* len == 0? */
735	beqlr-			/*   return if len == 0 */
736	addi	7,7,-1		/* len -= 1 */
737	slwi	7,7,2		/* len *= 4 */
738	add	7,7,6		/* len += src */
739	addi	6,6,-4		/* pre-decrement */
7401:	lwzu	0,4(6)		/* load and increment */
741	stwbrx	0,0,3		/* store (reversed) */
742	add	3,3,8		/* dst += distance */
743	cmpl	0,6,7		/* at the end? */
744	bne+	1b		/*   nope, do another pass */
745	eieio			/* memory barrier (reorder protection) */
746	DBGSYNC			/* force exceptions */
747	blr			/* return */
748
749/* LINTSTUB: Func: void bswr8_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t *a, bus_size_t c); */
750/* LINTSTUB: Func: void bswr8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t *a, bus_size_t c); */
751/* LINTSTUB: Func: void bswr8rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t *a, bus_size_t c); */
752/* LINTSTUB: Func: void bswr8rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t *a, bus_size_t c); */
753ENTRY_NOPROFILE(bswr8_s)
754ENTRY_NOPROFILE(bswr8rb_s)
755	lwz	0,0(3)
756	rotlw	5,5,0
757ENTRY_NOPROFILE(bswr8)
758ENTRY_NOPROFILE(bswr8rb)
759	trap
760
761/* LINTSTUB: Func: void bsrr1_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int8_t *a, bus_size_t c); */
762/* LINTSTUB: Func: void bsrr1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int8_t *a, bus_size_t c); */
763ENTRY_NOPROFILE(bsrr1_s)
764	lwz	0,0(3)		/* get log2(stride) */
765	li	8,1		/* distance between src bytes */
766	rotlw	5,5,0		/* shift offset */
767	rotlw	8,8,0		/* shift distance */
768	b	.Lbsrr1_enter
769ENTRY_NOPROFILE(bsrr1)
770	li	8,1		/* distance between src bytes */
771.Lbsrr1_enter:
772	add	3,4,5		/* add offset to handle & place in argument 0 */
773	cmpwi	7,0		/* len == 0? */
774	beqlr-			/*   return if len == 0 */
775	addi	7,7,-1		/* len -= 1 */
776	add	7,7,6		/* len += src */
777	addi	6,6,-1		/* pre-decrement */
778	sub	3,3,8
7791:	lbzux	0,3,8		/* load value and add distance */
780	stbu	0,1(6)		/* store and increment */
781	cmpl	0,6,7		/* at the end? */
782	bne+	1b		/*   nope, do another pass */
783	eieio			/* memory barrier (reorder protection) */
784	DBGSYNC			/* force exceptions */
785	blr			/* return */
786
787/* LINTSTUB: Func: void bsrr2_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t *a, bus_size_t c); */
788/* LINTSTUB: Func: void bsrr2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t *a, bus_size_t c); */
789ENTRY_NOPROFILE(bsrr2_s)
790	lwz	0,0(3)		/* get log2(stride) */
791	li	8,2		/* distance between src halfwords */
792	rotlw	5,5,0		/* shift offset */
793	rotlw	8,8,0		/* shift distance */
794	b	.Lbsrr2_enter
795ENTRY_NOPROFILE(bsrr2)
796	li	8,2		/* distance between src halfwords */
797.Lbsrr2_enter:
798	add	3,4,5		/* add offset to handle & place in argument 0 */
799	cmpwi	7,0		/* len == 0? */
800	beqlr-			/*   return if len == 0 */
801	addi	7,7,-1		/* len -= 1 */
802	slwi	7,7,1		/* len *= 2 */
803	add	7,7,6		/* len += src */
804	addi	6,6,-2		/* pre-decrement */
805	sub	3,3,8
8061:	lhzux	0,3,8		/* load value and add distance */
807	sthu	0,2(6)		/* store and increment */
808	cmpl	0,6,7		/* at the end? */
809	bne+	1b		/*   nope, do another pass */
810	eieio			/* memory barrier (reorder protection) */
811	DBGSYNC			/* force exceptions */
812	blr			/* return */
813
814/* LINTSTUB: Func: void bsrr2rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t *a, bus_size_t c); */
815/* LINTSTUB: Func: void bsrr2rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t *a, bus_size_t c); */
816ENTRY_NOPROFILE(bsrr2rb_s)
817	lwz	0,0(3)		/* get log2(stride) */
818	li	8,2		/* distance between source halfwords */
819	rotlw	5,5,0		/* shift offset */
820	rotlw	8,8,0		/* shift distance */
821	b	.Lbsrr2rb_enter
822ENTRY_NOPROFILE(bsrr2rb)
823	li	8,2		/* distance between source halfwords */
824.Lbsrr2rb_enter:
825	add	3,4,5		/* add offset to handle & place in argument 0 */
826	cmpwi	7,0		/* len == 0? */
827	beqlr-			/*   return if len == 0 */
828	addi	7,7,-1		/* len -= 1 */
829	slwi	7,7,1		/* len *= 2 */
830	add	7,7,6		/* len += src */
831	addi	6,6,-2		/* pre-decrement */
8321:	lhbrx	0,0,3		/* load value (reversed) */
833	add	3,3,8		/* src += distance */
834	sthu	0,2(6)		/* store and increment */
835	cmpl	0,6,7		/* at the end? */
836	bne+	1b		/*   nope, do another pass */
837	eieio			/* memory barrier (reorder protection) */
838	DBGSYNC			/* force exceptions */
839	blr			/* return */
840
841/* LINTSTUB: Func: void bsrr4_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t *a, bus_size_t c); */
842/* LINTSTUB: Func: void bsrr4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t *a, bus_size_t c); */
843ENTRY_NOPROFILE(bsrr4_s)
844	lwz	0,0(3)		/* get log2(stride) */
845	li	8,4		/* distance between src words */
846	rotlw	5,5,0		/* shift offset */
847	rotlw	8,8,0		/* shift distance */
848	b	.Lbsrr4_enter
849ENTRY_NOPROFILE(bsrr4)
850	li	8,4		/* distance between src words */
851.Lbsrr4_enter:
852	add	3,4,5		/* add offset to handle & place in argument 0 */
853	cmpwi	7,0		/* len == 0? */
854	beqlr-			/*   return if len == 0 */
855	addi	7,7,-1		/* len -= 1 */
856	slwi	7,7,2		/* len *= 4 */
857	add	7,7,6		/* len += src */
858	addi	6,6,-4		/* pre-decrement */
859	sub	3,3,8
8601:	lwzux	0,3,8		/* load value and add distance */
861	stwu	0,4(6)		/* store and increment */
862	cmpl	0,6,7		/* at the end? */
863	bne+	1b		/*   nope, do another pass */
864	eieio			/* memory barrier (reorder protection) */
865	DBGSYNC			/* force exceptions */
866	blr			/* return */
867
868/* LINTSTUB: Func: void bsrr4rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t *a, bus_size_t c); */
869/* LINTSTUB: Func: void bsrr4rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t *a, bus_size_t c); */
870ENTRY_NOPROFILE(bsrr4rb_s)
871	lwz	0,0(3)		/* get log2(stride) */
872	li	8,4		/* distance between src words */
873	rotlw	5,5,0		/* shift offset */
874	rotlw	8,8,0		/* shift distance */
875	b	.Lbsrr4rb_enter
876ENTRY_NOPROFILE(bsrr4rb)
877	li	8,4		/* distance between src words */
878.Lbsrr4rb_enter:
879	add	3,4,5		/* add offset to handle & place in argument 0 */
880	mr	4,6		/* move addr to argument 1 register */
881	cmpwi	7,0		/* len == 0? */
882	beqlr-			/*   return if len == 0 */
883	addi	7,7,-1		/* len -= 1 */
884	slwi	7,7,2		/* len *= 4 */
885	add	7,7,6		/* len += src */
886	addi	6,6,-4		/* pre-decrement */
8871:	lwbrx	0,0,3		/* load value (reversed) */
888	add	3,3,8		/* src += distance */
889	sthu	0,4(6)		/* store and increment */
890	cmpl	0,6,7		/* at the end? */
891	bne+	1b		/*   nope, do another pass */
892	eieio			/* memory barrier (reorder protection) */
893	DBGSYNC			/* force exceptions */
894	blr			/* return */
895
896/* LINTSTUB: Func: void bsrr8_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t *a, bus_size_t c); */
897/* LINTSTUB: Func: void bsrr8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t *a, bus_size_t c); */
898/* LINTSTUB: Func: void bsrr8rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t *a, bus_size_t c); */
899/* LINTSTUB: Func: void bsrr8rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t *a, bus_size_t c); */
900ENTRY_NOPROFILE(bsrr8_s)
901ENTRY_NOPROFILE(bsrr8rb_s)
902	lwz	0,0(3)
903	rotlw	5,5,0
904ENTRY_NOPROFILE(bsrr8)
905ENTRY_NOPROFILE(bsrr8rb)
906	trap
907
908/* LINTSTUB: Func: void bssr1_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int8_t v, bus_size_t c); */
909/* LINTSTUB: Func: void bssr1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int8_t v, bus_size_t c); */
910ENTRY_NOPROFILE(bssr1_s)
911	lwz	0,0(3)		/* get log2(stride) */
912	li	8,1		/* distance between src bytes */
913	rotlw	5,5,0		/* shift offset */
914	rotlw	8,8,0		/* shift distance */
915	b	.Lbssr1_enter
916ENTRY_NOPROFILE(bssr1)
917	li	8,1		/* distance between src bytes */
918.Lbssr1_enter:
919	cmpwi	7,0		/* len == 0? */
920	beqlr-			/*   return if len == 0 */
9211:	addi	7,7,-1		/* len -= 1 */
922	stbx	6,4,5		/* store value */
923	add	5,5,8		/* add offset */
924	cmpwi	7,0		/* len == 0? */
925	bne+	1b		/*   nope, do another pass */
926	eieio			/* memory barrier (reorder protection) */
927	DBGSYNC			/* force exceptions */
928	blr			/* return */
929
930/* LINTSTUB: Func: void bssr2_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t v, bus_size_t c); */
931/* LINTSTUB: Func: void bssr2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t v, bus_size_t c); */
932ENTRY_NOPROFILE(bssr2_s)
933	lwz	0,0(3)		/* get log2(stride) */
934	li	8,2		/* distance between src halfwords */
935	rotlw	5,5,0		/* shift offset */
936	rotlw	8,8,0		/* shift distance */
937	b	.Lbssr2_enter
938ENTRY_NOPROFILE(bssr2)
939	li	8,2		/* distance between src halfwords */
940.Lbssr2_enter:
941	cmpwi	7,0		/* len == 0? */
942	beqlr-			/*   return if len == 0 */
9431:	addi	7,7,-1		/* len -= 1 */
944	sthx	6,4,5		/* store value */
945	add	5,5,8		/* add offset */
946	cmpwi	7,0		/* len == 0? */
947	bne+	1b		/*   nope, do another pass */
948	eieio			/* memory barrier (reorder protection) */
949	DBGSYNC			/* force exceptions */
950	blr			/* return */
951
952/* LINTSTUB: Func: void bssr2rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t v, bus_size_t c); */
953/* LINTSTUB: Func: void bssr2rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t v, bus_size_t c); */
954ENTRY_NOPROFILE(bssr2rb_s)
955	lwz	0,0(3)		/* get log2(stride) */
956	li	8,2		/* distance between src halfwords */
957	rotlw	5,5,0		/* shift offset */
958	rotlw	8,8,0		/* shift distance */
959	b	.Lbssr2rb_enter
960ENTRY_NOPROFILE(bssr2rb)
961	li	8,2		/* distance between src halfwords */
962.Lbssr2rb_enter:
963	cmpwi	7,0		/* len == 0? */
964	beqlr-			/*   return if len == 0 */
9651:	addi	7,7,-1		/* len -= 1 */
966	sthbrx	6,4,5		/* store value */
967	add	5,5,8		/* add offset */
968	cmpwi	7,0		/* len == 0? */
969	bne+	1b		/*   nope, do another pass */
970	eieio			/* memory barrier (reorder protection) */
971	DBGSYNC			/* force exceptions */
972	blr			/* return */
973
974/* LINTSTUB: Func: void bssr4_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t v, bus_size_t c); */
975/* LINTSTUB: Func: void bssr4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t v, bus_size_t c); */
976ENTRY_NOPROFILE(bssr4_s)
977	lwz	0,0(3)		/* get log2(stride) */
978	li	8,4		/* distance between src words */
979	rotlw	5,5,0		/* shift offset */
980	rotlw	8,8,0		/* shift distance */
981	b	.Lbssr4_enter
982ENTRY_NOPROFILE(bssr4)
983	li	8,4		/* distance between src words */
984.Lbssr4_enter:
985	cmpwi	7,0		/* len == 0? */
986	beqlr-			/*   return if len == 0 */
9871:	addi	7,7,-1		/* len -= 1 */
988	stwx	6,4,5		/* store value */
989	add	5,5,8		/* add offset */
990	cmpwi	7,0		/* len == 0? */
991	bne+	1b		/*   nope, do another pass */
992	eieio			/* memory barrier (reorder protection) */
993	DBGSYNC			/* force exceptions */
994	blr			/* return */
995
996/* LINTSTUB: Func: void bssr4rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t v, bus_size_t c); */
997/* LINTSTUB: Func: void bssr4rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t v, bus_size_t c); */
998ENTRY_NOPROFILE(bssr4rb_s)
999	lwz	0,0(3)		/* get log2(stride) */
1000	li	8,4		/* distance between src words */
1001	rotlw	5,5,0		/* shift offset */
1002	rotlw	8,8,0		/* shift distance */
1003	b	.Lbssr4rb_enter
1004ENTRY_NOPROFILE(bssr4rb)
1005	li	8,4		/* distance between src words */
1006.Lbssr4rb_enter:
1007	cmpwi	7,0		/* len == 0? */
1008	beqlr-			/*   return if len == 0 */
10091:	addi	7,7,-1		/* len -= 1 */
1010	stwbrx	6,4,5		/* store value */
1011	add	5,5,8		/* add offset */
1012	cmpwi	7,0		/* len == 0? */
1013	bne+	1b		/*   nope, do another pass */
1014	eieio			/* memory barrier (reorder protection) */
1015	DBGSYNC			/* force exceptions */
1016	blr			/* return */
1017
1018/* LINTSTUB: Func: void bssr8_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t v, bus_size_t c); */
1019/* LINTSTUB: Func: void bssr8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t v, bus_size_t c); */
1020/* LINTSTUB: Func: void bssr8rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t v, bus_size_t c); */
1021/* LINTSTUB: Func: void bssr8rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t v, bus_size_t c); */
1022ENTRY_NOPROFILE(bssr8_s)
1023ENTRY_NOPROFILE(bssr8rb_s)
1024	lwz	0,0(3)
1025	rotlw	5,5,0
1026ENTRY_NOPROFILE(bssr8)
1027ENTRY_NOPROFILE(bssr8rb)
1028	trap
1029
1030/* LINTSTUB: Func: void bscr1_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, bus_space_handle_t h2, bus_size_t o2, bus_size_t len); */
1031/* LINTSTUB: Func: void bscr1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, bus_space_handle_t h2, bus_size_t o2, bus_size_t len); */
1032ENTRY_NOPROFILE(bscr1_s)
1033	lwz	0,0(3)		/* get log2(stride) */
1034	b	.Lbscr1_enter
1035ENTRY_NOPROFILE(bscr1)
1036	li	0,0		/* non stride */
1037.Lbscr1_enter:
1038	li	9,1		/* distance between src bytes */
1039	rotlw	9,9,0		/* shift distance */
1040	cmpwi	8,0		/* len == 0? */
1041	beqlr-			/*   return if len == 0 */
1042	rotlw	5,5,0		/* shift src offset */
1043	rotlw	7,7,0		/* shift dest offset */
1044	add	10,4,5		/* calculate src end address */
1045	add	11,6,7		/* calculate dest end address */
1046	mtctr	8
1047	cmpw	10,11		/* compare end address */
1048	blt	2f		/* jump if h + o < h2 + o2 */
1049
1050				/* h + o >= h2 + o2 */
10511:	lbzx	12,4,5		/* load value */
1052	stbx	12,6,7		/* store value */
1053	add	5,5,9		/* src offset += 1 */
1054	add	7,7,9		/* dest offset += 1 */
1055	bdnz+	1b		/* jump if len != 0 */
1056	b	.Lbscr1_end	/* end */
1057
1058				/* h + o < h2 + o2 */
10592:	addi	8,8,-1		/* len -= 1 */
1060	rotlw	8,8,0		/* shift len */
1061	add	5,10,8		/* src offset = o + len - 1 */
1062	add	7,11,8		/* dest offset = o2 + len - 1 */
10633:	lbzx	12,4,5		/* load value */
1064	stbx	12,6,7		/* store value */
1065	sub	5,5,9		/* src offset -= 1 */
1066	sub	7,7,9		/* dest offset -= 1 */
1067	bdnz+	3b		/* jump if len != 0 */
1068.Lbscr1_end:
1069	eieio			/* memory barrier (reorder protection) */
1070	DBGSYNC			/* force exceptions */
1071	blr			/* return */
1072
1073/* LINTSTUB: Func: void bscr2_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, bus_space_handle_t h2, bus_size_t o2, bus_size_t len); */
1074/* LINTSTUB: Func: void bscr2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, bus_space_handle_t h2, bus_size_t o2, bus_size_t len); */
1075ENTRY_NOPROFILE(bscr2_s)
1076	lwz	0,0(3)		/* get log2(stride) */
1077	b	.Lbscr2_enter
1078ENTRY_NOPROFILE(bscr2)
1079	li	0,0		/* non stride */
1080.Lbscr2_enter:
1081	li	9,2		/* distance between src halfwords */
1082	rotlw	9,9,0		/* shift distance */
1083	cmpwi	8,0		/* len == 0? */
1084	beqlr-			/*   return if len == 0 */
1085	rotlw	5,5,0		/* shift src offset */
1086	rotlw	7,7,0		/* shift dest offset */
1087	add	10,4,5		/* calculate src end address */
1088	add	11,6,7		/* calculate dest end address */
1089	mtctr	8
1090	cmpw	10,11		/* compare end address */
1091	blt	2f		/* jump if h + o < h2 + o2 */
1092
1093				/* h + o >= h2 + o2 */
10941:	lhzx	12,4,5		/* load value */
1095	sthx	12,6,7		/* store value */
1096	add	5,5,9		/* src offset += 2 */
1097	add	7,7,9		/* dest offset += 2 */
1098	bdnz+	1b		/* jump if len != 0 */
1099	b	.Lbscr2_end	/* end */
1100
1101				/* h + o < h2 + o2 */
11022:	addi	8,8,-1		/* len -= 1 */
1103	rotlw	8,8,0		/* shift len */
1104	add	5,10,8		/* src offset = o + len - 1 */
1105	add	7,11,8		/* dest offset = o2 + len - 1 */
11063:	lhzx	12,4,5		/* load value */
1107	sthx	12,6,7		/* store value */
1108	sub	5,5,9		/* src offset -= 2 */
1109	sub	7,7,9		/* dest offset -= 2 */
1110	bdnz+	3b		/* jump if len != 0 */
1111.Lbscr2_end:
1112	eieio			/* memory barrier (reorder protection) */
1113	DBGSYNC			/* force exceptions */
1114	blr			/* return */
1115
1116/* LINTSTUB: Func: void bscr4_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, bus_space_handle_t h2, bus_size_t o2, bus_size_t len); */
1117/* LINTSTUB: Func: void bscr4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, bus_space_handle_t h2, bus_size_t o2, bus_size_t len); */
1118ENTRY_NOPROFILE(bscr4_s)
1119	lwz	0,0(3)		/* get log2(stride) */
1120	b	.Lbscr4_enter
1121ENTRY_NOPROFILE(bscr4)
1122	li	0,0		/* non stride */
1123.Lbscr4_enter:
1124	li	9,4		/* distance between src words */
1125	rotlw	9,9,0		/* shift distance */
1126	cmpwi	8,0		/* len == 0? */
1127	beqlr-			/*   return if len == 0 */
1128	rotlw	5,5,0		/* shift src offset */
1129	rotlw	7,7,0		/* shift dest offset */
1130	add	10,4,5		/* calculate src end address */
1131	add	11,6,7		/* calculate dest end address */
1132	mtctr	8
1133	cmpw	10,11		/* compare end address */
1134	blt	2f		/* jump if h + o < h2 + o2 */
1135
1136				/* h + o >= h2 + o2 */
11371:	lwzx	12,4,5		/* load value */
1138	stwx	12,6,7		/* store value */
1139	add	5,5,9		/* src offset += 4 */
1140	add	7,7,9		/* dest offset += 4 */
1141	bdnz+	1b		/* jump if len != 0 */
1142	b	.Lbscr4_end	/* end */
1143
1144				/* h + o < h2 + o2 */
11452:	addi	8,8,-1		/* len -= 1 */
1146	rotlw	8,8,0		/* shift len */
1147	add	5,10,8		/* src offset = o + len - 1 */
1148	add	7,11,8		/* dest offset = o2 + len - 1 */
11493:	lwzx	12,4,5		/* load value */
1150	stwx	12,6,7		/* store value */
1151	sub	5,5,9		/* src offset -= 4 */
1152	sub	7,7,9		/* dest offset -= 4 */
1153	bdnz+	3b		/* jump if len != 0 */
1154.Lbscr4_end:
1155	eieio			/* memory barrier (reorder protection) */
1156	DBGSYNC			/* force exceptions */
1157	blr			/* return */
1158
1159/* LINTSTUB: Func: void bscr8_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, bus_space_handle_t h2, bus_size_t o2, bus_size_t len); */
1160/* LINTSTUB: Func: void bscr8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, bus_space_handle_t h2, bus_size_t o2, bus_size_t len); */
1161ENTRY_NOPROFILE(bscr8_s)
1162ENTRY_NOPROFILE(bscr8)
1163	trap
1164
1165