#ifndef _SH3_IEEEFP_H_
#define _SH3_IEEEFP_H_
#include <sys/featuretest.h>
#if defined(_NETBSD_SOURCE) || defined(_ISOC99_SOURCE)
#include <fenv.h>
#if defined(_NETBSD_SOURCE)
typedef int fp_except;
#ifdef __SH_FPU_ANY__
#define FP_X_INV FE_INVALID
#define FP_X_DZ FE_DIVBYZERO
#define FP_X_OFL FE_OVERFLOW
#define FP_X_UFL FE_UNDERFLOW
#define FP_X_IMP FE_INEXACT
typedef enum {
FP_RN=FE_TONEAREST,
FP_RM=FE_DOWNWARD,
FP_RP=FE_UPWARD,
FP_RZ=FE_TOWARDZERO
} fp_rnd;
#else
#define FP_X_INV 0x01
#define FP_X_DZ 0x04
#define FP_X_OFL 0x08
#define FP_X_UFL 0x10
#define FP_X_IMP 0x20
typedef enum {
FP_RN=0,
FP_RM=1,
FP_RP=2,
FP_RZ=3
} fp_rnd;
static inline fp_except
__FPE(int __fe)
{
int __fp = 0;
if (__fe & FE_DIVBYZERO)
__fp |= FP_X_DZ;
if (__fe & FE_INEXACT)
__fp |= FP_X_IMP;
if (__fe & FE_INVALID)
__fp |= FP_X_INV;
if (__fe & FE_OVERFLOW)
__fp |= FP_X_OFL;
if (__fe & FE_UNDERFLOW)
__fp |= FP_X_UFL;
return __fp;
}
static inline int
__FEE(fp_except __fp)
{
int __fe = 0;
if (__fp & FP_X_DZ)
__fe |= FE_DIVBYZERO;
if (__fp & FP_X_IMP)
__fe |= FE_INEXACT;
if (__fp & FP_X_INV)
__fe |= FE_INVALID;
if (__fp & FP_X_OFL)
__fe |= FE_OVERFLOW;
if (__fp & FP_X_UFL)
__fe |= FE_UNDERFLOW;
return __fe;
}
static inline fp_rnd
__FPR(int __fe)
{
switch (__fe) {
case FE_TONEAREST:
return FP_RN;
case FE_DOWNWARD:
return FP_RM;
case FE_UPWARD:
return FP_RP;
case FE_TOWARDZERO:
return FP_RZ;
default:
return FP_RN;
}
}
static inline int
__FER(fp_rnd __fp)
{
switch (__fp) {
case FP_RN:
return FE_TONEAREST;
case FP_RM:
return FE_DOWNWARD;
case FP_RP:
return FE_UPWARD;
case FP_RZ:
return FE_TOWARDZERO;
default:
return FE_TONEAREST;
}
}
#endif
#endif
#endif
#endif