cscg22-gearboy

CSCG 2022 Challenge 'Gearboy'
git clone https://git.sinitax.com/sinitax/cscg22-gearboy
Log | Files | Refs | sfeed.txt

math_private.h (6674B)


      1/*
      2 * ====================================================
      3 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
      4 *
      5 * Developed at SunPro, a Sun Microsystems, Inc. business.
      6 * Permission to use, copy, modify, and distribute this
      7 * software is freely granted, provided that this notice
      8 * is preserved.
      9 * ====================================================
     10 */
     11
     12/*
     13 * from: @(#)fdlibm.h 5.1 93/09/24
     14 * $Id: math_private.h,v 1.3 2004/02/09 07:10:38 andersen Exp $
     15 */
     16
     17#ifndef _MATH_PRIVATE_H_
     18#define _MATH_PRIVATE_H_
     19
     20/* #include <endian.h> */
     21#include "SDL_endian.h"
     22/* #include <sys/types.h> */
     23
     24#define attribute_hidden
     25#define libm_hidden_proto(x)
     26#define libm_hidden_def(x)
     27
     28#ifndef __HAIKU__ /* already defined in a system header. */
     29typedef unsigned int u_int32_t;
     30#endif
     31
     32#define atan            SDL_uclibc_atan
     33#define __ieee754_atan2 SDL_uclibc_atan2
     34#define copysign        SDL_uclibc_copysign
     35#define cos             SDL_uclibc_cos
     36#define fabs            SDL_uclibc_fabs
     37#define floor           SDL_uclibc_floor
     38#define __ieee754_log   SDL_uclibc_log
     39#define __ieee754_pow   SDL_uclibc_pow
     40#define scalbn          SDL_uclibc_scalbn
     41#define sin             SDL_uclibc_sin
     42#define __ieee754_sqrt  SDL_uclibc_sqrt
     43#define tan             SDL_uclibc_tan
     44
     45/* The original fdlibm code used statements like:
     46	n0 = ((*(int*)&one)>>29)^1;		* index of high word *
     47	ix0 = *(n0+(int*)&x);			* high word of x *
     48	ix1 = *((1-n0)+(int*)&x);		* low word of x *
     49   to dig two 32 bit words out of the 64 bit IEEE floating point
     50   value.  That is non-ANSI, and, moreover, the gcc instruction
     51   scheduler gets it wrong.  We instead use the following macros.
     52   Unlike the original code, we determine the endianness at compile
     53   time, not at run time; I don't see much benefit to selecting
     54   endianness at run time.  */
     55
     56/* A union which permits us to convert between a double and two 32 bit
     57   ints.  */
     58
     59/*
     60 * Math on arm is special:
     61 * For FPA, float words are always big-endian.
     62 * For VFP, floats words follow the memory system mode.
     63 */
     64
     65#if (SDL_BYTEORDER == SDL_BIG_ENDIAN)
     66
     67typedef union
     68{
     69    double value;
     70    struct
     71    {
     72        u_int32_t msw;
     73        u_int32_t lsw;
     74    } parts;
     75} ieee_double_shape_type;
     76
     77#else
     78
     79typedef union
     80{
     81    double value;
     82    struct
     83    {
     84        u_int32_t lsw;
     85        u_int32_t msw;
     86    } parts;
     87} ieee_double_shape_type;
     88
     89#endif
     90
     91/* Get two 32 bit ints from a double.  */
     92
     93#define EXTRACT_WORDS(ix0,ix1,d)				\
     94do {								\
     95  ieee_double_shape_type ew_u;					\
     96  ew_u.value = (d);						\
     97  (ix0) = ew_u.parts.msw;					\
     98  (ix1) = ew_u.parts.lsw;					\
     99} while (0)
    100
    101/* Get the more significant 32 bit int from a double.  */
    102
    103#define GET_HIGH_WORD(i,d)					\
    104do {								\
    105  ieee_double_shape_type gh_u;					\
    106  gh_u.value = (d);						\
    107  (i) = gh_u.parts.msw;						\
    108} while (0)
    109
    110/* Get the less significant 32 bit int from a double.  */
    111
    112#define GET_LOW_WORD(i,d)					\
    113do {								\
    114  ieee_double_shape_type gl_u;					\
    115  gl_u.value = (d);						\
    116  (i) = gl_u.parts.lsw;						\
    117} while (0)
    118
    119/* Set a double from two 32 bit ints.  */
    120
    121#define INSERT_WORDS(d,ix0,ix1)					\
    122do {								\
    123  ieee_double_shape_type iw_u;					\
    124  iw_u.parts.msw = (ix0);					\
    125  iw_u.parts.lsw = (ix1);					\
    126  (d) = iw_u.value;						\
    127} while (0)
    128
    129/* Set the more significant 32 bits of a double from an int.  */
    130
    131#define SET_HIGH_WORD(d,v)					\
    132do {								\
    133  ieee_double_shape_type sh_u;					\
    134  sh_u.value = (d);						\
    135  sh_u.parts.msw = (v);						\
    136  (d) = sh_u.value;						\
    137} while (0)
    138
    139/* Set the less significant 32 bits of a double from an int.  */
    140
    141#define SET_LOW_WORD(d,v)					\
    142do {								\
    143  ieee_double_shape_type sl_u;					\
    144  sl_u.value = (d);						\
    145  sl_u.parts.lsw = (v);						\
    146  (d) = sl_u.value;						\
    147} while (0)
    148
    149/* A union which permits us to convert between a float and a 32 bit
    150   int.  */
    151
    152typedef union
    153{
    154    float value;
    155    u_int32_t word;
    156} ieee_float_shape_type;
    157
    158/* Get a 32 bit int from a float.  */
    159
    160#define GET_FLOAT_WORD(i,d)					\
    161do {								\
    162  ieee_float_shape_type gf_u;					\
    163  gf_u.value = (d);						\
    164  (i) = gf_u.word;						\
    165} while (0)
    166
    167/* Set a float from a 32 bit int.  */
    168
    169#define SET_FLOAT_WORD(d,i)					\
    170do {								\
    171  ieee_float_shape_type sf_u;					\
    172  sf_u.word = (i);						\
    173  (d) = sf_u.value;						\
    174} while (0)
    175
    176/* ieee style elementary functions */
    177extern double
    178__ieee754_sqrt(double)
    179    attribute_hidden;
    180     extern double __ieee754_acos(double) attribute_hidden;
    181     extern double __ieee754_acosh(double) attribute_hidden;
    182     extern double __ieee754_log(double) attribute_hidden;
    183     extern double __ieee754_atanh(double) attribute_hidden;
    184     extern double __ieee754_asin(double) attribute_hidden;
    185     extern double __ieee754_atan2(double, double) attribute_hidden;
    186     extern double __ieee754_exp(double) attribute_hidden;
    187     extern double __ieee754_cosh(double) attribute_hidden;
    188     extern double __ieee754_fmod(double, double) attribute_hidden;
    189     extern double __ieee754_pow(double, double) attribute_hidden;
    190     extern double __ieee754_lgamma_r(double, int *) attribute_hidden;
    191     extern double __ieee754_gamma_r(double, int *) attribute_hidden;
    192     extern double __ieee754_lgamma(double) attribute_hidden;
    193     extern double __ieee754_gamma(double) attribute_hidden;
    194     extern double __ieee754_log10(double) attribute_hidden;
    195     extern double __ieee754_sinh(double) attribute_hidden;
    196     extern double __ieee754_hypot(double, double) attribute_hidden;
    197     extern double __ieee754_j0(double) attribute_hidden;
    198     extern double __ieee754_j1(double) attribute_hidden;
    199     extern double __ieee754_y0(double) attribute_hidden;
    200     extern double __ieee754_y1(double) attribute_hidden;
    201     extern double __ieee754_jn(int, double) attribute_hidden;
    202     extern double __ieee754_yn(int, double) attribute_hidden;
    203     extern double __ieee754_remainder(double, double) attribute_hidden;
    204     extern int __ieee754_rem_pio2(double, double *) attribute_hidden;
    205#if defined(_SCALB_INT)
    206     extern double __ieee754_scalb(double, int) attribute_hidden;
    207#else
    208     extern double __ieee754_scalb(double, double) attribute_hidden;
    209#endif
    210
    211/* fdlibm kernel function */
    212#ifndef _IEEE_LIBM
    213     extern double __kernel_standard(double, double, int) attribute_hidden;
    214#endif
    215     extern double __kernel_sin(double, double, int) attribute_hidden;
    216     extern double __kernel_cos(double, double) attribute_hidden;
    217     extern double __kernel_tan(double, double, int) attribute_hidden;
    218     extern int __kernel_rem_pio2(double *, double *, int, int, int,
    219                                  const int *) attribute_hidden;
    220
    221#endif /* _MATH_PRIVATE_H_ */