From 737ec947d3f33e73e587f7020dba40b1818ac64d Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Mon, 1 Nov 2004 12:06:50 -0300 Subject: [PATCH] better implementation for `floating-point bytes' --- lobject.c | 19 ++++++++++++++----- lobject.h | 4 ++-- ltests.c | 4 ++-- lvm.c | 4 ++-- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/lobject.c b/lobject.c index df571242..666bb466 100644 --- a/lobject.c +++ b/lobject.c @@ -1,5 +1,5 @@ /* -** $Id: lobject.c,v 2.4 2004/07/09 16:01:38 roberto Exp roberto $ +** $Id: lobject.c,v 2.5 2004/10/06 18:34:16 roberto Exp $ ** Some generic functions over Lua objects ** See Copyright Notice in lua.h */ @@ -31,12 +31,21 @@ const TValue luaO_nilobject = {{NULL}, LUA_TNIL}; ** (mmmmmxxx), where the real value is (xxx) * 2^(mmmmm) */ int luaO_int2fb (unsigned int x) { - int m = 0; /* mantissa */ - while (x >= (1<<3)) { + int e = 0; /* expoent */ + while (x >= 16) { x = (x+1) >> 1; - m++; + e++; } - return (m << 3) | cast(int, x); + if (x < 8) return x; + else return ((e+1) << 3) | (cast(int, x) - 8); +} + + +/* converts back */ +int luaO_fb2int (int x) { + int e = (x >> 3) & 31; + if (e == 0) return x; + else return ((x & 7)+8) << (e - 1); } diff --git a/lobject.h b/lobject.h index b407a196..fb54c3d8 100644 --- a/lobject.h +++ b/lobject.h @@ -1,5 +1,5 @@ /* -** $Id: lobject.h,v 2.5 2004/05/31 18:51:50 roberto Exp roberto $ +** $Id: lobject.h,v 2.6 2004/10/06 18:34:16 roberto Exp $ ** Type definitions for Lua objects ** See Copyright Notice in lua.h */ @@ -352,7 +352,7 @@ extern const TValue luaO_nilobject; int luaO_log2 (unsigned int x); int luaO_int2fb (unsigned int x); -#define fb2int(x) (((x) & 7) << ((x) >> 3)) +int luaO_fb2int (int x); int luaO_rawequalObj (const TValue *t1, const TValue *t2); int luaO_str2d (const char *s, lua_Number *result); diff --git a/ltests.c b/ltests.c index 621acf0e..37720a26 100644 --- a/ltests.c +++ b/ltests.c @@ -1,5 +1,5 @@ /* -** $Id: ltests.c,v 2.13 2004/09/29 21:00:25 roberto Exp roberto $ +** $Id: ltests.c,v 2.14 2004/10/06 18:34:16 roberto Exp $ ** Internal Module for Debugging of the Lua Implementation ** See Copyright Notice in lua.h */ @@ -759,7 +759,7 @@ static int log2_aux (lua_State *L) { static int int2fb_aux (lua_State *L) { int b = luaO_int2fb(luaL_checkint(L, 1)); lua_pushinteger(L, b); - lua_pushinteger(L, fb2int(b)); + lua_pushinteger(L, luaO_fb2int(b)); return 2; } diff --git a/lvm.c b/lvm.c index e97279c3..b2845455 100644 --- a/lvm.c +++ b/lvm.c @@ -1,5 +1,5 @@ /* -** $Id: lvm.c,v 2.15 2004/10/04 19:01:53 roberto Exp roberto $ +** $Id: lvm.c,v 2.16 2004/10/28 17:45:51 roberto Exp $ ** Lua virtual machine ** See Copyright Notice in lua.h */ @@ -461,7 +461,7 @@ StkId luaV_execute (lua_State *L, int nexeccalls) { } case OP_NEWTABLE: { int b = GETARG_B(i); - b = fb2int(b); + b = luaO_fb2int(b); sethvalue(L, ra, luaH_new(L, b, GETARG_C(i))); L->ci->savedpc = pc; luaC_checkGC(L); /***/