116 lines
1.9 KiB
C
116 lines
1.9 KiB
C
|
|
||
|
#include <ieeefp.h>
|
||
|
|
||
|
|
||
|
fp_rnd
|
||
|
_DEFUN_VOID(fpgetround)
|
||
|
{
|
||
|
char *out;
|
||
|
ieee_flags("get", "direction","", &out);
|
||
|
if (strcmp(out,"nearest") == 0) return FP_RN;
|
||
|
if (strcmp(out,"negative") == 0) return FP_RM;
|
||
|
if (strcmp(out,"positive") == 0) return FP_RP;
|
||
|
if (strcmp(out,"tozero") == 0) return FP_RZ;
|
||
|
abort();
|
||
|
|
||
|
}
|
||
|
|
||
|
fp_rnd
|
||
|
_DEFUN(fpsetround,(new),
|
||
|
fp_rnd new)
|
||
|
{
|
||
|
fp_rnd old = fpgetround();
|
||
|
char *dummy;
|
||
|
|
||
|
switch (new)
|
||
|
{
|
||
|
case FP_RN:
|
||
|
ieee_flags("set", "direction", "nearest", &dummy);
|
||
|
break;
|
||
|
case FP_RM:
|
||
|
ieee_flags("set", "direction", "negative", &dummy);
|
||
|
break;
|
||
|
case FP_RP:
|
||
|
ieee_flags("set", "direction", "positive", &dummy);
|
||
|
break;
|
||
|
case FP_RZ:
|
||
|
ieee_flags("set", "direction", "tozero", &dummy);
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
return old;
|
||
|
}
|
||
|
|
||
|
|
||
|
fp_except
|
||
|
_DEFUN_VOID(fpgetmask)
|
||
|
{
|
||
|
char *out;
|
||
|
int r = 0;
|
||
|
|
||
|
int i = ieee_flags("get","exception","",&out);
|
||
|
if (i & 1) r |= FP_X_IMP;
|
||
|
if (i & 2) r |= FP_X_DX;
|
||
|
if (i & 4) r |= FP_X_UFL;
|
||
|
if (i & 8) r |= FP_X_OFL;
|
||
|
if (i & 16) r |= FP_X_INV;
|
||
|
return r;
|
||
|
|
||
|
}
|
||
|
|
||
|
fp_except
|
||
|
_DEFUN(fpsetmask,(mask),
|
||
|
fp_except mask)
|
||
|
{
|
||
|
fp_except old = fpgetmask();
|
||
|
|
||
|
char *out;
|
||
|
ieee_flags("clear","exception", "all", &out);
|
||
|
|
||
|
|
||
|
if (mask & FP_X_IMP)
|
||
|
ieee_flags("set","exception","inexact", &out);
|
||
|
if (mask & FP_X_DX)
|
||
|
ieee_flags("set","exception","division", &out);
|
||
|
if (mask & FP_X_UFL)
|
||
|
ieee_flags("set","exception","underflow", &out);
|
||
|
if (mask & FP_X_OFL)
|
||
|
ieee_flags("set","exception","overflow", &out);
|
||
|
if (mask & FP_X_INV)
|
||
|
ieee_flags("set","exception","invalid", &out);
|
||
|
|
||
|
return old;
|
||
|
|
||
|
}
|
||
|
|
||
|
fp_except
|
||
|
_DEFUN(fpsetsticky,(mask),
|
||
|
fp_except mask)
|
||
|
{
|
||
|
return fpsetmask(mask);
|
||
|
}
|
||
|
|
||
|
fp_except
|
||
|
_DEFUN_VOID(fpgetsticky)
|
||
|
{
|
||
|
return fpgetmask();
|
||
|
}
|
||
|
|
||
|
int
|
||
|
_DEFUN(fpsetroundtoi,(rdi_mode),
|
||
|
fp_rdi rdi_mode)
|
||
|
{
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
}
|
||
|
|
||
|
int
|
||
|
_DEFUN_VOID(fpgetroundtoi)
|
||
|
{
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
}
|