[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 251/437: Add code to calculate code buffer size based on
From: |
Andy Wingo |
Subject: |
[Guile-commits] 251/437: Add code to calculate code buffer size based on devel time information. |
Date: |
Mon, 2 Jul 2018 05:14:31 -0400 (EDT) |
wingo pushed a commit to branch lightning
in repository guile.
commit b768fab8b135a722a76dc26b2037d40cdbae9b35
Author: pcpa <address@hidden>
Date: Tue Sep 24 03:31:54 2013 -0300
Add code to calculate code buffer size based on devel time information.
* lib/jit_aarch64-sz.c, lib/jit_arm-sz.c, lib/jit_hppa-sz.c,
lib/jit_ia64-sz.c, lib/jit_mips-sz.c, lib/jit_ppc-sz.c,
lib/jit_s390x-sz.c, lib/jit_size.c, lib/jit_sparc-sz.c,
lib/jit_x86-sz.c: New files implementing static tables
with longest known instructions length generated to match
a lightning instruction. These tables should make it easier
to make it very unlikely to ever miscalculate, or by too
much, the size of a code buffer.
* lib/jit_size.c: New file that aids to either collect
jit code size information, or use the information depending
on build options.
* size.c: New helper file that parses input for, and create
an initial jit_$arch-sz.c file, that needs some minor edit
for arches with multiple configurations.
* configure.ac, Makefile.am: Add the new, devel mode only
--enable-devel-get-jit-size configure option, that sets
compile time flags to collect jit code size information,
that will be used as input for the "noinst size program".
* lib/jit_aarch64.c, lib/jit_arm.c, lib/jit_disasm.c,
lib/jit_hppa.c, lib/jit_ia64.c, lib/jit_memory.c,
lib/jit_mips.c, lib/jit_ppc.c, lib/jit_s390x.c,
lib/jit_sparc.c, lib/jit_x86.c, lib/lightning.c: Minor
changes for the --enable-devel-get-jit-size build mode,
as well as the "production build mode" with jit code
size information.
---
.gitignore | 2 +
ChangeLog | 32 ++
Makefile.am | 19 +
configure.ac | 17 +-
include/lightning/jit_private.h | 29 +-
lib/Makefile.am | 17 +-
lib/jit_aarch64-sz.c | 350 +++++++++++++
lib/jit_aarch64.c | 2 +-
lib/jit_arm-sz.c | 704 ++++++++++++++++++++++++++
lib/jit_arm.c | 2 +-
lib/jit_disasm.c | 1 +
lib/jit_hppa-sz.c | 350 +++++++++++++
lib/jit_hppa.c | 2 +-
lib/jit_ia64-sz.c | 350 +++++++++++++
lib/jit_ia64.c | 7 +-
lib/jit_memory.c | 23 -
lib/jit_mips-sz.c | 704 ++++++++++++++++++++++++++
lib/jit_mips.c | 2 +-
lib/jit_ppc-sz.c | 1056 +++++++++++++++++++++++++++++++++++++++
lib/jit_ppc.c | 2 +-
lib/jit_s390x-sz.c | 350 +++++++++++++
lib/jit_s390x.c | 2 +-
lib/jit_size.c | 128 +++++
lib/jit_sparc-sz.c | 350 +++++++++++++
lib/jit_sparc.c | 2 +-
lib/jit_x86-sz.c | 700 ++++++++++++++++++++++++++
lib/jit_x86.c | 2 +-
lib/lightning.c | 28 +-
size.c | 84 ++++
29 files changed, 5269 insertions(+), 48 deletions(-)
diff --git a/.gitignore b/.gitignore
index ddfc424..4d9c3a0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,10 +13,12 @@ config.status
config.sub
configure
install-sh
+jit_*-sz.c
libtool
lightning-*.tar.*
ltmain.sh
missing
+size
stamp-h1
test-driver
check/.deps
diff --git a/ChangeLog b/ChangeLog
index 892de2a..1ea6cc1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,35 @@
+2013-10-24 Paulo Andrade <address@hidden>
+
+ * lib/jit_aarch64-sz.c, lib/jit_arm-sz.c, lib/jit_hppa-sz.c,
+ lib/jit_ia64-sz.c, lib/jit_mips-sz.c, lib/jit_ppc-sz.c,
+ lib/jit_s390x-sz.c, lib/jit_size.c, lib/jit_sparc-sz.c,
+ lib/jit_x86-sz.c: New files implementing static tables
+ with longest known instructions length generated to match
+ a lightning instruction. These tables should make it easier
+ to make it very unlikely to ever miscalculate, or by too
+ much, the size of a code buffer.
+
+ * lib/jit_size.c: New file that aids to either collect
+ jit code size information, or use the information depending
+ on build options.
+
+ * size.c: New helper file that parses input for, and create
+ an initial jit_$arch-sz.c file, that needs some minor edit
+ for arches with multiple configurations.
+
+ * configure.ac, Makefile.am: Add the new, devel mode only
+ --enable-devel-get-jit-size configure option, that sets
+ compile time flags to collect jit code size information,
+ that will be used as input for the "noinst size program".
+
+ * lib/jit_aarch64.c, lib/jit_arm.c, lib/jit_disasm.c,
+ lib/jit_hppa.c, lib/jit_ia64.c, lib/jit_memory.c,
+ lib/jit_mips.c, lib/jit_ppc.c, lib/jit_s390x.c,
+ lib/jit_sparc.c, lib/jit_x86.c, lib/lightning.c: Minor
+ changes for the --enable-devel-get-jit-size build mode,
+ as well as the "production build mode" with jit code
+ size information.
+
2013-10-14 Paulo Andrade <address@hidden>
* include/lightning.h, lib/lightning.c: Add the new
diff --git a/Makefile.am b/Makefile.am
index 79dc0f3..46b5ccc 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -21,3 +21,22 @@ SUBDIRS = \
doc \
include \
lib
+
+if get_jit_size
+JIT_SIZE_PATH = "$(top_builddir)/jit_$(cpu)-sz.c"
+AM_CPPFLAGS=-DGET_JIT_SIZE=1 -DJIT_SIZE_PATH='$(JIT_SIZE_PATH)'
+AM_CFLAGS = -I$(top_srcdir)/include -D_GNU_SOURCE $(LIGHTNING_CFLAGS)
+
+noinst_PROGRAMS = size
+size_LDADD = $(top_builddir)/lib/liblightning.la -lm $(SHLIB)
+size_SOURCES = size.c
+
+get_jit_size:: $(JIT_SIZE_PATH)
+
+$(JIT_SIZE_PATH):
+ make clean
+ make CFLAGS='-O0 -g3' check
+ $(top_builddir)/size
+
+CLEANFILES = $(JIT_SIZE_PATH)
+endif
diff --git a/configure.ac b/configure.ac
index 3741452..833447f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -27,13 +27,16 @@ case "$target_cpu" in
ia64)
case "$host_os" in
# Only supported mode
- *hpux*) CFLAGS="$CFLAGS -mlp64" ;;
+ *hpux*)
+ LIGHTNING_CFLAGS="$LIGHTNING_CFLAGS -mlp64" ;;
*) ;;
esac ;;
*mips*)
case "$host_os" in
- # Extra flags to build with gcc 3.x
- *irix*) CFLAGS="$CFLAGS -D__c99 -Drestrict=" ;;
+ # (Hack) Flags to pass configure with gcc 3.x
+ # Should not set LIGHTNINT_CFLAGS
+ *irix*)
+ CFLAGS="$CFLAGS -D__c99 -Drestrict=";;
*) ;;
esac ;;
*) ;;
@@ -89,6 +92,13 @@ else
DEBUG=no
fi
+# This option is only useful during development.
+AC_ARG_ENABLE(devel-get-jit-size,
+ AS_HELP_STRING([--enable-devel-get-jit-size],
+ [Devel mode to regenerate jit size information]),
+ [GET_JIT_SIZE=$enableval], [GET_JIT_SIZE=no])
+AM_CONDITIONAL(get_jit_size, [test $GET_JIT_SIZE = yes])
+
case "$host_os" in
*bsd*) SHLIB="" ;;
*hpux*) SHLIB="-ldld" ;;
@@ -213,6 +223,7 @@ if test $cpu=arm; then
AC_CHECK_LIB(m, sqrtf, ,
[AC_MSG_ERROR([sqrtf required but not available])])
fi
+AC_SUBST(cpu)
AC_SUBST([LIGHTNING_CFLAGS])
diff --git a/include/lightning/jit_private.h b/include/lightning/jit_private.h
index f260da2..7172994 100644
--- a/include/lightning/jit_private.h
+++ b/include/lightning/jit_private.h
@@ -432,8 +432,14 @@ struct jit_compiler {
} prolog;
jit_bool_t jump;
#endif
- /* global flag for code buffer heuristic size computation */
+#if GET_JIT_SIZE
+ /* Temporary storage to calculate instructions length */
+ jit_word_t size;
+ /* Global flag for code buffer heuristic size computation */
jit_word_t mult;
+ /* Pointer to code to prevent miscalculation if reallocating buffer */
+ jit_uint8_t *cptr;
+#endif
};
#define _jitc _jit->comp
@@ -557,13 +563,26 @@ extern void jit_alloc(jit_pointer_t*, jit_word_t);
extern void jit_realloc(jit_pointer_t*, jit_word_t, jit_word_t);
void jit_free(jit_pointer_t*);
-#if HAVE_MREMAP
-# define jit_remap() _jit_remap(_jit)
-extern jit_bool_t _jit_remap(jit_state_t*);
+extern void jit_init_size(void);
+extern void jit_finish_size(void);
+
+#if GET_JIT_SIZE
+# define jit_size_prepare() _jit_size_prepare(_jit)
+extern void
+_jit_size_prepare(jit_state_t*);
+
+# define jit_size_collect(node) _jit_size_collect(_jit, node)
+extern void
+_jit_size_collect(jit_state_t*, jit_node_t*);
#else
-# define jit_remap() 0
+# define jit_get_size() _jit_get_size(_jit)
+extern jit_word_t
+_jit_get_size(jit_state_t*);
#endif
+extern jit_word_t
+jit_get_max_instr(void);
+
/*
* Externs
*/
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 4f16822..f9f44f5 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -17,41 +17,56 @@
AM_CFLAGS = -I$(top_srcdir)/include -D_GNU_SOURCE $(LIGHTNING_CFLAGS)
liblightning_LTLIBRARIES = liblightning.la
+if get_jit_size
+JIT_SIZE_PATH = "$(top_builddir)/jit_$(cpu)-sz.c"
+AM_CPPFLAGS=-DGET_JIT_SIZE=1 -DJIT_SIZE_PATH='$(JIT_SIZE_PATH)'
+endif
+
liblightningdir = $(libdir)
liblightning_la_SOURCES = \
jit_disasm.c \
jit_memory.c \
jit_note.c \
jit_print.c \
+ jit_size.c \
lightning.c
EXTRA_DIST = \
jit_aarch64.c \
jit_aarch64-cpu.c \
jit_aarch64-fpu.c \
+ jit_aarch64-sz.c \
jit_arm.c \
jit_arm-cpu.c \
jit_arm-swf.c \
jit_arm-vfp.c \
+ jit_arm-sz.c \
jit_hppa.c \
jit_hppa-cpu.c \
jit_hppa-fpu.c \
+ jit_hppa-sz.c \
jit_ia64.c \
jit_ia64-cpu.c \
jit_ia64-fpu.c \
+ jit_ia64-sz.c \
jit_mips.c \
jit_mips-cpu.c \
jit_mips-fpu.c \
+ jit_mips-sz.c \
jit_ppc.c \
jit_ppc-cpu.c \
jit_ppc-fpu.c \
+ jit_ppc-sz.c \
jit_s390x.c \
jit_s390x-cpu.c \
jit_s390x-fpu.c \
+ jit_s390x-sz.c \
jit_sparc.c \
jit_sparc-cpu.c \
jit_sparc-fpu.c \
+ jit_sparc-sz.c \
jit_x86.c \
jit_x86-cpu.c \
jit_x86-sse.c \
- jit_x86-x87.c
+ jit_x86-x87.c \
+ jit_x86-sz.c
diff --git a/lib/jit_aarch64-sz.c b/lib/jit_aarch64-sz.c
new file mode 100644
index 0000000..58efa4e
--- /dev/null
+++ b/lib/jit_aarch64-sz.c
@@ -0,0 +1,350 @@
+
+#if __WORDSIZE == 64
+#define JIT_INSTR_MAX 64
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 64,
+ 0,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 8,
+ 4,
+ 16,
+ 4,
+ 12,
+ 4,
+ 8,
+ 4,
+ 12,
+ 12,
+ 20,
+ 12,
+ 20,
+ 4,
+ 12,
+ 4,
+ 12,
+ 20,
+ 16,
+ 20,
+ 16,
+ 12,
+ 20,
+ 12,
+ 20,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 4,
+ 16,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 8,
+ 8,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 24,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 24,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 0,
+ 20,
+ 4,
+ 20,
+ 64,
+ 0,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 4,
+ 4,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 16,
+ 24,
+ 8,
+ 16,
+ 8,
+ 16,
+ 16,
+ 24,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 4,
+ 4,
+ 4,
+ 4,
+ 8,
+ 8,
+ 16,
+ 8,
+ 8,
+ 8,
+ 16,
+ 8,
+ 8,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 16,
+ 24,
+ 8,
+ 16,
+ 8,
+ 16,
+ 16,
+ 24,
+ 8,
+ 16,
+ 8,
+ 16,
+ 0,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 4,
+ 4,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 16,
+ 24,
+ 8,
+ 16,
+ 8,
+ 16,
+ 16,
+ 24,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 4,
+ 4,
+ 4,
+ 4,
+ 12,
+ 8,
+ 16,
+ 8,
+ 8,
+ 8,
+ 16,
+ 8,
+ 8,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 20,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 16,
+ 24,
+ 8,
+ 16,
+ 8,
+ 16,
+ 16,
+ 24,
+ 8,
+ 16,
+ 8,
+ 16,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+#endif /* __WORDSIZE */
diff --git a/lib/jit_aarch64.c b/lib/jit_aarch64.c
index 8df918e..b685021 100644
--- a/lib/jit_aarch64.c
+++ b/lib/jit_aarch64.c
@@ -711,7 +711,7 @@ _emit_code(jit_state_t *_jit)
} \
break
for (node = _jitc->head; node; node = node->next) {
- if (_jit->pc.uc >= _jitc->code.end && !jit_remap())
+ if (_jit->pc.uc >= _jitc->code.end)
return (NULL);
value = jit_classify(node->code);
diff --git a/lib/jit_arm-sz.c b/lib/jit_arm-sz.c
new file mode 100644
index 0000000..df3ca3e
--- /dev/null
+++ b/lib/jit_arm-sz.c
@@ -0,0 +1,704 @@
+
+#if __WORDSIZE == 32
+#if defined(__ARM_PCS_VFP)
+#define JIT_INSTR_MAX 44
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26,
+ 0,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 4,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 4,
+ 4,
+ 8,
+ 4,
+ 12,
+ 4,
+ 8,
+ 32,
+ 44,
+ 24,
+ 28,
+ 18,
+ 22,
+ 18,
+ 22,
+ 24,
+ 28,
+ 24,
+ 28,
+ 4,
+ 4,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 4,
+ 8,
+ 4,
+ 4,
+ 4,
+ 4,
+ 0,
+ 0,
+ 4,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 0,
+ 0,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 0,
+ 0,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 16,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 16,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 0,
+ 4,
+ 4,
+ 12,
+ 16,
+ 0,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 4,
+ 4,
+ 18,
+ 30,
+ 20,
+ 32,
+ 18,
+ 30,
+ 18,
+ 30,
+ 18,
+ 30,
+ 18,
+ 30,
+ 18,
+ 30,
+ 18,
+ 30,
+ 24,
+ 36,
+ 18,
+ 30,
+ 18,
+ 30,
+ 24,
+ 36,
+ 18,
+ 30,
+ 18,
+ 30,
+ 8,
+ 0,
+ 8,
+ 4,
+ 4,
+ 12,
+ 4,
+ 12,
+ 8,
+ 4,
+ 4,
+ 12,
+ 8,
+ 4,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 16,
+ 28,
+ 16,
+ 28,
+ 20,
+ 32,
+ 16,
+ 28,
+ 12,
+ 24,
+ 20,
+ 32,
+ 12,
+ 24,
+ 12,
+ 24,
+ 0,
+ 4,
+ 20,
+ 4,
+ 20,
+ 4,
+ 20,
+ 4,
+ 20,
+ 4,
+ 4,
+ 4,
+ 18,
+ 34,
+ 20,
+ 36,
+ 18,
+ 34,
+ 18,
+ 34,
+ 18,
+ 34,
+ 18,
+ 34,
+ 18,
+ 34,
+ 18,
+ 34,
+ 24,
+ 40,
+ 18,
+ 34,
+ 18,
+ 34,
+ 24,
+ 40,
+ 18,
+ 34,
+ 18,
+ 34,
+ 8,
+ 0,
+ 8,
+ 4,
+ 4,
+ 16,
+ 4,
+ 12,
+ 8,
+ 4,
+ 4,
+ 12,
+ 8,
+ 4,
+ 12,
+ 28,
+ 12,
+ 28,
+ 12,
+ 28,
+ 12,
+ 28,
+ 12,
+ 28,
+ 12,
+ 28,
+ 16,
+ 32,
+ 16,
+ 32,
+ 20,
+ 36,
+ 16,
+ 32,
+ 12,
+ 28,
+ 20,
+ 36,
+ 12,
+ 28,
+ 12,
+ 28,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4,
+ 8,
+ 0,
+ 0,
+ 0,
+ 0,
+#endif /* __ARM_PCS_VFP */
+#endif /* __WORDSIZE */
+
+#if __WORDSIZE == 32
+#if !defined(__ARM_PCS_VFP)
+#define JIT_INSTR_MAX 74
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18,
+ 0,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 4,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 4,
+ 4,
+ 8,
+ 4,
+ 12,
+ 4,
+ 8,
+ 32,
+ 44,
+ 24,
+ 28,
+ 18,
+ 22,
+ 18,
+ 22,
+ 24,
+ 28,
+ 24,
+ 28,
+ 4,
+ 4,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 4,
+ 8,
+ 4,
+ 4,
+ 4,
+ 4,
+ 0,
+ 0,
+ 4,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 0,
+ 0,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 0,
+ 0,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 16,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 16,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 0,
+ 4,
+ 4,
+ 12,
+ 12,
+ 0,
+ 22,
+ 22,
+ 22,
+ 22,
+ 22,
+ 22,
+ 22,
+ 22,
+ 12,
+ 12,
+ 18,
+ 20,
+ 30,
+ 20,
+ 32,
+ 20,
+ 30,
+ 20,
+ 30,
+ 20,
+ 30,
+ 24,
+ 30,
+ 50,
+ 58,
+ 50,
+ 58,
+ 50,
+ 58,
+ 50,
+ 58,
+ 50,
+ 58,
+ 54,
+ 62,
+ 24,
+ 30,
+ 50,
+ 58,
+ 16,
+ 0,
+ 32,
+ 22,
+ 8,
+ 12,
+ 8,
+ 16,
+ 8,
+ 8,
+ 8,
+ 16,
+ 8,
+ 8,
+ 24,
+ 24,
+ 24,
+ 28,
+ 24,
+ 44,
+ 24,
+ 28,
+ 24,
+ 28,
+ 24,
+ 28,
+ 24,
+ 28,
+ 24,
+ 28,
+ 52,
+ 60,
+ 24,
+ 28,
+ 24,
+ 28,
+ 52,
+ 60,
+ 24,
+ 28,
+ 24,
+ 28,
+ 0,
+ 34,
+ 36,
+ 34,
+ 36,
+ 34,
+ 36,
+ 34,
+ 36,
+ 20,
+ 20,
+ 26,
+ 28,
+ 34,
+ 28,
+ 36,
+ 28,
+ 34,
+ 28,
+ 34,
+ 28,
+ 34,
+ 32,
+ 34,
+ 66,
+ 70,
+ 66,
+ 70,
+ 66,
+ 70,
+ 66,
+ 70,
+ 66,
+ 70,
+ 70,
+ 74,
+ 32,
+ 34,
+ 66,
+ 70,
+ 20,
+ 0,
+ 36,
+ 22,
+ 16,
+ 20,
+ 16,
+ 24,
+ 20,
+ 16,
+ 16,
+ 24,
+ 20,
+ 16,
+ 32,
+ 34,
+ 32,
+ 34,
+ 32,
+ 50,
+ 32,
+ 34,
+ 32,
+ 34,
+ 32,
+ 34,
+ 32,
+ 34,
+ 32,
+ 34,
+ 68,
+ 72,
+ 32,
+ 34,
+ 32,
+ 34,
+ 68,
+ 72,
+ 32,
+ 34,
+ 32,
+ 34,
+ 4,
+ 8,
+ 0,
+ 6,
+ 8,
+ 12,
+ 12,
+ 0,
+ 0,
+ 0,
+ 0,
+#endif /* __ARM_PCS_VFP */
+#endif /* __WORDSIZE */
diff --git a/lib/jit_arm.c b/lib/jit_arm.c
index 0f291b1..9dd97f6 100644
--- a/lib/jit_arm.c
+++ b/lib/jit_arm.c
@@ -1026,7 +1026,7 @@ _emit_code(jit_state_t *_jit)
} \
break
for (node = _jitc->head; node; node = node->next) {
- if (_jit->pc.uc >= _jitc->code.end && !jit_remap())
+ if (_jit->pc.uc >= _jitc->code.end)
return (NULL);
value = jit_classify(node->code);
diff --git a/lib/jit_disasm.c b/lib/jit_disasm.c
index af2cb52..00cd71c 100644
--- a/lib/jit_disasm.c
+++ b/lib/jit_disasm.c
@@ -225,6 +225,7 @@ disasm_print_address(bfd_vma addr, struct disassemble_info
*info)
(*info->fprintf_func)(info->stream, "0x%s", buffer);
# define _jit disasm_jit
+# undef jit_pointer_p
# define jit_pointer_p(u) \
((u) >= _jit->code.ptr && (u) < _jit->pc.uc)
if (jit_pointer_p((jit_uint8_t *)(jit_word_t)addr)) {
diff --git a/lib/jit_hppa-sz.c b/lib/jit_hppa-sz.c
new file mode 100644
index 0000000..392674e
--- /dev/null
+++ b/lib/jit_hppa-sz.c
@@ -0,0 +1,350 @@
+
+#if __WORDSIZE == 32
+#define JIT_INSTR_MAX 64
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 64,
+ 0,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 8,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 8,
+ 28,
+ 36,
+ 40,
+ 44,
+ 32,
+ 40,
+ 36,
+ 40,
+ 36,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 36,
+ 40,
+ 36,
+ 40,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 4,
+ 4,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 12,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 4,
+ 8,
+ 4,
+ 4,
+ 4,
+ 4,
+ 0,
+ 0,
+ 4,
+ 8,
+ 12,
+ 4,
+ 8,
+ 8,
+ 12,
+ 4,
+ 8,
+ 4,
+ 8,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8,
+ 8,
+ 4,
+ 4,
+ 8,
+ 8,
+ 4,
+ 4,
+ 4,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 8,
+ 0,
+ 0,
+ 8,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 0,
+ 0,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 12,
+ 8,
+ 8,
+ 8,
+ 16,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 16,
+ 12,
+ 16,
+ 12,
+ 16,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 12,
+ 16,
+ 16,
+ 20,
+ 12,
+ 16,
+ 16,
+ 20,
+ 0,
+ 12,
+ 40,
+ 44,
+ 64,
+ 0,
+ 4,
+ 16,
+ 4,
+ 16,
+ 4,
+ 16,
+ 4,
+ 16,
+ 4,
+ 4,
+ 4,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 12,
+ 0,
+ 12,
+ 4,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 4,
+ 4,
+ 12,
+ 8,
+ 4,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 0,
+ 4,
+ 16,
+ 4,
+ 16,
+ 4,
+ 16,
+ 4,
+ 16,
+ 4,
+ 4,
+ 4,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 12,
+ 0,
+ 12,
+ 4,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 4,
+ 4,
+ 12,
+ 8,
+ 4,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+#endif /* __WORDSIZE */
diff --git a/lib/jit_hppa.c b/lib/jit_hppa.c
index 56f2f8d..192da93 100644
--- a/lib/jit_hppa.c
+++ b/lib/jit_hppa.c
@@ -716,7 +716,7 @@ _emit_code(jit_state_t *_jit)
} \
break
for (node = _jitc->head; node; node = node->next) {
- if (_jit->pc.uc >= _jitc->code.end && !jit_remap())
+ if (_jit->pc.uc >= _jitc->code.end)
return (NULL);
value = jit_classify(node->code);
diff --git a/lib/jit_ia64-sz.c b/lib/jit_ia64-sz.c
new file mode 100644
index 0000000..1185ada
--- /dev/null
+++ b/lib/jit_ia64-sz.c
@@ -0,0 +1,350 @@
+
+#if __WORDSIZE == 64
+#define JIT_INSTR_MAX 144
+ 0,
+ 0,
+ 0,
+ 0,
+ 16,
+ 16,
+ 48,
+ 128,
+ 0,
+ 16,
+ 32,
+ 48,
+ 48,
+ 64,
+ 64,
+ 16,
+ 32,
+ 48,
+ 48,
+ 64,
+ 64,
+ 32,
+ 48,
+ 96,
+ 80,
+ 96,
+ 80,
+ 64,
+ 80,
+ 64,
+ 80,
+ 128,
+ 112,
+ 128,
+ 112,
+ 64,
+ 80,
+ 64,
+ 80,
+ 16,
+ 32,
+ 16,
+ 32,
+ 16,
+ 32,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 0,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 32,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 0,
+ 16,
+ 32,
+ 0,
+ 16,
+ 16,
+ 32,
+ 0,
+ 16,
+ 16,
+ 32,
+ 0,
+ 16,
+ 16,
+ 16,
+ 32,
+ 48,
+ 16,
+ 32,
+ 32,
+ 48,
+ 16,
+ 32,
+ 32,
+ 48,
+ 16,
+ 32,
+ 16,
+ 32,
+ 16,
+ 32,
+ 0,
+ 32,
+ 16,
+ 32,
+ 0,
+ 32,
+ 16,
+ 16,
+ 32,
+ 16,
+ 16,
+ 16,
+ 32,
+ 16,
+ 16,
+ 16,
+ 16,
+ 32,
+ 32,
+ 32,
+ 32,
+ 16,
+ 64,
+ 64,
+ 32,
+ 48,
+ 32,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 64,
+ 64,
+ 32,
+ 32,
+ 32,
+ 32,
+ 112,
+ 112,
+ 64,
+ 64,
+ 112,
+ 112,
+ 64,
+ 64,
+ 112,
+ 112,
+ 64,
+ 64,
+ 112,
+ 112,
+ 64,
+ 64,
+ 0,
+ 48,
+ 32,
+ 64,
+ 144,
+ 0,
+ 0,
+ 32,
+ 16,
+ 16,
+ 0,
+ 16,
+ 144,
+ 144,
+ 16,
+ 16,
+ 80,
+ 16,
+ 48,
+ 16,
+ 48,
+ 16,
+ 48,
+ 16,
+ 48,
+ 16,
+ 48,
+ 16,
+ 48,
+ 16,
+ 48,
+ 16,
+ 48,
+ 48,
+ 80,
+ 16,
+ 48,
+ 16,
+ 48,
+ 48,
+ 80,
+ 16,
+ 48,
+ 16,
+ 48,
+ 32,
+ 32,
+ 32,
+ 16,
+ 16,
+ 48,
+ 16,
+ 16,
+ 0,
+ 32,
+ 16,
+ 16,
+ 16,
+ 16,
+ 32,
+ 64,
+ 48,
+ 64,
+ 64,
+ 96,
+ 48,
+ 64,
+ 32,
+ 64,
+ 48,
+ 64,
+ 48,
+ 64,
+ 48,
+ 64,
+ 112,
+ 144,
+ 48,
+ 64,
+ 48,
+ 64,
+ 96,
+ 128,
+ 48,
+ 64,
+ 32,
+ 64,
+ 0,
+ 0,
+ 32,
+ 16,
+ 16,
+ 0,
+ 16,
+ 128,
+ 144,
+ 16,
+ 16,
+ 80,
+ 16,
+ 48,
+ 16,
+ 48,
+ 16,
+ 48,
+ 16,
+ 48,
+ 16,
+ 48,
+ 16,
+ 48,
+ 16,
+ 48,
+ 16,
+ 48,
+ 48,
+ 80,
+ 16,
+ 48,
+ 16,
+ 48,
+ 48,
+ 80,
+ 16,
+ 48,
+ 16,
+ 48,
+ 32,
+ 32,
+ 32,
+ 16,
+ 16,
+ 48,
+ 16,
+ 16,
+ 0,
+ 32,
+ 16,
+ 16,
+ 16,
+ 16,
+ 32,
+ 64,
+ 48,
+ 64,
+ 64,
+ 96,
+ 48,
+ 80,
+ 32,
+ 64,
+ 48,
+ 64,
+ 48,
+ 64,
+ 48,
+ 64,
+ 112,
+ 144,
+ 48,
+ 64,
+ 48,
+ 64,
+ 96,
+ 128,
+ 48,
+ 64,
+ 32,
+ 64,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16,
+ 32,
+ 0,
+ 0,
+#endif /* __WORDSIZE */
diff --git a/lib/jit_ia64.c b/lib/jit_ia64.c
index eabc5cb..0894dd0 100644
--- a/lib/jit_ia64.c
+++ b/lib/jit_ia64.c
@@ -736,7 +736,6 @@ _jit_retval_d(jit_state_t *_jit, jit_int32_t r0)
jit_pointer_t
_emit_code(jit_state_t *_jit)
{
- jit_uint8_t *end;
jit_node_t *node;
jit_node_t *temp;
jit_word_t word;
@@ -850,11 +849,13 @@ _emit_code(jit_state_t *_jit)
patch(word, node); \
} \
break
+#if GET_JIT_SIZE
/* default of 64 bytes is too low for some possible
* quite long code generation sequences, e.g. qdivi */
- end = _jit->code.ptr + _jit->code.length - 4096;
+ _jitc->code.end = _jit->code.ptr + _jit->code.length - 4096;
+#endif
for (node = _jitc->head; node; node = node->next) {
- if (_jit->pc.uc >= end && !jit_remap())
+ if (_jit->pc.uc >= _jitc->code.end)
return (NULL);
value = jit_classify(node->code);
diff --git a/lib/jit_memory.c b/lib/jit_memory.c
index 199979f..39cc549 100644
--- a/lib/jit_memory.c
+++ b/lib/jit_memory.c
@@ -86,29 +86,6 @@ jit_free(jit_pointer_t *ptr)
*ptr = NULL;
}
-#if HAVE_MREMAP
-jit_bool_t
-_jit_remap(jit_state_t *_jit)
-{
- jit_uint8_t *code;
- jit_word_t length;
-
- length = _jitc->pool.length * 1024 * (_jitc->mult + 1);
-
- code = mremap(_jit->code.ptr, _jit->code.length, length, 0, NULL);
- if (code != MAP_FAILED) {
- assert(code == _jit->code.ptr);
- ++_jitc->mult;
- _jit->code.length = length;
- _jitc->code.end = _jit->code.ptr + _jit->code.length - 64;
-
- return (1);
- }
-
- return (0);
-}
-#endif
-
static void *
jit_default_alloc_func(size_t size)
{
diff --git a/lib/jit_mips-sz.c b/lib/jit_mips-sz.c
new file mode 100644
index 0000000..b3350df
--- /dev/null
+++ b/lib/jit_mips-sz.c
@@ -0,0 +1,704 @@
+
+#if __WORDSIZE == 32
+#if defined(_ABIN32)
+#define JIT_INSTR_MAX 44
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 44,
+ 0,
+ 4,
+ 12,
+ 12,
+ 20,
+ 28,
+ 28,
+ 4,
+ 12,
+ 12,
+ 20,
+ 28,
+ 28,
+ 8,
+ 16,
+ 12,
+ 20,
+ 12,
+ 20,
+ 8,
+ 16,
+ 8,
+ 16,
+ 12,
+ 16,
+ 12,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 8,
+ 4,
+ 4,
+ 4,
+ 4,
+ 8,
+ 12,
+ 8,
+ 12,
+ 12,
+ 12,
+ 8,
+ 12,
+ 8,
+ 12,
+ 4,
+ 8,
+ 4,
+ 8,
+ 8,
+ 8,
+ 4,
+ 8,
+ 8,
+ 4,
+ 8,
+ 4,
+ 0,
+ 0,
+ 4,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 0,
+ 0,
+ 8,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 0,
+ 0,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 16,
+ 12,
+ 16,
+ 8,
+ 16,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 16,
+ 12,
+ 16,
+ 8,
+ 16,
+ 12,
+ 12,
+ 12,
+ 12,
+ 28,
+ 28,
+ 16,
+ 20,
+ 28,
+ 28,
+ 16,
+ 20,
+ 28,
+ 28,
+ 16,
+ 20,
+ 28,
+ 28,
+ 16,
+ 20,
+ 0,
+ 8,
+ 12,
+ 16,
+ 44,
+ 0,
+ 4,
+ 16,
+ 4,
+ 16,
+ 4,
+ 16,
+ 4,
+ 16,
+ 4,
+ 4,
+ 4,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 8,
+ 0,
+ 8,
+ 4,
+ 4,
+ 12,
+ 4,
+ 12,
+ 8,
+ 4,
+ 4,
+ 12,
+ 8,
+ 4,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 0,
+ 4,
+ 16,
+ 4,
+ 16,
+ 4,
+ 16,
+ 4,
+ 16,
+ 4,
+ 4,
+ 4,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 8,
+ 0,
+ 8,
+ 4,
+ 4,
+ 12,
+ 4,
+ 12,
+ 8,
+ 4,
+ 4,
+ 12,
+ 8,
+ 4,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4,
+ 12,
+ 0,
+ 0,
+#endif /* _ABIN32 */
+#endif /* __WORDSIZE */
+
+#if __WORDSIZE == 32
+#if !defined(_ABIN32)
+#define JIT_INSTR_MAX 96
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 96,
+ 0,
+ 4,
+ 12,
+ 12,
+ 20,
+ 28,
+ 28,
+ 4,
+ 12,
+ 12,
+ 20,
+ 28,
+ 28,
+ 8,
+ 16,
+ 12,
+ 20,
+ 12,
+ 20,
+ 8,
+ 16,
+ 8,
+ 16,
+ 12,
+ 16,
+ 12,
+ 16,
+ 8,
+ 16,
+ 8,
+ 16,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 8,
+ 4,
+ 4,
+ 4,
+ 4,
+ 8,
+ 12,
+ 8,
+ 12,
+ 12,
+ 12,
+ 8,
+ 12,
+ 8,
+ 12,
+ 4,
+ 8,
+ 4,
+ 8,
+ 8,
+ 8,
+ 4,
+ 8,
+ 8,
+ 4,
+ 8,
+ 4,
+ 0,
+ 0,
+ 56,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 0,
+ 0,
+ 8,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 0,
+ 0,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 16,
+ 12,
+ 16,
+ 8,
+ 16,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 16,
+ 12,
+ 16,
+ 8,
+ 16,
+ 12,
+ 12,
+ 12,
+ 12,
+ 28,
+ 28,
+ 16,
+ 20,
+ 28,
+ 28,
+ 16,
+ 20,
+ 28,
+ 28,
+ 16,
+ 20,
+ 28,
+ 28,
+ 16,
+ 20,
+ 0,
+ 8,
+ 12,
+ 16,
+ 96,
+ 0,
+ 4,
+ 16,
+ 4,
+ 16,
+ 4,
+ 16,
+ 4,
+ 16,
+ 4,
+ 4,
+ 4,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 8,
+ 0,
+ 8,
+ 4,
+ 4,
+ 12,
+ 4,
+ 12,
+ 8,
+ 4,
+ 4,
+ 12,
+ 8,
+ 4,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 0,
+ 4,
+ 20,
+ 4,
+ 20,
+ 4,
+ 20,
+ 4,
+ 20,
+ 4,
+ 4,
+ 4,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 8,
+ 0,
+ 8,
+ 4,
+ 4,
+ 24,
+ 8,
+ 16,
+ 12,
+ 8,
+ 8,
+ 16,
+ 12,
+ 8,
+ 12,
+ 28,
+ 12,
+ 28,
+ 12,
+ 28,
+ 12,
+ 28,
+ 12,
+ 28,
+ 12,
+ 36,
+ 12,
+ 36,
+ 12,
+ 36,
+ 12,
+ 36,
+ 12,
+ 36,
+ 12,
+ 36,
+ 12,
+ 28,
+ 12,
+ 28,
+ 12,
+ 36,
+ 4,
+ 8,
+ 0,
+ 0,
+ 4,
+ 8,
+ 8,
+ 0,
+ 0,
+ 0,
+ 0,
+#endif /* _ABIN32 */
+#endif /* __WORDSIZE */
diff --git a/lib/jit_mips.c b/lib/jit_mips.c
index c18a043..1acbd1d 100644
--- a/lib/jit_mips.c
+++ b/lib/jit_mips.c
@@ -972,7 +972,7 @@ _emit_code(jit_state_t *_jit)
} \
break
for (node = _jitc->head; node; node = node->next) {
- if (_jit->pc.uc >= _jitc->code.end && !jit_remap())
+ if (_jit->pc.uc >= _jitc->code.end)
return (NULL);
value = jit_classify(node->code);
diff --git a/lib/jit_ppc-sz.c b/lib/jit_ppc-sz.c
new file mode 100644
index 0000000..f165237
--- /dev/null
+++ b/lib/jit_ppc-sz.c
@@ -0,0 +1,1056 @@
+
+#if __WORDSIZE == 32
+#if defined(__ppc__)
+#define JIT_INSTR_MAX 44
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 44,
+ 0,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 8,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 8,
+ 4,
+ 12,
+ 12,
+ 16,
+ 12,
+ 16,
+ 4,
+ 12,
+ 4,
+ 12,
+ 20,
+ 16,
+ 20,
+ 16,
+ 12,
+ 20,
+ 12,
+ 20,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 12,
+ 12,
+ 12,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 12,
+ 12,
+ 16,
+ 16,
+ 16,
+ 16,
+ 12,
+ 12,
+ 12,
+ 12,
+ 16,
+ 16,
+ 4,
+ 8,
+ 4,
+ 4,
+ 4,
+ 4,
+ 0,
+ 0,
+ 4,
+ 8,
+ 12,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 8,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8,
+ 8,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 8,
+ 0,
+ 0,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 0,
+ 0,
+ 8,
+ 8,
+ 8,
+ 12,
+ 8,
+ 8,
+ 8,
+ 12,
+ 8,
+ 16,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 16,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 16,
+ 12,
+ 12,
+ 12,
+ 16,
+ 12,
+ 12,
+ 12,
+ 16,
+ 12,
+ 16,
+ 12,
+ 16,
+ 12,
+ 16,
+ 0,
+ 4,
+ 8,
+ 16,
+ 44,
+ 0,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 4,
+ 4,
+ 12,
+ 20,
+ 16,
+ 24,
+ 12,
+ 20,
+ 16,
+ 24,
+ 12,
+ 20,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 12,
+ 20,
+ 12,
+ 0,
+ 20,
+ 4,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 4,
+ 4,
+ 8,
+ 4,
+ 4,
+ 8,
+ 16,
+ 12,
+ 20,
+ 8,
+ 16,
+ 12,
+ 20,
+ 8,
+ 16,
+ 8,
+ 16,
+ 12,
+ 20,
+ 8,
+ 16,
+ 12,
+ 20,
+ 8,
+ 16,
+ 12,
+ 20,
+ 12,
+ 20,
+ 8,
+ 16,
+ 8,
+ 16,
+ 0,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 4,
+ 4,
+ 12,
+ 20,
+ 16,
+ 24,
+ 12,
+ 20,
+ 16,
+ 24,
+ 12,
+ 20,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 12,
+ 20,
+ 12,
+ 0,
+ 20,
+ 4,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 4,
+ 4,
+ 8,
+ 4,
+ 4,
+ 8,
+ 16,
+ 12,
+ 20,
+ 8,
+ 16,
+ 12,
+ 20,
+ 8,
+ 16,
+ 8,
+ 16,
+ 12,
+ 20,
+ 8,
+ 16,
+ 12,
+ 20,
+ 8,
+ 16,
+ 12,
+ 20,
+ 12,
+ 20,
+ 8,
+ 16,
+ 8,
+ 16,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+#endif /* __ppc__ */
+#endif /* __WORDSIZE */
+
+#if __WORDSIZE == 32
+#if defined(__powerpc__)
+#define JIT_INSTR_MAX 72
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 72,
+ 0,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 8,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 8,
+ 4,
+ 12,
+ 12,
+ 16,
+ 12,
+ 16,
+ 4,
+ 12,
+ 4,
+ 12,
+ 20,
+ 16,
+ 20,
+ 16,
+ 12,
+ 20,
+ 12,
+ 20,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 12,
+ 12,
+ 12,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 12,
+ 12,
+ 16,
+ 16,
+ 16,
+ 16,
+ 12,
+ 12,
+ 12,
+ 12,
+ 16,
+ 16,
+ 4,
+ 8,
+ 4,
+ 4,
+ 4,
+ 4,
+ 0,
+ 0,
+ 4,
+ 8,
+ 12,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 8,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8,
+ 8,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 8,
+ 0,
+ 0,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 0,
+ 0,
+ 8,
+ 8,
+ 8,
+ 12,
+ 8,
+ 8,
+ 8,
+ 12,
+ 8,
+ 16,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 16,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 16,
+ 12,
+ 12,
+ 12,
+ 16,
+ 12,
+ 12,
+ 12,
+ 16,
+ 12,
+ 16,
+ 12,
+ 16,
+ 12,
+ 16,
+ 0,
+ 4,
+ 28,
+ 40,
+ 72,
+ 0,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 4,
+ 4,
+ 12,
+ 20,
+ 16,
+ 24,
+ 12,
+ 20,
+ 16,
+ 24,
+ 12,
+ 20,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 12,
+ 20,
+ 12,
+ 0,
+ 20,
+ 4,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 4,
+ 4,
+ 8,
+ 4,
+ 4,
+ 8,
+ 16,
+ 12,
+ 20,
+ 8,
+ 16,
+ 12,
+ 20,
+ 8,
+ 16,
+ 8,
+ 16,
+ 12,
+ 20,
+ 8,
+ 16,
+ 12,
+ 20,
+ 8,
+ 16,
+ 12,
+ 20,
+ 12,
+ 20,
+ 8,
+ 16,
+ 8,
+ 16,
+ 0,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 4,
+ 4,
+ 12,
+ 20,
+ 16,
+ 24,
+ 12,
+ 20,
+ 16,
+ 24,
+ 12,
+ 20,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 16,
+ 24,
+ 12,
+ 20,
+ 12,
+ 0,
+ 20,
+ 4,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 4,
+ 4,
+ 8,
+ 4,
+ 4,
+ 8,
+ 16,
+ 12,
+ 20,
+ 8,
+ 16,
+ 12,
+ 20,
+ 8,
+ 16,
+ 8,
+ 16,
+ 12,
+ 20,
+ 8,
+ 16,
+ 12,
+ 20,
+ 8,
+ 16,
+ 12,
+ 20,
+ 12,
+ 20,
+ 8,
+ 16,
+ 8,
+ 16,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+#endif /* __powerpc__ */
+#endif /* __WORDSIZE */
+
+#if __WORDSIZE == 64
+#if defined(__powerpc__)
+#define JIT_INSTR_MAX 72
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 72,
+ 0,
+ 4,
+ 28,
+ 4,
+ 28,
+ 4,
+ 8,
+ 4,
+ 28,
+ 4,
+ 28,
+ 4,
+ 8,
+ 4,
+ 28,
+ 12,
+ 28,
+ 12,
+ 28,
+ 4,
+ 28,
+ 4,
+ 28,
+ 20,
+ 16,
+ 20,
+ 16,
+ 12,
+ 36,
+ 12,
+ 36,
+ 4,
+ 28,
+ 4,
+ 28,
+ 4,
+ 28,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 12,
+ 12,
+ 12,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 12,
+ 12,
+ 16,
+ 16,
+ 16,
+ 16,
+ 12,
+ 12,
+ 12,
+ 12,
+ 16,
+ 16,
+ 4,
+ 36,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 8,
+ 28,
+ 4,
+ 24,
+ 4,
+ 24,
+ 4,
+ 24,
+ 4,
+ 24,
+ 4,
+ 24,
+ 4,
+ 24,
+ 8,
+ 8,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 24,
+ 4,
+ 24,
+ 4,
+ 24,
+ 4,
+ 24,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 8,
+ 8,
+ 8,
+ 12,
+ 8,
+ 8,
+ 8,
+ 12,
+ 8,
+ 44,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 36,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 16,
+ 12,
+ 12,
+ 12,
+ 16,
+ 12,
+ 12,
+ 12,
+ 16,
+ 12,
+ 16,
+ 12,
+ 16,
+ 12,
+ 16,
+ 0,
+ 4,
+ 28,
+ 56,
+ 72,
+ 0,
+ 4,
+ 28,
+ 4,
+ 28,
+ 4,
+ 28,
+ 4,
+ 28,
+ 4,
+ 4,
+ 4,
+ 12,
+ 36,
+ 16,
+ 40,
+ 12,
+ 36,
+ 16,
+ 40,
+ 12,
+ 36,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 12,
+ 36,
+ 12,
+ 12,
+ 12,
+ 4,
+ 4,
+ 24,
+ 4,
+ 24,
+ 4,
+ 4,
+ 4,
+ 24,
+ 4,
+ 4,
+ 8,
+ 32,
+ 12,
+ 36,
+ 8,
+ 32,
+ 12,
+ 36,
+ 8,
+ 32,
+ 8,
+ 32,
+ 12,
+ 36,
+ 8,
+ 32,
+ 12,
+ 36,
+ 8,
+ 32,
+ 12,
+ 36,
+ 12,
+ 36,
+ 8,
+ 32,
+ 8,
+ 32,
+ 0,
+ 4,
+ 28,
+ 4,
+ 28,
+ 4,
+ 28,
+ 4,
+ 28,
+ 4,
+ 4,
+ 4,
+ 12,
+ 36,
+ 16,
+ 40,
+ 12,
+ 36,
+ 16,
+ 40,
+ 12,
+ 36,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 16,
+ 40,
+ 12,
+ 36,
+ 12,
+ 12,
+ 12,
+ 4,
+ 4,
+ 24,
+ 4,
+ 24,
+ 4,
+ 4,
+ 4,
+ 24,
+ 4,
+ 4,
+ 8,
+ 32,
+ 12,
+ 36,
+ 8,
+ 32,
+ 12,
+ 36,
+ 8,
+ 32,
+ 8,
+ 32,
+ 12,
+ 36,
+ 8,
+ 32,
+ 12,
+ 36,
+ 8,
+ 32,
+ 12,
+ 36,
+ 12,
+ 36,
+ 8,
+ 32,
+ 8,
+ 32,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+#endif /* __powerpc__ */
+#endif /* __WORDSIZE */
diff --git a/lib/jit_ppc.c b/lib/jit_ppc.c
index 003fcbb..501b223 100644
--- a/lib/jit_ppc.c
+++ b/lib/jit_ppc.c
@@ -869,7 +869,7 @@ _emit_code(jit_state_t *_jit)
} \
break
for (node = _jitc->head; node; node = node->next) {
- if (_jit->pc.uc >= _jitc->code.end && !jit_remap())
+ if (_jit->pc.uc >= _jitc->code.end)
return (NULL);
value = jit_classify(node->code);
diff --git a/lib/jit_s390x-sz.c b/lib/jit_s390x-sz.c
new file mode 100644
index 0000000..c12d6af
--- /dev/null
+++ b/lib/jit_s390x-sz.c
@@ -0,0 +1,350 @@
+
+#if __WORDSIZE == 64
+#define JIT_INSTR_MAX 68
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2,
+ 38,
+ 0,
+ 8,
+ 24,
+ 8,
+ 20,
+ 8,
+ 12,
+ 12,
+ 24,
+ 12,
+ 20,
+ 12,
+ 12,
+ 8,
+ 24,
+ 60,
+ 68,
+ 16,
+ 32,
+ 12,
+ 28,
+ 16,
+ 32,
+ 16,
+ 20,
+ 20,
+ 24,
+ 12,
+ 28,
+ 16,
+ 32,
+ 8,
+ 20,
+ 8,
+ 20,
+ 8,
+ 24,
+ 6,
+ 10,
+ 6,
+ 10,
+ 6,
+ 10,
+ 4,
+ 12,
+ 20,
+ 24,
+ 20,
+ 24,
+ 20,
+ 24,
+ 20,
+ 24,
+ 20,
+ 24,
+ 20,
+ 24,
+ 20,
+ 24,
+ 20,
+ 24,
+ 20,
+ 24,
+ 20,
+ 24,
+ 4,
+ 16,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 6,
+ 18,
+ 6,
+ 18,
+ 6,
+ 18,
+ 6,
+ 18,
+ 6,
+ 18,
+ 6,
+ 18,
+ 6,
+ 18,
+ 14,
+ 6,
+ 14,
+ 6,
+ 14,
+ 6,
+ 14,
+ 6,
+ 14,
+ 6,
+ 14,
+ 6,
+ 14,
+ 6,
+ 4,
+ 16,
+ 4,
+ 16,
+ 4,
+ 16,
+ 6,
+ 18,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 6,
+ 14,
+ 6,
+ 10,
+ 14,
+ 10,
+ 14,
+ 10,
+ 14,
+ 10,
+ 14,
+ 10,
+ 26,
+ 10,
+ 14,
+ 10,
+ 14,
+ 10,
+ 14,
+ 10,
+ 14,
+ 10,
+ 26,
+ 18,
+ 18,
+ 18,
+ 18,
+ 10,
+ 14,
+ 10,
+ 14,
+ 10,
+ 14,
+ 10,
+ 14,
+ 10,
+ 14,
+ 10,
+ 14,
+ 10,
+ 14,
+ 10,
+ 14,
+ 0,
+ 18,
+ 2,
+ 18,
+ 36,
+ 0,
+ 6,
+ 16,
+ 8,
+ 16,
+ 6,
+ 16,
+ 8,
+ 16,
+ 4,
+ 4,
+ 4,
+ 16,
+ 26,
+ 16,
+ 26,
+ 16,
+ 26,
+ 16,
+ 26,
+ 16,
+ 26,
+ 16,
+ 26,
+ 16,
+ 26,
+ 16,
+ 26,
+ 20,
+ 30,
+ 16,
+ 26,
+ 16,
+ 26,
+ 20,
+ 30,
+ 16,
+ 26,
+ 16,
+ 26,
+ 4,
+ 4,
+ 4,
+ 4,
+ 2,
+ 10,
+ 4,
+ 16,
+ 12,
+ 4,
+ 4,
+ 16,
+ 12,
+ 4,
+ 10,
+ 20,
+ 10,
+ 20,
+ 10,
+ 20,
+ 10,
+ 20,
+ 10,
+ 20,
+ 10,
+ 20,
+ 10,
+ 20,
+ 10,
+ 20,
+ 18,
+ 28,
+ 10,
+ 20,
+ 10,
+ 20,
+ 18,
+ 28,
+ 10,
+ 20,
+ 10,
+ 20,
+ 0,
+ 6,
+ 16,
+ 8,
+ 16,
+ 6,
+ 16,
+ 8,
+ 16,
+ 4,
+ 4,
+ 4,
+ 16,
+ 26,
+ 16,
+ 26,
+ 16,
+ 26,
+ 16,
+ 26,
+ 16,
+ 26,
+ 16,
+ 26,
+ 16,
+ 26,
+ 16,
+ 26,
+ 20,
+ 30,
+ 16,
+ 26,
+ 16,
+ 26,
+ 20,
+ 30,
+ 16,
+ 26,
+ 16,
+ 26,
+ 4,
+ 4,
+ 4,
+ 4,
+ 2,
+ 10,
+ 4,
+ 16,
+ 12,
+ 4,
+ 4,
+ 16,
+ 12,
+ 4,
+ 10,
+ 20,
+ 10,
+ 20,
+ 10,
+ 20,
+ 10,
+ 20,
+ 10,
+ 20,
+ 10,
+ 20,
+ 10,
+ 20,
+ 10,
+ 20,
+ 18,
+ 28,
+ 10,
+ 20,
+ 10,
+ 20,
+ 18,
+ 28,
+ 10,
+ 20,
+ 10,
+ 20,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+#endif /* __WORDSIZE */
diff --git a/lib/jit_s390x.c b/lib/jit_s390x.c
index 1634756..26f2867 100644
--- a/lib/jit_s390x.c
+++ b/lib/jit_s390x.c
@@ -701,7 +701,7 @@ _emit_code(jit_state_t *_jit)
} \
break
for (node = _jitc->head; node; node = node->next) {
- if (_jit->pc.uc >= _jitc->code.end && !jit_remap())
+ if (_jit->pc.uc >= _jitc->code.end)
return (NULL);
value = jit_classify(node->code);
diff --git a/lib/jit_size.c b/lib/jit_size.c
new file mode 100644
index 0000000..6efad61
--- /dev/null
+++ b/lib/jit_size.c
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2013 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU lightning.
+ *
+ * GNU lightning is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU lightning is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * Authors:
+ * Paulo Cesar Pereira de Andrade
+ */
+
+#include <lightning.h>
+#include <lightning/jit_private.h>
+#if GET_JIT_SIZE
+# include <stdio.h>
+#endif
+
+/*
+ * Initialization
+ */
+static jit_int16_t _szs[jit_code_x86_retval_d + 1] = {
+#if GET_JIT_SIZE
+# define JIT_INSTR_MAX 256
+#else
+# if defined(__i386__) || defined(__x86_64__)
+# include "jit_x86-sz.c"
+# elif defined(__mips__)
+# include "jit_mips-sz.c"
+# elif defined(__arm__)
+# include "jit_arm-sz.c"
+# elif defined(__ppc__) || defined(__powerpc__)
+# include "jit_ppc-sz.c"
+# elif defined(__sparc__)
+# include "jit_sparc-sz.c"
+# elif defined(__ia64__)
+# include "jit_ia64-sz.c"
+# elif defined(__hppa__)
+# include "jit_hppa-sz.c"
+# elif defined(__aarch64__)
+# include "jit_aarch64-sz.c"
+# elif defined(__s390x__)
+# include "jit_s390x-sz.c"
+# endif
+#endif
+};
+
+/*
+ * Implementation
+ */
+void
+jit_init_size(void)
+{
+#if DEBUG
+# if !GET_JIT_SIZE
+ jit_word_t offset;
+
+ for (offset = 0; offset < jit_size(_szs); offset++)
+ if (_szs[offset] != 0)
+ return;
+ /* Ensure data was collected */
+ abort();
+# endif
+#endif
+}
+
+#if GET_JIT_SIZE
+void
+_jit_size_prepare(jit_state_t *_jit)
+{
+ _jitc->cptr = _jit->code.ptr;
+ _jitc->size = _jit->pc.w;
+}
+
+void
+_jit_size_collect(jit_state_t *_jit, jit_node_t *node)
+{
+ jit_word_t length;
+
+ if (_jitc->cptr == _jit->code.ptr) {
+ length = _jit->pc.w - _jitc->size;
+ if (_szs[node->code] < length)
+ _szs[node->code] = length;
+ }
+}
+
+#else
+jit_word_t
+_jit_get_size(jit_state_t *_jit)
+{
+ jit_word_t size;
+ jit_node_t *node;
+
+ for (size = 0, node = _jitc->head; node; node = node->next)
+ size += _szs[node->code];
+
+ return ((size + 4095) & -4096);
+}
+#endif
+
+jit_word_t
+jit_get_max_instr(void)
+{
+ return (JIT_INSTR_MAX);
+}
+
+void
+jit_finish_size(void)
+{
+#if GET_JIT_SIZE
+ FILE *fp;
+ jit_word_t offset;
+
+ /* Define a single path */
+ fp = fopen(JIT_SIZE_PATH, "a");
+ assert(fp);
+ for (offset = 0; offset < jit_size(_szs); offset++)
+ fprintf(fp, "%d %d\n", offset, _szs[offset]);
+ fclose(fp);
+#endif
+}
diff --git a/lib/jit_sparc-sz.c b/lib/jit_sparc-sz.c
new file mode 100644
index 0000000..9e004c0
--- /dev/null
+++ b/lib/jit_sparc-sz.c
@@ -0,0 +1,350 @@
+
+#if __WORDSIZE == 32
+#define JIT_INSTR_MAX 28
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16,
+ 0,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 4,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 4,
+ 4,
+ 12,
+ 8,
+ 16,
+ 8,
+ 16,
+ 12,
+ 20,
+ 8,
+ 16,
+ 28,
+ 24,
+ 24,
+ 20,
+ 20,
+ 28,
+ 16,
+ 24,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 4,
+ 8,
+ 8,
+ 4,
+ 8,
+ 8,
+ 0,
+ 0,
+ 4,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 12,
+ 0,
+ 0,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 0,
+ 0,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 20,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 20,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 0,
+ 16,
+ 8,
+ 16,
+ 24,
+ 0,
+ 4,
+ 16,
+ 4,
+ 16,
+ 4,
+ 16,
+ 4,
+ 16,
+ 4,
+ 4,
+ 4,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 12,
+ 0,
+ 12,
+ 4,
+ 4,
+ 12,
+ 4,
+ 12,
+ 4,
+ 4,
+ 4,
+ 12,
+ 4,
+ 4,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 0,
+ 4,
+ 16,
+ 4,
+ 16,
+ 4,
+ 16,
+ 4,
+ 16,
+ 8,
+ 8,
+ 4,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 16,
+ 28,
+ 12,
+ 0,
+ 16,
+ 4,
+ 8,
+ 12,
+ 4,
+ 12,
+ 4,
+ 4,
+ 4,
+ 12,
+ 4,
+ 4,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 12,
+ 24,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+#endif /* __WORDSIZE */
diff --git a/lib/jit_sparc.c b/lib/jit_sparc.c
index 2ebb989..c22076a 100644
--- a/lib/jit_sparc.c
+++ b/lib/jit_sparc.c
@@ -702,7 +702,7 @@ _emit_code(jit_state_t *_jit)
} \
break
for (node = _jitc->head; node; node = node->next) {
- if (_jit->pc.uc >= _jitc->code.end && !jit_remap())
+ if (_jit->pc.uc >= _jitc->code.end)
return (NULL);
value = jit_classify(node->code);
diff --git a/lib/jit_x86-sz.c b/lib/jit_x86-sz.c
new file mode 100644
index 0000000..ea76636
--- /dev/null
+++ b/lib/jit_x86-sz.c
@@ -0,0 +1,700 @@
+
+#if __WORDSIZE == 32
+#define JIT_INSTR_MAX 26
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3,
+ 26,
+ 0,
+ 3,
+ 6,
+ 4,
+ 6,
+ 4,
+ 5,
+ 4,
+ 6,
+ 6,
+ 6,
+ 6,
+ 5,
+ 5,
+ 7,
+ 20,
+ 23,
+ 20,
+ 23,
+ 21,
+ 24,
+ 22,
+ 25,
+ 23,
+ 24,
+ 24,
+ 25,
+ 21,
+ 24,
+ 22,
+ 25,
+ 4,
+ 7,
+ 4,
+ 8,
+ 4,
+ 8,
+ 16,
+ 7,
+ 16,
+ 5,
+ 16,
+ 5,
+ 4,
+ 4,
+ 15,
+ 16,
+ 15,
+ 16,
+ 15,
+ 16,
+ 15,
+ 16,
+ 15,
+ 16,
+ 15,
+ 16,
+ 15,
+ 16,
+ 15,
+ 16,
+ 15,
+ 16,
+ 15,
+ 16,
+ 2,
+ 5,
+ 11,
+ 11,
+ 3,
+ 3,
+ 0,
+ 0,
+ 4,
+ 3,
+ 7,
+ 3,
+ 7,
+ 3,
+ 7,
+ 3,
+ 7,
+ 2,
+ 6,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 3,
+ 6,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10,
+ 14,
+ 3,
+ 7,
+ 2,
+ 6,
+ 0,
+ 0,
+ 11,
+ 11,
+ 4,
+ 4,
+ 3,
+ 6,
+ 0,
+ 0,
+ 8,
+ 9,
+ 8,
+ 9,
+ 8,
+ 12,
+ 8,
+ 9,
+ 8,
+ 12,
+ 8,
+ 9,
+ 8,
+ 9,
+ 8,
+ 9,
+ 8,
+ 9,
+ 8,
+ 12,
+ 8,
+ 12,
+ 8,
+ 12,
+ 8,
+ 9,
+ 8,
+ 9,
+ 8,
+ 9,
+ 8,
+ 9,
+ 8,
+ 9,
+ 8,
+ 9,
+ 8,
+ 9,
+ 8,
+ 9,
+ 0,
+ 5,
+ 2,
+ 5,
+ 24,
+ 0,
+ 8,
+ 16,
+ 12,
+ 16,
+ 8,
+ 16,
+ 12,
+ 16,
+ 12,
+ 12,
+ 6,
+ 13,
+ 21,
+ 13,
+ 21,
+ 15,
+ 22,
+ 13,
+ 21,
+ 13,
+ 21,
+ 18,
+ 25,
+ 13,
+ 21,
+ 13,
+ 21,
+ 13,
+ 20,
+ 13,
+ 21,
+ 13,
+ 21,
+ 13,
+ 20,
+ 13,
+ 20,
+ 13,
+ 20,
+ 7,
+ 0,
+ 7,
+ 4,
+ 10,
+ 8,
+ 4,
+ 8,
+ 5,
+ 5,
+ 6,
+ 10,
+ 7,
+ 7,
+ 10,
+ 18,
+ 10,
+ 18,
+ 12,
+ 20,
+ 10,
+ 18,
+ 10,
+ 18,
+ 13,
+ 21,
+ 10,
+ 18,
+ 10,
+ 18,
+ 10,
+ 18,
+ 10,
+ 18,
+ 10,
+ 18,
+ 10,
+ 18,
+ 10,
+ 17,
+ 10,
+ 18,
+ 0,
+ 8,
+ 16,
+ 12,
+ 16,
+ 8,
+ 16,
+ 12,
+ 16,
+ 18,
+ 13,
+ 6,
+ 13,
+ 21,
+ 13,
+ 21,
+ 15,
+ 23,
+ 13,
+ 21,
+ 13,
+ 21,
+ 18,
+ 26,
+ 13,
+ 21,
+ 13,
+ 21,
+ 13,
+ 21,
+ 13,
+ 21,
+ 13,
+ 21,
+ 13,
+ 21,
+ 13,
+ 21,
+ 13,
+ 21,
+ 7,
+ 0,
+ 7,
+ 4,
+ 10,
+ 8,
+ 4,
+ 8,
+ 5,
+ 8,
+ 6,
+ 10,
+ 7,
+ 7,
+ 10,
+ 18,
+ 10,
+ 18,
+ 12,
+ 20,
+ 10,
+ 18,
+ 10,
+ 18,
+ 13,
+ 21,
+ 10,
+ 18,
+ 10,
+ 18,
+ 10,
+ 18,
+ 10,
+ 18,
+ 10,
+ 18,
+ 10,
+ 18,
+ 10,
+ 18,
+ 10,
+ 18,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14,
+ 10,
+#endif /* __WORDSIZE */
+
+#if __WORDSIZE == 64
+#define JIT_INSTR_MAX 43
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7,
+ 43,
+ 0,
+ 5,
+ 13,
+ 6,
+ 13,
+ 6,
+ 7,
+ 6,
+ 13,
+ 9,
+ 13,
+ 9,
+ 7,
+ 7,
+ 14,
+ 20,
+ 30,
+ 20,
+ 30,
+ 22,
+ 29,
+ 23,
+ 30,
+ 25,
+ 32,
+ 26,
+ 33,
+ 22,
+ 29,
+ 23,
+ 30,
+ 6,
+ 13,
+ 6,
+ 13,
+ 6,
+ 13,
+ 9,
+ 8,
+ 9,
+ 7,
+ 9,
+ 7,
+ 6,
+ 6,
+ 13,
+ 14,
+ 13,
+ 14,
+ 13,
+ 14,
+ 13,
+ 14,
+ 13,
+ 14,
+ 13,
+ 14,
+ 13,
+ 14,
+ 13,
+ 14,
+ 13,
+ 14,
+ 13,
+ 14,
+ 3,
+ 10,
+ 4,
+ 4,
+ 4,
+ 4,
+ 3,
+ 3,
+ 6,
+ 5,
+ 9,
+ 5,
+ 9,
+ 5,
+ 9,
+ 5,
+ 9,
+ 4,
+ 8,
+ 4,
+ 8,
+ 4,
+ 8,
+ 6,
+ 5,
+ 6,
+ 5,
+ 6,
+ 5,
+ 6,
+ 5,
+ 5,
+ 7,
+ 5,
+ 4,
+ 5,
+ 7,
+ 4,
+ 8,
+ 5,
+ 9,
+ 4,
+ 8,
+ 4,
+ 8,
+ 5,
+ 4,
+ 6,
+ 5,
+ 5,
+ 6,
+ 5,
+ 7,
+ 9,
+ 10,
+ 9,
+ 10,
+ 9,
+ 13,
+ 9,
+ 10,
+ 9,
+ 19,
+ 9,
+ 10,
+ 9,
+ 10,
+ 9,
+ 10,
+ 9,
+ 10,
+ 9,
+ 19,
+ 9,
+ 13,
+ 9,
+ 13,
+ 9,
+ 10,
+ 9,
+ 10,
+ 9,
+ 10,
+ 9,
+ 10,
+ 9,
+ 10,
+ 9,
+ 10,
+ 9,
+ 10,
+ 9,
+ 10,
+ 0,
+ 5,
+ 3,
+ 13,
+ 37,
+ 0,
+ 10,
+ 20,
+ 15,
+ 20,
+ 10,
+ 20,
+ 15,
+ 20,
+ 14,
+ 15,
+ 5,
+ 11,
+ 26,
+ 11,
+ 26,
+ 13,
+ 28,
+ 11,
+ 26,
+ 11,
+ 26,
+ 16,
+ 31,
+ 11,
+ 26,
+ 11,
+ 26,
+ 11,
+ 26,
+ 11,
+ 26,
+ 11,
+ 26,
+ 11,
+ 26,
+ 11,
+ 26,
+ 11,
+ 26,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 15,
+ 6,
+ 10,
+ 7,
+ 6,
+ 6,
+ 10,
+ 7,
+ 7,
+ 10,
+ 20,
+ 10,
+ 25,
+ 12,
+ 27,
+ 10,
+ 25,
+ 10,
+ 25,
+ 13,
+ 28,
+ 10,
+ 25,
+ 10,
+ 25,
+ 10,
+ 25,
+ 10,
+ 25,
+ 10,
+ 25,
+ 10,
+ 25,
+ 10,
+ 25,
+ 10,
+ 25,
+ 0,
+ 10,
+ 25,
+ 15,
+ 25,
+ 10,
+ 25,
+ 15,
+ 25,
+ 21,
+ 16,
+ 5,
+ 12,
+ 27,
+ 12,
+ 27,
+ 14,
+ 29,
+ 12,
+ 27,
+ 12,
+ 27,
+ 17,
+ 32,
+ 12,
+ 27,
+ 12,
+ 27,
+ 12,
+ 27,
+ 12,
+ 27,
+ 12,
+ 27,
+ 12,
+ 27,
+ 12,
+ 27,
+ 12,
+ 27,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 15,
+ 6,
+ 10,
+ 7,
+ 6,
+ 6,
+ 10,
+ 7,
+ 7,
+ 11,
+ 26,
+ 11,
+ 26,
+ 13,
+ 28,
+ 11,
+ 26,
+ 11,
+ 26,
+ 14,
+ 29,
+ 11,
+ 26,
+ 11,
+ 26,
+ 11,
+ 26,
+ 11,
+ 26,
+ 11,
+ 26,
+ 11,
+ 26,
+ 11,
+ 26,
+ 11,
+ 26,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+#endif /* __WORDSIZE */
diff --git a/lib/jit_x86.c b/lib/jit_x86.c
index 00c756e..b2c1b40 100644
--- a/lib/jit_x86.c
+++ b/lib/jit_x86.c
@@ -1127,7 +1127,7 @@ _emit_code(jit_state_t *_jit)
} \
break
for (node = _jitc->head; node; node = node->next) {
- if (_jit->pc.uc >= _jitc->code.end && !jit_remap())
+ if (_jit->pc.uc >= _jitc->code.end)
return (NULL);
value = jit_classify(node->code);
diff --git a/lib/lightning.c b/lib/lightning.c
index 817976c..e6c7f4b1 100644
--- a/lib/lightning.c
+++ b/lib/lightning.c
@@ -180,12 +180,14 @@ init_jit(char *progname)
jit_progname = progname;
jit_get_cpu();
jit_init_debug();
+ jit_init_size();
}
void
finish_jit(void)
{
jit_finish_debug();
+ jit_finish_size();
}
jit_int32_t
@@ -1644,6 +1646,9 @@ _jit_reglive(jit_state_t *_jit, jit_node_t *node)
void
_jit_regarg_set(jit_state_t *_jit, jit_node_t *node, jit_int32_t value)
{
+#if GET_JIT_SIZE
+ jit_size_prepare();
+#endif
if (value & jit_cc_a0_reg) {
if (value & jit_cc_a0_rlh) {
jit_regset_setbit(&_jitc->regarg, jit_regno(node->u.q.l));
@@ -1661,6 +1666,9 @@ _jit_regarg_set(jit_state_t *_jit, jit_node_t *node,
jit_int32_t value)
void
_jit_regarg_clr(jit_state_t *_jit, jit_node_t *node, jit_int32_t value)
{
+#if GET_JIT_SIZE
+ jit_size_collect(node);
+#endif
if (value & jit_cc_a0_reg) {
if (value & jit_cc_a0_rlh) {
jit_regset_clrbit(&_jitc->regarg, jit_regno(node->u.q.l));
@@ -1690,12 +1698,15 @@ _jit_emit(jit_state_t *_jit)
jit_epilog();
jit_optimize();
- /* Heuristic to guess code buffer size */
- _jitc->mult = 4;
-
_jitc->emit = 1;
+#if GET_JIT_SIZE
+ /* Heuristic to guess code buffer size */
+ _jitc->mult = 4;
_jit->code.length = _jitc->pool.length * 1024 * _jitc->mult;
+#else
+ _jit->code.length = jit_get_size();
+#endif
#if defined(__sgi)
mmap_fd = open("/dev/zero", O_RDWR);
@@ -1704,7 +1715,8 @@ _jit_emit(jit_state_t *_jit)
PROT_EXEC | PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANON, mmap_fd, 0);
assert(_jit->code.ptr != MAP_FAILED);
- _jitc->code.end = _jit->code.ptr + _jit->code.length - 64;
+ _jitc->code.end = _jit->code.ptr + _jit->code.length -
+ jit_get_max_instr();
_jit->pc.uc = _jit->code.ptr;
for (;;) {
@@ -1715,8 +1727,13 @@ _jit_emit(jit_state_t *_jit)
node->code == jit_code_epilog))
node->flag &= ~jit_flag_patch;
}
+#if GET_JIT_SIZE
++_jitc->mult;
length = _jitc->pool.length * 1024 * _jitc->mult;
+#else
+ /* Should only happen on very special cases */
+ length = _jit->code.length + 4096;
+#endif
#if !HAVE_MREMAP
munmap(_jit->code.ptr, _jit->code.length);
@@ -1738,7 +1755,8 @@ _jit_emit(jit_state_t *_jit)
assert(_jit->code.ptr != MAP_FAILED);
_jit->code.length = length;
- _jitc->code.end = _jit->code.ptr + _jit->code.length - 64;
+ _jitc->code.end = _jit->code.ptr + _jit->code.length -
+ jit_get_max_instr();
_jit->pc.uc = _jit->code.ptr;
_jitc->patches.offset = 0;
}
diff --git a/size.c b/size.c
new file mode 100644
index 0000000..1acbb4f
--- /dev/null
+++ b/size.c
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2013 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU lightning.
+ *
+ * GNU lightning is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU lightning is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * Authors:
+ * Paulo Cesar Pereira de Andrade
+ */
+
+#include <lightning.h>
+#include <lightning/jit_private.h>
+#include <stdio.h>
+
+jit_int16_t _szs[jit_code_x86_retval_d + 1];
+
+int
+main(int argc, char *argv[])
+{
+ FILE *fp;
+ jit_word_t offset;
+ int code, size, max;
+
+ if ((fp = fopen(JIT_SIZE_PATH, "r")) == NULL)
+ exit(-1);
+ while (fscanf(fp, "%d %d\n", &code, &size) == 2) {
+ if (_szs[code] < size)
+ _szs[code] = size;
+ }
+ fclose(fp);
+
+ max = 0;
+ for (offset = 0; offset <= jit_code_x86_retval_d; offset++)
+ if (max < _szs[offset])
+ max = _szs[offset];
+
+ if ((fp = fopen(JIT_SIZE_PATH, "w")) == NULL)
+ exit(-1);
+
+
+ fprintf(fp, "#if __WORDSIZE == %d\n", __WORDSIZE);
+#if defined(__arm__)
+# if defined(__ARM_PCS_VFP)
+ fprintf(fp, "#if defined(__ARM_PCS_VFP)\n");
+# else
+ fprintf(fp, "#if !defined(__ARM_PCS_VFP)\n");
+# endif
+#elif defined(__mips__)
+# if defined(_ABIN32)
+ fprintf(fp, "#if defined(_ABIN32)\n");
+# else
+ fprintf(fp, "#if !defined(_ABIN32)\n");
+# endif
+#elif defined(__ppc__)
+ fprintf(fp, "#if defined(__ppc__)\n");
+#elif defined(__powerpc__)
+ fprintf(fp, "#if defined(__powerpc__)\n");
+#endif
+ fprintf(fp, "#define JIT_INSTR_MAX %d\n", max);
+ for (offset = 0; offset <= jit_code_x86_retval_d; offset++)
+ fprintf(fp, " %d,\n", _szs[offset]);
+#if defined(__arm__)
+ fprintf(fp, "#undef /* __ARM_PCS_VFP */\n");
+#elif defined(__mips__)
+ fprintf(fp, "#endif /* _ABIN32 */\n");
+#elif defined(__ppc__)
+ fprintf(fp, "#endif /* __ppc__ */\n");
+#elif defined(__powerpc__)
+ fprintf(fp, "#endif /* __powerpc__ */\n");
+#endif
+ fprintf(fp, "#endif /* __WORDSIZE */\n");
+ fclose(fp);
+
+ return (0);
+}
- [Guile-commits] 229/437: Do not assume cast of nan or inf double to float always work., (continued)
- [Guile-commits] 229/437: Do not assume cast of nan or inf double to float always work., Andy Wingo, 2018/07/02
- [Guile-commits] 231/437: Cosmetic removal of white spaces in end of lines., Andy Wingo, 2018/07/02
- [Guile-commits] 232/437: Correct off by one bug on s390x subi., Andy Wingo, 2018/07/02
- [Guile-commits] 123/437: Revert change aliasing jit_movi_p to jit_movi_ul., Andy Wingo, 2018/07/02
- [Guile-commits] 248/437: Correct wrong example and mt unsafe code in the arm backend., Andy Wingo, 2018/07/02
- [Guile-commits] 236/437: Correct build and make check on gcc111 - AIX 7.1., Andy Wingo, 2018/07/02
- [Guile-commits] 237/437: Correct build and check on NetBSD amd64., Andy Wingo, 2018/07/02
- [Guile-commits] 213/437: Finish Itanium port, correcting remaining failing test cases., Andy Wingo, 2018/07/02
- [Guile-commits] 253/437: IA64: Correct some wrong checks value range checks., Andy Wingo, 2018/07/02
- [Guile-commits] 254/437: ARM: Correct build when disassembler is disabled., Andy Wingo, 2018/07/02
- [Guile-commits] 251/437: Add code to calculate code buffer size based on devel time information.,
Andy Wingo <=
- [Guile-commits] 144/437: Add new ldst variant test cases to check base/index register clobber., Andy Wingo, 2018/07/02
- [Guile-commits] 212/437: Correct remaining test cases, but not yet ones with stack arguments., Andy Wingo, 2018/07/02
- [Guile-commits] 179/437: Add heuristic code to estimate space and resize if required jit buffer., Andy Wingo, 2018/07/02
- [Guile-commits] 265/437: PPC: Correct wrong ldxi_l simplification in 64 bit mode, Andy Wingo, 2018/07/02
- [Guile-commits] 155/437: Add support to test different/alternate code generation setups., Andy Wingo, 2018/07/02
- [Guile-commits] 241/437: Add fallback logic instead of error if cannot figure __WORDSIZE., Andy Wingo, 2018/07/02
- [Guile-commits] 220/437: Update ia64 port to work on HP-UX., Andy Wingo, 2018/07/02
- [Guile-commits] 247/437: Add the jit_callee_save_p interface and extra register definitions., Andy Wingo, 2018/07/02
- [Guile-commits] 259/437: Correct wrong dates in ChangeLog, Andy Wingo, 2018/07/02
- [Guile-commits] 258/437: MIPS: Correct abi detection., Andy Wingo, 2018/07/02