[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 198/437: Remove non optional gmp dependency.
From: |
Andy Wingo |
Subject: |
[Guile-commits] 198/437: Remove non optional gmp dependency. |
Date: |
Mon, 2 Jul 2018 05:14:17 -0400 (EDT) |
wingo pushed a commit to branch lightning
in repository guile.
commit f341d91e2b357c87f109561c1838d15c4b79ab70
Author: pcpa <address@hidden>
Date: Fri Mar 22 18:28:42 2013 -0300
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.
---
ChangeLog | 7 +++
configure.ac | 3 --
include/lightning/jit_private.h | 6 ++-
lib/lightning.c | 99 +++++++++++++++++++++++++++++++++++++----
4 files changed, 102 insertions(+), 13 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index fa8e26d..82beb65 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2013-03-22 Paulo Andrade <address@hidden>
+
+ * 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 <address@hidden>
* include/lightning.h: Add check for __powerpc__ defined
diff --git a/configure.ac b/configure.ac
index 13a8c85..d4badf5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -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]),
diff --git a/include/lightning/jit_private.h b/include/lightning/jit_private.h
index 9b2bbba..e73d3c5 100644
--- a/include/lightning/jit_private.h
+++ b/include/lightning/jit_private.h
@@ -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;
diff --git a/lib/lightning.c b/lib/lightning.c
index 87c57c5..613e663 100644
--- a/lib/lightning.c
+++ b/lib/lightning.c
@@ -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) &&
- [Guile-commits] 163/437: Add missing jit_htonr to ppc backend., (continued)
- [Guile-commits] 163/437: Add missing jit_htonr to ppc backend., Andy Wingo, 2018/07/02
- [Guile-commits] 177/437: Correct reference to dangling pointer and better note bounds checking, Andy Wingo, 2018/07/02
- [Guile-commits] 167/437: Change type of return of jit_arg* and argument to jit_getarg*, Andy Wingo, 2018/07/02
- [Guile-commits] 168/437: Add new extensive float comparison and conversion test case, Andy Wingo, 2018/07/02
- [Guile-commits] 192/437: Correct SPARC optimized assembly example in documentation, Andy Wingo, 2018/07/02
- [Guile-commits] 93/437: subtract 1 from the final byte being flushed in PPC jit_flush_code, Andy Wingo, 2018/07/02
- [Guile-commits] 176/437: Add the new jit_name call to mark function boundaries, Andy Wingo, 2018/07/02
- [Guile-commits] 146/437: Add several arithmetic and branch tests cases., Andy Wingo, 2018/07/02
- [Guile-commits] 191/437: Add updated sparc example from lightning 1.2c documentation., Andy Wingo, 2018/07/02
- [Guile-commits] 151/437: Add new varargs test and correct related test case failures in all ports., Andy Wingo, 2018/07/02
- [Guile-commits] 198/437: Remove non optional gmp dependency.,
Andy Wingo <=
- [Guile-commits] 202/437: Ensure the end argument of __clear_cache is page aligned., Andy Wingo, 2018/07/02
- [Guile-commits] 197/437: Adapt PowerPC port to work in Darwin 32 bit and Linux 64 bit., Andy Wingo, 2018/07/02
- [Guile-commits] 184/437: Implement the "live" code to explicitly tell a register is live., Andy Wingo, 2018/07/02
- [Guile-commits] 149/437: Make all current test cases pass in Darwin PowerPC., Andy Wingo, 2018/07/02
- [Guile-commits] 113/437: Change JIT_REXTMP, JIT_R, JIT_V to use 64-bit registers, Andy Wingo, 2018/07/02
- [Guile-commits] 173/437: Add filename and line number annotation abstraction., Andy Wingo, 2018/07/02
- [Guile-commits] 201/437: Do not start over jit generation if can safely grow buffer size., Andy Wingo, 2018/07/02
- [Guile-commits] 152/437: Remove most type casts and compile test tool silently with -Wall, Andy Wingo, 2018/07/02
- [Guile-commits] 208/437: Implement fpr register arguments and minor extra fixes., Andy Wingo, 2018/07/02
- [Guile-commits] 211/437: Correct the cvt.tst test case on Itanium., Andy Wingo, 2018/07/02