mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-28 00:21:52 +03:00
* stdlib/Makefile (mpn-stuff): New target.
(copy-mpn): Use it. * Code copied from GMP updated to 1.937 version. * stdlib/strtod.c (HAVE_ALLOCA): Define this for gmp headers.
This commit is contained in:
@ -1,5 +1,11 @@
|
|||||||
Fri Mar 1 10:09:46 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
|
Fri Mar 1 10:09:46 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
|
||||||
|
|
||||||
|
* stdlib/Makefile (mpn-stuff): New target.
|
||||||
|
(copy-mpn): Use it.
|
||||||
|
|
||||||
|
* Code copied from GMP updated to 1.937 version.
|
||||||
|
* stdlib/strtod.c (HAVE_ALLOCA): Define this for gmp headers.
|
||||||
|
|
||||||
* posix/glob.c: Use canonical code from autoconf manual for dirent
|
* posix/glob.c: Use canonical code from autoconf manual for dirent
|
||||||
include.
|
include.
|
||||||
[_D_NAMLEN]: Redefine NAMLEN using this.
|
[_D_NAMLEN]: Redefine NAMLEN using this.
|
||||||
|
@ -170,7 +170,7 @@ extern const char _libc_intl_domainname[];
|
|||||||
are better clued in to what we are doing. */
|
are better clued in to what we are doing. */
|
||||||
#undef strong_alias
|
#undef strong_alias
|
||||||
#define strong_alias(name, aliasname) \
|
#define strong_alias(name, aliasname) \
|
||||||
extern __typeof (name) aliasname __attribute__ ((alias (#name)));
|
__typeof (name) aliasname __attribute__ ((alias (#name)));
|
||||||
|
|
||||||
#ifdef HAVE_WEAK_SYMBOLS
|
#ifdef HAVE_WEAK_SYMBOLS
|
||||||
#undef weak_symbol
|
#undef weak_symbol
|
||||||
@ -178,7 +178,7 @@ extern const char _libc_intl_domainname[];
|
|||||||
extern __typeof (name) name __attribute__ ((weak));
|
extern __typeof (name) name __attribute__ ((weak));
|
||||||
#undef weak_alias
|
#undef weak_alias
|
||||||
#define weak_alias(name, aliasname) \
|
#define weak_alias(name, aliasname) \
|
||||||
extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));
|
__typeof (name) aliasname __attribute__ ((weak, alias (#name)));
|
||||||
#endif /* HAVE_WEAK_SYMBOLS. */
|
#endif /* HAVE_WEAK_SYMBOLS. */
|
||||||
#endif /* Not ASSEMBLER, and GCC 2.8 or later. */
|
#endif /* Not ASSEMBLER, and GCC 2.8 or later. */
|
||||||
|
|
||||||
|
@ -102,7 +102,8 @@ endef
|
|||||||
mpn-copy = $(filter-out $(mpn-sysdep),$(mpn-headers))# mp_clz_tab.c)
|
mpn-copy = $(filter-out $(mpn-sysdep),$(mpn-headers))# mp_clz_tab.c)
|
||||||
$(mpn-copy): %: $(ignore gmp2glibc.sed) $(gmp-srcdir)/%; $(gmp2glibc)
|
$(mpn-copy): %: $(ignore gmp2glibc.sed) $(gmp-srcdir)/%; $(gmp2glibc)
|
||||||
|
|
||||||
.PHONY: copy-mpn clean-mpn
|
.PHONY: copy-mpn clean-mpn mpn-stuff
|
||||||
|
mpn-stuff: $(mpn-stuff)
|
||||||
copy-mpn: $(mpn-stuff)
|
copy-mpn: $(mpn-stuff)
|
||||||
test ! -d CVS || cvs commit -m'Updated from $(gmp-srcdir)' $+
|
test ! -d CVS || cvs commit -m'Updated from $(gmp-srcdir)' $+
|
||||||
clean-mpn:
|
clean-mpn:
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Include file for internal GNU MP types and definitions.
|
/* Include file for internal GNU MP types and definitions.
|
||||||
|
|
||||||
Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1991, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -18,25 +18,50 @@ You should have received a copy of the GNU Library General Public License
|
|||||||
along with the GNU MP Library; see the file COPYING.LIB. If not, write to
|
along with the GNU MP Library; see the file COPYING.LIB. If not, write to
|
||||||
the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
#if ! defined (alloca)
|
/* When using gcc, make sure to use its builtin alloca. */
|
||||||
#if defined (__GNUC__)
|
#if ! defined (alloca) && defined (__GNUC__)
|
||||||
#define alloca __builtin_alloca
|
#define alloca __builtin_alloca
|
||||||
|
#define HAVE_ALLOCA
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* When using cc, do whatever necessary to allow use of alloca. For many
|
||||||
|
machines, this means including alloca.h. IBM's compilers need a #pragma
|
||||||
|
in "each module that needs to use alloca". */
|
||||||
|
#if ! defined (alloca)
|
||||||
|
/* We need lots of variants for MIPS, to cover all versions and perversions
|
||||||
|
of OSes for MIPS. */
|
||||||
|
#if defined (__mips) || defined (MIPSEL) || defined (MIPSEB) \
|
||||||
|
|| defined (_MIPSEL) || defined (_MIPSEB) || defined (__sgi) \
|
||||||
|
|| defined (__alpha) || defined (__sparc) || defined (sparc) \
|
||||||
|
|| defined (__ksr__)
|
||||||
|
#include <alloca.h>
|
||||||
|
#define HAVE_ALLOCA
|
||||||
|
#endif
|
||||||
|
#if defined (_IBMR2)
|
||||||
|
#pragma alloca
|
||||||
|
#define HAVE_ALLOCA
|
||||||
|
#endif
|
||||||
|
#if defined (__DECC)
|
||||||
|
#define alloca(x) __ALLOCA(x)
|
||||||
|
#define HAVE_ALLOCA
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ! defined (alloca)
|
#if ! defined (HAVE_ALLOCA) || USE_STACK_ALLOC
|
||||||
#if defined (__sparc__) || defined (sparc) || defined (__sgi)
|
#include "stack-alloc.h"
|
||||||
#include <alloca.h>
|
#else
|
||||||
#endif
|
#define TMP_DECL(m)
|
||||||
|
#define TMP_ALLOC(x) alloca(x)
|
||||||
|
#define TMP_MARK(m)
|
||||||
|
#define TMP_FREE(m)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef NULL
|
#ifndef NULL
|
||||||
#define NULL 0L
|
#define NULL ((void *) 0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ! defined (__GNUC__)
|
#if ! defined (__GNUC__)
|
||||||
#define inline /* Empty */
|
#define inline /* Empty */
|
||||||
void *alloca();
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define ABS(x) (x >= 0 ? x : -x)
|
#define ABS(x) (x >= 0 ? x : -x)
|
||||||
@ -46,7 +71,7 @@ void *alloca();
|
|||||||
#include "gmp-mparam.h"
|
#include "gmp-mparam.h"
|
||||||
/* #include "longlong.h" */
|
/* #include "longlong.h" */
|
||||||
|
|
||||||
#ifdef __STDC__
|
#if defined (__STDC__) || defined (__cplusplus)
|
||||||
void *malloc (size_t);
|
void *malloc (size_t);
|
||||||
void *realloc (void *, size_t);
|
void *realloc (void *, size_t);
|
||||||
void free (void *);
|
void free (void *);
|
||||||
@ -119,35 +144,6 @@ void _mp_default_free ();
|
|||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/* Swap (mp_ptr, mp_size_t) (U, UL) with (V, VL) */
|
|
||||||
#define MPN_SWAP(u, l, v, m) \
|
|
||||||
do { \
|
|
||||||
{ mp_ptr _; _ = (u), (u) = (v), (v) = _;} \
|
|
||||||
{ mp_size_t _; _ = (l), (l) = (m), (m) = _;} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* Return true iff the limb X has less bits than the limb Y. */
|
|
||||||
#define MPN_LESS_BITS_LIMB(x,y) ((x) < (y) && (x) < ((x) ^ (y)))
|
|
||||||
|
|
||||||
/* Return true iff (mp_ptr, mp_size_t) (U, UL) has less bits than (V, VL). */
|
|
||||||
#define MPN_LESS_BITS(u, l, v, m) \
|
|
||||||
((l) < (m) \
|
|
||||||
|| ((l) == (m) && (l) != 0 && MPN_LESS_BITS_LIMB ((u)[(l - 1)], (v)[(l) - 1])))
|
|
||||||
|
|
||||||
/* Return true iff (mp_ptr, mp_size_t) (U, UL) has more bits than (V, VL). */
|
|
||||||
#define MPN_MORE_BITS(u, l, v, m) MPN_LESS_BITS (v, m, u, l)
|
|
||||||
|
|
||||||
/* Perform twos complement on (mp_ptr, mp_size_t) (U, UL),
|
|
||||||
putting result at (v, VL). Precondition: U[0] != 0. */
|
|
||||||
#define MPN_COMPL_INCR(u, v, l) \
|
|
||||||
do { \
|
|
||||||
mp_size_t _ = 0; \
|
|
||||||
(u)[0] = -(v)[_]; \
|
|
||||||
while (_++ < (l)) \
|
|
||||||
(u)[_] = ~(v)[_]; \
|
|
||||||
} while (0)
|
|
||||||
#define MPN_COMPL MPN_COMPL_INCR
|
|
||||||
|
|
||||||
/* Initialize the MP_INT X with space for NLIMBS limbs.
|
/* Initialize the MP_INT X with space for NLIMBS limbs.
|
||||||
X should be a temporary variable, and it will be automatically
|
X should be a temporary variable, and it will be automatically
|
||||||
cleared out when the running function returns.
|
cleared out when the running function returns.
|
||||||
@ -156,23 +152,23 @@ void _mp_default_free ();
|
|||||||
#define MPZ_TMP_INIT(X, NLIMBS) \
|
#define MPZ_TMP_INIT(X, NLIMBS) \
|
||||||
do { \
|
do { \
|
||||||
mpz_ptr __x = (X); \
|
mpz_ptr __x = (X); \
|
||||||
__x->alloc = (NLIMBS); \
|
__x->_mp_alloc = (NLIMBS); \
|
||||||
__x->d = (mp_ptr) alloca ((NLIMBS) * BYTES_PER_MP_LIMB); \
|
__x->_mp_d = (mp_ptr) TMP_ALLOC ((NLIMBS) * BYTES_PER_MP_LIMB); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define MPN_MUL_N_RECURSE(prodp, up, vp, size, tspace) \
|
#define MPN_MUL_N_RECURSE(prodp, up, vp, size, tspace) \
|
||||||
do { \
|
do { \
|
||||||
if ((size) < KARATSUBA_THRESHOLD) \
|
if ((size) < KARATSUBA_THRESHOLD) \
|
||||||
____mpn_mul_n_basecase (prodp, up, vp, size); \
|
impn_mul_n_basecase (prodp, up, vp, size); \
|
||||||
else \
|
else \
|
||||||
____mpn_mul_n (prodp, up, vp, size, tspace); \
|
impn_mul_n (prodp, up, vp, size, tspace); \
|
||||||
} while (0);
|
} while (0);
|
||||||
#define MPN_SQR_N_RECURSE(prodp, up, size, tspace) \
|
#define MPN_SQR_N_RECURSE(prodp, up, size, tspace) \
|
||||||
do { \
|
do { \
|
||||||
if ((size) < KARATSUBA_THRESHOLD) \
|
if ((size) < KARATSUBA_THRESHOLD) \
|
||||||
____mpn_sqr_n_basecase (prodp, up, size); \
|
impn_sqr_n_basecase (prodp, up, size); \
|
||||||
else \
|
else \
|
||||||
____mpn_sqr_n (prodp, up, size, tspace); \
|
impn_sqr_n (prodp, up, size, tspace); \
|
||||||
} while (0);
|
} while (0);
|
||||||
|
|
||||||
/* Structure for conversion between internal binary format and
|
/* Structure for conversion between internal binary format and
|
||||||
@ -198,6 +194,13 @@ struct bases
|
|||||||
mp_limb big_base_inverted;
|
mp_limb big_base_inverted;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Access macros for structure fields for user-visible structures with
|
||||||
|
hidden fields. */
|
||||||
|
#define size(X) (X)._mp_size
|
||||||
|
#define alloc(X) (X)._mp_alloc
|
||||||
|
#define prec(X) (X)._mp_prec
|
||||||
|
#define limbs(X) (X)._mp_d
|
||||||
|
|
||||||
extern const struct bases __mp_bases[];
|
extern const struct bases __mp_bases[];
|
||||||
extern mp_size_t __gmp_default_fp_limb_precision;
|
extern mp_size_t __gmp_default_fp_limb_precision;
|
||||||
|
|
||||||
@ -288,6 +291,11 @@ typedef mp_limb UWtype;
|
|||||||
typedef unsigned int UHWtype;
|
typedef unsigned int UHWtype;
|
||||||
#define W_TYPE_SIZE BITS_PER_MP_LIMB
|
#define W_TYPE_SIZE BITS_PER_MP_LIMB
|
||||||
|
|
||||||
|
/* Internal mpn calls */
|
||||||
|
#define impn_mul_n_basecase __MPN(impn_mul_n_basecase)
|
||||||
|
#define impn_mul_n __MPN(impn_mul_n)
|
||||||
|
#define impn_sqr_n_basecase __MPN(impn_sqr_n_basecase)
|
||||||
|
#define impn_sqr_n __MPN(impn_sqr_n)
|
||||||
|
|
||||||
#ifndef IEEE_DOUBLE_BIG_ENDIAN
|
#ifndef IEEE_DOUBLE_BIG_ENDIAN
|
||||||
#define IEEE_DOUBLE_BIG_ENDIAN 1
|
#define IEEE_DOUBLE_BIG_ENDIAN 1
|
||||||
@ -298,10 +306,10 @@ union ieee_double_extract
|
|||||||
{
|
{
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
unsigned long sig:1;
|
unsigned int sig:1;
|
||||||
unsigned long exp:11;
|
unsigned int exp:11;
|
||||||
unsigned long manh:20;
|
unsigned int manh:20;
|
||||||
unsigned long manl:32;
|
unsigned int manl:32;
|
||||||
} s;
|
} s;
|
||||||
double d;
|
double d;
|
||||||
};
|
};
|
||||||
@ -310,10 +318,10 @@ union ieee_double_extract
|
|||||||
{
|
{
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
unsigned long manl:32;
|
unsigned int manl:32;
|
||||||
unsigned long manh:20;
|
unsigned int manh:20;
|
||||||
unsigned long exp:11;
|
unsigned int exp:11;
|
||||||
unsigned long sig:1;
|
unsigned int sig:1;
|
||||||
} s;
|
} s;
|
||||||
double d;
|
double d;
|
||||||
};
|
};
|
||||||
|
408
stdlib/gmp.h
408
stdlib/gmp.h
@ -1,6 +1,6 @@
|
|||||||
/* gmp.h -- Definitions for GNU multiple precision functions.
|
/* gmp.h -- Definitions for GNU multiple precision functions.
|
||||||
|
|
||||||
Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1991, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -21,22 +21,31 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
#ifndef __GMP_H__
|
#ifndef __GMP_H__
|
||||||
|
|
||||||
#ifndef __GNU_MP__
|
#ifndef __GNU_MP__
|
||||||
|
#define __GNU_MP__ 2
|
||||||
#define __need_size_t
|
#define __need_size_t
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#undef __need_size_t
|
#undef __need_size_t
|
||||||
|
|
||||||
#if defined (__STDC__)
|
#if defined (__STDC__) || defined (__cplusplus)
|
||||||
#define __gmp_const const
|
#define __gmp_const const
|
||||||
#else
|
#else
|
||||||
#define __gmp_const
|
#define __gmp_const
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (__GNUC__)
|
#if defined (__GNUC__)
|
||||||
#define __gmp_inline inline
|
#define __gmp_inline __inline__
|
||||||
#else
|
#else
|
||||||
#define __gmp_inline
|
#define __gmp_inline
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef _EXTERN_INLINE
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#define _EXTERN_INLINE extern __inline__
|
||||||
|
#else
|
||||||
|
#define _EXTERN_INLINE static
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef _SHORT_LIMB
|
#ifdef _SHORT_LIMB
|
||||||
typedef unsigned int mp_limb;
|
typedef unsigned int mp_limb;
|
||||||
typedef int mp_limb_signed;
|
typedef int mp_limb_signed;
|
||||||
@ -52,30 +61,30 @@ typedef long int mp_limb_signed;
|
|||||||
|
|
||||||
typedef mp_limb * mp_ptr;
|
typedef mp_limb * mp_ptr;
|
||||||
typedef __gmp_const mp_limb * mp_srcptr;
|
typedef __gmp_const mp_limb * mp_srcptr;
|
||||||
typedef int mp_size_t;
|
typedef long int mp_size_t;
|
||||||
typedef long int mp_exp_t;
|
typedef long int mp_exp_t;
|
||||||
|
|
||||||
#ifndef __MP_SMALL__
|
#ifndef __MP_SMALL__
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
mp_size_t alloc; /* Number of *limbs* allocated and pointed
|
int _mp_alloc; /* Number of *limbs* allocated and pointed
|
||||||
to by the D field. */
|
to by the D field. */
|
||||||
mp_size_t size; /* abs(SIZE) is the number of limbs
|
int _mp_size; /* abs(SIZE) is the number of limbs
|
||||||
the last field points to. If SIZE
|
the last field points to. If SIZE
|
||||||
is negative this is a negative
|
is negative this is a negative
|
||||||
number. */
|
number. */
|
||||||
mp_limb *d; /* Pointer to the limbs. */
|
mp_limb *_mp_d; /* Pointer to the limbs. */
|
||||||
} __mpz_struct;
|
} __mpz_struct;
|
||||||
#else
|
#else
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
short int alloc; /* Number of *limbs* allocated and pointed
|
short int _mp_alloc; /* Number of *limbs* allocated and pointed
|
||||||
to by the D field. */
|
to by the D field. */
|
||||||
short int size; /* abs(SIZE) is the number of limbs
|
short int _mp_size; /* abs(SIZE) is the number of limbs
|
||||||
the last field points to. If SIZE
|
the last field points to. If SIZE
|
||||||
is negative this is a negative
|
is negative this is a negative
|
||||||
number. */
|
number. */
|
||||||
mp_limb *d; /* Pointer to the limbs. */
|
mp_limb *_mp_d; /* Pointer to the limbs. */
|
||||||
} __mpz_struct;
|
} __mpz_struct;
|
||||||
#endif
|
#endif
|
||||||
#endif /* __GNU_MP__ */
|
#endif /* __GNU_MP__ */
|
||||||
@ -89,20 +98,20 @@ typedef __mpz_struct mpz_t[1];
|
|||||||
the numerator. */
|
the numerator. */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
__mpz_struct num;
|
__mpz_struct _mp_num;
|
||||||
__mpz_struct den;
|
__mpz_struct _mp_den;
|
||||||
#if 0
|
#if 0
|
||||||
long int num_alloc; /* Number of limbs allocated
|
int _mp_num_alloc; /* Number of limbs allocated
|
||||||
for the numerator. */
|
for the numerator. */
|
||||||
long int num_size; /* The absolute value of this field is the
|
int _mp_num_size; /* The absolute value of this field is the
|
||||||
length of the numerator; the sign is the
|
length of the numerator; the sign is the
|
||||||
sign of the entire rational number. */
|
sign of the entire rational number. */
|
||||||
mp_ptr num; /* Pointer to the numerator limbs. */
|
mp_ptr _mp_num; /* Pointer to the numerator limbs. */
|
||||||
long int den_alloc; /* Number of limbs allocated
|
int _mp_den_alloc; /* Number of limbs allocated
|
||||||
for the denominator. */
|
for the denominator. */
|
||||||
long int den_size; /* Length of the denominator. (This field
|
int _mp_den_size; /* Length of the denominator. (This field
|
||||||
should always be positive.) */
|
should always be positive.) */
|
||||||
mp_ptr den; /* Pointer to the denominator limbs. */
|
mp_ptr _mp_den; /* Pointer to the denominator limbs. */
|
||||||
#endif
|
#endif
|
||||||
} __mpq_struct;
|
} __mpq_struct;
|
||||||
|
|
||||||
@ -111,17 +120,17 @@ typedef __mpq_struct mpq_t[1];
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
mp_size_t prec; /* Max precision, in number of `mp_limb's.
|
int _mp_prec; /* Max precision, in number of `mp_limb's.
|
||||||
Set by mpf_init and modified by
|
Set by mpf_init and modified by
|
||||||
mpf_set_prec. The area pointed to
|
mpf_set_prec. The area pointed to
|
||||||
by the `d' field contains `prec' + 1
|
by the `d' field contains `prec' + 1
|
||||||
limbs. */
|
limbs. */
|
||||||
mp_size_t size; /* abs(SIZE) is the number of limbs
|
int _mp_size; /* abs(SIZE) is the number of limbs
|
||||||
the last field points to. If SIZE
|
the last field points to. If SIZE
|
||||||
is negative this is a negative
|
is negative this is a negative
|
||||||
number. */
|
number. */
|
||||||
mp_exp_t exp; /* Exponent, in the base of `mp_limb'. */
|
mp_exp_t _mp_exp; /* Exponent, in the base of `mp_limb'. */
|
||||||
mp_limb *d; /* Pointer to the limbs. */
|
mp_limb *_mp_d; /* Pointer to the limbs. */
|
||||||
} __mpf_struct;
|
} __mpf_struct;
|
||||||
|
|
||||||
/* typedef __mpf_struct MP_FLOAT; */
|
/* typedef __mpf_struct MP_FLOAT; */
|
||||||
@ -136,36 +145,62 @@ typedef __mpf_struct *mpf_ptr;
|
|||||||
typedef __gmp_const __mpq_struct *mpq_srcptr;
|
typedef __gmp_const __mpq_struct *mpq_srcptr;
|
||||||
typedef __mpq_struct *mpq_ptr;
|
typedef __mpq_struct *mpq_ptr;
|
||||||
|
|
||||||
#if defined (__STDC__)
|
#ifndef _PROTO
|
||||||
|
#if defined (__STDC__) || defined (__cplusplus)
|
||||||
#define _PROTO(x) x
|
#define _PROTO(x) x
|
||||||
#else
|
#else
|
||||||
#define _PROTO(x) ()
|
#define _PROTO(x) ()
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __MPN
|
||||||
|
#define __MPN(x) __mpn_##x
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined (FILE) || defined (_STDIO_H_) || defined (__STDIO_H__) || defined (H_STDIO)
|
#if defined (FILE) || defined (_STDIO_H_) || defined (__STDIO_H__) || defined (H_STDIO)
|
||||||
#define _GMP_H_HAVE_FILE 1
|
#define _GMP_H_HAVE_FILE 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void mp_set_memory_functions _PROTO((void *(*) (size_t),
|
void mp_set_memory_functions _PROTO ((void *(*) (size_t),
|
||||||
void *(*) (void *, size_t, size_t),
|
void *(*) (void *, size_t, size_t),
|
||||||
void (*) (void *, size_t)));
|
void (*) (void *, size_t)));
|
||||||
|
|
||||||
/**************** Integer (i.e. Z) routines. ****************/
|
/**************** Integer (i.e. Z) routines. ****************/
|
||||||
|
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
void *_mpz_realloc _PROTO ((mpz_ptr, mp_size_t));
|
void *_mpz_realloc _PROTO ((mpz_ptr, mp_size_t));
|
||||||
|
|
||||||
void mpz_abs _PROTO ((mpz_ptr, mpz_srcptr));
|
void mpz_abs _PROTO ((mpz_ptr, mpz_srcptr));
|
||||||
void mpz_add _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
void mpz_add _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
||||||
void mpz_add_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
|
void mpz_add_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
|
||||||
void mpz_and _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
void mpz_and _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
||||||
|
void mpz_array_init _PROTO ((mpz_ptr, mp_size_t, mp_size_t));
|
||||||
|
void mpz_cdiv_q _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
||||||
|
unsigned long int mpz_cdiv_q_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
|
||||||
|
void mpz_cdiv_qr _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr));
|
||||||
|
unsigned long int mpz_cdiv_qr_ui _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int));
|
||||||
|
void mpz_cdiv_r _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
||||||
|
unsigned long int mpz_cdiv_r_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
|
||||||
|
unsigned long int mpz_cdiv_ui _PROTO ((mpz_srcptr, unsigned long int));
|
||||||
void mpz_clear _PROTO ((mpz_ptr));
|
void mpz_clear _PROTO ((mpz_ptr));
|
||||||
void mpz_clrbit _PROTO ((mpz_ptr, unsigned long int));
|
void mpz_clrbit _PROTO ((mpz_ptr, unsigned long int));
|
||||||
int mpz_cmp _PROTO ((mpz_srcptr, mpz_srcptr));
|
int mpz_cmp _PROTO ((mpz_srcptr, mpz_srcptr));
|
||||||
int mpz_cmp_si _PROTO ((mpz_srcptr, signed long int));
|
int mpz_cmp_si _PROTO ((mpz_srcptr, signed long int));
|
||||||
int mpz_cmp_ui _PROTO ((mpz_srcptr, unsigned long int));
|
int mpz_cmp_ui _PROTO ((mpz_srcptr, unsigned long int));
|
||||||
void mpz_com _PROTO ((mpz_ptr, mpz_srcptr));
|
void mpz_com _PROTO ((mpz_ptr, mpz_srcptr));
|
||||||
void mpz_div_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
|
void mpz_divexact _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
||||||
void mpz_fac_ui _PROTO ((mpz_ptr, unsigned long int));
|
void mpz_fac_ui _PROTO ((mpz_ptr, unsigned long int));
|
||||||
|
void mpz_fdiv_q _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
||||||
|
void mpz_fdiv_q_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
|
||||||
|
unsigned long int mpz_fdiv_q_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
|
||||||
|
void mpz_fdiv_qr _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr));
|
||||||
|
unsigned long int mpz_fdiv_qr_ui _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int));
|
||||||
|
void mpz_fdiv_r _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
||||||
|
void mpz_fdiv_r_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
|
||||||
|
unsigned long int mpz_fdiv_r_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
|
||||||
|
unsigned long int mpz_fdiv_ui _PROTO ((mpz_srcptr, unsigned long int));
|
||||||
void mpz_gcd _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
void mpz_gcd _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
||||||
unsigned long int mpz_gcd_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
|
unsigned long int mpz_gcd_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
|
||||||
void mpz_gcdext _PROTO ((mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr));
|
void mpz_gcdext _PROTO ((mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr));
|
||||||
@ -176,23 +211,27 @@ mp_limb mpz_getlimbn _PROTO ((mpz_srcptr, mp_size_t));
|
|||||||
mp_size_t mpz_hamdist _PROTO ((mpz_srcptr, mpz_srcptr));
|
mp_size_t mpz_hamdist _PROTO ((mpz_srcptr, mpz_srcptr));
|
||||||
void mpz_init _PROTO ((mpz_ptr));
|
void mpz_init _PROTO ((mpz_ptr));
|
||||||
#ifdef _GMP_H_HAVE_FILE
|
#ifdef _GMP_H_HAVE_FILE
|
||||||
void mpz_inp_raw _PROTO ((mpz_ptr, FILE *));
|
size_t mpz_inp_binary _PROTO ((mpz_ptr, FILE *));
|
||||||
int mpz_inp_str _PROTO ((mpz_ptr, FILE *, int));
|
size_t mpz_inp_raw _PROTO ((mpz_ptr, FILE *));
|
||||||
|
size_t mpz_inp_str _PROTO ((mpz_ptr, FILE *, int));
|
||||||
#endif
|
#endif
|
||||||
void mpz_ior _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
|
||||||
void mpz_init_set _PROTO ((mpz_ptr, mpz_srcptr));
|
void mpz_init_set _PROTO ((mpz_ptr, mpz_srcptr));
|
||||||
void mpz_init_set_si _PROTO ((mpz_ptr, signed long int));
|
void mpz_init_set_si _PROTO ((mpz_ptr, signed long int));
|
||||||
int mpz_init_set_str _PROTO ((mpz_ptr, const char *, int));
|
int mpz_init_set_str _PROTO ((mpz_ptr, const char *, int));
|
||||||
void mpz_init_set_ui _PROTO ((mpz_ptr, unsigned long int));
|
void mpz_init_set_ui _PROTO ((mpz_ptr, unsigned long int));
|
||||||
void mpz_lcm _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
int mpz_invert _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
||||||
void mpz_mod_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
|
void mpz_ior _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
||||||
|
int mpz_jacobi _PROTO ((mpz_srcptr, mpz_srcptr));
|
||||||
|
int mpz_legendre _PROTO ((mpz_srcptr, mpz_srcptr));
|
||||||
|
void mpz_mod _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
||||||
void mpz_mul _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
void mpz_mul _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
||||||
void mpz_mul_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
|
void mpz_mul_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
|
||||||
void mpz_mul_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
|
void mpz_mul_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
|
||||||
void mpz_neg _PROTO ((mpz_ptr, mpz_srcptr));
|
void mpz_neg _PROTO ((mpz_ptr, mpz_srcptr));
|
||||||
#ifdef _GMP_H_HAVE_FILE
|
#ifdef _GMP_H_HAVE_FILE
|
||||||
void mpz_out_raw _PROTO ((FILE *, mpz_srcptr));
|
size_t mpz_out_binary _PROTO ((FILE *, mpz_srcptr));
|
||||||
void mpz_out_str _PROTO ((FILE *, int, mpz_srcptr));
|
size_t mpz_out_raw _PROTO ((FILE *, mpz_srcptr));
|
||||||
|
size_t mpz_out_str _PROTO ((FILE *, int, mpz_srcptr));
|
||||||
#endif
|
#endif
|
||||||
int mpz_perfect_square_p _PROTO ((mpz_srcptr));
|
int mpz_perfect_square_p _PROTO ((mpz_srcptr));
|
||||||
mp_size_t mpz_popcount _PROTO ((mpz_srcptr));
|
mp_size_t mpz_popcount _PROTO ((mpz_srcptr));
|
||||||
@ -202,34 +241,30 @@ void mpz_powm_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int, mpz_srcptr));
|
|||||||
int mpz_probab_prime_p _PROTO ((mpz_srcptr, int));
|
int mpz_probab_prime_p _PROTO ((mpz_srcptr, int));
|
||||||
void mpz_random _PROTO ((mpz_ptr, mp_size_t));
|
void mpz_random _PROTO ((mpz_ptr, mp_size_t));
|
||||||
void mpz_random2 _PROTO ((mpz_ptr, mp_size_t));
|
void mpz_random2 _PROTO ((mpz_ptr, mp_size_t));
|
||||||
|
mp_size_t mpz_scan0 _PROTO ((mpz_srcptr, mp_size_t));
|
||||||
|
mp_size_t mpz_scan1 _PROTO ((mpz_srcptr, mp_size_t));
|
||||||
void mpz_set _PROTO ((mpz_ptr, mpz_srcptr));
|
void mpz_set _PROTO ((mpz_ptr, mpz_srcptr));
|
||||||
|
void mpz_set_d _PROTO ((mpz_ptr, double));
|
||||||
void mpz_set_si _PROTO ((mpz_ptr, signed long int));
|
void mpz_set_si _PROTO ((mpz_ptr, signed long int));
|
||||||
int mpz_set_str _PROTO ((mpz_ptr, const char *, int));
|
int mpz_set_str _PROTO ((mpz_ptr, const char *, int));
|
||||||
void mpz_set_ui _PROTO ((mpz_ptr, unsigned long int));
|
void mpz_set_ui _PROTO ((mpz_ptr, unsigned long int));
|
||||||
|
void mpz_setbit _PROTO ((mpz_ptr, unsigned long int));
|
||||||
size_t mpz_size _PROTO ((mpz_srcptr));
|
size_t mpz_size _PROTO ((mpz_srcptr));
|
||||||
size_t mpz_sizeinbase _PROTO ((mpz_srcptr, int));
|
size_t mpz_sizeinbase _PROTO ((mpz_srcptr, int));
|
||||||
void mpz_sqrt _PROTO ((mpz_ptr, mpz_srcptr));
|
void mpz_sqrt _PROTO ((mpz_ptr, mpz_srcptr));
|
||||||
void mpz_sqrtrem _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr));
|
void mpz_sqrtrem _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr));
|
||||||
void mpz_sub _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
void mpz_sub _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
||||||
void mpz_sub_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
|
void mpz_sub_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
|
||||||
|
void mpz_tdiv_q _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
||||||
|
void mpz_tdiv_q_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
|
||||||
|
void mpz_tdiv_q_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
|
||||||
|
void mpz_tdiv_qr _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr));
|
||||||
|
void mpz_tdiv_qr_ui _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int));
|
||||||
|
void mpz_tdiv_r _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
||||||
|
void mpz_tdiv_r_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
|
||||||
|
void mpz_tdiv_r_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int));
|
||||||
void mpz_ui_pow_ui _PROTO ((mpz_ptr, unsigned long int, unsigned long int));
|
void mpz_ui_pow_ui _PROTO ((mpz_ptr, unsigned long int, unsigned long int));
|
||||||
|
|
||||||
void mpz_fdiv_q _PROTO((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
|
||||||
unsigned long int mpz_fdiv_q_ui _PROTO((mpz_ptr, mpz_srcptr, unsigned long int));
|
|
||||||
void mpz_fdiv_qr _PROTO((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr));
|
|
||||||
unsigned long int mpz_fdiv_qr_ui _PROTO((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int));
|
|
||||||
void mpz_fdiv_r _PROTO((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
|
||||||
unsigned long int mpz_fdiv_r_ui _PROTO((mpz_ptr, mpz_srcptr, unsigned long int));
|
|
||||||
unsigned long int mpz_fdiv_ui _PROTO((mpz_srcptr, unsigned long int));
|
|
||||||
void mpz_tdiv_q _PROTO((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
|
||||||
void mpz_tdiv_q_ui _PROTO((mpz_ptr, mpz_srcptr, unsigned long int));
|
|
||||||
void mpz_tdiv_qr _PROTO((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr));
|
|
||||||
void mpz_tdiv_qr_ui _PROTO((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int));
|
|
||||||
void mpz_tdiv_r _PROTO((mpz_ptr, mpz_srcptr, mpz_srcptr));
|
|
||||||
void mpz_tdiv_r_ui _PROTO((mpz_ptr, mpz_srcptr, unsigned long int));
|
|
||||||
|
|
||||||
void mpz_array_init (mpz_ptr, size_t, mp_size_t);
|
|
||||||
|
|
||||||
/**************** Rational (i.e. Q) routines. ****************/
|
/**************** Rational (i.e. Q) routines. ****************/
|
||||||
|
|
||||||
void mpq_init _PROTO ((mpq_ptr));
|
void mpq_init _PROTO ((mpq_ptr));
|
||||||
@ -243,11 +278,14 @@ void mpq_mul _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr));
|
|||||||
void mpq_div _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr));
|
void mpq_div _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr));
|
||||||
void mpq_neg _PROTO ((mpq_ptr, mpq_srcptr));
|
void mpq_neg _PROTO ((mpq_ptr, mpq_srcptr));
|
||||||
int mpq_cmp _PROTO ((mpq_srcptr, mpq_srcptr));
|
int mpq_cmp _PROTO ((mpq_srcptr, mpq_srcptr));
|
||||||
|
int mpq_cmp_ui _PROTO ((mpq_srcptr, unsigned long int, unsigned long int));
|
||||||
void mpq_inv _PROTO ((mpq_ptr, mpq_srcptr));
|
void mpq_inv _PROTO ((mpq_ptr, mpq_srcptr));
|
||||||
void mpq_set_num _PROTO ((mpq_ptr, mpz_srcptr));
|
void mpq_set_num _PROTO ((mpq_ptr, mpz_srcptr));
|
||||||
void mpq_set_den _PROTO ((mpq_ptr, mpz_srcptr));
|
void mpq_set_den _PROTO ((mpq_ptr, mpz_srcptr));
|
||||||
void mpq_get_num _PROTO ((mpz_ptr, mpq_srcptr));
|
void mpq_get_num _PROTO ((mpz_ptr, mpq_srcptr));
|
||||||
void mpq_get_den _PROTO ((mpz_ptr, mpq_srcptr));
|
void mpq_get_den _PROTO ((mpz_ptr, mpq_srcptr));
|
||||||
|
double mpq_get_d _PROTO ((mpq_srcptr));
|
||||||
|
void mpq_canonicalize _PROTO ((mpq_ptr));
|
||||||
|
|
||||||
/**************** Float (i.e. F) routines. ****************/
|
/**************** Float (i.e. F) routines. ****************/
|
||||||
|
|
||||||
@ -256,8 +294,9 @@ void mpf_add _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
|
|||||||
void mpf_add_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
|
void mpf_add_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
|
||||||
void mpf_clear _PROTO ((mpf_ptr));
|
void mpf_clear _PROTO ((mpf_ptr));
|
||||||
int mpf_cmp _PROTO ((mpf_srcptr, mpf_srcptr));
|
int mpf_cmp _PROTO ((mpf_srcptr, mpf_srcptr));
|
||||||
int mpf_cmp_si _PROTO ((mpf_srcptr, long int));
|
int mpf_cmp_si _PROTO ((mpf_srcptr, signed long int));
|
||||||
int mpf_cmp_ui _PROTO ((mpf_srcptr, unsigned long int));
|
int mpf_cmp_ui _PROTO ((mpf_srcptr, unsigned long int));
|
||||||
|
int mpf_diff _PROTO ((mpf_srcptr, mpf_srcptr, unsigned long int));
|
||||||
void mpf_div _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
|
void mpf_div _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
|
||||||
void mpf_div_2exp _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
|
void mpf_div_2exp _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
|
||||||
void mpf_div_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
|
void mpf_div_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
|
||||||
@ -266,11 +305,11 @@ char *mpf_get_str _PROTO ((char *, mp_exp_t *, int, size_t, mpf_srcptr));
|
|||||||
void mpf_init _PROTO ((mpf_ptr));
|
void mpf_init _PROTO ((mpf_ptr));
|
||||||
void mpf_init2 _PROTO ((mpf_ptr, mp_size_t));
|
void mpf_init2 _PROTO ((mpf_ptr, mp_size_t));
|
||||||
#ifdef _GMP_H_HAVE_FILE
|
#ifdef _GMP_H_HAVE_FILE
|
||||||
void mpf_inp_str _PROTO ((mpf_ptr, FILE *, int));
|
size_t mpf_inp_str _PROTO ((mpf_ptr, FILE *, int));
|
||||||
#endif
|
#endif
|
||||||
void mpf_init_set _PROTO ((mpf_ptr, mpf_srcptr));
|
void mpf_init_set _PROTO ((mpf_ptr, mpf_srcptr));
|
||||||
void mpf_init_set_d _PROTO ((mpf_ptr, double));
|
void mpf_init_set_d _PROTO ((mpf_ptr, double));
|
||||||
void mpf_init_set_si _PROTO ((mpf_ptr, long int));
|
void mpf_init_set_si _PROTO ((mpf_ptr, signed long int));
|
||||||
int mpf_init_set_str _PROTO ((mpf_ptr, char *, int));
|
int mpf_init_set_str _PROTO ((mpf_ptr, char *, int));
|
||||||
void mpf_init_set_ui _PROTO ((mpf_ptr, unsigned long int));
|
void mpf_init_set_ui _PROTO ((mpf_ptr, unsigned long int));
|
||||||
void mpf_mul _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
|
void mpf_mul _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
|
||||||
@ -278,12 +317,14 @@ void mpf_mul_2exp _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
|
|||||||
void mpf_mul_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
|
void mpf_mul_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
|
||||||
void mpf_neg _PROTO ((mpf_ptr, mpf_srcptr));
|
void mpf_neg _PROTO ((mpf_ptr, mpf_srcptr));
|
||||||
#ifdef _GMP_H_HAVE_FILE
|
#ifdef _GMP_H_HAVE_FILE
|
||||||
void mpf_out_str _PROTO ((mpf_ptr, int, size_t, FILE *));
|
size_t mpf_out_str _PROTO ((FILE *, int, size_t, mpf_srcptr));
|
||||||
#endif
|
#endif
|
||||||
|
void mpf_random2 _PROTO ((mpf_ptr, mp_size_t, mp_size_t));
|
||||||
void mpf_set _PROTO ((mpf_ptr, mpf_srcptr));
|
void mpf_set _PROTO ((mpf_ptr, mpf_srcptr));
|
||||||
void mpf_set_d _PROTO ((mpf_ptr, double));
|
void mpf_set_d _PROTO ((mpf_ptr, double));
|
||||||
mp_size_t mpf_set_default_prec _PROTO ((mp_size_t));
|
mp_size_t mpf_set_default_prec _PROTO ((mp_size_t));
|
||||||
void mpf_set_si _PROTO ((mpf_ptr, long int));
|
void mpf_set_prec _PROTO ((mpf_ptr, mp_size_t));
|
||||||
|
void mpf_set_si _PROTO ((mpf_ptr, signed long int));
|
||||||
int mpf_set_str _PROTO ((mpf_ptr, const char *, int));
|
int mpf_set_str _PROTO ((mpf_ptr, const char *, int));
|
||||||
void mpf_set_ui _PROTO ((mpf_ptr, unsigned long int));
|
void mpf_set_ui _PROTO ((mpf_ptr, unsigned long int));
|
||||||
size_t mpf_size _PROTO ((mpf_srcptr));
|
size_t mpf_size _PROTO ((mpf_srcptr));
|
||||||
@ -292,68 +333,93 @@ void mpf_sqrt_ui _PROTO ((mpf_ptr, unsigned long int));
|
|||||||
void mpf_sub _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
|
void mpf_sub _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr));
|
||||||
void mpf_sub_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
|
void mpf_sub_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int));
|
||||||
void mpf_ui_div _PROTO ((mpf_ptr, unsigned long int, mpf_srcptr));
|
void mpf_ui_div _PROTO ((mpf_ptr, unsigned long int, mpf_srcptr));
|
||||||
|
void mpf_ui_sub _PROTO ((mpf_ptr, unsigned long int, mpf_srcptr));
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
/************ Low level positive-integer (i.e. N) routines. ************/
|
/************ Low level positive-integer (i.e. N) routines. ************/
|
||||||
|
|
||||||
/* This is ugly, but we need to make usr calls reach the prefixed function. */
|
/* This is ugly, but we need to make usr calls reach the prefixed function. */
|
||||||
#define mpn_add_n __mpn_add_n
|
#define mpn_add __MPN(add)
|
||||||
#define mpn_sub_n __mpn_sub_n
|
#define mpn_add_1 __MPN(add_1)
|
||||||
#define mpn_mul_1 __mpn_mul_1
|
#define mpn_add_n __MPN(add_n)
|
||||||
#define mpn_addmul_1 __mpn_addmul_1
|
#define mpn_addmul_1 __MPN(addmul_1)
|
||||||
#define mpn_submul_1 __mpn_submul_1
|
#define mpn_bdivmod __MPN(bdivmod)
|
||||||
#define mpn_lshift __mpn_lshift
|
#define mpn_cmp __MPN(cmp)
|
||||||
#define mpn_rshift __mpn_rshift
|
#define mpn_divmod_1 __MPN(divmod_1)
|
||||||
#define mpn_sub __mpn_sub
|
#define mpn_divrem __MPN(divrem)
|
||||||
#define mpn_add __mpn_add
|
#define mpn_divrem_1 __MPN(divrem_1)
|
||||||
#define mpn_normal_size __mpn_normal_size
|
#define mpn_dump __MPN(dump)
|
||||||
#define mpn_cmp __mpn_cmp
|
#define mpn_gcd __MPN(gcd)
|
||||||
#define mpn_add_1 __mpn_add_1
|
#define mpn_gcd_1 __MPN(gcd_1)
|
||||||
#define mpn_sub_1 __mpn_sub_1
|
#define mpn_gcdext __MPN(gcdext)
|
||||||
#define mpn_mul_n __mpn_mul_n
|
#define mpn_get_str __MPN(get_str)
|
||||||
#define mpn_mul __mpn_mul
|
#define mpn_hamdist __MPN(hamdist)
|
||||||
#define mpn_divmod __mpn_divmod
|
#define mpn_lshift __MPN(lshift)
|
||||||
#define mpn_divmod_1 __mpn_divmod_1
|
#define mpn_mod_1 __MPN(mod_1)
|
||||||
#define mpn_mod_1 __mpn_mod_1
|
#define mpn_mul __MPN(mul)
|
||||||
#define mpn_sqrt __mpn_sqrt
|
#define mpn_mul_1 __MPN(mul_1)
|
||||||
#define mpn_next_bit_set __mpn_next_bit_set
|
#define mpn_mul_n __MPN(mul_n)
|
||||||
#define mpn_popcount __mpn_popcount
|
#define mpn_perfect_square_p __MPN(perfect_square_p)
|
||||||
#define mpn_hamdist __mpn_hamdist
|
#define mpn_popcount __MPN(popcount)
|
||||||
#define mpn_random2 __mpn_random2
|
#define mpn_preinv_mod_1 __MPN(preinv_mod_1)
|
||||||
#define mpn_set_str __mpn_set_str
|
#define mpn_random2 __MPN(random2)
|
||||||
#define mpn_get_str __mpn_get_str
|
#define mpn_rshift __MPN(rshift)
|
||||||
#define mpn_gcd_1 __mpn_gcd_1
|
#define mpn_scan0 __MPN(scan0)
|
||||||
|
#define mpn_scan1 __MPN(scan1)
|
||||||
|
#define mpn_set_str __MPN(set_str)
|
||||||
|
#define mpn_sqrtrem __MPN(sqrtrem)
|
||||||
|
#define mpn_sub __MPN(sub)
|
||||||
|
#define mpn_sub_1 __MPN(sub_1)
|
||||||
|
#define mpn_sub_n __MPN(sub_n)
|
||||||
|
#define mpn_submul_1 __MPN(submul_1)
|
||||||
|
#define mpn_udiv_w_sdiv __MPN(udiv_w_sdiv)
|
||||||
|
|
||||||
mp_limb __mpn_add_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
|
#if defined (__cplusplus)
|
||||||
mp_limb __mpn_sub_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
|
extern "C" {
|
||||||
mp_limb __mpn_mul _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t));
|
#endif
|
||||||
void __mpn_mul_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
|
mp_limb mpn_add_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
|
||||||
mp_limb __mpn_mul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb));
|
mp_limb mpn_addmul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb));
|
||||||
mp_limb __mpn_addmul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb));
|
mp_limb mpn_bdivmod _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, unsigned long int));
|
||||||
mp_limb __mpn_submul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb));
|
int mpn_cmp _PROTO ((mp_srcptr, mp_srcptr, mp_size_t));
|
||||||
mp_limb __mpn_divmod _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t));
|
mp_limb mpn_divmod_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb));
|
||||||
mp_limb __mpn_divmod_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb));
|
mp_limb mpn_divrem _PROTO ((mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr, mp_size_t));
|
||||||
mp_limb __mpn_mod_1 _PROTO ((mp_srcptr, mp_size_t, mp_limb));
|
mp_limb mpn_divrem_1 _PROTO ((mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb));
|
||||||
mp_limb __mpn_lshift _PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int));
|
void mpn_dump _PROTO ((mp_srcptr, mp_size_t));
|
||||||
mp_limb __mpn_rshift _PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int));
|
mp_size_t mpn_gcd _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t));
|
||||||
mp_size_t __mpn_sqrt _PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t));
|
mp_limb mpn_gcd_1 _PROTO ((mp_srcptr, mp_size_t, mp_limb));
|
||||||
int __mpn_cmp _PROTO ((mp_srcptr, mp_srcptr, mp_size_t));
|
mp_size_t mpn_gcdext _PROTO ((mp_ptr, mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t));
|
||||||
mp_size_t __mpn_next_bit_set _PROTO ((mp_srcptr, mp_size_t));
|
size_t mpn_get_str _PROTO ((unsigned char *, int, mp_ptr, mp_size_t));
|
||||||
mp_size_t __mpn_popcount _PROTO ((mp_srcptr, mp_size_t));
|
mp_size_t mpn_hamdist _PROTO ((mp_srcptr, mp_srcptr, mp_size_t));
|
||||||
mp_size_t __mpn_hamdist _PROTO ((mp_srcptr, mp_srcptr, mp_size_t));
|
mp_limb mpn_lshift _PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int));
|
||||||
void __mpn_random2 _PROTO ((mp_ptr, mp_size_t));
|
mp_limb mpn_mod_1 _PROTO ((mp_srcptr, mp_size_t, mp_limb));
|
||||||
mp_size_t __mpn_set_str _PROTO ((mp_ptr, const unsigned char *, size_t, int));
|
mp_limb mpn_mul _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t));
|
||||||
size_t __mpn_get_str _PROTO ((unsigned char *, int, mp_ptr, mp_size_t));
|
mp_limb mpn_mul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb));
|
||||||
mp_limb __mpn_gcd_1 _PROTO ((mp_srcptr, mp_size_t, mp_limb));
|
void mpn_mul_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
|
||||||
|
int mpn_perfect_square_p _PROTO ((mp_srcptr, mp_size_t));
|
||||||
|
mp_size_t mpn_popcount _PROTO ((mp_srcptr, mp_size_t));
|
||||||
|
mp_limb mpn_preinv_mod_1 _PROTO ((mp_srcptr, mp_size_t, mp_limb, mp_limb));
|
||||||
|
void mpn_random2 _PROTO ((mp_ptr, mp_size_t));
|
||||||
|
mp_limb mpn_rshift _PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int));
|
||||||
|
mp_size_t mpn_scan0 _PROTO ((mp_srcptr, mp_size_t));
|
||||||
|
mp_size_t mpn_scan1 _PROTO ((mp_srcptr, mp_size_t));
|
||||||
|
mp_size_t mpn_set_str _PROTO ((mp_ptr, const unsigned char *, size_t, int));
|
||||||
|
mp_size_t mpn_sqrtrem _PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t));
|
||||||
|
mp_limb mpn_sub_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t));
|
||||||
|
mp_limb mpn_submul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb));
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (__GNUC__) || defined (_FORCE_INLINES)
|
||||||
static __gmp_inline mp_limb
|
_EXTERN_INLINE mp_limb
|
||||||
#if defined (__STDC__)
|
#if defined (__STDC__) || defined (__cplusplus)
|
||||||
__mpn_add_1 (register mp_ptr res_ptr,
|
mpn_add_1 (register mp_ptr res_ptr,
|
||||||
register mp_srcptr s1_ptr,
|
register mp_srcptr s1_ptr,
|
||||||
register mp_size_t s1_size,
|
register mp_size_t s1_size,
|
||||||
register mp_limb s2_limb)
|
register mp_limb s2_limb)
|
||||||
#else
|
#else
|
||||||
__mpn_add_1 (res_ptr, s1_ptr, s1_size, s2_limb)
|
mpn_add_1 (res_ptr, s1_ptr, s1_size, s2_limb)
|
||||||
register mp_ptr res_ptr;
|
register mp_ptr res_ptr;
|
||||||
register mp_srcptr s1_ptr;
|
register mp_srcptr s1_ptr;
|
||||||
register mp_size_t s1_size;
|
register mp_size_t s1_size;
|
||||||
@ -388,15 +454,15 @@ __mpn_add_1 (res_ptr, s1_ptr, s1_size, s2_limb)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __gmp_inline mp_limb
|
_EXTERN_INLINE mp_limb
|
||||||
#if defined (__STDC__)
|
#if defined (__STDC__) || defined (__cplusplus)
|
||||||
__mpn_add (register mp_ptr res_ptr,
|
mpn_add (register mp_ptr res_ptr,
|
||||||
register mp_srcptr s1_ptr,
|
register mp_srcptr s1_ptr,
|
||||||
register mp_size_t s1_size,
|
register mp_size_t s1_size,
|
||||||
register mp_srcptr s2_ptr,
|
register mp_srcptr s2_ptr,
|
||||||
register mp_size_t s2_size)
|
register mp_size_t s2_size)
|
||||||
#else
|
#else
|
||||||
__mpn_add (res_ptr, s1_ptr, s1_size, s2_ptr, s2_size)
|
mpn_add (res_ptr, s1_ptr, s1_size, s2_ptr, s2_size)
|
||||||
register mp_ptr res_ptr;
|
register mp_ptr res_ptr;
|
||||||
register mp_srcptr s1_ptr;
|
register mp_srcptr s1_ptr;
|
||||||
register mp_size_t s1_size;
|
register mp_size_t s1_size;
|
||||||
@ -407,24 +473,24 @@ __mpn_add (res_ptr, s1_ptr, s1_size, s2_ptr, s2_size)
|
|||||||
mp_limb cy_limb = 0;
|
mp_limb cy_limb = 0;
|
||||||
|
|
||||||
if (s2_size != 0)
|
if (s2_size != 0)
|
||||||
cy_limb = __mpn_add_n (res_ptr, s1_ptr, s2_ptr, s2_size);
|
cy_limb = mpn_add_n (res_ptr, s1_ptr, s2_ptr, s2_size);
|
||||||
|
|
||||||
if (s1_size - s2_size != 0)
|
if (s1_size - s2_size != 0)
|
||||||
cy_limb = __mpn_add_1 (res_ptr + s2_size,
|
cy_limb = mpn_add_1 (res_ptr + s2_size,
|
||||||
s1_ptr + s2_size,
|
s1_ptr + s2_size,
|
||||||
s1_size - s2_size,
|
s1_size - s2_size,
|
||||||
cy_limb);
|
cy_limb);
|
||||||
return cy_limb;
|
return cy_limb;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __gmp_inline mp_limb
|
_EXTERN_INLINE mp_limb
|
||||||
#if defined (__STDC__)
|
#if defined (__STDC__) || defined (__cplusplus)
|
||||||
__mpn_sub_1 (register mp_ptr res_ptr,
|
mpn_sub_1 (register mp_ptr res_ptr,
|
||||||
register mp_srcptr s1_ptr,
|
register mp_srcptr s1_ptr,
|
||||||
register mp_size_t s1_size,
|
register mp_size_t s1_size,
|
||||||
register mp_limb s2_limb)
|
register mp_limb s2_limb)
|
||||||
#else
|
#else
|
||||||
__mpn_sub_1 (res_ptr, s1_ptr, s1_size, s2_limb)
|
mpn_sub_1 (res_ptr, s1_ptr, s1_size, s2_limb)
|
||||||
register mp_ptr res_ptr;
|
register mp_ptr res_ptr;
|
||||||
register mp_srcptr s1_ptr;
|
register mp_srcptr s1_ptr;
|
||||||
register mp_size_t s1_size;
|
register mp_size_t s1_size;
|
||||||
@ -459,15 +525,15 @@ __mpn_sub_1 (res_ptr, s1_ptr, s1_size, s2_limb)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __gmp_inline mp_limb
|
_EXTERN_INLINE mp_limb
|
||||||
#if defined (__STDC__)
|
#if defined (__STDC__) || defined (__cplusplus)
|
||||||
__mpn_sub (register mp_ptr res_ptr,
|
mpn_sub (register mp_ptr res_ptr,
|
||||||
register mp_srcptr s1_ptr,
|
register mp_srcptr s1_ptr,
|
||||||
register mp_size_t s1_size,
|
register mp_size_t s1_size,
|
||||||
register mp_srcptr s2_ptr,
|
register mp_srcptr s2_ptr,
|
||||||
register mp_size_t s2_size)
|
register mp_size_t s2_size)
|
||||||
#else
|
#else
|
||||||
__mpn_sub (res_ptr, s1_ptr, s1_size, s2_ptr, s2_size)
|
mpn_sub (res_ptr, s1_ptr, s1_size, s2_ptr, s2_size)
|
||||||
register mp_ptr res_ptr;
|
register mp_ptr res_ptr;
|
||||||
register mp_srcptr s1_ptr;
|
register mp_srcptr s1_ptr;
|
||||||
register mp_size_t s1_size;
|
register mp_size_t s1_size;
|
||||||
@ -478,36 +544,46 @@ __mpn_sub (res_ptr, s1_ptr, s1_size, s2_ptr, s2_size)
|
|||||||
mp_limb cy_limb = 0;
|
mp_limb cy_limb = 0;
|
||||||
|
|
||||||
if (s2_size != 0)
|
if (s2_size != 0)
|
||||||
cy_limb = __mpn_sub_n (res_ptr, s1_ptr, s2_ptr, s2_size);
|
cy_limb = mpn_sub_n (res_ptr, s1_ptr, s2_ptr, s2_size);
|
||||||
|
|
||||||
if (s1_size - s2_size != 0)
|
if (s1_size - s2_size != 0)
|
||||||
cy_limb = __mpn_sub_1 (res_ptr + s2_size,
|
cy_limb = mpn_sub_1 (res_ptr + s2_size,
|
||||||
s1_ptr + s2_size,
|
s1_ptr + s2_size,
|
||||||
s1_size - s2_size,
|
s1_size - s2_size,
|
||||||
cy_limb);
|
cy_limb);
|
||||||
return cy_limb;
|
return cy_limb;
|
||||||
}
|
}
|
||||||
|
#endif /* __GNUC__ */
|
||||||
|
|
||||||
static __gmp_inline mp_size_t
|
/* Allow faster testing for negative, zero, and positive. */
|
||||||
#if defined (__STDC__)
|
#define mpz_sign(Z) ((Z)->_mp_size)
|
||||||
__mpn_normal_size (mp_srcptr ptr, mp_size_t size)
|
#define mpf_sign(F) ((F)->_mp_size)
|
||||||
#else
|
#define mpq_sign(Q) ((Q)->_mp_num._mp_size)
|
||||||
__mpn_normal_size (ptr, size)
|
|
||||||
mp_srcptr ptr;
|
/* Allow direct user access to numerator and denominator of a mpq_t object. */
|
||||||
mp_size_t size;
|
#define mpq_numref(Q) (&((Q)->_mp_num))
|
||||||
|
#define mpq_denref(Q) (&((Q)->_mp_den))
|
||||||
|
|
||||||
|
/* When using GCC, optimize certain common comparisons. */
|
||||||
|
#if defined (__GNUC__)
|
||||||
|
#define mpz_cmp_ui(Z,UI) \
|
||||||
|
(__builtin_constant_p (UI) && (UI) == 0 \
|
||||||
|
? mpz_sign (Z) : mpz_cmp_ui (Z,UI))
|
||||||
|
#define mpz_cmp_si(Z,UI) \
|
||||||
|
(__builtin_constant_p (UI) && (UI) == 0 ? mpz_sign (Z) \
|
||||||
|
: __builtin_constant_p (UI) && (UI) > 0 ? mpz_cmp_ui (Z,UI) \
|
||||||
|
: mpz_cmp_si (Z,UI))
|
||||||
|
#define mpq_cmp_ui(Q,NUI,DUI) \
|
||||||
|
(__builtin_constant_p (NUI) && (NUI) == 0 \
|
||||||
|
? mpq_sign (Q) : mpq_cmp_ui (Q,NUI,DUI))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define mpn_divmod(qp,np,nsize,dp,dsize) mpn_divrem (qp,0,np,nsize,dp,dsize)
|
||||||
|
#if 0
|
||||||
|
#define mpn_divmod_1(qp,np,nsize,dlimb) mpn_divrem_1 (qp,0,np,nsize,dlimb)
|
||||||
#endif
|
#endif
|
||||||
{
|
|
||||||
while (size)
|
|
||||||
{
|
|
||||||
size--;
|
|
||||||
if (ptr[size] != 0)
|
|
||||||
return size + 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Compatibility with GMP 1. */
|
/* Compatibility with GMP 1. */
|
||||||
|
|
||||||
#define mpz_mdiv mpz_fdiv_q
|
#define mpz_mdiv mpz_fdiv_q
|
||||||
#define mpz_mdivmod mpz_fdiv_qr
|
#define mpz_mdivmod mpz_fdiv_qr
|
||||||
#define mpz_mmod mpz_fdiv_r
|
#define mpz_mmod mpz_fdiv_r
|
||||||
@ -516,10 +592,6 @@ __mpn_normal_size (ptr, size)
|
|||||||
((r == 0) ? mpz_fdiv_q_ui (q,n,d) : mpz_fdiv_qr_ui (q,r,n,d))
|
((r == 0) ? mpz_fdiv_q_ui (q,n,d) : mpz_fdiv_qr_ui (q,r,n,d))
|
||||||
#define mpz_mmod_ui(r,n,d) \
|
#define mpz_mmod_ui(r,n,d) \
|
||||||
((r == 0) ? mpz_fdiv_ui (n,d) : mpz_fdiv_r_ui (r,n,d))
|
((r == 0) ? mpz_fdiv_ui (n,d) : mpz_fdiv_r_ui (r,n,d))
|
||||||
/* ??? Before release...
|
|
||||||
#define mpz_div_2exp mpz_fdiv_q_2exp
|
|
||||||
#define mpz_mod_2exp mpz_fdiv_r_2exp
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Useful synonyms, but not quite compatible with GMP 1. */
|
/* Useful synonyms, but not quite compatible with GMP 1. */
|
||||||
#define mpz_div mpz_fdiv_q
|
#define mpz_div mpz_fdiv_q
|
||||||
@ -527,10 +599,10 @@ __mpn_normal_size (ptr, size)
|
|||||||
#define mpz_div_ui mpz_fdiv_q_ui
|
#define mpz_div_ui mpz_fdiv_q_ui
|
||||||
#define mpz_divmod_ui mpz_fdiv_qr_ui
|
#define mpz_divmod_ui mpz_fdiv_qr_ui
|
||||||
#define mpz_mod_ui mpz_fdiv_r_ui
|
#define mpz_mod_ui mpz_fdiv_r_ui
|
||||||
|
#define mpz_div_2exp mpz_fdiv_q_2exp
|
||||||
|
#define mpz_mod_2exp mpz_fdiv_r_2exp
|
||||||
|
|
||||||
|
|
||||||
#define __GNU_MP__ 2
|
|
||||||
#define __GNU_MP_VERSION 2
|
#define __GNU_MP_VERSION 2
|
||||||
#define __GNU_MP_VERSION_MINOR -900 /* ??? */
|
#define __GNU_MP_VERSION_MINOR -927 /* ??? */
|
||||||
#define __GMP_H__
|
#define __GMP_H__
|
||||||
#endif /* __GMP_H__ */
|
#endif /* __GMP_H__ */
|
||||||
|
@ -36,6 +36,10 @@ Cambridge, MA 02139, USA. */
|
|||||||
#include "../locale/localeinfo.h"
|
#include "../locale/localeinfo.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* The gmp headers need some configuration frobs. */
|
||||||
|
#define HAVE_ALLOCA 1
|
||||||
|
|
||||||
#include "gmp.h"
|
#include "gmp.h"
|
||||||
#include "gmp-impl.h"
|
#include "gmp-impl.h"
|
||||||
#include <gmp-mparam.h>
|
#include <gmp-mparam.h>
|
||||||
|
@ -26,16 +26,7 @@
|
|||||||
# size r18
|
# size r18
|
||||||
# s2_limb r19
|
# s2_limb r19
|
||||||
|
|
||||||
# This code runs at 42 cycles/limb on the 21064.
|
# This code runs at 42 cycles/limb on EV4 and 18 cycles/limb on EV5.
|
||||||
|
|
||||||
# To improve performance for long multiplications, we would use
|
|
||||||
# 'fetch' for S1 and 'fetch_m' for RES. It's not obvious how to use
|
|
||||||
# these instructions without slowing down the general code: 1. We can
|
|
||||||
# only have two prefetches in operation at any time in the Alpha
|
|
||||||
# architecture. 2. There will seldom be any special alignment
|
|
||||||
# between RES_PTR and S1_PTR. Maybe we can simply divide the current
|
|
||||||
# loop into an inner and outer loop, having the inner loop handle
|
|
||||||
# exactly one prefetch block?
|
|
||||||
|
|
||||||
.set noreorder
|
.set noreorder
|
||||||
.set noat
|
.set noat
|
||||||
@ -52,7 +43,7 @@ __mpn_addmul_1:
|
|||||||
mulq $2,$19,$3 # $3 = prod_low
|
mulq $2,$19,$3 # $3 = prod_low
|
||||||
ldq $5,0($16) # $5 = *res_ptr
|
ldq $5,0($16) # $5 = *res_ptr
|
||||||
umulh $2,$19,$0 # $0 = prod_high
|
umulh $2,$19,$0 # $0 = prod_high
|
||||||
beq $18,Lend1 # jump if size was == 1
|
beq $18,.Lend1 # jump if size was == 1
|
||||||
ldq $2,0($17) # $2 = s1_limb
|
ldq $2,0($17) # $2 = s1_limb
|
||||||
addq $17,8,$17 # s1_ptr++
|
addq $17,8,$17 # s1_ptr++
|
||||||
subq $18,1,$18 # size--
|
subq $18,1,$18 # size--
|
||||||
@ -60,10 +51,10 @@ __mpn_addmul_1:
|
|||||||
cmpult $3,$5,$4
|
cmpult $3,$5,$4
|
||||||
stq $3,0($16)
|
stq $3,0($16)
|
||||||
addq $16,8,$16 # res_ptr++
|
addq $16,8,$16 # res_ptr++
|
||||||
beq $18,Lend2 # jump if size was == 2
|
beq $18,.Lend2 # jump if size was == 2
|
||||||
|
|
||||||
.align 3
|
.align 3
|
||||||
Loop: mulq $2,$19,$3 # $3 = prod_low
|
.Loop: mulq $2,$19,$3 # $3 = prod_low
|
||||||
ldq $5,0($16) # $5 = *res_ptr
|
ldq $5,0($16) # $5 = *res_ptr
|
||||||
addq $4,$0,$0 # cy_limb = cy_limb + 'cy'
|
addq $4,$0,$0 # cy_limb = cy_limb + 'cy'
|
||||||
subq $18,1,$18 # size--
|
subq $18,1,$18 # size--
|
||||||
@ -77,9 +68,9 @@ Loop: mulq $2,$19,$3 # $3 = prod_low
|
|||||||
stq $3,0($16)
|
stq $3,0($16)
|
||||||
addq $16,8,$16 # res_ptr++
|
addq $16,8,$16 # res_ptr++
|
||||||
addq $5,$0,$0 # combine carries
|
addq $5,$0,$0 # combine carries
|
||||||
bne $18,Loop
|
bne $18,.Loop
|
||||||
|
|
||||||
Lend2: mulq $2,$19,$3 # $3 = prod_low
|
.Lend2: mulq $2,$19,$3 # $3 = prod_low
|
||||||
ldq $5,0($16) # $5 = *res_ptr
|
ldq $5,0($16) # $5 = *res_ptr
|
||||||
addq $4,$0,$0 # cy_limb = cy_limb + 'cy'
|
addq $4,$0,$0 # cy_limb = cy_limb + 'cy'
|
||||||
umulh $2,$19,$4 # $4 = cy_limb
|
umulh $2,$19,$4 # $4 = cy_limb
|
||||||
@ -91,7 +82,7 @@ Lend2: mulq $2,$19,$3 # $3 = prod_low
|
|||||||
addq $5,$0,$0 # combine carries
|
addq $5,$0,$0 # combine carries
|
||||||
addq $4,$0,$0 # cy_limb = prod_high + cy
|
addq $4,$0,$0 # cy_limb = prod_high + cy
|
||||||
ret $31,($26),1
|
ret $31,($26),1
|
||||||
Lend1: addq $5,$3,$3
|
.Lend1: addq $5,$3,$3
|
||||||
cmpult $3,$5,$5
|
cmpult $3,$5,$5
|
||||||
stq $3,0($16)
|
stq $3,0($16)
|
||||||
addq $0,$5,$0
|
addq $0,$5,$0
|
||||||
|
@ -35,84 +35,113 @@
|
|||||||
__mpn_add_n:
|
__mpn_add_n:
|
||||||
.frame $30,0,$26,0
|
.frame $30,0,$26,0
|
||||||
|
|
||||||
ldq $3,0($17)
|
or $31,$31,$25 # clear cy
|
||||||
ldq $4,0($18)
|
subq $19,4,$19 # decr loop cnt
|
||||||
|
blt $19,.Lend2 # if less than 4 limbs, goto 2nd loop
|
||||||
subq $19,1,$19
|
# Start software pipeline for 1st loop
|
||||||
and $19,4-1,$2 # number of limbs in first loop
|
ldq $0,0($18)
|
||||||
bis $31,$31,$0
|
ldq $1,8($18)
|
||||||
beq $2,.L0 # if multiple of 4 limbs, skip first loop
|
ldq $4,0($17)
|
||||||
|
|
||||||
subq $19,$2,$19
|
|
||||||
|
|
||||||
.Loop0: subq $2,1,$2
|
|
||||||
ldq $5,8($17)
|
ldq $5,8($17)
|
||||||
addq $4,$0,$4
|
addq $17,32,$17 # update s1_ptr
|
||||||
ldq $6,8($18)
|
ldq $2,16($18)
|
||||||
cmpult $4,$0,$1
|
addq $0,$4,$20 # 1st main add
|
||||||
addq $3,$4,$4
|
ldq $3,24($18)
|
||||||
cmpult $4,$3,$0
|
subq $19,4,$19 # decr loop cnt
|
||||||
stq $4,0($16)
|
ldq $6,-16($17)
|
||||||
or $0,$1,$0
|
cmpult $20,$0,$25 # compute cy from last add
|
||||||
|
ldq $7,-8($17)
|
||||||
addq $17,8,$17
|
addq $1,$25,$28 # cy add
|
||||||
addq $18,8,$18
|
addq $18,32,$18 # update s2_ptr
|
||||||
bis $5,$5,$3
|
addq $5,$28,$21 # 2nd main add
|
||||||
bis $6,$6,$4
|
cmpult $28,$25,$8 # compute cy from last add
|
||||||
addq $16,8,$16
|
blt $19,.Lend1 # if less than 4 limbs remain, jump
|
||||||
bne $2,.Loop0
|
# 1st loop handles groups of 4 limbs in a software pipeline
|
||||||
|
|
||||||
.L0: beq $19,.Lend
|
|
||||||
|
|
||||||
.align 4
|
.align 4
|
||||||
.Loop: subq $19,4,$19
|
.Loop: cmpult $21,$28,$25 # compute cy from last add
|
||||||
unop
|
ldq $0,0($18)
|
||||||
|
or $8,$25,$25 # combine cy from the two adds
|
||||||
ldq $6,8($18)
|
ldq $1,8($18)
|
||||||
addq $4,$0,$0
|
addq $2,$25,$28 # cy add
|
||||||
|
ldq $4,0($17)
|
||||||
|
addq $28,$6,$22 # 3rd main add
|
||||||
ldq $5,8($17)
|
ldq $5,8($17)
|
||||||
cmpult $0,$4,$1
|
cmpult $28,$25,$8 # compute cy from last add
|
||||||
ldq $4,16($18)
|
cmpult $22,$28,$25 # compute cy from last add
|
||||||
addq $3,$0,$20
|
|
||||||
cmpult $20,$3,$0
|
|
||||||
ldq $3,16($17)
|
|
||||||
or $0,$1,$0
|
|
||||||
addq $6,$0,$0
|
|
||||||
cmpult $0,$6,$1
|
|
||||||
ldq $6,24($18)
|
|
||||||
addq $5,$0,$21
|
|
||||||
cmpult $21,$5,$0
|
|
||||||
ldq $5,24($17)
|
|
||||||
or $0,$1,$0
|
|
||||||
addq $4,$0,$0
|
|
||||||
cmpult $0,$4,$1
|
|
||||||
ldq $4,32($18)
|
|
||||||
addq $3,$0,$22
|
|
||||||
cmpult $22,$3,$0
|
|
||||||
ldq $3,32($17)
|
|
||||||
or $0,$1,$0
|
|
||||||
addq $6,$0,$0
|
|
||||||
cmpult $0,$6,$1
|
|
||||||
addq $5,$0,$23
|
|
||||||
cmpult $23,$5,$0
|
|
||||||
or $0,$1,$0
|
|
||||||
|
|
||||||
stq $20,0($16)
|
stq $20,0($16)
|
||||||
|
or $8,$25,$25 # combine cy from the two adds
|
||||||
stq $21,8($16)
|
stq $21,8($16)
|
||||||
stq $22,16($16)
|
addq $3,$25,$28 # cy add
|
||||||
stq $23,24($16)
|
addq $28,$7,$23 # 4th main add
|
||||||
|
cmpult $28,$25,$8 # compute cy from last add
|
||||||
|
cmpult $23,$28,$25 # compute cy from last add
|
||||||
|
addq $17,32,$17 # update s1_ptr
|
||||||
|
or $8,$25,$25 # combine cy from the two adds
|
||||||
|
addq $16,32,$16 # update res_ptr
|
||||||
|
addq $0,$25,$28 # cy add
|
||||||
|
ldq $2,16($18)
|
||||||
|
addq $4,$28,$20 # 1st main add
|
||||||
|
ldq $3,24($18)
|
||||||
|
cmpult $28,$25,$8 # compute cy from last add
|
||||||
|
ldq $6,-16($17)
|
||||||
|
cmpult $20,$28,$25 # compute cy from last add
|
||||||
|
ldq $7,-8($17)
|
||||||
|
or $8,$25,$25 # combine cy from the two adds
|
||||||
|
subq $19,4,$19 # decr loop cnt
|
||||||
|
stq $22,-16($16)
|
||||||
|
addq $1,$25,$28 # cy add
|
||||||
|
stq $23,-8($16)
|
||||||
|
addq $5,$28,$21 # 2nd main add
|
||||||
|
addq $18,32,$18 # update s2_ptr
|
||||||
|
cmpult $28,$25,$8 # compute cy from last add
|
||||||
|
bge $19,.Loop
|
||||||
|
# Finish software pipeline for 1st loop
|
||||||
|
.Lend1: cmpult $21,$28,$25 # compute cy from last add
|
||||||
|
or $8,$25,$25 # combine cy from the two adds
|
||||||
|
addq $2,$25,$28 # cy add
|
||||||
|
addq $28,$6,$22 # 3rd main add
|
||||||
|
cmpult $28,$25,$8 # compute cy from last add
|
||||||
|
cmpult $22,$28,$25 # compute cy from last add
|
||||||
|
stq $20,0($16)
|
||||||
|
or $8,$25,$25 # combine cy from the two adds
|
||||||
|
stq $21,8($16)
|
||||||
|
addq $3,$25,$28 # cy add
|
||||||
|
addq $28,$7,$23 # 4th main add
|
||||||
|
cmpult $28,$25,$8 # compute cy from last add
|
||||||
|
cmpult $23,$28,$25 # compute cy from last add
|
||||||
|
or $8,$25,$25 # combine cy from the two adds
|
||||||
|
addq $16,32,$16 # update res_ptr
|
||||||
|
stq $22,-16($16)
|
||||||
|
stq $23,-8($16)
|
||||||
|
.Lend2: addq $19,4,$19 # restore loop cnt
|
||||||
|
beq $19,.Lret
|
||||||
|
# Start software pipeline for 2nd loop
|
||||||
|
ldq $0,0($18)
|
||||||
|
ldq $4,0($17)
|
||||||
|
subq $19,1,$19
|
||||||
|
beq $19,.Lend0
|
||||||
|
# 2nd loop handles remaining 1-3 limbs
|
||||||
|
.align 4
|
||||||
|
.Loop0: addq $0,$25,$28 # cy add
|
||||||
|
ldq $0,8($18)
|
||||||
|
addq $4,$28,$20 # main add
|
||||||
|
ldq $4,8($17)
|
||||||
|
addq $18,8,$18
|
||||||
|
cmpult $28,$25,$8 # compute cy from last add
|
||||||
|
addq $17,8,$17
|
||||||
|
stq $20,0($16)
|
||||||
|
cmpult $20,$28,$25 # compute cy from last add
|
||||||
|
subq $19,1,$19 # decr loop cnt
|
||||||
|
or $8,$25,$25 # combine cy from the two adds
|
||||||
|
addq $16,8,$16
|
||||||
|
bne $19,.Loop0
|
||||||
|
.Lend0: addq $0,$25,$28 # cy add
|
||||||
|
addq $4,$28,$20 # main add
|
||||||
|
cmpult $28,$25,$8 # compute cy from last add
|
||||||
|
cmpult $20,$28,$25 # compute cy from last add
|
||||||
|
stq $20,0($16)
|
||||||
|
or $8,$25,$25 # combine cy from the two adds
|
||||||
|
|
||||||
addq $17,32,$17
|
.Lret: or $25,$31,$0 # return cy
|
||||||
addq $18,32,$18
|
|
||||||
addq $16,32,$16
|
|
||||||
bne $19,.Loop
|
|
||||||
|
|
||||||
.Lend: addq $4,$0,$4
|
|
||||||
cmpult $4,$0,$1
|
|
||||||
addq $3,$4,$4
|
|
||||||
cmpult $4,$3,$0
|
|
||||||
stq $4,0($16)
|
|
||||||
or $0,$1,$0
|
|
||||||
ret $31,($26),1
|
ret $31,($26),1
|
||||||
|
|
||||||
.end __mpn_add_n
|
.end __mpn_add_n
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
# size r18
|
# size r18
|
||||||
# cnt r19
|
# cnt r19
|
||||||
|
|
||||||
# This code runs at 4.25 cycles/limb on the EV5.
|
# This code runs at 3.25 cycles/limb on the EV5.
|
||||||
|
|
||||||
.set noreorder
|
.set noreorder
|
||||||
.set noat
|
.set noat
|
||||||
@ -44,11 +44,11 @@ __mpn_lshift:
|
|||||||
and $18,4-1,$28 # number of limbs in first loop
|
and $18,4-1,$28 # number of limbs in first loop
|
||||||
srl $4,$20,$0 # compute function result
|
srl $4,$20,$0 # compute function result
|
||||||
|
|
||||||
beq $28,L0
|
beq $28,.L0
|
||||||
subq $18,$28,$18
|
subq $18,$28,$18
|
||||||
|
|
||||||
.align 3
|
.align 3
|
||||||
Loop0: ldq $3,-16($17)
|
.Loop0: ldq $3,-16($17)
|
||||||
subq $16,8,$16
|
subq $16,8,$16
|
||||||
sll $4,$19,$5
|
sll $4,$19,$5
|
||||||
subq $17,8,$17
|
subq $17,8,$17
|
||||||
@ -57,17 +57,17 @@ Loop0: ldq $3,-16($17)
|
|||||||
or $3,$3,$4
|
or $3,$3,$4
|
||||||
or $5,$6,$8
|
or $5,$6,$8
|
||||||
stq $8,0($16)
|
stq $8,0($16)
|
||||||
bne $28,Loop0
|
bne $28,.Loop0
|
||||||
|
|
||||||
L0: sll $4,$19,$24
|
.L0: sll $4,$19,$24
|
||||||
beq $18,Lend
|
beq $18,.Lend
|
||||||
# warm up phase 1
|
# warm up phase 1
|
||||||
ldq $1,-16($17)
|
ldq $1,-16($17)
|
||||||
subq $18,4,$18
|
subq $18,4,$18
|
||||||
ldq $2,-24($17)
|
ldq $2,-24($17)
|
||||||
ldq $3,-32($17)
|
ldq $3,-32($17)
|
||||||
ldq $4,-40($17)
|
ldq $4,-40($17)
|
||||||
beq $18,Lcool1
|
beq $18,.Lend1
|
||||||
# warm up phase 2
|
# warm up phase 2
|
||||||
srl $1,$20,$7
|
srl $1,$20,$7
|
||||||
sll $1,$19,$21
|
sll $1,$19,$21
|
||||||
@ -84,10 +84,10 @@ L0: sll $4,$19,$24
|
|||||||
sll $4,$19,$24
|
sll $4,$19,$24
|
||||||
ldq $4,-72($17)
|
ldq $4,-72($17)
|
||||||
subq $18,4,$18
|
subq $18,4,$18
|
||||||
beq $18,Lcool1
|
beq $18,.Lend2
|
||||||
.align 4
|
.align 4
|
||||||
# main loop
|
# main loop
|
||||||
Loop: stq $7,-8($16)
|
.Loop: stq $7,-8($16)
|
||||||
or $5,$22,$5
|
or $5,$22,$5
|
||||||
stq $8,-16($16)
|
stq $8,-16($16)
|
||||||
or $6,$23,$6
|
or $6,$23,$6
|
||||||
@ -113,16 +113,14 @@ Loop: stq $7,-8($16)
|
|||||||
subq $16,32,$16
|
subq $16,32,$16
|
||||||
|
|
||||||
srl $4,$20,$6
|
srl $4,$20,$6
|
||||||
ldq $3,-96($17
|
ldq $3,-96($17)
|
||||||
sll $4,$19,$24
|
sll $4,$19,$24
|
||||||
ldq $4,-104($17)
|
ldq $4,-104($17)
|
||||||
|
|
||||||
subq $17,32,$17
|
subq $17,32,$17
|
||||||
bne $18,Loop
|
bne $18,.Loop
|
||||||
unop
|
|
||||||
unop
|
|
||||||
# cool down phase 2/1
|
# cool down phase 2/1
|
||||||
Lcool1: stq $7,-8($16)
|
.Lend2: stq $7,-8($16)
|
||||||
or $5,$22,$5
|
or $5,$22,$5
|
||||||
stq $8,-16($16)
|
stq $8,-16($16)
|
||||||
or $6,$23,$6
|
or $6,$23,$6
|
||||||
@ -150,7 +148,7 @@ Lcool1: stq $7,-8($16)
|
|||||||
ret $31,($26),1
|
ret $31,($26),1
|
||||||
|
|
||||||
# cool down phase 1/1
|
# cool down phase 1/1
|
||||||
Lcool1: srl $1,$20,$7
|
.Lend1: srl $1,$20,$7
|
||||||
sll $1,$19,$21
|
sll $1,$19,$21
|
||||||
srl $2,$20,$8
|
srl $2,$20,$8
|
||||||
sll $2,$19,$22
|
sll $2,$19,$22
|
||||||
@ -170,6 +168,6 @@ Lcool1: srl $1,$20,$7
|
|||||||
stq $24,-40($16)
|
stq $24,-40($16)
|
||||||
ret $31,($26),1
|
ret $31,($26),1
|
||||||
|
|
||||||
Lend stq $24,-8($16)
|
.Lend: stq $24,-8($16)
|
||||||
ret $31,($26),1
|
ret $31,($26),1
|
||||||
.end __mpn_lshift
|
.end __mpn_lshift
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
# size r18
|
# size r18
|
||||||
# cnt r19
|
# cnt r19
|
||||||
|
|
||||||
# This code runs at 4.25 cycles/limb on the EV5.
|
# This code runs at 3.25 cycles/limb on the EV5.
|
||||||
|
|
||||||
.set noreorder
|
.set noreorder
|
||||||
.set noat
|
.set noat
|
||||||
@ -42,11 +42,11 @@ __mpn_rshift:
|
|||||||
and $18,4-1,$28 # number of limbs in first loop
|
and $18,4-1,$28 # number of limbs in first loop
|
||||||
sll $4,$20,$0 # compute function result
|
sll $4,$20,$0 # compute function result
|
||||||
|
|
||||||
beq $28,L0
|
beq $28,.L0
|
||||||
subq $18,$28,$18
|
subq $18,$28,$18
|
||||||
|
|
||||||
.align 3
|
.align 3
|
||||||
Loop0: ldq $3,8($17)
|
.Loop0: ldq $3,8($17)
|
||||||
addq $16,8,$16
|
addq $16,8,$16
|
||||||
srl $4,$19,$5
|
srl $4,$19,$5
|
||||||
addq $17,8,$17
|
addq $17,8,$17
|
||||||
@ -55,17 +55,17 @@ Loop0: ldq $3,8($17)
|
|||||||
or $3,$3,$4
|
or $3,$3,$4
|
||||||
or $5,$6,$8
|
or $5,$6,$8
|
||||||
stq $8,-8($16)
|
stq $8,-8($16)
|
||||||
bne $28,Loop0
|
bne $28,.Loop0
|
||||||
|
|
||||||
L0: srl $4,$19,$24
|
.L0: srl $4,$19,$24
|
||||||
beq $18,Lend
|
beq $18,.Lend
|
||||||
# warm up phase 1
|
# warm up phase 1
|
||||||
ldq $1,8($17)
|
ldq $1,8($17)
|
||||||
subq $18,4,$18
|
subq $18,4,$18
|
||||||
ldq $2,16($17)
|
ldq $2,16($17)
|
||||||
ldq $3,24($17)
|
ldq $3,24($17)
|
||||||
ldq $4,32($17)
|
ldq $4,32($17)
|
||||||
beq $18,Lcool1
|
beq $18,.Lend1
|
||||||
# warm up phase 2
|
# warm up phase 2
|
||||||
sll $1,$20,$7
|
sll $1,$20,$7
|
||||||
srl $1,$19,$21
|
srl $1,$19,$21
|
||||||
@ -82,10 +82,10 @@ L0: srl $4,$19,$24
|
|||||||
srl $4,$19,$24
|
srl $4,$19,$24
|
||||||
ldq $4,64($17)
|
ldq $4,64($17)
|
||||||
subq $18,4,$18
|
subq $18,4,$18
|
||||||
beq $18,Lcool2
|
beq $18,.Lend2
|
||||||
.align 4
|
.align 4
|
||||||
# main loop
|
# main loop
|
||||||
Loop: stq $7,0($16)
|
.Loop: stq $7,0($16)
|
||||||
or $5,$22,$5
|
or $5,$22,$5
|
||||||
stq $8,8($16)
|
stq $8,8($16)
|
||||||
or $6,$23,$6
|
or $6,$23,$6
|
||||||
@ -116,11 +116,9 @@ Loop: stq $7,0($16)
|
|||||||
ldq $4,96($17)
|
ldq $4,96($17)
|
||||||
|
|
||||||
addq $17,32,$17
|
addq $17,32,$17
|
||||||
bne $18,Loop
|
bne $18,.Loop
|
||||||
unop
|
|
||||||
unop
|
|
||||||
# cool down phase 2/1
|
# cool down phase 2/1
|
||||||
Lcool2: stq $7,0($16)
|
.Lend2: stq $7,0($16)
|
||||||
or $5,$22,$5
|
or $5,$22,$5
|
||||||
stq $8,8($16)
|
stq $8,8($16)
|
||||||
or $6,$23,$6
|
or $6,$23,$6
|
||||||
@ -148,7 +146,7 @@ Lcool2: stq $7,0($16)
|
|||||||
ret $31,($26),1
|
ret $31,($26),1
|
||||||
|
|
||||||
# cool down phase 1/1
|
# cool down phase 1/1
|
||||||
Lcool1: sll $1,$20,$7
|
.Lend1: sll $1,$20,$7
|
||||||
srl $1,$19,$21
|
srl $1,$19,$21
|
||||||
sll $2,$20,$8
|
sll $2,$20,$8
|
||||||
srl $2,$19,$22
|
srl $2,$19,$22
|
||||||
@ -168,6 +166,6 @@ Lcool1: sll $1,$20,$7
|
|||||||
stq $24,32($16)
|
stq $24,32($16)
|
||||||
ret $31,($26),1
|
ret $31,($26),1
|
||||||
|
|
||||||
Lend: stq $24,0($16)
|
.Lend: stq $24,0($16)
|
||||||
ret $31,($26),1
|
ret $31,($26),1
|
||||||
.end __mpn_rshift
|
.end __mpn_rshift
|
||||||
|
148
sysdeps/alpha/alphaev5/sub_n.s
Normal file
148
sysdeps/alpha/alphaev5/sub_n.s
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
# Alpha __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and
|
||||||
|
# store difference in a third limb vector.
|
||||||
|
|
||||||
|
# Copyright (C) 1995 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
# The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
|
||||||
|
# the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
|
||||||
|
# INPUT PARAMETERS
|
||||||
|
# res_ptr $16
|
||||||
|
# s1_ptr $17
|
||||||
|
# s2_ptr $18
|
||||||
|
# size $19
|
||||||
|
|
||||||
|
.set noreorder
|
||||||
|
.set noat
|
||||||
|
.text
|
||||||
|
.align 3
|
||||||
|
.globl __mpn_sub_n
|
||||||
|
.ent __mpn_sub_n
|
||||||
|
__mpn_sub_n:
|
||||||
|
.frame $30,0,$26,0
|
||||||
|
|
||||||
|
or $31,$31,$25 # clear cy
|
||||||
|
subq $19,4,$19 # decr loop cnt
|
||||||
|
blt $19,.Lend2 # if less than 4 limbs, goto 2nd loop
|
||||||
|
# Start software pipeline for 1st loop
|
||||||
|
ldq $0,0($18)
|
||||||
|
ldq $1,8($18)
|
||||||
|
ldq $4,0($17)
|
||||||
|
ldq $5,8($17)
|
||||||
|
addq $17,32,$17 # update s1_ptr
|
||||||
|
ldq $2,16($18)
|
||||||
|
subq $4,$0,$20 # 1st main sub
|
||||||
|
ldq $3,24($18)
|
||||||
|
subq $19,4,$19 # decr loop cnt
|
||||||
|
ldq $6,-16($17)
|
||||||
|
cmpult $4,$20,$25 # compute cy from last sub
|
||||||
|
ldq $7,-8($17)
|
||||||
|
addq $1,$25,$28 # cy add
|
||||||
|
addq $18,32,$18 # update s2_ptr
|
||||||
|
subq $5,$28,$21 # 2nd main sub
|
||||||
|
cmpult $28,$25,$8 # compute cy from last add
|
||||||
|
blt $19,.Lend1 # if less than 4 limbs remain, jump
|
||||||
|
# 1st loop handles groups of 4 limbs in a software pipeline
|
||||||
|
.align 4
|
||||||
|
.Loop: cmpult $5,$21,$25 # compute cy from last add
|
||||||
|
ldq $0,0($18)
|
||||||
|
or $8,$25,$25 # combine cy from the two adds
|
||||||
|
ldq $1,8($18)
|
||||||
|
addq $2,$25,$28 # cy add
|
||||||
|
ldq $4,0($17)
|
||||||
|
subq $6,$28,$22 # 3rd main sub
|
||||||
|
ldq $5,8($17)
|
||||||
|
cmpult $28,$25,$8 # compute cy from last add
|
||||||
|
cmpult $6,$22,$25 # compute cy from last add
|
||||||
|
stq $20,0($16)
|
||||||
|
or $8,$25,$25 # combine cy from the two adds
|
||||||
|
stq $21,8($16)
|
||||||
|
addq $3,$25,$28 # cy add
|
||||||
|
subq $7,$28,$23 # 4th main sub
|
||||||
|
cmpult $28,$25,$8 # compute cy from last add
|
||||||
|
cmpult $7,$23,$25 # compute cy from last add
|
||||||
|
addq $17,32,$17 # update s1_ptr
|
||||||
|
or $8,$25,$25 # combine cy from the two adds
|
||||||
|
addq $16,32,$16 # update res_ptr
|
||||||
|
addq $0,$25,$28 # cy add
|
||||||
|
ldq $2,16($18)
|
||||||
|
subq $4,$28,$20 # 1st main sub
|
||||||
|
ldq $3,24($18)
|
||||||
|
cmpult $28,$25,$8 # compute cy from last add
|
||||||
|
ldq $6,-16($17)
|
||||||
|
cmpult $4,$20,$25 # compute cy from last add
|
||||||
|
ldq $7,-8($17)
|
||||||
|
or $8,$25,$25 # combine cy from the two adds
|
||||||
|
subq $19,4,$19 # decr loop cnt
|
||||||
|
stq $22,-16($16)
|
||||||
|
addq $1,$25,$28 # cy add
|
||||||
|
stq $23,-8($16)
|
||||||
|
subq $5,$28,$21 # 2nd main sub
|
||||||
|
addq $18,32,$18 # update s2_ptr
|
||||||
|
cmpult $28,$25,$8 # compute cy from last add
|
||||||
|
bge $19,.Loop
|
||||||
|
# Finish software pipeline for 1st loop
|
||||||
|
.Lend1: cmpult $5,$21,$25 # compute cy from last add
|
||||||
|
or $8,$25,$25 # combine cy from the two adds
|
||||||
|
addq $2,$25,$28 # cy add
|
||||||
|
subq $6,$28,$22 # 3rd main sub
|
||||||
|
cmpult $28,$25,$8 # compute cy from last add
|
||||||
|
cmpult $6,$22,$25 # compute cy from last add
|
||||||
|
stq $20,0($16)
|
||||||
|
or $8,$25,$25 # combine cy from the two adds
|
||||||
|
stq $21,8($16)
|
||||||
|
addq $3,$25,$28 # cy add
|
||||||
|
subq $7,$28,$23 # 4th main sub
|
||||||
|
cmpult $28,$25,$8 # compute cy from last add
|
||||||
|
cmpult $7,$23,$25 # compute cy from last add
|
||||||
|
or $8,$25,$25 # combine cy from the two adds
|
||||||
|
addq $16,32,$16 # update res_ptr
|
||||||
|
stq $22,-16($16)
|
||||||
|
stq $23,-8($16)
|
||||||
|
.Lend2: addq $19,4,$19 # restore loop cnt
|
||||||
|
beq $19,.Lret
|
||||||
|
# Start software pipeline for 2nd loop
|
||||||
|
ldq $0,0($18)
|
||||||
|
ldq $4,0($17)
|
||||||
|
subq $19,1,$19
|
||||||
|
beq $19,.Lend0
|
||||||
|
# 2nd loop handles remaining 1-3 limbs
|
||||||
|
.align 4
|
||||||
|
.Loop0: addq $0,$25,$28 # cy add
|
||||||
|
ldq $0,8($18)
|
||||||
|
subq $4,$28,$20 # main sub
|
||||||
|
ldq $1,8($17)
|
||||||
|
addq $18,8,$18
|
||||||
|
cmpult $28,$25,$8 # compute cy from last add
|
||||||
|
addq $17,8,$17
|
||||||
|
stq $20,0($16)
|
||||||
|
cmpult $4,$20,$25 # compute cy from last add
|
||||||
|
subq $19,1,$19 # decr loop cnt
|
||||||
|
or $8,$25,$25 # combine cy from the two adds
|
||||||
|
addq $16,8,$16
|
||||||
|
or $1,$31,$4
|
||||||
|
bne $19,.Loop0
|
||||||
|
.Lend0: addq $0,$25,$28 # cy add
|
||||||
|
subq $4,$28,$20 # main sub
|
||||||
|
cmpult $28,$25,$8 # compute cy from last add
|
||||||
|
cmpult $4,$20,$25 # compute cy from last add
|
||||||
|
stq $20,0($16)
|
||||||
|
or $8,$25,$25 # combine cy from the two adds
|
||||||
|
|
||||||
|
.Lret: or $25,$31,$0 # return cy
|
||||||
|
ret $31,($26),1
|
||||||
|
.end __mpn_sub_n
|
@ -53,11 +53,11 @@ __mpn_lshift:
|
|||||||
and $18,4-1,$20 # number of limbs in first loop
|
and $18,4-1,$20 # number of limbs in first loop
|
||||||
srl $4,$7,$0 # compute function result
|
srl $4,$7,$0 # compute function result
|
||||||
|
|
||||||
beq $20,L0
|
beq $20,.L0
|
||||||
subq $18,$20,$18
|
subq $18,$20,$18
|
||||||
|
|
||||||
.align 3
|
.align 3
|
||||||
Loop0:
|
.Loop0:
|
||||||
ldq $3,-8($17)
|
ldq $3,-8($17)
|
||||||
subq $16,8,$16
|
subq $16,8,$16
|
||||||
subq $17,8,$17
|
subq $17,8,$17
|
||||||
@ -67,12 +67,12 @@ Loop0:
|
|||||||
bis $3,$3,$4
|
bis $3,$3,$4
|
||||||
bis $5,$6,$8
|
bis $5,$6,$8
|
||||||
stq $8,0($16)
|
stq $8,0($16)
|
||||||
bne $20,Loop0
|
bne $20,.Loop0
|
||||||
|
|
||||||
L0: beq $18,Lend
|
.L0: beq $18,.Lend
|
||||||
|
|
||||||
.align 3
|
.align 3
|
||||||
Loop: ldq $3,-8($17)
|
.Loop: ldq $3,-8($17)
|
||||||
subq $16,32,$16
|
subq $16,32,$16
|
||||||
subq $18,4,$18
|
subq $18,4,$18
|
||||||
sll $4,$19,$5
|
sll $4,$19,$5
|
||||||
@ -100,9 +100,9 @@ Loop: ldq $3,-8($17)
|
|||||||
bis $1,$2,$8
|
bis $1,$2,$8
|
||||||
stq $8,0($16)
|
stq $8,0($16)
|
||||||
|
|
||||||
bgt $18,Loop
|
bgt $18,.Loop
|
||||||
|
|
||||||
Lend: sll $4,$19,$8
|
.Lend: sll $4,$19,$8
|
||||||
stq $8,-8($16)
|
stq $8,-8($16)
|
||||||
ret $31,($26),1
|
ret $31,($26),1
|
||||||
.end __mpn_lshift
|
.end __mpn_lshift
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# Alpha 21064 __mpn_mul_1 -- Multiply a limb vector with a limb and store
|
# Alpha 21064 __mpn_mul_1 -- Multiply a limb vector with a limb and store
|
||||||
# the result in a second limb vector.
|
# the result in a second limb vector.
|
||||||
|
|
||||||
# Copyright (C) 1992, 1994 Free Software Foundation, Inc.
|
# Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This file is part of the GNU MP Library.
|
# This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
# 1. ldq has a 3 cycle delay, srl and sll have a 2 cycle delay.
|
# 1. ldq has a 3 cycle delay, srl and sll have a 2 cycle delay.
|
||||||
# 2. Only aligned instruction pairs can be paired.
|
# 2. Only aligned instruction pairs can be paired.
|
||||||
# 3. The store buffer or silo might not be able to deal with the bandwidth.
|
# 3. The store buffer or silo might not be able to deal with the bandwidth.
|
||||||
|
|
||||||
.set noreorder
|
.set noreorder
|
||||||
.set noat
|
.set noat
|
||||||
.text
|
.text
|
||||||
@ -51,11 +51,11 @@ __mpn_rshift:
|
|||||||
and $18,4-1,$20 # number of limbs in first loop
|
and $18,4-1,$20 # number of limbs in first loop
|
||||||
sll $4,$7,$0 # compute function result
|
sll $4,$7,$0 # compute function result
|
||||||
|
|
||||||
beq $20,L0
|
beq $20,.L0
|
||||||
subq $18,$20,$18
|
subq $18,$20,$18
|
||||||
|
|
||||||
.align 3
|
.align 3
|
||||||
Loop0:
|
.Loop0:
|
||||||
ldq $3,0($17)
|
ldq $3,0($17)
|
||||||
addq $16,8,$16
|
addq $16,8,$16
|
||||||
addq $17,8,$17
|
addq $17,8,$17
|
||||||
@ -65,12 +65,12 @@ Loop0:
|
|||||||
bis $3,$3,$4
|
bis $3,$3,$4
|
||||||
bis $5,$6,$8
|
bis $5,$6,$8
|
||||||
stq $8,-8($16)
|
stq $8,-8($16)
|
||||||
bne $20,Loop0
|
bne $20,.Loop0
|
||||||
|
|
||||||
L0: beq $18,Lend
|
.L0: beq $18,.Lend
|
||||||
|
|
||||||
.align 3
|
.align 3
|
||||||
Loop: ldq $3,0($17)
|
.Loop: ldq $3,0($17)
|
||||||
addq $16,32,$16
|
addq $16,32,$16
|
||||||
subq $18,4,$18
|
subq $18,4,$18
|
||||||
srl $4,$19,$5
|
srl $4,$19,$5
|
||||||
@ -98,9 +98,9 @@ Loop: ldq $3,0($17)
|
|||||||
bis $1,$2,$8
|
bis $1,$2,$8
|
||||||
stq $8,-8($16)
|
stq $8,-8($16)
|
||||||
|
|
||||||
bgt $18,Loop
|
bgt $18,.Loop
|
||||||
|
|
||||||
Lend: srl $4,$19,$8
|
.Lend: srl $4,$19,$8
|
||||||
stq $8,0($16)
|
stq $8,0($16)
|
||||||
ret $31,($26),1
|
ret $31,($26),1
|
||||||
.end __mpn_rshift
|
.end __mpn_rshift
|
||||||
|
@ -26,16 +26,7 @@
|
|||||||
# size r18
|
# size r18
|
||||||
# s2_limb r19
|
# s2_limb r19
|
||||||
|
|
||||||
# This code runs at 42 cycles/limb on the 21064.
|
# This code runs at 42 cycles/limb on EV4 and 18 cycles/limb on EV5.
|
||||||
|
|
||||||
# To improve performance for long multiplications, we would use
|
|
||||||
# 'fetch' for S1 and 'fetch_m' for RES. It's not obvious how to use
|
|
||||||
# these instructions without slowing down the general code: 1. We can
|
|
||||||
# only have two prefetches in operation at any time in the Alpha
|
|
||||||
# architecture. 2. There will seldom be any special alignment
|
|
||||||
# between RES_PTR and S1_PTR. Maybe we can simply divide the current
|
|
||||||
# loop into an inner and outer loop, having the inner loop handle
|
|
||||||
# exactly one prefetch block?
|
|
||||||
|
|
||||||
.set noreorder
|
.set noreorder
|
||||||
.set noat
|
.set noat
|
||||||
@ -52,7 +43,7 @@ __mpn_submul_1:
|
|||||||
mulq $2,$19,$3 # $3 = prod_low
|
mulq $2,$19,$3 # $3 = prod_low
|
||||||
ldq $5,0($16) # $5 = *res_ptr
|
ldq $5,0($16) # $5 = *res_ptr
|
||||||
umulh $2,$19,$0 # $0 = prod_high
|
umulh $2,$19,$0 # $0 = prod_high
|
||||||
beq $18,Lend1 # jump if size was == 1
|
beq $18,.Lend1 # jump if size was == 1
|
||||||
ldq $2,0($17) # $2 = s1_limb
|
ldq $2,0($17) # $2 = s1_limb
|
||||||
addq $17,8,$17 # s1_ptr++
|
addq $17,8,$17 # s1_ptr++
|
||||||
subq $18,1,$18 # size--
|
subq $18,1,$18 # size--
|
||||||
@ -60,10 +51,10 @@ __mpn_submul_1:
|
|||||||
cmpult $5,$3,$4
|
cmpult $5,$3,$4
|
||||||
stq $3,0($16)
|
stq $3,0($16)
|
||||||
addq $16,8,$16 # res_ptr++
|
addq $16,8,$16 # res_ptr++
|
||||||
beq $18,Lend2 # jump if size was == 2
|
beq $18,.Lend2 # jump if size was == 2
|
||||||
|
|
||||||
.align 3
|
.align 3
|
||||||
Loop: mulq $2,$19,$3 # $3 = prod_low
|
.Loop: mulq $2,$19,$3 # $3 = prod_low
|
||||||
ldq $5,0($16) # $5 = *res_ptr
|
ldq $5,0($16) # $5 = *res_ptr
|
||||||
addq $4,$0,$0 # cy_limb = cy_limb + 'cy'
|
addq $4,$0,$0 # cy_limb = cy_limb + 'cy'
|
||||||
subq $18,1,$18 # size--
|
subq $18,1,$18 # size--
|
||||||
@ -77,9 +68,9 @@ Loop: mulq $2,$19,$3 # $3 = prod_low
|
|||||||
stq $3,0($16)
|
stq $3,0($16)
|
||||||
addq $16,8,$16 # res_ptr++
|
addq $16,8,$16 # res_ptr++
|
||||||
addq $5,$0,$0 # combine carries
|
addq $5,$0,$0 # combine carries
|
||||||
bne $18,Loop
|
bne $18,.Loop
|
||||||
|
|
||||||
Lend2: mulq $2,$19,$3 # $3 = prod_low
|
.Lend2: mulq $2,$19,$3 # $3 = prod_low
|
||||||
ldq $5,0($16) # $5 = *res_ptr
|
ldq $5,0($16) # $5 = *res_ptr
|
||||||
addq $4,$0,$0 # cy_limb = cy_limb + 'cy'
|
addq $4,$0,$0 # cy_limb = cy_limb + 'cy'
|
||||||
umulh $2,$19,$4 # $4 = cy_limb
|
umulh $2,$19,$4 # $4 = cy_limb
|
||||||
@ -91,7 +82,7 @@ Lend2: mulq $2,$19,$3 # $3 = prod_low
|
|||||||
addq $5,$0,$0 # combine carries
|
addq $5,$0,$0 # combine carries
|
||||||
addq $4,$0,$0 # cy_limb = prod_high + cy
|
addq $4,$0,$0 # cy_limb = prod_high + cy
|
||||||
ret $31,($26),1
|
ret $31,($26),1
|
||||||
Lend1: subq $5,$3,$3
|
.Lend1: subq $5,$3,$3
|
||||||
cmpult $5,$3,$5
|
cmpult $5,$3,$5
|
||||||
stq $3,0($16)
|
stq $3,0($16)
|
||||||
addq $0,$5,$0
|
addq $0,$5,$0
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# Alpha 21064 __udiv_qrnnd
|
# Alpha 21064 __udiv_qrnnd
|
||||||
|
|
||||||
# Copyright (C) 1992, 1994 Free Software Foundation, Inc.
|
# Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This file is part of the GNU MP Library.
|
# This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -21,13 +21,11 @@
|
|||||||
|
|
||||||
.set noreorder
|
.set noreorder
|
||||||
.set noat
|
.set noat
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.align 3
|
.align 3
|
||||||
.globl __udiv_qrnnd
|
.globl __udiv_qrnnd
|
||||||
.ent __udiv_qrnnd 0
|
.ent __udiv_qrnnd
|
||||||
__udiv_qrnnd:
|
__udiv_qrnnd:
|
||||||
__udiv_qrnnd..ng:
|
|
||||||
.frame $30,0,$26,0
|
.frame $30,0,$26,0
|
||||||
.prologue 0
|
.prologue 0
|
||||||
#define cnt $2
|
#define cnt $2
|
||||||
@ -39,9 +37,9 @@ __udiv_qrnnd..ng:
|
|||||||
#define qb $20
|
#define qb $20
|
||||||
|
|
||||||
ldiq cnt,16
|
ldiq cnt,16
|
||||||
blt d,Largedivisor
|
blt d,.Largedivisor
|
||||||
|
|
||||||
Loop1: cmplt n0,0,tmp
|
.Loop1: cmplt n0,0,tmp
|
||||||
addq n1,n1,n1
|
addq n1,n1,n1
|
||||||
bis n1,tmp,n1
|
bis n1,tmp,n1
|
||||||
addq n0,n0,n0
|
addq n0,n0,n0
|
||||||
@ -74,12 +72,12 @@ Loop1: cmplt n0,0,tmp
|
|||||||
cmovne qb,tmp,n1
|
cmovne qb,tmp,n1
|
||||||
bis n0,qb,n0
|
bis n0,qb,n0
|
||||||
subq cnt,1,cnt
|
subq cnt,1,cnt
|
||||||
bgt cnt,Loop1
|
bgt cnt,.Loop1
|
||||||
stq n1,0(rem_ptr)
|
stq n1,0(rem_ptr)
|
||||||
bis $31,n0,$0
|
bis $31,n0,$0
|
||||||
ret $31,($26),1
|
ret $31,($26),1
|
||||||
|
|
||||||
Largedivisor:
|
.Largedivisor:
|
||||||
and n0,1,$4
|
and n0,1,$4
|
||||||
|
|
||||||
srl n0,1,n0
|
srl n0,1,n0
|
||||||
@ -91,7 +89,7 @@ Largedivisor:
|
|||||||
srl d,1,$5
|
srl d,1,$5
|
||||||
addq $5,$6,$5
|
addq $5,$6,$5
|
||||||
|
|
||||||
Loop2: cmplt n0,0,tmp
|
.Loop2: cmplt n0,0,tmp
|
||||||
addq n1,n1,n1
|
addq n1,n1,n1
|
||||||
bis n1,tmp,n1
|
bis n1,tmp,n1
|
||||||
addq n0,n0,n0
|
addq n0,n0,n0
|
||||||
@ -124,27 +122,27 @@ Loop2: cmplt n0,0,tmp
|
|||||||
cmovne qb,tmp,n1
|
cmovne qb,tmp,n1
|
||||||
bis n0,qb,n0
|
bis n0,qb,n0
|
||||||
subq cnt,1,cnt
|
subq cnt,1,cnt
|
||||||
bgt cnt,Loop2
|
bgt cnt,.Loop2
|
||||||
|
|
||||||
addq n1,n1,n1
|
addq n1,n1,n1
|
||||||
addq $4,n1,n1
|
addq $4,n1,n1
|
||||||
bne $6,Odd
|
bne $6,.LOdd
|
||||||
stq n1,0(rem_ptr)
|
stq n1,0(rem_ptr)
|
||||||
bis $31,n0,$0
|
bis $31,n0,$0
|
||||||
ret $31,($26),1
|
ret $31,($26),1
|
||||||
|
|
||||||
Odd:
|
.LOdd:
|
||||||
/* q' in n0. r' in n1 */
|
/* q' in n0. r' in n1 */
|
||||||
addq n1,n0,n1
|
addq n1,n0,n1
|
||||||
cmpult n1,n0,tmp # tmp := carry from addq
|
cmpult n1,n0,tmp # tmp := carry from addq
|
||||||
beq tmp,LLp6
|
beq tmp,.LLp6
|
||||||
addq n0,1,n0
|
addq n0,1,n0
|
||||||
subq n1,d,n1
|
subq n1,d,n1
|
||||||
LLp6: cmpult n1,d,tmp
|
.LLp6: cmpult n1,d,tmp
|
||||||
bne tmp,LLp7
|
bne tmp,.LLp7
|
||||||
addq n0,1,n0
|
addq n0,1,n0
|
||||||
subq n1,d,n1
|
subq n1,d,n1
|
||||||
LLp7:
|
.LLp7:
|
||||||
stq n1,0(rem_ptr)
|
stq n1,0(rem_ptr)
|
||||||
bis $31,n0,$0
|
bis $31,n0,$0
|
||||||
ret $31,($26),1
|
ret $31,($26),1
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* __mpn_add_n -- Add two limb vectors of equal, non-zero length.
|
/* mpn_add_n -- Add two limb vectors of equal, non-zero length.
|
||||||
|
|
||||||
Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1992, 1993, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -23,9 +23,9 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
|
|
||||||
mp_limb
|
mp_limb
|
||||||
#if __STDC__
|
#if __STDC__
|
||||||
__mpn_add_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr, mp_size_t size)
|
mpn_add_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr, mp_size_t size)
|
||||||
#else
|
#else
|
||||||
__mpn_add_n (res_ptr, s1_ptr, s2_ptr, size)
|
mpn_add_n (res_ptr, s1_ptr, s2_ptr, size)
|
||||||
register mp_ptr res_ptr;
|
register mp_ptr res_ptr;
|
||||||
register mp_srcptr s1_ptr;
|
register mp_srcptr s1_ptr;
|
||||||
register mp_srcptr s2_ptr;
|
register mp_srcptr s2_ptr;
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
/* __mpn_addmul_1 -- multiply the S1_SIZE long limb vector pointed to by S1_PTR
|
/* mpn_addmul_1 -- multiply the S1_SIZE long limb vector pointed to by S1_PTR
|
||||||
by S2_LIMB, add the S1_SIZE least significant limbs of the product to the
|
by S2_LIMB, add the S1_SIZE least significant limbs of the product to the
|
||||||
limb vector pointed to by RES_PTR. Return the most significant limb of
|
limb vector pointed to by RES_PTR. Return the most significant limb of
|
||||||
the product, adjusted for carry-out from the addition.
|
the product, adjusted for carry-out from the addition.
|
||||||
|
|
||||||
Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1992, 1993, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -26,7 +26,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
#include "longlong.h"
|
#include "longlong.h"
|
||||||
|
|
||||||
mp_limb
|
mp_limb
|
||||||
__mpn_addmul_1 (res_ptr, s1_ptr, s1_size, s2_limb)
|
mpn_addmul_1 (res_ptr, s1_ptr, s1_size, s2_limb)
|
||||||
register mp_ptr res_ptr;
|
register mp_ptr res_ptr;
|
||||||
register mp_srcptr s1_ptr;
|
register mp_srcptr s1_ptr;
|
||||||
mp_size_t s1_size;
|
mp_size_t s1_size;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* __mpn_cmp -- Compare two low-level natural-number integers.
|
/* mpn_cmp -- Compare two low-level natural-number integers.
|
||||||
|
|
||||||
Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1991, 1993, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -28,9 +28,9 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
|
|
||||||
int
|
int
|
||||||
#if __STDC__
|
#if __STDC__
|
||||||
__mpn_cmp (mp_srcptr op1_ptr, mp_srcptr op2_ptr, mp_size_t size)
|
mpn_cmp (mp_srcptr op1_ptr, mp_srcptr op2_ptr, mp_size_t size)
|
||||||
#else
|
#else
|
||||||
__mpn_cmp (op1_ptr, op2_ptr, size)
|
mpn_cmp (op1_ptr, op2_ptr, size)
|
||||||
mp_srcptr op1_ptr;
|
mp_srcptr op1_ptr;
|
||||||
mp_srcptr op2_ptr;
|
mp_srcptr op2_ptr;
|
||||||
mp_size_t size;
|
mp_size_t size;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* __mpn_divmod_1(quot_ptr, dividend_ptr, dividend_size, divisor_limb) --
|
/* mpn_divmod_1(quot_ptr, dividend_ptr, dividend_size, divisor_limb) --
|
||||||
Divide (DIVIDEND_PTR,,DIVIDEND_SIZE) by DIVISOR_LIMB.
|
Divide (DIVIDEND_PTR,,DIVIDEND_SIZE) by DIVISOR_LIMB.
|
||||||
Write DIVIDEND_SIZE limbs of quotient at QUOT_PTR.
|
Write DIVIDEND_SIZE limbs of quotient at QUOT_PTR.
|
||||||
Return the single-limb remainder.
|
Return the single-limb remainder.
|
||||||
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
QUOT_PTR and DIVIDEND_PTR might point to the same limb.
|
QUOT_PTR and DIVIDEND_PTR might point to the same limb.
|
||||||
|
|
||||||
Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1991, 1993, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -41,11 +41,11 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
|
|
||||||
mp_limb
|
mp_limb
|
||||||
#if __STDC__
|
#if __STDC__
|
||||||
__mpn_divmod_1 (mp_ptr quot_ptr,
|
mpn_divmod_1 (mp_ptr quot_ptr,
|
||||||
mp_srcptr dividend_ptr, mp_size_t dividend_size,
|
mp_srcptr dividend_ptr, mp_size_t dividend_size,
|
||||||
mp_limb divisor_limb)
|
mp_limb divisor_limb)
|
||||||
#else
|
#else
|
||||||
__mpn_divmod_1 (quot_ptr, dividend_ptr, dividend_size, divisor_limb)
|
mpn_divmod_1 (quot_ptr, dividend_ptr, dividend_size, divisor_limb)
|
||||||
mp_ptr quot_ptr;
|
mp_ptr quot_ptr;
|
||||||
mp_srcptr dividend_ptr;
|
mp_srcptr dividend_ptr;
|
||||||
mp_size_t dividend_size;
|
mp_size_t dividend_size;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* __mpn_lshift -- Shift left low level.
|
/* mpn_lshift -- Shift left low level.
|
||||||
|
|
||||||
Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1991, 1993, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -32,11 +32,11 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
|
|
||||||
mp_limb
|
mp_limb
|
||||||
#if __STDC__
|
#if __STDC__
|
||||||
__mpn_lshift (register mp_ptr wp,
|
mpn_lshift (register mp_ptr wp,
|
||||||
register mp_srcptr up, mp_size_t usize,
|
register mp_srcptr up, mp_size_t usize,
|
||||||
register unsigned int cnt)
|
register unsigned int cnt)
|
||||||
#else
|
#else
|
||||||
__mpn_lshift (wp, up, usize, cnt)
|
mpn_lshift (wp, up, usize, cnt)
|
||||||
register mp_ptr wp;
|
register mp_ptr wp;
|
||||||
register mp_srcptr up;
|
register mp_srcptr up;
|
||||||
mp_size_t usize;
|
mp_size_t usize;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* __mpn_mod_1(dividend_ptr, dividend_size, divisor_limb) --
|
/* mpn_mod_1(dividend_ptr, dividend_size, divisor_limb) --
|
||||||
Divide (DIVIDEND_PTR,,DIVIDEND_SIZE) by DIVISOR_LIMB.
|
Divide (DIVIDEND_PTR,,DIVIDEND_SIZE) by DIVISOR_LIMB.
|
||||||
Return the single-limb remainder.
|
Return the single-limb remainder.
|
||||||
There are no constraints on the value of the divisor.
|
There are no constraints on the value of the divisor.
|
||||||
@ -38,10 +38,10 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
|
|
||||||
mp_limb
|
mp_limb
|
||||||
#if __STDC__
|
#if __STDC__
|
||||||
__mpn_mod_1 (mp_srcptr dividend_ptr, mp_size_t dividend_size,
|
mpn_mod_1 (mp_srcptr dividend_ptr, mp_size_t dividend_size,
|
||||||
mp_limb divisor_limb)
|
mp_limb divisor_limb)
|
||||||
#else
|
#else
|
||||||
__mpn_mod_1 (dividend_ptr, dividend_size, divisor_limb)
|
mpn_mod_1 (dividend_ptr, dividend_size, divisor_limb)
|
||||||
mp_srcptr dividend_ptr;
|
mp_srcptr dividend_ptr;
|
||||||
mp_size_t dividend_size;
|
mp_size_t dividend_size;
|
||||||
mp_limb divisor_limb;
|
mp_limb divisor_limb;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* __mpn_mul -- Multiply two natural numbers.
|
/* mpn_mul -- Multiply two natural numbers.
|
||||||
|
|
||||||
Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1991, 1993, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -43,11 +43,11 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
|
|
||||||
mp_limb
|
mp_limb
|
||||||
#if __STDC__
|
#if __STDC__
|
||||||
__mpn_mul (mp_ptr prodp,
|
mpn_mul (mp_ptr prodp,
|
||||||
mp_srcptr up, mp_size_t usize,
|
mp_srcptr up, mp_size_t usize,
|
||||||
mp_srcptr vp, mp_size_t vsize)
|
mp_srcptr vp, mp_size_t vsize)
|
||||||
#else
|
#else
|
||||||
__mpn_mul (prodp, up, usize, vp, vsize)
|
mpn_mul (prodp, up, usize, vp, vsize)
|
||||||
mp_ptr prodp;
|
mp_ptr prodp;
|
||||||
mp_srcptr up;
|
mp_srcptr up;
|
||||||
mp_size_t usize;
|
mp_size_t usize;
|
||||||
@ -58,6 +58,7 @@ __mpn_mul (prodp, up, usize, vp, vsize)
|
|||||||
mp_ptr prod_endp = prodp + usize + vsize - 1;
|
mp_ptr prod_endp = prodp + usize + vsize - 1;
|
||||||
mp_limb cy;
|
mp_limb cy;
|
||||||
mp_ptr tspace;
|
mp_ptr tspace;
|
||||||
|
TMP_DECL (marker);
|
||||||
|
|
||||||
if (vsize < KARATSUBA_THRESHOLD)
|
if (vsize < KARATSUBA_THRESHOLD)
|
||||||
{
|
{
|
||||||
@ -86,7 +87,7 @@ __mpn_mul (prodp, up, usize, vp, vsize)
|
|||||||
cy_limb = 0;
|
cy_limb = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
cy_limb = __mpn_mul_1 (prodp, up, usize, v_limb);
|
cy_limb = mpn_mul_1 (prodp, up, usize, v_limb);
|
||||||
|
|
||||||
prodp[usize] = cy_limb;
|
prodp[usize] = cy_limb;
|
||||||
prodp++;
|
prodp++;
|
||||||
@ -100,10 +101,10 @@ __mpn_mul (prodp, up, usize, vp, vsize)
|
|||||||
{
|
{
|
||||||
cy_limb = 0;
|
cy_limb = 0;
|
||||||
if (v_limb == 1)
|
if (v_limb == 1)
|
||||||
cy_limb = __mpn_add_n (prodp, prodp, up, usize);
|
cy_limb = mpn_add_n (prodp, prodp, up, usize);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
cy_limb = __mpn_addmul_1 (prodp, up, usize, v_limb);
|
cy_limb = mpn_addmul_1 (prodp, up, usize, v_limb);
|
||||||
|
|
||||||
prodp[usize] = cy_limb;
|
prodp[usize] = cy_limb;
|
||||||
prodp++;
|
prodp++;
|
||||||
@ -111,7 +112,9 @@ __mpn_mul (prodp, up, usize, vp, vsize)
|
|||||||
return cy_limb;
|
return cy_limb;
|
||||||
}
|
}
|
||||||
|
|
||||||
tspace = (mp_ptr) alloca (2 * vsize * BYTES_PER_MP_LIMB);
|
TMP_MARK (marker);
|
||||||
|
|
||||||
|
tspace = (mp_ptr) TMP_ALLOC (2 * vsize * BYTES_PER_MP_LIMB);
|
||||||
MPN_MUL_N_RECURSE (prodp, up, vp, vsize, tspace);
|
MPN_MUL_N_RECURSE (prodp, up, vp, vsize, tspace);
|
||||||
|
|
||||||
prodp += vsize;
|
prodp += vsize;
|
||||||
@ -119,12 +122,12 @@ __mpn_mul (prodp, up, usize, vp, vsize)
|
|||||||
usize -= vsize;
|
usize -= vsize;
|
||||||
if (usize >= vsize)
|
if (usize >= vsize)
|
||||||
{
|
{
|
||||||
mp_ptr tp = (mp_ptr) alloca (2 * vsize * BYTES_PER_MP_LIMB);
|
mp_ptr tp = (mp_ptr) TMP_ALLOC (2 * vsize * BYTES_PER_MP_LIMB);
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
MPN_MUL_N_RECURSE (tp, up, vp, vsize, tspace);
|
MPN_MUL_N_RECURSE (tp, up, vp, vsize, tspace);
|
||||||
cy = __mpn_add_n (prodp, prodp, tp, vsize);
|
cy = mpn_add_n (prodp, prodp, tp, vsize);
|
||||||
__mpn_add_1 (prodp + vsize, tp + vsize, vsize, cy);
|
mpn_add_1 (prodp + vsize, tp + vsize, vsize, cy);
|
||||||
prodp += vsize;
|
prodp += vsize;
|
||||||
up += vsize;
|
up += vsize;
|
||||||
usize -= vsize;
|
usize -= vsize;
|
||||||
@ -138,10 +141,11 @@ __mpn_mul (prodp, up, usize, vp, vsize)
|
|||||||
|
|
||||||
if (usize != 0)
|
if (usize != 0)
|
||||||
{
|
{
|
||||||
__mpn_mul (tspace, vp, vsize, up, usize);
|
mpn_mul (tspace, vp, vsize, up, usize);
|
||||||
cy = __mpn_add_n (prodp, prodp, tspace, vsize);
|
cy = mpn_add_n (prodp, prodp, tspace, vsize);
|
||||||
__mpn_add_1 (prodp + vsize, tspace + vsize, usize, cy);
|
mpn_add_1 (prodp + vsize, tspace + vsize, usize, cy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TMP_FREE (marker);
|
||||||
return *prod_endp;
|
return *prod_endp;
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* __mpn_mul_1 -- Multiply a limb vector with a single limb and
|
/* mpn_mul_1 -- Multiply a limb vector with a single limb and
|
||||||
store the product in a second limb vector.
|
store the product in a second limb vector.
|
||||||
|
|
||||||
Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1991, 1992, 1993, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -24,7 +24,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
#include "longlong.h"
|
#include "longlong.h"
|
||||||
|
|
||||||
mp_limb
|
mp_limb
|
||||||
__mpn_mul_1 (res_ptr, s1_ptr, s1_size, s2_limb)
|
mpn_mul_1 (res_ptr, s1_ptr, s1_size, s2_limb)
|
||||||
register mp_ptr res_ptr;
|
register mp_ptr res_ptr;
|
||||||
register mp_srcptr s1_ptr;
|
register mp_srcptr s1_ptr;
|
||||||
mp_size_t s1_size;
|
mp_size_t s1_size;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* __mpn_mul_n -- Multiply two natural numbers of length n.
|
/* mpn_mul_n -- Multiply two natural numbers of length n.
|
||||||
|
|
||||||
Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1991, 1992, 1993, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -41,13 +41,6 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
#define KARATSUBA_THRESHOLD 2
|
#define KARATSUBA_THRESHOLD 2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void
|
|
||||||
#if __STDC__
|
|
||||||
____mpn_mul_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t, mp_ptr);
|
|
||||||
#else
|
|
||||||
____mpn_mul_n ();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Handle simple cases with traditional multiplication.
|
/* Handle simple cases with traditional multiplication.
|
||||||
|
|
||||||
This is the most critical code of multiplication. All multiplies rely
|
This is the most critical code of multiplication. All multiplies rely
|
||||||
@ -57,9 +50,9 @@ ____mpn_mul_n ();
|
|||||||
|
|
||||||
void
|
void
|
||||||
#if __STDC__
|
#if __STDC__
|
||||||
____mpn_mul_n_basecase (mp_ptr prodp, mp_srcptr up, mp_srcptr vp, mp_size_t size)
|
impn_mul_n_basecase (mp_ptr prodp, mp_srcptr up, mp_srcptr vp, mp_size_t size)
|
||||||
#else
|
#else
|
||||||
____mpn_mul_n_basecase (prodp, up, vp, size)
|
impn_mul_n_basecase (prodp, up, vp, size)
|
||||||
mp_ptr prodp;
|
mp_ptr prodp;
|
||||||
mp_srcptr up;
|
mp_srcptr up;
|
||||||
mp_srcptr vp;
|
mp_srcptr vp;
|
||||||
@ -82,7 +75,7 @@ ____mpn_mul_n_basecase (prodp, up, vp, size)
|
|||||||
cy_limb = 0;
|
cy_limb = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
cy_limb = __mpn_mul_1 (prodp, up, size, v_limb);
|
cy_limb = mpn_mul_1 (prodp, up, size, v_limb);
|
||||||
|
|
||||||
prodp[size] = cy_limb;
|
prodp[size] = cy_limb;
|
||||||
prodp++;
|
prodp++;
|
||||||
@ -96,10 +89,10 @@ ____mpn_mul_n_basecase (prodp, up, vp, size)
|
|||||||
{
|
{
|
||||||
cy_limb = 0;
|
cy_limb = 0;
|
||||||
if (v_limb == 1)
|
if (v_limb == 1)
|
||||||
cy_limb = __mpn_add_n (prodp, prodp, up, size);
|
cy_limb = mpn_add_n (prodp, prodp, up, size);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
cy_limb = __mpn_addmul_1 (prodp, up, size, v_limb);
|
cy_limb = mpn_addmul_1 (prodp, up, size, v_limb);
|
||||||
|
|
||||||
prodp[size] = cy_limb;
|
prodp[size] = cy_limb;
|
||||||
prodp++;
|
prodp++;
|
||||||
@ -108,10 +101,10 @@ ____mpn_mul_n_basecase (prodp, up, vp, size)
|
|||||||
|
|
||||||
void
|
void
|
||||||
#if __STDC__
|
#if __STDC__
|
||||||
____mpn_mul_n (mp_ptr prodp,
|
impn_mul_n (mp_ptr prodp,
|
||||||
mp_srcptr up, mp_srcptr vp, mp_size_t size, mp_ptr tspace)
|
mp_srcptr up, mp_srcptr vp, mp_size_t size, mp_ptr tspace)
|
||||||
#else
|
#else
|
||||||
____mpn_mul_n (prodp, up, vp, size, tspace)
|
impn_mul_n (prodp, up, vp, size, tspace)
|
||||||
mp_ptr prodp;
|
mp_ptr prodp;
|
||||||
mp_srcptr up;
|
mp_srcptr up;
|
||||||
mp_srcptr vp;
|
mp_srcptr vp;
|
||||||
@ -135,9 +128,9 @@ ____mpn_mul_n (prodp, up, vp, size, tspace)
|
|||||||
mp_limb cy_limb;
|
mp_limb cy_limb;
|
||||||
|
|
||||||
MPN_MUL_N_RECURSE (prodp, up, vp, esize, tspace);
|
MPN_MUL_N_RECURSE (prodp, up, vp, esize, tspace);
|
||||||
cy_limb = __mpn_addmul_1 (prodp + esize, up, esize, vp[esize]);
|
cy_limb = mpn_addmul_1 (prodp + esize, up, esize, vp[esize]);
|
||||||
prodp[esize + esize] = cy_limb;
|
prodp[esize + esize] = cy_limb;
|
||||||
cy_limb = __mpn_addmul_1 (prodp + esize, vp, size, up[esize]);
|
cy_limb = mpn_addmul_1 (prodp + esize, vp, size, up[esize]);
|
||||||
|
|
||||||
prodp[esize + size] = cy_limb;
|
prodp[esize + size] = cy_limb;
|
||||||
}
|
}
|
||||||
@ -170,24 +163,24 @@ ____mpn_mul_n (prodp, up, vp, size, tspace)
|
|||||||
|
|
||||||
/*** Product M. ________________
|
/*** Product M. ________________
|
||||||
|_(U1-U0)(V0-V1)_| */
|
|_(U1-U0)(V0-V1)_| */
|
||||||
if (__mpn_cmp (up + hsize, up, hsize) >= 0)
|
if (mpn_cmp (up + hsize, up, hsize) >= 0)
|
||||||
{
|
{
|
||||||
__mpn_sub_n (prodp, up + hsize, up, hsize);
|
mpn_sub_n (prodp, up + hsize, up, hsize);
|
||||||
negflg = 0;
|
negflg = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
__mpn_sub_n (prodp, up, up + hsize, hsize);
|
mpn_sub_n (prodp, up, up + hsize, hsize);
|
||||||
negflg = 1;
|
negflg = 1;
|
||||||
}
|
}
|
||||||
if (__mpn_cmp (vp + hsize, vp, hsize) >= 0)
|
if (mpn_cmp (vp + hsize, vp, hsize) >= 0)
|
||||||
{
|
{
|
||||||
__mpn_sub_n (prodp + hsize, vp + hsize, vp, hsize);
|
mpn_sub_n (prodp + hsize, vp + hsize, vp, hsize);
|
||||||
negflg ^= 1;
|
negflg ^= 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
__mpn_sub_n (prodp + hsize, vp, vp + hsize, hsize);
|
mpn_sub_n (prodp + hsize, vp, vp + hsize, hsize);
|
||||||
/* No change of NEGFLG. */
|
/* No change of NEGFLG. */
|
||||||
}
|
}
|
||||||
/* Read temporary operands from low part of PROD.
|
/* Read temporary operands from low part of PROD.
|
||||||
@ -197,13 +190,13 @@ ____mpn_mul_n (prodp, up, vp, size, tspace)
|
|||||||
|
|
||||||
/*** Add/copy product H. */
|
/*** Add/copy product H. */
|
||||||
MPN_COPY (prodp + hsize, prodp + size, hsize);
|
MPN_COPY (prodp + hsize, prodp + size, hsize);
|
||||||
cy = __mpn_add_n (prodp + size, prodp + size, prodp + size + hsize, hsize);
|
cy = mpn_add_n (prodp + size, prodp + size, prodp + size + hsize, hsize);
|
||||||
|
|
||||||
/*** Add product M (if NEGFLG M is a negative number). */
|
/*** Add product M (if NEGFLG M is a negative number). */
|
||||||
if (negflg)
|
if (negflg)
|
||||||
cy -= __mpn_sub_n (prodp + hsize, prodp + hsize, tspace, size);
|
cy -= mpn_sub_n (prodp + hsize, prodp + hsize, tspace, size);
|
||||||
else
|
else
|
||||||
cy += __mpn_add_n (prodp + hsize, prodp + hsize, tspace, size);
|
cy += mpn_add_n (prodp + hsize, prodp + hsize, tspace, size);
|
||||||
|
|
||||||
/*** Product L. ________________ ________________
|
/*** Product L. ________________ ________________
|
||||||
|________________||____U0 x V0_____| */
|
|________________||____U0 x V0_____| */
|
||||||
@ -214,22 +207,22 @@ ____mpn_mul_n (prodp, up, vp, size, tspace)
|
|||||||
|
|
||||||
/*** Add/copy Product L (twice). */
|
/*** Add/copy Product L (twice). */
|
||||||
|
|
||||||
cy += __mpn_add_n (prodp + hsize, prodp + hsize, tspace, size);
|
cy += mpn_add_n (prodp + hsize, prodp + hsize, tspace, size);
|
||||||
if (cy)
|
if (cy)
|
||||||
__mpn_add_1 (prodp + hsize + size, prodp + hsize + size, hsize, cy);
|
mpn_add_1 (prodp + hsize + size, prodp + hsize + size, hsize, cy);
|
||||||
|
|
||||||
MPN_COPY (prodp, tspace, hsize);
|
MPN_COPY (prodp, tspace, hsize);
|
||||||
cy = __mpn_add_n (prodp + hsize, prodp + hsize, tspace + hsize, hsize);
|
cy = mpn_add_n (prodp + hsize, prodp + hsize, tspace + hsize, hsize);
|
||||||
if (cy)
|
if (cy)
|
||||||
__mpn_add_1 (prodp + size, prodp + size, size, 1);
|
mpn_add_1 (prodp + size, prodp + size, size, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
#if __STDC__
|
#if __STDC__
|
||||||
____mpn_sqr_n_basecase (mp_ptr prodp, mp_srcptr up, mp_size_t size)
|
impn_sqr_n_basecase (mp_ptr prodp, mp_srcptr up, mp_size_t size)
|
||||||
#else
|
#else
|
||||||
____mpn_sqr_n_basecase (prodp, up, size)
|
impn_sqr_n_basecase (prodp, up, size)
|
||||||
mp_ptr prodp;
|
mp_ptr prodp;
|
||||||
mp_srcptr up;
|
mp_srcptr up;
|
||||||
mp_size_t size;
|
mp_size_t size;
|
||||||
@ -251,7 +244,7 @@ ____mpn_sqr_n_basecase (prodp, up, size)
|
|||||||
cy_limb = 0;
|
cy_limb = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
cy_limb = __mpn_mul_1 (prodp, up, size, v_limb);
|
cy_limb = mpn_mul_1 (prodp, up, size, v_limb);
|
||||||
|
|
||||||
prodp[size] = cy_limb;
|
prodp[size] = cy_limb;
|
||||||
prodp++;
|
prodp++;
|
||||||
@ -265,10 +258,10 @@ ____mpn_sqr_n_basecase (prodp, up, size)
|
|||||||
{
|
{
|
||||||
cy_limb = 0;
|
cy_limb = 0;
|
||||||
if (v_limb == 1)
|
if (v_limb == 1)
|
||||||
cy_limb = __mpn_add_n (prodp, prodp, up, size);
|
cy_limb = mpn_add_n (prodp, prodp, up, size);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
cy_limb = __mpn_addmul_1 (prodp, up, size, v_limb);
|
cy_limb = mpn_addmul_1 (prodp, up, size, v_limb);
|
||||||
|
|
||||||
prodp[size] = cy_limb;
|
prodp[size] = cy_limb;
|
||||||
prodp++;
|
prodp++;
|
||||||
@ -277,10 +270,10 @@ ____mpn_sqr_n_basecase (prodp, up, size)
|
|||||||
|
|
||||||
void
|
void
|
||||||
#if __STDC__
|
#if __STDC__
|
||||||
____mpn_sqr_n (mp_ptr prodp,
|
impn_sqr_n (mp_ptr prodp,
|
||||||
mp_srcptr up, mp_size_t size, mp_ptr tspace)
|
mp_srcptr up, mp_size_t size, mp_ptr tspace)
|
||||||
#else
|
#else
|
||||||
____mpn_sqr_n (prodp, up, size, tspace)
|
impn_sqr_n (prodp, up, size, tspace)
|
||||||
mp_ptr prodp;
|
mp_ptr prodp;
|
||||||
mp_srcptr up;
|
mp_srcptr up;
|
||||||
mp_size_t size;
|
mp_size_t size;
|
||||||
@ -303,9 +296,9 @@ ____mpn_sqr_n (prodp, up, size, tspace)
|
|||||||
mp_limb cy_limb;
|
mp_limb cy_limb;
|
||||||
|
|
||||||
MPN_SQR_N_RECURSE (prodp, up, esize, tspace);
|
MPN_SQR_N_RECURSE (prodp, up, esize, tspace);
|
||||||
cy_limb = __mpn_addmul_1 (prodp + esize, up, esize, up[esize]);
|
cy_limb = mpn_addmul_1 (prodp + esize, up, esize, up[esize]);
|
||||||
prodp[esize + esize] = cy_limb;
|
prodp[esize + esize] = cy_limb;
|
||||||
cy_limb = __mpn_addmul_1 (prodp + esize, up, size, up[esize]);
|
cy_limb = mpn_addmul_1 (prodp + esize, up, size, up[esize]);
|
||||||
|
|
||||||
prodp[esize + size] = cy_limb;
|
prodp[esize + size] = cy_limb;
|
||||||
}
|
}
|
||||||
@ -322,13 +315,13 @@ ____mpn_sqr_n (prodp, up, size, tspace)
|
|||||||
|
|
||||||
/*** Product M. ________________
|
/*** Product M. ________________
|
||||||
|_(U1-U0)(U0-U1)_| */
|
|_(U1-U0)(U0-U1)_| */
|
||||||
if (__mpn_cmp (up + hsize, up, hsize) >= 0)
|
if (mpn_cmp (up + hsize, up, hsize) >= 0)
|
||||||
{
|
{
|
||||||
__mpn_sub_n (prodp, up + hsize, up, hsize);
|
mpn_sub_n (prodp, up + hsize, up, hsize);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
__mpn_sub_n (prodp, up, up + hsize, hsize);
|
mpn_sub_n (prodp, up, up + hsize, hsize);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read temporary operands from low part of PROD.
|
/* Read temporary operands from low part of PROD.
|
||||||
@ -338,10 +331,10 @@ ____mpn_sqr_n (prodp, up, size, tspace)
|
|||||||
|
|
||||||
/*** Add/copy product H. */
|
/*** Add/copy product H. */
|
||||||
MPN_COPY (prodp + hsize, prodp + size, hsize);
|
MPN_COPY (prodp + hsize, prodp + size, hsize);
|
||||||
cy = __mpn_add_n (prodp + size, prodp + size, prodp + size + hsize, hsize);
|
cy = mpn_add_n (prodp + size, prodp + size, prodp + size + hsize, hsize);
|
||||||
|
|
||||||
/*** Add product M (if NEGFLG M is a negative number). */
|
/*** Add product M (if NEGFLG M is a negative number). */
|
||||||
cy -= __mpn_sub_n (prodp + hsize, prodp + hsize, tspace, size);
|
cy -= mpn_sub_n (prodp + hsize, prodp + hsize, tspace, size);
|
||||||
|
|
||||||
/*** Product L. ________________ ________________
|
/*** Product L. ________________ ________________
|
||||||
|________________||____U0 x U0_____| */
|
|________________||____U0 x U0_____| */
|
||||||
@ -352,53 +345,56 @@ ____mpn_sqr_n (prodp, up, size, tspace)
|
|||||||
|
|
||||||
/*** Add/copy Product L (twice). */
|
/*** Add/copy Product L (twice). */
|
||||||
|
|
||||||
cy += __mpn_add_n (prodp + hsize, prodp + hsize, tspace, size);
|
cy += mpn_add_n (prodp + hsize, prodp + hsize, tspace, size);
|
||||||
if (cy)
|
if (cy)
|
||||||
__mpn_add_1 (prodp + hsize + size, prodp + hsize + size, hsize, cy);
|
mpn_add_1 (prodp + hsize + size, prodp + hsize + size, hsize, cy);
|
||||||
|
|
||||||
MPN_COPY (prodp, tspace, hsize);
|
MPN_COPY (prodp, tspace, hsize);
|
||||||
cy = __mpn_add_n (prodp + hsize, prodp + hsize, tspace + hsize, hsize);
|
cy = mpn_add_n (prodp + hsize, prodp + hsize, tspace + hsize, hsize);
|
||||||
if (cy)
|
if (cy)
|
||||||
__mpn_add_1 (prodp + size, prodp + size, size, 1);
|
mpn_add_1 (prodp + size, prodp + size, size, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This should be made into an inline function in gmp.h. */
|
/* This should be made into an inline function in gmp.h. */
|
||||||
inline void
|
inline void
|
||||||
#if __STDC__
|
#if __STDC__
|
||||||
__mpn_mul_n (mp_ptr prodp, mp_srcptr up, mp_srcptr vp, mp_size_t size)
|
mpn_mul_n (mp_ptr prodp, mp_srcptr up, mp_srcptr vp, mp_size_t size)
|
||||||
#else
|
#else
|
||||||
__mpn_mul_n (prodp, up, vp, size)
|
mpn_mul_n (prodp, up, vp, size)
|
||||||
mp_ptr prodp;
|
mp_ptr prodp;
|
||||||
mp_srcptr up;
|
mp_srcptr up;
|
||||||
mp_srcptr vp;
|
mp_srcptr vp;
|
||||||
mp_size_t size;
|
mp_size_t size;
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
TMP_DECL (marker);
|
||||||
|
TMP_MARK (marker);
|
||||||
if (up == vp)
|
if (up == vp)
|
||||||
{
|
{
|
||||||
if (size < KARATSUBA_THRESHOLD)
|
if (size < KARATSUBA_THRESHOLD)
|
||||||
{
|
{
|
||||||
____mpn_sqr_n_basecase (prodp, up, size);
|
impn_sqr_n_basecase (prodp, up, size);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mp_ptr tspace;
|
mp_ptr tspace;
|
||||||
tspace = (mp_ptr) alloca (2 * size * BYTES_PER_MP_LIMB);
|
tspace = (mp_ptr) TMP_ALLOC (2 * size * BYTES_PER_MP_LIMB);
|
||||||
____mpn_sqr_n (prodp, up, size, tspace);
|
impn_sqr_n (prodp, up, size, tspace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (size < KARATSUBA_THRESHOLD)
|
if (size < KARATSUBA_THRESHOLD)
|
||||||
{
|
{
|
||||||
____mpn_mul_n_basecase (prodp, up, vp, size);
|
impn_mul_n_basecase (prodp, up, vp, size);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mp_ptr tspace;
|
mp_ptr tspace;
|
||||||
tspace = (mp_ptr) alloca (2 * size * BYTES_PER_MP_LIMB);
|
tspace = (mp_ptr) TMP_ALLOC (2 * size * BYTES_PER_MP_LIMB);
|
||||||
____mpn_mul_n (prodp, up, vp, size, tspace);
|
impn_mul_n (prodp, up, vp, size, tspace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
TMP_FREE (marker);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* __mpn_rshift -- Shift right a low-level natural-number integer.
|
/* mpn_rshift -- Shift right a low-level natural-number integer.
|
||||||
|
|
||||||
Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1991, 1993, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -32,11 +32,11 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
|
|
||||||
mp_limb
|
mp_limb
|
||||||
#if __STDC__
|
#if __STDC__
|
||||||
__mpn_rshift (register mp_ptr wp,
|
mpn_rshift (register mp_ptr wp,
|
||||||
register mp_srcptr up, mp_size_t usize,
|
register mp_srcptr up, mp_size_t usize,
|
||||||
register unsigned int cnt)
|
register unsigned int cnt)
|
||||||
#else
|
#else
|
||||||
__mpn_rshift (wp, up, usize, cnt)
|
mpn_rshift (wp, up, usize, cnt)
|
||||||
register mp_ptr wp;
|
register mp_ptr wp;
|
||||||
register mp_srcptr up;
|
register mp_srcptr up;
|
||||||
mp_size_t usize;
|
mp_size_t usize;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* __mpn_sub_n -- Subtract two limb vectors of equal, non-zero length.
|
/* mpn_sub_n -- Subtract two limb vectors of equal, non-zero length.
|
||||||
|
|
||||||
Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1992, 1993, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -23,9 +23,9 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
|
|
||||||
mp_limb
|
mp_limb
|
||||||
#if __STDC__
|
#if __STDC__
|
||||||
__mpn_sub_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr, mp_size_t size)
|
mpn_sub_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr, mp_size_t size)
|
||||||
#else
|
#else
|
||||||
__mpn_sub_n (res_ptr, s1_ptr, s2_ptr, size)
|
mpn_sub_n (res_ptr, s1_ptr, s2_ptr, size)
|
||||||
register mp_ptr res_ptr;
|
register mp_ptr res_ptr;
|
||||||
register mp_srcptr s1_ptr;
|
register mp_srcptr s1_ptr;
|
||||||
register mp_srcptr s2_ptr;
|
register mp_srcptr s2_ptr;
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
/* __mpn_submul_1 -- multiply the S1_SIZE long limb vector pointed to by S1_PTR
|
/* mpn_submul_1 -- multiply the S1_SIZE long limb vector pointed to by S1_PTR
|
||||||
by S2_LIMB, subtract the S1_SIZE least significant limbs of the product
|
by S2_LIMB, subtract the S1_SIZE least significant limbs of the product
|
||||||
from the limb vector pointed to by RES_PTR. Return the most significant
|
from the limb vector pointed to by RES_PTR. Return the most significant
|
||||||
limb of the product, adjusted for carry-out from the subtraction.
|
limb of the product, adjusted for carry-out from the subtraction.
|
||||||
|
|
||||||
Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1992, 1993, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -26,7 +26,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
#include "longlong.h"
|
#include "longlong.h"
|
||||||
|
|
||||||
mp_limb
|
mp_limb
|
||||||
__mpn_submul_1 (res_ptr, s1_ptr, s1_size, s2_limb)
|
mpn_submul_1 (res_ptr, s1_ptr, s1_size, s2_limb)
|
||||||
register mp_ptr res_ptr;
|
register mp_ptr res_ptr;
|
||||||
register mp_srcptr s1_ptr;
|
register mp_srcptr s1_ptr;
|
||||||
mp_size_t s1_size;
|
mp_size_t s1_size;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* gmp-mparam.h -- Compiler/machine parameter header file.
|
/* gmp-mparam.h -- Compiler/machine parameter header file.
|
||||||
|
|
||||||
Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* Pentium __mpn_add_n -- Add two limb vectors of the same length > 0 and store
|
/* Pentium __mpn_add_n -- Add two limb vectors of the same length > 0 and store
|
||||||
sum in a third limb vector.
|
sum in a third limb vector.
|
||||||
|
|
||||||
Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
|
Copyright (C) 1992, 1994, 1995, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -30,13 +30,6 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
#include "sysdep.h"
|
#include "sysdep.h"
|
||||||
#include "asm-syntax.h"
|
#include "asm-syntax.h"
|
||||||
|
|
||||||
#define t1 %eax
|
|
||||||
#define t2 %edx
|
|
||||||
#define src1 %esi
|
|
||||||
#define src2 %ebp
|
|
||||||
#define dst %edi
|
|
||||||
#define x %ebx
|
|
||||||
|
|
||||||
.text
|
.text
|
||||||
ALIGN (3)
|
ALIGN (3)
|
||||||
.globl C_SYMBOL_NAME(__mpn_add_n)
|
.globl C_SYMBOL_NAME(__mpn_add_n)
|
||||||
@ -46,85 +39,85 @@ C_SYMBOL_NAME(__mpn_add_n:)
|
|||||||
pushl %ebx
|
pushl %ebx
|
||||||
pushl %ebp
|
pushl %ebp
|
||||||
|
|
||||||
movl 20(%esp),dst /* res_ptr */
|
movl 20(%esp),%edi /* res_ptr */
|
||||||
movl 24(%esp),src1 /* s1_ptr */
|
movl 24(%esp),%esi /* s1_ptr */
|
||||||
movl 28(%esp),src2 /* s2_ptr */
|
movl 28(%esp),%ebp /* s2_ptr */
|
||||||
movl 32(%esp),%ecx /* size */
|
movl 32(%esp),%ecx /* size */
|
||||||
|
|
||||||
movl (src2),x
|
movl (%ebp),%ebx
|
||||||
|
|
||||||
decl %ecx
|
decl %ecx
|
||||||
movl %ecx,t2
|
movl %ecx,%edx
|
||||||
shrl $3,%ecx
|
shrl $3,%ecx
|
||||||
andl $7,t2
|
andl $7,%edx
|
||||||
testl %ecx,%ecx /* zero carry flag */
|
testl %ecx,%ecx /* zero carry flag */
|
||||||
jz Lend
|
jz Lend
|
||||||
pushl t2
|
pushl %edx
|
||||||
|
|
||||||
ALIGN (3)
|
ALIGN (3)
|
||||||
Loop: movl 28(dst),%eax /* fetch destination cache line */
|
Loop: movl 28(%edi),%eax /* fetch destination cache line */
|
||||||
leal 32(dst),dst
|
leal 32(%edi),%edi
|
||||||
|
|
||||||
L1: movl (src1),t1
|
L1: movl (%esi),%eax
|
||||||
movl 4(src1),t2
|
movl 4(%esi),%edx
|
||||||
adcl x,t1
|
adcl %ebx,%eax
|
||||||
movl 4(src2),x
|
movl 4(%ebp),%ebx
|
||||||
adcl x,t2
|
adcl %ebx,%edx
|
||||||
movl 8(src2),x
|
movl 8(%ebp),%ebx
|
||||||
movl t1,-32(dst)
|
movl %eax,-32(%edi)
|
||||||
movl t2,-28(dst)
|
movl %edx,-28(%edi)
|
||||||
|
|
||||||
L2: movl 8(src1),t1
|
L2: movl 8(%esi),%eax
|
||||||
movl 12(src1),t2
|
movl 12(%esi),%edx
|
||||||
adcl x,t1
|
adcl %ebx,%eax
|
||||||
movl 12(src2),x
|
movl 12(%ebp),%ebx
|
||||||
adcl x,t2
|
adcl %ebx,%edx
|
||||||
movl 16(src2),x
|
movl 16(%ebp),%ebx
|
||||||
movl t1,-24(dst)
|
movl %eax,-24(%edi)
|
||||||
movl t2,-20(dst)
|
movl %edx,-20(%edi)
|
||||||
|
|
||||||
L3: movl 16(src1),t1
|
L3: movl 16(%esi),%eax
|
||||||
movl 20(src1),t2
|
movl 20(%esi),%edx
|
||||||
adcl x,t1
|
adcl %ebx,%eax
|
||||||
movl 20(src2),x
|
movl 20(%ebp),%ebx
|
||||||
adcl x,t2
|
adcl %ebx,%edx
|
||||||
movl 24(src2),x
|
movl 24(%ebp),%ebx
|
||||||
movl t1,-16(dst)
|
movl %eax,-16(%edi)
|
||||||
movl t2,-12(dst)
|
movl %edx,-12(%edi)
|
||||||
|
|
||||||
L4: movl 24(src1),t1
|
L4: movl 24(%esi),%eax
|
||||||
movl 28(src1),t2
|
movl 28(%esi),%edx
|
||||||
adcl x,t1
|
adcl %ebx,%eax
|
||||||
movl 28(src2),x
|
movl 28(%ebp),%ebx
|
||||||
adcl x,t2
|
adcl %ebx,%edx
|
||||||
movl 32(src2),x
|
movl 32(%ebp),%ebx
|
||||||
movl t1,-8(dst)
|
movl %eax,-8(%edi)
|
||||||
movl t2,-4(dst)
|
movl %edx,-4(%edi)
|
||||||
|
|
||||||
leal 32(src1),src1
|
leal 32(%esi),%esi
|
||||||
leal 32(src2),src2
|
leal 32(%ebp),%ebp
|
||||||
decl %ecx
|
decl %ecx
|
||||||
jnz Loop
|
jnz Loop
|
||||||
|
|
||||||
popl t2
|
popl %edx
|
||||||
Lend:
|
Lend:
|
||||||
decl t2 /* test t2 w/o clobbering carry */
|
decl %edx /* test %edx w/o clobbering carry */
|
||||||
js Lend2
|
js Lend2
|
||||||
incl t2
|
incl %edx
|
||||||
Loop2:
|
Loop2:
|
||||||
leal 4(dst),dst
|
leal 4(%edi),%edi
|
||||||
movl (src1),t1
|
movl (%esi),%eax
|
||||||
adcl x,t1
|
adcl %ebx,%eax
|
||||||
movl 4(src2),x
|
movl 4(%ebp),%ebx
|
||||||
movl t1,-4(dst)
|
movl %eax,-4(%edi)
|
||||||
leal 4(src1),src1
|
leal 4(%esi),%esi
|
||||||
leal 4(src2),src2
|
leal 4(%ebp),%ebp
|
||||||
decl t2
|
decl %edx
|
||||||
jnz Loop2
|
jnz Loop2
|
||||||
Lend2:
|
Lend2:
|
||||||
movl (src1),t1
|
movl (%esi),%eax
|
||||||
adcl x,t1
|
adcl %ebx,%eax
|
||||||
movl t1,(dst)
|
movl %eax,(%edi)
|
||||||
|
|
||||||
sbbl %eax,%eax
|
sbbl %eax,%eax
|
||||||
negl %eax
|
negl %eax
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* Pentium __mpn_addmul_1 -- Multiply a limb vector with a limb and add
|
/* Pentium __mpn_addmul_1 -- Multiply a limb vector with a limb and add
|
||||||
the result to a second limb vector.
|
the result to a second limb vector.
|
||||||
|
|
||||||
Copyright (C) 1992, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -32,12 +32,12 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
|
|
||||||
#define res_ptr edi
|
#define res_ptr edi
|
||||||
#define s1_ptr esi
|
#define s1_ptr esi
|
||||||
|
#define size ecx
|
||||||
#define s2_limb ebp
|
#define s2_limb ebp
|
||||||
|
|
||||||
TEXT
|
TEXT
|
||||||
ALIGN (3)
|
ALIGN (3)
|
||||||
GLOBL C_SYMBOL_NAME(__mpn_addmul_1)
|
GLOBL C_SYMBOL_NAME(__mpn_addmul_1)
|
||||||
.type C_SYMBOL_NAME(__mpn_addmul_1),@function
|
|
||||||
C_SYMBOL_NAME(__mpn_addmul_1:)
|
C_SYMBOL_NAME(__mpn_addmul_1:)
|
||||||
|
|
||||||
INSN1(push,l ,R(edi))
|
INSN1(push,l ,R(edi))
|
||||||
@ -47,38 +47,36 @@ C_SYMBOL_NAME(__mpn_addmul_1:)
|
|||||||
|
|
||||||
INSN2(mov,l ,R(res_ptr),MEM_DISP(esp,20))
|
INSN2(mov,l ,R(res_ptr),MEM_DISP(esp,20))
|
||||||
INSN2(mov,l ,R(s1_ptr),MEM_DISP(esp,24))
|
INSN2(mov,l ,R(s1_ptr),MEM_DISP(esp,24))
|
||||||
INSN2(mov,l ,R(ecx),MEM_DISP(esp,28))
|
INSN2(mov,l ,R(size),MEM_DISP(esp,28))
|
||||||
INSN2(mov,l ,R(s2_limb),MEM_DISP(esp,32))
|
INSN2(mov,l ,R(s2_limb),MEM_DISP(esp,32))
|
||||||
|
|
||||||
INSN2(lea,l ,R(res_ptr),MEM_INDEX(res_ptr,ecx,4))
|
INSN2(lea,l ,R(res_ptr),MEM_INDEX(res_ptr,size,4))
|
||||||
INSN2(lea,l ,R(s1_ptr),MEM_INDEX(s1_ptr,ecx,4))
|
INSN2(lea,l ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4))
|
||||||
INSN1(neg,l ,R(ecx))
|
INSN1(neg,l ,R(size))
|
||||||
INSN2(xor,l ,R(edx),R(edx))
|
INSN2(xor,l ,R(ebx),R(ebx))
|
||||||
ALIGN (3)
|
ALIGN (3)
|
||||||
Loop:
|
|
||||||
INSN2(mov,l ,R(ebx),R(edx))
|
Loop: INSN2(adc,l ,R(ebx),$0)
|
||||||
INSN2(mov,l ,R(eax),MEM_INDEX(s1_ptr,ecx,4))
|
INSN2(mov,l ,R(eax),MEM_INDEX(s1_ptr,size,4))
|
||||||
|
|
||||||
INSN1(mul,l ,R(s2_limb))
|
INSN1(mul,l ,R(s2_limb))
|
||||||
|
|
||||||
INSN2(add,l ,R(eax),R(ebx))
|
INSN2(add,l ,R(eax),R(ebx))
|
||||||
INSN2(mov,l ,R(ebx),MEM_INDEX(res_ptr,ecx,4))
|
INSN2(mov,l ,R(ebx),MEM_INDEX(res_ptr,size,4))
|
||||||
|
|
||||||
INSN2(adc,l ,R(edx),$0)
|
INSN2(adc,l ,R(edx),$0)
|
||||||
INSN2(add,l ,R(ebx),R(eax))
|
INSN2(add,l ,R(ebx),R(eax))
|
||||||
|
|
||||||
INSN2(adc,l ,R(edx),$0)
|
INSN2(mov,l ,MEM_INDEX(res_ptr,size,4),R(ebx))
|
||||||
INSN2(mov,l ,MEM_INDEX(res_ptr,ecx,4),R(ebx))
|
INSN1(inc,l ,R(size))
|
||||||
|
|
||||||
INSN1(inc,l ,R(ecx))
|
INSN2(mov,l ,R(ebx),R(edx))
|
||||||
INSN1(jnz, ,Loop)
|
INSN1(jnz, ,Loop)
|
||||||
|
|
||||||
|
INSN2(adc,l ,R(ebx),$0)
|
||||||
INSN2(mov,l ,R(eax),R(edx))
|
INSN2(mov,l ,R(eax),R(ebx))
|
||||||
INSN1(pop,l ,R(ebp))
|
INSN1(pop,l ,R(ebp))
|
||||||
INSN1(pop,l ,R(ebx))
|
INSN1(pop,l ,R(ebx))
|
||||||
INSN1(pop,l ,R(esi))
|
INSN1(pop,l ,R(esi))
|
||||||
INSN1(pop,l ,R(edi))
|
INSN1(pop,l ,R(edi))
|
||||||
ret
|
ret
|
||||||
Lfe1:
|
|
||||||
.size C_SYMBOL_NAME(__mpn_addmul_1),Lfe1-C_SYMBOL_NAME(__mpn_addmul_1)
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* Pentium __mpn_mul_1 -- Multiply a limb vector with a limb and store
|
/* Pentium __mpn_mul_1 -- Multiply a limb vector with a limb and store
|
||||||
the result in a second limb vector.
|
the result in a second limb vector.
|
||||||
|
|
||||||
Copyright (C) 1992, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -53,24 +53,24 @@ C_SYMBOL_NAME(__mpn_mul_1:)
|
|||||||
INSN2(lea,l ,R(res_ptr),MEM_INDEX(res_ptr,size,4))
|
INSN2(lea,l ,R(res_ptr),MEM_INDEX(res_ptr,size,4))
|
||||||
INSN2(lea,l ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4))
|
INSN2(lea,l ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4))
|
||||||
INSN1(neg,l ,R(size))
|
INSN1(neg,l ,R(size))
|
||||||
INSN2(xor,l ,R(edx),R(edx))
|
INSN2(xor,l ,R(ebx),R(ebx))
|
||||||
ALIGN (3)
|
ALIGN (3)
|
||||||
Loop:
|
|
||||||
INSN2(mov,l ,R(ebx),R(edx))
|
Loop: INSN2(adc,l ,R(ebx),$0)
|
||||||
INSN2(mov,l ,R(eax),MEM_INDEX(s1_ptr,size,4))
|
INSN2(mov,l ,R(eax),MEM_INDEX(s1_ptr,size,4))
|
||||||
|
|
||||||
INSN1(mul,l ,R(s2_limb))
|
INSN1(mul,l ,R(s2_limb))
|
||||||
|
|
||||||
INSN2(add,l ,R(eax),R(ebx))
|
INSN2(add,l ,R(ebx),R(eax))
|
||||||
|
|
||||||
INSN2(adc,l ,R(edx),$0)
|
|
||||||
INSN2(mov,l ,MEM_INDEX(res_ptr,size,4),R(eax))
|
|
||||||
|
|
||||||
|
INSN2(mov,l ,MEM_INDEX(res_ptr,size,4),R(ebx))
|
||||||
INSN1(inc,l ,R(size))
|
INSN1(inc,l ,R(size))
|
||||||
|
|
||||||
|
INSN2(mov,l ,R(ebx),R(edx))
|
||||||
INSN1(jnz, ,Loop)
|
INSN1(jnz, ,Loop)
|
||||||
|
|
||||||
|
INSN2(adc,l ,R(ebx),$0)
|
||||||
INSN2(mov,l ,R(eax),R(edx))
|
INSN2(mov,l ,R(eax),R(ebx))
|
||||||
INSN1(pop,l ,R(ebp))
|
INSN1(pop,l ,R(ebp))
|
||||||
INSN1(pop,l ,R(ebx))
|
INSN1(pop,l ,R(ebx))
|
||||||
INSN1(pop,l ,R(esi))
|
INSN1(pop,l ,R(esi))
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* Pentium __mpn_sub_n -- Subtract two limb vectors of the same length > 0
|
/* Pentium __mpn_sub_n -- Subtract two limb vectors of the same length > 0
|
||||||
and store difference in a third limb vector.
|
and store difference in a third limb vector.
|
||||||
|
|
||||||
Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
|
Copyright (C) 1992, 1994, 1995, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -30,13 +30,6 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
#include "sysdep.h"
|
#include "sysdep.h"
|
||||||
#include "asm-syntax.h"
|
#include "asm-syntax.h"
|
||||||
|
|
||||||
#define t1 %eax
|
|
||||||
#define t2 %edx
|
|
||||||
#define src1 %esi
|
|
||||||
#define src2 %ebp
|
|
||||||
#define dst %edi
|
|
||||||
#define x %ebx
|
|
||||||
|
|
||||||
.text
|
.text
|
||||||
ALIGN (3)
|
ALIGN (3)
|
||||||
.globl C_SYMBOL_NAME(__mpn_sub_n)
|
.globl C_SYMBOL_NAME(__mpn_sub_n)
|
||||||
@ -46,85 +39,85 @@ C_SYMBOL_NAME(__mpn_sub_n:)
|
|||||||
pushl %ebx
|
pushl %ebx
|
||||||
pushl %ebp
|
pushl %ebp
|
||||||
|
|
||||||
movl 20(%esp),dst /* res_ptr */
|
movl 20(%esp),%edi /* res_ptr */
|
||||||
movl 24(%esp),src1 /* s1_ptr */
|
movl 24(%esp),%esi /* s1_ptr */
|
||||||
movl 28(%esp),src2 /* s2_ptr */
|
movl 28(%esp),%ebp /* s2_ptr */
|
||||||
movl 32(%esp),%ecx /* size */
|
movl 32(%esp),%ecx /* size */
|
||||||
|
|
||||||
movl (src2),x
|
movl (%ebp),%ebx
|
||||||
|
|
||||||
decl %ecx
|
decl %ecx
|
||||||
movl %ecx,t2
|
movl %ecx,%edx
|
||||||
shrl $3,%ecx
|
shrl $3,%ecx
|
||||||
andl $7,t2
|
andl $7,%edx
|
||||||
testl %ecx,%ecx /* zero carry flag */
|
testl %ecx,%ecx /* zero carry flag */
|
||||||
jz Lend
|
jz Lend
|
||||||
pushl t2
|
pushl %edx
|
||||||
|
|
||||||
ALIGN (3)
|
ALIGN (3)
|
||||||
Loop: movl 28(dst),%eax /* fetch destination cache line */
|
Loop: movl 28(%edi),%eax /* fetch destination cache line */
|
||||||
leal 32(dst),dst
|
leal 32(%edi),%edi
|
||||||
|
|
||||||
L1: movl (src1),t1
|
L1: movl (%esi),%eax
|
||||||
movl 4(src1),t2
|
movl 4(%esi),%edx
|
||||||
sbbl x,t1
|
sbbl %ebx,%eax
|
||||||
movl 4(src2),x
|
movl 4(%ebp),%ebx
|
||||||
sbbl x,t2
|
sbbl %ebx,%edx
|
||||||
movl 8(src2),x
|
movl 8(%ebp),%ebx
|
||||||
movl t1,-32(dst)
|
movl %eax,-32(%edi)
|
||||||
movl t2,-28(dst)
|
movl %edx,-28(%edi)
|
||||||
|
|
||||||
L2: movl 8(src1),t1
|
L2: movl 8(%esi),%eax
|
||||||
movl 12(src1),t2
|
movl 12(%esi),%edx
|
||||||
sbbl x,t1
|
sbbl %ebx,%eax
|
||||||
movl 12(src2),x
|
movl 12(%ebp),%ebx
|
||||||
sbbl x,t2
|
sbbl %ebx,%edx
|
||||||
movl 16(src2),x
|
movl 16(%ebp),%ebx
|
||||||
movl t1,-24(dst)
|
movl %eax,-24(%edi)
|
||||||
movl t2,-20(dst)
|
movl %edx,-20(%edi)
|
||||||
|
|
||||||
L3: movl 16(src1),t1
|
L3: movl 16(%esi),%eax
|
||||||
movl 20(src1),t2
|
movl 20(%esi),%edx
|
||||||
sbbl x,t1
|
sbbl %ebx,%eax
|
||||||
movl 20(src2),x
|
movl 20(%ebp),%ebx
|
||||||
sbbl x,t2
|
sbbl %ebx,%edx
|
||||||
movl 24(src2),x
|
movl 24(%ebp),%ebx
|
||||||
movl t1,-16(dst)
|
movl %eax,-16(%edi)
|
||||||
movl t2,-12(dst)
|
movl %edx,-12(%edi)
|
||||||
|
|
||||||
L4: movl 24(src1),t1
|
L4: movl 24(%esi),%eax
|
||||||
movl 28(src1),t2
|
movl 28(%esi),%edx
|
||||||
sbbl x,t1
|
sbbl %ebx,%eax
|
||||||
movl 28(src2),x
|
movl 28(%ebp),%ebx
|
||||||
sbbl x,t2
|
sbbl %ebx,%edx
|
||||||
movl 32(src2),x
|
movl 32(%ebp),%ebx
|
||||||
movl t1,-8(dst)
|
movl %eax,-8(%edi)
|
||||||
movl t2,-4(dst)
|
movl %edx,-4(%edi)
|
||||||
|
|
||||||
leal 32(src1),src1
|
leal 32(%esi),%esi
|
||||||
leal 32(src2),src2
|
leal 32(%ebp),%ebp
|
||||||
decl %ecx
|
decl %ecx
|
||||||
jnz Loop
|
jnz Loop
|
||||||
|
|
||||||
popl t2
|
popl %edx
|
||||||
Lend:
|
Lend:
|
||||||
decl t2 /* test t2 w/o clobbering carry */
|
decl %edx /* test %edx w/o clobbering carry */
|
||||||
js Lend2
|
js Lend2
|
||||||
incl t2
|
incl %edx
|
||||||
Loop2:
|
Loop2:
|
||||||
leal 4(dst),dst
|
leal 4(%edi),%edi
|
||||||
movl (src1),t1
|
movl (%esi),%eax
|
||||||
sbbl x,t1
|
sbbl %ebx,%eax
|
||||||
movl 4(src2),x
|
movl 4(%ebp),%ebx
|
||||||
movl t1,-4(dst)
|
movl %eax,-4(%edi)
|
||||||
leal 4(src1),src1
|
leal 4(%esi),%esi
|
||||||
leal 4(src2),src2
|
leal 4(%ebp),%ebp
|
||||||
decl t2
|
decl %edx
|
||||||
jnz Loop2
|
jnz Loop2
|
||||||
Lend2:
|
Lend2:
|
||||||
movl (src1),t1
|
movl (%esi),%eax
|
||||||
sbbl x,t1
|
sbbl %ebx,%eax
|
||||||
movl t1,(dst)
|
movl %eax,(%edi)
|
||||||
|
|
||||||
sbbl %eax,%eax
|
sbbl %eax,%eax
|
||||||
negl %eax
|
negl %eax
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* Pentium __mpn_submul_1 -- Multiply a limb vector with a limb and subtract
|
/* Pentium __mpn_submul_1 -- Multiply a limb vector with a limb and subtract
|
||||||
the result from a second limb vector.
|
the result from a second limb vector.
|
||||||
|
|
||||||
Copyright (C) 1992, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -53,10 +53,10 @@ C_SYMBOL_NAME(__mpn_submul_1:)
|
|||||||
INSN2(lea,l ,R(res_ptr),MEM_INDEX(res_ptr,size,4))
|
INSN2(lea,l ,R(res_ptr),MEM_INDEX(res_ptr,size,4))
|
||||||
INSN2(lea,l ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4))
|
INSN2(lea,l ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4))
|
||||||
INSN1(neg,l ,R(size))
|
INSN1(neg,l ,R(size))
|
||||||
INSN2(xor,l ,R(edx),R(edx))
|
INSN2(xor,l ,R(ebx),R(ebx))
|
||||||
ALIGN (3)
|
ALIGN (3)
|
||||||
Loop:
|
|
||||||
INSN2(mov,l ,R(ebx),R(edx))
|
Loop: INSN2(adc,l ,R(ebx),$0)
|
||||||
INSN2(mov,l ,R(eax),MEM_INDEX(s1_ptr,size,4))
|
INSN2(mov,l ,R(eax),MEM_INDEX(s1_ptr,size,4))
|
||||||
|
|
||||||
INSN1(mul,l ,R(s2_limb))
|
INSN1(mul,l ,R(s2_limb))
|
||||||
@ -67,14 +67,14 @@ Loop:
|
|||||||
INSN2(adc,l ,R(edx),$0)
|
INSN2(adc,l ,R(edx),$0)
|
||||||
INSN2(sub,l ,R(ebx),R(eax))
|
INSN2(sub,l ,R(ebx),R(eax))
|
||||||
|
|
||||||
INSN2(adc,l ,R(edx),$0)
|
|
||||||
INSN2(mov,l ,MEM_INDEX(res_ptr,size,4),R(ebx))
|
INSN2(mov,l ,MEM_INDEX(res_ptr,size,4),R(ebx))
|
||||||
|
|
||||||
INSN1(inc,l ,R(size))
|
INSN1(inc,l ,R(size))
|
||||||
|
|
||||||
|
INSN2(mov,l ,R(ebx),R(edx))
|
||||||
INSN1(jnz, ,Loop)
|
INSN1(jnz, ,Loop)
|
||||||
|
|
||||||
|
INSN2(adc,l ,R(ebx),$0)
|
||||||
INSN2(mov,l ,R(eax),R(edx))
|
INSN2(mov,l ,R(eax),R(ebx))
|
||||||
INSN1(pop,l ,R(ebp))
|
INSN1(pop,l ,R(ebp))
|
||||||
INSN1(pop,l ,R(ebx))
|
INSN1(pop,l ,R(ebx))
|
||||||
INSN1(pop,l ,R(esi))
|
INSN1(pop,l ,R(esi))
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* mc68020 __mpn_add_n -- Add two limb vectors of the same length > 0 and store
|
/* mc68020 __mpn_add_n -- Add two limb vectors of the same length > 0 and store
|
||||||
sum in a third limb vector.
|
sum in a third limb vector.
|
||||||
|
|
||||||
Copyright (C) 1992, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -27,50 +27,53 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
size (sp + 12)
|
size (sp + 12)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "sysdep.h"
|
||||||
#include "asm-syntax.h"
|
#include "asm-syntax.h"
|
||||||
|
|
||||||
TEXT
|
TEXT
|
||||||
ALIGN
|
ALIGN
|
||||||
GLOBL ___mpn_add_n
|
GLOBL C_SYMBOL_NAME(__mpn_add_n)
|
||||||
|
|
||||||
LAB(___mpn_add_n)
|
C_SYMBOL_NAME(__mpn_add_n:)
|
||||||
|
PROLOG(__mpn_add_n)
|
||||||
/* Save used registers on the stack. */
|
/* Save used registers on the stack. */
|
||||||
INSN2(move,l ,MEM_PREDEC(sp),d2)
|
movel R(d2),MEM_PREDEC(sp)
|
||||||
INSN2(move,l ,MEM_PREDEC(sp),a2)
|
movel R(a2),MEM_PREDEC(sp)
|
||||||
|
|
||||||
/* Copy the arguments to registers. Better use movem? */
|
/* Copy the arguments to registers. Better use movem? */
|
||||||
INSN2(move,l ,a2,MEM_DISP(sp,12))
|
movel MEM_DISP(sp,12),R(a2)
|
||||||
INSN2(move,l ,a0,MEM_DISP(sp,16))
|
movel MEM_DISP(sp,16),R(a0)
|
||||||
INSN2(move,l ,a1,MEM_DISP(sp,20))
|
movel MEM_DISP(sp,20),R(a1)
|
||||||
INSN2(move,l ,d2,MEM_DISP(sp,24))
|
movel MEM_DISP(sp,24),R(d2)
|
||||||
|
|
||||||
INSN2(eor,w ,d2,#1)
|
eorw #1,R(d2)
|
||||||
INSN2(lsr,l ,d2,#1)
|
lsrl #1,R(d2)
|
||||||
bcc L1
|
bcc L(L1)
|
||||||
INSN2(subq,l ,d2,#1) /* clears cy as side effect */
|
subql #1,R(d2) /* clears cy as side effect */
|
||||||
|
|
||||||
LAB(Loop)
|
L(Loop:)
|
||||||
INSN2(move,l ,d0,MEM_POSTINC(a0))
|
movel MEM_POSTINC(a0),R(d0)
|
||||||
INSN2(move,l ,d1,MEM_POSTINC(a1))
|
movel MEM_POSTINC(a1),R(d1)
|
||||||
INSN2(addx,l ,d0,d1)
|
addxl R(d1),R(d0)
|
||||||
INSN2(move,l ,MEM_POSTINC(a2),d0)
|
movel R(d0),MEM_POSTINC(a2)
|
||||||
LAB(L1) INSN2(move,l ,d0,MEM_POSTINC(a0))
|
L(L1:) movel MEM_POSTINC(a0),R(d0)
|
||||||
INSN2(move,l ,d1,MEM_POSTINC(a1))
|
movel MEM_POSTINC(a1),R(d1)
|
||||||
INSN2(addx,l ,d0,d1)
|
addxl R(d1),R(d0)
|
||||||
INSN2(move,l ,MEM_POSTINC(a2),d0)
|
movel R(d0),MEM_POSTINC(a2)
|
||||||
|
|
||||||
dbf d2,Loop /* loop until 16 lsb of %4 == -1 */
|
dbf R(d2),L(Loop) /* loop until 16 lsb of %4 == -1 */
|
||||||
INSN2(subx,l ,d0,d0) /* d0 <= -cy; save cy as 0 or -1 in d0 */
|
subxl R(d0),R(d0) /* d0 <= -cy; save cy as 0 or -1 in d0 */
|
||||||
INSN2(sub,l ,d2,#0x10000)
|
subl #0x10000,R(d2)
|
||||||
bcs L2
|
bcs L(L2)
|
||||||
INSN2(add,l ,d0,d0) /* restore cy */
|
addl R(d0),R(d0) /* restore cy */
|
||||||
bra Loop
|
bra L(Loop)
|
||||||
|
|
||||||
LAB(L2)
|
L(L2:)
|
||||||
INSN1(neg,l ,d0)
|
negl R(d0)
|
||||||
|
|
||||||
/* Restore used registers from stack frame. */
|
/* Restore used registers from stack frame. */
|
||||||
INSN2(move,l ,a2,MEM_POSTINC(sp))
|
movel MEM_POSTINC(sp),R(a2)
|
||||||
INSN2(move,l ,d2,MEM_POSTINC(sp))
|
movel MEM_POSTINC(sp),R(d2)
|
||||||
|
|
||||||
rts
|
rts
|
||||||
|
EPILOG(__mpn_add_n)
|
||||||
|
150
sysdeps/m68k/lshift.S
Normal file
150
sysdeps/m68k/lshift.S
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
/* mc68020 __mpn_lshift -- Shift left a low-level natural-number integer.
|
||||||
|
|
||||||
|
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
|
||||||
|
the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
|
/*
|
||||||
|
INPUT PARAMETERS
|
||||||
|
res_ptr (sp + 4)
|
||||||
|
s_ptr (sp + 8)
|
||||||
|
s_size (sp + 16)
|
||||||
|
cnt (sp + 12)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "sysdep.h"
|
||||||
|
#include "asm-syntax.h"
|
||||||
|
|
||||||
|
#define res_ptr a1
|
||||||
|
#define s_ptr a0
|
||||||
|
#define s_size d6
|
||||||
|
#define cnt d4
|
||||||
|
|
||||||
|
TEXT
|
||||||
|
ALIGN
|
||||||
|
GLOBL C_SYMBOL_NAME(__mpn_lshift)
|
||||||
|
|
||||||
|
C_SYMBOL_NAME(__mpn_lshift:)
|
||||||
|
PROLOG(__mpn_lshift)
|
||||||
|
|
||||||
|
/* Save used registers on the stack. */
|
||||||
|
moveml R(d2)-R(d6)/R(a2),MEM_PREDEC(sp)
|
||||||
|
|
||||||
|
/* Copy the arguments to registers. */
|
||||||
|
movel MEM_DISP(sp,28),R(res_ptr)
|
||||||
|
movel MEM_DISP(sp,32),R(s_ptr)
|
||||||
|
movel MEM_DISP(sp,36),R(s_size)
|
||||||
|
movel MEM_DISP(sp,40),R(cnt)
|
||||||
|
|
||||||
|
moveql #1,R(d5)
|
||||||
|
cmpl R(d5),R(cnt)
|
||||||
|
bne L(Lnormal)
|
||||||
|
cmpl R(s_ptr),R(res_ptr)
|
||||||
|
bls L(Lspecial) /* jump if s_ptr >= res_ptr */
|
||||||
|
#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
|
||||||
|
lea MEM_INDX1(s_ptr,s_size,l,4),R(a2)
|
||||||
|
#else /* not mc68020 */
|
||||||
|
movel R(s_size),R(d0)
|
||||||
|
asll #2,R(d0)
|
||||||
|
lea MEM_INDX(s_ptr,d0,l),R(a2)
|
||||||
|
#endif
|
||||||
|
cmpl R(res_ptr),R(a2)
|
||||||
|
bls L(Lspecial) /* jump if res_ptr >= s_ptr + s_size */
|
||||||
|
|
||||||
|
L(Lnormal:)
|
||||||
|
moveql #32,R(d5)
|
||||||
|
subl R(cnt),R(d5)
|
||||||
|
|
||||||
|
#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
|
||||||
|
lea MEM_INDX1(s_ptr,s_size,l,4),R(s_ptr)
|
||||||
|
lea MEM_INDX1(res_ptr,s_size,l,4),R(res_ptr)
|
||||||
|
#else /* not mc68000 */
|
||||||
|
movel R(s_size),R(d0)
|
||||||
|
asll #2,R(d0)
|
||||||
|
addl R(s_size),R(s_ptr)
|
||||||
|
addl R(s_size),R(res_ptr)
|
||||||
|
#endif
|
||||||
|
movel MEM_PREDEC(s_ptr),R(d2)
|
||||||
|
movel R(d2),R(d0)
|
||||||
|
lsrl R(d5),R(d0) /* compute carry limb */
|
||||||
|
|
||||||
|
lsll R(cnt),R(d2)
|
||||||
|
movel R(d2),R(d1)
|
||||||
|
subql #1,R(s_size)
|
||||||
|
beq L(Lend)
|
||||||
|
lsrl #1,R(s_size)
|
||||||
|
bcs L(L1)
|
||||||
|
subql #1,R(s_size)
|
||||||
|
|
||||||
|
L(Loop:)
|
||||||
|
movel MEM_PREDEC(s_ptr),R(d2)
|
||||||
|
movel R(d2),R(d3)
|
||||||
|
lsrl R(d5),R(d3)
|
||||||
|
orl R(d3),R(d1)
|
||||||
|
movel R(d1),MEM_PREDEC(res_ptr)
|
||||||
|
lsll R(cnt),R(d2)
|
||||||
|
L(L1:)
|
||||||
|
movel MEM_PREDEC(s_ptr),R(d1)
|
||||||
|
movel R(d1),R(d3)
|
||||||
|
lsrl R(d5),R(d3)
|
||||||
|
orl R(d3),R(d2)
|
||||||
|
movel R(d2),MEM_PREDEC(res_ptr)
|
||||||
|
lsll R(cnt),R(d1)
|
||||||
|
|
||||||
|
dbf R(s_size),L(Loop)
|
||||||
|
subl #0x10000,R(s_size)
|
||||||
|
bcc L(Loop)
|
||||||
|
|
||||||
|
L(Lend:)
|
||||||
|
movel R(d1),MEM_PREDEC(res_ptr) /* store least significant limb */
|
||||||
|
|
||||||
|
/* Restore used registers from stack frame. */
|
||||||
|
moveml MEM_POSTINC(sp),R(d2)-R(d6)/R(a2)
|
||||||
|
rts
|
||||||
|
|
||||||
|
/* We loop from least significant end of the arrays, which is only
|
||||||
|
permissable if the source and destination don't overlap, since the
|
||||||
|
function is documented to work for overlapping source and destination. */
|
||||||
|
|
||||||
|
L(Lspecial:)
|
||||||
|
clrl R(d0) /* initialize carry */
|
||||||
|
eorw #1,R(s_size)
|
||||||
|
lsrl #1,R(s_size)
|
||||||
|
bcc L(LL1)
|
||||||
|
subql #1,R(s_size)
|
||||||
|
|
||||||
|
L(LLoop:)
|
||||||
|
movel MEM_POSTINC(s_ptr),R(d2)
|
||||||
|
addxl R(d2),R(d2)
|
||||||
|
movel R(d2),MEM_POSTINC(res_ptr)
|
||||||
|
L(LL1:)
|
||||||
|
movel MEM_POSTINC(s_ptr),R(d2)
|
||||||
|
addxl R(d2),R(d2)
|
||||||
|
movel R(d2),MEM_POSTINC(res_ptr)
|
||||||
|
|
||||||
|
dbf R(s_size),L(LLoop)
|
||||||
|
addxl R(d0),R(d0) /* save cy in lsb */
|
||||||
|
subl #0x10000,R(s_size)
|
||||||
|
bcs L(LLend)
|
||||||
|
lsrl #1,R(d0) /* restore cy */
|
||||||
|
bra L(LLoop)
|
||||||
|
|
||||||
|
L(LLend:)
|
||||||
|
/* Restore used registers from stack frame. */
|
||||||
|
moveml MEM_POSTINC(sp),R(d2)-R(d6)/R(a2)
|
||||||
|
rts
|
||||||
|
EPILOG(__mpn_lshift)
|
@ -1,7 +1,7 @@
|
|||||||
/* mc68020 __mpn_addmul_1 -- Multiply a limb vector with a limb and add
|
/* mc68020 __mpn_addmul_1 -- Multiply a limb vector with a limb and add
|
||||||
the result to a second limb vector.
|
the result to a second limb vector.
|
||||||
|
|
||||||
Copyright (C) 1992, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -23,58 +23,61 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
INPUT PARAMETERS
|
INPUT PARAMETERS
|
||||||
res_ptr (sp + 4)
|
res_ptr (sp + 4)
|
||||||
s1_ptr (sp + 8)
|
s1_ptr (sp + 8)
|
||||||
size (sp + 12)
|
s1_size (sp + 12)
|
||||||
s2_limb (sp + 16)
|
s2_limb (sp + 16)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "sysdep.h"
|
||||||
#include "asm-syntax.h"
|
#include "asm-syntax.h"
|
||||||
|
|
||||||
TEXT
|
TEXT
|
||||||
ALIGN
|
ALIGN
|
||||||
GLOBL ___mpn_addmul_1
|
GLOBL C_SYMBOL_NAME(__mpn_addmul_1)
|
||||||
|
|
||||||
LAB(___mpn_addmul_1)
|
C_SYMBOL_NAME(__mpn_addmul_1:)
|
||||||
|
PROLOG(__mpn_addmul_1)
|
||||||
|
|
||||||
#define res_ptr a0
|
#define res_ptr a0
|
||||||
#define s1_ptr a1
|
#define s1_ptr a1
|
||||||
#define size d2
|
#define s1_size d2
|
||||||
#define s2_limb d4
|
#define s2_limb d4
|
||||||
|
|
||||||
/* Save used registers on the stack. */
|
/* Save used registers on the stack. */
|
||||||
INSN2(movem,l ,MEM_PREDEC(sp),d2-d5)
|
moveml R(d2)-R(d5),MEM_PREDEC(sp)
|
||||||
|
|
||||||
/* Copy the arguments to registers. Better use movem? */
|
/* Copy the arguments to registers. Better use movem? */
|
||||||
INSN2(move,l ,res_ptr,MEM_DISP(sp,20))
|
movel MEM_DISP(sp,20),R(res_ptr)
|
||||||
INSN2(move,l ,s1_ptr,MEM_DISP(sp,24))
|
movel MEM_DISP(sp,24),R(s1_ptr)
|
||||||
INSN2(move,l ,size,MEM_DISP(sp,28))
|
movel MEM_DISP(sp,28),R(s1_size)
|
||||||
INSN2(move,l ,s2_limb,MEM_DISP(sp,32))
|
movel MEM_DISP(sp,32),R(s2_limb)
|
||||||
|
|
||||||
INSN2(eor,w ,size,#1)
|
eorw #1,R(s1_size)
|
||||||
INSN1(clr,l ,d1)
|
clrl R(d1)
|
||||||
INSN1(clr,l ,d5)
|
clrl R(d5)
|
||||||
INSN2(lsr,l ,size,#1)
|
lsrl #1,R(s1_size)
|
||||||
bcc L1
|
bcc L(L1)
|
||||||
INSN2(subq,l ,size,#1)
|
subql #1,R(s1_size)
|
||||||
INSN2(sub,l ,d0,d0) /* (d0,cy) <= (0,0) */
|
subl R(d0),R(d0) /* (d0,cy) <= (0,0) */
|
||||||
|
|
||||||
LAB(Loop)
|
L(Loop:)
|
||||||
INSN2(move,l ,d3,MEM_POSTINC(s1_ptr))
|
movel MEM_POSTINC(s1_ptr),R(d3)
|
||||||
INSN2(mulu,l ,d1:d3,s2_limb)
|
mulul R(s2_limb),R(d1):R(d3)
|
||||||
INSN2(addx,l ,d3,d0)
|
addxl R(d0),R(d3)
|
||||||
INSN2(addx,l ,d1,d5)
|
addxl R(d5),R(d1)
|
||||||
INSN2(add,l ,MEM_POSTINC(res_ptr),d3)
|
addl R(d3),MEM_POSTINC(res_ptr)
|
||||||
LAB(L1) INSN2(move,l ,d3,MEM_POSTINC(s1_ptr))
|
L(L1:) movel MEM_POSTINC(s1_ptr),R(d3)
|
||||||
INSN2(mulu,l ,d0:d3,s2_limb)
|
mulul R(s2_limb),R(d0):R(d3)
|
||||||
INSN2(addx,l ,d3,d1)
|
addxl R(d1),R(d3)
|
||||||
INSN2(addx,l ,d0,d5)
|
addxl R(d5),R(d0)
|
||||||
INSN2(add,l ,MEM_POSTINC(res_ptr),d3)
|
addl R(d3),MEM_POSTINC(res_ptr)
|
||||||
|
|
||||||
dbf size,Loop
|
dbf R(s1_size),L(Loop)
|
||||||
INSN2(addx,l ,d0,d5)
|
addxl R(d5),R(d0)
|
||||||
INSN2(sub,l ,size,#0x10000)
|
subl #0x10000,R(s1_size)
|
||||||
bcc Loop
|
bcc L(Loop)
|
||||||
|
|
||||||
/* Restore used registers from stack frame. */
|
/* Restore used registers from stack frame. */
|
||||||
INSN2(movem,l ,d2-d5,MEM_POSTINC(sp))
|
moveml MEM_POSTINC(sp),R(d2)-R(d5)
|
||||||
|
|
||||||
rts
|
rts
|
||||||
|
EPILOG(__mpn_addmul_1)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* mc68020 __mpn_mul_1 -- Multiply a limb vector with a limb and store
|
/* mc68020 __mpn_mul_1 -- Multiply a limb vector with a limb and store
|
||||||
the result in a second limb vector.
|
the result in a second limb vector.
|
||||||
|
|
||||||
Copyright (C) 1992, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -23,65 +23,68 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
INPUT PARAMETERS
|
INPUT PARAMETERS
|
||||||
res_ptr (sp + 4)
|
res_ptr (sp + 4)
|
||||||
s1_ptr (sp + 8)
|
s1_ptr (sp + 8)
|
||||||
size (sp + 12)
|
s1_size (sp + 12)
|
||||||
s2_limb (sp + 16)
|
s2_limb (sp + 16)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "sysdep.h"
|
||||||
#include "asm-syntax.h"
|
#include "asm-syntax.h"
|
||||||
|
|
||||||
TEXT
|
TEXT
|
||||||
ALIGN
|
ALIGN
|
||||||
GLOBL ___mpn_mul_1
|
GLOBL C_SYMBOL_NAME(__mpn_mul_1)
|
||||||
|
|
||||||
LAB(___mpn_mul_1)
|
C_SYMBOL_NAME(__mpn_mul_1:)
|
||||||
|
PROLOG(__mpn_mul_1)
|
||||||
|
|
||||||
#define res_ptr a0
|
#define res_ptr a0
|
||||||
#define s1_ptr a1
|
#define s1_ptr a1
|
||||||
#define size d2
|
#define s1_size d2
|
||||||
#define s2_limb d4
|
#define s2_limb d4
|
||||||
|
|
||||||
/* Save used registers on the stack. */
|
/* Save used registers on the stack. */
|
||||||
INSN2(movem,l ,MEM_PREDEC(sp),d2-d4)
|
moveml R(d2)-R(d4),MEM_PREDEC(sp)
|
||||||
#if 0
|
#if 0
|
||||||
INSN2(move,l ,MEM_PREDEC(sp),d2)
|
movel R(d2),MEM_PREDEC(sp)
|
||||||
INSN2(move,l ,MEM_PREDEC(sp),d3)
|
movel R(d3),MEM_PREDEC(sp)
|
||||||
INSN2(move,l ,MEM_PREDEC(sp),d4)
|
movel R(d4),MEM_PREDEC(sp)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Copy the arguments to registers. Better use movem? */
|
/* Copy the arguments to registers. Better use movem? */
|
||||||
INSN2(move,l ,res_ptr,MEM_DISP(sp,16))
|
movel MEM_DISP(sp,16),R(res_ptr)
|
||||||
INSN2(move,l ,s1_ptr,MEM_DISP(sp,20))
|
movel MEM_DISP(sp,20),R(s1_ptr)
|
||||||
INSN2(move,l ,size,MEM_DISP(sp,24))
|
movel MEM_DISP(sp,24),R(s1_size)
|
||||||
INSN2(move,l ,s2_limb,MEM_DISP(sp,28))
|
movel MEM_DISP(sp,28),R(s2_limb)
|
||||||
|
|
||||||
INSN2(eor,w ,size,#1)
|
eorw #1,R(s1_size)
|
||||||
INSN1(clr,l ,d1)
|
clrl R(d1)
|
||||||
INSN2(lsr,l ,size,#1)
|
lsrl #1,R(s1_size)
|
||||||
bcc L1
|
bcc L(L1)
|
||||||
INSN2(subq,l ,size,#1)
|
subql #1,R(s1_size)
|
||||||
INSN2(sub,l ,d0,d0) /* (d0,cy) <= (0,0) */
|
subl R(d0),R(d0) /* (d0,cy) <= (0,0) */
|
||||||
|
|
||||||
LAB(Loop)
|
L(Loop:)
|
||||||
INSN2(move,l ,d3,MEM_POSTINC(s1_ptr))
|
movel MEM_POSTINC(s1_ptr),R(d3)
|
||||||
INSN2(mulu,l ,d1:d3,s2_limb)
|
mulul R(s2_limb),R(d1):R(d3)
|
||||||
INSN2(addx,l ,d3,d0)
|
addxl R(d0),R(d3)
|
||||||
INSN2(move,l ,MEM_POSTINC(res_ptr),d3)
|
movel R(d3),MEM_POSTINC(res_ptr)
|
||||||
LAB(L1) INSN2(move,l ,d3,MEM_POSTINC(s1_ptr))
|
L(L1:) movel MEM_POSTINC(s1_ptr),R(d3)
|
||||||
INSN2(mulu,l ,d0:d3,s2_limb)
|
mulul R(s2_limb),R(d0):R(d3)
|
||||||
INSN2(addx,l ,d3,d1)
|
addxl R(d1),R(d3)
|
||||||
INSN2(move,l ,MEM_POSTINC(res_ptr),d3)
|
movel R(d3),MEM_POSTINC(res_ptr)
|
||||||
|
|
||||||
dbf size,Loop
|
dbf R(s1_size),L(Loop)
|
||||||
INSN1(clr,l ,d3)
|
clrl R(d3)
|
||||||
INSN2(addx,l ,d0,d3)
|
addxl R(d3),R(d0)
|
||||||
INSN2(sub,l ,size,#0x10000)
|
subl #0x10000,R(s1_size)
|
||||||
bcc Loop
|
bcc L(Loop)
|
||||||
|
|
||||||
/* Restore used registers from stack frame. */
|
/* Restore used registers from stack frame. */
|
||||||
INSN2(movem,l ,d2-d4,MEM_POSTINC(sp))
|
moveml MEM_POSTINC(sp),R(d2)-R(d4)
|
||||||
#if 0
|
#if 0
|
||||||
INSN2(move,l ,d4,MEM_POSTINC(sp))
|
movel MEM_POSTINC(sp),R(d4)
|
||||||
INSN2(move,l ,d3,MEM_POSTINC(sp))
|
movel MEM_POSTINC(sp),R(d3)
|
||||||
INSN2(move,l ,d2,MEM_POSTINC(sp))
|
movel MEM_POSTINC(sp),R(d2)
|
||||||
#endif
|
#endif
|
||||||
rts
|
rts
|
||||||
|
EPILOG(__mpn_mul_1)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* mc68020 __mpn_submul_1 -- Multiply a limb vector with a limb and subtract
|
/* mc68020 __mpn_submul_1 -- Multiply a limb vector with a limb and subtract
|
||||||
the result from a second limb vector.
|
the result from a second limb vector.
|
||||||
|
|
||||||
Copyright (C) 1992, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -23,58 +23,61 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
INPUT PARAMETERS
|
INPUT PARAMETERS
|
||||||
res_ptr (sp + 4)
|
res_ptr (sp + 4)
|
||||||
s1_ptr (sp + 8)
|
s1_ptr (sp + 8)
|
||||||
size (sp + 12)
|
s1_size (sp + 12)
|
||||||
s2_limb (sp + 16)
|
s2_limb (sp + 16)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "sysdep.h"
|
||||||
#include "asm-syntax.h"
|
#include "asm-syntax.h"
|
||||||
|
|
||||||
TEXT
|
TEXT
|
||||||
ALIGN
|
ALIGN
|
||||||
GLOBL ___mpn_submul_1
|
GLOBL C_SYMBOL_NAME(__mpn_submul_1)
|
||||||
|
|
||||||
LAB(___mpn_submul_1)
|
C_SYMBOL_NAME(__mpn_submul_1:)
|
||||||
|
PROLOG(__mpn_submul_1)
|
||||||
|
|
||||||
#define res_ptr a0
|
#define res_ptr a0
|
||||||
#define s1_ptr a1
|
#define s1_ptr a1
|
||||||
#define size d2
|
#define s1_size d2
|
||||||
#define s2_limb d4
|
#define s2_limb d4
|
||||||
|
|
||||||
/* Save used registers on the stack. */
|
/* Save used registers on the stack. */
|
||||||
INSN2(movem,l ,MEM_PREDEC(sp),d2-d5)
|
moveml R(d2)-R(d5),MEM_PREDEC(sp)
|
||||||
|
|
||||||
/* Copy the arguments to registers. Better use movem? */
|
/* Copy the arguments to registers. Better use movem? */
|
||||||
INSN2(move,l ,res_ptr,MEM_DISP(sp,20))
|
movel MEM_DISP(sp,20),R(res_ptr)
|
||||||
INSN2(move,l ,s1_ptr,MEM_DISP(sp,24))
|
movel MEM_DISP(sp,24),R(s1_ptr)
|
||||||
INSN2(move,l ,size,MEM_DISP(sp,28))
|
movel MEM_DISP(sp,28),R(s1_size)
|
||||||
INSN2(move,l ,s2_limb,MEM_DISP(sp,32))
|
movel MEM_DISP(sp,32),R(s2_limb)
|
||||||
|
|
||||||
INSN2(eor,w ,size,#1)
|
eorw #1,R(s1_size)
|
||||||
INSN1(clr,l ,d1)
|
clrl R(d1)
|
||||||
INSN1(clr,l ,d5)
|
clrl R(d5)
|
||||||
INSN2(lsr,l ,size,#1)
|
lsrl #1,R(s1_size)
|
||||||
bcc L1
|
bcc L(L1)
|
||||||
INSN2(subq,l ,size,#1)
|
subql #1,R(s1_size)
|
||||||
INSN2(sub,l ,d0,d0) /* (d0,cy) <= (0,0) */
|
subl R(d0),R(d0) /* (d0,cy) <= (0,0) */
|
||||||
|
|
||||||
LAB(Loop)
|
L(Loop:)
|
||||||
INSN2(move,l ,d3,MEM_POSTINC(s1_ptr))
|
movel MEM_POSTINC(s1_ptr),R(d3)
|
||||||
INSN2(mulu,l ,d1:d3,s2_limb)
|
mulul R(s2_limb),R(d1):R(d3)
|
||||||
INSN2(addx,l ,d3,d0)
|
addxl R(d0),R(d3)
|
||||||
INSN2(addx,l ,d1,d5)
|
addxl R(d5),R(d1)
|
||||||
INSN2(sub,l ,MEM_POSTINC(res_ptr),d3)
|
subl R(d3),MEM_POSTINC(res_ptr)
|
||||||
LAB(L1) INSN2(move,l ,d3,MEM_POSTINC(s1_ptr))
|
L(L1:) movel MEM_POSTINC(s1_ptr),R(d3)
|
||||||
INSN2(mulu,l ,d0:d3,s2_limb)
|
mulul R(s2_limb),R(d0):R(d3)
|
||||||
INSN2(addx,l ,d3,d1)
|
addxl R(d1),R(d3)
|
||||||
INSN2(addx,l ,d0,d5)
|
addxl R(d5),R(d0)
|
||||||
INSN2(sub,l ,MEM_POSTINC(res_ptr),d3)
|
subl R(d3),MEM_POSTINC(res_ptr)
|
||||||
|
|
||||||
dbf size,Loop
|
dbf R(s1_size),L(Loop)
|
||||||
INSN2(addx,l ,d0,d5)
|
addxl R(d5),R(d0)
|
||||||
INSN2(sub,l ,size,#0x10000)
|
subl #0x10000,R(s1_size)
|
||||||
bcc Loop
|
bcc L(Loop)
|
||||||
|
|
||||||
/* Restore used registers from stack frame. */
|
/* Restore used registers from stack frame. */
|
||||||
INSN2(movem,l ,d2-d5,MEM_POSTINC(sp))
|
moveml MEM_POSTINC(sp),R(d2)-R(d5)
|
||||||
|
|
||||||
rts
|
rts
|
||||||
|
EPILOG(__mpn_submul_1)
|
||||||
|
149
sysdeps/m68k/rshift.S
Normal file
149
sysdeps/m68k/rshift.S
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
/* mc68020 __mpn_rshift -- Shift right a low-level natural-number integer.
|
||||||
|
|
||||||
|
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
|
||||||
|
the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
|
/*
|
||||||
|
INPUT PARAMETERS
|
||||||
|
res_ptr (sp + 4)
|
||||||
|
s_ptr (sp + 8)
|
||||||
|
s_size (sp + 16)
|
||||||
|
cnt (sp + 12)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "sysdep.h"
|
||||||
|
#include "asm-syntax.h"
|
||||||
|
|
||||||
|
#define res_ptr a1
|
||||||
|
#define s_ptr a0
|
||||||
|
#define s_size d6
|
||||||
|
#define cnt d4
|
||||||
|
|
||||||
|
TEXT
|
||||||
|
ALIGN
|
||||||
|
GLOBL C_SYMBOL_NAME(__mpn_rshift)
|
||||||
|
|
||||||
|
C_SYMBOL_NAME(__mpn_rshift:)
|
||||||
|
PROLOG(__mpn_rshift)
|
||||||
|
/* Save used registers on the stack. */
|
||||||
|
moveml R(d2)-R(d6)/R(a2),MEM_PREDEC(sp)
|
||||||
|
|
||||||
|
/* Copy the arguments to registers. */
|
||||||
|
movel MEM_DISP(sp,28),R(res_ptr)
|
||||||
|
movel MEM_DISP(sp,32),R(s_ptr)
|
||||||
|
movel MEM_DISP(sp,36),R(s_size)
|
||||||
|
movel MEM_DISP(sp,40),R(cnt)
|
||||||
|
|
||||||
|
moveql #1,R(d5)
|
||||||
|
cmpl R(d5),R(cnt)
|
||||||
|
bne L(Lnormal)
|
||||||
|
cmpl R(res_ptr),R(s_ptr)
|
||||||
|
bls L(Lspecial) /* jump if res_ptr >= s_ptr */
|
||||||
|
#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
|
||||||
|
lea MEM_INDX1(res_ptr,s_size,l,4),R(a2)
|
||||||
|
#else /* not mc68020 */
|
||||||
|
movel R(s_size),R(d0)
|
||||||
|
asll #2,R(d0)
|
||||||
|
lea MEM_INDX(res_ptr,d0,l),R(a2)
|
||||||
|
#endif
|
||||||
|
cmpl R(s_ptr),R(a2)
|
||||||
|
bls L(Lspecial) /* jump if s_ptr >= res_ptr + s_size */
|
||||||
|
|
||||||
|
L(Lnormal:)
|
||||||
|
moveql #32,R(d5)
|
||||||
|
subl R(cnt),R(d5)
|
||||||
|
movel MEM_POSTINC(s_ptr),R(d2)
|
||||||
|
movel R(d2),R(d0)
|
||||||
|
lsll R(d5),R(d0) /* compute carry limb */
|
||||||
|
|
||||||
|
lsrl R(cnt),R(d2)
|
||||||
|
movel R(d2),R(d1)
|
||||||
|
subql #1,R(s_size)
|
||||||
|
beq L(Lend)
|
||||||
|
lsrl #1,R(s_size)
|
||||||
|
bcs L(L1)
|
||||||
|
subql #1,R(s_size)
|
||||||
|
|
||||||
|
L(Loop:)
|
||||||
|
movel MEM_POSTINC(s_ptr),R(d2)
|
||||||
|
movel R(d2),R(d3)
|
||||||
|
lsll R(d5),R(d3)
|
||||||
|
orl R(d3),R(d1)
|
||||||
|
movel R(d1),MEM_POSTINC(res_ptr)
|
||||||
|
lsrl R(cnt),R(d2)
|
||||||
|
L(L1:)
|
||||||
|
movel MEM_POSTINC(s_ptr),R(d1)
|
||||||
|
movel R(d1),R(d3)
|
||||||
|
lsll R(d5),R(d3)
|
||||||
|
orl R(d3),R(d2)
|
||||||
|
movel R(d2),MEM_POSTINC(res_ptr)
|
||||||
|
lsrl R(cnt),R(d1)
|
||||||
|
|
||||||
|
dbf R(s_size),L(Loop)
|
||||||
|
subl #0x10000,R(s_size)
|
||||||
|
bcc L(Loop)
|
||||||
|
|
||||||
|
L(Lend:)
|
||||||
|
movel R(d1),MEM(res_ptr) /* store most significant limb */
|
||||||
|
|
||||||
|
/* Restore used registers from stack frame. */
|
||||||
|
moveml MEM_POSTINC(sp),R(d2)-R(d6)/R(a2)
|
||||||
|
rts
|
||||||
|
|
||||||
|
/* We loop from most significant end of the arrays, which is only
|
||||||
|
permissable if the source and destination don't overlap, since the
|
||||||
|
function is documented to work for overlapping source and destination. */
|
||||||
|
|
||||||
|
L(Lspecial:)
|
||||||
|
#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
|
||||||
|
lea MEM_INDX1(s_ptr,s_size,l,4),R(s_ptr)
|
||||||
|
lea MEM_INDX1(res_ptr,s_size,l,4),R(res_ptr)
|
||||||
|
#else /* not mc68000 */
|
||||||
|
movel R(s_size),R(d0)
|
||||||
|
asll #2,R(d0)
|
||||||
|
addl R(s_size),R(s_ptr)
|
||||||
|
addl R(s_size),R(res_ptr)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
clrl R(d0) /* initialize carry */
|
||||||
|
eorw #1,R(s_size)
|
||||||
|
lsrl #1,R(s_size)
|
||||||
|
bcc L(LL1)
|
||||||
|
subql #1,R(s_size)
|
||||||
|
|
||||||
|
L(LLoop:)
|
||||||
|
movel MEM_PREDEC(s_ptr),R(d2)
|
||||||
|
roxrl #1,R(d2)
|
||||||
|
movel R(d2),MEM_PREDEC(res_ptr)
|
||||||
|
L(LL1:)
|
||||||
|
movel MEM_PREDEC(s_ptr),R(d2)
|
||||||
|
roxrl #1,R(d2)
|
||||||
|
movel R(d2),MEM_PREDEC(res_ptr)
|
||||||
|
|
||||||
|
dbf R(s_size),L(LLoop)
|
||||||
|
roxrl #1,R(d0) /* save cy in msb */
|
||||||
|
subl #0x10000,R(s_size)
|
||||||
|
bcs L(LLend)
|
||||||
|
addl R(d0),R(d0) /* restore cy */
|
||||||
|
bra L(LLoop)
|
||||||
|
|
||||||
|
L(LLend:)
|
||||||
|
/* Restore used registers from stack frame. */
|
||||||
|
moveml MEM_POSTINC(sp),R(d2)-R(d6)/R(a2)
|
||||||
|
rts
|
||||||
|
EPILOG(__mpn_rshift)
|
@ -1,7 +1,7 @@
|
|||||||
/* mc68020 __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and
|
/* mc68020 __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and
|
||||||
store difference in a third limb vector.
|
store difference in a third limb vector.
|
||||||
|
|
||||||
Copyright (C) 1992, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -27,50 +27,53 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
size (sp + 12)
|
size (sp + 12)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "sysdep.h"
|
||||||
#include "asm-syntax.h"
|
#include "asm-syntax.h"
|
||||||
|
|
||||||
TEXT
|
TEXT
|
||||||
ALIGN
|
ALIGN
|
||||||
GLOBL ___mpn_sub_n
|
GLOBL C_SYMBOL_NAME(__mpn_sub_n)
|
||||||
|
|
||||||
LAB(___mpn_sub_n)
|
C_SYMBOL_NAME(__mpn_sub_n:)
|
||||||
|
PROLOG(__mpn_sub_n)
|
||||||
/* Save used registers on the stack. */
|
/* Save used registers on the stack. */
|
||||||
INSN2(move,l ,MEM_PREDEC(sp),d2)
|
movel R(d2),MEM_PREDEC(sp)
|
||||||
INSN2(move,l ,MEM_PREDEC(sp),a2)
|
movel R(a2),MEM_PREDEC(sp)
|
||||||
|
|
||||||
/* Copy the arguments to registers. Better use movem? */
|
/* Copy the arguments to registers. Better use movem? */
|
||||||
INSN2(move,l ,a2,MEM_DISP(sp,12))
|
movel MEM_DISP(sp,12),R(a2)
|
||||||
INSN2(move,l ,a0,MEM_DISP(sp,16))
|
movel MEM_DISP(sp,16),R(a0)
|
||||||
INSN2(move,l ,a1,MEM_DISP(sp,20))
|
movel MEM_DISP(sp,20),R(a1)
|
||||||
INSN2(move,l ,d2,MEM_DISP(sp,24))
|
movel MEM_DISP(sp,24),R(d2)
|
||||||
|
|
||||||
INSN2(eor,w ,d2,#1)
|
eorw #1,R(d2)
|
||||||
INSN2(lsr,l ,d2,#1)
|
lsrl #1,R(d2)
|
||||||
bcc L1
|
bcc L(L1)
|
||||||
INSN2(subq,l ,d2,#1) /* clears cy as side effect */
|
subql #1,R(d2) /* clears cy as side effect */
|
||||||
|
|
||||||
LAB(Loop)
|
L(Loop:)
|
||||||
INSN2(move,l ,d0,MEM_POSTINC(a0))
|
movel MEM_POSTINC(a0),R(d0)
|
||||||
INSN2(move,l ,d1,MEM_POSTINC(a1))
|
movel MEM_POSTINC(a1),R(d1)
|
||||||
INSN2(subx,l ,d0,d1)
|
subxl R(d1),R(d0)
|
||||||
INSN2(move,l ,MEM_POSTINC(a2),d0)
|
movel R(d0),MEM_POSTINC(a2)
|
||||||
LAB(L1) INSN2(move,l ,d0,MEM_POSTINC(a0))
|
L(L1:) movel MEM_POSTINC(a0),R(d0)
|
||||||
INSN2(move,l ,d1,MEM_POSTINC(a1))
|
movel MEM_POSTINC(a1),R(d1)
|
||||||
INSN2(subx,l ,d0,d1)
|
subxl R(d1),R(d0)
|
||||||
INSN2(move,l ,MEM_POSTINC(a2),d0)
|
movel R(d0),MEM_POSTINC(a2)
|
||||||
|
|
||||||
dbf d2,Loop /* loop until 16 lsb of %4 == -1 */
|
dbf R(d2),L(Loop) /* loop until 16 lsb of %4 == -1 */
|
||||||
INSN2(subx,l ,d0,d0) /* d0 <= -cy; save cy as 0 or -1 in d0 */
|
subxl R(d0),R(d0) /* d0 <= -cy; save cy as 0 or -1 in d0 */
|
||||||
INSN2(sub,l ,d2,#0x10000)
|
subl #0x10000,R(d2)
|
||||||
bcs L2
|
bcs L(L2)
|
||||||
INSN2(add,l ,d0,d0) /* restore cy */
|
addl R(d0),R(d0) /* restore cy */
|
||||||
bra Loop
|
bra L(Loop)
|
||||||
|
|
||||||
LAB(L2)
|
L(L2:)
|
||||||
INSN1(neg,l ,d0)
|
negl R(d0)
|
||||||
|
|
||||||
/* Restore used registers from stack frame. */
|
/* Restore used registers from stack frame. */
|
||||||
INSN2(move,l ,a2,MEM_POSTINC(sp))
|
movel MEM_POSTINC(sp),R(a2)
|
||||||
INSN2(move,l ,d2,MEM_POSTINC(sp))
|
movel MEM_POSTINC(sp),R(d2)
|
||||||
|
|
||||||
rts
|
rts
|
||||||
|
EPILOG(__mpn_sub_n)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
; mc88100 __mpn_add -- Add two limb vectors of the same length > 0 and store
|
; mc88100 __mpn_add -- Add two limb vectors of the same length > 0 and store
|
||||||
; sum in a third limb vector.
|
; sum in a third limb vector.
|
||||||
|
|
||||||
; Copyright (C) 1992, 1994 Free Software Foundation, Inc.
|
; Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
|
||||||
|
|
||||||
; This file is part of the GNU MP Library.
|
; This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
199
sysdeps/m88k/m88110/add_n.S
Normal file
199
sysdeps/m88k/m88110/add_n.S
Normal file
@ -0,0 +1,199 @@
|
|||||||
|
; mc88110 __mpn_add_n -- Add two limb vectors of the same length > 0 and store
|
||||||
|
; sum in a third limb vector.
|
||||||
|
|
||||||
|
; Copyright (C) 1995, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
; This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
; The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
|
||||||
|
; the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
|
||||||
|
; INPUT PARAMETERS
|
||||||
|
#define res_ptr r2
|
||||||
|
#define s1_ptr r3
|
||||||
|
#define s2_ptr r4
|
||||||
|
#define size r5
|
||||||
|
|
||||||
|
#include "sysdep.h"
|
||||||
|
|
||||||
|
text
|
||||||
|
align 16
|
||||||
|
global C_SYMBOL_NAME(__mpn_add_n)
|
||||||
|
C_SYMBOL_NAME(__mpn_add_n):
|
||||||
|
addu.co r0,r0,r0 ; clear cy flag
|
||||||
|
xor r12,s2_ptr,res_ptr
|
||||||
|
bb1 2,r12,L1
|
||||||
|
; ** V1a **
|
||||||
|
L0: bb0 2,res_ptr,L_v1 ; branch if res_ptr is aligned?
|
||||||
|
/* Add least significant limb separately to align res_ptr and s2_ptr */
|
||||||
|
ld r10,s1_ptr,0
|
||||||
|
addu s1_ptr,s1_ptr,4
|
||||||
|
ld r8,s2_ptr,0
|
||||||
|
addu s2_ptr,s2_ptr,4
|
||||||
|
subu size,size,1
|
||||||
|
addu.co r6,r10,r8
|
||||||
|
st r6,res_ptr,0
|
||||||
|
addu res_ptr,res_ptr,4
|
||||||
|
L_v1: cmp r12,size,2
|
||||||
|
bb1 lt,r12,Lend2
|
||||||
|
|
||||||
|
ld r10,s1_ptr,0
|
||||||
|
ld r12,s1_ptr,4
|
||||||
|
ld.d r8,s2_ptr,0
|
||||||
|
subu size,size,10
|
||||||
|
bcnd lt0,size,Lfin1
|
||||||
|
/* Add blocks of 8 limbs until less than 8 limbs remain */
|
||||||
|
align 8
|
||||||
|
Loop1: subu size,size,8
|
||||||
|
addu.cio r6,r10,r8
|
||||||
|
ld r10,s1_ptr,8
|
||||||
|
addu.cio r7,r12,r9
|
||||||
|
ld r12,s1_ptr,12
|
||||||
|
ld.d r8,s2_ptr,8
|
||||||
|
st.d r6,res_ptr,0
|
||||||
|
addu.cio r6,r10,r8
|
||||||
|
ld r10,s1_ptr,16
|
||||||
|
addu.cio r7,r12,r9
|
||||||
|
ld r12,s1_ptr,20
|
||||||
|
ld.d r8,s2_ptr,16
|
||||||
|
st.d r6,res_ptr,8
|
||||||
|
addu.cio r6,r10,r8
|
||||||
|
ld r10,s1_ptr,24
|
||||||
|
addu.cio r7,r12,r9
|
||||||
|
ld r12,s1_ptr,28
|
||||||
|
ld.d r8,s2_ptr,24
|
||||||
|
st.d r6,res_ptr,16
|
||||||
|
addu.cio r6,r10,r8
|
||||||
|
ld r10,s1_ptr,32
|
||||||
|
addu.cio r7,r12,r9
|
||||||
|
ld r12,s1_ptr,36
|
||||||
|
addu s1_ptr,s1_ptr,32
|
||||||
|
ld.d r8,s2_ptr,32
|
||||||
|
addu s2_ptr,s2_ptr,32
|
||||||
|
st.d r6,res_ptr,24
|
||||||
|
addu res_ptr,res_ptr,32
|
||||||
|
bcnd ge0,size,Loop1
|
||||||
|
|
||||||
|
Lfin1: addu size,size,8-2
|
||||||
|
bcnd lt0,size,Lend1
|
||||||
|
/* Add blocks of 2 limbs until less than 2 limbs remain */
|
||||||
|
Loope1: addu.cio r6,r10,r8
|
||||||
|
ld r10,s1_ptr,8
|
||||||
|
addu.cio r7,r12,r9
|
||||||
|
ld r12,s1_ptr,12
|
||||||
|
ld.d r8,s2_ptr,8
|
||||||
|
st.d r6,res_ptr,0
|
||||||
|
subu size,size,2
|
||||||
|
addu s1_ptr,s1_ptr,8
|
||||||
|
addu s2_ptr,s2_ptr,8
|
||||||
|
addu res_ptr,res_ptr,8
|
||||||
|
bcnd ge0,size,Loope1
|
||||||
|
Lend1: addu.cio r6,r10,r8
|
||||||
|
addu.cio r7,r12,r9
|
||||||
|
st.d r6,res_ptr,0
|
||||||
|
|
||||||
|
bb0 0,size,Lret1
|
||||||
|
/* Add last limb */
|
||||||
|
ld r10,s1_ptr,8
|
||||||
|
ld r8,s2_ptr,8
|
||||||
|
addu.cio r6,r10,r8
|
||||||
|
st r6,res_ptr,8
|
||||||
|
|
||||||
|
Lret1: jmp.n r1
|
||||||
|
addu.ci r2,r0,r0 ; return carry-out from most sign. limb
|
||||||
|
|
||||||
|
L1: xor r12,s1_ptr,res_ptr
|
||||||
|
bb1 2,r12,L2
|
||||||
|
; ** V1b **
|
||||||
|
or r12,r0,s2_ptr
|
||||||
|
or s2_ptr,r0,s1_ptr
|
||||||
|
or s1_ptr,r0,r12
|
||||||
|
br L0
|
||||||
|
|
||||||
|
; ** V2 **
|
||||||
|
/* If we come here, the alignment of s1_ptr and res_ptr as well as the
|
||||||
|
alignment of s2_ptr and res_ptr differ. Since there are only two ways
|
||||||
|
things can be aligned (that we care about) we now know that the alignment
|
||||||
|
of s1_ptr and s2_ptr are the same. */
|
||||||
|
|
||||||
|
L2: cmp r12,size,1
|
||||||
|
bb1 eq,r12,Ljone
|
||||||
|
bb0 2,s1_ptr,L_v2 ; branch if s1_ptr is aligned
|
||||||
|
/* Add least significant limb separately to align res_ptr and s2_ptr */
|
||||||
|
ld r10,s1_ptr,0
|
||||||
|
addu s1_ptr,s1_ptr,4
|
||||||
|
ld r8,s2_ptr,0
|
||||||
|
addu s2_ptr,s2_ptr,4
|
||||||
|
subu size,size,1
|
||||||
|
addu.co r6,r10,r8
|
||||||
|
st r6,res_ptr,0
|
||||||
|
addu res_ptr,res_ptr,4
|
||||||
|
|
||||||
|
L_v2: subu size,size,8
|
||||||
|
bcnd lt0,size,Lfin2
|
||||||
|
/* Add blocks of 8 limbs until less than 8 limbs remain */
|
||||||
|
align 8
|
||||||
|
Loop2: subu size,size,8
|
||||||
|
ld.d r8,s1_ptr,0
|
||||||
|
ld.d r6,s2_ptr,0
|
||||||
|
addu.cio r8,r8,r6
|
||||||
|
st r8,res_ptr,0
|
||||||
|
addu.cio r9,r9,r7
|
||||||
|
st r9,res_ptr,4
|
||||||
|
ld.d r8,s1_ptr,8
|
||||||
|
ld.d r6,s2_ptr,8
|
||||||
|
addu.cio r8,r8,r6
|
||||||
|
st r8,res_ptr,8
|
||||||
|
addu.cio r9,r9,r7
|
||||||
|
st r9,res_ptr,12
|
||||||
|
ld.d r8,s1_ptr,16
|
||||||
|
ld.d r6,s2_ptr,16
|
||||||
|
addu.cio r8,r8,r6
|
||||||
|
st r8,res_ptr,16
|
||||||
|
addu.cio r9,r9,r7
|
||||||
|
st r9,res_ptr,20
|
||||||
|
ld.d r8,s1_ptr,24
|
||||||
|
ld.d r6,s2_ptr,24
|
||||||
|
addu.cio r8,r8,r6
|
||||||
|
st r8,res_ptr,24
|
||||||
|
addu.cio r9,r9,r7
|
||||||
|
st r9,res_ptr,28
|
||||||
|
addu s1_ptr,s1_ptr,32
|
||||||
|
addu s2_ptr,s2_ptr,32
|
||||||
|
addu res_ptr,res_ptr,32
|
||||||
|
bcnd ge0,size,Loop2
|
||||||
|
|
||||||
|
Lfin2: addu size,size,8-2
|
||||||
|
bcnd lt0,size,Lend2
|
||||||
|
Loope2: ld.d r8,s1_ptr,0
|
||||||
|
ld.d r6,s2_ptr,0
|
||||||
|
addu.cio r8,r8,r6
|
||||||
|
st r8,res_ptr,0
|
||||||
|
addu.cio r9,r9,r7
|
||||||
|
st r9,res_ptr,4
|
||||||
|
subu size,size,2
|
||||||
|
addu s1_ptr,s1_ptr,8
|
||||||
|
addu s2_ptr,s2_ptr,8
|
||||||
|
addu res_ptr,res_ptr,8
|
||||||
|
bcnd ge0,size,Loope2
|
||||||
|
Lend2: bb0 0,size,Lret2
|
||||||
|
/* Add last limb */
|
||||||
|
Ljone: ld r10,s1_ptr,0
|
||||||
|
ld r8,s2_ptr,0
|
||||||
|
addu.cio r6,r10,r8
|
||||||
|
st r6,res_ptr,0
|
||||||
|
|
||||||
|
Lret2: jmp.n r1
|
||||||
|
addu.ci r2,r0,r0 ; return carry-out from most sign. limb
|
60
sysdeps/m88k/m88110/addmul_1.s
Normal file
60
sysdeps/m88k/m88110/addmul_1.s
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
; mc88110 __mpn_addmul_1 -- Multiply a limb vector with a single limb and
|
||||||
|
; store the product in a second limb vector.
|
||||||
|
|
||||||
|
; Copyright (C) 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
; This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
; The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
|
||||||
|
; the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
|
||||||
|
; INPUT PARAMETERS
|
||||||
|
; res_ptr r2
|
||||||
|
; s1_ptr r3
|
||||||
|
; size r4
|
||||||
|
; s2_limb r5
|
||||||
|
|
||||||
|
text
|
||||||
|
align 16
|
||||||
|
global ___mpn_addmul_1
|
||||||
|
___mpn_addmul_1:
|
||||||
|
lda r3,r3[r4]
|
||||||
|
lda r8,r2[r4] ; RES_PTR in r8 since r2 is retval
|
||||||
|
subu r4,r0,r4
|
||||||
|
addu.co r2,r0,r0 ; r2 = cy = 0
|
||||||
|
|
||||||
|
ld r6,r3[r4]
|
||||||
|
addu r4,r4,1
|
||||||
|
subu r8,r8,4
|
||||||
|
bcnd.n eq0,r4,Lend
|
||||||
|
mulu.d r10,r6,r5
|
||||||
|
|
||||||
|
Loop: ld r7,r8[r4]
|
||||||
|
ld r6,r3[r4]
|
||||||
|
addu.cio r9,r11,r2
|
||||||
|
addu.ci r2,r10,r0
|
||||||
|
addu.co r9,r9,r7
|
||||||
|
st r9,r8[r4]
|
||||||
|
addu r4,r4,1
|
||||||
|
mulu.d r10,r6,r5
|
||||||
|
bcnd ne0,r4,Loop
|
||||||
|
|
||||||
|
Lend: ld r7,r8,0
|
||||||
|
addu.cio r9,r11,r2
|
||||||
|
addu.ci r2,r10,r0
|
||||||
|
addu.co r9,r9,r7
|
||||||
|
st r9,r8,0
|
||||||
|
jmp.n r1
|
||||||
|
addu.ci r2,r2,r0
|
@ -1,7 +1,7 @@
|
|||||||
; mc88110 __mpn_mul_1 -- Multiply a limb vector with a single limb and
|
; mc88110 __mpn_mul_1 -- Multiply a limb vector with a single limb and
|
||||||
; store the product in a second limb vector.
|
; store the product in a second limb vector.
|
||||||
|
|
||||||
; Copyright (C) 1992, 1994 Free Software Foundation, Inc.
|
; Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
|
||||||
|
|
||||||
; This file is part of the GNU MP Library.
|
; This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -56,29 +56,3 @@ Lend: addu.cio r9,r11,r2
|
|||||||
st r9,r8,4
|
st r9,r8,4
|
||||||
jmp.n r1
|
jmp.n r1
|
||||||
addu.ci r2,r10,r0
|
addu.ci r2,r10,r0
|
||||||
|
|
||||||
; This is the Right Way to do this on '110. 4 cycles / 64-bit limb.
|
|
||||||
; ld.d r10,
|
|
||||||
; mulu.d
|
|
||||||
; addu.cio
|
|
||||||
; addu.cio
|
|
||||||
; st.d
|
|
||||||
; mulu.d ,r11,r5
|
|
||||||
; ld.d r12,
|
|
||||||
; mulu.d ,r10,r5
|
|
||||||
; addu.cio
|
|
||||||
; addu.cio
|
|
||||||
; st.d
|
|
||||||
; mulu.d
|
|
||||||
; ld.d r10,
|
|
||||||
; mulu.d
|
|
||||||
; addu.cio
|
|
||||||
; addu.cio
|
|
||||||
; st.d
|
|
||||||
; mulu.d
|
|
||||||
; ld.d r10,
|
|
||||||
; mulu.d
|
|
||||||
; addu.cio
|
|
||||||
; addu.cio
|
|
||||||
; st.d
|
|
||||||
; mulu.d
|
|
||||||
|
275
sysdeps/m88k/m88110/sub_n.S
Normal file
275
sysdeps/m88k/m88110/sub_n.S
Normal file
@ -0,0 +1,275 @@
|
|||||||
|
; mc88110 __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and
|
||||||
|
; store difference in a third limb vector.
|
||||||
|
|
||||||
|
; Copyright (C) 1995, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
; This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
; The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
|
||||||
|
; the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
|
||||||
|
; INPUT PARAMETERS
|
||||||
|
#define res_ptr r2
|
||||||
|
#define s1_ptr r3
|
||||||
|
#define s2_ptr r4
|
||||||
|
#define size r5
|
||||||
|
|
||||||
|
#include "sysdep.h"
|
||||||
|
|
||||||
|
text
|
||||||
|
align 16
|
||||||
|
global C_SYMBOL_NAME(__mpn_sub_n)
|
||||||
|
C_SYMBOL_NAME(__mpn_sub_n):
|
||||||
|
subu.co r0,r0,r0 ; set cy flag
|
||||||
|
xor r12,s2_ptr,res_ptr
|
||||||
|
bb1 2,r12,L1
|
||||||
|
; ** V1a **
|
||||||
|
L0: bb0 2,res_ptr,L_v1 ; branch if res_ptr is aligned
|
||||||
|
/* Add least significant limb separately to align res_ptr and s2_ptr */
|
||||||
|
ld r10,s1_ptr,0
|
||||||
|
addu s1_ptr,s1_ptr,4
|
||||||
|
ld r8,s2_ptr,0
|
||||||
|
addu s2_ptr,s2_ptr,4
|
||||||
|
subu size,size,1
|
||||||
|
subu.co r6,r10,r8
|
||||||
|
st r6,res_ptr,0
|
||||||
|
addu res_ptr,res_ptr,4
|
||||||
|
L_v1: cmp r12,size,2
|
||||||
|
bb1 lt,r12,Lend2
|
||||||
|
|
||||||
|
ld r10,s1_ptr,0
|
||||||
|
ld r12,s1_ptr,4
|
||||||
|
ld.d r8,s2_ptr,0
|
||||||
|
subu size,size,10
|
||||||
|
bcnd lt0,size,Lfin1
|
||||||
|
/* Add blocks of 8 limbs until less than 8 limbs remain */
|
||||||
|
align 8
|
||||||
|
Loop1: subu size,size,8
|
||||||
|
subu.cio r6,r10,r8
|
||||||
|
ld r10,s1_ptr,8
|
||||||
|
subu.cio r7,r12,r9
|
||||||
|
ld r12,s1_ptr,12
|
||||||
|
ld.d r8,s2_ptr,8
|
||||||
|
st.d r6,res_ptr,0
|
||||||
|
subu.cio r6,r10,r8
|
||||||
|
ld r10,s1_ptr,16
|
||||||
|
subu.cio r7,r12,r9
|
||||||
|
ld r12,s1_ptr,20
|
||||||
|
ld.d r8,s2_ptr,16
|
||||||
|
st.d r6,res_ptr,8
|
||||||
|
subu.cio r6,r10,r8
|
||||||
|
ld r10,s1_ptr,24
|
||||||
|
subu.cio r7,r12,r9
|
||||||
|
ld r12,s1_ptr,28
|
||||||
|
ld.d r8,s2_ptr,24
|
||||||
|
st.d r6,res_ptr,16
|
||||||
|
subu.cio r6,r10,r8
|
||||||
|
ld r10,s1_ptr,32
|
||||||
|
subu.cio r7,r12,r9
|
||||||
|
ld r12,s1_ptr,36
|
||||||
|
addu s1_ptr,s1_ptr,32
|
||||||
|
ld.d r8,s2_ptr,32
|
||||||
|
addu s2_ptr,s2_ptr,32
|
||||||
|
st.d r6,res_ptr,24
|
||||||
|
addu res_ptr,res_ptr,32
|
||||||
|
bcnd ge0,size,Loop1
|
||||||
|
|
||||||
|
Lfin1: addu size,size,8-2
|
||||||
|
bcnd lt0,size,Lend1
|
||||||
|
/* Add blocks of 2 limbs until less than 2 limbs remain */
|
||||||
|
Loope1: subu.cio r6,r10,r8
|
||||||
|
ld r10,s1_ptr,8
|
||||||
|
subu.cio r7,r12,r9
|
||||||
|
ld r12,s1_ptr,12
|
||||||
|
ld.d r8,s2_ptr,8
|
||||||
|
st.d r6,res_ptr,0
|
||||||
|
subu size,size,2
|
||||||
|
addu s1_ptr,s1_ptr,8
|
||||||
|
addu s2_ptr,s2_ptr,8
|
||||||
|
addu res_ptr,res_ptr,8
|
||||||
|
bcnd ge0,size,Loope1
|
||||||
|
Lend1: subu.cio r6,r10,r8
|
||||||
|
subu.cio r7,r12,r9
|
||||||
|
st.d r6,res_ptr,0
|
||||||
|
|
||||||
|
bb0 0,size,Lret1
|
||||||
|
/* Add last limb */
|
||||||
|
ld r10,s1_ptr,8
|
||||||
|
ld r8,s2_ptr,8
|
||||||
|
subu.cio r6,r10,r8
|
||||||
|
st r6,res_ptr,8
|
||||||
|
|
||||||
|
Lret1: addu.ci r2,r0,r0 ; return carry-out from most sign. limb
|
||||||
|
jmp.n r1
|
||||||
|
xor r2,r2,1
|
||||||
|
|
||||||
|
L1: xor r12,s1_ptr,res_ptr
|
||||||
|
bb1 2,r12,L2
|
||||||
|
; ** V1b **
|
||||||
|
bb0 2,res_ptr,L_v1b ; branch if res_ptr is aligned
|
||||||
|
/* Add least significant limb separately to align res_ptr and s1_ptr */
|
||||||
|
ld r10,s2_ptr,0
|
||||||
|
addu s2_ptr,s2_ptr,4
|
||||||
|
ld r8,s1_ptr,0
|
||||||
|
addu s1_ptr,s1_ptr,4
|
||||||
|
subu size,size,1
|
||||||
|
subu.co r6,r8,r10
|
||||||
|
st r6,res_ptr,0
|
||||||
|
addu res_ptr,res_ptr,4
|
||||||
|
L_v1b: cmp r12,size,2
|
||||||
|
bb1 lt,r12,Lend2
|
||||||
|
|
||||||
|
ld r10,s2_ptr,0
|
||||||
|
ld r12,s2_ptr,4
|
||||||
|
ld.d r8,s1_ptr,0
|
||||||
|
subu size,size,10
|
||||||
|
bcnd lt0,size,Lfin1b
|
||||||
|
/* Add blocks of 8 limbs until less than 8 limbs remain */
|
||||||
|
align 8
|
||||||
|
Loop1b: subu size,size,8
|
||||||
|
subu.cio r6,r8,r10
|
||||||
|
ld r10,s2_ptr,8
|
||||||
|
subu.cio r7,r9,r12
|
||||||
|
ld r12,s2_ptr,12
|
||||||
|
ld.d r8,s1_ptr,8
|
||||||
|
st.d r6,res_ptr,0
|
||||||
|
subu.cio r6,r8,r10
|
||||||
|
ld r10,s2_ptr,16
|
||||||
|
subu.cio r7,r9,r12
|
||||||
|
ld r12,s2_ptr,20
|
||||||
|
ld.d r8,s1_ptr,16
|
||||||
|
st.d r6,res_ptr,8
|
||||||
|
subu.cio r6,r8,r10
|
||||||
|
ld r10,s2_ptr,24
|
||||||
|
subu.cio r7,r9,r12
|
||||||
|
ld r12,s2_ptr,28
|
||||||
|
ld.d r8,s1_ptr,24
|
||||||
|
st.d r6,res_ptr,16
|
||||||
|
subu.cio r6,r8,r10
|
||||||
|
ld r10,s2_ptr,32
|
||||||
|
subu.cio r7,r9,r12
|
||||||
|
ld r12,s2_ptr,36
|
||||||
|
addu s2_ptr,s2_ptr,32
|
||||||
|
ld.d r8,s1_ptr,32
|
||||||
|
addu s1_ptr,s1_ptr,32
|
||||||
|
st.d r6,res_ptr,24
|
||||||
|
addu res_ptr,res_ptr,32
|
||||||
|
bcnd ge0,size,Loop1b
|
||||||
|
|
||||||
|
Lfin1b: addu size,size,8-2
|
||||||
|
bcnd lt0,size,Lend1b
|
||||||
|
/* Add blocks of 2 limbs until less than 2 limbs remain */
|
||||||
|
Loope1b:subu.cio r6,r8,r10
|
||||||
|
ld r10,s2_ptr,8
|
||||||
|
subu.cio r7,r9,r12
|
||||||
|
ld r12,s2_ptr,12
|
||||||
|
ld.d r8,s1_ptr,8
|
||||||
|
st.d r6,res_ptr,0
|
||||||
|
subu size,size,2
|
||||||
|
addu s1_ptr,s1_ptr,8
|
||||||
|
addu s2_ptr,s2_ptr,8
|
||||||
|
addu res_ptr,res_ptr,8
|
||||||
|
bcnd ge0,size,Loope1b
|
||||||
|
Lend1b: subu.cio r6,r8,r10
|
||||||
|
subu.cio r7,r9,r12
|
||||||
|
st.d r6,res_ptr,0
|
||||||
|
|
||||||
|
bb0 0,size,Lret1b
|
||||||
|
/* Add last limb */
|
||||||
|
ld r10,s2_ptr,8
|
||||||
|
ld r8,s1_ptr,8
|
||||||
|
subu.cio r6,r8,r10
|
||||||
|
st r6,res_ptr,8
|
||||||
|
|
||||||
|
Lret1b: addu.ci r2,r0,r0 ; return carry-out from most sign. limb
|
||||||
|
jmp.n r1
|
||||||
|
xor r2,r2,1
|
||||||
|
|
||||||
|
; ** V2 **
|
||||||
|
/* If we come here, the alignment of s1_ptr and res_ptr as well as the
|
||||||
|
alignment of s2_ptr and res_ptr differ. Since there are only two ways
|
||||||
|
things can be aligned (that we care about) we now know that the alignment
|
||||||
|
of s1_ptr and s2_ptr are the same. */
|
||||||
|
|
||||||
|
L2: cmp r12,size,1
|
||||||
|
bb1 eq,r12,Ljone
|
||||||
|
bb0 2,s1_ptr,L_v2 ; branch if s1_ptr is aligned
|
||||||
|
/* Add least significant limb separately to align res_ptr and s2_ptr */
|
||||||
|
ld r10,s1_ptr,0
|
||||||
|
addu s1_ptr,s1_ptr,4
|
||||||
|
ld r8,s2_ptr,0
|
||||||
|
addu s2_ptr,s2_ptr,4
|
||||||
|
subu size,size,1
|
||||||
|
subu.co r6,r10,r8
|
||||||
|
st r6,res_ptr,0
|
||||||
|
addu res_ptr,res_ptr,4
|
||||||
|
|
||||||
|
L_v2: subu size,size,8
|
||||||
|
bcnd lt0,size,Lfin2
|
||||||
|
/* Add blocks of 8 limbs until less than 8 limbs remain */
|
||||||
|
align 8
|
||||||
|
Loop2: subu size,size,8
|
||||||
|
ld.d r8,s1_ptr,0
|
||||||
|
ld.d r6,s2_ptr,0
|
||||||
|
subu.cio r8,r8,r6
|
||||||
|
st r8,res_ptr,0
|
||||||
|
subu.cio r9,r9,r7
|
||||||
|
st r9,res_ptr,4
|
||||||
|
ld.d r8,s1_ptr,8
|
||||||
|
ld.d r6,s2_ptr,8
|
||||||
|
subu.cio r8,r8,r6
|
||||||
|
st r8,res_ptr,8
|
||||||
|
subu.cio r9,r9,r7
|
||||||
|
st r9,res_ptr,12
|
||||||
|
ld.d r8,s1_ptr,16
|
||||||
|
ld.d r6,s2_ptr,16
|
||||||
|
subu.cio r8,r8,r6
|
||||||
|
st r8,res_ptr,16
|
||||||
|
subu.cio r9,r9,r7
|
||||||
|
st r9,res_ptr,20
|
||||||
|
ld.d r8,s1_ptr,24
|
||||||
|
ld.d r6,s2_ptr,24
|
||||||
|
subu.cio r8,r8,r6
|
||||||
|
st r8,res_ptr,24
|
||||||
|
subu.cio r9,r9,r7
|
||||||
|
st r9,res_ptr,28
|
||||||
|
addu s1_ptr,s1_ptr,32
|
||||||
|
addu s2_ptr,s2_ptr,32
|
||||||
|
addu res_ptr,res_ptr,32
|
||||||
|
bcnd ge0,size,Loop2
|
||||||
|
|
||||||
|
Lfin2: addu size,size,8-2
|
||||||
|
bcnd lt0,size,Lend2
|
||||||
|
Loope2: ld.d r8,s1_ptr,0
|
||||||
|
ld.d r6,s2_ptr,0
|
||||||
|
subu.cio r8,r8,r6
|
||||||
|
st r8,res_ptr,0
|
||||||
|
subu.cio r9,r9,r7
|
||||||
|
st r9,res_ptr,4
|
||||||
|
subu size,size,2
|
||||||
|
addu s1_ptr,s1_ptr,8
|
||||||
|
addu s2_ptr,s2_ptr,8
|
||||||
|
addu res_ptr,res_ptr,8
|
||||||
|
bcnd ge0,size,Loope2
|
||||||
|
Lend2: bb0 0,size,Lret2
|
||||||
|
/* Add last limb */
|
||||||
|
Ljone: ld r10,s1_ptr,0
|
||||||
|
ld r8,s2_ptr,0
|
||||||
|
subu.cio r6,r10,r8
|
||||||
|
st r6,res_ptr,0
|
||||||
|
|
||||||
|
Lret2: addu.ci r2,r0,r0 ; return carry-out from most sign. limb
|
||||||
|
jmp.n r1
|
||||||
|
xor r2,r2,1
|
@ -1,7 +1,7 @@
|
|||||||
; mc88100 __mpn_mul_1 -- Multiply a limb vector with a single limb and
|
; mc88100 __mpn_mul_1 -- Multiply a limb vector with a single limb and
|
||||||
; store the product in a second limb vector.
|
; store the product in a second limb vector.
|
||||||
|
|
||||||
; Copyright (C) 1992, 1994 Free Software Foundation, Inc.
|
; Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
|
||||||
|
|
||||||
; This file is part of the GNU MP Library.
|
; This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -55,14 +55,14 @@ ___mpn_mul_1:
|
|||||||
; Make S1_PTR and RES_PTR point at the end of their blocks
|
; Make S1_PTR and RES_PTR point at the end of their blocks
|
||||||
; and negate SIZE.
|
; and negate SIZE.
|
||||||
lda r3,r3[r4]
|
lda r3,r3[r4]
|
||||||
lda r6,r2[r4] ; RES_PTR in r6 since r2 is retval
|
lda r6,r2[r4] ; RES_PTR in r6 since r2 is retval
|
||||||
subu r4,r0,r4
|
subu r4,r0,r4
|
||||||
|
|
||||||
addu.co r2,r0,r0 ; r2 = cy = 0
|
addu.co r2,r0,r0 ; r2 = cy = 0
|
||||||
ld r9,r3[r4]
|
ld r9,r3[r4]
|
||||||
mask r7,r5,0xffff ; r7 = lo(S2_LIMB)
|
mask r7,r5,0xffff ; r7 = lo(S2_LIMB)
|
||||||
extu r8,r5,16 ; r8 = hi(S2_LIMB)
|
extu r8,r5,16 ; r8 = hi(S2_LIMB)
|
||||||
bcnd.n eq0,r8,Lsmall ; jump if (hi(S2_LIMB) == 0)
|
bcnd.n eq0,r8,Lsmall ; jump if (hi(S2_LIMB) == 0)
|
||||||
subu r6,r6,4
|
subu r6,r6,4
|
||||||
|
|
||||||
; General code for any value of S2_LIMB.
|
; General code for any value of S2_LIMB.
|
||||||
@ -75,28 +75,27 @@ ___mpn_mul_1:
|
|||||||
br.n L1
|
br.n L1
|
||||||
addu r4,r4,1
|
addu r4,r4,1
|
||||||
|
|
||||||
Loop:
|
Loop: ld r9,r3[r4]
|
||||||
ld r9,r3[r4]
|
|
||||||
st r26,r6[r4]
|
st r26,r6[r4]
|
||||||
; bcnd ne0,r0,0 ; bubble
|
; bcnd ne0,r0,0 ; bubble
|
||||||
addu r4,r4,1
|
addu r4,r4,1
|
||||||
L1: mul r26,r9,r5 ; low word of product mul_1 WB ld
|
L1: mul r26,r9,r5 ; low word of product mul_1 WB ld
|
||||||
mask r12,r9,0xffff ; r12 = lo(s1_limb) mask_1
|
mask r12,r9,0xffff ; r12 = lo(s1_limb) mask_1
|
||||||
mul r11,r12,r7 ; r11 = prod_0 mul_2 WB mask_1
|
mul r11,r12,r7 ; r11 = prod_0 mul_2 WB mask_1
|
||||||
mul r10,r12,r8 ; r10 = prod_1a mul_3
|
mul r10,r12,r8 ; r10 = prod_1a mul_3
|
||||||
extu r13,r9,16 ; r13 = hi(s1_limb) extu_1 WB mul_1
|
extu r13,r9,16 ; r13 = hi(s1_limb) extu_1 WB mul_1
|
||||||
mul r12,r13,r7 ; r12 = prod_1b mul_4 WB extu_1
|
mul r12,r13,r7 ; r12 = prod_1b mul_4 WB extu_1
|
||||||
mul r25,r13,r8 ; r25 = prod_2 mul_5 WB mul_2
|
mul r25,r13,r8 ; r25 = prod_2 mul_5 WB mul_2
|
||||||
extu r11,r11,16 ; r11 = hi(prod_0) extu_2 WB mul_3
|
extu r11,r11,16 ; r11 = hi(prod_0) extu_2 WB mul_3
|
||||||
addu r10,r10,r11 ; addu_1 WB extu_2
|
addu r10,r10,r11 ; addu_1 WB extu_2
|
||||||
; bcnd ne0,r0,0 ; bubble WB addu_1
|
; bcnd ne0,r0,0 ; bubble WB addu_1
|
||||||
addu.co r10,r10,r12 ; WB mul_4
|
addu.co r10,r10,r12 ; WB mul_4
|
||||||
mask.u r10,r10,0xffff ; move the 16 most significant bits...
|
mask.u r10,r10,0xffff ; move the 16 most significant bits...
|
||||||
addu.ci r10,r10,r0 ; ...to the low half of the word...
|
addu.ci r10,r10,r0 ; ...to the low half of the word...
|
||||||
rot r10,r10,16 ; ...and put carry in pos 16.
|
rot r10,r10,16 ; ...and put carry in pos 16.
|
||||||
addu.co r26,r26,r2 ; add old carry limb
|
addu.co r26,r26,r2 ; add old carry limb
|
||||||
bcnd.n ne0,r4,Loop
|
bcnd.n ne0,r4,Loop
|
||||||
addu.ci r2,r25,r10 ; compute new carry limb
|
addu.ci r2,r25,r10 ; compute new carry limb
|
||||||
|
|
||||||
st r26,r6[r4]
|
st r26,r6[r4]
|
||||||
ld.d r25,r31,8
|
ld.d r25,r31,8
|
||||||
@ -109,20 +108,19 @@ Lsmall:
|
|||||||
br.n SL1
|
br.n SL1
|
||||||
addu r4,r4,1
|
addu r4,r4,1
|
||||||
|
|
||||||
SLoop:
|
SLoop: ld r9,r3[r4] ;
|
||||||
ld r9,r3[r4] ;
|
st r8,r6[r4] ;
|
||||||
st r8,r6[r4] ;
|
addu r4,r4,1 ;
|
||||||
addu r4,r4,1 ;
|
SL1: mul r8,r9,r5 ; low word of product
|
||||||
SL1: mul r8,r9,r5 ; low word of product
|
mask r12,r9,0xffff ; r12 = lo(s1_limb)
|
||||||
mask r12,r9,0xffff ; r12 = lo(s1_limb)
|
extu r13,r9,16 ; r13 = hi(s1_limb)
|
||||||
extu r13,r9,16 ; r13 = hi(s1_limb)
|
mul r11,r12,r7 ; r11 = prod_0
|
||||||
mul r11,r12,r7 ; r11 = prod_0
|
mul r12,r13,r7 ; r12 = prod_1b
|
||||||
mul r12,r13,r7 ; r12 = prod_1b
|
addu.cio r8,r8,r2 ; add old carry limb
|
||||||
addu.cio r8,r8,r2 ; add old carry limb
|
extu r10,r11,16 ; r11 = hi(prod_0)
|
||||||
extu r10,r11,16 ; r11 = hi(prod_0)
|
addu r10,r10,r12 ;
|
||||||
addu r10,r10,r12 ;
|
|
||||||
bcnd.n ne0,r4,SLoop
|
bcnd.n ne0,r4,SLoop
|
||||||
extu r2,r10,16 ; r2 = new carry limb
|
extu r2,r10,16 ; r2 = new carry limb
|
||||||
|
|
||||||
jmp.n r1
|
jmp.n r1
|
||||||
st r8,r6[r4]
|
st r8,r6[r4]
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
; mc88100 __mpn_sub -- Subtract two limb vectors of the same length > 0 and
|
; mc88100 __mpn_sub -- Subtract two limb vectors of the same length > 0 and
|
||||||
; store difference in a third limb vector.
|
; store difference in a third limb vector.
|
||||||
|
|
||||||
; Copyright (C) 1992, 1994 Free Software Foundation, Inc.
|
; Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
; This file is part of the GNU MP Library.
|
; This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -41,9 +41,10 @@ ___mpn_sub_n:
|
|||||||
extu r10,r5,3
|
extu r10,r5,3
|
||||||
ld r7,r4,0 ; read first limb from s2_ptr
|
ld r7,r4,0 ; read first limb from s2_ptr
|
||||||
|
|
||||||
subu.co r5,r0,r5 ; (clear carry as side effect)
|
subu r5,r0,r5
|
||||||
mak r5,r5,3<4>
|
mak r5,r5,3<4>
|
||||||
bcnd eq0,r5,Lzero
|
bcnd.n eq0,r5,Lzero
|
||||||
|
subu.co r0,r0,r0 ; initialize carry
|
||||||
|
|
||||||
or r12,r0,lo16(Lbase)
|
or r12,r0,lo16(Lbase)
|
||||||
or.u r12,r12,hi16(Lbase)
|
or.u r12,r12,hi16(Lbase)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# MIPS __mpn_addmul_1 -- Multiply a limb vector with a single limb and
|
# MIPS __mpn_addmul_1 -- Multiply a limb vector with a single limb and
|
||||||
# add the product to a second limb vector.
|
# add the product to a second limb vector.
|
||||||
|
|
||||||
# Copyright (C) 1992, 1994 Free Software Foundation, Inc.
|
# Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This file is part of the GNU MP Library.
|
# This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -63,7 +63,7 @@ Loop: lw $10,0($4)
|
|||||||
addu $2,$2,$10
|
addu $2,$2,$10
|
||||||
sw $3,0($4)
|
sw $3,0($4)
|
||||||
addiu $4,$4,4
|
addiu $4,$4,4
|
||||||
bne $6,$0,Loop # should be "bnel"
|
bne $6,$0,Loop
|
||||||
addu $2,$9,$2 # add high product limb and carry from addition
|
addu $2,$9,$2 # add high product limb and carry from addition
|
||||||
|
|
||||||
# cool down phase 1
|
# cool down phase 1
|
||||||
|
@ -63,7 +63,7 @@ Loop: ld $10,0($4)
|
|||||||
daddu $2,$2,$10
|
daddu $2,$2,$10
|
||||||
sd $3,0($4)
|
sd $3,0($4)
|
||||||
daddiu $4,$4,8
|
daddiu $4,$4,8
|
||||||
bne $6,$0,Loop # should be "bnel"
|
bne $6,$0,Loop
|
||||||
daddu $2,$9,$2 # add high product limb and carry from addition
|
daddu $2,$9,$2 # add high product limb and carry from addition
|
||||||
|
|
||||||
# cool down phase 1
|
# cool down phase 1
|
||||||
|
@ -59,7 +59,7 @@ Loop: mflo $10
|
|||||||
sltu $2,$10,$2 # carry from previous addition -> $2
|
sltu $2,$10,$2 # carry from previous addition -> $2
|
||||||
sd $10,0($4)
|
sd $10,0($4)
|
||||||
daddiu $4,$4,8
|
daddiu $4,$4,8
|
||||||
bne $6,$0,Loop # should be "bnel"
|
bne $6,$0,Loop
|
||||||
daddu $2,$9,$2 # add high product limb and carry from addition
|
daddu $2,$9,$2 # add high product limb and carry from addition
|
||||||
|
|
||||||
# cool down phase 1
|
# cool down phase 1
|
||||||
|
@ -63,7 +63,7 @@ Loop: ld $10,0($4)
|
|||||||
daddu $2,$2,$10
|
daddu $2,$2,$10
|
||||||
sd $3,0($4)
|
sd $3,0($4)
|
||||||
daddiu $4,$4,8
|
daddiu $4,$4,8
|
||||||
bne $6,$0,Loop # should be "bnel"
|
bne $6,$0,Loop
|
||||||
daddu $2,$9,$2 # add high product limb and carry from addition
|
daddu $2,$9,$2 # add high product limb and carry from addition
|
||||||
|
|
||||||
# cool down phase 1
|
# cool down phase 1
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# MIPS __mpn_mul_1 -- Multiply a limb vector with a single limb and
|
# MIPS __mpn_mul_1 -- Multiply a limb vector with a single limb and
|
||||||
# store the product in a second limb vector.
|
# store the product in a second limb vector.
|
||||||
|
|
||||||
# Copyright (C) 1992, 1994 Free Software Foundation, Inc.
|
# Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This file is part of the GNU MP Library.
|
# This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -59,7 +59,7 @@ Loop: mflo $10
|
|||||||
sltu $2,$10,$2 # carry from previous addition -> $2
|
sltu $2,$10,$2 # carry from previous addition -> $2
|
||||||
sw $10,0($4)
|
sw $10,0($4)
|
||||||
addiu $4,$4,4
|
addiu $4,$4,4
|
||||||
bne $6,$0,Loop # should be "bnel"
|
bne $6,$0,Loop
|
||||||
addu $2,$9,$2 # add high product limb and carry from addition
|
addu $2,$9,$2 # add high product limb and carry from addition
|
||||||
|
|
||||||
# cool down phase 1
|
# cool down phase 1
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# MIPS __mpn_submul_1 -- Multiply a limb vector with a single limb and
|
# MIPS __mpn_submul_1 -- Multiply a limb vector with a single limb and
|
||||||
# subtract the product from a second limb vector.
|
# subtract the product from a second limb vector.
|
||||||
|
|
||||||
# Copyright (C) 1992, 1994 Free Software Foundation, Inc.
|
# Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This file is part of the GNU MP Library.
|
# This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -63,7 +63,7 @@ Loop: lw $10,0($4)
|
|||||||
addu $2,$2,$10
|
addu $2,$2,$10
|
||||||
sw $3,0($4)
|
sw $3,0($4)
|
||||||
addiu $4,$4,4
|
addiu $4,$4,4
|
||||||
bne $6,$0,Loop # should be "bnel"
|
bne $6,$0,Loop
|
||||||
addu $2,$9,$2 # add high product limb and carry from addition
|
addu $2,$9,$2 # add high product limb and carry from addition
|
||||||
|
|
||||||
# cool down phase 1
|
# cool down phase 1
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# IBM POWER __mpn_add_n -- Add two limb vectors of equal, non-zero length.
|
# IBM POWER __mpn_add_n -- Add two limb vectors of equal, non-zero length.
|
||||||
|
|
||||||
# Copyright (C) 1992, 1994 Free Software Foundation, Inc.
|
# Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This file is part of the GNU MP Library.
|
# This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# IBM POWER __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and
|
# IBM POWER __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and
|
||||||
# store difference in a third limb vector.
|
# store difference in a third limb vector.
|
||||||
|
|
||||||
# Copyright (C) 1992, 1994 Free Software Foundation, Inc.
|
# Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This file is part of the GNU MP Library.
|
# This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
! sparc __mpn_add_n -- Add two limb vectors of the same length > 0 and store
|
! SPARC __mpn_add_n -- Add two limb vectors of the same length > 0 and store
|
||||||
! sum in a third limb vector.
|
! sum in a third limb vector.
|
||||||
|
|
||||||
! Copyright (C) 1995 Free Software Foundation, Inc.
|
! Copyright (C) 1995, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
! This file is part of the GNU MP Library.
|
! This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -32,18 +32,14 @@
|
|||||||
.align 4
|
.align 4
|
||||||
.global C_SYMBOL_NAME(__mpn_add_n)
|
.global C_SYMBOL_NAME(__mpn_add_n)
|
||||||
C_SYMBOL_NAME(__mpn_add_n):
|
C_SYMBOL_NAME(__mpn_add_n):
|
||||||
cmp size,8
|
|
||||||
mov 0,%o4 ! clear cy-save register
|
|
||||||
blt,a Ltriv
|
|
||||||
addcc size,-2,size
|
|
||||||
xor s2_ptr,res_ptr,%g1
|
xor s2_ptr,res_ptr,%g1
|
||||||
andcc %g1,4,%g0
|
andcc %g1,4,%g0
|
||||||
bne L1 ! branch if alignment differs
|
bne L1 ! branch if alignment differs
|
||||||
nop
|
nop
|
||||||
L0: andcc res_ptr,4,%g0 ! res_ptr unaligned? Side effect: cy=0
|
|
||||||
beq L_v1 ! if no, branch
|
|
||||||
nop
|
|
||||||
! ** V1a **
|
! ** V1a **
|
||||||
|
L0: andcc res_ptr,4,%g0 ! res_ptr unaligned? Side effect: cy=0
|
||||||
|
be L_v1 ! if no, branch
|
||||||
|
nop
|
||||||
/* Add least significant limb separately to align res_ptr and s2_ptr */
|
/* Add least significant limb separately to align res_ptr and s2_ptr */
|
||||||
ld [s1_ptr],%g4
|
ld [s1_ptr],%g4
|
||||||
add s1_ptr,4,s1_ptr
|
add s1_ptr,4,s1_ptr
|
||||||
@ -53,12 +49,15 @@ L0: andcc res_ptr,4,%g0 ! res_ptr unaligned? Side effect: cy=0
|
|||||||
addcc %g4,%g2,%o4
|
addcc %g4,%g2,%o4
|
||||||
st %o4,[res_ptr]
|
st %o4,[res_ptr]
|
||||||
add res_ptr,4,res_ptr
|
add res_ptr,4,res_ptr
|
||||||
|
L_v1: addx %g0,%g0,%o4 ! save cy in register
|
||||||
|
cmp size,2 ! if size < 2 ...
|
||||||
|
bl Lend2 ! ... branch to tail code
|
||||||
|
subcc %g0,%o4,%g0 ! restore cy
|
||||||
|
|
||||||
L_v1: ld [s1_ptr+0],%g4
|
ld [s1_ptr+0],%g4
|
||||||
|
addcc size,-10,size
|
||||||
ld [s1_ptr+4],%g1
|
ld [s1_ptr+4],%g1
|
||||||
ldd [s2_ptr+0],%g2
|
ldd [s2_ptr+0],%g2
|
||||||
addx %g0,%g0,%o4 ! save cy in register
|
|
||||||
addcc size,-10,size
|
|
||||||
blt Lfin1
|
blt Lfin1
|
||||||
subcc %g0,%o4,%g0 ! restore cy
|
subcc %g0,%o4,%g0 ! restore cy
|
||||||
/* Add blocks of 8 limbs until less than 8 limbs remain */
|
/* Add blocks of 8 limbs until less than 8 limbs remain */
|
||||||
@ -98,7 +97,7 @@ Lfin1: addcc size,8-2,size
|
|||||||
blt Lend1
|
blt Lend1
|
||||||
subcc %g0,%o4,%g0 ! restore cy
|
subcc %g0,%o4,%g0 ! restore cy
|
||||||
/* Add blocks of 2 limbs until less than 2 limbs remain */
|
/* Add blocks of 2 limbs until less than 2 limbs remain */
|
||||||
Loop1b: addxcc %g4,%g2,%o4
|
Loope1: addxcc %g4,%g2,%o4
|
||||||
ld [s1_ptr+8],%g4
|
ld [s1_ptr+8],%g4
|
||||||
addxcc %g1,%g3,%o5
|
addxcc %g1,%g3,%o5
|
||||||
ld [s1_ptr+12],%g1
|
ld [s1_ptr+12],%g1
|
||||||
@ -109,7 +108,7 @@ Loop1b: addxcc %g4,%g2,%o4
|
|||||||
add s1_ptr,8,s1_ptr
|
add s1_ptr,8,s1_ptr
|
||||||
add s2_ptr,8,s2_ptr
|
add s2_ptr,8,s2_ptr
|
||||||
add res_ptr,8,res_ptr
|
add res_ptr,8,res_ptr
|
||||||
bge Loop1b
|
bge Loope1
|
||||||
subcc %g0,%o4,%g0 ! restore cy
|
subcc %g0,%o4,%g0 ! restore cy
|
||||||
Lend1: addxcc %g4,%g2,%o4
|
Lend1: addxcc %g4,%g2,%o4
|
||||||
addxcc %g1,%g3,%o5
|
addxcc %g1,%g3,%o5
|
||||||
@ -144,10 +143,13 @@ L1: xor s1_ptr,res_ptr,%g1
|
|||||||
things can be aligned (that we care about) we now know that the alignment
|
things can be aligned (that we care about) we now know that the alignment
|
||||||
of s1_ptr and s2_ptr are the same. */
|
of s1_ptr and s2_ptr are the same. */
|
||||||
|
|
||||||
L2: andcc s1_ptr,4,%g0 ! s1_ptr unaligned? Side effect: cy=0
|
L2: cmp size,1
|
||||||
beq L_v2 ! if no, branch
|
be Ljone
|
||||||
nop
|
nop
|
||||||
/* Add least significant limb separately to align res_ptr and s2_ptr */
|
andcc s1_ptr,4,%g0 ! s1_ptr unaligned? Side effect: cy=0
|
||||||
|
be L_v2 ! if no, branch
|
||||||
|
nop
|
||||||
|
/* Add least significant limb separately to align s1_ptr and s2_ptr */
|
||||||
ld [s1_ptr],%g4
|
ld [s1_ptr],%g4
|
||||||
add s1_ptr,4,s1_ptr
|
add s1_ptr,4,s1_ptr
|
||||||
ld [s2_ptr],%g2
|
ld [s2_ptr],%g2
|
||||||
@ -195,9 +197,9 @@ Loop2: ldd [s1_ptr+0],%g2
|
|||||||
subcc %g0,%o4,%g0 ! restore cy
|
subcc %g0,%o4,%g0 ! restore cy
|
||||||
|
|
||||||
Lfin2: addcc size,8-2,size
|
Lfin2: addcc size,8-2,size
|
||||||
Ltriv: blt Lend2
|
blt Lend2
|
||||||
subcc %g0,%o4,%g0 ! restore cy
|
subcc %g0,%o4,%g0 ! restore cy
|
||||||
Loop2b: ldd [s1_ptr+0],%g2
|
Loope2: ldd [s1_ptr+0],%g2
|
||||||
ldd [s2_ptr+0],%o4
|
ldd [s2_ptr+0],%o4
|
||||||
addxcc %g2,%o4,%g2
|
addxcc %g2,%o4,%g2
|
||||||
st %g2,[res_ptr+0]
|
st %g2,[res_ptr+0]
|
||||||
@ -208,13 +210,13 @@ Loop2b: ldd [s1_ptr+0],%g2
|
|||||||
add s1_ptr,8,s1_ptr
|
add s1_ptr,8,s1_ptr
|
||||||
add s2_ptr,8,s2_ptr
|
add s2_ptr,8,s2_ptr
|
||||||
add res_ptr,8,res_ptr
|
add res_ptr,8,res_ptr
|
||||||
bge Loop2b
|
bge Loope2
|
||||||
subcc %g0,%o4,%g0 ! restore cy
|
subcc %g0,%o4,%g0 ! restore cy
|
||||||
Lend2: andcc size,1,%g0
|
Lend2: andcc size,1,%g0
|
||||||
be Lret2
|
be Lret2
|
||||||
subcc %g0,%o4,%g0 ! restore cy
|
subcc %g0,%o4,%g0 ! restore cy
|
||||||
/* Add last limb */
|
/* Add last limb */
|
||||||
ld [s1_ptr],%g4
|
Ljone: ld [s1_ptr],%g4
|
||||||
ld [s2_ptr],%g2
|
ld [s2_ptr],%g2
|
||||||
addxcc %g4,%g2,%o4
|
addxcc %g4,%g2,%o4
|
||||||
st %o4,[res_ptr]
|
st %o4,[res_ptr]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
! sparc __mpn_lshift --
|
! sparc __mpn_lshift --
|
||||||
|
|
||||||
! Copyright (C) 1995 Free Software Foundation, Inc.
|
! Copyright (C) 1995, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
! This file is part of the GNU MP Library.
|
! This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -39,7 +39,7 @@ C_SYMBOL_NAME(__mpn_lshift):
|
|||||||
add %o2,-1,%o2
|
add %o2,-1,%o2
|
||||||
andcc %o2,4-1,%g4 ! number of limbs in first loop
|
andcc %o2,4-1,%g4 ! number of limbs in first loop
|
||||||
srl %g2,%o5,%g1 ! compute function result
|
srl %g2,%o5,%g1 ! compute function result
|
||||||
beq L0 ! if multiple of 4 limbs, skip first loop
|
be L0 ! if multiple of 4 limbs, skip first loop
|
||||||
st %g1,[%sp+80]
|
st %g1,[%sp+80]
|
||||||
|
|
||||||
sub %o2,%g4,%o2 ! adjust count for main loop
|
sub %o2,%g4,%o2 ! adjust count for main loop
|
||||||
@ -56,7 +56,7 @@ Loop0: ld [%o1-8],%g3
|
|||||||
st %o4,[%o0+0]
|
st %o4,[%o0+0]
|
||||||
|
|
||||||
L0: tst %o2
|
L0: tst %o2
|
||||||
beq Lend
|
be Lend
|
||||||
nop
|
nop
|
||||||
|
|
||||||
Loop: ld [%o1-8],%g3
|
Loop: ld [%o1-8],%g3
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
! sparc __mpn_rshift --
|
! sparc __mpn_rshift --
|
||||||
|
|
||||||
! Copyright (C) 1995 Free Software Foundation, Inc.
|
! Copyright (C) 1995, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
! This file is part of the GNU MP Library.
|
! This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ C_SYMBOL_NAME(__mpn_rshift):
|
|||||||
add %o2,-1,%o2
|
add %o2,-1,%o2
|
||||||
andcc %o2,4-1,%g4 ! number of limbs in first loop
|
andcc %o2,4-1,%g4 ! number of limbs in first loop
|
||||||
sll %g2,%o5,%g1 ! compute function result
|
sll %g2,%o5,%g1 ! compute function result
|
||||||
beq L0 ! if multiple of 4 limbs, skip first loop
|
be L0 ! if multiple of 4 limbs, skip first loop
|
||||||
st %g1,[%sp+80]
|
st %g1,[%sp+80]
|
||||||
|
|
||||||
sub %o2,%g4,%o2 ! adjust count for main loop
|
sub %o2,%g4,%o2 ! adjust count for main loop
|
||||||
@ -53,7 +53,7 @@ Loop0: ld [%o1+4],%g3
|
|||||||
st %o4,[%o0-4]
|
st %o4,[%o0-4]
|
||||||
|
|
||||||
L0: tst %o2
|
L0: tst %o2
|
||||||
beq Lend
|
be Lend
|
||||||
nop
|
nop
|
||||||
|
|
||||||
Loop: ld [%o1+4],%g3
|
Loop: ld [%o1+4],%g3
|
||||||
|
57
sysdeps/sparc/sparc64/add_n.s
Normal file
57
sysdeps/sparc/sparc64/add_n.s
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
! SPARC v9 __mpn_add_n -- Add two limb vectors of the same length > 0 and store
|
||||||
|
! sum in a third limb vector.
|
||||||
|
|
||||||
|
! Copyright (C) 1995, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
! This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
|
||||||
|
! the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
|
||||||
|
! INPUT PARAMETERS
|
||||||
|
! res_ptr %o0
|
||||||
|
! s1_ptr %o1
|
||||||
|
! s2_ptr %o2
|
||||||
|
! size %o3
|
||||||
|
|
||||||
|
.section ".text"
|
||||||
|
.align 4
|
||||||
|
.global __mpn_add_n
|
||||||
|
.type __mpn_add_n,#function
|
||||||
|
.proc 04
|
||||||
|
__mpn_add_n:
|
||||||
|
sub %g0,%o3,%g3
|
||||||
|
sllx %o3,3,%g1
|
||||||
|
add %o1,%g1,%o1 ! make s1_ptr point at end
|
||||||
|
add %o2,%g1,%o2 ! make s2_ptr point at end
|
||||||
|
add %o0,%g1,%o0 ! make res_ptr point at end
|
||||||
|
mov 0,%o4 ! clear carry variable
|
||||||
|
sllx %g3,3,%o5 ! compute initial address index
|
||||||
|
|
||||||
|
.Loop: ldx [%o2+%o5],%g1 ! load s2 limb
|
||||||
|
add %g3,1,%g3 ! increment loop count
|
||||||
|
ldx [%o1+%o5],%g2 ! load s1 limb
|
||||||
|
addcc %g1,%o4,%g1 ! add s2 limb and carry variable
|
||||||
|
movcc %xcc,0,%o4 ! if carry-out, o4 was 1; clear it
|
||||||
|
addcc %g1,%g2,%g1 ! add s1 limb to sum
|
||||||
|
stx %g1,[%o0+%o5] ! store result
|
||||||
|
add %o5,8,%o5 ! increment address index
|
||||||
|
brnz,pt %g3,.Loop
|
||||||
|
movcs %xcc,1,%o4 ! if s1 add gave carry, record it
|
||||||
|
|
||||||
|
retl
|
||||||
|
mov %o4,%o0
|
||||||
|
.LLfe1:
|
||||||
|
.size __mpn_add_n,.LLfe1-__mpn_add_n
|
88
sysdeps/sparc/sparc64/addmul_1.s
Normal file
88
sysdeps/sparc/sparc64/addmul_1.s
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
! SPARC v9 __mpn_addmul_1 -- Multiply a limb vector with a single limb and
|
||||||
|
! add the product to a second limb vector.
|
||||||
|
|
||||||
|
! Copyright (C) 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
! This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
|
||||||
|
! the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
|
||||||
|
! INPUT PARAMETERS
|
||||||
|
! res_ptr o0
|
||||||
|
! s1_ptr o1
|
||||||
|
! size o2
|
||||||
|
! s2_limb o3
|
||||||
|
|
||||||
|
.section ".text"
|
||||||
|
.align 4
|
||||||
|
.global __mpn_addmul_1
|
||||||
|
.type __mpn_addmul_1,#function
|
||||||
|
.proc 016
|
||||||
|
__mpn_addmul_1:
|
||||||
|
!#PROLOGUE# 0
|
||||||
|
save %sp,-160,%sp
|
||||||
|
!#PROLOGUE# 1
|
||||||
|
sub %g0,%i2,%o7
|
||||||
|
sllx %o7,3,%g5
|
||||||
|
sub %i1,%g5,%o3
|
||||||
|
sub %i0,%g5,%o4
|
||||||
|
mov 0,%o0 ! zero cy_limb
|
||||||
|
|
||||||
|
srl %i3,0,%o1 ! extract low 32 bits of s2_limb
|
||||||
|
srlx %i3,32,%i3 ! extract high 32 bits of s2_limb
|
||||||
|
mov 1,%o2
|
||||||
|
sllx %o2,32,%o2 ! o2 = 0x100000000
|
||||||
|
|
||||||
|
! hi !
|
||||||
|
! mid-1 !
|
||||||
|
! mid-2 !
|
||||||
|
! lo !
|
||||||
|
.Loop:
|
||||||
|
sllx %o7,3,%g1
|
||||||
|
ldx [%o3+%g1],%g5
|
||||||
|
srl %g5,0,%i0 ! zero hi bits
|
||||||
|
srlx %g5,32,%g5
|
||||||
|
mulx %o1,%i0,%i4 ! lo product
|
||||||
|
mulx %i3,%i0,%i1 ! mid-1 product
|
||||||
|
mulx %o1,%g5,%l2 ! mid-2 product
|
||||||
|
mulx %i3,%g5,%i5 ! hi product
|
||||||
|
srlx %i4,32,%i0 ! extract high 32 bits of lo product...
|
||||||
|
add %i1,%i0,%i1 ! ...and add it to the mid-1 product
|
||||||
|
addcc %i1,%l2,%i1 ! add mid products
|
||||||
|
mov 0,%l0 ! we need the carry from that add...
|
||||||
|
movcs %xcc,%o2,%l0 ! ...compute it and...
|
||||||
|
add %i5,%l0,%i5 ! ...add to bit 32 of the hi product
|
||||||
|
sllx %i1,32,%i0 ! align low bits of mid product
|
||||||
|
srl %i4,0,%g5 ! zero high 32 bits of lo product
|
||||||
|
add %i0,%g5,%i0 ! combine into low 64 bits of result
|
||||||
|
srlx %i1,32,%i1 ! extract high bits of mid product...
|
||||||
|
add %i5,%i1,%i1 ! ...and add them to the high result
|
||||||
|
addcc %i0,%o0,%i0 ! add cy_limb to low 64 bits of result
|
||||||
|
mov 0,%g5
|
||||||
|
movcs %xcc,1,%g5
|
||||||
|
add %o7,1,%o7
|
||||||
|
ldx [%o4+%g1],%l1
|
||||||
|
addcc %l1,%i0,%i0
|
||||||
|
movcs %xcc,1,%g5
|
||||||
|
stx %i0,[%o4+%g1]
|
||||||
|
brnz %o7,.Loop
|
||||||
|
add %i1,%g5,%o0 ! compute new cy_limb
|
||||||
|
|
||||||
|
mov %o0,%i0
|
||||||
|
ret
|
||||||
|
restore
|
||||||
|
.LLfe1:
|
||||||
|
.size __mpn_addmul_1,.LLfe1-__mpn_addmul_1
|
26
sysdeps/sparc/sparc64/gmp-mparam.h
Normal file
26
sysdeps/sparc/sparc64/gmp-mparam.h
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/* gmp-mparam.h -- Compiler/machine parameter header file.
|
||||||
|
|
||||||
|
Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
|
||||||
|
the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
|
#define BITS_PER_MP_LIMB 64
|
||||||
|
#define BYTES_PER_MP_LIMB 8
|
||||||
|
#define BITS_PER_LONGINT 64
|
||||||
|
#define BITS_PER_INT 32
|
||||||
|
#define BITS_PER_SHORTINT 16
|
||||||
|
#define BITS_PER_CHAR 8
|
95
sysdeps/sparc/sparc64/lshift.s
Normal file
95
sysdeps/sparc/sparc64/lshift.s
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
! SPARC v9 __mpn_lshift --
|
||||||
|
|
||||||
|
! Copyright (C) 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
! This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
|
||||||
|
! the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
|
||||||
|
! INPUT PARAMETERS
|
||||||
|
! res_ptr %o0
|
||||||
|
! src_ptr %o1
|
||||||
|
! size %o2
|
||||||
|
! cnt %o3
|
||||||
|
|
||||||
|
.section ".text"
|
||||||
|
.align 4
|
||||||
|
.global __mpn_lshift
|
||||||
|
.type __mpn_lshift,#function
|
||||||
|
.proc 04
|
||||||
|
__mpn_lshift:
|
||||||
|
sllx %o2,3,%g1
|
||||||
|
add %o1,%g1,%o1 ! make %o1 point at end of src
|
||||||
|
ldx [%o1-8],%g2 ! load first limb
|
||||||
|
sub %g0,%o3,%o5 ! negate shift count
|
||||||
|
add %o0,%g1,%o0 ! make %o0 point at end of res
|
||||||
|
add %o2,-1,%o2
|
||||||
|
and %o2,4-1,%g4 ! number of limbs in first loop
|
||||||
|
srlx %g2,%o5,%g1 ! compute function result
|
||||||
|
brz,pn %g4,.L0 ! if multiple of 4 limbs, skip first loop
|
||||||
|
stx %g1,[%sp+80]
|
||||||
|
|
||||||
|
sub %o2,%g4,%o2 ! adjust count for main loop
|
||||||
|
|
||||||
|
.Loop0: ldx [%o1-16],%g3
|
||||||
|
add %o0,-8,%o0
|
||||||
|
add %o1,-8,%o1
|
||||||
|
add %g4,-1,%g4
|
||||||
|
sllx %g2,%o3,%o4
|
||||||
|
srlx %g3,%o5,%g1
|
||||||
|
mov %g3,%g2
|
||||||
|
or %o4,%g1,%o4
|
||||||
|
brnz,pt %g4,.Loop0
|
||||||
|
stx %o4,[%o0+0]
|
||||||
|
|
||||||
|
.L0: brz,pn %o2,.Lend
|
||||||
|
nop
|
||||||
|
|
||||||
|
.Loop: ldx [%o1-16],%g3
|
||||||
|
add %o0,-32,%o0
|
||||||
|
add %o2,-4,%o2
|
||||||
|
sllx %g2,%o3,%o4
|
||||||
|
srlx %g3,%o5,%g1
|
||||||
|
|
||||||
|
ldx [%o1-24],%g2
|
||||||
|
sllx %g3,%o3,%g4
|
||||||
|
or %o4,%g1,%o4
|
||||||
|
stx %o4,[%o0+24]
|
||||||
|
srlx %g2,%o5,%g1
|
||||||
|
|
||||||
|
ldx [%o1-32],%g3
|
||||||
|
sllx %g2,%o3,%o4
|
||||||
|
or %g4,%g1,%g4
|
||||||
|
stx %g4,[%o0+16]
|
||||||
|
srlx %g3,%o5,%g1
|
||||||
|
|
||||||
|
ldx [%o1-40],%g2
|
||||||
|
sllx %g3,%o3,%g4
|
||||||
|
or %o4,%g1,%o4
|
||||||
|
stx %o4,[%o0+8]
|
||||||
|
srlx %g2,%o5,%g1
|
||||||
|
|
||||||
|
add %o1,-32,%o1
|
||||||
|
or %g4,%g1,%g4
|
||||||
|
brnz,pt %o2,.Loop
|
||||||
|
stx %g4,[%o0+0]
|
||||||
|
|
||||||
|
.Lend: sllx %g2,%o3,%g2
|
||||||
|
stx %g2,[%o0-8]
|
||||||
|
retl
|
||||||
|
ldx [%sp+80],%o0
|
||||||
|
.LLfe1:
|
||||||
|
.size __mpn_lshift,.LLfe1-__mpn_lshift
|
85
sysdeps/sparc/sparc64/mul_1.s
Normal file
85
sysdeps/sparc/sparc64/mul_1.s
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
! SPARC v9 __mpn_mul_1 -- Multiply a limb vector with a single limb and
|
||||||
|
! store the product in a second limb vector.
|
||||||
|
|
||||||
|
! Copyright (C) 1995, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
! This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
|
||||||
|
! the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
|
||||||
|
! INPUT PARAMETERS
|
||||||
|
! res_ptr o0
|
||||||
|
! s1_ptr o1
|
||||||
|
! size o2
|
||||||
|
! s2_limb o3
|
||||||
|
|
||||||
|
.section ".text"
|
||||||
|
.align 4
|
||||||
|
.global __mpn_mul_1
|
||||||
|
.type __mpn_mul_1,#function
|
||||||
|
.proc 016
|
||||||
|
__mpn_mul_1:
|
||||||
|
!#PROLOGUE# 0
|
||||||
|
save %sp,-160,%sp
|
||||||
|
!#PROLOGUE# 1
|
||||||
|
sub %g0,%i2,%o7
|
||||||
|
sllx %o7,3,%g5
|
||||||
|
sub %i1,%g5,%o3
|
||||||
|
sub %i0,%g5,%o4
|
||||||
|
mov 0,%o0 ! zero cy_limb
|
||||||
|
|
||||||
|
srl %i3,0,%o1 ! extract low 32 bits of s2_limb
|
||||||
|
srlx %i3,32,%i3 ! extract high 32 bits of s2_limb
|
||||||
|
mov 1,%o2
|
||||||
|
sllx %o2,32,%o2 ! o2 = 0x100000000
|
||||||
|
|
||||||
|
! hi !
|
||||||
|
! mid-1 !
|
||||||
|
! mid-2 !
|
||||||
|
! lo !
|
||||||
|
.Loop:
|
||||||
|
sllx %o7,3,%g1
|
||||||
|
ldx [%o3+%g1],%g5
|
||||||
|
srl %g5,0,%i0 ! zero hi bits
|
||||||
|
srlx %g5,32,%g5
|
||||||
|
mulx %o1,%i0,%i4 ! lo product
|
||||||
|
mulx %i3,%i0,%i1 ! mid-1 product
|
||||||
|
mulx %o1,%g5,%l2 ! mid-2 product
|
||||||
|
mulx %i3,%g5,%i5 ! hi product
|
||||||
|
srlx %i4,32,%i0 ! extract high 32 bits of lo product...
|
||||||
|
add %i1,%i0,%i1 ! ...and add it to the mid-1 product
|
||||||
|
addcc %i1,%l2,%i1 ! add mid products
|
||||||
|
mov 0,%l0 ! we need the carry from that add...
|
||||||
|
movcs %xcc,%o2,%l0 ! ...compute it and...
|
||||||
|
add %i5,%l0,%i5 ! ...add to bit 32 of the hi product
|
||||||
|
sllx %i1,32,%i0 ! align low bits of mid product
|
||||||
|
srl %i4,0,%g5 ! zero high 32 bits of lo product
|
||||||
|
add %i0,%g5,%i0 ! combine into low 64 bits of result
|
||||||
|
srlx %i1,32,%i1 ! extract high bits of mid product...
|
||||||
|
add %i5,%i1,%i1 ! ...and add them to the high result
|
||||||
|
addcc %i0,%o0,%i0 ! add cy_limb to low 64 bits of result
|
||||||
|
mov 0,%g5
|
||||||
|
movcs %xcc,1,%g5
|
||||||
|
add %o7,1,%o7
|
||||||
|
stx %i0,[%o4+%g1]
|
||||||
|
brnz %o7,.Loop
|
||||||
|
add %i1,%g5,%o0 ! compute new cy_limb
|
||||||
|
|
||||||
|
mov %o0,%i0
|
||||||
|
ret
|
||||||
|
restore
|
||||||
|
.LLfe1:
|
||||||
|
.size __mpn_mul_1,.LLfe1-__mpn_mul_1
|
92
sysdeps/sparc/sparc64/rshift.s
Normal file
92
sysdeps/sparc/sparc64/rshift.s
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
! SPARC v9 __mpn_rshift --
|
||||||
|
|
||||||
|
! Copyright (C) 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
! This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
|
||||||
|
! the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
|
||||||
|
! INPUT PARAMETERS
|
||||||
|
! res_ptr %o0
|
||||||
|
! src_ptr %o1
|
||||||
|
! size %o2
|
||||||
|
! cnt %o3
|
||||||
|
|
||||||
|
.section ".text"
|
||||||
|
.align 4
|
||||||
|
.global __mpn_rshift
|
||||||
|
.type __mpn_rshift,#function
|
||||||
|
.proc 04
|
||||||
|
__mpn_rshift:
|
||||||
|
ldx [%o1],%g2 ! load first limb
|
||||||
|
sub %g0,%o3,%o5 ! negate shift count
|
||||||
|
add %o2,-1,%o2
|
||||||
|
and %o2,4-1,%g4 ! number of limbs in first loop
|
||||||
|
sllx %g2,%o5,%g1 ! compute function result
|
||||||
|
brz,pn %g4,.L0 ! if multiple of 4 limbs, skip first loop
|
||||||
|
stx %g1,[%sp+80]
|
||||||
|
|
||||||
|
sub %o2,%g4,%o2 ! adjust count for main loop
|
||||||
|
|
||||||
|
.Loop0: ldx [%o1+8],%g3
|
||||||
|
add %o0,8,%o0
|
||||||
|
add %o1,8,%o1
|
||||||
|
add %g4,-1,%g4
|
||||||
|
srlx %g2,%o3,%o4
|
||||||
|
sllx %g3,%o5,%g1
|
||||||
|
mov %g3,%g2
|
||||||
|
or %o4,%g1,%o4
|
||||||
|
brnz,pt %g4,.Loop0
|
||||||
|
stx %o4,[%o0-8]
|
||||||
|
|
||||||
|
.L0: brz,pn %o2,.Lend
|
||||||
|
nop
|
||||||
|
|
||||||
|
.Loop: ldx [%o1+8],%g3
|
||||||
|
add %o0,32,%o0
|
||||||
|
add %o2,-4,%o2
|
||||||
|
srlx %g2,%o3,%o4
|
||||||
|
sllx %g3,%o5,%g1
|
||||||
|
|
||||||
|
ldx [%o1+16],%g2
|
||||||
|
srlx %g3,%o3,%g4
|
||||||
|
or %o4,%g1,%o4
|
||||||
|
stx %o4,[%o0-32]
|
||||||
|
sllx %g2,%o5,%g1
|
||||||
|
|
||||||
|
ldx [%o1+24],%g3
|
||||||
|
srlx %g2,%o3,%o4
|
||||||
|
or %g4,%g1,%g4
|
||||||
|
stx %g4,[%o0-24]
|
||||||
|
sllx %g3,%o5,%g1
|
||||||
|
|
||||||
|
ldx [%o1+32],%g2
|
||||||
|
srlx %g3,%o3,%g4
|
||||||
|
or %o4,%g1,%o4
|
||||||
|
stx %o4,[%o0-16]
|
||||||
|
sllx %g2,%o5,%g1
|
||||||
|
|
||||||
|
add %o1,32,%o1
|
||||||
|
or %g4,%g1,%g4
|
||||||
|
brnz %o2,.Loop
|
||||||
|
stx %g4,[%o0-8]
|
||||||
|
|
||||||
|
.Lend: srlx %g2,%o3,%g2
|
||||||
|
stx %g2,[%o0-0]
|
||||||
|
retl
|
||||||
|
ldx [%sp+80],%o0
|
||||||
|
.LLfe1:
|
||||||
|
.size __mpn_rshift,.LLfe1-__mpn_rshift
|
57
sysdeps/sparc/sparc64/sub_n.s
Normal file
57
sysdeps/sparc/sparc64/sub_n.s
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
! SPARC v9 __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and
|
||||||
|
! store difference in a third limb vector.
|
||||||
|
|
||||||
|
! Copyright (C) 1995, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
! This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
|
||||||
|
! the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
|
||||||
|
! INPUT PARAMETERS
|
||||||
|
! res_ptr %o0
|
||||||
|
! s1_ptr %o1
|
||||||
|
! s2_ptr %o2
|
||||||
|
! size %o3
|
||||||
|
|
||||||
|
.section ".text"
|
||||||
|
.align 4
|
||||||
|
.global __mpn_sub_n
|
||||||
|
.type __mpn_sub_n,#function
|
||||||
|
.proc 04
|
||||||
|
__mpn_sub_n:
|
||||||
|
sub %g0,%o3,%g3
|
||||||
|
sllx %o3,3,%g1
|
||||||
|
add %o1,%g1,%o1 ! make s1_ptr point at end
|
||||||
|
add %o2,%g1,%o2 ! make s2_ptr point at end
|
||||||
|
add %o0,%g1,%o0 ! make res_ptr point at end
|
||||||
|
mov 0,%o4 ! clear carry variable
|
||||||
|
sllx %g3,3,%o5 ! compute initial address index
|
||||||
|
|
||||||
|
.Loop: ldx [%o2+%o5],%g1 ! load s2 limb
|
||||||
|
add %g3,1,%g3 ! increment loop count
|
||||||
|
ldx [%o1+%o5],%g2 ! load s1 limb
|
||||||
|
addcc %g1,%o4,%g1 ! add s2 limb and carry variable
|
||||||
|
movcc %xcc,0,%o4 ! if carry-out, o4 was 1; clear it
|
||||||
|
subcc %g1,%g2,%g1 ! subtract s1 limb from sum
|
||||||
|
stx %g1,[%o0+%o5] ! store result
|
||||||
|
add %o5,8,%o5 ! increment address index
|
||||||
|
brnz,pt %g3,.Loop
|
||||||
|
movcs %xcc,1,%o4 ! if s1 subtract gave carry, record it
|
||||||
|
|
||||||
|
retl
|
||||||
|
mov %o4,%o0
|
||||||
|
.LLfe1:
|
||||||
|
.size __mpn_sub_n,.LLfe1-__mpn_sub_n
|
88
sysdeps/sparc/sparc64/submul_1.s
Normal file
88
sysdeps/sparc/sparc64/submul_1.s
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
! SPARC v9 __mpn_submul_1 -- Multiply a limb vector with a single limb and
|
||||||
|
! subtract the product from a second limb vector.
|
||||||
|
|
||||||
|
! Copyright (C) 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
! This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
|
||||||
|
! the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
|
||||||
|
! INPUT PARAMETERS
|
||||||
|
! res_ptr o0
|
||||||
|
! s1_ptr o1
|
||||||
|
! size o2
|
||||||
|
! s2_limb o3
|
||||||
|
|
||||||
|
.section ".text"
|
||||||
|
.align 4
|
||||||
|
.global __mpn_submul_1
|
||||||
|
.type __mpn_submul_1,#function
|
||||||
|
.proc 016
|
||||||
|
__mpn_submul_1:
|
||||||
|
!#PROLOGUE# 0
|
||||||
|
save %sp,-160,%sp
|
||||||
|
!#PROLOGUE# 1
|
||||||
|
sub %g0,%i2,%o7
|
||||||
|
sllx %o7,3,%g5
|
||||||
|
sub %i1,%g5,%o3
|
||||||
|
sub %i0,%g5,%o4
|
||||||
|
mov 0,%o0 ! zero cy_limb
|
||||||
|
|
||||||
|
srl %i3,0,%o1 ! extract low 32 bits of s2_limb
|
||||||
|
srlx %i3,32,%i3 ! extract high 32 bits of s2_limb
|
||||||
|
mov 1,%o2
|
||||||
|
sllx %o2,32,%o2 ! o2 = 0x100000000
|
||||||
|
|
||||||
|
! hi !
|
||||||
|
! mid-1 !
|
||||||
|
! mid-2 !
|
||||||
|
! lo !
|
||||||
|
.Loop:
|
||||||
|
sllx %o7,3,%g1
|
||||||
|
ldx [%o3+%g1],%g5
|
||||||
|
srl %g5,0,%i0 ! zero hi bits
|
||||||
|
srlx %g5,32,%g5
|
||||||
|
mulx %o1,%i0,%i4 ! lo product
|
||||||
|
mulx %i3,%i0,%i1 ! mid-1 product
|
||||||
|
mulx %o1,%g5,%l2 ! mid-2 product
|
||||||
|
mulx %i3,%g5,%i5 ! hi product
|
||||||
|
srlx %i4,32,%i0 ! extract high 32 bits of lo product...
|
||||||
|
add %i1,%i0,%i1 ! ...and add it to the mid-1 product
|
||||||
|
addcc %i1,%l2,%i1 ! add mid products
|
||||||
|
mov 0,%l0 ! we need the carry from that add...
|
||||||
|
movcs %xcc,%o2,%l0 ! ...compute it and...
|
||||||
|
add %i5,%l0,%i5 ! ...add to bit 32 of the hi product
|
||||||
|
sllx %i1,32,%i0 ! align low bits of mid product
|
||||||
|
srl %i4,0,%g5 ! zero high 32 bits of lo product
|
||||||
|
add %i0,%g5,%i0 ! combine into low 64 bits of result
|
||||||
|
srlx %i1,32,%i1 ! extract high bits of mid product...
|
||||||
|
add %i5,%i1,%i1 ! ...and add them to the high result
|
||||||
|
addcc %i0,%o0,%i0 ! add cy_limb to low 64 bits of result
|
||||||
|
mov 0,%g5
|
||||||
|
movcs %xcc,1,%g5
|
||||||
|
add %o7,1,%o7
|
||||||
|
ldx [%o4+%g1],%l1
|
||||||
|
subcc %l1,%i0,%i0
|
||||||
|
movcs %xcc,1,%g5
|
||||||
|
stx %i0,[%o4+%g1]
|
||||||
|
brnz %o7,.Loop
|
||||||
|
add %i1,%g5,%o0 ! compute new cy_limb
|
||||||
|
|
||||||
|
mov %o0,%i0
|
||||||
|
ret
|
||||||
|
restore
|
||||||
|
.LLfe1:
|
||||||
|
.size __mpn_submul_1,.LLfe1-__mpn_submul_1
|
@ -1,7 +1,7 @@
|
|||||||
! SPARC v8 __mpn_addmul_1 -- Multiply a limb vector with a limb and
|
! SPARC v8 __mpn_addmul_1 -- Multiply a limb vector with a limb and
|
||||||
! add the result to a second limb vector.
|
! add the result to a second limb vector.
|
||||||
|
|
||||||
! Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
|
! Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
|
||||||
|
|
||||||
! This file is part of the GNU MP Library.
|
! This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
! SPARC v8 __mpn_mul_1 -- Multiply a limb vector with a single limb and
|
! SPARC v8 __mpn_mul_1 -- Multiply a limb vector with a single limb and
|
||||||
! store the product in a second limb vector.
|
! store the product in a second limb vector.
|
||||||
|
|
||||||
! Copyright (C) 1992, 1994 Free Software Foundation, Inc.
|
! Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
|
||||||
|
|
||||||
! This file is part of the GNU MP Library.
|
! This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
! sparc __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and
|
! SPARC __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and
|
||||||
! store difference in a third limb vector.
|
! store difference in a third limb vector.
|
||||||
|
|
||||||
! Copyright (C) 1995 Free Software Foundation, Inc.
|
! Copyright (C) 1995, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
! This file is part of the GNU MP Library.
|
! This file is part of the GNU MP Library.
|
||||||
|
|
||||||
@ -38,7 +38,7 @@ C_SYMBOL_NAME(__mpn_sub_n):
|
|||||||
nop
|
nop
|
||||||
! ** V1a **
|
! ** V1a **
|
||||||
andcc res_ptr,4,%g0 ! res_ptr unaligned? Side effect: cy=0
|
andcc res_ptr,4,%g0 ! res_ptr unaligned? Side effect: cy=0
|
||||||
beq L_v1 ! if no, branch
|
be L_v1 ! if no, branch
|
||||||
nop
|
nop
|
||||||
/* Add least significant limb separately to align res_ptr and s2_ptr */
|
/* Add least significant limb separately to align res_ptr and s2_ptr */
|
||||||
ld [s1_ptr],%g4
|
ld [s1_ptr],%g4
|
||||||
@ -133,9 +133,9 @@ L1: xor s1_ptr,res_ptr,%g1
|
|||||||
nop
|
nop
|
||||||
! ** V1b **
|
! ** V1b **
|
||||||
andcc res_ptr,4,%g0 ! res_ptr unaligned? Side effect: cy=0
|
andcc res_ptr,4,%g0 ! res_ptr unaligned? Side effect: cy=0
|
||||||
beq L_v1b ! if no, branch
|
be L_v1b ! if no, branch
|
||||||
nop
|
nop
|
||||||
/* Add least significant limb separately to align res_ptr and s2_ptr */
|
/* Add least significant limb separately to align res_ptr and s1_ptr */
|
||||||
ld [s2_ptr],%g4
|
ld [s2_ptr],%g4
|
||||||
add s2_ptr,4,s2_ptr
|
add s2_ptr,4,s2_ptr
|
||||||
ld [s1_ptr],%g2
|
ld [s1_ptr],%g2
|
||||||
@ -232,7 +232,7 @@ L2: cmp size,1
|
|||||||
be Ljone
|
be Ljone
|
||||||
nop
|
nop
|
||||||
andcc s1_ptr,4,%g0 ! s1_ptr unaligned? Side effect: cy=0
|
andcc s1_ptr,4,%g0 ! s1_ptr unaligned? Side effect: cy=0
|
||||||
beq L_v2 ! if no, branch
|
be L_v2 ! if no, branch
|
||||||
nop
|
nop
|
||||||
/* Add least significant limb separately to align s1_ptr and s2_ptr */
|
/* Add least significant limb separately to align s1_ptr and s2_ptr */
|
||||||
ld [s1_ptr],%g4
|
ld [s1_ptr],%g4
|
||||||
|
24
sysdeps/unix/sysv/linux/m68k/profil-counter.h
Normal file
24
sysdeps/unix/sysv/linux/m68k/profil-counter.h
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/* Machine-dependent SIGPROF signal handler. Linux/m68k version.
|
||||||
|
Copyright (C) 1996 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., 675 Mass Ave,
|
||||||
|
Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
profil_counter (int signr, int code, struct sigcontext *scp)
|
||||||
|
{
|
||||||
|
profil_count ((void *) scp->sc_pc);
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
/* gmp-mparam.h -- Compiler/machine parameter header file.
|
/* gmp-mparam.h -- Compiler/machine parameter header file.
|
||||||
|
|
||||||
Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc.
|
Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU MP Library.
|
This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
! Z8000 __mpn_mul_1 -- Multiply a limb vector with a limb and store
|
! Z8000 __mpn_mul_1 -- Multiply a limb vector with a limb and store
|
||||||
! the result in a second limb vector.
|
! the result in a second limb vector.
|
||||||
|
|
||||||
! Copyright (C) 1993, 1994 Free Software Foundation, Inc.
|
! Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
|
||||||
|
|
||||||
! This file is part of the GNU MP Library.
|
! This file is part of the GNU MP Library.
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user