Ignore:
Timestamp:
11/10/06 22:04:46 (17 years ago)
Author:
zorg
Message:

Remove math aliasing issues which were breaking gcc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • mppenc/trunk/src/fastmath.h

    r97 r109  
    1818 */
    1919
    20 #if 1
    21 # define ROUND32(x)   ( floattmp = (x) + (int)0x00FD8000L, *(int*)(&floattmp) - (int)0x4B7D8000L )
    22 #else
    23 # define ROUND32(x)   ( (int) floor ((x) + 0.5) )
    24 #endif
     20typedef union mpc_floatint
     21{
     22    float   f;
     23    Int32_t n;
     24} mpc_floatint;
     25
     26static __inline Int32_t mpc_nearbyintf(float fVal)
     27{
     28    mpc_floatint tmp;
     29    tmp.f = fVal  + 0x00FF8000;
     30    tmp.n = tmp.n - 0x4B7F8000;
     31    return tmp.n;
     32}
     33#define mpc_lrintf mpc_nearbyintf
     34static __inline Int32_t mpc_round32(float fVal)
     35{
     36    mpc_floatint tmp;
     37    tmp.f = fVal  + 0x00FD8000;
     38    tmp.n = tmp.n - 0x4B7D8000;
     39    return tmp.n;
     40}
    2541
    2642#ifdef FAST_MATH
     
    2945my_atan2 ( float x, float y )
    3046{
    31     float  t;
    32     int    i;
    33     float  ret;
    34     float  floattmp;
     47    float t, ret; int i; mpc_floatint mx, my;
    3548
    36     if ( (*(int*)&x & 0x7FFFFFFF) < (*(int*)&y & 0x7FFFFFFF) ) {
    37         i   = ROUND32 (t = TABSTEP * (x / y));
     49    mx.f = x;
     50    my.f = y;
     51    if ( (mx.n & 0x7FFFFFFF) < (my.n & 0x7FFFFFFF) ) {
     52        i   = mpc_round32 (t = TABSTEP * (mx.f / my.f));
    3853        ret = tabatan2 [1*TABSTEP+i][0] + tabatan2 [1*TABSTEP+i][1] * (t-i);
    39         if ( *(int*)&y < 0 )
     54        if ( my.n < 0 )
    4055           ret = (float)(ret - M_PI);
    4156    }
    42     else if ( *(int*)&x < 0) {
    43         i   = ROUND32 (t = TABSTEP * (y / x));
     57    else if ( mx.n < 0 ) {
     58        i   = mpc_round32 (t = TABSTEP * (my.f / mx.f));
    4459        ret = - M_PI/2 - tabatan2 [1*TABSTEP+i][0] + tabatan2 [1*TABSTEP+i][1] * (i-t);
    4560    }
    46     else if ( *(int*)&x > 0) {
    47         i   = ROUND32 (t = TABSTEP * (y / x));
     61    else if ( mx.n > 0 ) {
     62        i   = mpc_round32 (t = TABSTEP * (my.f / mx.f));
    4863        ret = + M_PI/2 - tabatan2 [1*TABSTEP+i][0] + tabatan2 [1*TABSTEP+i][1] * (i-t);
    4964    }
     
    5873my_cos ( float x )
    5974{
    60     float  t;
    61     int    i;
    62     float  ret;
    63     float  floattmp;
    64 
    65     i   = ROUND32 (t = TABSTEP * x);
     75    float t, ret; int i;
     76    i   = mpc_round32 (t = TABSTEP * x);
    6677    ret = tabcos [13*TABSTEP+i][0] + tabcos [13*TABSTEP+i][1] * (t-i);
    6778    return ret;
     
    7283my_ifloor ( float x )
    7384{
    74     x = x + (0x0C00000L + 0.500000001);
    75     return *(int*)&x - 1262485505;
     85    mpc_floatint mx;
     86    mx.f = (float) (x + (0x0C00000L + 0.500000001));
     87    return mx.n - 1262485505;
    7688}
    7789
     
    8092my_sqrt ( float x )
    8193{
    82     float  ret;
    83     int    i;
    84     int    ex = *(int*)&x >> 23;                                // get the exponent
    85     float  floattmp;
    86 
    87     *(int*)&x = (*(int*)&x & 0x7FFFFF) | 0x42800000;            // delete the exponent
    88     i    = ROUND32 (x);                                         // Integer-part of the mantissa  (round ????????????)
    89     ret  = tabsqrt_m [i-TABSTEP][0] + tabsqrt_m [i-TABSTEP][1] * (x-i); // calculate value
     94    float  ret; int i, ex; mpc_floatint mx;
     95    mx.f = x;
     96    ex   = mx.n >> 23;                     // get the exponent
     97    mx.n = (mx.n & 0x7FFFFF) | 0x42800000; // delete the exponent
     98    i    = mpc_round32 (mx.f);             // Integer-part of the mantissa  (round ????????????)
     99    ret  = tabsqrt_m [i-TABSTEP][0] + tabsqrt_m [i-TABSTEP][1] * (mx.f-i); // calculate value
    90100    ret *= tabsqrt_ex [ex];
    91101    return ret;
Note: See TracChangeset for help on using the changeset viewer.