mirror of
https://github.com/fluencelabs/musl
synced 2025-05-29 15:41:36 +00:00
add FORCE_EVAL macro to evaluate float expr for their side effect
updated nextafter* to use FORCE_EVAL, it can be used in many other places in the math code to improve readability.
This commit is contained in:
parent
4e597feef0
commit
6ab8136b44
@ -32,6 +32,19 @@ union dshape {
|
|||||||
uint64_t bits;
|
uint64_t bits;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define FORCE_EVAL(x) do { \
|
||||||
|
if (sizeof(x) == sizeof(float)) { \
|
||||||
|
volatile float __x; \
|
||||||
|
__x = (x); \
|
||||||
|
} else if (sizeof(x) == sizeof(double)) { \
|
||||||
|
volatile double __x; \
|
||||||
|
__x = (x); \
|
||||||
|
} else { \
|
||||||
|
volatile long double __x; \
|
||||||
|
__x = (x); \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
/* Get two 32 bit ints from a double. */
|
/* Get two 32 bit ints from a double. */
|
||||||
#define EXTRACT_WORDS(hi,lo,d) \
|
#define EXTRACT_WORDS(hi,lo,d) \
|
||||||
do { \
|
do { \
|
||||||
|
@ -29,9 +29,7 @@ double nextafter(double x, double y)
|
|||||||
if (e == 0x7ff)
|
if (e == 0x7ff)
|
||||||
return x + x;
|
return x + x;
|
||||||
/* raise underflow if ux.value is subnormal or zero */
|
/* raise underflow if ux.value is subnormal or zero */
|
||||||
if (e == 0) {
|
if (e == 0)
|
||||||
volatile double z;
|
FORCE_EVAL(x*x + ux.value*ux.value);
|
||||||
z = x*x + ux.value*ux.value;
|
|
||||||
}
|
|
||||||
return ux.value;
|
return ux.value;
|
||||||
}
|
}
|
||||||
|
@ -28,9 +28,7 @@ float nextafterf(float x, float y)
|
|||||||
if (e == 0x7f800000)
|
if (e == 0x7f800000)
|
||||||
return x + x;
|
return x + x;
|
||||||
/* raise underflow if ux.value is subnormal or zero */
|
/* raise underflow if ux.value is subnormal or zero */
|
||||||
if (e == 0) {
|
if (e == 0)
|
||||||
volatile float z;
|
FORCE_EVAL(x*x + ux.value*ux.value);
|
||||||
z = x*x + ux.value*ux.value;
|
|
||||||
}
|
|
||||||
return ux.value;
|
return ux.value;
|
||||||
}
|
}
|
||||||
|
@ -38,10 +38,8 @@ long double nextafterl(long double x, long double y)
|
|||||||
if (ux.bits.exp == 0x7fff)
|
if (ux.bits.exp == 0x7fff)
|
||||||
return x + x;
|
return x + x;
|
||||||
/* raise underflow if ux.value is subnormal or zero */
|
/* raise underflow if ux.value is subnormal or zero */
|
||||||
if (ux.bits.exp == 0) {
|
if (ux.bits.exp == 0)
|
||||||
volatile float z;
|
FORCE_EVAL(x*x + ux.value*ux.value);
|
||||||
z = x*x + ux.value*ux.value;
|
|
||||||
}
|
|
||||||
return ux.value;
|
return ux.value;
|
||||||
}
|
}
|
||||||
#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
|
#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
|
||||||
@ -77,10 +75,8 @@ long double nextafterl(long double x, long double y)
|
|||||||
if (ux.bits.exp == 0x7fff)
|
if (ux.bits.exp == 0x7fff)
|
||||||
return x + x;
|
return x + x;
|
||||||
/* raise underflow if ux.value is subnormal or zero */
|
/* raise underflow if ux.value is subnormal or zero */
|
||||||
if (ux.bits.exp == 0) {
|
if (ux.bits.exp == 0)
|
||||||
volatile float z;
|
FORCE_EVAL(x*x + ux.value*ux.value);
|
||||||
z = x*x + ux.value*ux.value;
|
|
||||||
}
|
|
||||||
return ux.value;
|
return ux.value;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -38,10 +38,8 @@ double nexttoward(double x, long double y)
|
|||||||
if (e == 0x7ff)
|
if (e == 0x7ff)
|
||||||
return x + x;
|
return x + x;
|
||||||
/* raise underflow if ux.value is subnormal or zero */
|
/* raise underflow if ux.value is subnormal or zero */
|
||||||
if (e == 0) {
|
if (e == 0)
|
||||||
volatile float z;
|
FORCE_EVAL(x*x + ux.value*ux.value);
|
||||||
z = x*x + ux.value*ux.value;
|
|
||||||
}
|
|
||||||
return ux.value;
|
return ux.value;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -30,9 +30,7 @@ float nexttowardf(float x, long double y)
|
|||||||
if (e == 0x7f800000)
|
if (e == 0x7f800000)
|
||||||
return x + x;
|
return x + x;
|
||||||
/* raise underflow if ux.value is subnormal or zero */
|
/* raise underflow if ux.value is subnormal or zero */
|
||||||
if (e == 0) {
|
if (e == 0)
|
||||||
volatile float z;
|
FORCE_EVAL(x*x + ux.value*ux.value);
|
||||||
z = x*x + ux.value*ux.value;
|
|
||||||
}
|
|
||||||
return ux.value;
|
return ux.value;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user