[numeric_interval] patch for HP-UX/ia64

boost does not have rounding control header file for HP-UX/ia64 and, as a result, numeric_interval library tests fail on this platform with the following #error directive: "../boost/numeric/interval/hw_rounding.hpp", line 36: error #2035: #error directive: Boost.Numeric.Interval: Please specify rounding control mechanism. # error Boost.Numeric.Interval: Please specify rounding control mechanism. ^ I've created rounding control file and amended hw_rounding.hpp to include it when appropriate -- see below. With these changes, all numeric_interval library tests pass and the change does not cause any regression in boost build and tests. Can the patch for hw_rounding.hpp below and the new header file be committed to both the HEAD and the RC branch? (I don't have developer privileges in cvs) Thanks, Boris Index: hw_rounding.hpp =================================================================== RCS file: /cvsroot/boost/boost/boost/numeric/interval/hw_rounding.hpp,v retrieving revision 1.8 diff -r1.8 hw_rounding.hpp 27a28,29
#elif defined(ia64) || defined(__ia64) || defined(__ia64__) # include <boost/numeric/interval/detail/ia64_rounding_control.hpp>
boost/numeric/interval/detail/ia64_rounding_control.hpp ======================================================= /* Boost interval/detail/ia64_rounding_control.hpp file * * Copyright 2006 Boris Gubenko * * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or * copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef BOOST_NUMERIC_INTERVAL_DETAIL_IA64_ROUNDING_CONTROL_HPP #define BOOST_NUMERIC_INTERVAL_DETAIL_IA64_ROUNDING_CONTROL_HPP #if !defined(ia64) && !defined(__ia64) && !defined(__ia64__) #error This header only works on ia64 CPUs. #endif #if defined(__HP_aCC) namespace boost { namespace numeric { namespace interval_lib { namespace detail { # include <fenv.h> struct ia64_rounding_control { typedef unsigned int rounding_mode; static void set_rounding_mode(const rounding_mode& mode) { fesetround(mode); } static void get_rounding_mode(rounding_mode& mode) { mode = fegetround(); } static void downward() { set_rounding_mode(FE_DOWNWARD); } static void upward() { set_rounding_mode(FE_UPWARD); } static void to_nearest() { set_rounding_mode(FE_TONEAREST); } static void toward_zero() { set_rounding_mode(FE_TOWARDZERO); } }; } // namespace detail extern "C" { float rintf(float); double rint(double); long double rintl(long double); } template<> struct rounding_control<float>: detail::ia64_rounding_control { static float force_rounding(const float r) { volatile float _r = r; return _r; } static float to_int(const float& x) { return rintf(x); } }; template<> struct rounding_control<double>: detail::ia64_rounding_control { static const double & force_rounding(const double& r) { return r; } static double to_int(const double& r) { return rint(r); } }; template<> struct rounding_control<long double>: detail::ia64_rounding_control { static const long double & force_rounding(const long double& r) { return r; } static long double to_int(const long double& r) { return rintl(r); } }; } // namespace interval_lib } // namespace numeric } // namespace boost #undef BOOST_NUMERIC_INTERVAL_NO_HARDWARE #endif /* __HP_aCC */ #endif /* BOOST_NUMERIC_INTERVAL_DETAIL_IA64_ROUNDING_CONTROL_HPP */

Boris Gubenko wrote:
boost does not have rounding control header file for HP-UX/ia64 and, as a result, numeric_interval library tests fail on this platform with the following #error directive:
"../boost/numeric/interval/hw_rounding.hpp", line 36: error #2035: #error directive: Boost.Numeric.Interval: Please specify rounding control mechanism. # error Boost.Numeric.Interval: Please specify rounding control mechanism. ^
I've created rounding control file and amended hw_rounding.hpp to include it when appropriate -- see below. With these changes, all numeric_interval library tests pass and the change does not cause any regression in boost build and tests.
Can the patch for hw_rounding.hpp below and the new header file be committed to both the HEAD and the RC branch? (I don't have developer privileges in cvs)
Thanks, Boris
Will do but shouldn't the #include of <fenv.h> be outside the namespace declarations? John.
Index: hw_rounding.hpp =================================================================== RCS file: /cvsroot/boost/boost/boost/numeric/interval/hw_rounding.hpp,v retrieving revision 1.8 diff -r1.8 hw_rounding.hpp 27a28,29
#elif defined(ia64) || defined(__ia64) || defined(__ia64__) # include <boost/numeric/interval/detail/ia64_rounding_control.hpp>
boost/numeric/interval/detail/ia64_rounding_control.hpp ======================================================= /* Boost interval/detail/ia64_rounding_control.hpp file * * Copyright 2006 Boris Gubenko * * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or * copy at http://www.boost.org/LICENSE_1_0.txt) */
#ifndef BOOST_NUMERIC_INTERVAL_DETAIL_IA64_ROUNDING_CONTROL_HPP #define BOOST_NUMERIC_INTERVAL_DETAIL_IA64_ROUNDING_CONTROL_HPP
#if !defined(ia64) && !defined(__ia64) && !defined(__ia64__) #error This header only works on ia64 CPUs. #endif
#if defined(__HP_aCC)
namespace boost { namespace numeric { namespace interval_lib { namespace detail {
# include <fenv.h>
struct ia64_rounding_control { typedef unsigned int rounding_mode;
static void set_rounding_mode(const rounding_mode& mode) { fesetround(mode); } static void get_rounding_mode(rounding_mode& mode) { mode = fegetround(); }
static void downward() { set_rounding_mode(FE_DOWNWARD); } static void upward() { set_rounding_mode(FE_UPWARD); } static void to_nearest() { set_rounding_mode(FE_TONEAREST); } static void toward_zero() { set_rounding_mode(FE_TOWARDZERO); } };
} // namespace detail
extern "C" { float rintf(float); double rint(double); long double rintl(long double); }
template<> struct rounding_control<float>: detail::ia64_rounding_control { static float force_rounding(const float r) { volatile float _r = r; return _r; } static float to_int(const float& x) { return rintf(x); } };
template<> struct rounding_control<double>: detail::ia64_rounding_control { static const double & force_rounding(const double& r) { return r; } static double to_int(const double& r) { return rint(r); } };
template<> struct rounding_control<long double>: detail::ia64_rounding_control { static const long double & force_rounding(const long double& r) { return r; } static long double to_int(const long double& r) { return rintl(r); } };
} // namespace interval_lib } // namespace numeric } // namespace boost
#undef BOOST_NUMERIC_INTERVAL_NO_HARDWARE
#endif /* __HP_aCC */
#endif /* BOOST_NUMERIC_INTERVAL_DETAIL_IA64_ROUNDING_CONTROL_HPP */
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

John Maddock wrote:
Will do [...]
Thanks!
[...] but shouldn't the #include of <fenv.h> be outside the namespace declarations?
I asked myself the same question. I modeled ia64_rounding_control.hpp after alpha_rounding_control.hpp (for the obvious reason :-) which #include's <float.h> inside the namespace declarations. Since alpha_rounding_control.hpp handles both gcc and cxx and <float.h> is included only in cxx path, perhaps, it made sense in this case to structure the header the way it is structured. However, there is no reason for ia64_rounding_control.hpp to #include <fenv.h> inside the namespace declarations. To double check, I moved '#include of <fenv.h>' outside the namespace declarations, right after '#if defined(__HP_aCC)', ran numeric_interval library tests and they all passed. So, please, make this change before committing the header. Thanks for reviewing it! Boris ----- Original Message ----- From: "John Maddock" <john@johnmaddock.co.uk> To: <boost@lists.boost.org> Sent: Tuesday, October 24, 2006 12:07 PM Subject: Re: [boost] [numeric_interval] patch for HP-UX/ia64
Boris Gubenko wrote:
boost does not have rounding control header file for HP-UX/ia64 and, as a result, numeric_interval library tests fail on this platform with the following #error directive:
"../boost/numeric/interval/hw_rounding.hpp", line 36: error #2035: #error directive: Boost.Numeric.Interval: Please specify rounding control mechanism. # error Boost.Numeric.Interval: Please specify rounding control mechanism. ^
I've created rounding control file and amended hw_rounding.hpp to include it when appropriate -- see below. With these changes, all numeric_interval library tests pass and the change does not cause any regression in boost build and tests.
Can the patch for hw_rounding.hpp below and the new header file be committed to both the HEAD and the RC branch? (I don't have developer privileges in cvs)
Thanks, Boris
Will do but shouldn't the #include of <fenv.h> be outside the namespace declarations?
John.
Index: hw_rounding.hpp =================================================================== RCS file: /cvsroot/boost/boost/boost/numeric/interval/hw_rounding.hpp,v retrieving revision 1.8 diff -r1.8 hw_rounding.hpp 27a28,29
#elif defined(ia64) || defined(__ia64) || defined(__ia64__) # include <boost/numeric/interval/detail/ia64_rounding_control.hpp>
boost/numeric/interval/detail/ia64_rounding_control.hpp ======================================================= /* Boost interval/detail/ia64_rounding_control.hpp file * * Copyright 2006 Boris Gubenko * * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or * copy at http://www.boost.org/LICENSE_1_0.txt) */
#ifndef BOOST_NUMERIC_INTERVAL_DETAIL_IA64_ROUNDING_CONTROL_HPP #define BOOST_NUMERIC_INTERVAL_DETAIL_IA64_ROUNDING_CONTROL_HPP
#if !defined(ia64) && !defined(__ia64) && !defined(__ia64__) #error This header only works on ia64 CPUs. #endif
#if defined(__HP_aCC)
namespace boost { namespace numeric { namespace interval_lib { namespace detail {
# include <fenv.h>
struct ia64_rounding_control { typedef unsigned int rounding_mode;
static void set_rounding_mode(const rounding_mode& mode) { fesetround(mode); } static void get_rounding_mode(rounding_mode& mode) { mode = fegetround(); }
static void downward() { set_rounding_mode(FE_DOWNWARD); } static void upward() { set_rounding_mode(FE_UPWARD); } static void to_nearest() { set_rounding_mode(FE_TONEAREST); } static void toward_zero() { set_rounding_mode(FE_TOWARDZERO); } };
} // namespace detail
extern "C" { float rintf(float); double rint(double); long double rintl(long double); }
template<> struct rounding_control<float>: detail::ia64_rounding_control { static float force_rounding(const float r) { volatile float _r = r; return _r; } static float to_int(const float& x) { return rintf(x); } };
template<> struct rounding_control<double>: detail::ia64_rounding_control { static const double & force_rounding(const double& r) { return r; } static double to_int(const double& r) { return rint(r); } };
template<> struct rounding_control<long double>: detail::ia64_rounding_control { static const long double & force_rounding(const long double& r) { return r; } static long double to_int(const long double& r) { return rintl(r); } };
} // namespace interval_lib } // namespace numeric } // namespace boost
#undef BOOST_NUMERIC_INTERVAL_NO_HARDWARE
#endif /* __HP_aCC */
#endif /* BOOST_NUMERIC_INTERVAL_DETAIL_IA64_ROUNDING_CONTROL_HPP */
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Boris Gubenko wrote:
Since alpha_rounding_control.hpp handles both gcc and cxx and <float.h> is included only in cxx path, perhaps, it made sense in this case to structure the header the way it is structured.
I've attached a patch for alpha_rounding_control.hpp in case you think it would be a good idea to update this header also, to move '#include <float.h>' outside the namespace declarations. I ran numeric_interval tests on Tru64 with modified header and confirmed, that it does not cause any regression (not all numeric_interval tests succeed on Tru64, but this is another story). I also simplified the header a little bit: checking __digital__ macro is redundant: the Digital/Compaq/HP cxx compiler predefines both __DECCXX and __digital__ macro and I cannot think of a compiler other than cxx that would predefine this macro. Boris Index: alpha_rounding_control.hpp =================================================================== RCS file: /cvsroot/boost/boost/boost/numeric/interval/detail/alpha_rounding_control.hpp,v retrieving revision 1.3 diff -r1.3 alpha_rounding_control.hpp 17c17,21 < #if defined(__GNUC__) || defined(__digital__) || defined(__DECCXX) ---
#if defined(__DECCXX) #include <float.h> // write_rnd() and read_rnd() #endif
#if defined(__GNUC__) || defined(__DECCXX) 52c56 < #elif defined(__digital__) || defined(__DECCXX)
#elif defined(__DECCXX) 54c58 < #if defined(__DECCXX) && !(defined(__FLT_ROUNDS) && __FLT_ROUNDS == -1)
#if !(defined(__FLT_ROUNDS) && __FLT_ROUNDS == -1) 58,59d61 < # include <float.h> // write_rnd() and read_rnd() <
----- Original Message ----- From: "Boris Gubenko" <Boris.Gubenko@hp.com> To: <boost@lists.boost.org> Cc: "Boris Gubenko" <Boris.Gubenko@hp.com> Sent: Tuesday, October 24, 2006 12:36 PM Subject: Re: [boost] [numeric_interval] patch for HP-UX/ia64
John Maddock wrote:
Will do [...]
Thanks!
[...] but shouldn't the #include of <fenv.h> be outside the namespace declarations?
I asked myself the same question. I modeled ia64_rounding_control.hpp after alpha_rounding_control.hpp (for the obvious reason :-) which #include's <float.h> inside the namespace declarations.
Since alpha_rounding_control.hpp handles both gcc and cxx and <float.h> is included only in cxx path, perhaps, it made sense in this case to structure the header the way it is structured. However, there is no reason for ia64_rounding_control.hpp to #include <fenv.h> inside the namespace declarations.
To double check, I moved '#include of <fenv.h>' outside the namespace declarations, right after '#if defined(__HP_aCC)', ran numeric_interval library tests and they all passed. So, please, make this change before committing the header. Thanks for reviewing it!
Boris
participants (2)
-
Boris Gubenko
-
John Maddock