From: Kenneth Johansson <kenneth.johansson@etx.ericsson.se>
To: Rob Latham <rob@terizla.org>
Cc: "linuxppc-dev@lists.linuxppc.org" <linuxppc-dev@lists.linuxppc.org>
Subject: Re: glibc: optimized ppc bcopy
Date: 11 Apr 2003 23:37:44 +0200 [thread overview]
Message-ID: <1050097064.1169.57.camel@spawn> (raw)
In-Reply-To: <20030411210449.GC92837@terizla.org>
[-- Attachment #1: Type: text/plain, Size: 844 bytes --]
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@switchboard.ericsson.se
[-- Attachment #2: bcopy.S --]
[-- Type: text/plain, Size: 1132 bytes --]
/* 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@local
END(bcopy)
[-- Attachment #3: memcpy.S --]
[-- Type: text/plain, Size: 1908 bytes --]
/* 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)
[-- Attachment #4: memmove.S --]
[-- Type: text/plain, Size: 2350 bytes --]
/* 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)
[-- Attachment #5: mempcpy.S --]
[-- Type: text/plain, Size: 1784 bytes --]
/* 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)
next prev parent reply other threads:[~2003-04-11 21:37 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-04-11 21:04 glibc: optimized ppc bcopy Rob Latham
2003-04-11 21:37 ` Kenneth Johansson [this message]
2003-04-11 22:21 ` Rob Baxter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1050097064.1169.57.camel@spawn \
--to=kenneth.johansson@etx.ericsson.se \
--cc=linuxppc-dev@lists.linuxppc.org \
--cc=rob@terizla.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.