reman3/Rayman_X/cpa/tempgrp/MTH/Specif/MTH_fopt.c

177 lines
4.6 KiB
C

/* ##C_FILE#
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FILE : MTH_fopt.c
MODULE : MTH (Common Mathematic Library)
DESCRIPTION : Optimization for PC and float
VERSION : MTH V5.0.13 / Alexandre LANGER [ALX] Ubi R&D / Add Comments
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
/* NOT for U64 */
#ifndef U64
/* ##INCLUDE#----------------------------------------------------------------------------
Includes Files
---------------------------------------------------------------------------------------*/
#include <math.h>
#include "cpa_expt.h"
/* ##GLOBVAR#----------------------------------------------------------------------------
Globale variable declaration
---------------------------------------------------------------------------------------*/
double MTH_gs_dDecal; /* = 3.0F*pow(2, 51); */
/* sqrt : */
CPA_EXPORT unsigned long MTH_g_a2048_fSquareRootTable[1024*2];
/* div : */
CPA_EXPORT unsigned long MTH_g_a1024_fInverse[1024];
/* inv sqrt : */
CPA_EXPORT unsigned long MTH_g_a2048_fInvSquareRootTable[1024*2];
/* ##FUNCDEF#----------------------------------------------------------------------------
Functions definition
---------------------------------------------------------------------------------------*/
/* ##-###########################
## SQRT
############################## */
/* ##F===================================================================================
NAME : MTH_fn_vInitSqrtRootOpt
DESCRIPTION : Initialize Square root table
INPUT : void
OUTPUT : void
=======================================================================================*/
void MTH_fn_vInitSqrtRootOpt( void )
{
long i;
float ft;
unsigned long m;
for ( i=0; i<1024; i++)
{
ft = (float) sqrt((double) 1.0+((float)i/1024) );
m = *(long *)&ft;
m&= 0x7FFFFF;
MTH_g_a2048_fSquareRootTable[i+1024] = m;
ft = (float) ( sqrt(2.0)*sqrt((double) 1.0+((float)i/1024) ) );
m = *(long *)&ft;
m&= 0x7FFFFF;
MTH_g_a2048_fSquareRootTable[i] = m;
}
}
/* ##-###########################
## DIV
############################## */
/* ##F===================================================================================
NAME : MTH_fn_vInitInverseOpt
DESCRIPTION : Initialize Inverse table
INPUT : void
OUTPUT : void
=======================================================================================*/
void MTH_fn_vInitInverseOpt( void )
{
long i;
float ft;
for ( i=0; i<1024; i++ )
{
ft = 1.0F / ( 1.0F + ((float)i/1024) );
MTH_g_a1024_fInverse[i] = (*(long *)&ft) & 0x7FFFFF;
}
MTH_g_a1024_fInverse[0]=(1<<23); /* Because of problems with 2^n */
}
/* ##-###########################
## INV SQRT
############################## */
/* ##F===================================================================================
NAME : MTH_fn_vInitInvSqrtRootOpt
DESCRIPTION : Initialize Inverse Square root table
INPUT : void
OUTPUT : void
=======================================================================================*/
void MTH_fn_vInitInvSqrtRootOpt(void)
{
long i; /* index on the table */
unsigned long m; /* mantis */
float ft; /* float value */
for ( i=0; i<1024; i++ )
{
ft = (float) ( 2.0/sqrt((double)( 1.0+((float)i/1024) )) );
m = *(long *)&ft;
m &= 0x7FFFFF;
MTH_g_a2048_fInvSquareRootTable[i+1024] = m;
ft = (float) ( sqrt(2.0)/sqrt((double)( 1.0+((float)i/1024) )) );
m = *(long *)&ft;
m &= 0x7FFFFF;
m+=0x800000;
MTH_g_a2048_fInvSquareRootTable[i] = m;
}
MTH_g_a2048_fInvSquareRootTable[1024]=(1<<23);
}
/* ##-###########################
## INIT
############################## */
/* ##F===================================================================================
NAME : MTH_fn_vInit
DESCRIPTION : Initialize all table if it not yet done
INPUT : void
OUTPUT : void
=======================================================================================*/
void MTH_fn_vInit( void )
{
static unsigned char InitDone=0;
MTH_gs_dDecal= 3.0F*pow(2, 51);
if(InitDone==0)
{
MTH_fn_vInitSqrtRootOpt();
MTH_fn_vInitInverseOpt();
MTH_fn_vInitInvSqrtRootOpt();
InitDone=1;
}
}
#endif /* NOT U64 */