[m-rev.] for review: new runtime option for setting fp rounding mode
Paul Bone
pbone at csse.unimelb.edu.au
Mon Nov 3 13:39:22 AEDT 2008
On Tue, Oct 28, 2008 at 07:07:44PM +1100, Julien Fischer wrote:
> Index: runtime/mercury_conf.h.in
> ===================================================================
> RCS file:
> /home/mercury/mercury1/repository/mercury/runtime/mercury_conf.h.in,v
> retrieving revision 1.61
> diff -u -r1.61 mercury_conf.h.in
> --- runtime/mercury_conf.h.in 22 Jan 2008 02:36:37 -0000 1.61
> +++ runtime/mercury_conf.h.in 28 Oct 2008 06:56:42 -0000
> @@ -133,6 +133,7 @@
> ** MR_HAVE_PTHREAD_H we have <pthread.h>
> ** MR_HAVE_TIME_H we have <time.h>
> ** MR_HAVE_SPAWN_H we have <spawn.h>
> +** MR_HAVE_FENV_H we have <fenv.h>
> */
> #undef MR_HAVE_SYS_SIGINFO_H
> #undef MR_HAVE_SYS_SIGNAL_H
> @@ -159,6 +160,7 @@
> #undef MR_HAVE_PTHREAD_H
> #undef MR_HAVE_TIME_H
> #undef MR_HAVE_SPAWN_H
> +#undef MR_HAVE_FENV_H
The indenting looks different here. Should it use tabs rather than
spaces?
>
> /*
> ** MR_HAVE_POSIX_TIMES is defined if we have the POSIX
> @@ -256,6 +258,7 @@
> ** MR_HAVE_PUTENV we have the putenv() function.
> ** MR_HAVE__PUTENV we have the _putenv() function.
> ** MR_HAVE_POSIX_SPAWN we have the posix_spawn() function.
> +** MR_HAVE_FESETROUND we have the fesetround() function.
> */
> #undef MR_HAVE_GETPID
> #undef MR_HAVE_SETPGID
> @@ -316,6 +319,7 @@
> #undef MR_HAVE_PUTENV
> #undef MR_HAVE__PUTENV
> #undef MR_HAVE_POSIX_SPAWN
> +#undef MR_HAVE_FESETROUND
>
And here.
> Index: runtime/mercury_wrapper.c
> ===================================================================
> RCS file:
> /home/mercury/mercury1/repository/mercury/runtime/mercury_wrapper.c,v
> retrieving revision 1.193
> diff -u -r1.193 mercury_wrapper.c
> --- runtime/mercury_wrapper.c 16 Sep 2008 07:52:27 -0000 1.193
> +++ runtime/mercury_wrapper.c 28 Oct 2008 07:38:46 -0000
> @@ -1899,6 +1905,70 @@
> #endif
> break;
>
> + case MR_FP_ROUNDING_MODE:
> +#if defined(MR_HAVE_FENV_H) && defined(MR_HAVE_FESETROUND)
> + {
> + int rounding_mode;
> +
> + /*
> + ** Particular rounding modes are only supported if the
> + ** corresponding FE_* macro is defined. The four
> below are
> + ** the ones from C99. C99 says that these macros
> + ** should expand to a nonnegative value, so we use a
> negative value
> + ** to indicate that the selected rounding mode is not
> supported by
> + ** the system.
> + */
> + if (MR_streq(MR_optarg, "downward")) {
> + #if defined(FE_DOWNWARD)
> + rounding_mode = FE_DOWNWARD;
> + #else
> + rounding_mode = -1;
> + #endif
> + } else if (MR_streq(MR_optarg, "upward")) {
> + #if defined(FE_UPWARD)
> + rounding_mode = FE_UPWARD;
> + #else
> + rounding_mode = -1;
> + #endif
> + } else if (MR_streq(MR_optarg, "toward_zero")) {
> + #if defined(FE_TOWARDZERO)
> + rounding_mode = FE_TOWARDZERO;
> + #else
> + rounding_mode = -1;
> + #endif
> + } else if (MR_streq(MR_optarg, "to_nearest")) {
> + #if defined(FE_TONEAREST)
> + rounding_mode = FE_TONEAREST;
> + #else
> + rounding_mode = -1;
> + #endif
> + } else {
> + MR_usage();
> + }
> +
> + if (rounding_mode < 0) {
> + printf("Mercury runtime: the selected rounding
> mode is "
> + "not supported by this system.\n");
> + fflush(stdout);
Do you need to flush stdout before exiting anyway? doesn't the C
library handle this? or does our runtime system prevent the C library
from doing this.
Should these errors go to stderr instead?
> + exit(1);
> + } else {
> + if (fesetround(rounding_mode) != 0) {
> + printf("Mercury runtime: could not establish
> selected "
> + "rounding mode.\n");
> + fflush(stdout);
And here.
> + exit(1);
> + }
> + }
> + }
> +#else
> + printf("Mercury runtime: `--fp-rounding-mode' is specified
> "
> + "in MERCURY_OPTIONS\n");
> + printf("but the rounding mode cannot be changed on this
> platform.\n");
> + fflush(stdout);
And here.
Otherwise the patch is fine.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mercurylang.org/archives/reviews/attachments/20081103/37918a48/attachment.sig>
More information about the reviews
mailing list