glibc: optimized ppc bcopy
Kenneth Johansson
kenneth.johansson at etx.ericsson.se
Sat Apr 12 07:37:44 EST 2003
On Fri, 2003-04-11 at 23:04, Rob Latham wrote:
> So i looked a bit closer at glibc: there are no optimized powerpc
> string or memory operations. ( later confirmed by the glibc web
> pages)
>
> I know there are a zillion powerpc variants: would it be hard to
> write assembly that works with all of them? I know almost zero about
> powerpc assembly, but this might be a fun place to start learning. Of
> course, if anyone else has already started such an undertaking, i'll
> defer to them and go work on something else.
You could start with this. I have not used them on a resent version of
glibc but it used to work.
--
Kenneth Johansson
Ericsson AB Tel: +46 8 719 70 20
Tellusborgsvägen 90 Fax: +46 8 719 29 45
126 25 Stockholm ken at switchboard.ericsson.se
-------------- next part --------------
/* Optimized bcopy `implementation' for PowerPC.
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
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 <sysdep.h>
ENTRY(bcopy)
/* void bcopy(const void *src [r3], const void *dest [r4], size_t n [r5]) */
mr %r6,%r3
mr %r3,%r4
mr %r4,%r6
b memcpy at local
END(bcopy)
-------------- next part --------------
/* 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 <sysdep.h>
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)
-------------- next part --------------
/* 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 <sysdep.h>
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)
-------------- next part --------------
/* Optimized mempcpy 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 <sysdep.h>
ENTRY(__mempcpy)
/* void * [r3] __mempcpy(void *dest [r3], const void *src [r4], size_t n [r5])
*/
srwi. %r7,%r5,3 /* r0 = r5 >> 3 */
addi %r6,%r3,-4
addi %r4,%r4,-4
add %r3,%r3,%r5 /* set up return value */
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(__mempcpy)
weak_alias (__mempcpy, mempcpy)
More information about the Linuxppc-dev
mailing list