177 lines
4.6 KiB
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 */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|