diff options
author | Ulrich Drepper <drepper@redhat.com> | 1997-08-29 21:01:47 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1997-08-29 21:01:47 +0000 |
commit | 800d775e426b9c0af63f711b79b09bf540c97456 (patch) | |
tree | ff7858571c81f2e6077c5e35b465494052984876 /sysdeps/powerpc/memset.s | |
parent | 39e16978c3b4ac8eaf2201fac56316623910d9da (diff) | |
download | glibc-800d775e426b9c0af63f711b79b09bf540c97456.tar.gz glibc-800d775e426b9c0af63f711b79b09bf540c97456.tar.xz glibc-800d775e426b9c0af63f711b79b09bf540c97456.zip |
Update. cvs/libc-ud-970829
1997-08-29 21:45 Ulrich Drepper <drepper@cygnus.com> * sunrpc/auth_des.c: New file. Copied from former secure_rpc add-on. * sunrpc/authdes_prot.c: New file. Likewise. * sunrpc/des.h: New file. Likewise. * sunrpc/des_crypt.c: New file. Likewise. * sunrpc/des_soft.c: New file. Likewise. * sunrpc/key_call.c: New file. Likewise. * sunrpc/key_prot.c: New file. Likewise. * sunrpc/netname.c: New file. Likewise. * sunrpc/openchild.c: New file. Likewise. * sunrpc/rtime.c: New file. Likewise. * sunrpc/svc_auth.c: New file. Likewise. * sunrpc/svcauth_des.c: New file. Likewise. * sunrpc/xcrypt.c: New file. Likewise. * sunrpc/rpc/auth.h: New file. Likewise. * sunrpc/rpc/auth_des.h: New file. Likewise. * sunrpc/rpc/des_crypt.h: New file. Likewise. * sunrpc/rpc/key_prot.h: New file. Likewise. * sunrpc/rpcsvc/key_prot.x: New file. Likewise. * sysdeps/generic/svc_auth.h: Removed. * sysdeps/generic/rpc/auth.h: Removed. * sysdeps/generic/rpc/auth_des.h: Removed. * sysdeps/stub/des_impl.c: New file. Stub version for DES. * sunrpc/Makefile (rpcsvc): Add keyprot.x. (headers): Add des_crypt.h and key_prot.h. (routines): Add auth_des, authdes_prot, des_crypt, des_impl, des_soft, key_call, key_prot, netname, openchild, rtime, svcauth_des, xcrypt. (distribute): Add des.h. * db2/Makefile: Add all headers and other files to distribute. (others): Add db_printlog. * sysdeps/mach/hurd/Dist: Add net/* headers. * sysdeps/mach/hurd/mips/Dist: New file. * sysdeps/powerpc/Dist: Add fe_nomask.c and t_sqrt.c. * sysdeps/sparc/Dist: Add sys/trap.h. * sysdeps/sparc/sparc32/Dist: Remove sys/trap.h. * sysdeps/sparc/sparc32/sparcv8/Dist: New file. * sysdeps/unix/sysv/linux/mips/Dist: Add sgidefs.h. * sysdeps/unix/sysv/linux/sparc/Dist: Add sys/trap.h. * sysdeps/unix/sysv/linux/sparc/sparc32/Dist: Remove sys/trap.h. Add previously missing assembler files for PPC. * sysdeps/powerpc/add_n.s: New file. * sysdeps/powerpc/addmul_1.s: New file. * sysdeps/powerpc/lshift.s: New file. * sysdeps/powerpc/memset.s: New file. * sysdeps/powerpc/mul_1.s: New file. * sysdeps/powerpc/rshift.s: New file. * sysdeps/powerpc/strchr.s: New file. * sysdeps/powerpc/strcmp.s: New file. * sysdeps/powerpc/sub_n.s: New file. * sysdeps/powerpc/submul_1.s: New file. 1997-08-28 18:42 Thorsten Kukuk <kukuk@uni-paderborn.de> * nis/nis_server.c: Rewritten to fix a lot of bugs. 1997-08-28 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * md5-crypt/Makefile (LDFLAGS-md5crypt.so, libmd5crypt-map): New variables. in NLSPATH environment variable. Patch by HJ Lu <hjl@gnu.ai.mit.edu>.
Diffstat (limited to 'sysdeps/powerpc/memset.s')
-rw-r--r-- | sysdeps/powerpc/memset.s | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/sysdeps/powerpc/memset.s b/sysdeps/powerpc/memset.s new file mode 100644 index 0000000000..4c8bf8c6b4 --- /dev/null +++ b/sysdeps/powerpc/memset.s @@ -0,0 +1,202 @@ + # Optimized memset implementation for PowerPC. + # Copyright (C) 1997 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. + + .section ".text" + .align 5 + nop + + .globl memset + .type memset,@function +memset: + # __ptr_t [r3] memset (__ptr_t s [r3], int c [r4], size_t n [r5])); + # Returns 's'. + + # The memset is done in three sizes: byte (8 bits), word (32 bits), + # cache line (256 bits). There is a special case for setting cache lines + # to 0, to take advantage of the dcbz instruction. + # r6: current address we are storing at + # r7: number of bytes we are setting now (when aligning) + + # take care of case for size <= 4 + cmplwi %cr1,%r5,4 + andi. %r7,%r3,3 + mr %r6,%r3 + ble- %cr1,small + # align to word boundary + cmplwi %cr5,%r5,31 + rlwimi %r4,%r4,8,16,23 + beq+ aligned # 8th instruction from .align + mtcrf 0x01,%r3 + subfic %r7,%r7,4 + add %r6,%r6,%r7 + sub %r5,%r5,%r7 + bf+ 31,0f + stb %r4,0(%r3) + bt 30,aligned +0: sth %r4,-2(%r6) # 16th instruction from .align + # take care of case for size < 31 +aligned: + mtcrf 0x01,%r5 + rlwimi %r4,%r4,16,0,15 + ble %cr5,medium + # align to cache line boundary... + andi. %r7,%r6,0x1C + subfic %r7,%r7,0x20 + beq caligned + mtcrf 0x01,%r7 + add %r6,%r6,%r7 + sub %r5,%r5,%r7 + cmplwi %cr1,%r7,0x10 + mr %r8,%r6 + bf 28,1f + stw %r4,-4(%r8) + stwu %r4,-8(%r8) +1: blt %cr1,2f + stw %r4,-4(%r8) # 32nd instruction from .align + stw %r4,-8(%r8) + stw %r4,-12(%r8) + stwu %r4,-16(%r8) +2: bf 29,caligned + stw %r4,-4(%r8) + # now aligned to a cache line. +caligned: + cmplwi %cr1,%r4,0 + clrrwi. %r7,%r5,5 + mtcrf 0x01,%r5 # 40th instruction from .align + beq %cr1,zloopstart # special case for clearing memory using dcbz + srwi %r0,%r7,5 + mtctr %r0 + beq medium # we may not actually get to do a full line + clrlwi. %r5,%r5,27 + add %r6,%r6,%r7 +0: li %r8,-0x40 + bdz cloopdone # 48th instruction from .align + +cloop: dcbz %r8,%r6 + stw %r4,-4(%r6) + stw %r4,-8(%r6) + stw %r4,-12(%r6) + stw %r4,-16(%r6) + nop # let 601 fetch last 4 instructions of loop + stw %r4,-20(%r6) + stw %r4,-24(%r6) # 56th instruction from .align + nop # let 601 fetch first 8 instructions of loop + stw %r4,-28(%r6) + stwu %r4,-32(%r6) + bdnz cloop +cloopdone: + stw %r4,-4(%r6) + stw %r4,-8(%r6) + stw %r4,-12(%r6) + stw %r4,-16(%r6) # 64th instruction from .align + stw %r4,-20(%r6) + cmplwi %cr1,%r5,16 + stw %r4,-24(%r6) + stw %r4,-28(%r6) + stwu %r4,-32(%r6) + beqlr + add %r6,%r6,%r7 + b medium_tail2 # 72nd instruction from .align + + .align 5 + nop +# clear lines of memory in 128-byte chunks. +zloopstart: + clrlwi %r5,%r5,27 + mtcrf 0x02,%r7 + srwi. %r0,%r7,7 + mtctr %r0 + li %r7,0x20 + li %r8,-0x40 + cmplwi %cr1,%r5,16 # 8 + bf 26,0f + dcbz 0,%r6 + addi %r6,%r6,0x20 +0: li %r9,-0x20 + bf 25,1f + dcbz 0,%r6 + dcbz %r7,%r6 + addi %r6,%r6,0x40 # 16 +1: cmplwi %cr5,%r5,0 + beq medium +zloop: + dcbz 0,%r6 + dcbz %r7,%r6 + addi %r6,%r6,0x80 + dcbz %r8,%r6 + dcbz %r9,%r6 + bdnz zloop + beqlr %cr5 + b medium_tail2 + + .align 5 +small: + # Memset of 4 bytes or less. + cmplwi %cr5,%r5,1 + cmplwi %cr1,%r5,3 + bltlr %cr5 + stb %r4,0(%r6) + beqlr %cr5 + nop + stb %r4,1(%r6) + bltlr %cr1 + stb %r4,2(%r6) + beqlr %cr1 + nop + stb %r4,3(%r6) + blr + +# memset of 0-31 bytes + .align 5 +medium: + cmplwi %cr1,%r5,16 +medium_tail2: + add %r6,%r6,%r5 +medium_tail: + bt- 31,medium_31t + bt- 30,medium_30t +medium_30f: + bt- 29,medium_29t +medium_29f: + bge- %cr1,medium_27t + bflr- 28 + stw %r4,-4(%r6) # 8th instruction from .align + stw %r4,-8(%r6) + blr + +medium_31t: + stbu %r4,-1(%r6) + bf- 30,medium_30f +medium_30t: + sthu %r4,-2(%r6) + bf- 29,medium_29f +medium_29t: + stwu %r4,-4(%r6) + blt- %cr1,medium_27f # 16th instruction from .align +medium_27t: + stw %r4,-4(%r6) + stw %r4,-8(%r6) + stw %r4,-12(%r6) + stwu %r4,-16(%r6) +medium_27f: + bflr- 28 +medium_28t: + stw %r4,-4(%r6) + stw %r4,-8(%r6) + blr |