Home | History | Annotate | Line # | Download | only in include
ieeefp.h revision 1.4.38.1
      1  1.4.38.1  jdolecek /* $NetBSD: ieeefp.h,v 1.4.38.1 2017/12/03 11:36:42 jdolecek Exp $ */
      2       1.1    itojun 
      3       1.1    itojun /*
      4       1.1    itojun  * Written by J.T. Conklin, Apr 6, 1995
      5       1.1    itojun  * Public domain.
      6       1.1    itojun  */
      7       1.1    itojun 
      8       1.1    itojun #ifndef _SH3_IEEEFP_H_
      9       1.3       uch #define	_SH3_IEEEFP_H_
     10       1.1    itojun 
     11       1.4      matt #include <sys/featuretest.h>
     12       1.4      matt 
     13       1.4      matt #if defined(_NETBSD_SOURCE) || defined(_ISOC99_SOURCE)
     14       1.4      matt 
     15  1.4.38.1  jdolecek #include <fenv.h>
     16       1.4      matt 
     17       1.4      matt #if defined(_NETBSD_SOURCE)
     18       1.4      matt 
     19       1.1    itojun typedef int fp_except;
     20  1.4.38.1  jdolecek 
     21  1.4.38.1  jdolecek #ifdef	__SH_FPU_ANY__
     22  1.4.38.1  jdolecek 
     23  1.4.38.1  jdolecek /* hardfloat */
     24  1.4.38.1  jdolecek 
     25       1.4      matt #define	FP_X_INV	FE_INVALID	/* invalid operation exception */
     26       1.4      matt #define	FP_X_DZ		FE_DIVBYZERO	/* divide-by-zero exception */
     27       1.4      matt #define	FP_X_OFL	FE_OVERFLOW	/* overflow exception */
     28       1.4      matt #define	FP_X_UFL	FE_UNDERFLOW	/* underflow exception */
     29       1.4      matt #define	FP_X_IMP	FE_INEXACT	/* imprecise (loss of precision) */
     30       1.1    itojun 
     31       1.1    itojun typedef enum {
     32       1.4      matt 	FP_RN=FE_TONEAREST,	/* round to nearest representable number */
     33  1.4.38.1  jdolecek 	FP_RM=FE_DOWNWARD,      /* round toward negative infinity */
     34  1.4.38.1  jdolecek 	FP_RP=FE_UPWARD,        /* round toward positive infinity */
     35       1.4      matt 	FP_RZ=FE_TOWARDZERO	/* round to zero (truncate) */
     36       1.1    itojun } fp_rnd;
     37       1.1    itojun 
     38  1.4.38.1  jdolecek #else /* __SH_FPU_ANY__ */
     39  1.4.38.1  jdolecek 
     40  1.4.38.1  jdolecek /* softfloat */
     41  1.4.38.1  jdolecek 
     42  1.4.38.1  jdolecek #define	FP_X_INV	0x01	/* invalid operation exception */
     43  1.4.38.1  jdolecek #define	FP_X_DZ		0x04	/* divide-by-zero exception */
     44  1.4.38.1  jdolecek #define	FP_X_OFL	0x08	/* overflow exception */
     45  1.4.38.1  jdolecek #define	FP_X_UFL	0x10	/* underflow exception */
     46  1.4.38.1  jdolecek #define	FP_X_IMP	0x20	/* imprecise (loss of precision) */
     47  1.4.38.1  jdolecek 
     48  1.4.38.1  jdolecek typedef enum {
     49  1.4.38.1  jdolecek 	FP_RN=0,		/* round to nearest representable number */
     50  1.4.38.1  jdolecek 	FP_RM=1,		/* round toward negative infinity */
     51  1.4.38.1  jdolecek 	FP_RP=2,        	/* round toward positive infinity */
     52  1.4.38.1  jdolecek 	FP_RZ=3			/* round to zero (truncate) */
     53  1.4.38.1  jdolecek } fp_rnd;
     54  1.4.38.1  jdolecek 
     55  1.4.38.1  jdolecek /* adjust for FP_* and FE_* value differences */
     56  1.4.38.1  jdolecek 
     57  1.4.38.1  jdolecek static inline fp_except
     58  1.4.38.1  jdolecek __FPE(int __fe)
     59  1.4.38.1  jdolecek {
     60  1.4.38.1  jdolecek 	int __fp = 0;
     61  1.4.38.1  jdolecek 
     62  1.4.38.1  jdolecek 	if (__fe & FE_DIVBYZERO)
     63  1.4.38.1  jdolecek 		__fp |= FP_X_DZ;
     64  1.4.38.1  jdolecek 	if (__fe & FE_INEXACT)
     65  1.4.38.1  jdolecek 		__fp |= FP_X_IMP;
     66  1.4.38.1  jdolecek 	if (__fe & FE_INVALID)
     67  1.4.38.1  jdolecek 		__fp |= FP_X_INV;
     68  1.4.38.1  jdolecek 	if (__fe & FE_OVERFLOW)
     69  1.4.38.1  jdolecek 		__fp |= FP_X_OFL;
     70  1.4.38.1  jdolecek 	if (__fe & FE_UNDERFLOW)
     71  1.4.38.1  jdolecek 		__fp |= FP_X_UFL;
     72  1.4.38.1  jdolecek 	return __fp;
     73  1.4.38.1  jdolecek }
     74  1.4.38.1  jdolecek 
     75  1.4.38.1  jdolecek static inline int
     76  1.4.38.1  jdolecek __FEE(fp_except __fp)
     77  1.4.38.1  jdolecek {
     78  1.4.38.1  jdolecek 	int __fe = 0;
     79  1.4.38.1  jdolecek 
     80  1.4.38.1  jdolecek 	if (__fp & FP_X_DZ)
     81  1.4.38.1  jdolecek 		__fe |= FE_DIVBYZERO;
     82  1.4.38.1  jdolecek 	if (__fp & FP_X_IMP)
     83  1.4.38.1  jdolecek 		__fe |= FE_INEXACT;
     84  1.4.38.1  jdolecek 	if (__fp & FP_X_INV)
     85  1.4.38.1  jdolecek 		__fe |= FE_INVALID;
     86  1.4.38.1  jdolecek 	if (__fp & FP_X_OFL)
     87  1.4.38.1  jdolecek 		__fe |= FE_OVERFLOW;
     88  1.4.38.1  jdolecek 	if (__fp & FP_X_UFL)
     89  1.4.38.1  jdolecek 		__fe |= FE_UNDERFLOW;
     90  1.4.38.1  jdolecek 	return __fe;
     91  1.4.38.1  jdolecek }
     92  1.4.38.1  jdolecek 
     93  1.4.38.1  jdolecek static inline fp_rnd
     94  1.4.38.1  jdolecek __FPR(int __fe)
     95  1.4.38.1  jdolecek {
     96  1.4.38.1  jdolecek 
     97  1.4.38.1  jdolecek 	switch (__fe) {
     98  1.4.38.1  jdolecek 	case FE_TONEAREST:
     99  1.4.38.1  jdolecek 		return FP_RN;
    100  1.4.38.1  jdolecek 	case FE_DOWNWARD:
    101  1.4.38.1  jdolecek 		return FP_RM;
    102  1.4.38.1  jdolecek 	case FE_UPWARD:
    103  1.4.38.1  jdolecek 		return FP_RP;
    104  1.4.38.1  jdolecek 	case FE_TOWARDZERO:
    105  1.4.38.1  jdolecek 		return FP_RZ;
    106  1.4.38.1  jdolecek 	default:
    107  1.4.38.1  jdolecek 		return FP_RN;
    108  1.4.38.1  jdolecek 	}
    109  1.4.38.1  jdolecek }
    110  1.4.38.1  jdolecek 
    111  1.4.38.1  jdolecek static inline int
    112  1.4.38.1  jdolecek __FER(fp_rnd __fp)
    113  1.4.38.1  jdolecek {
    114  1.4.38.1  jdolecek 
    115  1.4.38.1  jdolecek 	switch (__fp) {
    116  1.4.38.1  jdolecek 	case FP_RN:
    117  1.4.38.1  jdolecek 		return FE_TONEAREST;
    118  1.4.38.1  jdolecek 	case FP_RM:
    119  1.4.38.1  jdolecek 		return FE_DOWNWARD;
    120  1.4.38.1  jdolecek 	case FP_RP:
    121  1.4.38.1  jdolecek 		return FE_UPWARD;
    122  1.4.38.1  jdolecek 	case FP_RZ:
    123  1.4.38.1  jdolecek 		return FE_TOWARDZERO;
    124  1.4.38.1  jdolecek 	default:
    125  1.4.38.1  jdolecek 		return FE_TONEAREST;
    126  1.4.38.1  jdolecek 	}
    127  1.4.38.1  jdolecek }
    128  1.4.38.1  jdolecek 
    129  1.4.38.1  jdolecek #endif /* __SH_FPU_ANY__ */
    130  1.4.38.1  jdolecek 
    131       1.4      matt #endif /* !_ISOC99_SOURCE */
    132       1.4      matt 
    133       1.4      matt #endif /* _NETBSD_SOURCE || _ISOC99_SOURCE */
    134       1.4      matt 
    135       1.2       uch #endif /* !_SH3_IEEEFP_H_ */
    136