src/libm/math_private.h
author Sam Lantinga <slouken@libsdl.org>
Fri, 05 Jul 2013 23:57:19 -0700
changeset 7351 668a3dc28361
parent 5086 c2539ff054c8
child 7404 dfbe1bfff593
permissions -rw-r--r--
Removed the inline functions from SDL_stdinc.h
Having the SDL functions inline is causing build issues, and in the case of malloc(), etc. causing malloc/free mismatches, if the application build environment differs from the SDL build environment.

In the interest of safety and consistency, the functions will always be in the SDL library and will only be redirected to the C library there, if they are available.

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