xref: /netbsd/sys/arch/powerpc/powerpc/pio_subr.S (revision 6550d01e)
1/*	$NetBSD: pio_subr.S,v 1.13 2011/01/18 01:02:55 matt 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
43#undef DBGSYNC
44#define	DBGSYNC	msync
45#define	eieio	mbar 0
46
47/* LINTSTUB: include <sys/param.h> */
48/* LINTSTUB: include <sys/types.h> */
49/* LINTSTUB: include <machine/bus.h> */
50
51/* LINTSTUB: Func: void out8(volatile u_int8_t *a, u_int8_t v) */
52
53ENTRY(out8)
54	stbx	%r4,0,%r3
55	eieio			/* memory barrier (reorder protection) */
56	DBGSYNC			/* force exceptions */
57	blr			/* return */
58
59/* LINTSTUB: Func: void bsw1_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int8_t v) */
60/* LINTSTUB: Func: void bsw1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int8_t v) */
61
62ENTRY(bsw1_s)
63	lwz	%r0,0(%r3)	/* get log2(stride) */
64	rotlw	%r5,%r5,%r0	/* shift offset */
65ENTRY(bsw1)
66	stbx	%r6,%r4,%r5	/* store value */
67	eieio			/* memory barrier (reorder protection) */
68	DBGSYNC			/* force exceptions */
69	blr			/* return */
70
71/* LINTSTUB: Func: void out16(volatile u_int16_t *a, u_int16_t v) */
72
73ENTRY(out16)
74	sth	%r4,0(%r3)
75	eieio			/* memory barrier (reorder protection) */
76	DBGSYNC			/* force exceptions */
77	blr			/* return */
78
79/* LINTSTUB: Func: void bsw2_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t v) */
80/* LINTSTUB: Func: void bsw2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t v) */
81
82ENTRY(bsw2_s)
83	lwz	%r0,0(%r3)	/* get log2(stride) */
84	rotlw	%r5,%r5,%r0	/* shift offset */
85ENTRY(bsw2)
86	sthx	%r6,%r4,%r5	/* store value */
87	eieio			/* memory barrier (reorder protection) */
88	DBGSYNC			/* force exceptions */
89	blr			/* return */
90
91/* LINTSTUB: Func: void out32(volatile u_int32_t *a, u_int32_t v) */
92
93ENTRY(out32)
94	stw	%r4,0(%r3)
95	eieio			/* memory barrier (reorder protection) */
96	DBGSYNC			/* force exceptions */
97	blr			/* return */
98
99/* LINTSTUB: Func: void bsw4_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t v) */
100/* LINTSTUB: Func: void bsw4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t v) */
101
102ENTRY(bsw4_s)
103	lwz	%r0,0(%r3)	/* get log2(stride) */
104	rotlw	%r5,%r5,%r0	/* shift offset */
105ENTRY(bsw4)
106	stwx	%r6,%r4,%r5	/* store value */
107	eieio			/* memory barrier (reorder protection) */
108	DBGSYNC			/* force exceptions */
109	blr			/* return */
110
111/* LINTSTUB: Func: void bsw8_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t v) */
112/* LINTSTUB: Func: void bsw8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t v) */
113ENTRY(bsw8_s)
114	lwz	%r0,0(%r3)	/* get log2(stride) */
115	rotlw	%r5,%r5,%r0	/* shift offset */
116ENTRY(bsw8)
117#ifdef __ARCH64__
118	stdx	%r6,%r4,%r5	/* store value */
119#else
120	trap			/* die */
121#endif
122	eieio			/* memory barrier (reorder protection) */
123	DBGSYNC			/* force exceptions */
124	blr			/* return */
125
126/* LINTSTUB: Func: void out16rb(volatile u_int16_t *a, u_int16_t v) */
127
128ENTRY(out16rb)
129	sthbrx	%r4,0,%r3
130	eieio			/* memory barrier (reorder protection) */
131	DBGSYNC			/* force exceptions */
132	blr			/* return */
133
134/* LINTSTUB: Func: void bsw2rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t v) */
135/* LINTSTUB: Func: void bsw2rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t v) */
136
137
138ENTRY(bsw2rb_s)
139	lwz	%r0,0(%r3)	/* get log2(stride) */
140	rotlw	%r5,%r5,%r0	/* shift offset */
141ENTRY(bsw2rb)
142	sthbrx	%r6,%r4,%r5	/* store value */
143	eieio			/* memory barrier (reorder protection) */
144	DBGSYNC			/* force exceptions */
145	blr			/* return */
146
147/* LINTSTUB: Func: void out32rb(volatile u_int32_t *a, u_int32_t v) */
148
149ENTRY(out32rb)
150	stwbrx	%r4,0,%r3
151	eieio			/* memory barrier (reorder protection) */
152	DBGSYNC			/* force exceptions */
153	blr			/* return */
154
155/* LINTSTUB: Func: void bsw4rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t v) */
156/* LINTSTUB: Func: void bsw4rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t v) */
157
158ENTRY(bsw4rb_s)
159	lwz	%r0,0(%r3)	/* get log2(stride) */
160	rotlw	%r5,%r5,%r0	/* shift offset */
161ENTRY(bsw4rb)
162	stwbrx	%r6,%r4,%r5	/* store value */
163	eieio			/* memory barrier (reorder protection) */
164	DBGSYNC			/* force exceptions */
165	blr			/* return */
166
167/* LINTSTUB: Func: void bsw8rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t v) */
168/* LINTSTUB: Func: void bsw8rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t v) */
169
170ENTRY(bsw8rb_s)
171	lwz	%r0,0(%r3)	/* get log2(stride) */
172	rotlw	%r5,%r5,%r0	/* shift offset */
173ENTRY(bsw8rb)
174#ifdef __ARCH64__
175	stdbrx	%r6,%r4,%r5	/* store value */
176#else
177	trap			/* die */
178#endif
179	eieio			/* memory barrier (reorder protection) */
180	DBGSYNC			/* force exceptions */
181	blr			/* return */
182
183/* LINTSTUB: Func: int in8(const volatile u_int8_t *a) */
184
185ENTRY(in8)
186	lbz	%r3,0(%r3)
187	eieio			/* memory barrier (reorder protection) */
188	DBGSYNC			/* force exceptions */
189	blr			/* return */
190
191/* LINTSTUB: Func: int bsr1_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
192/* LINTSTUB: Func: int bsr1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
193
194ENTRY(bsr1_s)
195	lwz	%r0,0(%r3)	/* get log2(stride) */
196	rotlw	%r5,%r5,%r0	/* shift offset */
197ENTRY(bsr1)
198	lbzx	%r3,%r4,%r5	/* load value */
199	eieio			/* memory barrier (reorder protection) */
200	DBGSYNC			/* force exceptions */
201	blr			/* return */
202
203/* LINTSTUB: Func: int in16(const volatile u_int16_t *a) */
204
205ENTRY(in16)
206	lhz	%r3,0(%r3)
207	eieio			/* memory barrier (reorder protection) */
208	DBGSYNC			/* force exceptions */
209	blr			/* return */
210
211/* LINTSTUB: Func: int bsr2_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
212/* LINTSTUB: Func: int bsr2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
213
214ENTRY(bsr2_s)
215	lwz	%r0,0(%r3)	/* get log2(stride) */
216	rotlw	%r5,%r5,%r0	/* shift offset */
217ENTRY(bsr2)
218	lhzx	%r3,%r4,%r5	/* load value */
219	eieio			/* memory barrier (reorder protection) */
220	DBGSYNC			/* force exceptions */
221	blr			/* return */
222
223/* LINTSTUB: Func: int in32(const volatile u_int32_t *a) */
224
225ENTRY(in32)
226	lwz	%r3,0(%r3)
227	eieio			/* memory barrier (reorder protection) */
228	DBGSYNC			/* force exceptions */
229	blr			/* return */
230
231/* LINTSTUB: Func: int bsr4_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
232/* LINTSTUB: Func: int bsr4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
233
234ENTRY(bsr4_s)
235	lwz	%r0,0(%r3)	/* get log2(stride) */
236	rotlw	%r5,%r5,%r0	/* shift offset */
237ENTRY(bsr4)
238	lwzx	%r3,%r4,%r5	/* load value */
239	eieio			/* memory barrier (reorder protection) */
240	DBGSYNC			/* force exceptions */
241	blr			/* return */
242
243/* LINTSTUB: Func: u_int64_t bsr8_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
244/* LINTSTUB: Func: u_int64_t bsr8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
245
246ENTRY(bsr8_s)
247	lwz	%r0,0(%r3)	/* get log2(stride) */
248	rotlw	%r5,%r5,%r0	/* shift offset */
249ENTRY(bsr8)
250#ifdef __ARCH64__
251	lwdx	%r3,%r4,%r5	/* load value */
252#else
253	trap
254#endif
255	eieio			/* memory barrier (reorder protection) */
256	DBGSYNC			/* force exceptions */
257	blr			/* return */
258
259/* LINTSTUB: Func: int in16rb(const volatile u_int16_t *a) */
260
261ENTRY(in16rb)
262	lhbrx	%r3,0,%r3
263	eieio			/* memory barrier (reorder protection) */
264	DBGSYNC			/* force exceptions */
265	blr			/* return */
266
267/* LINTSTUB: Func: int bsr2rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
268/* LINTSTUB: Func: int bsr2rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
269
270ENTRY(bsr2rb_s)
271	lwz	%r0,0(%r3)	/* get log2(stride) */
272	rotlw	%r5,%r5,%r0	/* shift offset */
273ENTRY(bsr2rb)
274	lhbrx	%r3,%r4,%r5	/* load value */
275	eieio			/* memory barrier (reorder protection) */
276	DBGSYNC			/* force exceptions */
277	blr			/* return */
278
279/* LINTSTUB: Func: int in32rb(const volatile u_int32_t *a) */
280
281ENTRY(in32rb)
282	lwbrx	%r3,0,%r3
283	eieio			/* memory barrier (reorder protection) */
284	DBGSYNC			/* force exceptions */
285	blr			/* return */
286
287/* LINTSTUB: Func: int bsr4rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
288/* LINTSTUB: Func: int bsr4rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
289
290ENTRY(bsr4rb_s)
291	lwz	%r0,0(%r3)	/* get log2(stride) */
292	rotlw	%r5,%r5,%r0	/* shift offset */
293ENTRY(bsr4rb)
294	lwbrx	%r3,%r4,%r5	/* load value */
295	eieio			/* memory barrier (reorder protection) */
296	DBGSYNC			/* force exceptions */
297	blr			/* return */
298
299/* LINTSTUB: Func: u_int64_t bsr8rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
300/* LINTSTUB: Func: u_int64_t bsr8rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */
301
302ENTRY(bsr8rb_s)
303	lwz	%r0,0(%r3)	/* get log2(stride) */
304	rotlw	%r5,%r5,%r0	/* shift offset */
305ENTRY(bsr8rb)
306#ifdef __ARCH64__
307	ldbrx	%r3,%r4,%r5	/* load value */
308#else
309	trap
310#endif
311	eieio			/* memory barrier (reorder protection) */
312	DBGSYNC			/* force exceptions */
313	blr			/* return */
314
315/* 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) */
316/* 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) */
317/* LINTSTUB: Func: void outs8(volatile u_int8_t *dst, const u_int8_t *src, size_t len) */
318
319ENTRY(bswm1_s)
320	lwz	%r0,0(%r3)	/* get log2(stride) */
321	rotlw	%r5,%r5,%r0	/* shift offset */
322ENTRY(bswm1)
323	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
324	mr	%r4,%r6		/* move addr to argument 1 register */
325	mr	%r5,%r7		/* move count to argument 2 register */
326ENTRY(outs8)
327	cmpwi	%r5,0		/* len == 0? */
328	beqlr-			/*   return if len == 0 */
329	addi	%r5,%r5,-1	/* len -= 1 */
330	add	%r5,%r5,%r4	/* len += src */
331	addi	%r4,%r4,-1	/* pre-decrement */
3321:	lbzu	%r0,1(%r4)	/* load and increment */
333	stb	%r0,0(%r3)	/* store */
334	cmpl	0,%r4,%r5	/* at the end? */
335	bne+	1b		/*   nope, do another pass */
336	eieio			/* memory barrier (reorder protection) */
337	DBGSYNC			/* force exceptions */
338	blr			/* return */
339
340/* 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) */
341/* 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) */
342/* LINTSTUB: Func: void outs16(volatile u_int16_t *dst, const u_int16_t *src, size_t len) */
343
344ENTRY(bswm2_s)
345	lwz	%r0,0(%r3)	/* get log2(stride) */
346	rotlw	%r5,%r5,%r0	/* shift offset */
347ENTRY(bswm2)
348	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
349	mr	%r4,%r6		/* move addr to argument 1 register */
350	mr	%r5,%r7		/* move count to argument 2 register */
351ENTRY(outs16)
352	cmpwi	%r5,0		/* len == 0? */
353	beqlr-			/*   return if len == 0 */
354	addi	%r5,%r5,-1	/* len -= 1 */
355	slwi	%r5,%r5,1	/* len *= 2 */
356	add	%r5,%r5,%r4	/* len += src */
357	addi	%r4,%r4,-2	/* pre-decrement */
3581:	lhzu	%r0,2(%r4)	/* load and increment */
359	sth	%r0,0(%r3)	/* store */
360	cmpl	0,%r4,%r5	/* at the end? */
361	bne+	1b		/*   nope, do another pass */
362	eieio			/* memory barrier (reorder protection) */
363	DBGSYNC			/* force exceptions */
364	blr			/* return */
365
366/* 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) */
367/* 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) */
368/* LINTSTUB: Func: void outs32(volatile u_int32_t *dst, const u_int32_t *src, size_t len) */
369
370ENTRY(bswm4_s)
371	lwz	%r0,0(%r3)	/* get log2(stride) */
372	rotlw	%r5,%r5,%r0	/* shift offset */
373ENTRY(bswm4)
374	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
375	mr	%r4,%r6		/* move addr to argument 1 register */
376	mr	%r5,%r7		/* move count to argument 2 register */
377ENTRY(outs32)
378	cmpwi	%r5,0		/* len == 0? */
379	beqlr-			/*   return if len == 0 */
380	addi	%r5,%r5,-1	/* len -= 1 */
381	slwi	%r5,%r5,2	/* len *= 4 */
382	add	%r5,%r5,%r4	/* len += src */
383	addi	%r4,%r4,-4	/* pre-decrement */
3841:	lwzu	%r0,4(%r4)	/* load and increment */
385	stw	%r0,0(%r3)	/* store */
386	cmpl	0,%r4,%r5	/* at the end? */
387	bne+	1b		/*   nope, do another pass */
388	eieio			/* memory barrier (reorder protection) */
389	DBGSYNC			/* force exceptions */
390	blr			/* return */
391
392/* 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) */
393/* 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) */
394
395#ifdef _LP64
396ENTRY(bswm8_s)
397	ld	%r0,0(%r3)	/* get log2(stride) */
398	rotld	%r5,%r5,%r0	/* shift offset */
399ENTRY(bswm8)
400	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
401	mr	%r4,%r6		/* move addr to argument 1 register */
402	mr	%r5,%r7		/* move count to argument 2 register */
403ENTRY(outs32)
404	cmpdi	%r5,0		/* len == 0? */
405	beqlr-			/*   return if len == 0 */
406	addi	%r5,%r5,-1	/* len -= 1 */
407	sldi	%r5,%r5,2	/* len *= 4 */
408	add	%r5,%r5,%r4	/* len += src */
409	addi	%r4,%r4,-4	/* pre-decrement */
4101:	ldzu	%r0,4(%r4)	/* load and increment */
411	std	%r0,0(%r3)	/* store */
412	cmpl	0,%r4,%r5	/* at the end? */
413	bne+	1b		/*   nope, do another pass */
414	eieio			/* memory barrier (reorder protection) */
415	DBGSYNC			/* force exceptions */
416	blr			/* return */
417#else
418ENTRY(bswm8_s)
419ENTRY(bswm8)
420	trap			/* die */
421#endif
422
423/* 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) */
424/* 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) */
425/* LINTSTUB: Func: void outs16rb(volatile u_int16_t *dst, const u_int16_t *src, size_t len) */
426
427ENTRY(bswm2rb_s)
428	lwz	%r0,0(%r3)	/* get log2(stride) */
429	rotlw	%r5,%r5,%r0	/* shift offset */
430ENTRY(bswm2rb)
431	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
432	mr	%r4,%r6		/* move addr to argument 1 register */
433	mr	%r5,%r7		/* move count to argument 2 register */
434ENTRY(outs16rb)
435	cmpwi	%r5,0		/* len == 0? */
436	beqlr-			/*   return if len == 0 */
437	addi	%r5,%r5,-1	/* len -= 1 */
438	slwi	%r5,%r5,1	/* len *= 2 */
439	add	%r5,%r5,%r4	/* len += src */
440	addi	%r4,%r4,-2	/* pre-decrement */
4411:	lwzu	%r0,2(%r4)	/* load and increment */
442	sthbrx	%r0,0,%r3	/* store (byte-reversed) */
443	cmpl	0,%r4,%r5	/* at the end? */
444	bne+	1b		/*   nope, do another pass */
445	eieio			/* memory barrier (reorder protection) */
446	DBGSYNC			/* force exceptions */
447	blr			/* return */
448
449/* 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) */
450/* 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) */
451/* LINTSTUB: Func: void outs32rb(volatile u_int32_t *dst, const u_int32_t *src, size_t len) */
452
453ENTRY(bswm4rb_s)
454	lwz	%r0,0(%r3)	/* get log2(stride) */
455	rotlw	%r5,%r5,%r0	/* shift offset */
456ENTRY(bswm4rb)
457	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
458	mr	%r4,%r6		/* move addr to argument 1 register */
459	mr	%r5,%r7		/* move count to argument 2 register */
460ENTRY(outs32rb)
461	cmpwi	%r5,0		/* len == 0? */
462	beqlr-			/*   return if len == 0 */
463	addi	%r5,%r5,-1	/* len -= 1 */
464	slwi	%r5,%r5,2	/* len *= 4 */
465	add	%r5,%r5,%r4	/* len += src */
466	addi	%r4,%r4,-4	/* pre-decrement */
4671:	lwzu	%r0,4(%r4)	/* load and increment */
468	stwbrx	%r0,0,%r3	/* store (byte-reversed) */
469	cmpl	0,%r4,%r5	/* at the end? */
470	bne+	1b		/*   nope, do another pass */
471	eieio			/* memory barrier (reorder protection) */
472	DBGSYNC			/* force exceptions */
473	blr			/* return */
474
475/* 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) */
476/* 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) */
477ENTRY(bswm8rb_s)
478ENTRY(bswm8rb)
479	trap
480
481/* 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) */
482/* 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) */
483/* LINTSTUB: Func: void ins8(const volatile u_int8_t *src, u_int8_t *dst, size_t len) */
484
485ENTRY(bsrm1_s)
486	lwz	%r0,0(%r3)	/* get log2(stride) */
487	rotlw	%r5,%r5,%r0	/* shift offset */
488ENTRY(bsrm1)
489	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
490	mr	%r4,%r6		/* move addr to argument 1 register */
491	mr	%r5,%r7		/* move count to argument 2 register */
492ENTRY(ins8)
493	cmpwi	%r5,0		/* len == 0? */
494	beqlr-			/*   return if len == 0 */
495	addi	%r5,%r5,-1	/* len -= 1 */
496	add	%r5,%r5,%r4	/* len += src */
497	addi	%r4,%r4,-1	/* pre-decrement */
4981:	lbz	%r0,0(%r3)	/* load value */
499	stbu	%r0,1(%r4)	/* store and increment */
500	cmpl	0,%r4,%r5	/* at the end? */
501	bne+	1b		/*   nope, do another pass */
502	eieio			/* memory barrier (reorder protection) */
503	DBGSYNC			/* force exceptions */
504	blr			/* return */
505
506/* 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) */
507/* 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) */
508/* LINTSTUB: Func: void ins16(const volatile u_int16_t *src, u_int16_t *dst, size_t len) */
509
510ENTRY(bsrm2_s)
511	lwz	%r0,0(%r3)	/* get log2(stride) */
512	rotlw	%r5,%r5,%r0	/* shift offset */
513ENTRY(bsrm2)
514	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
515	mr	%r4,%r6		/* move addr to argument 1 register */
516	mr	%r5,%r7		/* move count to argument 2 register */
517ENTRY(ins16)
518	cmpwi	%r5,0		/* len == 0? */
519	beqlr-			/*   return if len == 0 */
520	addi	%r5,%r5,-1	/* len -= 1 */
521	slwi	%r5,%r5,1	/* len *= 2 */
522	add	%r5,%r5,%r4	/* len += src */
523	addi	%r4,%r4,-2	/* pre-decrement */
5241:	lhz	%r0,0(%r3)	/* load value */
525	sthu	%r0,2(%r4)	/* store and increment */
526	cmpl	0,%r4,%r5	/* at the end? */
527	bne+	1b		/*   nope, do another pass */
528	eieio			/* memory barrier (reorder protection) */
529	DBGSYNC			/* force exceptions */
530	blr			/* return */
531
532/* 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) */
533/* 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) */
534/* LINTSTUB: Func: void ins32(const volatile u_int32_t *src, u_int32_t *dst, size_t len) */
535
536ENTRY(bsrm4_s)
537	lwz	%r0,0(%r3)	/* get log2(stride) */
538	rotlw	%r5,%r5,%r0	/* shift offset */
539ENTRY(bsrm4)
540	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
541	mr	%r4,%r6		/* move addr to argument 1 register */
542	mr	%r5,%r7		/* move count to argument 2 register */
543ENTRY(ins32)
544	cmpwi	%r5,0		/* len == 0? */
545	beqlr-			/*   return if len == 0 */
546	addi	%r5,%r5,-1	/* len -= 1 */
547	slwi	%r5,%r5,2	/* len *= 4 */
548	add	%r5,%r5,%r4	/* len += src */
549	addi	%r4,%r4,-4	/* pre-decrement */
5501:	lwz	%r0,0(%r3)	/* load value */
551	stwu	%r0,4(%r4)	/* store and increment */
552	cmpl	0,%r4,%r5	/* at the end? */
553	bne+	1b		/*   nope, do another pass */
554	eieio			/* memory barrier (reorder protection) */
555	DBGSYNC			/* force exceptions */
556	blr			/* return */
557
558/* 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) */
559/* 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) */
560ENTRY(bsrm8_s)
561ENTRY(bsrm8)
562	trap
563
564/* 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) */
565/* LINTSTUB: Func: void ins16rb(const volatile u_int16_t *src, u_int16_t *dst, size_t len) */
566
567ENTRY(bsrm2rb_s)
568	lwz	%r0,0(%r3)	/* get log2(stride) */
569	rotlw	%r5,%r5,%r0	/* shift offset */
570ENTRY(bsrm2rb)
571	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
572	mr	%r4,%r6		/* move addr to argument 1 register */
573	mr	%r5,%r7		/* move count to argument 2 register */
574ENTRY(ins16rb)
575	cmpwi	%r5,0		/* len == 0? */
576	beqlr-			/*   return if len == 0 */
577	addi	%r5,%r5,-1	/* len -= 1 */
578	slwi	%r5,%r5,1	/* len *= 2 */
579	add	%r5,%r5,%r4	/* len += src */
580	addi	%r4,%r4,-2	/* pre-decrement */
5811:	lhbrx	%r0,0,%r3	/* load value (byte reversed) */
582	sthu	%r0,2(%r4)	/* store and increment */
583	cmpl	0,%r4,%r5	/* at the end? */
584	bne+	1b		/*   nope, do another pass */
585	eieio			/* memory barrier (reorder protection) */
586	DBGSYNC			/* force exceptions */
587	blr			/* return */
588
589/* 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) */
590/* 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) */
591/* LINTSTUB: Func: void ins32rb(const volatile u_int32_t *src, u_int32_t *dst, size_t len) */
592ENTRY(bsrm4rb_s)
593	lwz	%r0,0(%r3)	/* get log2(stride) */
594	rotlw	%r5,%r5,%r0	/* shift offset */
595ENTRY(bsrm4rb)
596	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
597	mr	%r4,%r6		/* move addr to argument 1 register */
598	mr	%r5,%r7		/* move count to argument 2 register */
599ENTRY(ins32rb)
600	cmpwi	%r5,0		/* len == 0? */
601	beqlr-			/*   return if len == 0 */
602	addi	%r5,%r5,-1	/* len -= 1 */
603	slwi	%r5,%r5,2	/* len *= 4 */
604	add	%r5,%r5,%r4	/* len += src */
605	addi	%r4,%r4,-4	/* pre-decrement */
6061:	lwbrx	%r0,0,%r3	/* load value (byte reversed) */
607	stwu	%r0,4(%r4)	/* store and increment */
608	cmpl	0,%r4,%r5	/* at the end? */
609	bne+	1b		/*   nope, do another pass */
610	eieio			/* memory barrier (reorder protection) */
611	DBGSYNC			/* force exceptions */
612	blr			/* return */
613
614/* 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) */
615/* 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) */
616ENTRY(bsrm8rb_s)
617ENTRY(bsrm8rb)
618	trap
619
620/* 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); */
621/* 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); */
622ENTRY(bswr1_s)
623	lwz	%r0,0(%r3)	/* get log2(stride) */
624	li	%r8,1		/* distance between dst bytes */
625	rotlw	%r5,%r5,%r0	/* shift offset */
626	rotlw	%r8,%r8,%r0	/* shift distance */
627	b	.Lbswr1_enter
628ENTRY(bswr1)
629	li	%r8,1		/* distance between dst bytes */
630.Lbswr1_enter:
631	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
632	cmpwi	%r7,0		/* len == 0? */
633	beqlr-			/*   return if len == 0 */
634	addi	%r7,%r7,-1	/* len -= 1 */
635	add	%r7,%r7,%r6	/* len += src */
636	addi	%r6,%r6,-1	/* pre-decrement */
637	sub	%r3,%r3,%r8
6381:	lbzu	%r0,1(%r6)	/* load and increment */
639	stbux	%r0,%r3,%r8	/* store and add distance */
640	cmpl	0,%r6,%r7	/* at the end? */
641	bne+	1b		/*   nope, do another pass */
642	eieio			/* memory barrier (reorder protection) */
643	DBGSYNC			/* force exceptions */
644	blr			/* return */
645
646/* 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); */
647/* 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); */
648ENTRY(bswr2_s)
649	lwz	%r0,0(%r3)	/* get log2(stride) */
650	li	%r8,2		/* distance between dst halfwords */
651	rotlw	%r5,%r5,%r0	/* shift offset */
652	rotlw	%r8,%r8,%r0	/* shift distance */
653	b	.Lbswr2_enter
654ENTRY(bswr2)
655	li	%r8,2		/* distance between dst halfwords */
656.Lbswr2_enter:
657	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
658	cmpwi	%r7,0		/* len == 0? */
659	beqlr-			/*   return if len == 0 */
660	addi	%r7,%r7,-1	/* len -= 1 */
661	slwi	%r7,%r7,1	/* len *= 2 */
662	add	%r7,%r7,%r6	/* len += src */
663	addi	%r6,%r6,-2	/* pre-decrement */
664	sub	%r3,%r3,%r8
6651:	lhzu	%r0,2(%r6)	/* load and increment */
666	sthux	%r0,%r3,%r8	/* store and add distance */
667	cmpl	0,%r6,%r7	/* at the end? */
668	bne+	1b		/*   nope, do another pass */
669	eieio			/* memory barrier (reorder protection) */
670	DBGSYNC			/* force exceptions */
671	blr			/* return */
672
673/* 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); */
674/* 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); */
675ENTRY(bswr2rb_s)
676	lwz	%r0,0(%r3)	/* get log2(stride) */
677	li	%r8,2		/* distance between dst halfwords */
678	rotlw	%r5,%r5,%r0	/* shift offset */
679	rotlw	%r8,%r8,%r0	/* shift distance */
680	b	.Lbswr2rb_enter
681ENTRY(bswr2rb)
682	li	%r8,2		/* distance between dst halfwords */
683.Lbswr2rb_enter:
684	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
685	cmpwi	%r7,0		/* len == 0? */
686	beqlr-			/*   return if len == 0 */
687	addi	%r7,%r7,-1	/* len -= 1 */
688	slwi	%r7,%r7,1	/* len *= 2 */
689	add	%r7,%r7,%r6	/* len += src */
690	addi	%r6,%r6,-2	/* pre-decrement */
6911:	lhzu	%r0,2(%r6)	/* load and increment */
692	sthbrx	%r0,0,%r3	/* store (reversed) */
693	add	%r3,%r3,%r8	/* dst += distance */
694	cmpl	0,%r6,%r7	/* at the end? */
695	bne+	1b		/*   nope, do another pass */
696	eieio			/* memory barrier (reorder protection) */
697	DBGSYNC			/* force exceptions */
698	blr			/* return */
699
700/* 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); */
701/* 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); */
702ENTRY(bswr4_s)
703	lwz	%r0,0(%r3)	/* get log2(stride) */
704	li	%r8,4		/* distance between dst halfwords */
705	rotlw	%r5,%r5,%r0	/* shift offset */
706	rotlw	%r8,%r8,%r0	/* shift distance */
707	b	.Lbswr4_enter
708ENTRY(bswr4)
709	li	%r8,4		/* distance between dst halfwords */
710.Lbswr4_enter:
711	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
712	cmpwi	%r7,0		/* len == 0? */
713	beqlr-			/*   return if len == 0 */
714	addi	%r7,%r7,-1	/* len -= 1 */
715	slwi	%r7,%r7,2	/* len *= 4 */
716	add	%r7,%r7,%r6	/* len += src */
717	addi	%r6,%r6,-4	/* pre-decrement */
718	sub	%r3,%r3,%r8
7191:	lwzu	%r0,4(%r6)	/* load and increment */
720	stwux	%r0,%r3,%r8	/* store and add distance */
721	cmpl	0,%r6,%r7	/* at the end? */
722	bne+	1b		/*   nope, do another pass */
723	eieio			/* memory barrier (reorder protection) */
724	DBGSYNC			/* force exceptions */
725	blr			/* return */
726
727/* 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); */
728/* 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); */
729ENTRY(bswr4rb_s)
730	lwz	%r0,0(%r3)	/* get log2(stride) */
731	li	%r8,4		/* distance between dst halfwords */
732	rotlw	%r5,%r5,%r0	/* shift offset */
733	rotlw	%r8,%r8,%r0	/* shift distance */
734	b	.Lbswr4rb_enter
735ENTRY(bswr4rb)
736	li	%r8,4		/* distance between dst halfwords */
737.Lbswr4rb_enter:
738	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
739	cmpwi	%r7,0		/* len == 0? */
740	beqlr-			/*   return if len == 0 */
741	addi	%r7,%r7,-1	/* len -= 1 */
742	slwi	%r7,%r7,2	/* len *= 4 */
743	add	%r7,%r7,%r6	/* len += src */
744	addi	%r6,%r6,-4	/* pre-decrement */
7451:	lwzu	%r0,4(%r6)	/* load and increment */
746	stwbrx	%r0,0,%r3	/* store (reversed) */
747	add	%r3,%r3,%r8	/* dst += distance */
748	cmpl	0,%r6,%r7	/* at the end? */
749	bne+	1b		/*   nope, do another pass */
750	eieio			/* memory barrier (reorder protection) */
751	DBGSYNC			/* force exceptions */
752	blr			/* return */
753
754/* 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); */
755/* 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); */
756/* 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); */
757/* 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); */
758ENTRY(bswr8_s)
759ENTRY(bswr8rb_s)
760	lwz	%r0,0(%r3)
761	rotlw	%r5,%r5,%r0
762ENTRY(bswr8)
763ENTRY(bswr8rb)
764	trap
765
766/* 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); */
767/* 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); */
768ENTRY(bsrr1_s)
769	lwz	%r0,0(%r3)	/* get log2(stride) */
770	li	%r8,1		/* distance between src bytes */
771	rotlw	%r5,%r5,%r0	/* shift offset */
772	rotlw	%r8,%r8,%r0	/* shift distance */
773	b	.Lbsrr1_enter
774ENTRY(bsrr1)
775	li	%r8,1		/* distance between src bytes */
776.Lbsrr1_enter:
777	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
778	cmpwi	%r7,0		/* len == 0? */
779	beqlr-			/*   return if len == 0 */
780	addi	%r7,%r7,-1	/* len -= 1 */
781	add	%r7,%r7,%r6	/* len += src */
782	addi	%r6,%r6,-1	/* pre-decrement */
783	sub	%r3,%r3,%r8
7841:	lbzux	%r0,%r3,%r8	/* load value and add distance */
785	stbu	%r0,1(%r6)	/* store and increment */
786	cmpl	0,%r6,%r7	/* at the end? */
787	bne+	1b		/*   nope, do another pass */
788	eieio			/* memory barrier (reorder protection) */
789	DBGSYNC			/* force exceptions */
790	blr			/* return */
791
792/* 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); */
793/* 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); */
794ENTRY(bsrr2_s)
795	lwz	%r0,0(%r3)	/* get log2(stride) */
796	li	%r8,2		/* distance between src halfwords */
797	rotlw	%r5,%r5,%r0	/* shift offset */
798	rotlw	%r8,%r8,%r0	/* shift distance */
799	b	.Lbsrr2_enter
800ENTRY(bsrr2)
801	li	%r8,2		/* distance between src halfwords */
802.Lbsrr2_enter:
803	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
804	cmpwi	%r7,0		/* len == 0? */
805	beqlr-			/*   return if len == 0 */
806	addi	%r7,%r7,-1	/* len -= 1 */
807	slwi	%r7,%r7,1	/* len *= 2 */
808	add	%r7,%r7,%r6	/* len += src */
809	addi	%r6,%r6,-2	/* pre-decrement */
810	sub	%r3,%r3,%r8
8111:	lhzux	%r0,%r3,%r8	/* load value and add distance */
812	sthu	%r0,2(%r6)	/* store and increment */
813	cmpl	0,%r6,%r7	/* at the end? */
814	bne+	1b		/*   nope, do another pass */
815	eieio			/* memory barrier (reorder protection) */
816	DBGSYNC			/* force exceptions */
817	blr			/* return */
818
819/* 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); */
820/* 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); */
821ENTRY(bsrr2rb_s)
822	lwz	%r0,0(%r3)	/* get log2(stride) */
823	li	%r8,2		/* distance between source halfwords */
824	rotlw	%r5,%r5,%r0	/* shift offset */
825	rotlw	%r8,%r8,%r0	/* shift distance */
826	b	.Lbsrr2rb_enter
827ENTRY(bsrr2rb)
828	li	%r8,2		/* distance between source halfwords */
829.Lbsrr2rb_enter:
830	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
831	cmpwi	%r7,0		/* len == 0? */
832	beqlr-			/*   return if len == 0 */
833	addi	%r7,%r7,-1	/* len -= 1 */
834	slwi	%r7,%r7,1	/* len *= 2 */
835	add	%r7,%r7,%r6	/* len += src */
836	addi	%r6,%r6,-2	/* pre-decrement */
8371:	lhbrx	%r0,0,%r3	/* load value (reversed) */
838	add	%r3,%r3,%r8	/* src += distance */
839	sthu	%r0,2(%r6)	/* store and increment */
840	cmpl	0,%r6,%r7	/* at the end? */
841	bne+	1b		/*   nope, do another pass */
842	eieio			/* memory barrier (reorder protection) */
843	DBGSYNC			/* force exceptions */
844	blr			/* return */
845
846/* 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); */
847/* 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); */
848ENTRY(bsrr4_s)
849	lwz	%r0,0(%r3)		/* get log2(stride) */
850	li	%r8,4		/* distance between src words */
851	rotlw	%r5,%r5,%r0	/* shift offset */
852	rotlw	%r8,%r8,%r0	/* shift distance */
853	b	.Lbsrr4_enter
854ENTRY(bsrr4)
855	li	%r8,4		/* distance between src words */
856.Lbsrr4_enter:
857	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
858	cmpwi	%r7,0		/* len == 0? */
859	beqlr-			/*   return if len == 0 */
860	addi	%r7,%r7,-1	/* len -= 1 */
861	slwi	%r7,%r7,2	/* len *= 4 */
862	add	%r7,%r7,%r6	/* len += src */
863	addi	%r6,%r6,-4	/* pre-decrement */
864	sub	%r3,%r3,%r8
8651:	lwzux	%r0,%r3,%r8	/* load value and add distance */
866	stwu	%r0,4(%r6)	/* store and increment */
867	cmpl	0,%r6,%r7	/* at the end? */
868	bne+	1b		/*   nope, do another pass */
869	eieio			/* memory barrier (reorder protection) */
870	DBGSYNC			/* force exceptions */
871	blr			/* return */
872
873/* 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); */
874/* 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); */
875ENTRY(bsrr4rb_s)
876	lwz	%r0,0(%r3)	/* get log2(stride) */
877	li	%r8,4		/* distance between src words */
878	rotlw	%r5,%r5,%r0	/* shift offset */
879	rotlw	%r8,%r8,%r0	/* shift distance */
880	b	.Lbsrr4rb_enter
881ENTRY(bsrr4rb)
882	li	%r8,4		/* distance between src words */
883.Lbsrr4rb_enter:
884	add	%r3,%r4,%r5	/* add offset to handle & place in argument 0 */
885	mr	%r4,%r6		/* move addr to argument 1 register */
886	cmpwi	%r7,0		/* len == 0? */
887	beqlr-			/*   return if len == 0 */
888	addi	%r7,%r7,-1	/* len -= 1 */
889	slwi	%r7,%r7,2	/* len *= 4 */
890	add	%r7,%r7,%r6	/* len += src */
891	addi	%r6,%r6,-4	/* pre-decrement */
8921:	lwbrx	%r0,0,%r3	/* load value (reversed) */
893	add	%r3,%r3,%r8	/* src += distance */
894	sthu	%r0,4(%r6)	/* store and increment */
895	cmpl	0,%r6,%r7	/* at the end? */
896	bne+	1b		/*   nope, do another pass */
897	eieio			/* memory barrier (reorder protection) */
898	DBGSYNC			/* force exceptions */
899	blr			/* return */
900
901/* 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); */
902/* 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); */
903/* 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); */
904/* 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); */
905ENTRY(bsrr8_s)
906ENTRY(bsrr8rb_s)
907	lwz	%r0,0(%r3)
908	rotlw	%r5,%r5,%r0
909ENTRY(bsrr8)
910ENTRY(bsrr8rb)
911	trap
912
913/* 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); */
914/* 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); */
915ENTRY(bssr1_s)
916	lwz	%r0,0(%r3)	/* get log2(stride) */
917	li	%r8,1		/* distance between src bytes */
918	rotlw	%r5,%r5,%r0	/* shift offset */
919	rotlw	%r8,%r8,%r0	/* shift distance */
920	b	.Lbssr1_enter
921ENTRY(bssr1)
922	li	%r8,1		/* distance between src bytes */
923.Lbssr1_enter:
924	cmpwi	%r7,0		/* len == 0? */
925	beqlr-			/*   return if len == 0 */
9261:	addi	%r7,%r7,-1	/* len -= 1 */
927	stbx	%r6,%r4,%r5	/* store value */
928	add	%r5,%r5,%r8	/* add offset */
929	cmpwi	%r7,0		/* len == 0? */
930	bne+	1b		/*   nope, do another pass */
931	eieio			/* memory barrier (reorder protection) */
932	DBGSYNC			/* force exceptions */
933	blr			/* return */
934
935/* 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); */
936/* 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); */
937ENTRY(bssr2_s)
938	lwz	%r0,0(%r3)	/* get log2(stride) */
939	li	%r8,2		/* distance between src halfwords */
940	rotlw	%r5,%r5,%r0	/* shift offset */
941	rotlw	%r8,%r8,%r0	/* shift distance */
942	b	.Lbssr2_enter
943ENTRY(bssr2)
944	li	%r8,2		/* distance between src halfwords */
945.Lbssr2_enter:
946	cmpwi	%r7,0		/* len == 0? */
947	beqlr-			/*   return if len == 0 */
9481:	addi	%r7,%r7,-1	/* len -= 1 */
949	sthx	%r6,%r4,%r5	/* store value */
950	add	%r5,%r5,%r8	/* add offset */
951	cmpwi	%r7,0		/* len == 0? */
952	bne+	1b		/*   nope, do another pass */
953	eieio			/* memory barrier (reorder protection) */
954	DBGSYNC			/* force exceptions */
955	blr			/* return */
956
957/* 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); */
958/* 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); */
959ENTRY(bssr2rb_s)
960	lwz	%r0,0(%r3)	/* get log2(stride) */
961	li	%r8,2		/* distance between src halfwords */
962	rotlw	%r5,%r5,%r0	/* shift offset */
963	rotlw	%r8,%r8,%r0	/* shift distance */
964	b	.Lbssr2rb_enter
965ENTRY(bssr2rb)
966	li	%r8,2		/* distance between src halfwords */
967.Lbssr2rb_enter:
968	cmpwi	%r7,0		/* len == 0? */
969	beqlr-			/*   return if len == 0 */
9701:	addi	%r7,%r7,-1	/* len -= 1 */
971	sthbrx	%r6,%r4,%r5	/* store value */
972	add	%r5,%r5,%r8	/* add offset */
973	cmpwi	%r7,0		/* len == 0? */
974	bne+	1b		/*   nope, do another pass */
975	eieio			/* memory barrier (reorder protection) */
976	DBGSYNC			/* force exceptions */
977	blr			/* return */
978
979/* 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); */
980/* 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); */
981ENTRY(bssr4_s)
982	lwz	%r0,0(%r3)	/* get log2(stride) */
983	li	%r8,4		/* distance between src words */
984	rotlw	%r5,%r5,%r0	/* shift offset */
985	rotlw	%r8,%r8,%r0	/* shift distance */
986	b	.Lbssr4_enter
987ENTRY(bssr4)
988	li	%r8,4		/* distance between src words */
989.Lbssr4_enter:
990	cmpwi	%r7,0		/* len == 0? */
991	beqlr-			/*   return if len == 0 */
9921:	addi	%r7,%r7,-1	/* len -= 1 */
993	stwx	%r6,%r4,%r5	/* store value */
994	add	%r5,%r5,%r8	/* add offset */
995	cmpwi	%r7,0		/* len == 0? */
996	bne+	1b		/*   nope, do another pass */
997	eieio			/* memory barrier (reorder protection) */
998	DBGSYNC			/* force exceptions */
999	blr			/* return */
1000
1001/* 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); */
1002/* 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); */
1003ENTRY(bssr4rb_s)
1004	lwz	%r0,0(%r3)	/* get log2(stride) */
1005	li	%r8,4		/* distance between src words */
1006	rotlw	%r5,%r5,%r0	/* shift offset */
1007	rotlw	%r8,%r8,%r0	/* shift distance */
1008	b	.Lbssr4rb_enter
1009ENTRY(bssr4rb)
1010	li	%r8,4		/* distance between src words */
1011.Lbssr4rb_enter:
1012	cmpwi	%r7,0		/* len == 0? */
1013	beqlr-			/*   return if len == 0 */
10141:	addi	%r7,%r7,-1	/* len -= 1 */
1015	stwbrx	%r6,%r4,%r5	/* store value */
1016	add	%r5,%r5,%r8	/* add offset */
1017	cmpwi	%r7,0		/* len == 0? */
1018	bne+	1b		/*   nope, do another pass */
1019	eieio			/* memory barrier (reorder protection) */
1020	DBGSYNC			/* force exceptions */
1021	blr			/* return */
1022
1023/* 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); */
1024/* 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); */
1025/* 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); */
1026/* 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); */
1027ENTRY(bssr8_s)
1028ENTRY(bssr8rb_s)
1029	lwz	%r0,0(%r3)
1030	rotlw	%r5,%r5,%r0
1031ENTRY(bssr8)
1032ENTRY(bssr8rb)
1033	trap
1034
1035/* 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); */
1036/* 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); */
1037ENTRY(bscr1_s)
1038	lwz	%r0,0(%r3)	/* get log2(stride) */
1039	b	.Lbscr1_enter
1040ENTRY(bscr1)
1041	li	%r0,0		/* non stride */
1042.Lbscr1_enter:
1043	li	%r9,1		/* distance between src bytes */
1044	rotlw	%r9,%r9,%r0		/* shift distance */
1045	cmpwi	%r8,0		/* len == 0? */
1046	beqlr-			/*   return if len == 0 */
1047	rotlw	%r5,%r5,%r0	/* shift src offset */
1048	rotlw	%r7,%r7,%r0	/* shift dest offset */
1049	add	%r10,%r4,%r5	/* calculate src end address */
1050	add	%r11,%r6,%r7	/* calculate dest end address */
1051	mtctr	%r8
1052	cmpw	%r10,%r11	/* compare end address */
1053	blt	2f		/* jump if h + o < h2 + o2 */
1054
1055				/* h + o >= h2 + o2 */
10561:	lbzx	%r12,%r4,%r5	/* load value */
1057	stbx	%r12,%r6,%r7	/* store value */
1058	add	%r5,%r5,%r9	/* src offset += 1 */
1059	add	%r7,%r7,%r9	/* dest offset += 1 */
1060	bdnz+	1b		/* jump if len != 0 */
1061	b	.Lbscr1_end	/* end */
1062
1063				/* h + o < h2 + o2 */
10642:	addi	%r8,%r8,-1	/* len -= 1 */
1065	rotlw	%r8,%r8,%r0	/* shift len */
1066	add	%r5,%r10,%r8	/* src offset = o + len - 1 */
1067	add	%r7,%r11,%r8	/* dest offset = o2 + len - 1 */
10683:	lbzx	%r12,%r4,%r5	/* load value */
1069	stbx	%r12,%r6,%r7	/* store value */
1070	sub	%r5,%r5,%r9	/* src offset -= 1 */
1071	sub	%r7,%r7,%r9	/* dest offset -= 1 */
1072	bdnz+	3b		/* jump if len != 0 */
1073.Lbscr1_end:
1074	eieio			/* memory barrier (reorder protection) */
1075	DBGSYNC			/* force exceptions */
1076	blr			/* return */
1077
1078/* 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); */
1079/* 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); */
1080ENTRY(bscr2_s)
1081	lwz	%r0,0(%r3)		/* get log2(stride) */
1082	b	.Lbscr2_enter
1083ENTRY(bscr2)
1084	li	%r0,0		/* non stride */
1085.Lbscr2_enter:
1086	li	%r9,2		/* distance between src halfwords */
1087	rotlw	%r9,%r9,%r0		/* shift distance */
1088	cmpwi	%r8,0		/* len == 0? */
1089	beqlr-			/*   return if len == 0 */
1090	rotlw	%r5,%r5,%r0	/* shift src offset */
1091	rotlw	%r7,%r7,%r0	/* shift dest offset */
1092	add	%r10,%r4,%r5	/* calculate src end address */
1093	add	%r11,%r6,%r7	/* calculate dest end address */
1094	mtctr	%r8
1095	cmpw	%r10,%r11	/* compare end address */
1096	blt	2f		/* jump if h + o < h2 + o2 */
1097
1098				/* h + o >= h2 + o2 */
10991:	lhzx	%r12,%r4,%r5	/* load value */
1100	sthx	%r12,%r6,%r7	/* store value */
1101	add	%r5,%r5,%r9	/* src offset += 2 */
1102	add	%r7,%r7,%r9	/* dest offset += 2 */
1103	bdnz+	1b		/* jump if len != 0 */
1104	b	.Lbscr2_end	/* end */
1105
1106				/* h + o < h2 + o2 */
11072:	addi	%r8,%r8,-1	/* len -= 1 */
1108	rotlw	%r8,%r8,%r0	/* shift len */
1109	add	%r5,%r10,%r8	/* src offset = o + len - 1 */
1110	add	%r7,%r11,%r8	/* dest offset = o2 + len - 1 */
11113:	lhzx	%r12,%r4,%r5	/* load value */
1112	sthx	%r12,%r6,%r7	/* store value */
1113	sub	%r5,%r5,%r9	/* src offset -= 2 */
1114	sub	%r7,%r7,%r9	/* dest offset -= 2 */
1115	bdnz+	3b		/* jump if len != 0 */
1116.Lbscr2_end:
1117	eieio			/* memory barrier (reorder protection) */
1118	DBGSYNC			/* force exceptions */
1119	blr			/* return */
1120
1121/* 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); */
1122/* 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); */
1123ENTRY(bscr4_s)
1124	lwz	%r0,0(%r3)	/* get log2(stride) */
1125	b	.Lbscr4_enter
1126ENTRY(bscr4)
1127	li	%r0,0		/* non stride */
1128.Lbscr4_enter:
1129	li	%r9,4		/* distance between src words */
1130	rotlw	%r9,%r9,%r0	/* shift distance */
1131	cmpwi	%r8,0		/* len == 0? */
1132	beqlr-			/*   return if len == 0 */
1133	rotlw	%r5,%r5,%r0	/* shift src offset */
1134	rotlw	%r7,%r7,%r0	/* shift dest offset */
1135	add	%r10,%r4,%r5	/* calculate src end address */
1136	add	%r11,%r6,%r7	/* calculate dest end address */
1137	mtctr	%r8
1138	cmpw	%r10,%r11	/* compare end address */
1139	blt	2f		/* jump if h + o < h2 + o2 */
1140
1141				/* h + o >= h2 + o2 */
11421:	lwzx	%r12,%r4,%r5	/* load value */
1143	stwx	%r12,%r6,%r7	/* store value */
1144	add	%r5,%r5,%r9	/* src offset += 4 */
1145	add	%r7,%r7,%r9	/* dest offset += 4 */
1146	bdnz+	1b		/* jump if len != 0 */
1147	b	.Lbscr4_end	/* end */
1148
1149				/* h + o < h2 + o2 */
11502:	addi	%r8,%r8,-1	/* len -= 1 */
1151	rotlw	%r8,%r8,%r0	/* shift len */
1152	add	%r5,%r10,%r8	/* src offset = o + len - 1 */
1153	add	%r7,%r11,%r8	/* dest offset = o2 + len - 1 */
11543:	lwzx	%r12,%r4,%r5	/* load value */
1155	stwx	%r12,%r6,%r7	/* store value */
1156	sub	%r5,%r5,%r9	/* src offset -= 4 */
1157	sub	%r7,%r7,%r9	/* dest offset -= 4 */
1158	bdnz+	3b		/* jump if len != 0 */
1159.Lbscr4_end:
1160	eieio			/* memory barrier (reorder protection) */
1161	DBGSYNC			/* force exceptions */
1162	blr			/* return */
1163
1164/* 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); */
1165/* 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); */
1166ENTRY(bscr8_s)
1167ENTRY(bscr8)
1168	trap
1169
1170