/* * 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(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