xref: /netbsd-src/sys/arch/powerpc/powerpc/pio_subr.S (revision b62fc9e20372b08e1785ff6d769312d209fa2005)
1/*	$NetBSD: pio_subr.S,v 1.12 2008/05/25 15:56:12 chs 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(out8)
49	stbx	%r4,0,%r3
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(bsw1_s)
58	lwz	%r0,0(%r3)	/* get log2(stride) */
59	rotlw	%r5,%r5,%r0	/* shift offset */
60ENTRY(bsw1)
61	stbx	%r6,%r4,%r5	/* 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(out16)
69	sth	%r4,0(%r3)
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(bsw2_s)
78	lwz	%r0,0(%r3)	/* get log2(stride) */
79	rotlw	%r5,%r5,%r0	/* shift offset */
80ENTRY(bsw2)
81	sthx	%r6,%r4,%r5	/* 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(out32)
89	stw	%r4,0(%r3)
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(bsw4_s)
98	lwz	%r0,0(%r3)	/* get log2(stride) */
99	rotlw	%r5,%r5,%r0	/* shift offset */
100ENTRY(bsw4)
101	stwx	%r6,%r4,%r5	/* 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(bsw8_s)
109	lwz	%r0,0(%r3)	/* get log2(stride) */
110	rotlw	%r5,%r5,%r0	/* shift offset */
111ENTRY(bsw8)
112#ifdef __ARCH64__
113	stdx	%r6,%r4,%r5	/* 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(out16rb)
124	sthbrx	%r4,0,%r3
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(bsw2rb_s)
134	lwz	%r0,0(%r3)	/* get log2(stride) */
135	rotlw	%r5,%r5,%r0	/* shift offset */
136ENTRY(bsw2rb)
137	sthbrx	%r6,%r4,%r5	/* 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(out32rb)
145	stwbrx	%r4,0,%r3
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(bsw4rb_s)
154	lwz	%r0,0(%r3)	/* get log2(stride) */
155	rotlw	%r5,%r5,%r0	/* shift offset */
156ENTRY(bsw4rb)
157	stwbrx	%r6,%r4,%r5	/* 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(bsw8rb_s)
166	lwz	%r0,0(%r3)	/* get log2(stride) */
167	rotlw	%r5,%r5,%r0	/* shift offset */
168ENTRY(bsw8rb)
169#ifdef __ARCH64__
170	stdbrx	%r6,%r4,%r5	/* 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(in8)
181	lbz	%r3,0(%r3)
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(bsr1_s)
190	lwz	%r0,0(%r3)	/* get log2(stride) */
191	rotlw	%r5,%r5,%r0	/* shift offset */
192ENTRY(bsr1)
193	lbzx	%r3,%r4,%r5	/* 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(in16)
201	lhz	%r3,0(%r3)
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(bsr2_s)
210	lwz	%r0,0(%r3)	/* get log2(stride) */
211	rotlw	%r5,%r5,%r0	/* shift offset */
212ENTRY(bsr2)
213	lhzx	%r3,%r4,%r5	/* 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(in32)
221	lwz	%r3,0(%r3)
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(bsr4_s)
230	lwz	%r0,0(%r3)	/* get log2(stride) */
231	rotlw	%r5,%r5,%r0	/* shift offset */
232ENTRY(bsr4)
233	lwzx	%r3,%r4,%r5	/* 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(bsr8_s)
242	lwz	%r0,0(%r3)	/* get log2(stride) */
243	rotlw	%r5,%r5,%r0	/* shift offset */
244ENTRY(bsr8)
245#ifdef __ARCH64__
246	lwdx	%r3,%r4,%r5	/* 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(in16rb)
257	lhbrx	%r3,0,%r3
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(bsr2rb_s)
266	lwz	%r0,0(%r3)	/* get log2(stride) */
267	rotlw	%r5,%r5,%r0	/* shift offset */
268ENTRY(bsr2rb)
269	lhbrx	%r3,%r4,%r5	/* 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(in32rb)
277	lwbrx	%r3,0,%r3
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(bsr4rb_s)
286	lwz	%r0,0(%r3)	/* get log2(stride) */
287	rotlw	%r5,%r5,%r0	/* shift offset */
288ENTRY(bsr4rb)
289	lwbrx	%r3,%r4,%r5	/* 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(bsr8rb_s)
298	lwz	%r0,0(%r3)	/* get log2(stride) */
299	rotlw	%r5,%r5,%r0	/* shift offset */
300ENTRY(bsr8rb)
301#ifdef __ARCH64__
302	ldbrx	%r3,%r4,%r5	/* 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(bswm1_s)
315	lwz	%r0,0(%r3)	/* get log2(stride) */
316	rotlw	%r5,%r5,%r0	/* shift offset */
317ENTRY(bswm1)
318	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
319	mr	%r4,%r6		/* move addr to argument 1 register */
320	mr	%r5,%r7		/* move count to argument 2 register */
321ENTRY(outs8)
322	cmpwi	%r5,0		/* len == 0? */
323	beqlr-			/*   return if len == 0 */
324	addi	%r5,%r5,-1	/* len -= 1 */
325	add	%r5,%r5,%r4	/* len += src */
326	addi	%r4,%r4,-1	/* pre-decrement */
3271:	lbzu	%r0,1(%r4)	/* load and increment */
328	stb	%r0,0(%r3)	/* store */
329	cmpl	0,%r4,%r5	/* 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(bswm2_s)
340	lwz	%r0,0(%r3)	/* get log2(stride) */
341	rotlw	%r5,%r5,%r0	/* shift offset */
342ENTRY(bswm2)
343	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
344	mr	%r4,%r6		/* move addr to argument 1 register */
345	mr	%r5,%r7		/* move count to argument 2 register */
346ENTRY(outs16)
347	cmpwi	%r5,0		/* len == 0? */
348	beqlr-			/*   return if len == 0 */
349	addi	%r5,%r5,-1	/* len -= 1 */
350	slwi	%r5,%r5,1	/* len *= 2 */
351	add	%r5,%r5,%r4	/* len += src */
352	addi	%r4,%r4,-2	/* pre-decrement */
3531:	lhzu	%r0,2(%r4)	/* load and increment */
354	sth	%r0,0(%r3)	/* store */
355	cmpl	0,%r4,%r5	/* 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(bswm4_s)
366	lwz	%r0,0(%r3)	/* get log2(stride) */
367	rotlw	%r5,%r5,%r0	/* shift offset */
368ENTRY(bswm4)
369	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
370	mr	%r4,%r6		/* move addr to argument 1 register */
371	mr	%r5,%r7		/* move count to argument 2 register */
372ENTRY(outs32)
373	cmpwi	%r5,0		/* len == 0? */
374	beqlr-			/*   return if len == 0 */
375	addi	%r5,%r5,-1	/* len -= 1 */
376	slwi	%r5,%r5,2	/* len *= 4 */
377	add	%r5,%r5,%r4	/* len += src */
378	addi	%r4,%r4,-4	/* pre-decrement */
3791:	lwzu	%r0,4(%r4)	/* load and increment */
380	stw	%r0,0(%r3)	/* store */
381	cmpl	0,%r4,%r5	/* 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(bswm8_s)
392	ld	%r0,0(%r3)	/* get log2(stride) */
393	rotld	%r5,%r5,%r0	/* shift offset */
394ENTRY(bswm8)
395	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
396	mr	%r4,%r6		/* move addr to argument 1 register */
397	mr	%r5,%r7		/* move count to argument 2 register */
398ENTRY(outs32)
399	cmpdi	%r5,0		/* len == 0? */
400	beqlr-			/*   return if len == 0 */
401	addi	%r5,%r5,-1	/* len -= 1 */
402	sldi	%r5,%r5,2	/* len *= 4 */
403	add	%r5,%r5,%r4	/* len += src */
404	addi	%r4,%r4,-4	/* pre-decrement */
4051:	ldzu	%r0,4(%r4)	/* load and increment */
406	std	%r0,0(%r3)	/* store */
407	cmpl	0,%r4,%r5	/* 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(bswm8_s)
414ENTRY(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(bswm2rb_s)
423	lwz	%r0,0(%r3)	/* get log2(stride) */
424	rotlw	%r5,%r5,%r0	/* shift offset */
425ENTRY(bswm2rb)
426	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
427	mr	%r4,%r6		/* move addr to argument 1 register */
428	mr	%r5,%r7		/* move count to argument 2 register */
429ENTRY(outs16rb)
430	cmpwi	%r5,0		/* len == 0? */
431	beqlr-			/*   return if len == 0 */
432	addi	%r5,%r5,-1	/* len -= 1 */
433	slwi	%r5,%r5,1	/* len *= 2 */
434	add	%r5,%r5,%r4	/* len += src */
435	addi	%r4,%r4,-2	/* pre-decrement */
4361:	lwzu	%r0,2(%r4)	/* load and increment */
437	sthbrx	%r0,0,%r3	/* store (byte-reversed) */
438	cmpl	0,%r4,%r5	/* 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(bswm4rb_s)
449	lwz	%r0,0(%r3)	/* get log2(stride) */
450	rotlw	%r5,%r5,%r0	/* shift offset */
451ENTRY(bswm4rb)
452	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
453	mr	%r4,%r6		/* move addr to argument 1 register */
454	mr	%r5,%r7		/* move count to argument 2 register */
455ENTRY(outs32rb)
456	cmpwi	%r5,0		/* len == 0? */
457	beqlr-			/*   return if len == 0 */
458	addi	%r5,%r5,-1	/* len -= 1 */
459	slwi	%r5,%r5,2	/* len *= 4 */
460	add	%r5,%r5,%r4	/* len += src */
461	addi	%r4,%r4,-4	/* pre-decrement */
4621:	lwzu	%r0,4(%r4)	/* load and increment */
463	stwbrx	%r0,0,%r3	/* store (byte-reversed) */
464	cmpl	0,%r4,%r5	/* 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(bswm8rb_s)
473ENTRY(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(bsrm1_s)
481	lwz	%r0,0(%r3)	/* get log2(stride) */
482	rotlw	%r5,%r5,%r0	/* shift offset */
483ENTRY(bsrm1)
484	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
485	mr	%r4,%r6		/* move addr to argument 1 register */
486	mr	%r5,%r7		/* move count to argument 2 register */
487ENTRY(ins8)
488	cmpwi	%r5,0		/* len == 0? */
489	beqlr-			/*   return if len == 0 */
490	addi	%r5,%r5,-1	/* len -= 1 */
491	add	%r5,%r5,%r4	/* len += src */
492	addi	%r4,%r4,-1	/* pre-decrement */
4931:	lbz	%r0,0(%r3)	/* load value */
494	stbu	%r0,1(%r4)	/* store and increment */
495	cmpl	0,%r4,%r5	/* 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(bsrm2_s)
506	lwz	%r0,0(%r3)	/* get log2(stride) */
507	rotlw	%r5,%r5,%r0	/* shift offset */
508ENTRY(bsrm2)
509	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
510	mr	%r4,%r6		/* move addr to argument 1 register */
511	mr	%r5,%r7		/* move count to argument 2 register */
512ENTRY(ins16)
513	cmpwi	%r5,0		/* len == 0? */
514	beqlr-			/*   return if len == 0 */
515	addi	%r5,%r5,-1	/* len -= 1 */
516	slwi	%r5,%r5,1	/* len *= 2 */
517	add	%r5,%r5,%r4	/* len += src */
518	addi	%r4,%r4,-2	/* pre-decrement */
5191:	lhz	%r0,0(%r3)	/* load value */
520	sthu	%r0,2(%r4)	/* store and increment */
521	cmpl	0,%r4,%r5	/* 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(bsrm4_s)
532	lwz	%r0,0(%r3)	/* get log2(stride) */
533	rotlw	%r5,%r5,%r0	/* shift offset */
534ENTRY(bsrm4)
535	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
536	mr	%r4,%r6		/* move addr to argument 1 register */
537	mr	%r5,%r7		/* move count to argument 2 register */
538ENTRY(ins32)
539	cmpwi	%r5,0		/* len == 0? */
540	beqlr-			/*   return if len == 0 */
541	addi	%r5,%r5,-1	/* len -= 1 */
542	slwi	%r5,%r5,2	/* len *= 4 */
543	add	%r5,%r5,%r4	/* len += src */
544	addi	%r4,%r4,-4	/* pre-decrement */
5451:	lwz	%r0,0(%r3)	/* load value */
546	stwu	%r0,4(%r4)	/* store and increment */
547	cmpl	0,%r4,%r5	/* 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(bsrm8_s)
556ENTRY(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(bsrm2rb_s)
563	lwz	%r0,0(%r3)	/* get log2(stride) */
564	rotlw	%r5,%r5,%r0	/* shift offset */
565ENTRY(bsrm2rb)
566	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
567	mr	%r4,%r6		/* move addr to argument 1 register */
568	mr	%r5,%r7		/* move count to argument 2 register */
569ENTRY(ins16rb)
570	cmpwi	%r5,0		/* len == 0? */
571	beqlr-			/*   return if len == 0 */
572	addi	%r5,%r5,-1	/* len -= 1 */
573	slwi	%r5,%r5,1	/* len *= 2 */
574	add	%r5,%r5,%r4	/* len += src */
575	addi	%r4,%r4,-2	/* pre-decrement */
5761:	lhbrx	%r0,0,%r3	/* load value (byte reversed) */
577	sthu	%r0,2(%r4)	/* store and increment */
578	cmpl	0,%r4,%r5	/* 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(bsrm4rb_s)
588	lwz	%r0,0(%r3)	/* get log2(stride) */
589	rotlw	%r5,%r5,%r0	/* shift offset */
590ENTRY(bsrm4rb)
591	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
592	mr	%r4,%r6		/* move addr to argument 1 register */
593	mr	%r5,%r7		/* move count to argument 2 register */
594ENTRY(ins32rb)
595	cmpwi	%r5,0		/* len == 0? */
596	beqlr-			/*   return if len == 0 */
597	addi	%r5,%r5,-1	/* len -= 1 */
598	slwi	%r5,%r5,2	/* len *= 4 */
599	add	%r5,%r5,%r4	/* len += src */
600	addi	%r4,%r4,-4	/* pre-decrement */
6011:	lwbrx	%r0,0,%r3	/* load value (byte reversed) */
602	stwu	%r0,4(%r4)	/* store and increment */
603	cmpl	0,%r4,%r5	/* 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(bsrm8rb_s)
612ENTRY(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(bswr1_s)
618	lwz	%r0,0(%r3)	/* get log2(stride) */
619	li	%r8,1		/* distance between dst bytes */
620	rotlw	%r5,%r5,%r0	/* shift offset */
621	rotlw	%r8,%r8,%r0	/* shift distance */
622	b	.Lbswr1_enter
623ENTRY(bswr1)
624	li	%r8,1		/* distance between dst bytes */
625.Lbswr1_enter:
626	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
627	cmpwi	%r7,0		/* len == 0? */
628	beqlr-			/*   return if len == 0 */
629	addi	%r7,%r7,-1	/* len -= 1 */
630	add	%r7,%r7,%r6	/* len += src */
631	addi	%r6,%r6,-1	/* pre-decrement */
632	sub	%r3,%r3,%r8
6331:	lbzu	%r0,1(%r6)	/* load and increment */
634	stbux	%r0,%r3,%r8	/* store and add distance */
635	cmpl	0,%r6,%r7	/* 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(bswr2_s)
644	lwz	%r0,0(%r3)	/* get log2(stride) */
645	li	%r8,2		/* distance between dst halfwords */
646	rotlw	%r5,%r5,%r0	/* shift offset */
647	rotlw	%r8,%r8,%r0	/* shift distance */
648	b	.Lbswr2_enter
649ENTRY(bswr2)
650	li	%r8,2		/* distance between dst halfwords */
651.Lbswr2_enter:
652	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
653	cmpwi	%r7,0		/* len == 0? */
654	beqlr-			/*   return if len == 0 */
655	addi	%r7,%r7,-1	/* len -= 1 */
656	slwi	%r7,%r7,1	/* len *= 2 */
657	add	%r7,%r7,%r6	/* len += src */
658	addi	%r6,%r6,-2	/* pre-decrement */
659	sub	%r3,%r3,%r8
6601:	lhzu	%r0,2(%r6)	/* load and increment */
661	sthux	%r0,%r3,%r8	/* store and add distance */
662	cmpl	0,%r6,%r7	/* 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(bswr2rb_s)
671	lwz	%r0,0(%r3)	/* get log2(stride) */
672	li	%r8,2		/* distance between dst halfwords */
673	rotlw	%r5,%r5,%r0	/* shift offset */
674	rotlw	%r8,%r8,%r0	/* shift distance */
675	b	.Lbswr2rb_enter
676ENTRY(bswr2rb)
677	li	%r8,2		/* distance between dst halfwords */
678.Lbswr2rb_enter:
679	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
680	cmpwi	%r7,0		/* len == 0? */
681	beqlr-			/*   return if len == 0 */
682	addi	%r7,%r7,-1	/* len -= 1 */
683	slwi	%r7,%r7,1	/* len *= 2 */
684	add	%r7,%r7,%r6	/* len += src */
685	addi	%r6,%r6,-2	/* pre-decrement */
6861:	lhzu	%r0,2(%r6)	/* load and increment */
687	sthbrx	%r0,0,%r3	/* store (reversed) */
688	add	%r3,%r3,%r8	/* dst += distance */
689	cmpl	0,%r6,%r7	/* 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(bswr4_s)
698	lwz	%r0,0(%r3)	/* get log2(stride) */
699	li	%r8,4		/* distance between dst halfwords */
700	rotlw	%r5,%r5,%r0	/* shift offset */
701	rotlw	%r8,%r8,%r0	/* shift distance */
702	b	.Lbswr4_enter
703ENTRY(bswr4)
704	li	%r8,4		/* distance between dst halfwords */
705.Lbswr4_enter:
706	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
707	cmpwi	%r7,0		/* len == 0? */
708	beqlr-			/*   return if len == 0 */
709	addi	%r7,%r7,-1	/* len -= 1 */
710	slwi	%r7,%r7,2	/* len *= 4 */
711	add	%r7,%r7,%r6	/* len += src */
712	addi	%r6,%r6,-4	/* pre-decrement */
713	sub	%r3,%r3,%r8
7141:	lwzu	%r0,4(%r6)	/* load and increment */
715	stwux	%r0,%r3,%r8	/* store and add distance */
716	cmpl	0,%r6,%r7	/* 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(bswr4rb_s)
725	lwz	%r0,0(%r3)	/* get log2(stride) */
726	li	%r8,4		/* distance between dst halfwords */
727	rotlw	%r5,%r5,%r0	/* shift offset */
728	rotlw	%r8,%r8,%r0	/* shift distance */
729	b	.Lbswr4rb_enter
730ENTRY(bswr4rb)
731	li	%r8,4		/* distance between dst halfwords */
732.Lbswr4rb_enter:
733	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
734	cmpwi	%r7,0		/* len == 0? */
735	beqlr-			/*   return if len == 0 */
736	addi	%r7,%r7,-1	/* len -= 1 */
737	slwi	%r7,%r7,2	/* len *= 4 */
738	add	%r7,%r7,%r6	/* len += src */
739	addi	%r6,%r6,-4	/* pre-decrement */
7401:	lwzu	%r0,4(%r6)	/* load and increment */
741	stwbrx	%r0,0,%r3	/* store (reversed) */
742	add	%r3,%r3,%r8	/* dst += distance */
743	cmpl	0,%r6,%r7	/* 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(bswr8_s)
754ENTRY(bswr8rb_s)
755	lwz	%r0,0(%r3)
756	rotlw	%r5,%r5,%r0
757ENTRY(bswr8)
758ENTRY(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(bsrr1_s)
764	lwz	%r0,0(%r3)	/* get log2(stride) */
765	li	%r8,1		/* distance between src bytes */
766	rotlw	%r5,%r5,%r0	/* shift offset */
767	rotlw	%r8,%r8,%r0	/* shift distance */
768	b	.Lbsrr1_enter
769ENTRY(bsrr1)
770	li	%r8,1		/* distance between src bytes */
771.Lbsrr1_enter:
772	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
773	cmpwi	%r7,0		/* len == 0? */
774	beqlr-			/*   return if len == 0 */
775	addi	%r7,%r7,-1	/* len -= 1 */
776	add	%r7,%r7,%r6	/* len += src */
777	addi	%r6,%r6,-1	/* pre-decrement */
778	sub	%r3,%r3,%r8
7791:	lbzux	%r0,%r3,%r8	/* load value and add distance */
780	stbu	%r0,1(%r6)	/* store and increment */
781	cmpl	0,%r6,%r7	/* 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(bsrr2_s)
790	lwz	%r0,0(%r3)	/* get log2(stride) */
791	li	%r8,2		/* distance between src halfwords */
792	rotlw	%r5,%r5,%r0	/* shift offset */
793	rotlw	%r8,%r8,%r0	/* shift distance */
794	b	.Lbsrr2_enter
795ENTRY(bsrr2)
796	li	%r8,2		/* distance between src halfwords */
797.Lbsrr2_enter:
798	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
799	cmpwi	%r7,0		/* len == 0? */
800	beqlr-			/*   return if len == 0 */
801	addi	%r7,%r7,-1	/* len -= 1 */
802	slwi	%r7,%r7,1	/* len *= 2 */
803	add	%r7,%r7,%r6	/* len += src */
804	addi	%r6,%r6,-2	/* pre-decrement */
805	sub	%r3,%r3,%r8
8061:	lhzux	%r0,%r3,%r8	/* load value and add distance */
807	sthu	%r0,2(%r6)	/* store and increment */
808	cmpl	0,%r6,%r7	/* 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(bsrr2rb_s)
817	lwz	%r0,0(%r3)	/* get log2(stride) */
818	li	%r8,2		/* distance between source halfwords */
819	rotlw	%r5,%r5,%r0	/* shift offset */
820	rotlw	%r8,%r8,%r0	/* shift distance */
821	b	.Lbsrr2rb_enter
822ENTRY(bsrr2rb)
823	li	%r8,2		/* distance between source halfwords */
824.Lbsrr2rb_enter:
825	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
826	cmpwi	%r7,0		/* len == 0? */
827	beqlr-			/*   return if len == 0 */
828	addi	%r7,%r7,-1	/* len -= 1 */
829	slwi	%r7,%r7,1	/* len *= 2 */
830	add	%r7,%r7,%r6	/* len += src */
831	addi	%r6,%r6,-2	/* pre-decrement */
8321:	lhbrx	%r0,0,%r3	/* load value (reversed) */
833	add	%r3,%r3,%r8	/* src += distance */
834	sthu	%r0,2(%r6)	/* store and increment */
835	cmpl	0,%r6,%r7	/* 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(bsrr4_s)
844	lwz	%r0,0(%r3)		/* get log2(stride) */
845	li	%r8,4		/* distance between src words */
846	rotlw	%r5,%r5,%r0	/* shift offset */
847	rotlw	%r8,%r8,%r0	/* shift distance */
848	b	.Lbsrr4_enter
849ENTRY(bsrr4)
850	li	%r8,4		/* distance between src words */
851.Lbsrr4_enter:
852	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
853	cmpwi	%r7,0		/* len == 0? */
854	beqlr-			/*   return if len == 0 */
855	addi	%r7,%r7,-1	/* len -= 1 */
856	slwi	%r7,%r7,2	/* len *= 4 */
857	add	%r7,%r7,%r6	/* len += src */
858	addi	%r6,%r6,-4	/* pre-decrement */
859	sub	%r3,%r3,%r8
8601:	lwzux	%r0,%r3,%r8	/* load value and add distance */
861	stwu	%r0,4(%r6)	/* store and increment */
862	cmpl	0,%r6,%r7	/* 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(bsrr4rb_s)
871	lwz	%r0,0(%r3)	/* get log2(stride) */
872	li	%r8,4		/* distance between src words */
873	rotlw	%r5,%r5,%r0	/* shift offset */
874	rotlw	%r8,%r8,%r0	/* shift distance */
875	b	.Lbsrr4rb_enter
876ENTRY(bsrr4rb)
877	li	%r8,4		/* distance between src words */
878.Lbsrr4rb_enter:
879	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
880	mr	%r4,%r6		/* move addr to argument 1 register */
881	cmpwi	%r7,0		/* len == 0? */
882	beqlr-			/*   return if len == 0 */
883	addi	%r7,%r7,-1	/* len -= 1 */
884	slwi	%r7,%r7,2	/* len *= 4 */
885	add	%r7,%r7,%r6	/* len += src */
886	addi	%r6,%r6,-4	/* pre-decrement */
8871:	lwbrx	%r0,0,%r3	/* load value (reversed) */
888	add	%r3,%r3,%r8	/* src += distance */
889	sthu	%r0,4(%r6)	/* store and increment */
890	cmpl	0,%r6,%r7	/* 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(bsrr8_s)
901ENTRY(bsrr8rb_s)
902	lwz	%r0,0(%r3)
903	rotlw	%r5,%r5,%r0
904ENTRY(bsrr8)
905ENTRY(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(bssr1_s)
911	lwz	%r0,0(%r3)	/* get log2(stride) */
912	li	%r8,1		/* distance between src bytes */
913	rotlw	%r5,%r5,%r0	/* shift offset */
914	rotlw	%r8,%r8,%r0	/* shift distance */
915	b	.Lbssr1_enter
916ENTRY(bssr1)
917	li	%r8,1		/* distance between src bytes */
918.Lbssr1_enter:
919	cmpwi	%r7,0		/* len == 0? */
920	beqlr-			/*   return if len == 0 */
9211:	addi	%r7,%r7,-1	/* len -= 1 */
922	stbx	%r6,%r4,%r5	/* store value */
923	add	%r5,%r5,%r8	/* add offset */
924	cmpwi	%r7,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(bssr2_s)
933	lwz	%r0,0(%r3)	/* get log2(stride) */
934	li	%r8,2		/* distance between src halfwords */
935	rotlw	%r5,%r5,%r0	/* shift offset */
936	rotlw	%r8,%r8,%r0	/* shift distance */
937	b	.Lbssr2_enter
938ENTRY(bssr2)
939	li	%r8,2		/* distance between src halfwords */
940.Lbssr2_enter:
941	cmpwi	%r7,0		/* len == 0? */
942	beqlr-			/*   return if len == 0 */
9431:	addi	%r7,%r7,-1	/* len -= 1 */
944	sthx	%r6,%r4,%r5	/* store value */
945	add	%r5,%r5,%r8	/* add offset */
946	cmpwi	%r7,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(bssr2rb_s)
955	lwz	%r0,0(%r3)	/* get log2(stride) */
956	li	%r8,2		/* distance between src halfwords */
957	rotlw	%r5,%r5,%r0	/* shift offset */
958	rotlw	%r8,%r8,%r0	/* shift distance */
959	b	.Lbssr2rb_enter
960ENTRY(bssr2rb)
961	li	%r8,2		/* distance between src halfwords */
962.Lbssr2rb_enter:
963	cmpwi	%r7,0		/* len == 0? */
964	beqlr-			/*   return if len == 0 */
9651:	addi	%r7,%r7,-1	/* len -= 1 */
966	sthbrx	%r6,%r4,%r5	/* store value */
967	add	%r5,%r5,%r8	/* add offset */
968	cmpwi	%r7,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(bssr4_s)
977	lwz	%r0,0(%r3)	/* get log2(stride) */
978	li	%r8,4		/* distance between src words */
979	rotlw	%r5,%r5,%r0	/* shift offset */
980	rotlw	%r8,%r8,%r0	/* shift distance */
981	b	.Lbssr4_enter
982ENTRY(bssr4)
983	li	%r8,4		/* distance between src words */
984.Lbssr4_enter:
985	cmpwi	%r7,0		/* len == 0? */
986	beqlr-			/*   return if len == 0 */
9871:	addi	%r7,%r7,-1	/* len -= 1 */
988	stwx	%r6,%r4,%r5	/* store value */
989	add	%r5,%r5,%r8	/* add offset */
990	cmpwi	%r7,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(bssr4rb_s)
999	lwz	%r0,0(%r3)	/* get log2(stride) */
1000	li	%r8,4		/* distance between src words */
1001	rotlw	%r5,%r5,%r0	/* shift offset */
1002	rotlw	%r8,%r8,%r0	/* shift distance */
1003	b	.Lbssr4rb_enter
1004ENTRY(bssr4rb)
1005	li	%r8,4		/* distance between src words */
1006.Lbssr4rb_enter:
1007	cmpwi	%r7,0		/* len == 0? */
1008	beqlr-			/*   return if len == 0 */
10091:	addi	%r7,%r7,-1	/* len -= 1 */
1010	stwbrx	%r6,%r4,%r5	/* store value */
1011	add	%r5,%r5,%r8	/* add offset */
1012	cmpwi	%r7,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(bssr8_s)
1023ENTRY(bssr8rb_s)
1024	lwz	%r0,0(%r3)
1025	rotlw	%r5,%r5,%r0
1026ENTRY(bssr8)
1027ENTRY(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(bscr1_s)
1033	lwz	%r0,0(%r3)	/* get log2(stride) */
1034	b	.Lbscr1_enter
1035ENTRY(bscr1)
1036	li	%r0,0		/* non stride */
1037.Lbscr1_enter:
1038	li	%r9,1		/* distance between src bytes */
1039	rotlw	%r9,%r9,%r0		/* shift distance */
1040	cmpwi	%r8,0		/* len == 0? */
1041	beqlr-			/*   return if len == 0 */
1042	rotlw	%r5,%r5,%r0	/* shift src offset */
1043	rotlw	%r7,%r7,%r0	/* shift dest offset */
1044	add	%r10,%r4,%r5	/* calculate src end address */
1045	add	%r11,%r6,%r7	/* calculate dest end address */
1046	mtctr	%r8
1047	cmpw	%r10,%r11	/* compare end address */
1048	blt	2f		/* jump if h + o < h2 + o2 */
1049
1050				/* h + o >= h2 + o2 */
10511:	lbzx	%r12,%r4,%r5	/* load value */
1052	stbx	%r12,%r6,%r7	/* store value */
1053	add	%r5,%r5,%r9	/* src offset += 1 */
1054	add	%r7,%r7,%r9	/* dest offset += 1 */
1055	bdnz+	1b		/* jump if len != 0 */
1056	b	.Lbscr1_end	/* end */
1057
1058				/* h + o < h2 + o2 */
10592:	addi	%r8,%r8,-1	/* len -= 1 */
1060	rotlw	%r8,%r8,%r0	/* shift len */
1061	add	%r5,%r10,%r8	/* src offset = o + len - 1 */
1062	add	%r7,%r11,%r8	/* dest offset = o2 + len - 1 */
10633:	lbzx	%r12,%r4,%r5	/* load value */
1064	stbx	%r12,%r6,%r7	/* store value */
1065	sub	%r5,%r5,%r9	/* src offset -= 1 */
1066	sub	%r7,%r7,%r9	/* 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(bscr2_s)
1076	lwz	%r0,0(%r3)		/* get log2(stride) */
1077	b	.Lbscr2_enter
1078ENTRY(bscr2)
1079	li	%r0,0		/* non stride */
1080.Lbscr2_enter:
1081	li	%r9,2		/* distance between src halfwords */
1082	rotlw	%r9,%r9,%r0		/* shift distance */
1083	cmpwi	%r8,0		/* len == 0? */
1084	beqlr-			/*   return if len == 0 */
1085	rotlw	%r5,%r5,%r0	/* shift src offset */
1086	rotlw	%r7,%r7,%r0	/* shift dest offset */
1087	add	%r10,%r4,%r5	/* calculate src end address */
1088	add	%r11,%r6,%r7	/* calculate dest end address */
1089	mtctr	%r8
1090	cmpw	%r10,%r11	/* compare end address */
1091	blt	2f		/* jump if h + o < h2 + o2 */
1092
1093				/* h + o >= h2 + o2 */
10941:	lhzx	%r12,%r4,%r5	/* load value */
1095	sthx	%r12,%r6,%r7	/* store value */
1096	add	%r5,%r5,%r9	/* src offset += 2 */
1097	add	%r7,%r7,%r9	/* dest offset += 2 */
1098	bdnz+	1b		/* jump if len != 0 */
1099	b	.Lbscr2_end	/* end */
1100
1101				/* h + o < h2 + o2 */
11022:	addi	%r8,%r8,-1	/* len -= 1 */
1103	rotlw	%r8,%r8,%r0	/* shift len */
1104	add	%r5,%r10,%r8	/* src offset = o + len - 1 */
1105	add	%r7,%r11,%r8	/* dest offset = o2 + len - 1 */
11063:	lhzx	%r12,%r4,%r5	/* load value */
1107	sthx	%r12,%r6,%r7	/* store value */
1108	sub	%r5,%r5,%r9	/* src offset -= 2 */
1109	sub	%r7,%r7,%r9	/* 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(bscr4_s)
1119	lwz	%r0,0(%r3)	/* get log2(stride) */
1120	b	.Lbscr4_enter
1121ENTRY(bscr4)
1122	li	%r0,0		/* non stride */
1123.Lbscr4_enter:
1124	li	%r9,4		/* distance between src words */
1125	rotlw	%r9,%r9,%r0	/* shift distance */
1126	cmpwi	%r8,0		/* len == 0? */
1127	beqlr-			/*   return if len == 0 */
1128	rotlw	%r5,%r5,%r0	/* shift src offset */
1129	rotlw	%r7,%r7,%r0	/* shift dest offset */
1130	add	%r10,%r4,%r5	/* calculate src end address */
1131	add	%r11,%r6,%r7	/* calculate dest end address */
1132	mtctr	%r8
1133	cmpw	%r10,%r11	/* compare end address */
1134	blt	2f		/* jump if h + o < h2 + o2 */
1135
1136				/* h + o >= h2 + o2 */
11371:	lwzx	%r12,%r4,%r5	/* load value */
1138	stwx	%r12,%r6,%r7	/* store value */
1139	add	%r5,%r5,%r9	/* src offset += 4 */
1140	add	%r7,%r7,%r9	/* dest offset += 4 */
1141	bdnz+	1b		/* jump if len != 0 */
1142	b	.Lbscr4_end	/* end */
1143
1144				/* h + o < h2 + o2 */
11452:	addi	%r8,%r8,-1	/* len -= 1 */
1146	rotlw	%r8,%r8,%r0	/* shift len */
1147	add	%r5,%r10,%r8	/* src offset = o + len - 1 */
1148	add	%r7,%r11,%r8	/* dest offset = o2 + len - 1 */
11493:	lwzx	%r12,%r4,%r5	/* load value */
1150	stwx	%r12,%r6,%r7	/* store value */
1151	sub	%r5,%r5,%r9	/* src offset -= 4 */
1152	sub	%r7,%r7,%r9	/* 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(bscr8_s)
1162ENTRY(bscr8)
1163	trap
1164
1165