#ifndef COSMOPOLITAN_LIBC_TINYMATH_COMPLEX_INTERNAL_H_ #define COSMOPOLITAN_LIBC_TINYMATH_COMPLEX_INTERNAL_H_ #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ #define asuint(f) ((union{float _f; uint32_t _i;}){f})._i #define asfloat(i) ((union{uint32_t _i; float _f;}){i})._f #define asuint64(f) ((union{double _f; uint64_t _i;}){f})._i #define asdouble(i) ((union{uint64_t _i; double _f;}){i})._f #define EXTRACT_WORDS(hi,lo,d) \ do { \ uint64_t __u = asuint64(d); \ (hi) = __u >> 32; \ (lo) = (uint32_t)__u; \ } while (0) #define GET_HIGH_WORD(hi,d) \ do { \ (hi) = asuint64(d) >> 32; \ } while (0) #define GET_LOW_WORD(lo,d) \ do { \ (lo) = (uint32_t)asuint64(d); \ } while (0) #define INSERT_WORDS(d,hi,lo) \ do { \ (d) = asdouble(((uint64_t)(hi)<<32) | (uint32_t)(lo)); \ } while (0) #define SET_HIGH_WORD(d,hi) \ INSERT_WORDS(d, hi, (uint32_t)asuint64(d)) #define SET_LOW_WORD(d,lo) \ INSERT_WORDS(d, asuint64(d)>>32, lo) #define GET_FLOAT_WORD(w,d) \ do { \ (w) = asuint(d); \ } while (0) #define SET_FLOAT_WORD(d,w) \ do { \ (d) = asfloat(w); \ } while (0) _Complex double __ldexp_cexp(_Complex double, int) hidden; _Complex float __ldexp_cexpf(_Complex float, int) hidden; COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_TINYMATH_COMPLEX_INTERNAL_H_ */