mirror of git://sourceware.org/git/glibc.git
* sysdeps/powerpc/bp-asm.h: New file.
* sysdeps/powerpc/__longjmp.S: Check bounds. Wrap extern symbols in BP_SYM (). * sysdeps/powerpc/bsd-_setjmp.S: Likewise. * sysdeps/powerpc/bsd-setjmp.S: Likewise. * sysdeps/powerpc/setjmp.S: Likewise. * sysdeps/powerpc/add_n.S: Likewise. * sysdeps/powerpc/addmul_1.S: Likewise. * sysdeps/powerpc/lshift.S: Likewise. * sysdeps/powerpc/rshift.S: Likewise. * sysdeps/powerpc/mul_1.S: Likewise. * sysdeps/powerpc/sub_n.S: Likewise. * sysdeps/powerpc/submul_1.S: Likewise. * sysdeps/powerpc/strlen.S: Likewise. * sysdeps/powerpc/memset.S: Likewise. * sysdeps/powerpc/stpcpy.S: Likewise. * sysdeps/powerpc/strcmp.S: Likewise. * sysdeps/powerpc/strcpy.S: Likewise. * sysdeps/powerpc/elf/bzero.S: Likewise. * sysdeps/powerpc/bp-asm.h: New file. * sysdeps/powerpc/__longjmp.S: Check bounds. Wrap extern symbols in BP_SYM (). * sysdeps/powerpc/bsd-_setjmp.S: Likewise. * sysdeps/powerpc/bsd-setjmp.S: Likewise. * sysdeps/powerpc/setjmp.S: Likewise. * sysdeps/powerpc/add_n.S: Likewise. * sysdeps/powerpc/addmul_1.S: Likewise. * sysdeps/powerpc/lshift.S: Likewise. * sysdeps/powerpc/rshift.S: Likewise. * sysdeps/powerpc/mul_1.S: Likewise. * sysdeps/powerpc/sub_n.S: Likewise. * sysdeps/powerpc/submul_1.S: Likewise. * sysdeps/powerpc/strlen.S: Likewise. * sysdeps/powerpc/memset.S: Likewise. * sysdeps/powerpc/stpcpy.S: Likewise. * sysdeps/powerpc/strcmp.S: Likewise. * sysdeps/powerpc/strcpy.S: Likewise. * sysdeps/powerpc/elf/bzero.S: Likewise.
This commit is contained in:
parent
dbda6079a6
commit
fa87f40377
20
ChangeLog
20
ChangeLog
|
@ -4,6 +4,26 @@
|
|||
|
||||
2000-06-30 Greg McGary <greg@mcgary.org>
|
||||
|
||||
* sysdeps/powerpc/bp-asm.h: New file.
|
||||
* sysdeps/powerpc/__longjmp.S: Check bounds.
|
||||
Wrap extern symbols in BP_SYM ().
|
||||
* sysdeps/powerpc/bsd-_setjmp.S: Likewise.
|
||||
* sysdeps/powerpc/bsd-setjmp.S: Likewise.
|
||||
* sysdeps/powerpc/setjmp.S: Likewise.
|
||||
* sysdeps/powerpc/add_n.S: Likewise.
|
||||
* sysdeps/powerpc/addmul_1.S: Likewise.
|
||||
* sysdeps/powerpc/lshift.S: Likewise.
|
||||
* sysdeps/powerpc/rshift.S: Likewise.
|
||||
* sysdeps/powerpc/mul_1.S: Likewise.
|
||||
* sysdeps/powerpc/sub_n.S: Likewise.
|
||||
* sysdeps/powerpc/submul_1.S: Likewise.
|
||||
* sysdeps/powerpc/strlen.S: Likewise.
|
||||
* sysdeps/powerpc/memset.S: Likewise.
|
||||
* sysdeps/powerpc/stpcpy.S: Likewise.
|
||||
* sysdeps/powerpc/strcmp.S: Likewise.
|
||||
* sysdeps/powerpc/strcpy.S: Likewise.
|
||||
* sysdeps/powerpc/elf/bzero.S: Likewise.
|
||||
|
||||
* sysdeps/powerpc/stpcpy.S: Define & use symbolic register names.
|
||||
Line up operands column with tabs.
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* longjmp for PowerPC.
|
||||
Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc.
|
||||
Copyright (C) 1995, 1996, 1997, 1999, 2000 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
|
||||
|
@ -21,8 +21,12 @@
|
|||
#define _ASM
|
||||
#define _SETJMP_H
|
||||
#include <bits/setjmp.h>
|
||||
#include <bp-sym.h>
|
||||
#include <bp-asm.h>
|
||||
|
||||
ENTRY (BP_SYM (__longjmp))
|
||||
CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
|
||||
|
||||
ENTRY (__longjmp)
|
||||
lwz r1,(JB_GPR1*4)(r3)
|
||||
lwz r2,(JB_GPR2*4)(r3)
|
||||
lwz r0,(JB_LR*4)(r3)
|
||||
|
@ -67,4 +71,4 @@ ENTRY (__longjmp)
|
|||
lfd fp31,((JB_FPRS+17*2)*4)(r3)
|
||||
mr r3,r4
|
||||
blr
|
||||
END (__longjmp)
|
||||
END (BP_SYM (__longjmp))
|
||||
|
|
|
@ -18,6 +18,8 @@
|
|||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <bp-sym.h>
|
||||
#include <bp-asm.h>
|
||||
|
||||
/* mp_limb_t mpn_add_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr,
|
||||
mp_size_t size)
|
||||
|
@ -27,7 +29,14 @@
|
|||
possible 2-unrolled inner loop will not be. Also, watch out for the
|
||||
alignment... */
|
||||
|
||||
EALIGN(__mpn_add_n,3,0)
|
||||
EALIGN (BP_SYM (__mpn_add_n), 3, 0)
|
||||
|
||||
#if __BOUNDED_POINTERS__
|
||||
slwi r10,r6,2 /* convert limbs to bytes */
|
||||
CHECK_BOUNDS_BOTH_WIDE (r3, r8, r9, r10)
|
||||
CHECK_BOUNDS_BOTH_WIDE (r4, r8, r9, r10)
|
||||
CHECK_BOUNDS_BOTH_WIDE (r5, r8, r9, r10)
|
||||
#endif
|
||||
/* Set up for loop below. */
|
||||
mtcrf 0x01,r6
|
||||
srwi. r7,r6,1
|
||||
|
@ -65,4 +74,4 @@ L(0): lwz r9,4(r4)
|
|||
/* Return the carry. */
|
||||
L(1): addze r3,r10
|
||||
blr
|
||||
END(__mpn_add_n)
|
||||
END (BP_SYM (__mpn_add_n))
|
||||
|
|
|
@ -18,11 +18,18 @@
|
|||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <bp-sym.h>
|
||||
#include <bp-asm.h>
|
||||
|
||||
/* mp_limb_t mpn_addmul_1 (mp_ptr res_ptr, mp_srcptr s1_ptr,
|
||||
mp_size_t s1_size, mp_limb_t s2_limb)
|
||||
Calculate res+s1*s2 and put result back in res; return carry. */
|
||||
ENTRY(__mpn_addmul_1)
|
||||
ENTRY (BP_SYM (__mpn_addmul_1))
|
||||
#if __BOUNDED_POINTERS__
|
||||
slwi r10,r5,2 /* convert limbs to bytes */
|
||||
CHECK_BOUNDS_BOTH_WIDE (r3, r8, r9, r10)
|
||||
CHECK_BOUNDS_BOTH_WIDE (r4, r8, r9, r10)
|
||||
#endif
|
||||
mtctr r5
|
||||
|
||||
lwz r0,0(r4)
|
||||
|
@ -46,4 +53,4 @@ L(0): lwzu r0,4(r4)
|
|||
L(1): stw r8,4(r3)
|
||||
addze r3,r10
|
||||
blr
|
||||
END(__mpn_addmul_1)
|
||||
END (BP_SYM (__mpn_addmul_1))
|
||||
|
|
|
@ -0,0 +1,115 @@
|
|||
/* Bounded-pointer definitions for PowerPC assembler.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Greg McGary <greg@mcgary.org>
|
||||
|
||||
This file is part of the GNU C Library. Its master source is NOT part of
|
||||
the C library, however. The master source lives in the GNU MP 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. */
|
||||
|
||||
#if __BOUNDED_POINTERS__
|
||||
|
||||
/* Byte offsets of BP components. */
|
||||
# define oVALUE 0
|
||||
# define oLOW 4
|
||||
# define oHIGH 8
|
||||
|
||||
/* Don't check bounds, just convert the BP register to its simple
|
||||
pointer value. */
|
||||
|
||||
# define UNCHECK_BOUNDS(rBP) \
|
||||
lwz rBP, oVALUE(rBP)
|
||||
|
||||
/* Check low bound, with the side effect that the BP register is converted
|
||||
its simple pointer value. Move the high bound into a register for
|
||||
later use. */
|
||||
|
||||
# define CHECK_BOUNDS_LOW(rBP, rLOW, rHIGH) \
|
||||
lwz rHIGH, oHIGH(rBP); \
|
||||
lwz rLOW, oLOW(rBP); \
|
||||
lwz rBP, oVALUE(rBP); \
|
||||
twllt rBP, rLOW
|
||||
|
||||
/* Check the high bound, which is in a register, using the given
|
||||
conditional trap instruction. */
|
||||
|
||||
# define CHECK_BOUNDS_HIGH(rVALUE, rHIGH, TWLcc) \
|
||||
TWLcc rVALUE, rHIGH
|
||||
|
||||
/* Check the high bound, which is stored at the return-value's high
|
||||
bound slot, using the given conditional trap instruction. */
|
||||
|
||||
# define CHECK_BOUNDS_HIGH_RTN(rVALUE, rHIGH, TWLcc) \
|
||||
lwz rHIGH, oHIGH(rRTN); \
|
||||
TWLcc rVALUE, rHIGH
|
||||
|
||||
/* Check both bounds, with the side effect that the BP register is
|
||||
converted to its simple pointer value. */
|
||||
|
||||
# define CHECK_BOUNDS_BOTH(rBP, rLOW, rHIGH) \
|
||||
CHECK_BOUNDS_LOW(rBP, rLOW, rHIGH); \
|
||||
twlge rBP, rHIGH
|
||||
|
||||
/* Check bounds on a memory region of given length, with the side
|
||||
effect that the BP register is converted to its simple pointer
|
||||
value. */
|
||||
|
||||
# define CHECK_BOUNDS_BOTH_WIDE(rBP, rLOW, rHIGH, rLENGTH) \
|
||||
CHECK_BOUNDS_LOW (rBP, rLOW, rHIGH); \
|
||||
sub rHIGH, rHIGH, rLENGTH; \
|
||||
twlgt rBP, rHIGH
|
||||
|
||||
# define CHECK_BOUNDS_BOTH_WIDE_LIT(rBP, rLOW, rHIGH, LENGTH) \
|
||||
CHECK_BOUNDS_LOW (rBP, rLOW, rHIGH); \
|
||||
subi rHIGH, rHIGH, LENGTH; \
|
||||
twlgt rBP, rHIGH
|
||||
|
||||
/* Store a pointer value register into the return-value's pointer
|
||||
value slot. */
|
||||
|
||||
# define STORE_RETURN_VALUE(rVALUE) \
|
||||
stw rVALUE, oVALUE(rRTN)
|
||||
|
||||
/* Store a low and high bounds into the return-value's pointer bounds
|
||||
slots. */
|
||||
|
||||
# define STORE_RETURN_BOUNDS(rLOW, rHIGH) \
|
||||
stw rLOW, oLOW(rRTN); \
|
||||
stw rHIGH, oHIGH(rRTN)
|
||||
|
||||
/* Stuff zero value/low/high into the BP addressed by rRTN. */
|
||||
|
||||
# define RETURN_NULL_BOUNDED_POINTER \
|
||||
li r4, 0; \
|
||||
STORE_RETURN_VALUE (r4); \
|
||||
STORE_RETURN_BOUNDS (r4, r4)
|
||||
|
||||
#else
|
||||
|
||||
# define UNCHECK_BOUNDS(rBP)
|
||||
# define CHECK_BOUNDS_LOW(rBP, rLOW, rHIGH)
|
||||
# define CHECK_BOUNDS_HIGH(rVALUE, rHIGH, TWLcc)
|
||||
# define CHECK_BOUNDS_HIGH_RTN(rVALUE, rHIGH, TWLcc)
|
||||
# define CHECK_BOUNDS_BOTH(rBP, rLOW, rHIGH)
|
||||
# define CHECK_BOUNDS_BOTH_WIDE(rBP, rLOW, rHIGH, rLENGTH)
|
||||
# define CHECK_BOUNDS_BOTH_WIDE_LIT(rBP, rLOW, rHIGH, LENGTH)
|
||||
# define STORE_RETURN_VALUE(rVALUE)
|
||||
# define STORE_RETURN_BOUNDS(rLOW, rHIGH)
|
||||
|
||||
# define RETURN_NULL_BOUNDED_POINTER li rRTN, 0
|
||||
|
||||
#endif
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. PowerPC version.
|
||||
Copyright (C) 1994, 1997, 1999 Free Software Foundation, Inc.
|
||||
Copyright (C) 1994, 1997, 1999, 2000 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
|
||||
|
@ -22,8 +22,9 @@
|
|||
in setjmp doesn't clobber the state restored by longjmp. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <bp-sym.h>
|
||||
|
||||
ENTRY (_setjmp)
|
||||
ENTRY (BP_SYM (_setjmp))
|
||||
li r4,0 /* Set second argument to 0. */
|
||||
b JUMPTARGET(__sigsetjmp)
|
||||
END (_setjmp)
|
||||
b JUMPTARGET(BP_SYM (__sigsetjmp))
|
||||
END (BP_SYM (_setjmp))
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. PowerPC version.
|
||||
Copyright (C) 1994, 1997, 1999 Free Software Foundation, Inc.
|
||||
Copyright (C) 1994, 1997, 1999, 2000 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
|
||||
|
@ -22,11 +22,12 @@
|
|||
in setjmp doesn't clobber the state restored by longjmp. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <bp-sym.h>
|
||||
|
||||
ENTRY (__setjmp)
|
||||
ENTRY (BP_SYM (__setjmp))
|
||||
li r4,1 /* Set second argument to 1. */
|
||||
b JUMPTARGET(__sigsetjmp)
|
||||
END (__setjmp)
|
||||
b JUMPTARGET(BP_SYM (__sigsetjmp))
|
||||
END (BP_SYM (__setjmp))
|
||||
|
||||
.globl setjmp
|
||||
.set setjmp,__setjmp
|
||||
.globl BP_SYM (setjmp)
|
||||
.set BP_SYM (setjmp), BP_SYM (__setjmp)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* Optimized bzero `implementation' for PowerPC.
|
||||
Copyright (C) 1997, 1999 Free Software Foundation, Inc.
|
||||
Copyright (C) 1997, 1999, 2000 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
|
||||
|
@ -18,10 +18,20 @@
|
|||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <bp-sym.h>
|
||||
|
||||
ENTRY(__bzero)
|
||||
ENTRY (BP_SYM (__bzero))
|
||||
|
||||
#if __BOUNDED_POINTERS__
|
||||
mr r6,r4
|
||||
li r5,0
|
||||
mr r4,r3
|
||||
/* Tell memset that we don't want a return value. */
|
||||
li r3,0
|
||||
#else
|
||||
mr r5,r4
|
||||
li r4,0
|
||||
b memset@local
|
||||
END(__bzero)
|
||||
weak_alias (__bzero, bzero)
|
||||
#endif
|
||||
b BP_SYM (memset)@local
|
||||
END (BP_SYM (__bzero))
|
||||
weak_alias (BP_SYM (__bzero), BP_SYM (bzero))
|
||||
|
|
|
@ -18,11 +18,19 @@
|
|||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <bp-sym.h>
|
||||
#include <bp-asm.h>
|
||||
|
||||
/* mp_limb_t mpn_lshift (mp_ptr wp, mp_srcptr up, mp_size_t usize,
|
||||
unsigned int cnt) */
|
||||
|
||||
EALIGN(__mpn_lshift,3,0)
|
||||
EALIGN (BP_SYM (__mpn_lshift), 3, 0)
|
||||
|
||||
#if __BOUNDED_POINTERS__
|
||||
slwi r10,r5,2 /* convert limbs to bytes */
|
||||
CHECK_BOUNDS_BOTH_WIDE (r3, r8, r9, r10)
|
||||
CHECK_BOUNDS_BOTH_WIDE (r4, r8, r9, r10)
|
||||
#endif
|
||||
mtctr r5 # copy size into CTR
|
||||
cmplwi cr0,r5,16 # is size < 16
|
||||
slwi r0,r5,2
|
||||
|
@ -120,4 +128,4 @@ L(n): lwzu r10,-4(r4); \
|
|||
DO_LSHIFT(30)
|
||||
DO_LSHIFT(31)
|
||||
|
||||
END(__mpn_lshift)
|
||||
END (BP_SYM (__mpn_lshift))
|
||||
|
|
|
@ -18,6 +18,8 @@
|
|||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <bp-sym.h>
|
||||
#include <bp-asm.h>
|
||||
|
||||
/* __ptr_t [r3] memset (__ptr_t s [r3], int c [r4], size_t n [r5]));
|
||||
Returns 's'.
|
||||
|
@ -26,13 +28,21 @@
|
|||
cache line (256 bits). There is a special case for setting cache lines
|
||||
to 0, to take advantage of the dcbz instruction. */
|
||||
|
||||
EALIGN (memset, 5, 1)
|
||||
EALIGN (BP_SYM (memset), 5, 1)
|
||||
|
||||
#define rTMP r0
|
||||
#define rRTN r3 /* initial value of 1st argument */
|
||||
#define rCHR r4 /* char to set in each byte */
|
||||
#define rLEN r5 /* length of region to set */
|
||||
#define rMEMP r6 /* address at which we are storing */
|
||||
#define rRTN r3 /* initial value of 1st argument */
|
||||
#if __BOUNDED_POINTERS__
|
||||
# define rMEMP0 r4 /* original value of 1st arg */
|
||||
# define rCHR r5 /* char to set in each byte */
|
||||
# define rLEN r6 /* length of region to set */
|
||||
# define rMEMP r10 /* address at which we are storing */
|
||||
#else
|
||||
# define rMEMP0 r3 /* original value of 1st arg */
|
||||
# define rCHR r4 /* char to set in each byte */
|
||||
# define rLEN r5 /* length of region to set */
|
||||
# define rMEMP r6 /* address at which we are storing */
|
||||
#endif
|
||||
#define rALIGN r7 /* number of bytes we are setting now (when aligning) */
|
||||
#define rMEMP2 r8
|
||||
|
||||
|
@ -40,21 +50,30 @@ EALIGN (memset, 5, 1)
|
|||
#define rNEG64 r8 /* constant -64 for clearing with dcbz */
|
||||
#define rNEG32 r9 /* constant -32 for clearing with dcbz */
|
||||
|
||||
#if __BOUNDED_POINTERS__
|
||||
cmplwi cr1, rRTN, 0
|
||||
CHECK_BOUNDS_BOTH_WIDE (rMEMP0, rTMP, rTMP2, rLEN)
|
||||
beq cr1, L(b0)
|
||||
STORE_RETURN_VALUE (rMEMP0)
|
||||
STORE_RETURN_BOUNDS (rTMP, rTMP2)
|
||||
L(b0):
|
||||
#endif
|
||||
|
||||
/* take care of case for size <= 4 */
|
||||
cmplwi cr1, rLEN, 4
|
||||
andi. rALIGN, rRTN, 3
|
||||
mr rMEMP, rRTN
|
||||
andi. rALIGN, rMEMP0, 3
|
||||
mr rMEMP, rMEMP0
|
||||
ble- cr1, L(small)
|
||||
/* align to word boundary */
|
||||
cmplwi cr5, rLEN, 31
|
||||
rlwimi rCHR, rCHR, 8, 16, 23
|
||||
beq+ L(aligned) /* 8th instruction from .align */
|
||||
mtcrf 0x01, rRTN
|
||||
mtcrf 0x01, rMEMP0
|
||||
subfic rALIGN, rALIGN, 4
|
||||
add rMEMP, rMEMP, rALIGN
|
||||
sub rLEN, rLEN, rALIGN
|
||||
bf+ 31, L(g0)
|
||||
stb rCHR, 0(rRTN)
|
||||
stb rCHR, 0(rMEMP0)
|
||||
bt 30, L(aligned)
|
||||
L(g0): sth rCHR, -2(rMEMP) /* 16th instruction from .align */
|
||||
/* take care of case for size < 31 */
|
||||
|
@ -207,4 +226,4 @@ L(medium_28t):
|
|||
stw rCHR, -4(rMEMP)
|
||||
stw rCHR, -8(rMEMP)
|
||||
blr
|
||||
END(memset)
|
||||
END (BP_SYM (memset))
|
||||
|
|
|
@ -18,12 +18,19 @@
|
|||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <bp-sym.h>
|
||||
#include <bp-asm.h>
|
||||
|
||||
/* mp_limb_t mpn_mul_1 (mp_ptr res_ptr, mp_srcptr s1_ptr,
|
||||
mp_size_t s1_size, mp_limb_t s2_limb)
|
||||
Calculate s1*s2 and put result in res_ptr; return carry. */
|
||||
|
||||
ENTRY(__mpn_mul_1)
|
||||
ENTRY (BP_SYM (__mpn_mul_1))
|
||||
#if __BOUNDED_POINTERS__
|
||||
slwi r10,r5,2 /* convert limbs to bytes */
|
||||
CHECK_BOUNDS_BOTH_WIDE (r3, r8, r9, r10)
|
||||
CHECK_BOUNDS_BOTH_WIDE (r4, r8, r9, r10)
|
||||
#endif
|
||||
mtctr r5
|
||||
|
||||
lwz r0,0(r4)
|
||||
|
@ -43,4 +50,4 @@ L(0): lwzu r0,4(r4)
|
|||
L(1): stw r7,4(r3)
|
||||
addze r3,r10
|
||||
blr
|
||||
END(__mpn_mul_1)
|
||||
END (BP_SYM (__mpn_mul_1))
|
||||
|
|
|
@ -18,6 +18,8 @@
|
|||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <bp-sym.h>
|
||||
#include <bp-asm.h>
|
||||
|
||||
/* INPUT PARAMETERS
|
||||
res_ptr r3
|
||||
|
@ -25,7 +27,12 @@
|
|||
size r5
|
||||
cnt r6 */
|
||||
|
||||
ENTRY(__mpn_rshift)
|
||||
ENTRY (BP_SYM (__mpn_rshift))
|
||||
#if __BOUNDED_POINTERS__
|
||||
slwi r10,r5,2 /* convert limbs to bytes */
|
||||
CHECK_BOUNDS_BOTH_WIDE (r3, r8, r9, r10)
|
||||
CHECK_BOUNDS_BOTH_WIDE (r4, r8, r9, r10)
|
||||
#endif
|
||||
mtctr r5 # copy size into CTR
|
||||
addi r7,r3,-4 # move adjusted res_ptr to free return reg
|
||||
subfic r8,r6,32
|
||||
|
@ -53,4 +60,4 @@ L(1): srw r0,r11,r6
|
|||
L(2): srw r0,r10,r6
|
||||
stw r0,4(r7)
|
||||
blr
|
||||
END(__mpn_rshift)
|
||||
END (BP_SYM (__mpn_rshift))
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* setjmp for PowerPC.
|
||||
Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc.
|
||||
Copyright (C) 1995, 1996, 1997, 1999, 2000 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
|
||||
|
@ -21,8 +21,12 @@
|
|||
#define _ASM
|
||||
#define _SETJMP_H
|
||||
#include <bits/setjmp.h>
|
||||
#include <bp-sym.h>
|
||||
#include <bp-asm.h>
|
||||
|
||||
ENTRY (BP_SYM (__sigsetjmp))
|
||||
CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
|
||||
|
||||
ENTRY (__sigsetjmp)
|
||||
stw r1,(JB_GPR1*4)(3)
|
||||
mflr r0
|
||||
stw r2,(JB_GPR2*4)(3)
|
||||
|
@ -65,5 +69,5 @@ ENTRY (__sigsetjmp)
|
|||
stfd fp30,((JB_FPRS+16*2)*4)(3)
|
||||
stw r31,((JB_GPRS+17)*4)(3)
|
||||
stfd fp31,((JB_FPRS+17*2)*4)(3)
|
||||
b JUMPTARGET(__sigjmp_save)
|
||||
END (__sigsetjmp)
|
||||
b JUMPTARGET (BP_SYM (__sigjmp_save))
|
||||
END (BP_SYM (__sigsetjmp))
|
||||
|
|
|
@ -18,22 +18,36 @@
|
|||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <bp-sym.h>
|
||||
#include <bp-asm.h>
|
||||
|
||||
/* See strlen.s for comments on how the end-of-string testing works. */
|
||||
|
||||
/* char * [r3] stpcpy (char *dest [r3], const char *src [r4]) */
|
||||
|
||||
EALIGN (__stpcpy, 4, 0)
|
||||
EALIGN (BP_SYM (__stpcpy), 4, 0)
|
||||
|
||||
#define rTMP r0
|
||||
#define rDEST r3 /* pointer to previous word in dest */
|
||||
#define rSRC r4 /* pointer to previous word in src */
|
||||
#define rRTN r3
|
||||
#if __BOUNDED_POINTERS__
|
||||
# define rDEST r4 /* pointer to previous word in dest */
|
||||
# define rSRC r5 /* pointer to previous word in src */
|
||||
# define rLOW r11
|
||||
# define rHIGH r12
|
||||
#else
|
||||
# define rDEST r3 /* pointer to previous word in dest */
|
||||
# define rSRC r4 /* pointer to previous word in src */
|
||||
#endif
|
||||
#define rWORD r6 /* current word from src */
|
||||
#define rFEFE r7 /* 0xfefefeff */
|
||||
#define r7F7F r8 /* 0x7f7f7f7f */
|
||||
#define rNEG r9 /* ~(word in src | 0x7f7f7f7f) */
|
||||
#define rALT r10 /* alternate word from src */
|
||||
|
||||
CHECK_BOUNDS_LOW (rSRC, rLOW, rHIGH)
|
||||
CHECK_BOUNDS_LOW (rDEST, rLOW, rHIGH)
|
||||
STORE_RETURN_BOUNDS (rLOW, rHIGH)
|
||||
|
||||
or rTMP, rSRC, rDEST
|
||||
clrlwi. rTMP, rTMP, 30
|
||||
addi rDEST, rDEST, -4
|
||||
|
@ -71,6 +85,8 @@ L(g1): rlwinm. rTMP, rALT, 8, 24, 31
|
|||
stbu rTMP, 1(rDEST)
|
||||
beqlr-
|
||||
stbu rALT, 1(rDEST)
|
||||
CHECK_BOUNDS_HIGH (rDEST, rHIGH, twlgt)
|
||||
STORE_RETURN_VALUE (rDEST)
|
||||
blr
|
||||
|
||||
/* Oh well. In this case, we just do a byte-by-byte copy. */
|
||||
|
@ -92,9 +108,13 @@ L(u0): lbzu rALT, 1(rSRC)
|
|||
cmpwi rWORD, 0
|
||||
bne+ L(u0)
|
||||
L(u2): stbu rWORD, 1(rDEST)
|
||||
CHECK_BOUNDS_HIGH (rDEST, rHIGH, twlgt)
|
||||
STORE_RETURN_VALUE (rDEST)
|
||||
blr
|
||||
L(u1): stbu rALT, 1(rDEST)
|
||||
CHECK_BOUNDS_HIGH (rDEST, rHIGH, twlgt)
|
||||
STORE_RETURN_VALUE (rDEST)
|
||||
blr
|
||||
END (__stpcpy)
|
||||
END (BP_SYM (__stpcpy))
|
||||
|
||||
weak_alias (__stpcpy, stpcpy)
|
||||
weak_alias (BP_SYM (__stpcpy), BP_SYM (stpcpy))
|
||||
|
|
|
@ -18,24 +18,33 @@
|
|||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <bp-sym.h>
|
||||
#include <bp-asm.h>
|
||||
|
||||
/* See strlen.s for comments on how the end-of-string testing works. */
|
||||
|
||||
/* int [r3] strcmp (const char *s1 [r3], const char *s2 [r4]) */
|
||||
|
||||
EALIGN (strcmp, 4, 0)
|
||||
EALIGN (BP_SYM (strcmp), 4, 0)
|
||||
|
||||
#define rTMP r0
|
||||
#define rRTN r3 /* return value */
|
||||
#define rRTN r3
|
||||
#define rSTR1 r3 /* first string arg */
|
||||
#define rSTR2 r4 /* second string arg */
|
||||
#if __BOUNDED_POINTERS__
|
||||
# define rHIGH1 r11
|
||||
# define rHIGH2 r12
|
||||
#endif
|
||||
#define rWORD1 r5 /* current word in s1 */
|
||||
#define rWORD2 r6 /* current word in s2 */
|
||||
#define rFEFE r7 /* constant 0xfefefeff (-0x01010101) */
|
||||
#define r7F7F r8 /* constant 0x7f7f7f7f */
|
||||
#define r7F7F r8 /* constant 0x7f7f7f7f */
|
||||
#define rNEG r9 /* ~(word in s1 | 0x7f7f7f7f) */
|
||||
#define rBITDIF r10 /* bits that differ in s1 & s2 words */
|
||||
|
||||
CHECK_BOUNDS_LOW (rSTR1, rTMP, rHIGH1)
|
||||
CHECK_BOUNDS_LOW (rSTR2, rTMP, rHIGH2)
|
||||
|
||||
or rTMP, rSTR2, rSTR1
|
||||
clrlwi. rTMP, rTMP, 30
|
||||
lis rFEFE, -0x101
|
||||
|
@ -74,6 +83,7 @@ L(endstring):
|
|||
bgelr+ cr1
|
||||
L(equal):
|
||||
li rRTN, 0
|
||||
/* GKM FIXME: check high bounds. */
|
||||
blr
|
||||
|
||||
L(different):
|
||||
|
@ -83,6 +93,7 @@ L(different):
|
|||
bgelr+
|
||||
L(highbit):
|
||||
ori rRTN, rWORD2, 1
|
||||
/* GKM FIXME: check high bounds. */
|
||||
blr
|
||||
|
||||
|
||||
|
@ -106,8 +117,10 @@ L(u1): cmpwi cr1, rWORD1, 0
|
|||
cmpw rWORD1, rWORD2
|
||||
bne+ cr1, L(u0)
|
||||
L(u3): sub rRTN, rWORD1, rWORD2
|
||||
/* GKM FIXME: check high bounds. */
|
||||
blr
|
||||
L(u4): lbz rWORD1, -1(rSTR1)
|
||||
sub rRTN, rWORD1, rWORD2
|
||||
/* GKM FIXME: check high bounds. */
|
||||
blr
|
||||
END(strcmp)
|
||||
END (BP_SYM (strcmp))
|
||||
|
|
|
@ -18,26 +18,43 @@
|
|||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <bp-sym.h>
|
||||
#include <bp-asm.h>
|
||||
|
||||
/* See strlen.s for comments on how the end-of-string testing works. */
|
||||
|
||||
/* char * [r3] strcpy (char *dest [r3], const char *src [r4]) */
|
||||
|
||||
EALIGN(strcpy, 4, 0)
|
||||
EALIGN (BP_SYM (strcpy), 4, 0)
|
||||
|
||||
#define rTMP r0
|
||||
#define rRTN r3 /* incoming DEST arg preserved as result */
|
||||
#define rSRC r4 /* pointer to previous word in src */
|
||||
#define rDEST r5 /* pointer to previous word in dest */
|
||||
#define rWORD r6 /* current word from src */
|
||||
#if __BOUNDED_POINTERS__
|
||||
# define rDEST r4 /* pointer to previous word in dest */
|
||||
# define rSRC r5 /* pointer to previous word in src */
|
||||
# define rLOW r11
|
||||
# define rHIGH r12
|
||||
#else
|
||||
# define rSRC r4 /* pointer to previous word in src */
|
||||
# define rDEST r5 /* pointer to previous word in dest */
|
||||
#endif
|
||||
#define rWORD r6 /* current word from src */
|
||||
#define rFEFE r7 /* constant 0xfefefeff (-0x01010101) */
|
||||
#define r7F7F r8 /* constant 0x7f7f7f7f */
|
||||
#define r7F7F r8 /* constant 0x7f7f7f7f */
|
||||
#define rNEG r9 /* ~(word in s1 | 0x7f7f7f7f) */
|
||||
#define rALT r10 /* alternate word from src */
|
||||
|
||||
CHECK_BOUNDS_LOW (rSRC, rLOW, rHIGH)
|
||||
CHECK_BOUNDS_LOW (rDEST, rLOW, rHIGH)
|
||||
STORE_RETURN_BOUNDS (rLOW, rHIGH)
|
||||
|
||||
or rTMP, rSRC, rRTN
|
||||
clrlwi. rTMP, rTMP, 30
|
||||
#if __BOUNDED_POINTERS__
|
||||
addi rDEST, rDEST, -4
|
||||
#else
|
||||
addi rDEST, rRTN, -4
|
||||
#endif
|
||||
bne L(unaligned)
|
||||
|
||||
lis rFEFE, -0x101
|
||||
|
@ -72,6 +89,7 @@ L(g1): rlwinm. rTMP, rALT, 8, 24, 31
|
|||
stb rTMP, 6(rDEST)
|
||||
beqlr-
|
||||
stb rALT, 7(rDEST)
|
||||
/* GKM FIXME: check high bound. */
|
||||
blr
|
||||
|
||||
/* Oh well. In this case, we just do a byte-by-byte copy. */
|
||||
|
@ -93,8 +111,10 @@ L(u0): lbzu rALT, 1(rSRC)
|
|||
cmpwi rWORD, 0
|
||||
bne+ L(u0)
|
||||
L(u2): stb rWORD, 1(rDEST)
|
||||
/* GKM FIXME: check high bound. */
|
||||
blr
|
||||
L(u1): stb rALT, 1(rDEST)
|
||||
/* GKM FIXME: check high bound. */
|
||||
blr
|
||||
|
||||
END(strcpy)
|
||||
END (BP_SYM (strcpy))
|
||||
|
|
|
@ -18,6 +18,8 @@
|
|||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <bp-sym.h>
|
||||
#include <bp-asm.h>
|
||||
|
||||
/* The algorithm here uses the following techniques:
|
||||
|
||||
|
@ -71,7 +73,7 @@
|
|||
|
||||
/* int [r3] strlen (char *s [r3]) */
|
||||
|
||||
ENTRY (strlen)
|
||||
ENTRY (BP_SYM (strlen))
|
||||
|
||||
#define rTMP1 r0
|
||||
#define rRTN r3 /* incoming STR arg, outgoing result */
|
||||
|
@ -87,6 +89,8 @@ ENTRY (strlen)
|
|||
#define rTMP3 r11
|
||||
#define rTMP4 r12
|
||||
|
||||
CHECK_BOUNDS_LOW (rRTN, rTMP1, rTMP2)
|
||||
|
||||
clrrwi rSTR, rRTN, 2
|
||||
lis r7F7F, 0x7f7f
|
||||
rlwinm rPADN, rRTN, 3, 27, 28
|
||||
|
@ -150,5 +154,6 @@ L(done0):
|
|||
subf rTMP1, rRTN, rSTR
|
||||
srwi rTMP3, rTMP3, 3
|
||||
add rRTN, rTMP1, rTMP3
|
||||
/* GKM FIXME: check high bound. */
|
||||
blr
|
||||
END (strlen)
|
||||
END (BP_SYM (strlen))
|
||||
|
|
|
@ -18,6 +18,8 @@
|
|||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <bp-sym.h>
|
||||
#include <bp-asm.h>
|
||||
|
||||
/* mp_limb_t mpn_sub_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr,
|
||||
mp_size_t size)
|
||||
|
@ -27,7 +29,15 @@
|
|||
possible 2-unrolled inner loop will not be. Also, watch out for the
|
||||
alignment... */
|
||||
|
||||
EALIGN(__mpn_sub_n,3,1)
|
||||
EALIGN (BP_SYM (__mpn_sub_n), 3, 1)
|
||||
|
||||
#if __BOUNDED_POINTERS__
|
||||
slwi r10,r6,2 /* convert limbs to bytes */
|
||||
CHECK_BOUNDS_BOTH_WIDE (r3, r8, r9, r10)
|
||||
CHECK_BOUNDS_BOTH_WIDE (r4, r8, r9, r10)
|
||||
CHECK_BOUNDS_BOTH_WIDE (r5, r8, r9, r10)
|
||||
#endif
|
||||
|
||||
/* Set up for loop below. */
|
||||
mtcrf 0x01,r6
|
||||
srwi. r7,r6,1
|
||||
|
@ -65,4 +75,4 @@ L(0):
|
|||
L(1): subfe r3,r3,r3
|
||||
neg r3,r3
|
||||
blr
|
||||
END(__mpn_sub_n)
|
||||
END (BP_SYM (__mpn_sub_n))
|
||||
|
|
|
@ -18,12 +18,19 @@
|
|||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <bp-sym.h>
|
||||
#include <bp-asm.h>
|
||||
|
||||
/* mp_limb_t mpn_submul_1 (mp_ptr res_ptr, mp_srcptr s1_ptr,
|
||||
mp_size_t s1_size, mp_limb_t s2_limb)
|
||||
Calculate res-s1*s2 and put result back in res; return carry. */
|
||||
|
||||
ENTRY(__mpn_submul_1)
|
||||
ENTRY (BP_SYM (__mpn_submul_1))
|
||||
#if __BOUNDED_POINTERS__
|
||||
slwi r10,r5,2 /* convert limbs to bytes */
|
||||
CHECK_BOUNDS_BOTH_WIDE (r3, r8, r9, r10)
|
||||
CHECK_BOUNDS_BOTH_WIDE (r4, r8, r9, r10)
|
||||
#endif
|
||||
mtctr r5
|
||||
|
||||
lwz r0,0(r4)
|
||||
|
@ -49,4 +56,4 @@ L(0): lwzu r0,4(r4)
|
|||
L(1): stw r8,4(r3)
|
||||
addze r3,r10
|
||||
blr
|
||||
END(__mpn_submul_1)
|
||||
END (BP_SYM (__mpn_submul_1))
|
||||
|
|
Loading…
Reference in New Issue