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