mirror of
https://github.com/W3SLAV/micropython.git
synced 2025-06-19 20:15:33 -04:00

Since C99, `FLT_EVAL_METHOD` should be left for the compiler/libc to define. Its redefinition breaks compilation with picolibc as the target's libc, since it defines said symbol in math.h before the libm define is evaluated by the compiler. In its place, there is a check to make sure floating point type sizes are what are expected to be, triggering a compilation error if those assumptions are no longer valid. Co-authored-by: Angus Gratton <angus@redyak.com.au> Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
58 lines
2.2 KiB
C
58 lines
2.2 KiB
C
/*****************************************************************************/
|
|
/*****************************************************************************/
|
|
// portions extracted from musl-0.9.15 libm.h
|
|
/*****************************************************************************/
|
|
/*****************************************************************************/
|
|
|
|
/* origin: FreeBSD /usr/src/lib/msun/src/math_private.h */
|
|
/*
|
|
* ====================================================
|
|
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
|
*
|
|
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
|
* Permission to use, copy, modify, and distribute this
|
|
* software is freely granted, provided that this notice
|
|
* is preserved.
|
|
* ====================================================
|
|
*/
|
|
|
|
#include <stdint.h>
|
|
#include <math.h>
|
|
|
|
// These lines verify that FLT_EVAL_METHOD==0, MicroPython's libm requires this.
|
|
// If compilation fails here then check the host compiler's FLT_EVAL_METHOD.
|
|
typedef float float_t;
|
|
typedef double double_t;
|
|
|
|
#define FORCE_EVAL(x) do { \
|
|
if (sizeof(x) == sizeof(float)) { \
|
|
volatile float __x; \
|
|
__x = (x); \
|
|
(void)__x; \
|
|
} else if (sizeof(x) == sizeof(double)) { \
|
|
volatile double __x; \
|
|
__x = (x); \
|
|
(void)__x; \
|
|
} else { \
|
|
volatile long double __x; \
|
|
__x = (x); \
|
|
(void)__x; \
|
|
} \
|
|
} while(0)
|
|
|
|
/* Get a 32 bit int from a float. */
|
|
#define GET_FLOAT_WORD(w,d) \
|
|
do { \
|
|
union {float f; uint32_t i;} __u; \
|
|
__u.f = (d); \
|
|
(w) = __u.i; \
|
|
} while (0)
|
|
|
|
/* Set a float from a 32 bit int. */
|
|
#define SET_FLOAT_WORD(d,w) \
|
|
do { \
|
|
union {float f; uint32_t i;} __u; \
|
|
__u.i = (w); \
|
|
(d) = __u.f; \
|
|
} while (0)
|