]> www.ginac.de Git - cln.git/commitdiff
* src/float/base/cl_ieee.cc: try to do magic to the FPU only if
authorRichard Kreckel <kreckel@ginac.de>
Sun, 22 Jul 2001 12:54:54 +0000 (12:54 +0000)
committerRichard Kreckel <kreckel@ginac.de>
Sun, 22 Jul 2001 12:54:54 +0000 (12:54 +0000)
          _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.

ChangeLog
Makefile.devel
autoconf/acinclude.m4 [new file with mode: 0644]
autoconf/aclocal.m4
include/cln/modules.h
src/base/low/cl_low_div.cc
src/base/low/cl_low_mul.cc
src/float/base/cl_ieee.cc

index 905355dde748cd3a3cc34427e9411f42f3e0f3c1..d6272fcd779f824c9bcc61915cc912760889212a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2000-07-22  Richard Kreckel  <kreckel@ginac.de>
+
+        * 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  <haible@clisp.cons.org>
 
         * autoconf/config.{guess,sub}: Update to GNU version 2001-05-11.
index 966be0db07a7390c7f242fa26d7cd1c4126f0fcb..5939efa922dd551c1ee9115017779f5802d57c09 100644 (file)
@@ -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 (file)
index 0000000..d4d6c68
--- /dev/null
@@ -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 <gmp.h>
+#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 <gmp.h>],[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 <stdio.h>
+#include <gmp.h>
+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]))
+])])
index 672c1a8e1f65e4af1e2e18324dae506408855f1e..3210f9a30525bd7bf879652a0513aa8068c0c7c5 100644 (file)
@@ -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 <<EOF
 #include "confdefs.h"
 EOF
 cat "$cl_machine_file_c" >> 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 <gmp.h>
-#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 <gmp.h>],[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 <stdio.h>
-#include <gmp.h>
-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 <gmp.h>
+#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 <gmp.h>],[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 <stdio.h>
+#include <gmp.h>
+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]))
+])])
index 33bce47cb5902bf573bcae2b80668fdd353ebcd7..314df9c4474261b7319d551f57ae8a54263e1c15 100644 (file)
   // 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
index c8e3366356273a190eaf0f36fed6f292b210dbe8..174cb55c7598e169afe0b9560f630f5832a0dbc9 100644 (file)
@@ -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
index 719a3961bac3783c5c613df1ad7d1512d44381c6..2807f12af775321ad889ae935a7da0f45d11d515 100644 (file)
@@ -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
index 5c77350843b326f5612738e3af7374fa3101d916..73b61055164723c10144000755c1b43d75699cd9 100644 (file)
@@ -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 <fpu_control.h>
 
-#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