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