| /* | |
| * String handling functions for PowerPC. | |
| * | |
| * Copyright (C) 1996 Paul Mackerras. | |
| * | |
| * This program is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU General Public License | |
| * as published by the Free Software Foundation; either version | |
| * 2 of the License, or (at your option) any later version. | |
| */ | |
| #include <asm/processor.h> | |
| #include <asm/errno.h> | |
| #include <asm/ppc_asm.h> | |
| _GLOBAL(memset) | |
| neg r0,r3 | |
| rlwimi r4,r4,8,16,23 | |
| andi. r0,r0,7 /* # bytes to be 8-byte aligned */ | |
| rlwimi r4,r4,16,0,15 | |
| cmplw cr1,r5,r0 /* do we get that far? */ | |
| rldimi r4,r4,32,0 | |
| PPC_MTOCRF(1,r0) | |
| mr r6,r3 | |
| blt cr1,8f | |
| beq+ 3f /* if already 8-byte aligned */ | |
| subf r5,r0,r5 | |
| bf 31,1f | |
| stb r4,0(r6) | |
| addi r6,r6,1 | |
| 1: bf 30,2f | |
| sth r4,0(r6) | |
| addi r6,r6,2 | |
| 2: bf 29,3f | |
| stw r4,0(r6) | |
| addi r6,r6,4 | |
| 3: srdi. r0,r5,6 | |
| clrldi r5,r5,58 | |
| mtctr r0 | |
| beq 5f | |
| 4: std r4,0(r6) | |
| std r4,8(r6) | |
| std r4,16(r6) | |
| std r4,24(r6) | |
| std r4,32(r6) | |
| std r4,40(r6) | |
| std r4,48(r6) | |
| std r4,56(r6) | |
| addi r6,r6,64 | |
| bdnz 4b | |
| 5: srwi. r0,r5,3 | |
| clrlwi r5,r5,29 | |
| PPC_MTOCRF(1,r0) | |
| beq 8f | |
| bf 29,6f | |
| std r4,0(r6) | |
| std r4,8(r6) | |
| std r4,16(r6) | |
| std r4,24(r6) | |
| addi r6,r6,32 | |
| 6: bf 30,7f | |
| std r4,0(r6) | |
| std r4,8(r6) | |
| addi r6,r6,16 | |
| 7: bf 31,8f | |
| std r4,0(r6) | |
| addi r6,r6,8 | |
| 8: cmpwi r5,0 | |
| PPC_MTOCRF(1,r5) | |
| beqlr+ | |
| bf 29,9f | |
| stw r4,0(r6) | |
| addi r6,r6,4 | |
| 9: bf 30,10f | |
| sth r4,0(r6) | |
| addi r6,r6,2 | |
| 10: bflr 31 | |
| stb r4,0(r6) | |
| blr | |
| _GLOBAL_TOC(memmove) | |
| cmplw 0,r3,r4 | |
| bgt backwards_memcpy | |
| b memcpy | |
| _GLOBAL(backwards_memcpy) | |
| rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */ | |
| add r6,r3,r5 | |
| add r4,r4,r5 | |
| beq 2f | |
| andi. r0,r6,3 | |
| mtctr r7 | |
| bne 5f | |
| 1: lwz r7,-4(r4) | |
| lwzu r8,-8(r4) | |
| stw r7,-4(r6) | |
| stwu r8,-8(r6) | |
| bdnz 1b | |
| andi. r5,r5,7 | |
| 2: cmplwi 0,r5,4 | |
| blt 3f | |
| lwzu r0,-4(r4) | |
| subi r5,r5,4 | |
| stwu r0,-4(r6) | |
| 3: cmpwi 0,r5,0 | |
| beqlr | |
| mtctr r5 | |
| 4: lbzu r0,-1(r4) | |
| stbu r0,-1(r6) | |
| bdnz 4b | |
| blr | |
| 5: mtctr r0 | |
| 6: lbzu r7,-1(r4) | |
| stbu r7,-1(r6) | |
| bdnz 6b | |
| subf r5,r0,r5 | |
| rlwinm. r7,r5,32-3,3,31 | |
| beq 2b | |
| mtctr r7 | |
| b 1b |