|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25: /*
26: * HISTORY
27: * Revision 1.3 1997/11/06 00:15:22 tmason
28: * Fixed spl bug in pmap.c as well as fixes for bcopy
29: *
30: * Revision 1.2 1997/10/29 02:13:43 tmason
31: * Fixed oodles of bugs related to pmap issues as well as bcopy, FLOAT!, and cached accesses.
32: *
33: * Revision 1.1.1.1 1997/09/30 02:45:28 wsanchez
34: * Import of kernel from umeshv/kernel
35: *
36: * Revision 1.1.1.1 1997/06/28 10:47:00 rvega
37: * Radar #1665906
38: * Add integer load/store method to avoid use of floating
39: * point load/stores in kernel until full support is completed.
40: * Note: this restores code that was regressed during integration.
41: * [1997/06/28 10:47:00 rvega]
42: *
43: * Revision 1.1.1.1 1997/04/30 15:00:00 rvega
44: * Use the Tim Olson fast copy function.
45: * [1997/04/30 15:00:00 rvega]
46: *
47: */
48:
49: /*
50: * Copyright 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991
51: * All Rights Reserved
52: *
53: * Permission to use, copy, modify, and distribute this software and
54: * its documentation for any purpose and without fee is hereby granted,
55: * provided that the above copyright notice appears in all copies and
56: * that both the copyright notice and this permission notice appear in
57: * supporting documentation.
58: *
59: * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
60: * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
61: * FOR A PARTICULAR PURPOSE.
62: *
63: * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
64: * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
65: * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
66: * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
67: * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
68: */
69: /*
70: * MKLINUX-1.0DR2
71: */
72:
73: #include <ppc/asm.h>
74: #include <assym.h>
75: #include <ppc/bcopy.h>
76: #include <ppc/proc_reg.h> /* For CACHE_LINE_SIZE */
77:
78: #ifndef USE_FLOATING_POINT_IN_KERNEL
79: #define USE_FLOATING_POINT_IN_KERNEL 0
80: #else
81: #undef USE_FLOATING_POINT_IN_KERNEL
82: #define USE_FLOATING_POINT_IN_KERNEL 0
83: #endif
84:
85: /* If we are permitted to use floating point registers, this goes faster
86: * for cache-aligned copies
87: */
88:
89:
90: /* registers used: */
91:
92: /* IMPORTANT - copyin/copyout assumes that bcopy won't trash r10 */
93:
94: #define src r4
95: #define byteCount r5
96: #define wordCount r6
97: #define dst r7
98: #define bufA r8
99: #define bufB r9
100: #define bufC r0
101: #define fbufA f8
102: #define fbufB f9
103: #define fbufC f0
104:
105: #define rs r3
106: #define rd r4
107: #define rc r5
108:
109: #define CACHE_FLAG 4
110: #define crCached 4
111:
112: /*
113: * bcopy(const char *from, chat *to, vm_size_t nbytes)
114: *
115: * bcopy_nc is simply bcopy except the dcbz & dcbst
116: * instructions are not to be used. This is for non-cached
117: * areas of memory.
118: *
119: * Various device drivers heavily use this routine.
120: */
121:
122: ENTRY(bcopy_nc, TAG_NO_FRAME_USED)
123: mfcr r0
124: stw r0, FM_CR_SAVE(r1)
125: mflr r0
126: stw r0, FM_LR_SAVE(r1)
127:
128: crxor CACHE_FLAG,CACHE_FLAG,CACHE_FLAG
129: b .L_bcopy_common
130:
131: /*
132: * void bcopy(const char *from, char *to, vm_size_t nbytes)
133: *
134: * bcopy uses memcpy, shouldn't this be done with a #define??
135: */
136:
137: #if USE_FAST_BCOPY
138:
139: #if ORG_BCOPY
140: ENTRY(fast_bcopy, TAG_NO_FRAME_USED)
141: #else /* ORG_BCOPY */
142: ENTRY2(bcopy,fast_bcopy, TAG_NO_FRAME_USED)
143: #endif /* ORG_BCOPY */
144:
145: #endif /* USE_FAST_BCOPY */
146: mfcr r0
147: stw r0, FM_CR_SAVE(r1)
148: mflr r0
149: stw r0, FM_LR_SAVE(r1)
150:
151: creqv CACHE_FLAG,CACHE_FLAG,CACHE_FLAG
152:
153: .L_bcopy_common:
154: cmpwi CR0, byteCount, 0
155: beqlr- CR0
156:
157: /* Convert to memcpy style arguments */
158: mr dst, ARG1 /* Move dst from arg to 'dst' */
159: mr src, ARG0 /* put src in expected register too */
160: b .L_memcpy_bcopy
161:
162: #if 0 /* ndef PPC604 */
163: /* The 601 and 603 cope well with unaligned word accesses, so we can
164: * forget about worrying about word alignment issues - the only exception
165: * to this is on a page boundary. This means that we can go faster than
166: * on a 604
167: */
168:
169: /* For the moment, just use the 604 version, TODO NMGS optimise */
170:
171: #else /* PPC604 */
172:
173: /*
174: * Copyright (C) 1993, 1994, 1995 Tim Olson
175: *
176: * This software is distributed absolutely without warranty. You are
177: * free to use and modify the software as you wish. You are also free
178: * to distribute the software as long as you retain the above copyright
179: * notice, and you make clear what your modifications were.
180: *
181: * Send comments and bug reports to [email protected]
182: */
183:
184: .align 2
185: LmemcpyAlignVector:
186: .long .mm0s0c0
187: .long .mm0s0c1
188: .long .mm0s0c2
189: .long .mm0s0c3
190: .long .mm0s1c0
191: .long .mm0s1c1
192: .long .mm0s1c2
193: .long .mm0s1c3
194: .long .mm0s2c0
195: .long .mm0s2c1
196: .long .mm0s2c2
197: .long .mm0s2c3
198: .long .mm0s3c0
199: .long .mm0s3c1
200: .long .mm0s3c2
201: .long .mm0s3c3
202: .long .mm1s0c0
203: .long .mm1s0c1
204: .long .mm1s0c2
205: .long .mm1s0c3
206: .long .mm1s1c0
207: .long .mm1s1c1
208: .long .mm1s1c2
209: .long .mm1s1c3
210: .long .mm1s2c0
211: .long .mm1s2c1
212: .long .mm1s2c2
213: .long .mm1s2c3
214: .long .mm1s3c0
215: .long .mm1s3c1
216: .long .mm1s3c2
217: .long .mm1s3c3
218: .long .mm2s0c0
219: .long .mm2s0c1
220: .long .mm2s0c2
221: .long .mm2s0c3
222: .long .mm2s1c0
223: .long .mm2s1c1
224: .long .mm2s1c2
225: .long .mm2s1c3
226: .long .mm2s2c0
227: .long .mm2s2c1
228: .long .mm2s2c2
229: .long .mm2s2c3
230: .long .mm2s3c0
231: .long .mm2s3c1
232: .long .mm2s3c2
233: .long .mm2s3c3
234: .long .mm3s0c0
235: .long .mm3s0c1
236: .long .mm3s0c2
237: .long .mm3s0c3
238: .long .mm3s1c0
239: .long .mm3s1c1
240: .long .mm3s1c2
241: .long .mm3s1c3
242: .long .mm3s2c0
243: .long .mm3s2c1
244: .long .mm3s2c2
245: .long .mm3s2c3
246: .long .mm3s3c0
247: .long .mm3s3c1
248: .long .mm3s3c2
249: .long .mm3s3c3
250:
251: /*
252: * high-performance memcpy implementation for 604
253: * uses aligned transfers plus alignment shuffling code
254: */
255:
256:
257: #if USE_FAST_BCOPY
258: ENTRY(memcpy, TAG_NO_FRAME_USED)
259: #endif /* USE_FAST_BCOPY */
260: mfcr r0
261: stw r0, FM_CR_SAVE(r1)
262: mflr r0
263: stw r0, FM_LR_SAVE(r1)
264:
265: cmpwi CR0, byteCount, 0
266: beqlr- CR0
267: mr dst, ARG0 /* Move dst from retval to 'dst' */
268:
269: creqv CACHE_FLAG,CACHE_FLAG,CACHE_FLAG
270:
271: .L_memcpy_bcopy:
272: /* (jumped to) entry point for fast_bcopy */
273:
274: cmplw src, dst
275: beqlr /* they are equal, so exit */
276:
277: stwu r1, -48(r1)
278: stw r3, 12(r1)
279:
280: /* disable ints */
281: mfmsr r12
282: rlwinm r8, r12, 0 , MSR_EE_BIT+1, MSR_EE_BIT-1
283: mtmsr r8
284:
285: #if USE_FLOATING_POINT_IN_KERNEL
286: bl EXT(fpu_save) // save fpu state if in use
287: #endif /* USE_FLOATING_POINT_IN_KERNEL */
288:
289: //bgt+ awm0 /* src > dst */
290:
291: sub r0,dst,src
292: cmplw r0,byteCount
293: bge+ awm0
294:
295: add r8, dst, byteCount
296: add r6, src, byteCount
297: mtctr byteCount
298: mmc00: /* move it all, backwards */
299: subi r6, r6, 1
300: subi r8, r8, 1
301: lbz r0, 0(r6)
302: stb r0, 0(r8)
303: bdnz+ mmc00
304:
305:
306: bcopy_exit:
307: #if USE_FLOATING_POINT_IN_KERNEL
308: bl EXT(fpu_disable)
309: #endif
310: mtmsr r12
311:
312: lwz r3, 12(r1)
313: addi r1, r1, 48
314:
315: lwz r0, FM_LR_SAVE(r1)
316: mtlr r0
317: lwz r0, FM_CR_SAVE(r1)
318: mtcr r0
319:
320: blr
321:
322: awm0:
323: cmpwi CR0, byteCount, 8
324: bge .awm2
325:
326: /* handle a byte at a time for short moves */
327: mtctr byteCount
328: .awm1:
329: lbz r0, 0(src)
330: stb r0, 0(dst)
331: addi src, src, 1
332: addi dst, dst, 1
333:
334: bdnz .awm1
335:
336: b bcopy_exit
337:
338:
339: .awm2:
340: /* special case long, cache-block aligned transfers */
341: andi. r0, src, CACHE_LINE_SIZE-1 /* cache block aligned? */
342: bne .awm3
343: andi. r0, dst, CACHE_LINE_SIZE-1
344: bne .awm3
345: andi. r0, byteCount, CACHE_LINE_SIZE-1
346: bne .awm3
347:
348: srwi wordCount, byteCount, 5 /* compute blocks to transfer */
349:
350: #if USE_FLOATING_POINT_IN_KERNEL
351:
352: cmpwi wordCount, 1
353: beq L_bcopy_one_fp
354:
355: srwi bufA, byteCount, 6 /* compute blocks to transfer */
356: mtctr bufA
357:
358: li bufB, CACHE_LINE_SIZE
359: #else /* USE_FLOATING_POINT_IN_KERNEL */
360:
361: mtctr wordCount
362:
363: #endif /* USE_FLOATING_POINT_IN_KERNEL */
364:
365: .mmc0:
366:
367: #if CACHE_LINE_SIZE < 32
368: #error code assumes CACHE_LINE_SIZE >= 32, and prefers it at 32 exactly
369: #endif
370:
371: #ifndef UNCACHED_DATA_604
372: bf CACHE_FLAG,.L_bcopy_skip_dcbz
373: dcbz 0, dst
374: #if USE_FLOATING_POINT_IN_KERNEL
375: dcbz bufB, dst
376: #endif /* USE_FLOATING_POINT_IN_KERNEL */
377: .L_bcopy_skip_dcbz:
378: #endif /* UNCACHED_DATA_604 */
379:
380: #if USE_FLOATING_POINT_IN_KERNEL
381: /* We can use floating point regs, this zooms */
382: lfd f0, 0(src)
383: lfd f1, 8(src)
384: lfd f2, 16(src)
385: lfd f3, 24(src)
386: lfd f4, 32(src)
387: lfd f5, 40(src)
388: lfd f6, 48(src)
389: lfd f7, 56(src)
390: addi src, src, (2*CACHE_LINE_SIZE)
391:
392: stfd f0, 0(dst)
393: stfd f1, 8(dst)
394: stfd f2, 16(dst)
395: stfd f3, 24(dst)
396: stfd f4, 32(dst)
397: stfd f5, 40(dst)
398: stfd f6, 48(dst)
399: stfd f7, 56(dst)
400: addi dst, dst, (2*CACHE_LINE_SIZE)
401:
402: #else /* USE_FLOATING_POINT_IN_KERNEL */
403: lwz r0, 0(src)
404: lwz r3, 4(src)
405: lwz r5, 8(src)
406: lwz r6, 12(src)
407: lwz r8, 16(src)
408: lwz r9, 20(src)
409: lwz r10, 24(src)
410: lwz r11, 28(src)
411: addi src, src, CACHE_LINE_SIZE
412:
413: stw r0, 0(dst)
414: stw r3, 4(dst)
415: stw r5, 8(dst)
416: stw r6, 12(dst)
417: stw r8, 16(dst)
418: stw r9, 20(dst)
419: stw r10, 24(dst)
420: stw r11, 28(dst)
421: addi dst, dst, CACHE_LINE_SIZE
422:
423: #endif /* USE_FLOATING_POINT_IN_KERNEL */
424:
425: bdnz .mmc0
426:
427: #if USE_FLOATING_POINT_IN_KERNEL
428: L_bcopy_one_fp:
429: /* check just in case we fell through from above */
430: andi. r0, wordCount, 1
431: beq L_bcopy_fpu_end
432:
433: #ifndef UNCACHED_DATA_604
434: bf CACHE_FLAG,.L_bcopy_skip_dcbz1
435: dcbz 0, dst
436: .L_bcopy_skip_dcbz1:
437: #endif /* UNCACHED_DATA_604 */
438:
439: /* We can use floating point regs, this zooms */
440: lfd f0, 0(src)
441: lfd f1, 8(src)
442: lfd f2, 16(src)
443: lfd f3, 24(src)
444:
445: stfd f0, 0(dst)
446: stfd f1, 8(dst)
447: stfd f2, 16(dst)
448: stfd f3, 24(dst)
449: L_bcopy_fpu_end:
450: #endif /* USE_FLOATING_POINT_IN_KERNEL */
451: b bcopy_exit
452:
453:
454:
455: .awm3:
456: /* compute alignment transfer vector */
457: addis bufB, 0, ha16(LmemcpyAlignVector)
458: addi bufB, bufB, lo16(LmemcpyAlignVector)
459:
460: srwi. wordCount, byteCount, 2 /* compute words to transfer */
461: rlwinm bufA, dst, 6, 24, 25
462: rlwimi bufA, src, 4, 26, 27
463: rlwimi bufA, byteCount, 2, 28, 29
464: lwzx r0, bufA, bufB
465: mtctr r0
466: bctr
467:
468:
469:
470: /* forward copy destination aligned at 0, source aligned at 0, byte count 0 */
471: /* d = 0123 4567 89ab xxxx */
472: /* s = 0123 4567 89ab xxxx */
473: .align 4
474: .mm0s0c0:
475: srwi r0, wordCount, 1
476: mtctr r0
477:
478: .mm0s0c0a:
479: lwz bufA, 0(src)
480: lwz bufB, 4(src)
481: stw bufA, 0(dst)
482: stw bufB, 4(dst)
483: addi src, src, 8
484: addi dst, dst, 8
485: bdnz .mm0s0c0a
486:
487: /* if even number of words, return */
488: andi. wordCount, wordCount, 1
489: beq bcopy_exit
490:
491: /* otherwise copy last word */
492: .mm0s0c0a1:
493: lwz bufA, 0(src)
494: stw bufA, 0(dst)
495:
496: b bcopy_exit
497:
498: /* forward copy destination aligned at 0, source aligned at 0, byte count 1 */
499: /* d = 0123 4567 89ab cxxx */
500: /* s = 0123 4567 89ab cxxx */
501: .align 4
502: .mm0s0c1:
503: mtctr wordCount
504:
505: .mm0s0c1a:
506: lwz bufA, 0(src)
507: stw bufA, 0(dst)
508: addi src, src, 4
509: addi dst, dst, 4
510: bdnz .mm0s0c1a
511:
512: lwz bufC, 0(dst)
513: lwz bufA, 0(src)
514: rlwimi bufC, bufA, 0, 0, 7
515: stw bufC, 0(dst)
516: b bcopy_exit
517:
518: /* forward copy destination aligned at 0, source aligned at 0, byte count 2 */
519: /* d = 0123 4567 89ab cdxx */
520: /* s = 0123 4567 89ab cdxx */
521: .align 4
522: .mm0s0c2:
523: mtctr wordCount
524: .mm0s0c2a:
525: lwz bufA, 0(src)
526: stw bufA, 0(dst)
527: addi src, src, 4
528: addi dst, dst, 4
529: bdnz .mm0s0c2a
530:
531: lwz bufC, 0(dst)
532: lwz bufA, 0(src)
533: rlwimi bufC, bufA, 0, 0, 15
534: stw bufC, 0(dst)
535: b bcopy_exit
536:
537: /* forward copy destination aligned at 0, source aligned at 0, byte count 3 */
538: /* d = 0123 4567 89ab cdex */
539: /* s = 0123 4567 89ab cdex */
540: .align 4
541: .mm0s0c3:
542: mtctr wordCount
543:
544: .mm0s0c3a:
545: lwz bufA, 0(src)
546: stw bufA, 0(dst)
547: addi src, src, 4
548: addi dst, dst, 4
549: bdnz .mm0s0c3a
550:
551: lwz bufC, 0(dst)
552: lwz bufA, 0(src)
553: rlwimi bufC, bufA, 0, 0, 23
554: stw bufC, 0(dst)
555: b bcopy_exit
556:
557: /* forward copy destination aligned at 0, source aligned at 1, byte count 0 */
558: /* d = 0123 4567 89ab xxxx */
559: /* s = x012 3456 789a bxxx */
560: .align 4
561: .mm0s1c0:
562: lwz bufA, -1(src)
563: lwz bufB, 3(src)
564: addi src, src, 3
565: addi wordCount, wordCount, -1
566: mtctr wordCount
567: rlwimi bufC, bufA, 8, 0, 23
568: rlwimi bufC, bufB, 8, 24, 31
569: stw bufC, 0(dst)
570: slwi bufA, bufB, 8
571:
572: .mm0s1c0a:
573: lwz bufB, 4(src)
574: rlwimi bufA, bufB, 8, 24, 31
575: stw bufA, 4(dst)
576: addi src, src, 4
577: slwi bufA, bufB, 8
578: addi dst, dst, 4
579: bdnz .mm0s1c0a
580:
581: b bcopy_exit
582:
583: /* forward copy destination aligned at 0, source aligned at 1, byte count 1 */
584: /* d = 0123 4567 89ab cxxx */
585: /* s = x012 3456 789a bcxx */
586: .align 4
587: .mm0s1c1:
588: lwz bufA, -1(src)
589: lwz bufB, 3(src)
590: addi src, src, 3
591: addi wordCount, wordCount, -1
592: mtctr wordCount
593: rlwimi bufC, bufA, 8, 0, 23
594: rlwimi bufC, bufB, 8, 24, 31
595: stw bufC, 0(dst)
596: slwi bufA, bufB, 8
597:
598: .mm0s1c1a:
599: lwz bufB, 4(src)
600: addi src, src, 4
601: rlwimi bufA, bufB, 8, 24, 31
602: stw bufA, 4(dst)
603: addi dst, dst, 4
604: slwi bufA, bufB, 8
605: bdnz .mm0s1c1a
606:
607: lwz bufC, 4(dst)
608: rlwimi bufC, bufA, 0, 0, 7
609: stw bufC, 4(dst)
610: b bcopy_exit
611:
612: /* forward copy destination aligned at 0, source aligned at 1, byte count 2 */
613: /* d = 0123 4567 89ab cdxx */
614: /* s = x012 3456 789a bcdx */
615: .align 4
616: .mm0s1c2:
617: lwz bufA, -1(src)
618: lwz bufB, 3(src)
619: addi src, src, 3
620: addi wordCount, wordCount, -1
621: mtctr wordCount
622: rlwimi bufC, bufA, 8, 0, 23
623: rlwimi bufC, bufB, 8, 24, 31
624: stw bufC, 0(dst)
625: slwi bufA, bufB, 8
626:
627: .mm0s1c2a:
628: lwz bufB, 4(src)
629: addi src, src, 4
630: rlwimi bufA, bufB, 8, 24, 31
631: stw bufA, 4(dst)
632: addi dst, dst, 4
633: slwi bufA, bufB, 8
634: bdnz .mm0s1c2a
635:
636: lwz bufC, 4(dst)
637: rlwimi bufC, bufA, 0, 0, 15
638: stw bufC, 4(dst)
639: b bcopy_exit
640:
641: /* forward copy destination aligned at 0, source aligned at 1, byte count 3 */
642: /* d = 0123 4567 89ab cdex */
643: /* s = x012 3456 789a bcde xxxx */
644: .align 4
645: .mm0s1c3:
646: lwz bufA, -1(src)
647: lwz bufB, 3(src)
648: addi src, src, 3
649: addi wordCount, wordCount, -1
650: mtctr wordCount
651: rlwimi bufC, bufA, 8, 0, 23
652: rlwimi bufC, bufB, 8, 24, 31
653: stw bufC, 0(dst)
654: slwi bufA, bufB, 8
655:
656: .mm0s1c3a:
657: lwz bufB, 4(src)
658: addi src, src, 4
659: rlwimi bufA, bufB, 8, 24, 31
660: stw bufA, 4(dst)
661: addi dst, dst, 4
662: slwi bufA, bufB, 8
663: bdnz .mm0s1c3a
664:
665: lwz bufC, 4(dst)
666: rlwimi bufC, bufA, 0, 0, 23
667: stw bufC, 4(dst)
668: b bcopy_exit
669:
670: /* forward copy destination aligned at 0, source aligned at 2, byte count 0 */
671: /* d = 0123 4567 89ab xxxx */
672: /* s = xx01 2345 6789 abxx */
673: .align 4
674: .mm0s2c0:
675: lwz bufA, -2(src)
676: lwz bufB, 2(src)
677: addi src, src, 2
678: addi wordCount, wordCount, -1
679: mtctr wordCount
680: rlwimi bufC, bufA, 16, 0, 15
681: rlwimi bufC, bufB, 16, 16, 31
682: stw bufC, 0(dst)
683: slwi bufA, bufB, 16
684:
685: .mm0s2c0a:
686: lwz bufB, 4(src)
687: addi src, src, 4
688: rlwimi bufA, bufB, 16, 16, 31
689: stw bufA, 4(dst)
690: addi dst, dst, 4
691: slwi bufA, bufB, 16
692: bdnz .mm0s2c0a
693:
694: b bcopy_exit
695:
696: /* forward copy destination aligned at 0, source aligned at 2, byte count 1 */
697: /* d = 0123 4567 89ab cxxx */
698: /* s = xx01 2345 6789 abcx */
699: .align 4
700: .mm0s2c1:
701: lwz bufA, -2(src)
702: lwz bufB, 2(src)
703: addi src, src, 2
704: addi wordCount, wordCount, -1
705: mtctr wordCount
706: rlwimi bufC, bufA, 16, 0, 15
707: rlwimi bufC, bufB, 16, 16, 31
708: stw bufC, 0(dst)
709: slwi bufA, bufB, 16
710:
711: .mm0s2c1a:
712: lwz bufB, 4(src)
713: addi src, src, 4
714: rlwimi bufA, bufB, 16, 16, 31
715: stw bufA, 4(dst)
716: addi dst, dst, 4
717: slwi bufA, bufB, 16
718: bdnz .mm0s2c1a
719:
720: lwz bufC, 4(dst)
721: rlwimi bufC, bufA, 0, 0, 7
722: stw bufC, 4(dst)
723: b bcopy_exit
724:
725: /* forward copy destination aligned at 0, source aligned at 2, byte count 2 */
726: /* d = 0123 4567 89ab cdxx */
727: /* s = xx01 2345 6789 abcd xxxx */
728: .align 4
729: .mm0s2c2:
730: lwz bufA, -2(src)
731: lwz bufB, 2(src)
732: addi src, src, 2
733: addi wordCount, wordCount, -1
734: mtctr wordCount
735: rlwimi bufC, bufA, 16, 0, 15
736: rlwimi bufC, bufB, 16, 16, 31
737: stw bufC, 0(dst)
738: slwi bufA, bufB, 16
739:
740: .mm0s2c2a:
741: lwz bufB, 4(src)
742: addi src, src, 4
743: rlwimi bufA, bufB, 16, 16, 31
744: stw bufA, 4(dst)
745: addi dst, dst, 4
746: slwi bufA, bufB, 16
747: bdnz .mm0s2c2a
748:
749: lwz bufC, 4(dst)
750: rlwimi bufC, bufA, 0, 0, 15
751: stw bufC, 4(dst)
752: b bcopy_exit
753:
754: /* forward copy destination aligned at 0, source aligned at 2, byte count 3 */
755: /* d = 0123 4567 89ab cdex */
756: /* s = xx01 2345 6789 abcd exxx */
757: .align 4
758: .mm0s2c3:
759: lwz bufA, -2(src)
760: lwz bufB, 2(src)
761: addi src, src, 2
762: addi wordCount, wordCount, -1
763: mtctr wordCount
764: rlwimi bufC, bufA, 16, 0, 15
765: rlwimi bufC, bufB, 16, 16, 31
766: stw bufC, 0(dst)
767: slwi bufA, bufB, 16
768:
769: .mm0s2c3a:
770: lwz bufB, 4(src)
771: addi src, src, 4
772: rlwimi bufA, bufB, 16, 16, 31
773: stw bufA, 4(dst)
774: addi dst, dst, 4
775: slwi bufA, bufB, 16
776: bdnz .mm0s2c3a
777:
778: lwz bufB, 4(src)
779: lwz bufC, 4(dst)
780: rlwimi bufA, bufB, 16, 16, 31
781: rlwimi bufC, bufA, 0, 0, 23
782: stw bufC, 4(dst)
783: b bcopy_exit
784:
785: /* forward copy destination aligned at 0, source aligned at 3, byte count 0 */
786: /* d = 0123 4567 89ab xxxx */
787: /* s = xxx0 1234 5678 9abx */
788: .align 4
789: .mm0s3c0:
790: lwz bufA, -3(src)
791: lwz bufB, 1(src)
792: addi src, src, 1
793: addi wordCount, wordCount, -1
794: mtctr wordCount
795: rlwimi bufC, bufA, 24, 0, 7
796: rlwimi bufC, bufB, 24, 8, 31
797: stw bufC, 0(dst)
798: slwi bufA, bufB, 24
799:
800: .mm0s3c0a:
801: lwz bufB, 4(src)
802: addi src, src, 4
803: rlwimi bufA, bufB, 24, 8, 31
804: stw bufA, 4(dst)
805: addi dst, dst, 4
806: slwi bufA, bufB, 24
807: bdnz .mm0s3c0a
808:
809: b bcopy_exit
810:
811: /* forward copy destination aligned at 0, source aligned at 3, byte count 1 */
812: /* d = 0123 4567 89ab cxxx */
813: /* s = xxx0 1234 5678 9abc xxxx */
814: .align 4
815: .mm0s3c1:
816: lwz bufA, -3(src)
817: lwz bufB, 1(src)
818: addi src, src, 1
819: addi wordCount, wordCount, -1
820: mtctr wordCount
821: rlwimi bufC, bufA, 24, 0, 7
822: rlwimi bufC, bufB, 24, 8, 31
823: stw bufC, 0(dst)
824: slwi bufA, bufB, 24
825:
826: .mm0s3c1a:
827: lwz bufB, 4(src)
828: addi src, src, 4
829: rlwimi bufA, bufB, 24, 8, 31
830: stw bufA, 4(dst)
831: addi dst, dst, 4
832: slwi bufA, bufB, 24
833: bdnz .mm0s3c1a
834:
835: lwz bufC, 4(dst)
836: rlwimi bufC, bufA, 0, 0, 7
837: stw bufC, 4(dst)
838: b bcopy_exit
839:
840: /* forward copy destination aligned at 0, source aligned at 3, byte count 2 */
841: /* d = 0123 4567 89ab cdxx */
842: /* s = xxx0 1234 5678 9abc dxxx */
843: .align 4
844: .mm0s3c2:
845: lwz bufA, -3(src)
846: lwz bufB, 1(src)
847: addi src, src, 1
848: addi wordCount, wordCount, -1
849: mtctr wordCount
850: rlwimi bufC, bufA, 24, 0, 7
851: rlwimi bufC, bufB, 24, 8, 31
852: stw bufC, 0(dst)
853: slwi bufA, bufB, 24
854:
855: .mm0s3c2a:
856: lwz bufB, 4(src)
857: addi src, src, 4
858: rlwimi bufA, bufB, 24, 8, 31
859: stw bufA, 4(dst)
860: addi dst, dst, 4
861: slwi bufA, bufB, 24
862: bdnz .mm0s3c2a
863:
864: lwz bufB, 4(src)
865: lwz bufC, 4(dst)
866: rlwimi bufA, bufB, 24, 8, 31
867: rlwimi bufC, bufA, 0, 0, 15
868: stw bufC, 4(dst)
869: b bcopy_exit
870:
871: /* forward copy destination aligned at 0, source aligned at 3, byte count 3 */
872: /* d = 0123 4567 89ab cdex */
873: /* s = xxx0 1234 5678 9abc dexx */
874: .align 4
875: .mm0s3c3:
876: lwz bufA, -3(src)
877: lwz bufB, 1(src)
878: addi src, src, 1
879: addi wordCount, wordCount, -1
880: mtctr wordCount
881: rlwimi bufC, bufA, 24, 0, 7
882: rlwimi bufC, bufB, 24, 8, 31
883: stw bufC, 0(dst)
884: slwi bufA, bufB, 24
885:
886: .mm0s3c3a:
887: lwz bufB, 4(src)
888: addi src, src, 4
889: rlwimi bufA, bufB, 24, 8, 31
890: stw bufA, 4(dst)
891: addi dst, dst, 4
892: slwi bufA, bufB, 24
893: bdnz .mm0s3c3a
894:
895: lwz bufB, 4(src)
896: lwz bufC, 4(dst)
897: rlwimi bufA, bufB, 24, 8, 31
898: rlwimi bufC, bufA, 0, 0, 23
899: stw bufC, 4(dst)
900: b bcopy_exit
901:
902: /* forward copy destination aligned at 1, source aligned at 0, byte count 0 */
903: /* d = x012 3456 789a bxxx */
904: /* s = 0123 4567 89ab xxxx */
905: .align 4
906: .mm1s0c0:
907: lwz bufA, 0(src)
908: lwz bufC, -1(dst)
909: addi wordCount, wordCount, -1
910: mtctr wordCount
911: rlwimi bufC, bufA, 24, 8, 31
912: stw bufC, -1(dst)
913: subi dst, dst, 1
914: slwi bufA, bufA, 24
915:
916: .mm1s0c0a:
917: lwz bufB, 4(src)
918: addi src, src, 4
919: rlwimi bufA, bufB, 24, 8, 31
920: stw bufA, 4(dst)
921: addi dst, dst, 4
922: slwi bufA, bufB, 24
923: bdnz .mm1s0c0a
924:
925: lwz bufC, 4(dst)
926: rlwimi bufC, bufA, 0, 0, 7
927: stw bufC, 4(dst)
928: b bcopy_exit
929:
930: /* forward copy destination aligned at 1, source aligned at 0, byte count 1 */
931: /* d = x012 3456 789a bcxx */
932: /* s = 0123 4567 89ab cxxx */
933: .align 4
934: .mm1s0c1:
935: lwz bufA, 0(src)
936: lwz bufC, -1(dst)
937: addi wordCount, wordCount, -1
938: mtctr wordCount
939: rlwimi bufC, bufA, 24, 8, 31
940: stw bufC, -1(dst)
941: subi dst, dst, 1
942: slwi bufA, bufA, 24
943:
944: .mm1s0c1a:
945: lwz bufB, 4(src)
946: addi src, src, 4
947: rlwimi bufA, bufB, 24, 8, 31
948: stw bufA, 4(dst)
949: addi dst, dst, 4
950: slwi bufA, bufB, 24
951: bdnz .mm1s0c1a
952:
953: lwz bufB, 4(src)
954: lwz bufC, 4(dst)
955: rlwimi bufA, bufB, 24, 8, 31
956: rlwimi bufC, bufA, 0, 0, 15
957: stw bufC, 4(dst)
958: b bcopy_exit
959:
960: /* forward copy destination aligned at 1, source aligned at 0, byte count 2 */
961: /* d = x012 3456 789a bcdx */
962: /* s = 0123 4567 89ab cdxx */
963: .align 4
964: .mm1s0c2:
965: lwz bufA, 0(src)
966: lwz bufC, -1(dst)
967: addi wordCount, wordCount, -1
968: mtctr wordCount
969: rlwimi bufC, bufA, 24, 8, 31
970: stw bufC, -1(dst)
971: subi dst, dst, 1
972: slwi bufA, bufA, 24
973:
974: .mm1s0c2a:
975: lwz bufB, 4(src)
976: addi src, src, 4
977: rlwimi bufA, bufB, 24, 8, 31
978: stw bufA, 4(dst)
979: addi dst, dst, 4
980: slwi bufA, bufB, 24
981: bdnz .mm1s0c2a
982:
983: lwz bufB, 4(src)
984: lwz bufC, 4(dst)
985: rlwimi bufA, bufB, 24, 8, 31
986: rlwimi bufC, bufA, 0, 0, 23
987: stw bufC, 4(dst)
988: b bcopy_exit
989:
990: /* forward copy destination aligned at 1, source aligned at 0, byte count 3 */
991: /* d = x012 3456 789a bcde xxxx */
992: /* s = 0123 4567 89ab cdex */
993: .align 4
994: .mm1s0c3:
995: lwz bufA, 0(src)
996: lwz bufC, -1(dst)
997: mtctr wordCount
998: rlwimi bufC, bufA, 24, 8, 31
999: stw bufC, -1(dst)
1000: subi dst, dst, 1
1001: slwi bufA, bufA, 24
1002:
1003: .mm1s0c3a:
1004: lwz bufB, 4(src)
1005: addi src, src, 4
1006: rlwimi bufA, bufB, 24, 8, 31
1007: stw bufA, 4(dst)
1008: addi dst, dst, 4
1009: slwi bufA, bufB, 24
1010: bdnz .mm1s0c3a
1011:
1012: b bcopy_exit
1013:
1014: /* forward copy destination aligned at 1, source aligned at 1, byte count 0 */
1015: /* d = x012 3456 789a bxxx */
1016: /* s = x012 3456 789a bxxx */
1017: .align 4
1018: .mm1s1c0:
1019: lwz bufA, -1(src)
1020: subi src, src, 1
1021: lwz bufC, -1(dst)
1022: addi wordCount, wordCount, -1
1023: mtctr wordCount
1024: rlwimi bufC, bufA, 0, 8, 31
1025: stw bufC, -1(dst)
1026: subi dst, dst, 1
1027:
1028: .mm1s1c0a:
1029: lwz bufA, 4(src)
1030: stw bufA, 4(dst)
1031: addi src, src, 4
1032: addi dst, dst, 4
1033: bdnz .mm1s1c0a
1034:
1035: lwz bufC, 4(dst)
1036: lwz bufA, 4(src)
1037: rlwimi bufC, bufA, 0, 0, 7
1038: stw bufC, 4(dst)
1039: b bcopy_exit
1040:
1041: /* forward copy destination aligned at 1, source aligned at 1, byte count 1 */
1042: /* d = x012 3456 789a bcxx */
1043: /* s = x012 3456 789a bcxx */
1044: .align 4
1045: .mm1s1c1:
1046: lwz bufA, -1(src)
1047: subi src, src, 1
1048: lwz bufC, -1(dst)
1049: addi wordCount, wordCount, -1
1050: mtctr wordCount
1051: rlwimi bufC, bufA, 0, 8, 31
1052: stw bufC, -1(dst)
1053: subi dst, dst, 1
1054:
1055: .mm1s1c1a:
1056: lwz bufA, 4(src)
1057: stw bufA, 4(dst)
1058: addi src, src, 4
1059: addi dst, dst, 4
1060: bdnz .mm1s1c1a
1061:
1062: lwz bufC, 4(dst)
1063: lwz bufA, 4(src)
1064: rlwimi bufC, bufA, 0, 0, 15
1065: stw bufC, 4(dst)
1066: b bcopy_exit
1067:
1068: /* forward copy destination aligned at 1, source aligned at 1, byte count 2 */
1069: /* d = x012 3456 789a bcdx */
1070: /* s = x012 3456 789a bcdx */
1071: .align 4
1072: .mm1s1c2:
1073: lwz bufA, -1(src)
1074: subi src, src, 1
1075: lwz bufC, -1(dst)
1076: addi wordCount, wordCount, -1
1077: mtctr wordCount
1078: rlwimi bufC, bufA, 0, 8, 31
1079: stw bufC, -1(dst)
1080: subi dst, dst, 1
1081:
1082: .mm1s1c2a:
1083: lwz bufA, 4(src)
1084: stw bufA, 4(dst)
1085: addi src, src, 4
1086: addi dst, dst, 4
1087: bdnz .mm1s1c2a
1088:
1089: lwz bufC, 4(dst)
1090: lwz bufA, 4(src)
1091: rlwimi bufC, bufA, 0, 0, 23
1092: stw bufC, 4(dst)
1093: b bcopy_exit
1094:
1095: /* forward copy destination aligned at 1, source aligned at 1, byte count 3 */
1096: /* d = x012 3456 789a bcde xxxx */
1097: /* s = x012 3456 789a bcde xxxx */
1098: .align 4
1099: .mm1s1c3:
1100: lwz bufA, -1(src)
1101: subi src, src, 1
1102: lwz bufC, -1(dst)
1103: mtctr wordCount
1104: rlwimi bufC, bufA, 0, 8, 31
1105: stw bufC, -1(dst)
1106: subi dst, dst, 1
1107:
1108: .mm1s1c3a:
1109: lwz bufA, 4(src)
1110: stw bufA, 4(dst)
1111: addi src, src, 4
1112: addi dst, dst, 4
1113: bdnz .mm1s1c3a
1114:
1115: b bcopy_exit
1116:
1117: /* forward copy destination aligned at 1, source aligned at 2, byte count 0 */
1118: /* d = x012 3456 789a bxxx */
1119: /* s = xx01 2345 6789 abxx */
1120: .align 4
1121: .mm1s2c0:
1122: lwz bufA, -2(src)
1123: lwz bufB, 2(src)
1124: addi src, src, 2
1125: lwz bufC, -1(dst)
1126: addi wordCount, wordCount, -1
1127: mtctr wordCount
1128: rlwimi bufC, bufA, 8, 8, 23
1129: rlwimi bufC, bufB, 8, 24, 31
1130: stw bufC, -1(dst)
1131: subi dst, dst, 1
1132: slwi bufA, bufB, 8
1133:
1134: .mm1s2c0a:
1135: lwz bufB, 4(src)
1136: addi src, src, 4
1137: rlwimi bufA, bufB, 8, 24, 31
1138: stw bufA, 4(dst)
1139: addi dst, dst, 4
1140: slwi bufA, bufB, 8
1141: bdnz .mm1s2c0a
1142:
1143: lwz bufC, 4(dst)
1144: rlwimi bufC, bufA, 0, 0, 7
1145: stw bufC, 4(dst)
1146: b bcopy_exit
1147:
1148: /* forward copy destination aligned at 1, source aligned at 2, byte count 1 */
1149: /* d = x012 3456 789a bcxx */
1150: /* s = xx01 2345 6789 abcx */
1151: .align 4
1152: .mm1s2c1:
1153: lwz bufA, -2(src)
1154: lwz bufB, 2(src)
1155: addi src, src, 2
1156: lwz bufC, -1(dst)
1157: addi wordCount, wordCount, -1
1158: mtctr wordCount
1159: rlwimi bufC, bufA, 8, 8, 23
1160: rlwimi bufC, bufB, 8, 24, 31
1161: stw bufC, -1(dst)
1162: subi dst, dst, 1
1163: slwi bufA, bufB, 8
1164:
1165: .mm1s2c1a:
1166: lwz bufB, 4(src)
1167: addi src, src, 4
1168: rlwimi bufA, bufB, 8, 24, 31
1169: stw bufA, 4(dst)
1170: addi dst, dst, 4
1171: slwi bufA, bufB, 8
1172: bdnz .mm1s2c1a
1173:
1174: lwz bufC, 4(dst)
1175: rlwimi bufC, bufA, 0, 0, 15
1176: stw bufC, 4(dst)
1177: b bcopy_exit
1178:
1179: /* forward copy destination aligned at 1, source aligned at 2, byte count 2 */
1180: /* d = x012 3456 789a bcdx */
1181: /* s = xx01 2345 6789 abcd xxxx */
1182: .align 4
1183: .mm1s2c2:
1184: lwz bufA, -2(src)
1185: lwz bufB, 2(src)
1186: addi src, src, 2
1187: lwz bufC, -1(dst)
1188: addi wordCount, wordCount, -1
1189: mtctr wordCount
1190: rlwimi bufC, bufA, 8, 8, 23
1191: rlwimi bufC, bufB, 8, 24, 31
1192: stw bufC, -1(dst)
1193: subi dst, dst, 1
1194: slwi bufA, bufB, 8
1195:
1196: .mm1s2c2a:
1197: lwz bufB, 4(src)
1198: addi src, src, 4
1199: rlwimi bufA, bufB, 8, 24, 31
1200: stw bufA, 4(dst)
1201: addi dst, dst, 4
1202: slwi bufA, bufB, 8
1203: bdnz .mm1s2c2a
1204:
1205: lwz bufC, 4(dst)
1206: rlwimi bufC, bufA, 0, 0, 23
1207: stw bufC, 4(dst)
1208: b bcopy_exit
1209:
1210: /* forward copy destination aligned at 1, source aligned at 2, byte count 3 */
1211: /* d = x012 3456 789a bcde xxxx */
1212: /* s = xx01 2345 6789 abcd exxx */
1213: .align 4
1214: .mm1s2c3:
1215: lwz bufA, -2(src)
1216: lwz bufB, 2(src)
1217: addi src, src, 2
1218: lwz bufC, -1(dst)
1219: mtctr wordCount
1220: rlwimi bufC, bufA, 8, 8, 23
1221: rlwimi bufC, bufB, 8, 24, 31
1222: stw bufC, -1(dst)
1223: subi dst, dst, 1
1224: slwi bufA, bufB, 8
1225:
1226: .mm1s2c3a:
1227: lwz bufB, 4(src)
1228: addi src, src, 4
1229: rlwimi bufA, bufB, 8, 24, 31
1230: stw bufA, 4(dst)
1231: addi dst, dst, 4
1232: slwi bufA, bufB, 8
1233: bdnz .mm1s2c3a
1234:
1235: b bcopy_exit
1236:
1237: /* forward copy destination aligned at 1, source aligned at 3, byte count 0 */
1238: /* d = x012 3456 789a bxxx */
1239: /* s = xxx0 1234 5678 9abx */
1240: .align 4
1241: .mm1s3c0:
1242: lwz bufA, -3(src)
1243: lwz bufB, 1(src)
1244: addi src, src, 1
1245: lwz bufC, -1(dst)
1246: addi wordCount, wordCount, -1
1247: mtctr wordCount
1248: rlwimi bufC, bufA, 16, 8, 15
1249: rlwimi bufC, bufB, 16, 16, 31
1250: stw bufC, -1(dst)
1251: subi dst, dst, 1
1252: slwi bufA, bufB, 16
1253:
1254: .mm1s3c0a:
1255: lwz bufB, 4(src)
1256: addi src, src, 4
1257: rlwimi bufA, bufB, 16, 16, 31
1258: stw bufA, 4(dst)
1259: addi dst, dst, 4
1260: slwi bufA, bufB, 16
1261: bdnz .mm1s3c0a
1262:
1263: lwz bufC, 4(dst)
1264: rlwimi bufC, bufA, 0, 0, 7
1265: stw bufC, 4(dst)
1266: b bcopy_exit
1267:
1268: /* forward copy destination aligned at 1, source aligned at 3, byte count 1 */
1269: /* d = x012 3456 789a bcxx */
1270: /* s = xxx0 1234 5678 9abc xxxx */
1271: .align 4
1272: .mm1s3c1:
1273: lwz bufA, -3(src)
1274: lwz bufB, 1(src)
1275: addi src, src, 1
1276: lwz bufC, -1(dst)
1277: addi wordCount, wordCount, -1
1278: mtctr wordCount
1279: rlwimi bufC, bufA, 16, 8, 15
1280: rlwimi bufC, bufB, 16, 16, 31
1281: stw bufC, -1(dst)
1282: subi dst, dst, 1
1283: slwi bufA, bufB, 16
1284:
1285: .mm1s3c1a:
1286: lwz bufB, 4(src)
1287: addi src, src, 4
1288: rlwimi bufA, bufB, 16, 16, 31
1289: stw bufA, 4(dst)
1290: addi dst, dst, 4
1291: slwi bufA, bufB, 16
1292: bdnz .mm1s3c1a
1293:
1294: lwz bufC, 4(dst)
1295: rlwimi bufC, bufA, 0, 0, 15
1296: stw bufC, 4(dst)
1297: b bcopy_exit
1298:
1299: /* forward copy destination aligned at 1, source aligned at 3, byte count 2 */
1300: /* d = x012 3456 789a bcdx */
1301: /* s = xxx0 1234 5678 9abc dxxx */
1302: .align 4
1303: .mm1s3c2:
1304: lwz bufA, -3(src)
1305: lwz bufB, 1(src)
1306: addi src, src, 1
1307: lwz bufC, -1(dst)
1308: addi wordCount, wordCount, -1
1309: mtctr wordCount
1310: rlwimi bufC, bufA, 16, 8, 15
1311: rlwimi bufC, bufB, 16, 16, 31
1312: stw bufC, -1(dst)
1313: subi dst, dst, 1
1314: slwi bufA, bufB, 16
1315:
1316: .mm1s3c2a:
1317: lwz bufB, 4(src)
1318: addi src, src, 4
1319: rlwimi bufA, bufB, 16, 16, 31
1320: stw bufA, 4(dst)
1321: addi dst, dst, 4
1322: slwi bufA, bufB, 16
1323: bdnz .mm1s3c2a
1324:
1325: lwz bufB, 4(src)
1326: lwz bufC, 4(dst)
1327: rlwimi bufA, bufB, 16, 16, 31
1328: rlwimi bufC, bufA, 0, 0, 23
1329: stw bufC, 4(dst)
1330: b bcopy_exit
1331:
1332: /* forward copy destination aligned at 1, source aligned at 3, byte count 3 */
1333: /* d = x012 3456 789a bcde xxxx */
1334: /* s = xxx0 1234 5678 9abc dexx */
1335: .align 4
1336: .mm1s3c3:
1337: lwz bufA, -3(src)
1338: lwz bufB, 1(src)
1339: addi src, src, 1
1340: lwz bufC, -1(dst)
1341: mtctr wordCount
1342: rlwimi bufC, bufA, 16, 8, 15
1343: rlwimi bufC, bufB, 16, 16, 31
1344: stw bufC, -1(dst)
1345: subi dst, dst, 1
1346: slwi bufA, bufB, 16
1347:
1348: .mm1s3c3a:
1349: lwz bufB, 4(src)
1350: addi src, src, 4
1351: rlwimi bufA, bufB, 16, 16, 31
1352: stw bufA, 4(dst)
1353: addi dst, dst, 4
1354: slwi bufA, bufB, 16
1355: bdnz .mm1s3c3a
1356:
1357: b bcopy_exit
1358:
1359: /* forward copy destination aligned at 2, source aligned at 0, byte count 0 */
1360: /* d = xx01 2345 6789 abxx */
1361: /* s = 0123 4567 89ab xxxx */
1362: .align 4
1363: .mm2s0c0:
1364: lwz bufA, 0(src)
1365: lwz bufC, -2(dst)
1366: addi wordCount, wordCount, -1
1367: mtctr wordCount
1368: rlwimi bufC, bufA, 16, 16, 31
1369: stw bufC, -2(dst)
1370: subi dst, dst, 2
1371: slwi bufA, bufA, 16
1372:
1373: .mm2s0c0a:
1374: lwz bufB, 4(src)
1375: addi src, src, 4
1376: rlwimi bufA, bufB, 16, 16, 31
1377: stw bufA, 4(dst)
1378: addi dst, dst, 4
1379: slwi bufA, bufB, 16
1380: bdnz .mm2s0c0a
1381:
1382: lwz bufC, 4(dst)
1383: rlwimi bufC, bufA, 0, 0, 15
1384: stw bufC, 4(dst)
1385: b bcopy_exit
1386:
1387: /* forward copy destination aligned at 2, source aligned at 0, byte count 1 */
1388: /* d = xx01 2345 6789 abcx */
1389: /* s = 0123 4567 89ab cxxx */
1390: .align 4
1391: .mm2s0c1:
1392: lwz bufA, 0(src)
1393: lwz bufC, -2(dst)
1394: addi wordCount, wordCount, -1
1395: mtctr wordCount
1396: rlwimi bufC, bufA, 16, 16, 31
1397: stw bufC, -2(dst)
1398: subi dst, dst, 2
1399: slwi bufA, bufA, 16
1400:
1401: .mm2s0c1a:
1402: lwz bufB, 4(src)
1403: addi src, src, 4
1404: rlwimi bufA, bufB, 16, 16, 31
1405: stw bufA, 4(dst)
1406: addi dst, dst, 4
1407: slwi bufA, bufB, 16
1408: bdnz .mm2s0c1a
1409:
1410: lwz bufB, 4(src)
1411: lwz bufC, 4(dst)
1412: rlwimi bufA, bufB, 16, 16, 31
1413: rlwimi bufC, bufA, 0, 0, 23
1414: stw bufC, 4(dst)
1415: b bcopy_exit
1416:
1417: /* forward copy destination aligned at 2, source aligned at 0, byte count 2 */
1418: /* d = xx01 2345 6789 abcd xxxx */
1419: /* s = 0123 4567 89ab cdxx */
1420: .align 4
1421: .mm2s0c2:
1422: lwz bufA, 0(src)
1423: lwz bufC, -2(dst)
1424: mtctr wordCount
1425: rlwimi bufC, bufA, 16, 16, 31
1426: stw bufC, -2(dst)
1427: subi dst, dst, 2
1428: slwi bufA, bufA, 16
1429:
1430: .mm2s0c2a:
1431: lwz bufB, 4(src)
1432: addi src, src, 4
1433: rlwimi bufA, bufB, 16, 16, 31
1434: stw bufA, 4(dst)
1435: addi dst, dst, 4
1436: slwi bufA, bufB, 16
1437: bdnz .mm2s0c2a
1438:
1439: b bcopy_exit
1440:
1441: /* forward copy destination aligned at 2, source aligned at 0, byte count 3 */
1442: /* d = xx01 2345 6789 abcd exxx */
1443: /* s = 0123 4567 89ab cdex */
1444: .align 4
1445: .mm2s0c3:
1446: lwz bufA, 0(src)
1447: lwz bufC, -2(dst)
1448: mtctr wordCount
1449: rlwimi bufC, bufA, 16, 16, 31
1450: stw bufC, -2(dst)
1451: subi dst, dst, 2
1452: slwi bufA, bufA, 16
1453:
1454: .mm2s0c3a:
1455: lwz bufB, 4(src)
1456: addi src, src, 4
1457: rlwimi bufA, bufB, 16, 16, 31
1458: stw bufA, 4(dst)
1459: addi dst, dst, 4
1460: slwi bufA, bufB, 16
1461: bdnz .mm2s0c3a
1462:
1463: lwz bufC, 4(dst)
1464: rlwimi bufC, bufA, 0, 0, 7
1465: stw bufC, 4(dst)
1466: b bcopy_exit
1467:
1468: /* forward copy destination aligned at 2, source aligned at 1, byte count 0 */
1469: /* d = xx01 2345 6789 abxx */
1470: /* s = x012 3456 789a bxxx */
1471: .align 4
1472: .mm2s1c0:
1473: lwz bufA, -1(src)
1474: subi src, src, 1
1475: lwz bufC, -2(dst)
1476: addi wordCount, wordCount, -1
1477: mtctr wordCount
1478: rlwimi bufC, bufA, 24, 16, 31
1479: stw bufC, -2(dst)
1480: subi dst, dst, 2
1481: slwi bufA, bufA, 24
1482:
1483: .mm2s1c0a:
1484: lwz bufB, 4(src)
1485: addi src, src, 4
1486: rlwimi bufA, bufB, 24, 8, 31
1487: stw bufA, 4(dst)
1488: addi dst, dst, 4
1489: slwi bufA, bufB, 24
1490: bdnz .mm2s1c0a
1491:
1492: lwz bufB, 4(src)
1493: lwz bufC, 4(dst)
1494: rlwimi bufA, bufB, 24, 8, 31
1495: rlwimi bufC, bufA, 0, 0, 15
1496: stw bufC, 4(dst)
1497: b bcopy_exit
1498:
1499: /* forward copy destination aligned at 2, source aligned at 1, byte count 1 */
1500: /* d = xx01 2345 6789 abcx */
1501: /* s = x012 3456 789a bcxx */
1502: .align 4
1503: .mm2s1c1:
1504: lwz bufA, -1(src)
1505: subi src, src, 1
1506: lwz bufC, -2(dst)
1507: addi wordCount, wordCount, -1
1508: mtctr wordCount
1509: rlwimi bufC, bufA, 24, 16, 31
1510: stw bufC, -2(dst)
1511: subi dst, dst, 2
1512: slwi bufA, bufA, 24
1513:
1514: .mm2s1c1a:
1515: lwz bufB, 4(src)
1516: addi src, src, 4
1517: rlwimi bufA, bufB, 24, 8, 31
1518: stw bufA, 4(dst)
1519: addi dst, dst, 4
1520: slwi bufA, bufB, 24
1521: bdnz .mm2s1c1a
1522:
1523: lwz bufB, 4(src)
1524: lwz bufC, 4(dst)
1525: rlwimi bufA, bufB, 24, 8, 31
1526: rlwimi bufC, bufA, 0, 0, 23
1527: stw bufC, 4(dst)
1528: b bcopy_exit
1529:
1530: /* forward copy destination aligned at 2, source aligned at 1, byte count 2 */
1531: /* d = xx01 2345 6789 abcd xxxx */
1532: /* s = x012 3456 789a bcdx */
1533: .align 4
1534: .mm2s1c2:
1535: lwz bufA, -1(src)
1536: subi src, src, 1
1537: lwz bufC, -2(dst)
1538: mtctr wordCount
1539: rlwimi bufC, bufA, 24, 16, 31
1540: stw bufC, -2(dst)
1541: subi dst, dst, 2
1542: slwi bufA, bufA, 24
1543:
1544: .mm2s1c2a:
1545: lwz bufB, 4(src)
1546: addi src, src, 4
1547: rlwimi bufA, bufB, 24, 8, 31
1548: stw bufA, 4(dst)
1549: addi dst, dst, 4
1550: slwi bufA, bufB, 24
1551: bdnz .mm2s1c2a
1552:
1553: b bcopy_exit
1554:
1555: /* forward copy destination aligned at 2, source aligned at 1, byte count 3 */
1556: /* d = xx01 2345 6789 abcd exxx */
1557: /* s = x012 3456 789a bcde xxxx */
1558: .align 4
1559: .mm2s1c3:
1560: lwz bufA, -1(src)
1561: subi src, src, 1
1562: lwz bufC, -2(dst)
1563: mtctr wordCount
1564: rlwimi bufC, bufA, 24, 16, 31
1565: stw bufC, -2(dst)
1566: subi dst, dst, 2
1567: slwi bufA, bufA, 24
1568:
1569: .mm2s1c3a:
1570: lwz bufB, 4(src)
1571: addi src, src, 4
1572: rlwimi bufA, bufB, 24, 8, 31
1573: stw bufA, 4(dst)
1574: addi dst, dst, 4
1575: slwi bufA, bufB, 24
1576: bdnz .mm2s1c3a
1577:
1578: lwz bufC, 4(dst)
1579: rlwimi bufC, bufA, 0, 0, 7
1580: stw bufC, 4(dst)
1581: b bcopy_exit
1582:
1583: /* forward copy destination aligned at 2, source aligned at 2, byte count 0 */
1584: /* d = xx01 2345 6789 abxx */
1585: /* s = xx01 2345 6789 abxx */
1586: .align 4
1587: .mm2s2c0:
1588: lwz bufA, -2(src)
1589: subi src, src, 2
1590: lwz bufC, -2(dst)
1591: addi wordCount, wordCount, -1
1592: mtctr wordCount
1593: rlwimi bufC, bufA, 0, 16, 31
1594: stw bufC, -2(dst)
1595: subi dst, dst, 2
1596:
1597: .mm2s2c0a:
1598: lwz bufA, 4(src)
1599: stw bufA, 4(dst)
1600: addi src, src, 4
1601: addi dst, dst, 4
1602: bdnz .mm2s2c0a
1603:
1604: lwz bufC, 4(dst)
1605: lwz bufA, 4(src)
1606: rlwimi bufC, bufA, 0, 0, 15
1607: stw bufC, 4(dst)
1608: b bcopy_exit
1609:
1610: /* forward copy destination aligned at 2, source aligned at 2, byte count 1 */
1611: /* d = xx01 2345 6789 abcx */
1612: /* s = xx01 2345 6789 abcx */
1613: .align 4
1614: .mm2s2c1:
1615: lwz bufA, -2(src)
1616: subi src, src, 2
1617: lwz bufC, -2(dst)
1618: addi wordCount, wordCount, -1
1619: mtctr wordCount
1620: rlwimi bufC, bufA, 0, 16, 31
1621: stw bufC, -2(dst)
1622: subi dst, dst, 2
1623:
1624: .mm2s2c1a:
1625: lwz bufA, 4(src)
1626: stw bufA, 4(dst)
1627: addi src, src, 4
1628: addi dst, dst, 4
1629: bdnz .mm2s2c1a
1630:
1631: lwz bufC, 4(dst)
1632: lwz bufA, 4(src)
1633: rlwimi bufC, bufA, 0, 0, 23
1634: stw bufC, 4(dst)
1635: b bcopy_exit
1636:
1637: /* forward copy destination aligned at 2, source aligned at 2, byte count 2 */
1638: /* d = xx01 2345 6789 abcd xxxx */
1639: /* s = xx01 2345 6789 abcd xxxx */
1640: .align 4
1641: .mm2s2c2:
1642: lwz bufA, -2(src)
1643: subi src, src, 2
1644: lwz bufC, -2(dst)
1645: mtctr wordCount
1646: rlwimi bufC, bufA, 0, 16, 31
1647: stw bufC, -2(dst)
1648: subi dst, dst, 2
1649:
1650: .mm2s2c2a:
1651: lwz bufA, 4(src)
1652: stw bufA, 4(dst)
1653: addi src, src, 4
1654: addi dst, dst, 4
1655: bdnz .mm2s2c2a
1656:
1657: b bcopy_exit
1658:
1659: /* forward copy destination aligned at 2, source aligned at 2, byte count 3 */
1660: /* d = xx01 2345 6789 abcd exxx */
1661: /* s = xx01 2345 6789 abcd exxx */
1662: .align 4
1663: .mm2s2c3:
1664: lwz bufA, -2(src)
1665: subi src, src, 2
1666: lwz bufC, -2(dst)
1667: mtctr wordCount
1668: rlwimi bufC, bufA, 0, 16, 31
1669: stw bufC, -2(dst)
1670: subi dst, dst, 2
1671:
1672: .mm2s2c3a:
1673: lwz bufA, 4(src)
1674: stw bufA, 4(dst)
1675: addi src, src, 4
1676: addi dst, dst, 4
1677: bdnz .mm2s2c3a
1678:
1679: lwz bufC, 4(dst)
1680: lwz bufA, 4(src)
1681: rlwimi bufC, bufA, 0, 0, 7
1682: stw bufC, 4(dst)
1683: b bcopy_exit
1684:
1685: /* forward copy destination aligned at 2, source aligned at 3, byte count 0 */
1686: /* d = xx01 2345 6789 abxx */
1687: /* s = xxx0 1234 5678 9abx */
1688: .align 4
1689: .mm2s3c0:
1690: lwz bufA, -3(src)
1691: lwz bufB, 1(src)
1692: addi src, src, 1
1693: lwz bufC, -2(dst)
1694: addi wordCount, wordCount, -1
1695: mtctr wordCount
1696: rlwimi bufC, bufA, 8, 16, 23
1697: rlwimi bufC, bufB, 8, 24, 31
1698: stw bufC, -2(dst)
1699: subi dst, dst, 2
1700: slwi bufA, bufB, 8
1701:
1702: .mm2s3c0a:
1703: lwz bufB, 4(src)
1704: addi src, src, 4
1705: rlwimi bufA, bufB, 8, 24, 31
1706: stw bufA, 4(dst)
1707: addi dst, dst, 4
1708: slwi bufA, bufB, 8
1709: bdnz .mm2s3c0a
1710:
1711: lwz bufC, 4(dst)
1712: rlwimi bufC, bufA, 0, 0, 15
1713: stw bufC, 4(dst)
1714: b bcopy_exit
1715:
1716: /* forward copy destination aligned at 2, source aligned at 3, byte count 1 */
1717: /* d = xx01 2345 6789 abcx */
1718: /* s = xxx0 1234 5678 9abc xxxx */
1719: .align 4
1720: .mm2s3c1:
1721: lwz bufA, -3(src)
1722: lwz bufB, 1(src)
1723: addi src, src, 1
1724: lwz bufC, -2(dst)
1725: addi wordCount, wordCount, -1
1726: mtctr wordCount
1727: rlwimi bufC, bufA, 8, 16, 23
1728: rlwimi bufC, bufB, 8, 24, 31
1729: stw bufC, -2(dst)
1730: subi dst, dst, 2
1731: slwi bufA, bufB, 8
1732:
1733: .mm2s3c1a:
1734: lwz bufB, 4(src)
1735: addi src, src, 4
1736: rlwimi bufA, bufB, 8, 24, 31
1737: stw bufA, 4(dst)
1738: addi dst, dst, 4
1739: slwi bufA, bufB, 8
1740: bdnz .mm2s3c1a
1741:
1742: lwz bufC, 4(dst)
1743: rlwimi bufC, bufA, 0, 0, 23
1744: stw bufC, 4(dst)
1745: b bcopy_exit
1746:
1747: /* forward copy destination aligned at 2, source aligned at 3, byte count 2 */
1748: /* d = xx01 2345 6789 abcd xxxx */
1749: /* s = xxx0 1234 5678 9abc dxxx */
1750: .align 4
1751: .mm2s3c2:
1752: lwz bufA, -3(src)
1753: lwz bufB, 1(src)
1754: addi src, src, 1
1755: lwz bufC, -2(dst)
1756: mtctr wordCount
1757: rlwimi bufC, bufA, 8, 16, 23
1758: rlwimi bufC, bufB, 8, 24, 31
1759: stw bufC, -2(dst)
1760: subi dst, dst, 2
1761: slwi bufA, bufB, 8
1762:
1763: .mm2s3c2a:
1764: lwz bufB, 4(src)
1765: addi src, src, 4
1766: rlwimi bufA, bufB, 8, 24, 31
1767: stw bufA, 4(dst)
1768: addi dst, dst, 4
1769: slwi bufA, bufB, 8
1770: bdnz .mm2s3c2a
1771:
1772: b bcopy_exit
1773:
1774: /* forward copy destination aligned at 2, source aligned at 3, byte count 3 */
1775: /* d = xx01 2345 6789 abcd exxx */
1776: /* s = xxx0 1234 5678 9abc dexx */
1777: .align 4
1778: .mm2s3c3:
1779: lwz bufA, -3(src)
1780: lwz bufB, 1(src)
1781: addi src, src, 1
1782: lwz bufC, -2(dst)
1783: mtctr wordCount
1784: rlwimi bufC, bufA, 8, 16, 23
1785: rlwimi bufC, bufB, 8, 24, 31
1786: stw bufC, -2(dst)
1787: subi dst, dst, 2
1788: slwi bufA, bufB, 8
1789:
1790: .mm2s3c3a:
1791: lwz bufB, 4(src)
1792: addi src, src, 4
1793: rlwimi bufA, bufB, 8, 24, 31
1794: stw bufA, 4(dst)
1795: addi dst, dst, 4
1796: slwi bufA, bufB, 8
1797: bdnz .mm2s3c3a
1798:
1799: lwz bufC, 4(dst)
1800: rlwimi bufC, bufA, 0, 0, 7
1801: stw bufC, 4(dst)
1802: b bcopy_exit
1803:
1804: /* forward copy destination aligned at 3, source aligned at 0, byte count 0 */
1805: /* d = xxx0 1234 5678 9abx */
1806: /* s = 0123 4567 89ab xxxx */
1807: .align 4
1808: .mm3s0c0:
1809: lwz bufA, 0(src)
1810: lwz bufC, -3(dst)
1811: addi wordCount, wordCount, -1
1812: mtctr wordCount
1813: rlwimi bufC, bufA, 8, 24, 31
1814: stw bufC, -3(dst)
1815: subi dst, dst, 3
1816: slwi bufA, bufA, 8
1817:
1818: .mm3s0c0a:
1819: lwz bufB, 4(src)
1820: addi src, src, 4
1821: rlwimi bufA, bufB, 8, 24, 31
1822: stw bufA, 4(dst)
1823: addi dst, dst, 4
1824: slwi bufA, bufB, 8
1825: bdnz .mm3s0c0a
1826:
1827: lwz bufC, 4(dst)
1828: rlwimi bufC, bufA, 0, 0, 23
1829: stw bufC, 4(dst)
1830: b bcopy_exit
1831:
1832: /* forward copy destination aligned at 3, source aligned at 0, byte count 1 */
1833: /* d = xxx0 1234 5678 9abc xxxx */
1834: /* s = 0123 4567 89ab cxxx */
1835: .align 4
1836: .mm3s0c1:
1837: lwz bufA, 0(src)
1838: lwz bufC, -3(dst)
1839: mtctr wordCount
1840: rlwimi bufC, bufA, 8, 24, 31
1841: stw bufC, -3(dst)
1842: subi dst, dst, 3
1843: slwi bufA, bufA, 8
1844:
1845: .mm3s0c1a:
1846: lwz bufB, 4(src)
1847: addi src, src, 4
1848: rlwimi bufA, bufB, 8, 24, 31
1849: stw bufA, 4(dst)
1850: addi dst, dst, 4
1851: slwi bufA, bufB, 8
1852: bdnz .mm3s0c1a
1853:
1854: b bcopy_exit
1855:
1856: /* forward copy destination aligned at 3, source aligned at 0, byte count 2 */
1857: /* d = xxx0 1234 5678 9abc dxxx */
1858: /* s = 0123 4567 89ab cdxx */
1859: .align 4
1860: .mm3s0c2:
1861: lwz bufA, 0(src)
1862: lwz bufC, -3(dst)
1863: mtctr wordCount
1864: rlwimi bufC, bufA, 8, 24, 31
1865: stw bufC, -3(dst)
1866: subi dst, dst, 3
1867: slwi bufA, bufA, 8
1868:
1869: .mm3s0c2a:
1870: lwz bufB, 4(src)
1871: addi src, src, 4
1872: rlwimi bufA, bufB, 8, 24, 31
1873: stw bufA, 4(dst)
1874: addi dst, dst, 4
1875: slwi bufA, bufB, 8
1876: bdnz .mm3s0c2a
1877:
1878: lwz bufC, 4(dst)
1879: rlwimi bufC, bufA, 0, 0, 7
1880: stw bufC, 4(dst)
1881: b bcopy_exit
1882:
1883: /* forward copy destination aligned at 3, source aligned at 0, byte count 3 */
1884: /* d = xxx0 1234 5678 9abc dexx */
1885: /* s = 0123 4567 89ab cdex */
1886: .align 4
1887: .mm3s0c3:
1888: lwz bufA, 0(src)
1889: lwz bufC, -3(dst)
1890: mtctr wordCount
1891: rlwimi bufC, bufA, 8, 24, 31
1892: stw bufC, -3(dst)
1893: subi dst, dst, 3
1894: slwi bufA, bufA, 8
1895:
1896: .mm3s0c3a:
1897: lwz bufB, 4(src)
1898: addi src, src, 4
1899: rlwimi bufA, bufB, 8, 24, 31
1900: stw bufA, 4(dst)
1901: addi dst, dst, 4
1902: slwi bufA, bufB, 8
1903: bdnz .mm3s0c3a
1904:
1905: lwz bufC, 4(dst)
1906: rlwimi bufC, bufA, 0, 0, 15
1907: stw bufC, 4(dst)
1908: b bcopy_exit
1909:
1910: /* forward copy destination aligned at 3, source aligned at 1, byte count 0 */
1911: /* d = xxx0 1234 5678 9abx */
1912: /* s = x012 3456 789a bxxx */
1913: .align 4
1914: .mm3s1c0:
1915: lwz bufA, -1(src)
1916: subi src, src, 1
1917: lwz bufC, -3(dst)
1918: addi wordCount, wordCount, -1
1919: mtctr wordCount
1920: rlwimi bufC, bufA, 16, 24, 31
1921: stw bufC, -3(dst)
1922: subi dst, dst, 3
1923: slwi bufA, bufA, 16
1924:
1925: .mm3s1c0a:
1926: lwz bufB, 4(src)
1927: addi src, src, 4
1928: rlwimi bufA, bufB, 16, 16, 31
1929: stw bufA, 4(dst)
1930: addi dst, dst, 4
1931: slwi bufA, bufB, 16
1932: bdnz .mm3s1c0a
1933:
1934: lwz bufB, 4(src)
1935: lwz bufC, 4(dst)
1936: rlwimi bufA, bufB, 16, 16, 31
1937: rlwimi bufC, bufA, 0, 0, 23
1938: stw bufC, 4(dst)
1939: b bcopy_exit
1940:
1941: /* forward copy destination aligned at 3, source aligned at 1, byte count 1 */
1942: /* d = xxx0 1234 5678 9abc xxxx */
1943: /* s = x012 3456 789a bcxx */
1944: .align 4
1945: .mm3s1c1:
1946: lwz bufA, -1(src)
1947: subi src, src, 1
1948: lwz bufC, -3(dst)
1949: mtctr wordCount
1950: rlwimi bufC, bufA, 16, 24, 31
1951: stw bufC, -3(dst)
1952: subi dst, dst, 3
1953: slwi bufA, bufA, 16
1954:
1955: .mm3s1c1a:
1956: lwz bufB, 4(src)
1957: addi src, src, 4
1958: rlwimi bufA, bufB, 16, 16, 31
1959: stw bufA, 4(dst)
1960: addi dst, dst, 4
1961: slwi bufA, bufB, 16
1962: bdnz .mm3s1c1a
1963:
1964: b bcopy_exit
1965:
1966: /* forward copy destination aligned at 3, source aligned at 1, byte count 2 */
1967: /* d = xxx0 1234 5678 9abc dxxx */
1968: /* s = x012 3456 789a bcdx */
1969: .align 4
1970: .mm3s1c2:
1971: lwz bufA, -1(src)
1972: subi src, src, 1
1973: lwz bufC, -3(dst)
1974: mtctr wordCount
1975: rlwimi bufC, bufA, 16, 24, 31
1976: stw bufC, -3(dst)
1977: subi dst, dst, 3
1978: slwi bufA, bufA, 16
1979:
1980: .mm3s1c2a:
1981: lwz bufB, 4(src)
1982: addi src, src, 4
1983: rlwimi bufA, bufB, 16, 16, 31
1984: stw bufA, 4(dst)
1985: addi dst, dst, 4
1986: slwi bufA, bufB, 16
1987: bdnz .mm3s1c2a
1988:
1989: lwz bufC, 4(dst)
1990: rlwimi bufC, bufA, 0, 0, 7
1991: stw bufC, 4(dst)
1992: b bcopy_exit
1993:
1994: /* forward copy destination aligned at 3, source aligned at 1, byte count 3 */
1995: /* d = xxx0 1234 5678 9abc dexx */
1996: /* s = x012 3456 789a bcde xxxx */
1997: .align 4
1998: .mm3s1c3:
1999: lwz bufA, -1(src)
2000: subi src, src, 1
2001: lwz bufC, -3(dst)
2002: mtctr wordCount
2003: rlwimi bufC, bufA, 16, 24, 31
2004: stw bufC, -3(dst)
2005: subi dst, dst, 3
2006: slwi bufA, bufA, 16
2007:
2008: .mm3s1c3a:
2009: lwz bufB, 4(src)
2010: addi src, src, 4
2011: rlwimi bufA, bufB, 16, 16, 31
2012: stw bufA, 4(dst)
2013: addi dst, dst, 4
2014: slwi bufA, bufB, 16
2015: bdnz .mm3s1c3a
2016:
2017: lwz bufC, 4(dst)
2018: rlwimi bufC, bufA, 0, 0, 15
2019: stw bufC, 4(dst)
2020: b bcopy_exit
2021:
2022: /* forward copy destination aligned at 3, source aligned at 2, byte count 0 */
2023: /* d = xxx0 1234 5678 9abx */
2024: /* s = xx01 2345 6789 abxx */
2025: .align 4
2026: .mm3s2c0:
2027: lwz bufA, -2(src)
2028: subi src, src, 2
2029: lwz bufC, -3(dst)
2030: addi wordCount, wordCount, -1
2031: mtctr wordCount
2032: rlwimi bufC, bufA, 24, 24, 31
2033: stw bufC, -3(dst)
2034: subi dst, dst, 3
2035: slwi bufA, bufA, 24
2036:
2037: .mm3s2c0a:
2038: lwz bufB, 4(src)
2039: addi src, src, 4
2040: rlwimi bufA, bufB, 24, 8, 31
2041: stw bufA, 4(dst)
2042: addi dst, dst, 4
2043: slwi bufA, bufB, 24
2044: bdnz .mm3s2c0a
2045:
2046: lwz bufB, 4(src)
2047: lwz bufC, 4(dst)
2048: rlwimi bufA, bufB, 24, 8, 31
2049: rlwimi bufC, bufA, 0, 0, 23
2050: stw bufC, 4(dst)
2051: b bcopy_exit
2052:
2053: /* forward copy destination aligned at 3, source aligned at 2, byte count 1 */
2054: /* d = xxx0 1234 5678 9abc xxxx */
2055: /* s = xx01 2345 6789 abcx */
2056: .align 4
2057: .mm3s2c1:
2058: lwz bufA, -2(src)
2059: subi src, src, 2
2060: lwz bufC, -3(dst)
2061: mtctr wordCount
2062: rlwimi bufC, bufA, 24, 24, 31
2063: stw bufC, -3(dst)
2064: subi dst, dst, 3
2065: slwi bufA, bufA, 24
2066:
2067: .mm3s2c1a:
2068: lwz bufB, 4(src)
2069: addi src, src, 4
2070: rlwimi bufA, bufB, 24, 8, 31
2071: stw bufA, 4(dst)
2072: addi dst, dst, 4
2073: slwi bufA, bufB, 24
2074: bdnz .mm3s2c1a
2075:
2076: b bcopy_exit
2077:
2078: /* forward copy destination aligned at 3, source aligned at 2, byte count 2 */
2079: /* d = xxx0 1234 5678 9abc dxxx */
2080: /* s = xx01 2345 6789 abcd xxxx */
2081: .align 4
2082: .mm3s2c2:
2083: lwz bufA, -2(src)
2084: subi src, src, 2
2085: lwz bufC, -3(dst)
2086: mtctr wordCount
2087: rlwimi bufC, bufA, 24, 24, 31
2088: stw bufC, -3(dst)
2089: subi dst, dst, 3
2090: slwi bufA, bufA, 24
2091:
2092: .mm3s2c2a:
2093: lwz bufB, 4(src)
2094: addi src, src, 4
2095: rlwimi bufA, bufB, 24, 8, 31
2096: stw bufA, 4(dst)
2097: addi dst, dst, 4
2098: slwi bufA, bufB, 24
2099: bdnz .mm3s2c2a
2100:
2101: lwz bufC, 4(dst)
2102: rlwimi bufC, bufA, 0, 0, 7
2103: stw bufC, 4(dst)
2104: b bcopy_exit
2105:
2106: /* forward copy destination aligned at 3, source aligned at 2, byte count 3 */
2107: /* d = xxx0 1234 5678 9abc dexx */
2108: /* s = xx01 2345 6789 abcd exxx */
2109: .align 4
2110: .mm3s2c3:
2111: lwz bufA, -2(src)
2112: subi src, src, 2
2113: lwz bufC, -3(dst)
2114: mtctr wordCount
2115: rlwimi bufC, bufA, 24, 24, 31
2116: stw bufC, -3(dst)
2117: subi dst, dst, 3
2118: slwi bufA, bufA, 24
2119:
2120: .mm3s2c3a:
2121: lwz bufB, 4(src)
2122: addi src, src, 4
2123: rlwimi bufA, bufB, 24, 8, 31
2124: stw bufA, 4(dst)
2125: addi dst, dst, 4
2126: slwi bufA, bufB, 24
2127: bdnz .mm3s2c3a
2128:
2129: lwz bufB, 4(src)
2130: lwz bufC, 4(dst)
2131: rlwimi bufA, bufB, 24, 8, 31
2132: rlwimi bufC, bufA, 0, 0, 15
2133: stw bufC, 4(dst)
2134: b bcopy_exit
2135:
2136: /* forward copy destination aligned at 3, source aligned at 3, byte count 0 */
2137: /* d = xxx0 1234 5678 9abx */
2138: /* s = xxx0 1234 5678 9abx */
2139: .align 4
2140: .mm3s3c0:
2141: lwz bufA, -3(src)
2142: subi src, src, 3
2143: lwz bufC, -3(dst)
2144: addi wordCount, wordCount, -1
2145: mtctr wordCount
2146: rlwimi bufC, bufA, 0, 24, 31
2147: stw bufC, -3(dst)
2148: subi dst, dst, 3
2149:
2150: .mm3s3c0a:
2151: lwz bufA, 4(src)
2152: stw bufA, 4(dst)
2153: addi src, src, 4
2154: addi dst, dst, 4
2155: bdnz .mm3s3c0a
2156:
2157: lwz bufC, 4(dst)
2158: lwz bufA, 4(src)
2159: rlwimi bufC, bufA, 0, 0, 23
2160: stw bufC, 4(dst)
2161: b bcopy_exit
2162:
2163: /* forward copy destination aligned at 3, source aligned at 3, byte count 1 */
2164: /* d = xxx0 1234 5678 9abc xxxx */
2165: /* s = xxx0 1234 5678 9abc xxxx */
2166: .align 4
2167: .mm3s3c1:
2168: lwz bufA, -3(src)
2169: subi src, src, 3
2170: lwz bufC, -3(dst)
2171: mtctr wordCount
2172: rlwimi bufC, bufA, 0, 24, 31
2173: stw bufC, -3(dst)
2174: subi dst, dst, 3
2175:
2176: .mm3s3c1a:
2177: lwz bufA, 4(src)
2178: stw bufA, 4(dst)
2179: addi src, src, 4
2180: addi dst, dst, 4
2181: bdnz .mm3s3c1a
2182:
2183: b bcopy_exit
2184:
2185: /* forward copy destination aligned at 3, source aligned at 3, byte count 2 */
2186: /* d = xxx0 1234 5678 9abc dxxx */
2187: /* s = xxx0 1234 5678 9abc dxxx */
2188: .align 4
2189: .mm3s3c2:
2190: lwz bufA, -3(src)
2191: subi src, src, 3
2192: lwz bufC, -3(dst)
2193: mtctr wordCount
2194: rlwimi bufC, bufA, 0, 24, 31
2195: stw bufC, -3(dst)
2196: subi dst, dst, 3
2197:
2198: .mm3s3c2a:
2199: lwz bufA, 4(src)
2200: stw bufA, 4(dst)
2201: addi src, src, 4
2202: addi dst, dst, 4
2203: bdnz .mm3s3c2a
2204:
2205: lwz bufC, 4(dst)
2206: lwz bufA, 4(src)
2207: rlwimi bufC, bufA, 0, 0, 7
2208: stw bufC, 4(dst)
2209: b bcopy_exit
2210:
2211: /* forward copy destination aligned at 3, source aligned at 3, byte count 3 */
2212: /* d = xxx0 1234 5678 9abc dexx */
2213: /* s = xxx0 1234 5678 9abc dexx */
2214: .align 4
2215: .mm3s3c3:
2216: lwz bufA, -3(src)
2217: subi src, src, 3
2218: lwz bufC, -3(dst)
2219: mtctr wordCount
2220: rlwimi bufC, bufA, 0, 24, 31
2221: stw bufC, -3(dst)
2222: subi dst, dst, 3
2223:
2224: .mm3s3c3a:
2225: lwz bufA, 4(src)
2226: stw bufA, 4(dst)
2227: addi src, src, 4
2228: addi dst, dst, 4
2229: bdnz .mm3s3c3a
2230:
2231: lwz bufC, 4(dst)
2232: lwz bufA, 4(src)
2233: rlwimi bufC, bufA, 0, 0, 15
2234: stw bufC, 4(dst)
2235: b bcopy_exit
2236: #endif /* PPC604 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.