1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-04 11:10:27 +02:00

Remove non optional gmp dependency.

* configure.ac, include/lightning/jit_private.h, lib/lightning.c:
	Remove dependency on gmp. Only a simple bitmap was required, and
	that was not enough reason to force linking to gmp and possible
	complications caused by it.
This commit is contained in:
pcpa 2013-03-22 18:28:42 -03:00
parent 7ef8060fb2
commit f341d91e2b
4 changed files with 102 additions and 13 deletions

View file

@ -1,3 +1,10 @@
2013-03-22 Paulo Andrade <pcpa@gnu.org>
* configure.ac, include/lightning/jit_private.h, lib/lightning.c:
Remove dependency on gmp. Only a simple bitmap was required, and
that was not enough reason to force linking to gmp and possible
complications caused by it.
2013-03-10 Paulo Andrade <pcpa@gnu.org>
* include/lightning.h: Add check for __powerpc__ defined

View file

@ -27,9 +27,6 @@ AC_PROG_LIBTOOL
AC_CHECK_FUNCS(mremap,,)
AC_CHECK_LIB(gmp, __gmpz_init, ,
[AC_MSG_ERROR([GNU MP not found, see http://gmplib.org/])])
AC_ARG_ENABLE(disassembler,
AS_HELP_STRING([--enable-disassembler],
[Enable jit disassembler using binutils]),

View file

@ -25,7 +25,6 @@
#include <assert.h>
#include <limits.h>
#include <stdio.h>
#include <gmp.h>
#if defined(__GNUC__)
# define maybe_unused __attribute__ ((unused))
@ -278,7 +277,10 @@ struct jit_compiler {
jit_regset_t regsav; /* automatic spill only once */
jit_regset_t reglive; /* known live registers at some point */
jit_regset_t regmask; /* register mask to update reglive */
mpz_t blockmask; /* mask of visited basic blocks */
struct {
jit_word_t *ptr;
jit_word_t length;
} blockmask; /* mask of visited basic blocks */
struct {
jit_uint8_t *end;
} code;

View file

@ -23,6 +23,12 @@
#define jit_regload_delete 1 /* just remove node */
#define jit_regload_isdead 2 /* delete and unset live bit */
#if __WORDSIZE == 32
# define bmp_shift 3
#else
# define bmp_shift 6
#endif
/*
* Prototypes
*/
@ -43,6 +49,27 @@ static inline void _del_node(jit_state_t*, jit_node_t*, jit_node_t*);
#define del_label(u, v) _del_label(_jit, u, v)
static void _del_label(jit_state_t*, jit_node_t*, jit_node_t*);
#define bmp_init() _bmp_init(_jit)
static void _bmp_init(jit_state_t*);
#define bmp_clear() _bmp_clear(_jit)
static void _bmp_clear(jit_state_t*);
#define bmp_zero() \
memset(_jitc->blockmask.ptr, 0, \
_jitc->blockmask.length * sizeof(jit_word_t))
static void _bmp_zero(jit_state_t*);
#define bmp_set(bit) _bmp_set(_jit, bit)
static void _bmp_set(jit_state_t*, jit_word_t);
#define bmp_clr(bit) _bmp_clr(_jit, bit)
static void _bmp_clr(jit_state_t*, jit_word_t);
#define bmp_tst(bit) _bmp_tst(_jit, bit)
static jit_bool_t _bmp_tst(jit_state_t*, jit_word_t);
#define jit_setup(block) _jit_setup(_jit, block)
static void
_jit_setup(jit_state_t *_jit, jit_block_t *block);
@ -492,6 +519,62 @@ _del_label(jit_state_t *_jit, jit_node_t *prev, jit_node_t *node)
del_node(prev, node);
}
static void
_bmp_init(jit_state_t *_jit)
{
_jitc->blockmask.length = 16;
_jitc->blockmask.ptr = calloc(sizeof(jit_word_t), _jitc->blockmask.length);
}
static void
_bmp_clear(jit_state_t *_jit)
{
_jitc->blockmask.length = 0;
free(_jitc->blockmask.ptr);
_jitc->blockmask.ptr = NULL;
}
static void
_bmp_set(jit_state_t *_jit, jit_word_t bit)
{
jit_word_t woff, boff;
woff = bit >> bmp_shift;
boff = 1LL << (bit & (__WORDSIZE - 1));
if (woff >= _jitc->blockmask.length) {
jit_word_t length = (woff + 16) & -16;
_jitc->blockmask.ptr = realloc(_jitc->blockmask.ptr,
length * sizeof(jit_word_t));
memset(_jitc->blockmask.ptr + _jitc->blockmask.length,
0, (length - _jitc->blockmask.length) * sizeof(jit_word_t));
_jitc->blockmask.length = length;
}
_jitc->blockmask.ptr[woff] |= boff;
}
static void
_bmp_clr(jit_state_t *_jit, jit_word_t bit)
{
jit_word_t woff, boff;
woff = bit >> bmp_shift;
boff = 1LL << (bit & (__WORDSIZE - 1));
if (woff < _jitc->blockmask.length)
_jitc->blockmask.ptr[woff] &= ~boff;
}
static jit_bool_t
_bmp_tst(jit_state_t *_jit, jit_word_t bit)
{
jit_word_t woff, boff;
woff = bit >> bmp_shift;
boff = 1LL << (bit & (__WORDSIZE - 1));
if (woff < _jitc->blockmask.length)
return ((_jitc->blockmask.ptr[woff] & boff) != 0);
return (0);
}
jit_state_t *
jit_new_state(void)
{
@ -503,7 +586,7 @@ jit_new_state(void)
jit_regset_new(_jitc->regsav);
jit_regset_new(_jitc->reglive);
jit_regset_new(_jitc->regmask);
mpz_init(_jitc->blockmask);
bmp_init();
jit_init();
@ -542,7 +625,7 @@ _jit_clear_state(jit_state_t *_jit)
* pointers to NULL to explicitly know they are released */
_jitc->head = _jitc->tail = NULL;
mpz_clear(_jitc->blockmask);
bmp_clear();
free(_jitc->data.table);
_jitc->data.table = NULL;
@ -1331,7 +1414,7 @@ _jit_reglive(jit_state_t *_jit, jit_node_t *node)
if ((value & jit_cc_a2_reg) && !(node->w.w & jit_regno_patch))
jit_regset_setbit(_jitc->reglive, node->w.w);
if (jit_regset_set_p(_jitc->regmask)) {
mpz_set_ui(_jitc->blockmask, 0);
bmp_zero();
jit_update(node->next, &_jitc->reglive, &_jitc->regmask);
if (jit_regset_set_p(_jitc->regmask)) {
/* any unresolved live state is considered as live */
@ -1548,9 +1631,9 @@ _jit_update(jit_state_t *_jit, jit_node_t *node,
switch (node->code) {
case jit_code_label:
block = _jitc->blocks.ptr + node->v.w;
if (mpz_tstbit(_jitc->blockmask, node->v.w))
if (bmp_tst(node->v.w))
return;
mpz_setbit(_jitc->blockmask, node->v.w);
bmp_set(node->v.w);
jit_regset_and(ztmp, *mask, block->reglive);
if (jit_regset_set_p(ztmp)) {
jit_regset_ior(*live, *live, ztmp);
@ -1653,9 +1736,9 @@ _jit_update(jit_state_t *_jit, jit_node_t *node,
goto restart;
}
block = _jitc->blocks.ptr + label->v.w;
if (mpz_tstbit(_jitc->blockmask, label->v.w))
if (bmp_tst(label->v.w))
continue;
mpz_setbit(_jitc->blockmask, label->v.w);
bmp_set(label->v.w);
jit_regset_and(ztmp, *mask, block->reglive);
if (jit_regset_set_p(ztmp)) {
jit_regset_ior(*live, *live, ztmp);
@ -2448,7 +2531,7 @@ static jit_bool_t
_spill_reglive_p(jit_state_t *_jit, jit_node_t *node, jit_int32_t regno)
{
if (!jit_regset_tstbit(_jitc->reglive, regno)) {
mpz_set_ui(_jitc->blockmask, 0);
bmp_zero();
jit_regset_setbit(_jitc->regmask, regno);
jit_update(node->next, &_jitc->reglive, &_jitc->regmask);
if (!jit_regset_tstbit(_jitc->reglive, regno) &&