/* Optimized memcpy 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(memcpy) /* void * [r3] memcpy(void *dest [r3], const void *src [r4], size_t n [r5]) */ /* Registers used: r0: temporary r3: saved `dest' r4: pointer to previous word in src r5: r6: pointer to previous word in dest r7: temporary r8: temporary (used to move words) */ 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 END(memcpy)