--- ieee-utils/fp-freebsd.c.old 2013-06-22 10:07:01.000000000 -0700 +++ ieee-utils/fp-freebsd.c 2013-06-22 18:43:24.000000000 -0700 @@ -24,23 +24,37 @@ int gsl_ieee_set_mode (int precision, int rounding, int exception_mask) { +#ifndef __ppc__ fp_prec_t prec = 0 ; +#endif fp_except_t mode = 0 ; fp_rnd_t rnd = 0 ; switch (precision) { case GSL_IEEE_SINGLE_PRECISION: +#ifdef __ppc__ + GSL_ERROR ("powerpc only supports default precision rounding", GSL_EUNSUP); +#else prec = FP_PS; fpsetprec(prec); +#endif break ; case GSL_IEEE_DOUBLE_PRECISION: +#ifdef __ppc__ + GSL_ERROR ("powerpc only supports default precision rounding", GSL_EUNSUP); +#else prec = FP_PD; fpsetprec(prec); +#endif break ; case GSL_IEEE_EXTENDED_PRECISION: +#ifdef __ppc__ + GSL_ERROR ("powerpc only supports default precision rounding", GSL_EUNSUP); +#else prec = FP_PE; fpsetprec(prec); +#endif break ; } @@ -69,13 +83,27 @@ /* Turn on all the exceptions apart from 'inexact' */ - mode = FP_X_INV | FP_X_DNML | FP_X_DZ | FP_X_OFL | FP_X_UFL ; + mode = FP_X_INV | FP_X_DZ | FP_X_OFL | FP_X_UFL ; +#ifndef __ppc__ + mode |= FP_X_DNML; +#endif if (exception_mask & GSL_IEEE_MASK_INVALID) mode &= ~ FP_X_INV ; if (exception_mask & GSL_IEEE_MASK_DENORMALIZED) +#ifdef __ppc__ + { + /* Do nothing */ + } + else + { + GSL_ERROR ("powerpc does not support the denormalized operand exception. " + "Use 'mask-denormalized' to work around this.", GSL_EUNSUP) ; + } +#else mode &= ~ FP_X_DNML ; +#endif if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO) mode &= ~ FP_X_DZ ; @@ -88,7 +116,11 @@ if (exception_mask & GSL_IEEE_TRAP_INEXACT) { +#ifdef __ppc__ + GSL_ERROR ("powerpc does not support traps for inexact operations", GSL_EUNSUP) ; +#else mode |= FP_X_IMP ; +#endif } else {