added some code to calculate log2(x)

This commit is contained in:
hyunghwan.chung 2015-11-03 14:58:19 +00:00
parent e061b94832
commit a033e2669b
2 changed files with 21 additions and 7 deletions

View File

@ -513,22 +513,31 @@ stix_oop_t stix_strtoint (stix_t* stix, const stix_ooch_t* str, stix_oow_t len,
/* get log2(radix) in a fast way under the fact that /* get log2(radix) in a fast way under the fact that
* radix is a power of 2. */ * radix is a power of 2. */
#if defined(__GNUC__) && (defined(__x86_64) || defined(__amd64) || defined(__i386) || defined(i386)) #if defined(__GNUC__) && (defined(__x86_64) || defined(__amd64) || defined(__i386) || defined(i386))
/* use the Bit Scan Forward instruction */ /* use the Bit Scan Forward instruction */
__asm__ volatile ( __asm__ volatile (
"bsf %1,%0\n\t" "bsf %1,%0\n\t"
: "=&r"(exp) /* output */ : "=r"(exp) /* output */
: "r"(radix) /* input */ : "r"(radix) /* input */
); );
#elif defined(__GNUC__) && defined(__arm__)
#elif defined(USE_THIS_UGLY_CODE) && defined(__GNUC__) && defined(__arm__) && (defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_8__))
/* clz is available in ARMv5T and above */
__asm__ volatile ( __asm__ volatile (
"clz %0,%1\n\t" "clz %0,%1\n\t"
: "=&r"(exp) /* output */ : "=r"(exp) /* output */
: "r"(radix) /* input */ : "r"(radix) /* input */
);
/* TODO: ARM - use clz, PPC - use cntlz, cntlzw, cntlzd, SPARC - use lzcnt, MIPS clz */ /* TODO: in ARMv6T2 and above, RBIT can be used before clz to avoid this calculation */
exp = (STIX_SIZEOF(exp) * 8) - exp - 1;
/* TODO: PPC - use cntlz, cntlzw, cntlzd, SPARC - use lzcnt, MIPS clz */
#else #else
static unsigned int exp_tab[] = static unsigned int exp_tab[] =
{ {
0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4,
@ -537,6 +546,7 @@ stix_oop_t stix_strtoint (stix_t* stix, const stix_ooch_t* str, stix_oow_t len,
exp = exp_tab[radix]; exp = exp_tab[radix];
#endif #endif
printf ("<<%d>>>>>>\n",exp);
start = ptr; /* this is the real start */ start = ptr; /* this is the real start */
ptr = end - 1; ptr = end - 1;

View File

@ -26,8 +26,10 @@
#include "stix-prv.h" #include "stix-prv.h"
#if defined(USE_DYNCALL)
/* TODO: defined dcAllocMem and dcFreeMeme before builing the dynload and dyncall library */ /* TODO: defined dcAllocMem and dcFreeMeme before builing the dynload and dyncall library */
# include <dyncall.h> /* TODO: remove this. make dyXXXX calls to callbacks */ # include <dyncall.h> /* TODO: remove this. make dyXXXX calls to callbacks */
#endif
/* TODO: context's stack overflow check in various part of this file */ /* TODO: context's stack overflow check in various part of this file */
/* TOOD: determine the right stack size */ /* TOOD: determine the right stack size */
@ -1363,6 +1365,7 @@ static int prim_ffi_close (stix_t* stix, stix_ooi_t nargs)
static int prim_ffi_call (stix_t* stix, stix_ooi_t nargs) static int prim_ffi_call (stix_t* stix, stix_ooi_t nargs)
{ {
#if defined(USE_DYNCALL)
stix_oop_t rcv, fun, sig, args; stix_oop_t rcv, fun, sig, args;
STIX_ASSERT (nargs == 3); STIX_ASSERT (nargs == 3);
@ -1526,8 +1529,10 @@ printf ("CALL ERROR %d %d\n", dcGetError (dc), DC_ERROR_UNSUPPORTED_MODE);
dcFree (dc); dcFree (dc);
} }
return 1; return 1;
#else
return 0;
#endif
} }
static int prim_ffi_getsym (stix_t* stix, stix_ooi_t nargs) static int prim_ffi_getsym (stix_t* stix, stix_ooi_t nargs)
@ -1572,7 +1577,6 @@ printf ("wrong function name...\n");
} }
struct prim_t struct prim_t
{ {
stix_ooi_t nargs; /* expected number of arguments */ stix_ooi_t nargs; /* expected number of arguments */