/* Optimized memmove implementation for PowerPC. Copyright (C) 1996 Paul Mackerras. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include ENTRY(memmove) /* void * [r3] memmove(void *dest [r3], const void *src [r4], size_t n [r5]) */ cmplw 0,%r3,%r4 bgt backwards_memcpy /* fall through */ forward_memcpy: srwi. %r7,%r5,3 /* r0 = r5 >> 3 */ addi %r6,%r3,-4 addi %r4,%r4,-4 beq 2f /* if less than 8 bytes to do */ andi. %r0,%r6,3 /* get dest word aligned */ 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) addi %r5,%r5,-4 stwu %r0,4(%r6) 3: cmpwi 0,%r5,0 beqlr mtctr %r5 addi %r4,%r4,3 addi %r6,%r6,3 4: lbzu %r0,1(%r4) stbu %r0,1(%r6) bdnz 4b blr 5: subfic %r0,%r0,4 mtctr %r0 6: lbz %r7,4(%r4) addi %r4,%r4,1 stb %r7,4(%r6) addi %r6,%r6,1 bdnz 6b subf %r5,%r0,%r5 srwi. %r7,%r5,3 beq 2b mtctr %r7 b 1b 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 END(memmove)