diff --git a/ChangeLog b/ChangeLog index 905355d..d6272fc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2000-07-22 Richard Kreckel + + * src/float/base/cl_ieee.cc: try to do magic to the FPU only if + _FPU_IEEE is really defined. + * include/cln/modules.h: change assembler labels from `label' to + `label:' on hppa, needed by Linux (see comment). + * autoconf/acinclude.m4: new file (for storing CLN-specific macros). + * Makefile.devel: adjusted. + * autoconf/aclocal.m4: regenerate. + * src/base/low/cl_low_mul.cc: moved POD variables that are declared + extern "C" elsewhere out of the namespace. + * src/base/low/cl_low_div.cc: Likewise. + 2000-06-08 Bruno Haible * autoconf/config.{guess,sub}: Update to GNU version 2001-05-11. diff --git a/Makefile.devel b/Makefile.devel index 966be0d..5939efa 100644 --- a/Makefile.devel +++ b/Makefile.devel @@ -26,15 +26,12 @@ configures : $(CONFIGURES) configure : configure.in $(AUTOCONF_FILES) ./autoconf/autoconf -m autoconf -# # ACLOCAL = /home/bruno/clisp/src/autoconf/aclocal.m4 -# # ACSELECT = /home/bruno/clisp/src/autoconf/acselect -# # OTHERMACROS = /home/bruno/clisp/src/autoconf/libtool.m4 -# ACLOCAL = /home/kreckel/contrib/src/clisp/src/autoconf/aclocal.m4 -# ACSELECT = /home/kreckel/contrib/src/clisp/src/autoconf/acselect -# OTHERMACROS = /home/kreckel/contrib/src/clisp/src/autoconf/libtool.m4 -# -# autoconf/aclocal.m4 : $(ACLOCAL) -# ($(ACSELECT) `cat $(CONFIGURES_IN) | grep '^[A-Z][A-Z]_' | sed 's,[^A-Z_].*$$,,g' | sort | uniq` < $(ACLOCAL) ; cat $(OTHERMACROS) | sed -e 's,AC_CANONICAL_HOST,CL_CANONICAL_HOST,g' -e 's,AC_PROG_RANLIB,CL_PROG_RANLIB,g') > autoconf/aclocal.m4 +CLISP_ACLOCAL = /home/kreckel/contrib/src/clisp/src/autoconf/aclocal.m4 +ACSELECT = /home/kreckel/contrib/src/clisp/src/autoconf/acselect +LIBTOOLMACROS = /home/kreckel/contrib/libtool/libtool.m4 + +autoconf/aclocal.m4 : $(CLISP_ACLOCAL) + ($(ACSELECT) `cat $(CONFIGURES_IN) | grep '^[A-Z][A-Z]_' | sed 's,[^A-Z_].*$$,,g' | sort | uniq` < $(CLISP_ACLOCAL) ; cat $(LIBTOOLMACROS) | sed -e 's,AC_CANONICAL_HOST,CL_CANONICAL_HOST,g' -e 's,AC_PROG_RANLIB,CL_PROG_RANLIB,g'; cat autoconf/acinclude.m4) > autoconf/aclocal.m4 # Syntaxcheck check-configures : $(CONFIGURES) diff --git a/autoconf/acinclude.m4 b/autoconf/acinclude.m4 new file mode 100644 index 0000000..d4d6c68 --- /dev/null +++ b/autoconf/acinclude.m4 @@ -0,0 +1,41 @@ +# Is the gmp header file new enough? (should be implemented with an argument) +AC_DEFUN(CL_GMP_H_VERSION, +[AC_CACHE_CHECK([for recent enough gmp.h], cl_cv_new_gmp_h, [ + AC_TRY_CPP([#include +#if !defined(__GNU_MP_VERSION) || (__GNU_MP_VERSION < 3) + #error "ancient gmp.h" +#endif], +cl_cv_new_gmp_h="yes", cl_cv_new_gmp_h="no") +])])dnl + +# Does libgmp provide some functionality introduced in version 3.0? +AC_DEFUN(CL_GMP_CHECK, +[AC_CACHE_CHECK([for working libgmp], cl_cv_new_libgmp, [ + SAVELIBS=$LIBS + LIBS="$LIBS -lgmp" + AC_TRY_LINK([#include ],[mpn_divexact_by3(0,0,0)], +cl_cv_new_libgmp="yes", cl_cv_new_libgmp="no"; LIBS=$SAVELIBS) +])]) + +# What is sizeof(mp_limb_t)? (It has to match sizeof(uintD) later.) +AC_DEFUN(CL_GMP_SET_UINTD, +[AC_CACHE_CHECK([how large gmp demands uintD to be], cl_cv_gmp_set_uintd, [ + AC_TRY_RUN([#include +#include +int main() { + FILE *f=fopen("conftestval", "w"); + if (!f) return(1); + if (sizeof(mp_limb_t) > sizeof(long)) + fprintf(f, "long long"); + else if (sizeof(mp_limb_t) == sizeof(long)) + fprintf(f, "long"); + else if (sizeof(mp_limb_t) == sizeof(int)) + fprintf(f, "int"); + else return(1); + return(0); +}], cl_cv_gmp_set_uintd=`cat conftestval`; \ + cl_gmp_demands="GMP_DEMANDS_UINTD_`echo ${cl_cv_gmp_set_uintd} | sed -e 'y/ gilnot/_GILNOT/'`"; + AC_DEFINE_UNQUOTED($cl_gmp_demands), + AC_MSG_ERROR([CLN can't handle the result]),dnl + AC_MSG_ERROR([cross-compiling - cannot determine])) +])]) diff --git a/autoconf/aclocal.m4 b/autoconf/aclocal.m4 index 672c1a8..3210f9a 100644 --- a/autoconf/aclocal.m4 +++ b/autoconf/aclocal.m4 @@ -1,8 +1,8 @@ dnl local autoconf macros -dnl Bruno Haible 21.9.1997 -dnl Marcus Daniels 10.4.1997 +dnl Bruno Haible 2001-02-04 +dnl Marcus Daniels 1997-04-10 dnl -AC_PREREQ(2.13)dnl +AC_PREREQ(2.12)dnl dnl dnl without AC_MSG_...: with AC_MSG_... and caching: dnl AC_TRY_CPP CL_CPP_CHECK @@ -207,13 +207,13 @@ AC_DEFUN(CL_CANONICAL_HOST, [AC_REQUIRE([AC_PROG_CC]) dnl Actually: AC_REQUIRE([CL_CC_WORKS]) dnl Set ac_aux_dir before the cache check, because AM_PROG_LIBTOOL needs it. ac_aux_dir=${srcdir}/$1 -AC_CACHE_CHECK(host system type, cl_cv_host, [ dnl A substitute for AC_CONFIG_AUX_DIR_DEFAULT, so we don't need install.sh. ac_config_guess=$ac_aux_dir/config.guess ac_config_sub=$ac_aux_dir/config.sub +AC_CACHE_CHECK(host system type, cl_cv_host, [ dnl Mostly copied from AC_CANONICAL_HOST. # Make sure we can run config.sub. -if $ac_config_sub sun4 >/dev/null 2>&1; then : +if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then : else AC_MSG_ERROR(can not run $ac_config_sub) fi host_alias=$host @@ -221,18 +221,21 @@ case "$host_alias" in NONE) case $nonopt in NONE) dnl config.guess needs to compile things - host_alias=`export CC; $ac_config_guess` ;; + host_alias=`export CC; ${CONFIG_SHELL-/bin/sh} $ac_config_guess` ;; *) host_alias=$nonopt ;; esac ;; esac # Don't fail just because the system is not listed in GNU's database. if test -n "$host_alias"; then - host=`$ac_config_sub $host_alias` + host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias` else + host_alias=unknown host=unknown-unknown-unknown fi +cl_cv_host_alias="$host_alias" cl_cv_host="$host" ]) +host_alias="$cl_cv_host_alias" host="$cl_cv_host" changequote(,)dnl host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` @@ -243,6 +246,10 @@ AC_SUBST(host)dnl AC_SUBST(host_cpu)dnl AC_SUBST(host_vendor)dnl AC_SUBST(host_os)dnl +dnl We have defined $ac_aux_dir. +AC_PROVIDE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +dnl We have defined $host_alias and $host. +AC_PROVIDE([AC_CANONICAL_HOST])dnl ])dnl dnl AC_DEFUN(CL_CANONICAL_HOST_CPU, @@ -649,7 +656,14 @@ cat > conftest.$ac_ext <> conftest.$ac_ext +ORIGCC="$CC" +if test $ac_cv_prog_gcc = yes; then +# gcc -O (gcc version <= 2.3.2) crashes when compiling long long shifts for +# target 80386. Strip "-O". +CC=`echo "$CC " | sed -e 's/-O //g'` +fi AC_TRY_EVAL(ac_link) +CC="$ORIGCC" if test -s conftest; then echo "creating $cl_machine_file_h" ./conftest > conftest.h @@ -671,50 +685,6 @@ echo "cross-compiling - cannot create $cl_machine_file_h" fi ])dnl dnl - -# Is the gmp header file new enough? (should be implemented with an argument) -AC_DEFUN(CL_GMP_H_VERSION, -[AC_CACHE_CHECK([for recent enough gmp.h], cl_cv_new_gmp_h, [ - AC_TRY_CPP([#include -#if !defined(__GNU_MP_VERSION) || (__GNU_MP_VERSION < 3) - #error "ancient gmp.h" -#endif], -cl_cv_new_gmp_h="yes", cl_cv_new_gmp_h="no") -])])dnl - -# Does libgmp provide some functionality introduced in version 3.0? -AC_DEFUN(CL_GMP_CHECK, -[AC_CACHE_CHECK([for working libgmp], cl_cv_new_libgmp, [ - SAVELIBS=$LIBS - LIBS="$LIBS -lgmp" - AC_TRY_LINK([#include ],[mpn_divexact_by3(0,0,0)], -cl_cv_new_libgmp="yes", cl_cv_new_libgmp="no"; LIBS=$SAVELIBS) -])]) - -# What is sizeof(mp_limb_t)? (It has to match sizeof(uintD) later.) -AC_DEFUN(CL_GMP_SET_UINTD, -[AC_CACHE_CHECK([how large gmp demands uintD to be], cl_cv_gmp_set_uintd, [ - AC_TRY_RUN([#include -#include -int main() { - FILE *f=fopen("conftestval", "w"); - if (!f) return(1); - if (sizeof(mp_limb_t) > sizeof(long)) - fprintf(f, "long long"); - else if (sizeof(mp_limb_t) == sizeof(long)) - fprintf(f, "long"); - else if (sizeof(mp_limb_t) == sizeof(int)) - fprintf(f, "int"); - else return(1); - return(0); -}], cl_cv_gmp_set_uintd=`cat conftestval`; \ - cl_gmp_demands="GMP_DEMANDS_UINTD_`echo ${cl_cv_gmp_set_uintd} | sed -e 'y/ gilnot/_GILNOT/'`"; - AC_DEFINE_UNQUOTED($cl_gmp_demands), - AC_MSG_ERROR([CLN can't handle the result]),dnl - AC_MSG_ERROR([cross-compiling - cannot determine])) -])]) - -# ============================================================================= # libtool.m4 - Configure libtool for the host system. -*-Shell-script-*- ## Copyright 1996, 1997, 1998, 1999, 2000, 2001 ## Free Software Foundation, Inc. @@ -739,9 +709,6 @@ int main() { ## configuration script generated by Autoconf, you may include it under ## the same distribution terms that you use for the rest of that program. -# The next line was added by Bruno Haible 2001-06-08. -undefine([symbols]) - # serial 46 AC_PROG_LIBTOOL AC_DEFUN([AC_PROG_LIBTOOL], [AC_REQUIRE([AC_LIBTOOL_SETUP])dnl @@ -762,7 +729,7 @@ AC_DEFUN([AC_LIBTOOL_SETUP], AC_REQUIRE([AC_ENABLE_SHARED])dnl AC_REQUIRE([AC_ENABLE_STATIC])dnl AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([CL_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_LD])dnl @@ -877,7 +844,7 @@ AC_DEFUN(_LT_AC_CHECK_DLFCN, # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE # --------------------------------- AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], -[AC_REQUIRE([AC_CANONICAL_HOST]) +[AC_REQUIRE([CL_CANONICAL_HOST]) AC_REQUIRE([AC_PROG_NM]) AC_REQUIRE([AC_OBJEXT]) # Check for command to grab the raw symbol name followed by C symbol from nm. @@ -3735,7 +3702,7 @@ AC_DEFUN([AC_PROG_LD], [ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([CL_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl ac_prog=ld if test "$GCC" = yes; then @@ -4035,7 +4002,7 @@ AC_MSG_RESULT([$NM]) # AC_CHECK_LIBM - check for math library AC_DEFUN([AC_CHECK_LIBM], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl +[AC_REQUIRE([CL_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cygwin* | *-*-pw32*) @@ -4115,3 +4082,44 @@ AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) # This is just to silence aclocal about the macro not being used ifelse([AC_DISABLE_FAST_INSTALL]) +# Is the gmp header file new enough? (should be implemented with an argument) +AC_DEFUN(CL_GMP_H_VERSION, +[AC_CACHE_CHECK([for recent enough gmp.h], cl_cv_new_gmp_h, [ + AC_TRY_CPP([#include +#if !defined(__GNU_MP_VERSION) || (__GNU_MP_VERSION < 3) + #error "ancient gmp.h" +#endif], +cl_cv_new_gmp_h="yes", cl_cv_new_gmp_h="no") +])])dnl + +# Does libgmp provide some functionality introduced in version 3.0? +AC_DEFUN(CL_GMP_CHECK, +[AC_CACHE_CHECK([for working libgmp], cl_cv_new_libgmp, [ + SAVELIBS=$LIBS + LIBS="$LIBS -lgmp" + AC_TRY_LINK([#include ],[mpn_divexact_by3(0,0,0)], +cl_cv_new_libgmp="yes", cl_cv_new_libgmp="no"; LIBS=$SAVELIBS) +])]) + +# What is sizeof(mp_limb_t)? (It has to match sizeof(uintD) later.) +AC_DEFUN(CL_GMP_SET_UINTD, +[AC_CACHE_CHECK([how large gmp demands uintD to be], cl_cv_gmp_set_uintd, [ + AC_TRY_RUN([#include +#include +int main() { + FILE *f=fopen("conftestval", "w"); + if (!f) return(1); + if (sizeof(mp_limb_t) > sizeof(long)) + fprintf(f, "long long"); + else if (sizeof(mp_limb_t) == sizeof(long)) + fprintf(f, "long"); + else if (sizeof(mp_limb_t) == sizeof(int)) + fprintf(f, "int"); + else return(1); + return(0); +}], cl_cv_gmp_set_uintd=`cat conftestval`; \ + cl_gmp_demands="GMP_DEMANDS_UINTD_`echo ${cl_cv_gmp_set_uintd} | sed -e 'y/ gilnot/_GILNOT/'`"; + AC_DEFINE_UNQUOTED($cl_gmp_demands), + AC_MSG_ERROR([CLN can't handle the result]),dnl + AC_MSG_ERROR([cross-compiling - cannot determine])) +])]) diff --git a/include/cln/modules.h b/include/cln/modules.h index 33bce47..314df9c 100644 --- a/include/cln/modules.h +++ b/include/cln/modules.h @@ -97,7 +97,11 @@ // Output a label inside a function. // See macro ASM_OUTPUT_LABEL in the gcc sources. #if defined(__hppa__) - #define CL_OUTPUT_LABEL(label) ASM_VOLATILE ("\n" label) + // Some hppa (Linux) systems want `label:', HPUX used to use just `label'. + // I tried to find out, but was unable to find the assembler on my HPUX-11 + // boxen so decided to potentially ditch the support (no joke). Please + // send an email if you can explain to me what's going on! (-rbk. 07/2001) + #define CL_OUTPUT_LABEL(label) ASM_VOLATILE ("\n" label ":") #else #define CL_OUTPUT_LABEL(label) ASM_VOLATILE ("\n" label ":") #endif diff --git a/src/base/low/cl_low_div.cc b/src/base/low/cl_low_div.cc index c8e3366..174cb55 100644 --- a/src/base/low/cl_low_div.cc +++ b/src/base/low/cl_low_div.cc @@ -9,14 +9,13 @@ // Implementation. -namespace cln { - #ifdef NEED_VAR_divu_16_rest uint16 divu_16_rest; #endif #ifdef NEED_FUNCTION_divu_3216_1616_ uint16 divu_16_rest; +namespace cln { #if 1 // Most processors have a good 32 by 32 bit division, use that. uint16 divu_3216_1616_ (uint32 x, uint16 y) @@ -85,9 +84,11 @@ uint16 divu_3216_1616_ (uint32 x, uint16 y) // This algorithm is implemented in cl_asm_arm.cc and (in slightly modified // form) in cl_asm_sparc.cc. #endif +} // namespace cln #endif #ifdef NEED_FUNCTION_divu_3232_3232_ +namespace cln { // Dies dient nur noch als Hilfsfunktion für floorD(). // Die Rückgabe des Restes in divu_32_rest ist also hier nicht nötig. uint32 divu_3232_3232_(uint32 x, uint32 y) @@ -96,6 +97,7 @@ uint32 divu_3232_3232_(uint32 x, uint32 y) divu_3232_3232(x,y,q=,); return q; } +} // namespace cln #endif #ifdef NEED_VAR_divu_32_rest @@ -104,6 +106,7 @@ uint32 divu_32_rest; #ifdef NEED_FUNCTION_divu_6432_3232_ uint32 divu_32_rest; +namespace cln { uint32 divu_6432_3232_(uint32 xhi, uint32 xlo, uint32 y) // Methode: // Wie UDS_divide mit intDsize=16, a_len=4, b_len=2. @@ -200,6 +203,7 @@ uint32 divu_6432_3232_(uint32 xhi, uint32 xlo, uint32 y) divu_32_rest = r >> s; // Rest return highlow32(q1,q0); // Quotient } } } +} // namespace cln #endif #ifdef NEED_VAR_divu_64_rest @@ -208,6 +212,7 @@ uint64 divu_64_rest; #ifdef NEED_FUNCTION_divu_12864_6464_ uint64 divu_64_rest; +namespace cln { uint64 divu_12864_6464_(uint64 xhi, uint64 xlo, uint64 y) // Methode: // Wie UDS_divide mit intDsize=32, a_len=4, b_len=2. @@ -304,6 +309,6 @@ uint64 divu_12864_6464_(uint64 xhi, uint64 xlo, uint64 y) divu_64_rest = r >> s; // Rest return highlow64(q1,q0); // Quotient } } } +} // namespace cln #endif -} // namespace cln diff --git a/src/base/low/cl_low_mul.cc b/src/base/low/cl_low_mul.cc index 719a396..2807f12 100644 --- a/src/base/low/cl_low_mul.cc +++ b/src/base/low/cl_low_mul.cc @@ -9,14 +9,13 @@ // Implementation. -namespace cln { - #ifdef NEED_VAR_mulu32_high uint32 mulu32_high; #endif #ifdef NEED_FUNCTION_mulu32_ uint32 mulu32_high; +namespace cln { uint32 mulu32_ (uint32 x, uint32 y) { var uint16 x1 = high16(x); @@ -35,23 +34,29 @@ uint32 mulu32_ (uint32 x, uint32 y) } mulu32_high = hi; return lo; } +} // namespace cln #endif #ifdef NEED_FUNCTION_mulu32_w +namespace cln { uint64 mulu32_w (uint32 arg1, uint32 arg2) { var uint32 lo = mulu32_(arg1,arg2); var uint32 hi = mulu32_high; return highlow64(hi,lo); } +} // namespace cln #endif + #ifdef NEED_VAR_mulu64_high uint64 mulu64_high; #endif #ifdef NEED_FUNCTION_mulu64_ uint64 mulu64_high; +namespace cln { +extern "C" uint64 mulu64_ (uint64 x, uint64 y); uint64 mulu64_ (uint64 x, uint64 y) { var uint32 x1 = high32(x); @@ -70,6 +75,6 @@ uint64 mulu64_ (uint64 x, uint64 y) } mulu64_high = hi; return lo; } +} // namespace cln #endif -} // namespace cln diff --git a/src/float/base/cl_ieee.cc b/src/float/base/cl_ieee.cc index 5c77350..73b6105 100644 --- a/src/float/base/cl_ieee.cc +++ b/src/float/base/cl_ieee.cc @@ -17,13 +17,13 @@ CL_PROVIDE(cl_ieee) #if (defined(linux) || defined(__linux)) && (defined(FAST_FLOAT) || defined(FAST_DOUBLE)) -// Damit Division durch 0.0 ein NaN und kein SIGFPE liefert: -// Entweder mit -lieee linken, -// oder libc-linux/sysdeps/linux/{i386,m68k}/ieee.c kopieren: +// Division by 0.0 should return NaN and not raise an SIGFPE. +// For this, we either have to link with -lieee or copy some +// part from libc-linux/sysdeps/linux/{i386,m68k}/ieee.c: #include -#if 0 // Leider gibt das einen Error, wenn man zusätzlich mit -lieee linkt. +#if 0 // Unfortunately this gives an error if also linked with -lieee #if defined(HAVE_FPU_CONTROL_T) fpu_control_t __fpu_control = _FPU_IEEE; #else @@ -32,14 +32,19 @@ CL_PROVIDE(cl_ieee) #else AT_INITIALIZATION(ieee) { - #if defined(HAVE_FPU_CONTROL_T) - extern fpu_control_t __fpu_control; - __fpu_control = _FPU_IEEE; - #elif defined(HAVE_SETFPUCW) - __setfpucw(_FPU_IEEE); + #if defined(_FPU_IEEE) + #if defined(HAVE_FPU_CONTROL_T) + extern fpu_control_t __fpu_control; + __fpu_control = _FPU_IEEE; + #elif defined(HAVE_SETFPUCW) + __setfpucw(_FPU_IEEE); + #else + extern unsigned short __fpu_control; + __fpu_control = _FPU_IEEE; + #endif #else - extern unsigned short __fpu_control; - __fpu_control = _FPU_IEEE; + // Nothing to do (as on some architectures): + // probably this means that _FPU_DEFAULT is just as good as _FPU_IEEE. #endif } #endif