www.pudn.com > BUILD Engine 08012001.zip > kreciptest.c


#include 
#include 
#include "sar.h"

/*extern int _asm_krecipasm (int);*/
int reciptable[2048], fpuasm;
void init (void)
{
  int i;
  for(i=0;i<2048;i++) reciptable[i] = i;/* divscale30(2048L,i+2048);*/
}

static int krecipasm(int i1)
{
  int retval;
  __asm__ __volatile__ ("
    call _asm_krecipasm
           " : "=a" (retval) : "a" (i1)
			: "cc", "ebx", "ecx", "memory");
  return(retval);
} // krecipasm

static int ansi_c_krecip (int x)
{
  float xf;
  int z;
  int not;

  if (x & 0x80000000) /* If the highest bit is set... */
    not = 0x0FFFFFFFF;
  else
    not = 0;
  
  xf = (float)x;/* convert the int to a float */

  /* Pretend the float is an int so we can extract bits */
  x = *((int*)(&xf));
  z = x;
  
  x = x & 0x007FF000;/* Mask out: 11 << 13 */
  x = x >> 10;       /* Divide x by 1024 */
  /* X now contains: 13 high order bits of the mantissa, followed by two 0 bits */

  /* Now we perform an elaborate extraction
     of the exponent from the floating point
     numer? WTF is the subtraction for? */
  z = z - 0x03F800000;/* Subtract (127<<23) */
  z = z >> 23;

  /* z now contains the exponent divided by two?  */
  x = shift_algebraic_right(reciptable[(x>>2)], z) ^ not;
  return x;
}

static int mykrecipasm(int i1)
{
  int retval;
  retval = ansi_c_krecip(i1);
  return retval;
}

int main (int argc, char** argv)
{
  int u;

  init();
  printf("sizeof(long) = %u, sizeof(int) = %u\n",
	 sizeof(long int), sizeof(int));
 
  u = 0;
  while(scanf("%d", &u) >= 1){    
    printf("Original: %d \tMine: %d\n", 
	   krecipasm(u),mykrecipasm(u));
    u = 0;
  }
  
  return 0;
}