diff options
Diffstat (limited to 'sysdeps/powerpc/memset.s')
-rw-r--r-- | sysdeps/powerpc/memset.s | 202 |
1 files changed, 0 insertions, 202 deletions
diff --git a/sysdeps/powerpc/memset.s b/sysdeps/powerpc/memset.s deleted file mode 100644 index 4c8bf8c6b4..0000000000 --- a/sysdeps/powerpc/memset.s +++ /dev/null @@ -1,202 +0,0 @@ - # 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 |