git subrepo pull --force deps/lightning
authorPaul Cercueil <paul@crapouillou.net>
Sat, 19 Feb 2022 23:20:12 +0000 (23:20 +0000)
committerPaul Cercueil <paul@crapouillou.net>
Sun, 20 Feb 2022 00:18:49 +0000 (00:18 +0000)
subrepo:
  subdir:   "deps/lightning"
  merged:   "876c1043"
upstream:
  origin:   "https://git.savannah.gnu.org/git/lightning.git"
  branch:   "master"
  commit:   "876c1043"
git-subrepo:
  version:  "0.4.3"
  origin:   "https://github.com/ingydotnet/git-subrepo.git"
  commit:   "2f68596"

34 files changed:
deps/lightning/.gitmodules [new file with mode: 0644]
deps/lightning/.gitrepo
deps/lightning/ChangeLog
deps/lightning/Makefile.am
deps/lightning/README-hacking [new file with mode: 0644]
deps/lightning/bootstrap [new file with mode: 0755]
deps/lightning/bootstrap.conf [new file with mode: 0644]
deps/lightning/check/Makefile.am
deps/lightning/check/lightning.c
deps/lightning/check/live.ok [new file with mode: 0644]
deps/lightning/check/live.tst [new file with mode: 0644]
deps/lightning/configure.ac
deps/lightning/doc/.gitignore
deps/lightning/doc/Makefile.am
deps/lightning/doc/body.texi
deps/lightning/doc/version.texi [deleted file]
deps/lightning/gnulib [new submodule]
deps/lightning/gnulib-lib/.gitignore [new file with mode: 0644]
deps/lightning/include/lightning.h [deleted file]
deps/lightning/include/lightning.h.in
deps/lightning/include/lightning/jit_mips.h
deps/lightning/include/lightning/jit_private.h
deps/lightning/lib/Makefile.am
deps/lightning/lib/jit_aarch64-cpu.c
deps/lightning/lib/jit_disasm.c
deps/lightning/lib/jit_memory.c
deps/lightning/lib/jit_mips-cpu.c
deps/lightning/lib/jit_ppc-cpu.c
deps/lightning/lib/jit_print.c
deps/lightning/lib/jit_x86-cpu.c
deps/lightning/lib/jit_x86.c
deps/lightning/lib/lightning.c
deps/lightning/m4/.gitignore [new file with mode: 0644]
deps/lightning/m4/gnulib-cache.m4 [new file with mode: 0644]

diff --git a/deps/lightning/.gitmodules b/deps/lightning/.gitmodules
new file mode 100644 (file)
index 0000000..acb2669
--- /dev/null
@@ -0,0 +1,3 @@
+[submodule "gnulib"]
+       path = gnulib
+       url = git://git.sv.gnu.org/gnulib.git
index bb1106e..d49a4e8 100644 (file)
@@ -6,7 +6,7 @@
 [subrepo]
        remote = https://git.savannah.gnu.org/git/lightning.git
        branch = master
-       commit = b0b8eb5e856c0d29053dc842e1919a2eb58c8cda
-       parent = 819f3dfc11f81f58cb52bd7b1f7cc5025791af62
+       commit = 876c1043bec5bfd594482b40700c84693e40d0eb
+       parent = cef02748fe77c0d29b441447659262ce1da47c4b
        method = merge
-       cmdver = 0.4.1
+       cmdver = 0.4.3
index 76cac91..9964207 100644 (file)
@@ -1,3 +1,38 @@
+2021-04-03  Marc Nieper-Wißkirchen  <marc@nieper-wisskirchen.de>
+
+       * check/Makefile.am: Add test for the live instruction.
+       * check/live.ok: New file.
+       * check/live.tst: New file.
+       * doc/body.texi: Add documentation for the live instruction and
+       for jit_get_reg/jit_get_unreg.  Fix menu entries.
+       * include/lightning.h.in (jit_get_reg, jit_unget_reg): Expose the
+       macros in the public header file.
+       * include/lightning/jit_private.h (jit_get_reg, jit_unget_reg):
+       Remove the macros from the private header file.
+
+2021-04-03  Marc Nieper-Wißkirchen  <marc@nieper-wisskirchen.de>
+
+       * Makefile.am, check/Makefile.am, doc/Makefile.am,
+       lib/Makefile.am: Include $(top_builddir)/include in include paths
+       for the autoconf-generated header file lightning.h.
+
+2021-04-03  Marc Nieper-Wißkirchen  <marc@nieper-wisskirchen.de>
+
+       * doc/.gitignore: Add version.texi to list of ignored files.
+       * doc/version.texi: Remove file from version control.
+
+2020-18-04 Paulo Andrade <pcpa@gnu.org>
+
+       * lib/jit_x86-cpu.c, lib/jit_x86.c: Implement %rip relative
+       calls and jumps on x86_64. Currently very conservative, assuming
+       a jit block can be larger than 2G, so, if a jump or call is in
+       the same jit generation, but target is unknown, use an indirect
+       branch (could have an option to assume a jit code block is
+       never larger than 2G). Also a deoptimization is that now does
+       not always generate ip relative jmpi; previously implicitly
+       assumed jmpi would never be larger than 2G. Overall still an
+       optimization.
+
 2020-23-01 Paulo Andrade <pcpa@gnu.org>
 
        * lib/lightning.c: Add a proper fix to the condition of considering
@@ -26,7 +61,7 @@
        to the set of registers to scan for live range, what might
        consume a lot of cpu time, doing nothing.
 
-2019-09-16 Marc Nieper-WiÃkirchen <marc@nieper-wisskirchen.de>
+2019-09-16 Marc Nieper-WiÃ\9fkirchen <marc@nieper-wisskirchen.de>
 
        * include/lightning/jit_x86.h, lib/jit_x86.c: Correct x86_64
        backend, made %r12 a callee-save register as dictated by the
        https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=925129
        * THANKS: update.
 
-2019-08-29 Marc Nieper-WiÃkirchen <marc@nieper-wisskirchen.de>
+2019-08-29 Marc Nieper-WiÃ\9fkirchen <marc@nieper-wisskirchen.de>
 
        * include/lightning/jit_private.h: Move definition of offsetof
        from the public header file here.
        * include/lightning/jit_arm.h: Correct wrong jit_f macro
        definition.
 
-       * include/lightning/jit_ia64.h, include/lightning/jit_ppc.h: 
+       * include/lightning/jit_ia64.h, include/lightning/jit_ppc.h:
        Correct wrong jit_r macro definition.
 
        * lib/jit_x86-x87.c, lib/jit_x86.c: Actually use the
        divr_f and divrd_d implementation.
 
        * check/lightning.c: Add __ia64__ preprocessor define
-       on Itanium. 
+       on Itanium.
 
        * check/alu.inc, check/clobber.tst, check/float.tst: Define
        several macros conditionally to __ia64__. This is required
        * include/lightning/jit_x86.h: Correct typo in macro name.
 
        * lib/jit_arm.c, lib/jit_arm-cpu.c, lib/jit_mips.c,
-       lib/jit_mips-cpu.c, lib/jit_ppc.c, lib/jit_ppc-cpu.c, 
+       lib/jit_mips-cpu.c, lib/jit_ppc.c, lib/jit_ppc-cpu.c,
        lib/jit_x86.c, lib/jit_x86-cpu.c: Correct wrong code to get
        current jit function pointer.
 
        * lightning/i386/core.h (jit_ldr_c, jit_ldxr_c, jit_ldr_s,
        jit_ldxr_s): Move...
        * lightning/i386/core-32.h: ... here.
-       * lightning/i386/core-64.h (jit_ldr_c, jit_ldxr_c, jit_ldr_s,
+       * lightning/i386/core-64.h (jit_ldr_c, jit_ldxr_c, jit_ldr_s):
        Use movsbq and movswq.
 
 2010-08-10  Paulo César Pereira de Andrade <pcpa@mandriva.com.br>
 
        * lightning/ppc/funcs.h (jit_flush_code): modified the computation
        of start/end. The pointer arithmetic was done without casting. It
-       prevented compilation with recent gcc versions. 
+       prevented compilation with recent gcc versions.
        * lightning/ppc/core.h (jit_pushr_i): The offset for the store was
        incorrect. Should have been 4 bytes below SP (not above).
-       * lightning/ppc/core.h (jit_popr_i): The offset for the load was 
-       incorrect. Should have been 0 (not +8). 
+       * lightning/ppc/core.h (jit_popr_i): The offset for the load was
+       incorrect. Should have been 0 (not +8).
 
 2008-06-17  Paolo Bonzini  <bonzini@gnu.org>
 
        * lightning/i386/fp-32.h: ... here.
        * lightning/i386/fp-64.h: Write the code.
        * lightning/sparc/fp.h: Fix jit_extr_{f_d,d_f} register order.
-       
+
 2006-11-22  Paolo Bonzini  <bonzini@gnu.org>
 
        * lightning/i386/asm-i386.h: Move x86-64 instructions...
 2006-01-23  Paolo Bonzini  <bonzini@gnu.org>
 
        * configure.ac: Fix comments in config.h.in.
-       
+
 2005-11-25  Paolo Bonzini  <bonzini@gnu.org>
 
        * lightning/sparc/fp.h: Fix header comment.
        * lightning/ppc/funcs.h: correctly align stack pointer
 
 No changelogs for the assemblers (lightning directory) until 1.0
-       
+
 2003-03-27  Paolo Bonzini  <bonzini@gnu.org>
 
        * tests/printf2.c: new test
@@ -4135,7 +4170,7 @@ No changelogs for the assemblers (lightning directory) until 1.0
 2001-01-19  Paolo Bonzini  <bonzini@gnu.org>
 
        * configure.in: support cross-assembling
-       
+
        * disass/bfd.h, disass/dis-asm.h, disass/dis-buf.c,
        disass/i386-dis.c, disass/i386.h, disass/ppc-dis.c,
        disass/ppc.h, disass/ppc-opc.c, disass/sparc-dis.c,
index c921901..112deae 100644 (file)
 ACLOCAL_AMFLAGS = -I m4
 
 SUBDIRS =              \
+       gnulib-lib      \
        check           \
        doc             \
        include         \
        lib
 
+EXTRA_DIST = m4/gnulib-cache.m4
+
 pkgconfiglibdir = $(libdir)/pkgconfig
 pkgconfiglib_DATA = lightning.pc
 
 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)
+AM_CFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include  \
+       -D_GNU_SOURCE $(LIGHTNING_CFLAGS)
 
 noinst_PROGRAMS = size
 size_LDADD = $(top_builddir)/lib/liblightning.la -lm $(SHLIB)
diff --git a/deps/lightning/README-hacking b/deps/lightning/README-hacking
new file mode 100644 (file)
index 0000000..285f3c9
--- /dev/null
@@ -0,0 +1,96 @@
+This README-hacking file describes the development environment.
+
+Everything related to the development of GNU lightning is on Savannah:
+https://savannah.gnu.org/projects/lightning/.
+
+
+* Working from the Repository
+
+** Autotools
+
+This distribution uses the latest stable versions of Automake, Autoconf.  If
+you are getting the sources from git (or change configure.ac), you'll need
+to have these tools installed to (re)build.  All
+of these programs are available from ftp://ftp.gnu.org/gnu.
+
+If you're using a GNU/Linux distribution, the easiest way to install these
+packages depends on your system.  The following shell command should work
+for Debian-based systems such as Ubuntu:
+
+    $ sudo apt-get install autoconf automake
+
+
+** Building
+
+After getting the git sources, and installing the tools above, you can run
+
+    $ ./bootstrap
+    $ ./configure
+    $ make
+    $ make check
+
+to do a fresh build.  At this point, there should be no difference between
+your local copy, and the master copy:
+
+    $ git diff
+
+should output no difference.
+
+After that first time, running make should suffice.
+
+** Gnulib
+
+This distribution also uses Gnulib (https://www.gnu.org/software/gnulib) to
+share common files, stored as a submodule in git.
+
+** Updating
+
+    $ git pull
+    $ git submodule update
+
+** Updating a submodule
+
+To update a submodule, say gnulib, do as follows:
+
+Get the most recent version of the master branch from git.
+
+    $ cd gnulib
+    $ git pull
+
+Make sure GNU lightning can live with that version of gnulib.
+
+    $ cd ..
+    $ ./bootstrap
+    $ make distcheck
+
+Register your changes.
+
+    $ git commit ...
+
+
+----
+
+
+Copyright 2021 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.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this program.  If not, see
+<http://www.gnu.org/licenses/>.
+
+
+Local Variables:
+mode: outline
+fill-column: 76
+End:
diff --git a/deps/lightning/bootstrap b/deps/lightning/bootstrap
new file mode 100755 (executable)
index 0000000..c17a36f
--- /dev/null
@@ -0,0 +1,1090 @@
+#! /bin/sh
+# Print a version string.
+scriptversion=2021-01-10.00; # UTC
+
+# Bootstrap this package from checked-out sources.
+
+# Copyright (C) 2003-2021 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program 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 General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# Originally written by Paul Eggert.  The canonical version of this
+# script is maintained as build-aux/bootstrap in gnulib, however, to
+# be useful to your project, you should place a copy of it under
+# version control in the top-level directory of your project.  The
+# intent is that all customization can be done with a bootstrap.conf
+# file also maintained in your version control; gnulib comes with a
+# template build-aux/bootstrap.conf to get you started.
+
+# Please report bugs or propose patches to bug-gnulib@gnu.org.
+
+nl='
+'
+
+# Ensure file names are sorted consistently across platforms.
+LC_ALL=C
+export LC_ALL
+
+# Ensure that CDPATH is not set.  Otherwise, the output from cd
+# would cause trouble in at least one use below.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+local_gl_dir=gl
+
+# Honor $PERL, but work even if there is none.
+PERL="${PERL-perl}"
+
+me=$0
+
+default_gnulib_url=https://git.savannah.gnu.org/git/gnulib.git
+
+usage() {
+  cat <<EOF
+Usage: $me [OPTION]...
+Bootstrap this package from the checked-out sources.
+
+Options:
+ --gnulib-srcdir=DIRNAME  specify the local directory where gnulib
+                          sources reside.  Use this if you already
+                          have gnulib sources on your machine, and
+                          do not want to waste your bandwidth downloading
+                          them again.  Defaults to \$GNULIB_SRCDIR
+ --bootstrap-sync         if this bootstrap script is not identical to
+                          the version in the local gnulib sources,
+                          update this script, and then restart it with
+                          /bin/sh or the shell \$CONFIG_SHELL
+ --no-bootstrap-sync      do not check whether bootstrap is out of sync
+ --copy                   copy files instead of creating symbolic links
+ --force                  attempt to bootstrap even if the sources seem
+                          not to have been checked out
+ --no-git                 do not use git to update gnulib.  Requires that
+                          --gnulib-srcdir point to a correct gnulib snapshot
+ --skip-po                do not download po files
+EOF
+  bootstrap_print_option_usage_hook
+  cat <<EOF
+If the file $me.conf exists in the same directory as this script, its
+contents are read as shell variables to configure the bootstrap.
+
+For build prerequisites, environment variables like \$AUTOCONF and \$AMTAR
+are honored.
+
+Gnulib sources can be fetched in various ways:
+
+ * If this package is in a git repository with a 'gnulib' submodule
+   configured, then that submodule is initialized and updated and sources
+   are fetched from there.  If \$GNULIB_SRCDIR is set (directly or via
+   --gnulib-srcdir) and is a git repository, then it is used as a reference.
+
+ * Otherwise, if \$GNULIB_SRCDIR is set (directly or via --gnulib-srcdir),
+   then sources are fetched from that local directory.  If it is a git
+   repository and \$GNULIB_REVISION is set, then that revision is checked
+   out.
+
+ * Otherwise, if this package is in a git repository with a 'gnulib'
+   submodule configured, then that submodule is initialized and updated and
+   sources are fetched from there.
+
+ * Otherwise, if the 'gnulib' directory does not exist, Gnulib sources are
+   cloned into that directory using git from \$GNULIB_URL, defaulting to
+   $default_gnulib_url.
+   If \$GNULIB_REVISION is set, then that revision is checked out.
+
+ * Otherwise, the existing Gnulib sources in the 'gnulib' directory are
+   used.  If it is a git repository and \$GNULIB_REVISION is set, then that
+   revision is checked out.
+
+If you maintain a package and want to pin a particular revision of the
+Gnulib sources that has been tested with your package, then there are two
+possible approaches: either configure a 'gnulib' submodule with the
+appropriate revision, or set \$GNULIB_REVISION (and if necessary
+\$GNULIB_URL) in $me.conf.
+
+Running without arguments will suffice in most cases.
+EOF
+}
+
+# warnf_ FORMAT-STRING ARG1...
+warnf_ ()
+{
+  warnf_format_=$1
+  shift
+  nl='
+'
+  case $* in
+    *$nl*) me_=$(printf "$me"|tr "$nl|" '??')
+       printf "$warnf_format_" "$@" | sed "s|^|$me_: |" ;;
+    *) printf "$me: $warnf_format_" "$@" ;;
+  esac >&2
+}
+
+# warn_ WORD1...
+warn_ ()
+{
+  # If IFS does not start with ' ', set it and emit the warning in a subshell.
+  case $IFS in
+    ' '*) warnf_ '%s\n' "$*";;
+    *)    (IFS=' '; warn_ "$@");;
+  esac
+}
+
+# die WORD1...
+die() { warn_ "$@"; exit 1; }
+
+# Configuration.
+
+# Name of the Makefile.am
+gnulib_mk=gnulib.mk
+
+# List of gnulib modules needed.
+gnulib_modules=
+
+# Any gnulib files needed that are not in modules.
+gnulib_files=
+
+: ${AUTOPOINT=autopoint}
+: ${AUTORECONF=autoreconf}
+
+# A function to be called for each unrecognized option.  Returns 0 if
+# the option in $1 has been processed by the function.  Returns 1 if
+# the option has not been processed by the function.  Override it via
+# your own definition in bootstrap.conf
+
+bootstrap_option_hook() { return 1; }
+
+# A function to be called in order to print the --help information
+# corresponding to user-defined command-line options.
+
+bootstrap_print_option_usage_hook() { :; }
+
+# A function to be called right after gnulib-tool is run.
+# Override it via your own definition in bootstrap.conf.
+bootstrap_post_import_hook() { :; }
+
+# A function to be called after everything else in this script.
+# Override it via your own definition in bootstrap.conf.
+bootstrap_epilogue() { :; }
+
+# The command to download all .po files for a specified domain into a
+# specified directory.  Fill in the first %s with the destination
+# directory and the second with the domain name.
+po_download_command_format=\
+"wget --mirror --level=1 -nd -nv -A.po -P '%s' \
+ https://translationproject.org/latest/%s/"
+
+# Prefer a non-empty tarname (4th argument of AC_INIT if given), else
+# fall back to the package name (1st argument with munging).
+extract_package_name='
+  /^AC_INIT(\[*/{
+     s///
+     /^[^,]*,[^,]*,[^,]*,[ []*\([^][ ,)]\)/{
+       s//\1/
+       s/[],)].*//
+       p
+       q
+     }
+     s/[],)].*//
+     s/^GNU //
+     y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
+     s/[^abcdefghijklmnopqrstuvwxyz0123456789_]/-/g
+     p
+  }
+'
+package=$(${AUTOCONF:-autoconf} --trace AC_INIT:\$4 configure.ac 2>/dev/null)
+if test -z "$package"; then
+  package=$(sed -n "$extract_package_name" configure.ac) \
+      || die 'cannot find package name in configure.ac'
+fi
+gnulib_name=lib$package
+
+build_aux=build-aux
+source_base=lib
+m4_base=m4
+doc_base=doc
+tests_base=tests
+gnulib_extra_files="
+        build-aux/install-sh
+        build-aux/mdate-sh
+        build-aux/texinfo.tex
+        build-aux/depcomp
+        build-aux/config.guess
+        build-aux/config.sub
+        doc/INSTALL
+"
+
+# Additional gnulib-tool options to use.  Use "\newline" to break lines.
+gnulib_tool_option_extras=
+
+# Other locale categories that need message catalogs.
+EXTRA_LOCALE_CATEGORIES=
+
+# Additional xgettext options to use.  Use "\\\newline" to break lines.
+XGETTEXT_OPTIONS='\\\
+ --flag=_:1:pass-c-format\\\
+ --flag=N_:1:pass-c-format\\\
+ --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
+'
+
+# Package bug report address and copyright holder for gettext files
+COPYRIGHT_HOLDER='Free Software Foundation, Inc.'
+MSGID_BUGS_ADDRESS=bug-$package@gnu.org
+
+# Files we don't want to import.
+excluded_files=
+
+# File that should exist in the top directory of a checked out hierarchy,
+# but not in a distribution tarball.
+checkout_only_file=README-hacking
+
+# Whether to use copies instead of symlinks.
+copy=false
+
+# Set this to '.cvsignore .gitignore' in bootstrap.conf if you want
+# those files to be generated in directories like lib/, m4/, and po/.
+# Or set it to 'auto' to make this script select which to use based
+# on which version control system (if any) is used in the source directory.
+vc_ignore=auto
+
+# Set this to true in bootstrap.conf to enable --bootstrap-sync by
+# default.
+bootstrap_sync=false
+
+# Use git to update gnulib sources
+use_git=true
+
+check_exists() {
+  if test "$1" = "--verbose"; then
+    ($2 --version </dev/null) >/dev/null 2>&1
+    if test $? -ge 126; then
+      # If not found, run with diagnostics as one may be
+      # presented with env variables to set to find the right version
+      ($2 --version </dev/null)
+    fi
+  else
+    ($1 --version </dev/null) >/dev/null 2>&1
+  fi
+
+  test $? -lt 126
+}
+
+# find_tool ENVVAR NAMES...
+# -------------------------
+# Search for a required program.  Use the value of ENVVAR, if set,
+# otherwise find the first of the NAMES that can be run.
+# If found, set ENVVAR to the program name, die otherwise.
+#
+# FIXME: code duplication, see also gnu-web-doc-update.
+find_tool ()
+{
+  find_tool_envvar=$1
+  shift
+  find_tool_names=$@
+  eval "find_tool_res=\$$find_tool_envvar"
+  if test x"$find_tool_res" = x; then
+    for i; do
+      if check_exists $i; then
+        find_tool_res=$i
+        break
+      fi
+    done
+  fi
+  if test x"$find_tool_res" = x; then
+    warn_ "one of these is required: $find_tool_names;"
+    die   "alternatively set $find_tool_envvar to a compatible tool"
+  fi
+  eval "$find_tool_envvar=\$find_tool_res"
+  eval "export $find_tool_envvar"
+}
+
+# Override the default configuration, if necessary.
+# Make sure that bootstrap.conf is sourced from the current directory
+# if we were invoked as "sh bootstrap".
+case "$0" in
+  */*) test -r "$0.conf" && . "$0.conf" ;;
+  *) test -r "$0.conf" && . ./"$0.conf" ;;
+esac
+
+if test "$vc_ignore" = auto; then
+  vc_ignore=
+  test -d .git && vc_ignore=.gitignore
+  test -d CVS && vc_ignore="$vc_ignore .cvsignore"
+fi
+
+if test x"$gnulib_modules$gnulib_files$gnulib_extra_files" = x; then
+  use_gnulib=false
+else
+  use_gnulib=true
+fi
+
+# Translate configuration into internal form.
+
+# Parse options.
+
+for option
+do
+  case $option in
+  --help)
+    usage
+    exit;;
+  --gnulib-srcdir=*)
+    GNULIB_SRCDIR=${option#--gnulib-srcdir=};;
+  --skip-po)
+    SKIP_PO=t;;
+  --force)
+    checkout_only_file=;;
+  --copy)
+    copy=true;;
+  --bootstrap-sync)
+    bootstrap_sync=true;;
+  --no-bootstrap-sync)
+    bootstrap_sync=false;;
+  --no-git)
+    use_git=false;;
+  *)
+    bootstrap_option_hook $option || die "$option: unknown option";;
+  esac
+done
+
+$use_git || test -d "$GNULIB_SRCDIR" \
+  || die "Error: --no-git requires --gnulib-srcdir"
+
+if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
+  die "Bootstrapping from a non-checked-out distribution is risky."
+fi
+
+# Strip blank and comment lines to leave significant entries.
+gitignore_entries() {
+  sed '/^#/d; /^$/d' "$@"
+}
+
+# If $STR is not already on a line by itself in $FILE, insert it at the start.
+# Entries are inserted at the start of the ignore list to ensure existing
+# entries starting with ! are not overridden.  Such entries support
+# whitelisting exceptions after a more generic blacklist pattern.
+insert_if_absent() {
+  file=$1
+  str=$2
+  test -f $file || touch $file
+  test -r $file || die "Error: failed to read ignore file: $file"
+  duplicate_entries=$(gitignore_entries $file | sort | uniq -d)
+  if [ "$duplicate_entries" ] ; then
+    die "Error: Duplicate entries in $file: " $duplicate_entries
+  fi
+  linesold=$(gitignore_entries $file | wc -l)
+  linesnew=$( { echo "$str"; cat $file; } | gitignore_entries | sort -u | wc -l)
+  if [ $linesold != $linesnew ] ; then
+    { echo "$str" | cat - $file > $file.bak && mv $file.bak $file; } \
+      || die "insert_if_absent $file $str: failed"
+  fi
+}
+
+# Adjust $PATTERN for $VC_IGNORE_FILE and insert it with
+# insert_if_absent.
+insert_vc_ignore() {
+  vc_ignore_file="$1"
+  pattern="$2"
+  case $vc_ignore_file in
+  *.gitignore)
+    # A .gitignore entry that does not start with '/' applies
+    # recursively to subdirectories, so prepend '/' to every
+    # .gitignore entry.
+    pattern=$(echo "$pattern" | sed s,^,/,);;
+  esac
+  insert_if_absent "$vc_ignore_file" "$pattern"
+}
+
+# Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
+found_aux_dir=no
+grep '^[        ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
+    >/dev/null && found_aux_dir=yes
+grep '^[        ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
+    >/dev/null && found_aux_dir=yes
+test $found_aux_dir = yes \
+  || die "configure.ac lacks 'AC_CONFIG_AUX_DIR([$build_aux])'; add it"
+
+# If $build_aux doesn't exist, create it now, otherwise some bits
+# below will malfunction.  If creating it, also mark it as ignored.
+if test ! -d $build_aux; then
+  mkdir $build_aux
+  for dot_ig in x $vc_ignore; do
+    test $dot_ig = x && continue
+    insert_vc_ignore $dot_ig $build_aux
+  done
+fi
+
+# Note this deviates from the version comparison in automake
+# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
+# but this should suffice as we won't be specifying old
+# version formats or redundant trailing .0 in bootstrap.conf.
+# If we did want full compatibility then we should probably
+# use m4_version_compare from autoconf.
+sort_ver() { # sort -V is not generally available
+  ver1="$1"
+  ver2="$2"
+
+  # split on '.' and compare each component
+  i=1
+  while : ; do
+    p1=$(echo "$ver1" | cut -d. -f$i)
+    p2=$(echo "$ver2" | cut -d. -f$i)
+    if [ ! "$p1" ]; then
+      echo "$1 $2"
+      break
+    elif [ ! "$p2" ]; then
+      echo "$2 $1"
+      break
+    elif [ ! "$p1" = "$p2" ]; then
+      if [ "$p1" -gt "$p2" ] 2>/dev/null; then # numeric comparison
+        echo "$2 $1"
+      elif [ "$p2" -gt "$p1" ] 2>/dev/null; then # numeric comparison
+        echo "$1 $2"
+      else # numeric, then lexicographic comparison
+        lp=$(printf "$p1\n$p2\n" | LANG=C sort -n | tail -n1)
+        if [ "$lp" = "$p2" ]; then
+          echo "$1 $2"
+        else
+          echo "$2 $1"
+        fi
+      fi
+      break
+    fi
+    i=$(($i+1))
+  done
+}
+
+get_version_sed='
+# Move version to start of line.
+s/.*[v ]\([0-9]\)/\1/
+
+# Skip lines that do not start with version.
+/^[0-9]/!d
+
+# Remove characters after the version.
+s/[^.a-z0-9-].*//
+
+# The first component must be digits only.
+s/^\([0-9]*\)[a-z-].*/\1/
+
+#the following essentially does s/5.005/5.5/
+s/\.0*\([1-9]\)/.\1/g
+p
+q'
+
+get_version() {
+  app=$1
+
+  $app --version >/dev/null 2>&1 || { $app --version; return 1; }
+
+  $app --version 2>&1 | sed -n "$get_version_sed"
+}
+
+check_versions() {
+  ret=0
+
+  while read app req_ver; do
+    # We only need libtoolize from the libtool package.
+    if test "$app" = libtool; then
+      app=libtoolize
+    fi
+    # Exempt git if --no-git is in effect.
+    if test "$app" = git; then
+      $use_git || continue
+    fi
+    # Honor $APP variables ($TAR, $AUTOCONF, etc.)
+    appvar=$(echo $app | LC_ALL=C tr '[a-z]-' '[A-Z]_')
+    test "$appvar" = TAR && appvar=AMTAR
+    case $appvar in
+        GZIP) ;; # Do not use $GZIP:  it contains gzip options.
+        PERL::*) ;; # Keep perl modules as-is
+        *) eval "app=\${$appvar-$app}" ;;
+    esac
+
+    # Handle the still-experimental Automake-NG programs specially.
+    # They remain named as the mainstream Automake programs ("automake",
+    # and "aclocal") to avoid gratuitous incompatibilities with
+    # pre-existing usages (by, say, autoreconf, or custom autogen.sh
+    # scripts), but correctly identify themselves (as being part of
+    # "GNU automake-ng") when asked their version.
+    case $app in
+      automake-ng|aclocal-ng)
+        app=${app%-ng}
+        ($app --version | grep '(GNU automake-ng)') >/dev/null 2>&1 || {
+          warn_ "Error: '$app' not found or not from Automake-NG"
+          ret=1
+          continue
+        } ;;
+      # Another check is for perl modules.  These can be written as
+      # e.g. perl::XML::XPath in case of XML::XPath module, etc.
+      perl::*)
+        # Extract module name
+        app="${app#perl::}"
+        if ! $PERL -m"$app" -e 'exit 0' >/dev/null 2>&1; then
+          warn_ "Error: perl module '$app' not found"
+          ret=1
+        fi
+        continue
+        ;;
+    esac
+    if [ "$req_ver" = "-" ]; then
+      # Merely require app to exist; not all prereq apps are well-behaved
+      # so we have to rely on $? rather than get_version.
+      if ! check_exists --verbose $app; then
+        warn_ "Error: '$app' not found"
+        ret=1
+      fi
+    else
+      # Require app to produce a new enough version string.
+      inst_ver=$(get_version $app)
+      if [ ! "$inst_ver" ]; then
+        warn_ "Error: '$app' not found"
+        ret=1
+      else
+        latest_ver=$(sort_ver $req_ver $inst_ver | cut -d' ' -f2)
+        if [ ! "$latest_ver" = "$inst_ver" ]; then
+          warnf_ '%s\n'                                        \
+              "Error: '$app' version == $inst_ver is too old"  \
+              "       '$app' version >= $req_ver is required"
+          ret=1
+        fi
+      fi
+    fi
+  done
+
+  return $ret
+}
+
+print_versions() {
+  echo "Program    Min_version"
+  echo "----------------------"
+  printf %s "$buildreq"
+  echo "----------------------"
+  # can't depend on column -t
+}
+
+# Find sha1sum, named gsha1sum on MacPorts, shasum on Mac OS X 10.6.
+# Also find the compatible sha1 utility on the BSDs
+if test x"$SKIP_PO" = x; then
+  find_tool SHA1SUM sha1sum gsha1sum shasum sha1
+fi
+
+use_libtool=0
+# We'd like to use grep -E, to see if any of LT_INIT,
+# AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac,
+# but that's not portable enough (e.g., for Solaris).
+grep '^[        ]*A[CM]_PROG_LIBTOOL' configure.ac >/dev/null \
+  && use_libtool=1
+grep '^[        ]*LT_INIT' configure.ac >/dev/null \
+  && use_libtool=1
+if test $use_libtool = 1; then
+  find_tool LIBTOOLIZE glibtoolize libtoolize
+fi
+
+# gnulib-tool requires at least automake and autoconf.
+# If either is not listed, add it (with minimum version) as a prerequisite.
+case $buildreq in
+  *automake*) ;;
+  *) buildreq="automake 1.9
+$buildreq" ;;
+esac
+case $buildreq in
+  *autoconf*) ;;
+  *) buildreq="autoconf 2.59
+$buildreq" ;;
+esac
+
+# When we can deduce that gnulib-tool will require patch,
+# and when patch is not already listed as a prerequisite, add it, too.
+if test -d "$local_gl_dir" \
+    && ! find "$local_gl_dir" -name '*.diff' -exec false {} +; then
+  case $buildreq in
+    *patch*) ;;
+    *) buildreq="patch -
+$buildreq" ;;
+  esac
+fi
+
+if ! printf "$buildreq" | check_versions; then
+  echo >&2
+  if test -f README-prereq; then
+    die "See README-prereq for how to get the prerequisite programs"
+  else
+    die "Please install the prerequisite programs"
+  fi
+fi
+
+# Warn the user if autom4te appears to be broken; this causes known
+# issues with at least gettext 0.18.3.
+probe=$(echo 'm4_quote([hi])' | autom4te -l M4sugar -t 'm4_quote:$%' -)
+if test "x$probe" != xhi; then
+  warn_ "WARNING: your autom4te wrapper eats stdin;"
+  warn_ "if bootstrap fails, consider upgrading your autotools"
+fi
+
+echo "$0: Bootstrapping from checked-out $package sources..."
+
+# See if we can use gnulib's git-merge-changelog merge driver.
+if $use_git && test -d .git && check_exists git; then
+  if git config merge.merge-changelog.driver >/dev/null ; then
+    :
+  elif check_exists git-merge-changelog; then
+    echo "$0: initializing git-merge-changelog driver"
+    git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
+    git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
+  else
+    echo "$0: consider installing git-merge-changelog from gnulib"
+  fi
+fi
+
+
+cleanup_gnulib() {
+  status=$?
+  rm -fr "$gnulib_path"
+  exit $status
+}
+
+git_modules_config () {
+  test -f .gitmodules && git config --file .gitmodules "$@"
+}
+
+if $use_gnulib; then
+  if $use_git; then
+    gnulib_path=$(git_modules_config submodule.gnulib.path)
+    test -z "$gnulib_path" && gnulib_path=gnulib
+  fi
+
+  # Get gnulib files.  Populate $GNULIB_SRCDIR, possibly updating a
+  # submodule, for use in the rest of the script.
+
+  case ${GNULIB_SRCDIR--} in
+  -)
+    # Note that $use_git is necessarily true in this case.
+    if git_modules_config submodule.gnulib.url >/dev/null; then
+      echo "$0: getting gnulib files..."
+      git submodule init -- "$gnulib_path" || exit $?
+      git submodule update -- "$gnulib_path" || exit $?
+
+    elif [ ! -d "$gnulib_path" ]; then
+      echo "$0: getting gnulib files..."
+
+      trap cleanup_gnulib 1 2 13 15
+
+      shallow=
+      if test -z "$GNULIB_REVISION"; then
+        git clone -h 2>&1 | grep -- --depth > /dev/null && shallow='--depth 2'
+      fi
+      git clone $shallow ${GNULIB_URL:-$default_gnulib_url} "$gnulib_path" \
+        || cleanup_gnulib
+
+      trap - 1 2 13 15
+    fi
+    GNULIB_SRCDIR=$gnulib_path
+    ;;
+  *)
+    # Use GNULIB_SRCDIR directly or as a reference.
+    if $use_git && test -d "$GNULIB_SRCDIR"/.git && \
+          git_modules_config submodule.gnulib.url >/dev/null; then
+      echo "$0: getting gnulib files..."
+      if git submodule -h|grep -- --reference > /dev/null; then
+        # Prefer the one-liner available in git 1.6.4 or newer.
+        git submodule update --init --reference "$GNULIB_SRCDIR" \
+          "$gnulib_path" || exit $?
+      else
+        # This fallback allows at least git 1.5.5.
+        if test -f "$gnulib_path"/gnulib-tool; then
+          # Since file already exists, assume submodule init already complete.
+          git submodule update -- "$gnulib_path" || exit $?
+        else
+          # Older git can't clone into an empty directory.
+          rmdir "$gnulib_path" 2>/dev/null
+          git clone --reference "$GNULIB_SRCDIR" \
+            "$(git_modules_config submodule.gnulib.url)" "$gnulib_path" \
+            && git submodule init -- "$gnulib_path" \
+            && git submodule update -- "$gnulib_path" \
+            || exit $?
+        fi
+      fi
+      GNULIB_SRCDIR=$gnulib_path
+    fi
+    ;;
+  esac
+
+  if test -d "$GNULIB_SRCDIR"/.git && test -n "$GNULIB_REVISION" \
+     && ! git_modules_config submodule.gnulib.url >/dev/null; then
+    (cd "$GNULIB_SRCDIR" && git checkout "$GNULIB_REVISION") || cleanup_gnulib
+  fi
+
+  # $GNULIB_SRCDIR now points to the version of gnulib to use, and
+  # we no longer need to use git or $gnulib_path below here.
+
+  if $bootstrap_sync; then
+    cmp -s "$0" "$GNULIB_SRCDIR/build-aux/bootstrap" || {
+      echo "$0: updating bootstrap and restarting..."
+      case $(sh -c 'echo "$1"' -- a) in
+        a) ignored=--;;
+        *) ignored=ignored;;
+      esac
+      exec sh -c \
+        'cp "$1" "$2" && shift && exec "${CONFIG_SHELL-/bin/sh}" "$@"' \
+        $ignored "$GNULIB_SRCDIR/build-aux/bootstrap" \
+        "$0" "$@" --no-bootstrap-sync
+    }
+  fi
+
+  gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
+  <$gnulib_tool || exit $?
+fi
+
+# Get translations.
+
+download_po_files() {
+  subdir=$1
+  domain=$2
+  echo "$me: getting translations into $subdir for $domain..."
+  cmd=$(printf "$po_download_command_format" "$subdir" "$domain")
+  eval "$cmd"
+}
+
+# Mirror .po files to $po_dir/.reference and copy only the new
+# or modified ones into $po_dir.  Also update $po_dir/LINGUAS.
+# Note po files that exist locally only are left in $po_dir but will
+# not be included in LINGUAS and hence will not be distributed.
+update_po_files() {
+  # Directory containing primary .po files.
+  # Overwrite them only when we're sure a .po file is new.
+  po_dir=$1
+  domain=$2
+
+  # Mirror *.po files into this dir.
+  # Usually contains *.s1 checksum files.
+  ref_po_dir="$po_dir/.reference"
+
+  test -d $ref_po_dir || mkdir $ref_po_dir || return
+  download_po_files $ref_po_dir $domain \
+    && ls "$ref_po_dir"/*.po 2>/dev/null |
+      sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS" || return
+
+  langs=$(cd $ref_po_dir && echo *.po | sed 's/\.po//g')
+  test "$langs" = '*' && langs=x
+  for po in $langs; do
+    case $po in x) continue;; esac
+    new_po="$ref_po_dir/$po.po"
+    cksum_file="$ref_po_dir/$po.s1"
+    if ! test -f "$cksum_file" ||
+        ! test -f "$po_dir/$po.po" ||
+        ! $SHA1SUM -c "$cksum_file" < "$new_po" > /dev/null 2>&1; then
+      echo "$me: updated $po_dir/$po.po..."
+      cp "$new_po" "$po_dir/$po.po" \
+          && $SHA1SUM < "$new_po" > "$cksum_file" || return
+    fi
+  done
+}
+
+case $SKIP_PO in
+'')
+  if test -d po; then
+    update_po_files po $package || exit
+  fi
+
+  if test -d runtime-po; then
+    update_po_files runtime-po $package-runtime || exit
+  fi;;
+esac
+
+symlink_to_dir()
+{
+  src=$1/$2
+  dst=${3-$2}
+
+  test -f "$src" && {
+
+    # If the destination directory doesn't exist, create it.
+    # This is required at least for "lib/uniwidth/cjk.h".
+    dst_dir=$(dirname "$dst")
+    if ! test -d "$dst_dir"; then
+      mkdir -p "$dst_dir"
+
+      # If we've just created a directory like lib/uniwidth,
+      # tell version control system(s) it's ignorable.
+      # FIXME: for now, this does only one level
+      parent=$(dirname "$dst_dir")
+      for dot_ig in x $vc_ignore; do
+        test $dot_ig = x && continue
+        ig=$parent/$dot_ig
+        insert_vc_ignore $ig "${dst_dir##*/}"
+      done
+    fi
+
+    if $copy; then
+      {
+        test ! -h "$dst" || {
+          echo "$me: rm -f $dst" &&
+          rm -f "$dst"
+        }
+      } &&
+      test -f "$dst" &&
+      cmp -s "$src" "$dst" || {
+        echo "$me: cp -fp $src $dst" &&
+        cp -fp "$src" "$dst"
+      }
+    else
+      # Leave any existing symlink alone, if it already points to the source,
+      # so that broken build tools that care about symlink times
+      # aren't confused into doing unnecessary builds.  Conversely, if the
+      # existing symlink's timestamp is older than the source, make it afresh,
+      # so that broken tools aren't confused into skipping needed builds.  See
+      # <https://lists.gnu.org/r/bug-gnulib/2011-05/msg00326.html>.
+      test -h "$dst" &&
+      src_ls=$(ls -diL "$src" 2>/dev/null) && set $src_ls && src_i=$1 &&
+      dst_ls=$(ls -diL "$dst" 2>/dev/null) && set $dst_ls && dst_i=$1 &&
+      test "$src_i" = "$dst_i" &&
+      both_ls=$(ls -dt "$src" "$dst") &&
+      test "X$both_ls" = "X$dst$nl$src" || {
+        dot_dots=
+        case $src in
+        /*) ;;
+        *)
+          case /$dst/ in
+          *//* | */../* | */./* | /*/*/*/*/*/)
+             die "invalid symlink calculation: $src -> $dst";;
+          /*/*/*/*/)    dot_dots=../../../;;
+          /*/*/*/)      dot_dots=../../;;
+          /*/*/)        dot_dots=../;;
+          esac;;
+        esac
+
+        echo "$me: ln -fs $dot_dots$src $dst" &&
+        ln -fs "$dot_dots$src" "$dst"
+      }
+    fi
+  }
+}
+
+version_controlled_file() {
+  parent=$1
+  file=$2
+  if test -d .git; then
+    git rm -n "$file" > /dev/null 2>&1
+  elif test -d .svn; then
+    svn log -r HEAD "$file" > /dev/null 2>&1
+  elif test -d CVS; then
+    grep -F "/${file##*/}/" "$parent/CVS/Entries" 2>/dev/null |
+             grep '^/[^/]*/[0-9]' > /dev/null
+  else
+    warn_ "no version control for $file?"
+    false
+  fi
+}
+
+# NOTE: we have to be careful to run both autopoint and libtoolize
+# before gnulib-tool, since gnulib-tool is likely to provide newer
+# versions of files "installed" by these two programs.
+# Then, *after* gnulib-tool (see below), we have to be careful to
+# run autoreconf in such a way that it does not run either of these
+# two just-pre-run programs.
+
+# Import from gettext.
+with_gettext=yes
+grep '^[        ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
+    with_gettext=no
+
+if test $with_gettext = yes || test $use_libtool = 1; then
+
+  tempbase=.bootstrap$$
+  trap "rm -f $tempbase.0 $tempbase.1" 1 2 13 15
+
+  > $tempbase.0 > $tempbase.1 &&
+  find . ! -type d -print | sort > $tempbase.0 || exit
+
+  if test $with_gettext = yes; then
+    # Released autopoint has the tendency to install macros that have been
+    # obsoleted in current gnulib, so run this before gnulib-tool.
+    echo "$0: $AUTOPOINT --force"
+    $AUTOPOINT --force || exit
+  fi
+
+  # Autoreconf runs aclocal before libtoolize, which causes spurious
+  # warnings if the initial aclocal is confused by the libtoolized
+  # (or worse out-of-date) macro directory.
+  # libtoolize 1.9b added the --install option; but we support back
+  # to libtoolize 1.5.22, where the install action was default.
+  if test $use_libtool = 1; then
+    install=
+    case $($LIBTOOLIZE --help) in
+      *--install*) install=--install ;;
+    esac
+    echo "running: $LIBTOOLIZE $install --copy"
+    $LIBTOOLIZE $install --copy
+  fi
+
+  find . ! -type d -print | sort >$tempbase.1
+  old_IFS=$IFS
+  IFS=$nl
+  for file in $(comm -13 $tempbase.0 $tempbase.1); do
+    IFS=$old_IFS
+    parent=${file%/*}
+    version_controlled_file "$parent" "$file" || {
+      for dot_ig in x $vc_ignore; do
+        test $dot_ig = x && continue
+        ig=$parent/$dot_ig
+        insert_vc_ignore "$ig" "${file##*/}"
+      done
+    }
+  done
+  IFS=$old_IFS
+
+  rm -f $tempbase.0 $tempbase.1
+  trap - 1 2 13 15
+fi
+
+# Import from gnulib.
+
+if $use_gnulib; then
+  gnulib_tool_options="\
+   --no-changelog\
+   --aux-dir=$build_aux\
+   --doc-base=$doc_base\
+   --lib=$gnulib_name\
+   --m4-base=$m4_base/\
+   --source-base=$source_base/\
+   --tests-base=$tests_base\
+   --local-dir=$local_gl_dir\
+   $gnulib_tool_option_extras\
+  "
+  if test $use_libtool = 1; then
+    case "$gnulib_tool_options " in
+      *' --libtool '*) ;;
+      *) gnulib_tool_options="$gnulib_tool_options --libtool" ;;
+    esac
+  fi
+  echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
+  $gnulib_tool $gnulib_tool_options --import $gnulib_modules \
+    || die "gnulib-tool failed"
+
+  for file in $gnulib_files; do
+    symlink_to_dir "$GNULIB_SRCDIR" $file \
+      || die "failed to symlink $file"
+  done
+fi
+
+bootstrap_post_import_hook \
+  || die "bootstrap_post_import_hook failed"
+
+# Don't proceed if there are uninitialized submodules.  In particular,
+# the next step will remove dangling links, which might be links into
+# uninitialized submodules.
+#
+# Uninitialized submodules are listed with an initial dash.
+if $use_git && git submodule | grep '^-' >/dev/null; then
+  die "some git submodules are not initialized. "     \
+      "Run 'git submodule update --init' and bootstrap again."
+fi
+
+# Remove any dangling symlink matching "*.m4" or "*.[ch]" in some
+# gnulib-populated directories.  Such .m4 files would cause aclocal to fail.
+# The following requires GNU find 4.2.3 or newer.  Considering the usual
+# portability constraints of this script, that may seem a very demanding
+# requirement, but it should be ok.  Ignore any failure, which is fine,
+# since this is only a convenience to help developers avoid the relatively
+# unusual case in which a symlinked-to .m4 file is git-removed from gnulib
+# between successive runs of this script.
+find "$m4_base" "$source_base" \
+  -depth \( -name '*.m4' -o -name '*.[ch]' \) \
+  -type l -xtype l -delete > /dev/null 2>&1
+
+# Invoke autoreconf with --force --install to ensure upgrades of tools
+# such as ylwrap.
+AUTORECONFFLAGS="--verbose --install --force -I $m4_base $ACLOCAL_FLAGS"
+
+# Some systems (RHEL 5) are using ancient autotools, for which the
+# --no-recursive option had not been invented.  Detect that lack and
+# omit the option when it's not supported.  FIXME in 2017: remove this
+# hack when RHEL 5 autotools are updated, or when they become irrelevant.
+case $($AUTORECONF --help) in
+  *--no-recursive*) AUTORECONFFLAGS="$AUTORECONFFLAGS --no-recursive";;
+esac
+
+# Tell autoreconf not to invoke autopoint or libtoolize; they were run above.
+echo "running: AUTOPOINT=true LIBTOOLIZE=true $AUTORECONF $AUTORECONFFLAGS"
+AUTOPOINT=true LIBTOOLIZE=true $AUTORECONF $AUTORECONFFLAGS \
+  || die "autoreconf failed"
+
+# Get some extra files from gnulib, overriding existing files.
+for file in $gnulib_extra_files; do
+  case $file in
+  */INSTALL) dst=INSTALL;;
+  build-aux/*) dst=$build_aux/${file#build-aux/};;
+  *) dst=$file;;
+  esac
+  symlink_to_dir "$GNULIB_SRCDIR" $file $dst \
+    || die "failed to symlink $file"
+done
+
+if test $with_gettext = yes; then
+  # Create gettext configuration.
+  echo "$0: Creating po/Makevars from po/Makevars.template ..."
+  rm -f po/Makevars
+  sed '
+    /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
+    /^COPYRIGHT_HOLDER *=/s/=.*/= '"$COPYRIGHT_HOLDER"'/
+    /^MSGID_BUGS_ADDRESS *=/s|=.*|= '"$MSGID_BUGS_ADDRESS"'|
+    /^XGETTEXT_OPTIONS *=/{
+      s/$/ \\/
+      a\
+          '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
+    }
+  ' po/Makevars.template >po/Makevars \
+    || die 'cannot generate po/Makevars'
+
+  # If the 'gettext' module is in use, grab the latest Makefile.in.in.
+  # If only the 'gettext-h' module is in use, assume autopoint already
+  # put the correct version of this file into place.
+  case $gnulib_modules in
+  *gettext-h*) ;;
+  *gettext*)
+    cp $GNULIB_SRCDIR/build-aux/po/Makefile.in.in po/Makefile.in.in \
+      || die "cannot create po/Makefile.in.in"
+    ;;
+  esac
+
+  if test -d runtime-po; then
+    # Similarly for runtime-po/Makevars, but not quite the same.
+    rm -f runtime-po/Makevars
+    sed '
+      /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
+      /^subdir *=.*/s/=.*/= runtime-po/
+      /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
+      /^XGETTEXT_OPTIONS *=/{
+        s/$/ \\/
+        a\
+            '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
+      }
+    ' po/Makevars.template >runtime-po/Makevars \
+    || die 'cannot generate runtime-po/Makevars'
+
+    # Copy identical files from po to runtime-po.
+    (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
+  fi
+fi
+
+bootstrap_epilogue
+
+echo "$0: done.  Now you can run './configure'."
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/deps/lightning/bootstrap.conf b/deps/lightning/bootstrap.conf
new file mode 100644 (file)
index 0000000..423491b
--- /dev/null
@@ -0,0 +1,76 @@
+# Bootstrap configuration.
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# This program 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 General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+
+# gnulib modules used by this package.
+gnulib_modules="
+"
+
+# gnulib library name.
+gnulib_name=libgnu
+
+# directories.
+source_base=gnulib-lib
+doc_base=gnulib-doc
+
+# Additional xgettext options to use.  Use "\\\newline" to break lines.
+XGETTEXT_OPTIONS=$XGETTEXT_OPTIONS'\\\
+ --from-code=UTF-8\\\
+ --flag=asprintf:2:c-format --flag=vasprintf:2:c-format\\\
+ --flag=asnprintf:3:c-format --flag=vasnprintf:3:c-format\\\
+ --flag=wrapf:1:c-format\\\
+'
+
+# If "AM_GNU_GETTEXT(external" or "AM_GNU_GETTEXT([external]"
+# appears in configure.ac, exclude some unnecessary files.
+# Without grep's -E option (not portable enough, pre-configure),
+# the following test is ugly.  Also, this depends on the existence
+# of configure.ac, not the obsolescent-named configure.in.  But if
+# you're using this infrastructure, you should care about such things.
+
+gettext_external=0
+grep '^[        ]*AM_GNU_GETTEXT(external\>' configure.ac > /dev/null &&
+  gettext_external=1
+grep '^[        ]*AM_GNU_GETTEXT(\[external\]' configure.ac > /dev/null &&
+  gettext_external=1
+
+if test $gettext_external = 1; then
+  # Gettext supplies these files, but we don't need them since
+  # we don't have an intl subdirectory.
+  excluded_files='
+      m4/glibc2.m4
+      m4/intdiv0.m4
+      m4/lcmessage.m4
+      m4/lock.m4
+      m4/printf-posix.m4
+      m4/size_max.m4
+      m4/uintmax_t.m4
+      m4/ulonglong.m4
+      m4/visibility.m4
+      m4/xsize.m4
+  '
+fi
+
+# Build prerequisites
+buildreq="\
+autoconf   2.59
+automake   1.9.6
+git        1.5.5
+tar        -
+"
+
+bootstrap_sync=true
index e04f7ac..583bb12 100644 (file)
@@ -14,7 +14,7 @@
 # License for more details.
 #
 
-AM_CFLAGS = -I$(top_srcdir)/include -D_GNU_SOURCE
+AM_CFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include -D_GNU_SOURCE
 
 check_PROGRAMS = lightning ccall self setcode nodata ctramp carg cva_list
 
@@ -91,6 +91,7 @@ EXTRA_DIST =                          \
        call.tst        call.ok         \
        float.tst       float.ok        \
        jmpr.tst        jmpr.ok         \
+       live.tst        live.ok         \
        put.tst         put.ok          \
        qalu.inc                        \
        qalu_mul.tst    qalu_mul.ok     \
@@ -125,7 +126,7 @@ base_TESTS =                                \
        fop_abs fop_sqrt                \
        varargs stack                   \
        clobber carry call              \
-       float jmpr put                  \
+       float jmpr live put             \
        qalu_mul qalu_div               \
        range ranger ret tramp          \
        va_list
@@ -315,4 +316,3 @@ CLEANFILES = $(TESTS)
 
 debug:         lightning
        $(LIBTOOL) --mode=execute gdb lightning
-
index e60ef05..cc4a5c5 100644 (file)
@@ -3791,11 +3791,11 @@ execute(int argc, char *argv[])
     function = jit_emit();
     if (flag_verbose > 1 || flag_disasm) {
        jit_print();
-       fprintf(stdout, "  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n");
+       fprintf(stderr, "  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n");
     }
     if (flag_verbose > 0 || flag_disasm) {
        jit_disassemble();
-       fprintf(stdout, "  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n");
+       fprintf(stderr, "  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n");
     }
 
     jit_clear_state();
diff --git a/deps/lightning/check/live.ok b/deps/lightning/check/live.ok
new file mode 100644 (file)
index 0000000..9766475
--- /dev/null
@@ -0,0 +1 @@
+ok
diff --git a/deps/lightning/check/live.tst b/deps/lightning/check/live.tst
new file mode 100644 (file)
index 0000000..f082a66
--- /dev/null
@@ -0,0 +1,33 @@
+.data  16
+ok:
+.c     "ok"
+
+.code
+       jmpi main
+
+check_r0:
+       prolog
+        movi %v0 exit_r0
+       movi %r0 1
+       movi %r2 10
+       // on x86 this changes %rax on other arches could use %r0 as temporary
+       divi %r1 %r2 3
+        live %r0
+       // %r0 must still be 1
+        jmpr %v0
+exit_r0:
+        retr %r0
+       epilog
+
+main:
+       prolog
+       calli check_r0
+       retval %r1
+       beqi r0_ok %r1 1
+       calli @abort
+r0_ok:
+       prepare
+               pushargi ok
+       finishi @puts
+       ret
+       epilog
index 9261255..1f2c6b4 100644 (file)
@@ -7,26 +7,29 @@ dnl GNU lightning is free software; you can redistribute it and/or modify it
 dnl under the terms of the GNU Lesser General Public License as published
 dnl by the Free Software Foundation; either version 3, or (at your option)
 dnl any later version.
-dnl 
+dnl
 dnl GNU lightning is distributed in the hope that it will be useful, but
 dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 dnl or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
 dnl License for more details.
 dnl
 
-AC_PREREQ(2.57)
+AC_PREREQ(2.64)
 AC_INIT([GNU lightning], 2.1.3, pcpa@gnu.org, lightning)
+AC_CONFIG_AUX_DIR([build-aux])
 AC_CANONICAL_TARGET
 AC_CONFIG_SRCDIR([Makefile.am])
 AM_INIT_AUTOMAKE([dist-bzip2])
 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
-AC_CONFIG_MACRO_DIR(m4)
+AC_CONFIG_MACRO_DIR([m4])
 
-AC_CONFIG_HEADERS(config.h)
+AC_CONFIG_HEADERS([config.h])
 
 AC_PROG_CC
-AC_PROG_INSTALL
-AC_PROG_LIBTOOL
+gl_EARLY
+AM_PROG_AR
+LT_INIT
+gl_INIT
 
 case "$target_cpu" in
     ia64)
@@ -291,6 +294,7 @@ fi
 
 AC_OUTPUT([Makefile
           lightning.pc
+           gnulib-lib/Makefile
           doc/Makefile
           include/Makefile
           include/lightning/Makefile
index 20d4456..c46e0ab 100644 (file)
@@ -14,7 +14,7 @@
 # License for more details.
 #
 
-AM_CFLAGS = -I$(top_srcdir)/include -D_GNU_SOURCE
+AM_CFLAGS = -I $(top_builddir)/include -I$(top_srcdir)/include -D_GNU_SOURCE
 
 info_TEXINFOS = lightning.texi
 MOSTLYCLEANFILES = lightning.tmp
index 4aef7a3..c14f635 100644 (file)
@@ -30,6 +30,7 @@ dynamic code generation.
 * The instruction set::     The RISC instruction set used in GNU lightning
 * GNU lightning examples::  GNU lightning's examples
 * Reentrancy::              Re-entrant usage of GNU lightning
+* Registers::               Accessing the whole register file
 * Customizations::          Advanced code generation customizations
 * Acknowledgements::        Acknowledgements for GNU lightning
 @end menu
@@ -43,8 +44,8 @@ This document describes @value{TOPIC} the @lightning{} library for
 dynamic code generation.
 @end iftex
 
-Dynamic code generation is the generation of machine code 
-at runtime. It is typically used to strip a layer of interpretation 
+Dynamic code generation is the generation of machine code
+at runtime. It is typically used to strip a layer of interpretation
 by allowing compilation to occur at runtime.  One of the most
 well-known applications of dynamic code generation is perhaps that
 of interpreters that compile source code to an intermediate bytecode
@@ -53,7 +54,7 @@ approach effectively combines the portability of bytecode
 representations with the speed of machine code.  Another common
 application of dynamic code generation is in the field of hardware
 simulators and binary emulators, which can use the same techniques
-to translate simulated instructions to the instructions of the 
+to translate simulated instructions to the instructions of the
 underlying machine.
 
 Yet other applications come to mind: for example, windowing
@@ -68,7 +69,7 @@ retargeted for each machine; in addition, coding a run-time code
 generator is a tedious and error-prone task more than a difficult one.
 
 @lightning{} provides a portable, fast and easily retargetable dynamic
-code generation system. 
+code generation system.
 
 To be portable, @lightning{} abstracts over current architectures'
 quirks and unorthogonalities.  The interface that it exposes to is that
@@ -695,6 +696,51 @@ in = arg                     @rem{! Same as above}
      ret                     @rem{! Return to caller}
 @end example
 
+@item Register liveness
+
+During code generation, @lightning{} occasionally needs scratch registers
+or needs to use architecture-defined registers.  For that, @lightning{}
+internally maintains register liveness information.
+
+In the following example, @code{qdivr} will need special registers like
+@code{R0} on some architectures.  As @lightning{} understands that
+@code{R0} is used in the subsequent instruction, it will create
+save/restore code for @code{R0} in case.
+
+@example
+...
+qdivr V0, V1, V2, V3
+movr  V3, R0
+...
+@end example
+
+The same is not true in the example that follows.  Here, @code{R0} is
+not alive after the division operation because @code{R0} is neither an
+argument register nor a callee-save register.  Thus, no save/restore
+code for @code{R0} will be created in case.
+
+@example
+...
+qdivr V0, V1, V2, V3
+jmpr  R1
+...
+@end example
+
+The @code{live} instruction can be used to mark a register as live after
+it as in the following example.  Here, @code{R0} will be preserved
+across the division.
+
+@example
+...
+qdivr V0, V1, V2, V3
+live R0
+jmpr R1
+...
+@end example
+
+The @code{live} instruction is useful at code entry and exit points,
+like after and before a @code{callr} instruction.
+
 @item Trampolines, continuations and tail call optimization
 
 Frequently it is required to generate jit code that must jump to
@@ -1005,9 +1051,9 @@ programmer would write):
       mov  %i0, %g2                 retl
       inc  %g2                      inc %o0
       mov  %g2, %i0
-      restore 
-      retl 
-      nop 
+      restore
+      retl
+      nop
 @end example
 In this case, @lightning{} introduces overhead to create a register
 window (not knowing that the procedure is a leaf procedure) and to
@@ -1480,7 +1526,7 @@ implementation and to avoid needing the user to keep adding an extra
 argument to every call, as multiple jit states generating code in
 paralell should be very uncommon.
 
-@section Registers
+@node Registers
 @chapter Accessing the whole register file
 
 As mentioned earlier in this chapter, all @lightning{} back-ends are
@@ -1496,6 +1542,33 @@ constant.  Of course, expressions like @code{JIT_R0} and
 @code{JIT_R(0)} denote the same register, and likewise for
 integer callee-saved, or floating-point, registers.
 
+@section Scratch registers
+
+For operations, @lightning{} does not support directly, like storing
+a literal in memory, @code{jit_get_reg} and @code{jit_unget_reg} can be used to
+acquire and release a scratch register as in the following pattern:
+
+@example
+    jit_int32_t reg = jit_get_reg (jit_class_gpr);
+    jit_movi (reg, immediate);
+    jit_stxi (offsetof (some_struct, some_field), JIT_V0, reg);
+    jit_unget_reg (reg);
+@end example
+
+As @code{jit_get_reg} and @code{jit_unget_reg} may generate spills and
+reloads but don't follow branches, the code between both must be in
+the same basic block and must not contain any branches as in the
+following (bad) example.
+
+@example
+    jit_int32_t reg = jit_get_reg (jit_class_gpr);
+    jit_ldxi (reg, JIT_V0, offset);
+    jump = jit_bnei (reg, V0);
+    jit_movr (JIT_V1, reg);
+    jit_patch (jump);
+    jit_unget_reg (reg);
+@end example
+
 @node Customizations
 @chapter Customizations
 
diff --git a/deps/lightning/doc/version.texi b/deps/lightning/doc/version.texi
deleted file mode 100644 (file)
index b4a0c22..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-@set UPDATED 3 October 2017
-@set UPDATED-MONTH October 2017
-@set EDITION 2.1.3
-@set VERSION 2.1.3
diff --git a/deps/lightning/gnulib b/deps/lightning/gnulib
new file mode 160000 (submodule)
index 0000000..e54b645
--- /dev/null
@@ -0,0 +1 @@
+Subproject commit e54b645fc6b8422562327443bda575c65d931fbd
diff --git a/deps/lightning/gnulib-lib/.gitignore b/deps/lightning/gnulib-lib/.gitignore
new file mode 100644 (file)
index 0000000..d9f5394
--- /dev/null
@@ -0,0 +1,2 @@
+/Makefile.am
+/dummy.c
diff --git a/deps/lightning/include/lightning.h b/deps/lightning/include/lightning.h
deleted file mode 100644 (file)
index 4c7cac0..0000000
+++ /dev/null
@@ -1,1112 +0,0 @@
-/*
- * Copyright (C) 2012-2019  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
- */
-
-#ifndef _lightning_h
-#define _lightning_h
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-
-#if defined(__hpux) && defined(__hppa__)
-#  include <machine/param.h>
-#endif
-#if defined(__alpha__) && defined(__osf__)
-#  include <machine/endian.h>
-#endif
-
-#ifndef __WORDSIZE
-#  if defined(WORDSIZE)                                /* ppc darwin */
-#    define __WORDSIZE         WORDSIZE
-#  elif defined(__SIZEOF_POINTER__)            /* ppc aix */
-#    define __WORDSIZE         (__SIZEOF_POINTER__ << 3)
-#  elif defined(_ILP32)                                /* hppa hp-ux */
-#    define __WORDSIZE         32
-#  elif defined(_LP64)                         /* ia64 hp-ux (with cc +DD64) */
-#    define __WORDSIZE         64
-#  elif defined(_MIPS_SZPTR)                   /* mips irix */
-#    if _MIPS_SZPTR == 32
-#      define __WORDSIZE       32
-#    else
-#      define __WORDSIZE       64
-#    endif
-#  else                                                /* From FreeBSD 9.1 stdint.h */
-#    if defined(UINTPTR_MAX) && defined(UINT64_MAX) && \
-       (UINTPTR_MAX == UINT64_MAX)
-#      define __WORDSIZE       64
-#    else
-#      define __WORDSIZE       32
-#    endif
-#  endif
-#endif
-#ifndef __LITTLE_ENDIAN
-#  if defined(LITTLE_ENDIAN)                   /* ppc darwin */
-#    define __LITTLE_ENDIAN    LITTLE_ENDIAN
-#  elif defined(__ORDER_LITTLE_ENDIAN__)       /* ppc aix */
-#    define __LITTLE_ENDIAN    __ORDER_LITTLE_ENDIAN__
-#  else
-#    define __LITTLE_ENDIAN    1234
-#  endif
-#endif
-#ifndef __BIG_ENDIAN
-#  if defined(BIG_ENDIAN)                      /* ppc darwin */
-#    define __BIG_ENDIAN       BIG_ENDIAN
-#  elif defined(__ORDER_BIG_ENDIAN__)          /* ppc aix */
-#    define __BIG_ENDIAN       __ORDER_BIG_ENDIAN__
-#  else
-#    define __BIG_ENDIAN       4321
-#  endif
-#endif
-#ifndef __BYTE_ORDER
-#  if defined(BYTE_ORDER)                      /* ppc darwin */
-#    define __BYTE_ORDER       BYTE_ORDER
-#  elif defined(__BYTE_ORDER__)                        /* ppc aix */
-#    define __BYTE_ORDER       __BYTE_ORDER__
-#  elif defined(_BIG_ENDIAN)                   /* hppa hp-ux */
-#    define __BYTE_ORDER       __BIG_ENDIAN
-#  elif defined(__BIG_ENDIAN__)                        /* ia64 hp-ux */
-#    define __BYTE_ORDER       __BIG_ENDIAN
-#  elif defined(__i386__)                      /* 32 bit x86 solaris */
-#    define __BYTE_ORDER       __LITTLE_ENDIAN
-#  elif defined(__x86_64__)                    /* 64 bit x86 solaris */
-#    define __BYTE_ORDER       __LITTLE_ENDIAN
-#  elif defined(__MIPSEB)                      /* mips irix */
-#    define __BYTE_ORDER       __BIG_ENDIAN
-#  else
-#    error cannot figure __BYTE_ORDER
-#  endif
-#endif
-
-typedef signed char            jit_int8_t;
-typedef unsigned char          jit_uint8_t;
-typedef signed short           jit_int16_t;
-typedef unsigned short         jit_uint16_t;
-typedef signed int             jit_int32_t;
-typedef unsigned int           jit_uint32_t;
-#if __WORDSIZE == 32
-typedef signed long long       jit_int64_t;
-typedef unsigned long long     jit_uint64_t;
-typedef jit_int32_t            jit_word_t;
-typedef jit_uint32_t           jit_uword_t;
-#elif (_WIN32 && !__CYGWIN__)
-typedef signed long long       jit_int64_t;
-typedef unsigned long long     jit_uint64_t;
-typedef jit_int64_t            jit_word_t;
-typedef jit_uint64_t           jit_uword_t;
-#else
-typedef signed long            jit_int64_t;
-typedef unsigned long          jit_uint64_t;
-typedef jit_int64_t            jit_word_t;
-typedef jit_uint64_t           jit_uword_t;
-#endif
-typedef float                  jit_float32_t;
-typedef double                 jit_float64_t;
-typedef void*                  jit_pointer_t;
-typedef jit_int32_t            jit_bool_t;
-typedef jit_int32_t            jit_gpr_t;
-typedef jit_int32_t            jit_fpr_t;
-
-#if defined(__i386__) || defined(__x86_64__)
-#  include <lightning/jit_x86.h>
-#elif defined(__mips__)
-#  include <lightning/jit_mips.h>
-#elif defined(__arm__)
-#  include <lightning/jit_arm.h>
-#elif defined(__powerpc__)
-#  include <lightning/jit_ppc.h>
-#elif defined(__sparc__)
-#  include <lightning/jit_sparc.h>
-#elif defined(__ia64__)
-#  include <lightning/jit_ia64.h>
-#elif defined(__hppa__)
-#  include <lightning/jit_hppa.h>
-#elif defined(__aarch64__)
-#  include <lightning/jit_aarch64.h>
-#elif defined(__s390__) || defined(__s390x__)
-#  include <lightning/jit_s390.h>
-#elif defined(__alpha__)
-#  include <lightning/jit_alpha.h>
-#elif defined(__riscv)
-#  include <lightning/jit_riscv.h>
-#elif defined(__sh__)
-#  include <lightning/jit_sh.h>
-#endif
-
-#define jit_flag_node          0x0001  /* patch node not absolute */
-#define jit_flag_patch         0x0002  /* jump already patched */
-#define jit_flag_data          0x0004  /* data in the constant pool */
-#define jit_flag_use           0x0008  /* do not remove marker label */
-#define jit_flag_synth         0x0010  /* synthesized instruction */
-#define jit_flag_head          0x1000  /* label reached by normal flow */
-#define jit_flag_varargs       0x2000  /* call{r,i} to varargs function */
-
-#define JIT_R(index)           jit_r(index)
-#define JIT_V(index)           jit_v(index)
-#define JIT_A(index)           jit_a(index)
-#define JIT_F(index)           jit_f(index)
-#define JIT_R_NUM              jit_r_num()
-#define JIT_V_NUM              jit_v_num()
-#define JIT_A_NUM              jit_a_num()
-#define JIT_F_NUM              jit_f_num()
-
-#define JIT_DISABLE_DATA       1       /* force synthesize of constants */
-#define JIT_DISABLE_NOTE       2       /* disable debug info generation */
-
-#define jit_class_chk          0x02000000      /* just checking */
-#define jit_class_arg          0x08000000      /* argument register */
-#define jit_class_sav          0x10000000      /* callee save */
-#define jit_class_gpr          0x20000000      /* general purpose */
-#define jit_class_fpr          0x40000000      /* float */
-#define jit_class(reg)         ((reg) & 0xffff0000)
-#define jit_regno(reg)         ((reg) & 0x00007fff)
-
-typedef struct jit_node                jit_node_t;
-typedef struct jit_state       jit_state_t;
-
-typedef enum {
-    jit_code_data,
-#define jit_live(u)            jit_new_node_w(jit_code_live, u)
-#define jit_align(u)           jit_new_node_w(jit_code_align, u)
-    jit_code_live,             jit_code_align,
-    jit_code_save,             jit_code_load,
-#define jit_name(u)            _jit_name(_jit,u)
-    jit_code_name,
-#define jit_note(u, v)         _jit_note(_jit, u, v)
-#define jit_label()            _jit_label(_jit)
-#define jit_forward()          _jit_forward(_jit)
-#define jit_indirect()         _jit_indirect(_jit)
-#define jit_link(u)            _jit_link(_jit,u)
-    jit_code_note,             jit_code_label,
-
-#define jit_prolog()           _jit_prolog(_jit)
-    jit_code_prolog,
-
-#define jit_ellipsis()         _jit_ellipsis(_jit)
-    jit_code_ellipsis,
-#define jit_va_push(u)         _jit_va_push(_jit,u)
-    jit_code_va_push,
-#define jit_allocai(u)         _jit_allocai(_jit,u)
-#define jit_allocar(u, v)      _jit_allocar(_jit,u,v)
-    jit_code_allocai,          jit_code_allocar,
-
-#define jit_arg()              _jit_arg(_jit)
-    jit_code_arg,
-#define jit_getarg_c(u,v)      _jit_getarg_c(_jit,u,v)
-#define jit_getarg_uc(u,v)     _jit_getarg_uc(_jit,u,v)
-    jit_code_getarg_c,         jit_code_getarg_uc,
-#define jit_getarg_s(u,v)      _jit_getarg_s(_jit,u,v)
-#define jit_getarg_us(u,v)     _jit_getarg_us(_jit,u,v)
-    jit_code_getarg_s,         jit_code_getarg_us,
-#define jit_getarg_i(u,v)      _jit_getarg_i(_jit,u,v)
-#if __WORDSIZE == 32
-#  define jit_getarg(u,v)      jit_getarg_i(u,v)
-#  define jit_getarg_ui(u,v)   jit_getarg_i(u,v)
-#else
-#  define jit_getarg(u,v)      jit_getarg_l(u,v)
-#  define jit_getarg_ui(u,v)   _jit_getarg_ui(_jit,u,v)
-#  define jit_getarg_l(u,v)    _jit_getarg_l(_jit,u,v)
-#endif
-    jit_code_getarg_i,         jit_code_getarg_ui,
-    jit_code_getarg_l,
-#  define jit_putargr(u,v)     _jit_putargr(_jit,u,v)
-#  define jit_putargi(u,v)     _jit_putargi(_jit,u,v)
-    jit_code_putargr,          jit_code_putargi,
-
-#define jit_va_start(u)                jit_new_node_w(jit_code_va_start, u)
-    jit_code_va_start,
-#define jit_va_arg(u, v)       jit_new_node_ww(jit_code_va_arg, u, v)
-#define jit_va_arg_d(u, v)     jit_new_node_ww(jit_code_va_arg_d, u, v)
-    jit_code_va_arg,           jit_code_va_arg_d,
-#define jit_va_end(u)          jit_new_node_w(jit_code_va_end, u)
-    jit_code_va_end,
-
-#define jit_addr(u,v,w)                jit_new_node_www(jit_code_addr,u,v,w)
-#define jit_addi(u,v,w)                jit_new_node_www(jit_code_addi,u,v,w)
-    jit_code_addr,             jit_code_addi,
-#define jit_addcr(u,v,w)       jit_new_node_www(jit_code_addcr,u,v,w)
-#define jit_addci(u,v,w)       jit_new_node_www(jit_code_addci,u,v,w)
-    jit_code_addcr,            jit_code_addci,
-#define jit_addxr(u,v,w)       jit_new_node_www(jit_code_addxr,u,v,w)
-#define jit_addxi(u,v,w)       jit_new_node_www(jit_code_addxi,u,v,w)
-    jit_code_addxr,            jit_code_addxi,
-#define jit_subr(u,v,w)                jit_new_node_www(jit_code_subr,u,v,w)
-#define jit_subi(u,v,w)                jit_new_node_www(jit_code_subi,u,v,w)
-    jit_code_subr,             jit_code_subi,
-#define jit_subcr(u,v,w)       jit_new_node_www(jit_code_subcr,u,v,w)
-#define jit_subci(u,v,w)       jit_new_node_www(jit_code_subci,u,v,w)
-    jit_code_subcr,            jit_code_subci,
-#define jit_subxr(u,v,w)       jit_new_node_www(jit_code_subxr,u,v,w)
-#define jit_subxi(u,v,w)       jit_new_node_www(jit_code_subxi,u,v,w)
-    jit_code_subxr,            jit_code_subxi,
-#define jit_rsbr(u,v,w)                jit_subr(u,w,v)
-#define jit_rsbi(u,v,w)                jit_new_node_www(jit_code_rsbi,u,v,w)
-    jit_code_rsbi,
-#define jit_mulr(u,v,w)                jit_new_node_www(jit_code_mulr,u,v,w)
-#define jit_muli(u,v,w)                jit_new_node_www(jit_code_muli,u,v,w)
-    jit_code_mulr,             jit_code_muli,
-#define jit_qmulr(l,h,v,w)     jit_new_node_qww(jit_code_qmulr,l,h,v,w)
-#define jit_qmuli(l,h,v,w)     jit_new_node_qww(jit_code_qmuli,l,h,v,w)
-    jit_code_qmulr,            jit_code_qmuli,
-#define jit_qmulr_u(l,h,v,w)   jit_new_node_qww(jit_code_qmulr_u,l,h,v,w)
-#define jit_qmuli_u(l,h,v,w)   jit_new_node_qww(jit_code_qmuli_u,l,h,v,w)
-    jit_code_qmulr_u,          jit_code_qmuli_u,
-#define jit_divr(u,v,w)                jit_new_node_www(jit_code_divr,u,v,w)
-#define jit_divi(u,v,w)                jit_new_node_www(jit_code_divi,u,v,w)
-    jit_code_divr,             jit_code_divi,
-#define jit_divr_u(u,v,w)      jit_new_node_www(jit_code_divr_u,u,v,w)
-#define jit_divi_u(u,v,w)      jit_new_node_www(jit_code_divi_u,u,v,w)
-    jit_code_divr_u,           jit_code_divi_u,
-#define jit_qdivr(l,h,v,w)     jit_new_node_qww(jit_code_qdivr,l,h,v,w)
-#define jit_qdivi(l,h,v,w)     jit_new_node_qww(jit_code_qdivi,l,h,v,w)
-    jit_code_qdivr,            jit_code_qdivi,
-#define jit_qdivr_u(l,h,v,w)   jit_new_node_qww(jit_code_qdivr_u,l,h,v,w)
-#define jit_qdivi_u(l,h,v,w)   jit_new_node_qww(jit_code_qdivi_u,l,h,v,w)
-    jit_code_qdivr_u,          jit_code_qdivi_u,
-#define jit_remr(u,v,w)                jit_new_node_www(jit_code_remr,u,v,w)
-#define jit_remi(u,v,w)                jit_new_node_www(jit_code_remi,u,v,w)
-    jit_code_remr,             jit_code_remi,
-#define jit_remr_u(u,v,w)      jit_new_node_www(jit_code_remr_u,u,v,w)
-#define jit_remi_u(u,v,w)      jit_new_node_www(jit_code_remi_u,u,v,w)
-    jit_code_remr_u,           jit_code_remi_u,
-
-#define jit_andr(u,v,w)                jit_new_node_www(jit_code_andr,u,v,w)
-#define jit_andi(u,v,w)                jit_new_node_www(jit_code_andi,u,v,w)
-    jit_code_andr,             jit_code_andi,
-#define jit_orr(u,v,w)         jit_new_node_www(jit_code_orr,u,v,w)
-#define jit_ori(u,v,w)         jit_new_node_www(jit_code_ori,u,v,w)
-    jit_code_orr,              jit_code_ori,
-#define jit_xorr(u,v,w)                jit_new_node_www(jit_code_xorr,u,v,w)
-#define jit_xori(u,v,w)                jit_new_node_www(jit_code_xori,u,v,w)
-    jit_code_xorr,             jit_code_xori,
-
-#define jit_lshr(u,v,w)                jit_new_node_www(jit_code_lshr,u,v,w)
-#define jit_lshi(u,v,w)                jit_new_node_www(jit_code_lshi,u,v,w)
-    jit_code_lshr,             jit_code_lshi,
-#define jit_rshr(u,v,w)                jit_new_node_www(jit_code_rshr,u,v,w)
-#define jit_rshi(u,v,w)                jit_new_node_www(jit_code_rshi,u,v,w)
-    jit_code_rshr,             jit_code_rshi,
-#define jit_rshr_u(u,v,w)      jit_new_node_www(jit_code_rshr_u,u,v,w)
-#define jit_rshi_u(u,v,w)      jit_new_node_www(jit_code_rshi_u,u,v,w)
-    jit_code_rshr_u,           jit_code_rshi_u,
-
-#define jit_negr(u,v)          jit_new_node_ww(jit_code_negr,u,v)
-#define jit_comr(u,v)          jit_new_node_ww(jit_code_comr,u,v)
-    jit_code_negr,             jit_code_comr,
-
-#define jit_ltr(u,v,w)         jit_new_node_www(jit_code_ltr,u,v,w)
-#define jit_lti(u,v,w)         jit_new_node_www(jit_code_lti,u,v,w)
-    jit_code_ltr,              jit_code_lti,
-#define jit_ltr_u(u,v,w)       jit_new_node_www(jit_code_ltr_u,u,v,w)
-#define jit_lti_u(u,v,w)       jit_new_node_www(jit_code_lti_u,u,v,w)
-    jit_code_ltr_u,            jit_code_lti_u,
-#define jit_ler(u,v,w)         jit_new_node_www(jit_code_ler,u,v,w)
-#define jit_lei(u,v,w)         jit_new_node_www(jit_code_lei,u,v,w)
-    jit_code_ler,              jit_code_lei,
-#define jit_ler_u(u,v,w)       jit_new_node_www(jit_code_ler_u,u,v,w)
-#define jit_lei_u(u,v,w)       jit_new_node_www(jit_code_lei_u,u,v,w)
-    jit_code_ler_u,            jit_code_lei_u,
-#define jit_eqr(u,v,w)         jit_new_node_www(jit_code_eqr,u,v,w)
-#define jit_eqi(u,v,w)         jit_new_node_www(jit_code_eqi,u,v,w)
-    jit_code_eqr,              jit_code_eqi,
-#define jit_ger(u,v,w)         jit_new_node_www(jit_code_ger,u,v,w)
-#define jit_gei(u,v,w)         jit_new_node_www(jit_code_gei,u,v,w)
-    jit_code_ger,              jit_code_gei,
-#define jit_ger_u(u,v,w)       jit_new_node_www(jit_code_ger_u,u,v,w)
-#define jit_gei_u(u,v,w)       jit_new_node_www(jit_code_gei_u,u,v,w)
-    jit_code_ger_u,            jit_code_gei_u,
-#define jit_gtr(u,v,w)         jit_new_node_www(jit_code_gtr,u,v,w)
-#define jit_gti(u,v,w)         jit_new_node_www(jit_code_gti,u,v,w)
-    jit_code_gtr,              jit_code_gti,
-#define jit_gtr_u(u,v,w)       jit_new_node_www(jit_code_gtr_u,u,v,w)
-#define jit_gti_u(u,v,w)       jit_new_node_www(jit_code_gti_u,u,v,w)
-    jit_code_gtr_u,            jit_code_gti_u,
-#define jit_ner(u,v,w)         jit_new_node_www(jit_code_ner,u,v,w)
-#define jit_nei(u,v,w)         jit_new_node_www(jit_code_nei,u,v,w)
-    jit_code_ner,              jit_code_nei,
-
-#define jit_movr(u,v)          jit_new_node_ww(jit_code_movr,u,v)
-#define jit_movi(u,v)          jit_new_node_ww(jit_code_movi,u,v)
-    jit_code_movr,             jit_code_movi,
-#define jit_extr_c(u,v)                jit_new_node_ww(jit_code_extr_c,u,v)
-#define jit_extr_uc(u,v)       jit_new_node_ww(jit_code_extr_uc,u,v)
-    jit_code_extr_c,           jit_code_extr_uc,
-#define jit_extr_s(u,v)                jit_new_node_ww(jit_code_extr_s,u,v)
-#define jit_extr_us(u,v)       jit_new_node_ww(jit_code_extr_us,u,v)
-    jit_code_extr_s,           jit_code_extr_us,
-#  define jit_extr_i(u,v)      jit_new_node_ww(jit_code_extr_i,u,v)
-#  define jit_extr_ui(u,v)     jit_new_node_ww(jit_code_extr_ui,u,v)
-    jit_code_extr_i,           jit_code_extr_ui,
-
-#define jit_htonr_us(u,v)      jit_new_node_ww(jit_code_htonr_us,u,v)
-#define jit_ntohr_us(u,v)      jit_new_node_ww(jit_code_htonr_us,u,v)
-    jit_code_htonr_us,
-#define jit_htonr_ui(u,v)      jit_new_node_ww(jit_code_htonr_ui,u,v)
-#define jit_ntohr_ui(u,v)      jit_new_node_ww(jit_code_htonr_ui,u,v)
-#if __WORDSIZE == 32
-#  define jit_htonr(u,v)       jit_new_node_ww(jit_code_htonr_ui,u,v)
-#  define jit_ntohr(u,v)       jit_new_node_ww(jit_code_htonr_ui,u,v)
-#else
-#  define jit_htonr_ul(u,v)    jit_new_node_ww(jit_code_htonr_ul,u,v)
-#  define jit_ntohr_ul(u,v)    jit_new_node_ww(jit_code_htonr_ul,u,v)
-#  define jit_htonr(u,v)       jit_new_node_ww(jit_code_htonr_ul,u,v)
-#  define jit_ntohr(u,v)       jit_new_node_ww(jit_code_htonr_ul,u,v)
-#endif
-    jit_code_htonr_ui,         jit_code_htonr_ul,
-
-#define jit_ldr_c(u,v)         jit_new_node_ww(jit_code_ldr_c,u,v)
-#define jit_ldi_c(u,v)         jit_new_node_wp(jit_code_ldi_c,u,v)
-    jit_code_ldr_c,            jit_code_ldi_c,
-#define jit_ldr_uc(u,v)                jit_new_node_ww(jit_code_ldr_uc,u,v)
-#define jit_ldi_uc(u,v)                jit_new_node_wp(jit_code_ldi_uc,u,v)
-    jit_code_ldr_uc,           jit_code_ldi_uc,
-#define jit_ldr_s(u,v)         jit_new_node_ww(jit_code_ldr_s,u,v)
-#define jit_ldi_s(u,v)         jit_new_node_wp(jit_code_ldi_s,u,v)
-    jit_code_ldr_s,            jit_code_ldi_s,
-#define jit_ldr_us(u,v)                jit_new_node_ww(jit_code_ldr_us,u,v)
-#define jit_ldi_us(u,v)                jit_new_node_wp(jit_code_ldi_us,u,v)
-    jit_code_ldr_us,           jit_code_ldi_us,
-#define jit_ldr_i(u,v)         jit_new_node_ww(jit_code_ldr_i,u,v)
-#define jit_ldi_i(u,v)         jit_new_node_wp(jit_code_ldi_i,u,v)
-    jit_code_ldr_i,            jit_code_ldi_i,
-#if __WORDSIZE == 32
-#  define jit_ldr(u,v)         jit_ldr_i(u,v)
-#  define jit_ldr_ui(u,v)      jit_ldr_i(u,v)
-#  define jit_ldi(u,v)         jit_ldi_i(u,v)
-#  define jit_ldi_ui(u,v)      jit_ldi_i(u,v)
-#else
-#  define jit_ldr(u,v)         jit_ldr_l(u,v)
-#  define jit_ldi(u,v)         jit_ldi_l(u,v)
-#  define jit_ldr_ui(u,v)      jit_new_node_ww(jit_code_ldr_ui,u,v)
-#  define jit_ldi_ui(u,v)      jit_new_node_wp(jit_code_ldi_ui,u,v)
-#define jit_ldr_l(u,v)         jit_new_node_ww(jit_code_ldr_l,u,v)
-#define jit_ldi_l(u,v)         jit_new_node_wp(jit_code_ldi_l,u,v)
-#endif
-    jit_code_ldr_ui,           jit_code_ldi_ui,
-    jit_code_ldr_l,            jit_code_ldi_l,
-
-#define jit_ldxr_c(u,v,w)      jit_new_node_www(jit_code_ldxr_c,u,v,w)
-#define jit_ldxi_c(u,v,w)      jit_new_node_www(jit_code_ldxi_c,u,v,w)
-    jit_code_ldxr_c,           jit_code_ldxi_c,
-#define jit_ldxr_uc(u,v,w)     jit_new_node_www(jit_code_ldxr_uc,u,v,w)
-#define jit_ldxi_uc(u,v,w)     jit_new_node_www(jit_code_ldxi_uc,u,v,w)
-    jit_code_ldxr_uc,          jit_code_ldxi_uc,
-#define jit_ldxr_s(u,v,w)      jit_new_node_www(jit_code_ldxr_s,u,v,w)
-#define jit_ldxi_s(u,v,w)      jit_new_node_www(jit_code_ldxi_s,u,v,w)
-    jit_code_ldxr_s,           jit_code_ldxi_s,
-#define jit_ldxr_us(u,v,w)     jit_new_node_www(jit_code_ldxr_us,u,v,w)
-#define jit_ldxi_us(u,v,w)     jit_new_node_www(jit_code_ldxi_us,u,v,w)
-    jit_code_ldxr_us,          jit_code_ldxi_us,
-#define jit_ldxr_i(u,v,w)      jit_new_node_www(jit_code_ldxr_i,u,v,w)
-#define jit_ldxi_i(u,v,w)      jit_new_node_www(jit_code_ldxi_i,u,v,w)
-    jit_code_ldxr_i,           jit_code_ldxi_i,
-#if __WORDSIZE == 32
-#  define jit_ldxr(u,v,w)      jit_ldxr_i(u,v,w)
-#  define jit_ldxr_ui(u,v,w)   jit_ldxr_i(u,v,w)
-#  define jit_ldxi(u,v,w)      jit_ldxi_i(u,v,w)
-#  define jit_ldxi_ui(u,v,w)   jit_ldxi_i(u,v,w)
-#else
-#  define jit_ldxr_ui(u,v,w)   jit_new_node_www(jit_code_ldxr_ui,u,v,w)
-#  define jit_ldxi_ui(u,v,w)   jit_new_node_www(jit_code_ldxi_ui,u,v,w)
-#  define jit_ldxr_l(u,v,w)    jit_new_node_www(jit_code_ldxr_l,u,v,w)
-#  define jit_ldxi_l(u,v,w)    jit_new_node_www(jit_code_ldxi_l,u,v,w)
-#  define jit_ldxr(u,v,w)      jit_ldxr_l(u,v,w)
-#  define jit_ldxi(u,v,w)      jit_ldxi_l(u,v,w)
-#endif
-    jit_code_ldxr_ui,          jit_code_ldxi_ui,
-    jit_code_ldxr_l,           jit_code_ldxi_l,
-
-#define jit_str_c(u,v)         jit_new_node_ww(jit_code_str_c,u,v)
-#define jit_sti_c(u,v)         jit_new_node_pw(jit_code_sti_c,u,v)
-    jit_code_str_c,            jit_code_sti_c,
-#define jit_str_s(u,v)         jit_new_node_ww(jit_code_str_s,u,v)
-#define jit_sti_s(u,v)         jit_new_node_pw(jit_code_sti_s,u,v)
-    jit_code_str_s,            jit_code_sti_s,
-#define jit_str_i(u,v)         jit_new_node_ww(jit_code_str_i,u,v)
-#define jit_sti_i(u,v)         jit_new_node_pw(jit_code_sti_i,u,v)
-    jit_code_str_i,            jit_code_sti_i,
-#if __WORDSIZE == 32
-#  define jit_str(u,v)         jit_str_i(u,v)
-#  define jit_sti(u,v)         jit_sti_i(u,v)
-#else
-#  define jit_str(u,v)         jit_str_l(u,v)
-#  define jit_sti(u,v)         jit_sti_l(u,v)
-#  define jit_str_l(u,v)       jit_new_node_ww(jit_code_str_l,u,v)
-#  define jit_sti_l(u,v)       jit_new_node_pw(jit_code_sti_l,u,v)
-#endif
-    jit_code_str_l,            jit_code_sti_l,
-
-#define jit_stxr_c(u,v,w)      jit_new_node_www(jit_code_stxr_c,u,v,w)
-#define jit_stxi_c(u,v,w)      jit_new_node_www(jit_code_stxi_c,u,v,w)
-    jit_code_stxr_c,           jit_code_stxi_c,
-#define jit_stxr_s(u,v,w)      jit_new_node_www(jit_code_stxr_s,u,v,w)
-#define jit_stxi_s(u,v,w)      jit_new_node_www(jit_code_stxi_s,u,v,w)
-    jit_code_stxr_s,           jit_code_stxi_s,
-#define jit_stxr_i(u,v,w)      jit_new_node_www(jit_code_stxr_i,u,v,w)
-#define jit_stxi_i(u,v,w)      jit_new_node_www(jit_code_stxi_i,u,v,w)
-    jit_code_stxr_i,           jit_code_stxi_i,
-#if __WORDSIZE == 32
-#  define jit_stxr(u,v,w)      jit_stxr_i(u,v,w)
-#  define jit_stxi(u,v,w)      jit_stxi_i(u,v,w)
-#else
-#  define jit_stxr(u,v,w)      jit_stxr_l(u,v,w)
-#  define jit_stxi(u,v,w)      jit_stxi_l(u,v,w)
-#  define jit_stxr_l(u,v,w)    jit_new_node_www(jit_code_stxr_l,u,v,w)
-#  define jit_stxi_l(u,v,w)    jit_new_node_www(jit_code_stxi_l,u,v,w)
-#endif
-    jit_code_stxr_l,           jit_code_stxi_l,
-
-#define jit_bltr(v,w)          jit_new_node_pww(jit_code_bltr,NULL,v,w)
-#define jit_blti(v,w)          jit_new_node_pww(jit_code_blti,NULL,v,w)
-    jit_code_bltr,             jit_code_blti,
-#define jit_bltr_u(v,w)                jit_new_node_pww(jit_code_bltr_u,NULL,v,w)
-#define jit_blti_u(v,w)                jit_new_node_pww(jit_code_blti_u,NULL,v,w)
-    jit_code_bltr_u,           jit_code_blti_u,
-#define jit_bler(v,w)          jit_new_node_pww(jit_code_bler,NULL,v,w)
-#define jit_blei(v,w)          jit_new_node_pww(jit_code_blei,NULL,v,w)
-    jit_code_bler,             jit_code_blei,
-#define jit_bler_u(v,w)                jit_new_node_pww(jit_code_bler_u,NULL,v,w)
-#define jit_blei_u(v,w)                jit_new_node_pww(jit_code_blei_u,NULL,v,w)
-    jit_code_bler_u,           jit_code_blei_u,
-#define jit_beqr(v,w)          jit_new_node_pww(jit_code_beqr,NULL,v,w)
-#define jit_beqi(v,w)          jit_new_node_pww(jit_code_beqi,NULL,v,w)
-    jit_code_beqr,             jit_code_beqi,
-#define jit_bger(v,w)          jit_new_node_pww(jit_code_bger,NULL,v,w)
-#define jit_bgei(v,w)          jit_new_node_pww(jit_code_bgei,NULL,v,w)
-    jit_code_bger,             jit_code_bgei,
-#define jit_bger_u(v,w)                jit_new_node_pww(jit_code_bger_u,NULL,v,w)
-#define jit_bgei_u(v,w)                jit_new_node_pww(jit_code_bgei_u,NULL,v,w)
-    jit_code_bger_u,           jit_code_bgei_u,
-#define jit_bgtr(v,w)          jit_new_node_pww(jit_code_bgtr,NULL,v,w)
-#define jit_bgti(v,w)          jit_new_node_pww(jit_code_bgti,NULL,v,w)
-    jit_code_bgtr,             jit_code_bgti,
-#define jit_bgtr_u(v,w)                jit_new_node_pww(jit_code_bgtr_u,NULL,v,w)
-#define jit_bgti_u(v,w)                jit_new_node_pww(jit_code_bgti_u,NULL,v,w)
-    jit_code_bgtr_u,           jit_code_bgti_u,
-#define jit_bner(v,w)          jit_new_node_pww(jit_code_bner,NULL,v,w)
-#define jit_bnei(v,w)          jit_new_node_pww(jit_code_bnei,NULL,v,w)
-    jit_code_bner,             jit_code_bnei,
-
-#define jit_bmsr(v,w)          jit_new_node_pww(jit_code_bmsr,NULL,v,w)
-#define jit_bmsi(v,w)          jit_new_node_pww(jit_code_bmsi,NULL,v,w)
-    jit_code_bmsr,             jit_code_bmsi,
-#define jit_bmcr(v,w)          jit_new_node_pww(jit_code_bmcr,NULL,v,w)
-#define jit_bmci(v,w)          jit_new_node_pww(jit_code_bmci,NULL,v,w)
-    jit_code_bmcr,             jit_code_bmci,
-
-#define jit_boaddr(v,w)                jit_new_node_pww(jit_code_boaddr,NULL,v,w)
-#define jit_boaddi(v,w)                jit_new_node_pww(jit_code_boaddi,NULL,v,w)
-    jit_code_boaddr,           jit_code_boaddi,
-#define jit_boaddr_u(v,w)      jit_new_node_pww(jit_code_boaddr_u,NULL,v,w)
-#define jit_boaddi_u(v,w)      jit_new_node_pww(jit_code_boaddi_u,NULL,v,w)
-    jit_code_boaddr_u,         jit_code_boaddi_u,
-#define jit_bxaddr(v,w)                jit_new_node_pww(jit_code_bxaddr,NULL,v,w)
-#define jit_bxaddi(v,w)                jit_new_node_pww(jit_code_bxaddi,NULL,v,w)
-    jit_code_bxaddr,           jit_code_bxaddi,
-#define jit_bxaddr_u(v,w)      jit_new_node_pww(jit_code_bxaddr_u,NULL,v,w)
-#define jit_bxaddi_u(v,w)      jit_new_node_pww(jit_code_bxaddi_u,NULL,v,w)
-    jit_code_bxaddr_u,         jit_code_bxaddi_u,
-#define jit_bosubr(v,w)                jit_new_node_pww(jit_code_bosubr,NULL,v,w)
-#define jit_bosubi(v,w)                jit_new_node_pww(jit_code_bosubi,NULL,v,w)
-    jit_code_bosubr,           jit_code_bosubi,
-#define jit_bosubr_u(v,w)      jit_new_node_pww(jit_code_bosubr_u,NULL,v,w)
-#define jit_bosubi_u(v,w)      jit_new_node_pww(jit_code_bosubi_u,NULL,v,w)
-    jit_code_bosubr_u,         jit_code_bosubi_u,
-#define jit_bxsubr(v,w)                jit_new_node_pww(jit_code_bxsubr,NULL,v,w)
-#define jit_bxsubi(v,w)                jit_new_node_pww(jit_code_bxsubi,NULL,v,w)
-    jit_code_bxsubr,           jit_code_bxsubi,
-#define jit_bxsubr_u(v,w)      jit_new_node_pww(jit_code_bxsubr_u,NULL,v,w)
-#define jit_bxsubi_u(v,w)      jit_new_node_pww(jit_code_bxsubi_u,NULL,v,w)
-    jit_code_bxsubr_u,         jit_code_bxsubi_u,
-
-#define jit_jmpr(u)            jit_new_node_w(jit_code_jmpr,u)
-#define jit_jmpi()             jit_new_node_p(jit_code_jmpi,NULL)
-    jit_code_jmpr,             jit_code_jmpi,
-#define jit_callr(u)           jit_new_node_w(jit_code_callr,u)
-#define jit_calli(u)           jit_new_node_p(jit_code_calli,u)
-    jit_code_callr,            jit_code_calli,
-
-#define jit_prepare()          _jit_prepare(_jit)
-    jit_code_prepare,
-#define jit_pushargr(u)                _jit_pushargr(_jit,u)
-#define jit_pushargi(u)                _jit_pushargi(_jit,u)
-    jit_code_pushargr,         jit_code_pushargi,
-#define jit_finishr(u)         _jit_finishr(_jit,u)
-#define jit_finishi(u)         _jit_finishi(_jit,u)
-    jit_code_finishr,          jit_code_finishi,
-#define jit_ret()              _jit_ret(_jit)
-    jit_code_ret,
-#define jit_retr(u)            _jit_retr(_jit,u)
-#define jit_reti(u)            _jit_reti(_jit,u)
-    jit_code_retr,             jit_code_reti,
-#define jit_retval_c(u)                _jit_retval_c(_jit,u)
-#define jit_retval_uc(u)       _jit_retval_uc(_jit,u)
-    jit_code_retval_c,         jit_code_retval_uc,
-#define jit_retval_s(u)                _jit_retval_s(_jit,u)
-#define jit_retval_us(u)       _jit_retval_us(_jit,u)
-    jit_code_retval_s,         jit_code_retval_us,
-#define jit_retval_i(u)                _jit_retval_i(_jit,u)
-#if __WORDSIZE == 32
-#  define jit_retval(u)                jit_retval_i(u)
-#  define jit_retval_ui(u)     jit_retval_i(u)
-#else
-#  define jit_retval(u)                jit_retval_l(u)
-#  define jit_retval_ui(u)     _jit_retval_ui(_jit,u)
-#  define jit_retval_l(u)      _jit_retval_l(_jit,u)
-#endif
-    jit_code_retval_i,         jit_code_retval_ui,
-    jit_code_retval_l,
-
-#define jit_epilog()           _jit_epilog(_jit)
-    jit_code_epilog,
-
-#define jit_arg_f()            _jit_arg_f(_jit)
-    jit_code_arg_f,
-#define jit_getarg_f(u,v)      _jit_getarg_f(_jit,u,v)
-    jit_code_getarg_f,
-#define jit_putargr_f(u,v)     _jit_putargr_f(_jit,u,v)
-#define jit_putargi_f(u,v)     _jit_putargi_f(_jit,u,v)
-    jit_code_putargr_f,                jit_code_putargi_f,
-
-#define jit_addr_f(u,v,w)      jit_new_node_www(jit_code_addr_f,u,v,w)
-#define jit_addi_f(u,v,w)      jit_new_node_wwf(jit_code_addi_f,u,v,w)
-    jit_code_addr_f,           jit_code_addi_f,
-#define jit_subr_f(u,v,w)      jit_new_node_www(jit_code_subr_f,u,v,w)
-#define jit_subi_f(u,v,w)      jit_new_node_wwf(jit_code_subi_f,u,v,w)
-    jit_code_subr_f,           jit_code_subi_f,
-#define jit_rsbr_f(u,v,w)      jit_subr_f(u,w,v)
-#define jit_rsbi_f(u,v,w)      jit_new_node_wwf(jit_code_rsbi_f,u,v,w)
-    jit_code_rsbi_f,
-#define jit_mulr_f(u,v,w)      jit_new_node_www(jit_code_mulr_f,u,v,w)
-#define jit_muli_f(u,v,w)      jit_new_node_wwf(jit_code_muli_f,u,v,w)
-    jit_code_mulr_f,           jit_code_muli_f,
-#define jit_divr_f(u,v,w)      jit_new_node_www(jit_code_divr_f,u,v,w)
-#define jit_divi_f(u,v,w)      jit_new_node_wwf(jit_code_divi_f,u,v,w)
-    jit_code_divr_f,           jit_code_divi_f,
-#define jit_negr_f(u,v)                jit_new_node_ww(jit_code_negr_f,u,v)
-#define jit_absr_f(u,v)                jit_new_node_ww(jit_code_absr_f,u,v)
-#define jit_sqrtr_f(u,v)       jit_new_node_ww(jit_code_sqrtr_f,u,v)
-    jit_code_negr_f,           jit_code_absr_f,        jit_code_sqrtr_f,
-
-#define jit_ltr_f(u,v,w)       jit_new_node_www(jit_code_ltr_f,u,v,w)
-#define jit_lti_f(u,v,w)       jit_new_node_wwf(jit_code_lti_f,u,v,w)
-    jit_code_ltr_f,            jit_code_lti_f,
-#define jit_ler_f(u,v,w)       jit_new_node_www(jit_code_ler_f,u,v,w)
-#define jit_lei_f(u,v,w)       jit_new_node_wwf(jit_code_lei_f,u,v,w)
-    jit_code_ler_f,            jit_code_lei_f,
-#define jit_eqr_f(u,v,w)       jit_new_node_www(jit_code_eqr_f,u,v,w)
-#define jit_eqi_f(u,v,w)       jit_new_node_wwf(jit_code_eqi_f,u,v,w)
-    jit_code_eqr_f,            jit_code_eqi_f,
-#define jit_ger_f(u,v,w)       jit_new_node_www(jit_code_ger_f,u,v,w)
-#define jit_gei_f(u,v,w)       jit_new_node_wwf(jit_code_gei_f,u,v,w)
-    jit_code_ger_f,            jit_code_gei_f,
-#define jit_gtr_f(u,v,w)       jit_new_node_www(jit_code_gtr_f,u,v,w)
-#define jit_gti_f(u,v,w)       jit_new_node_wwf(jit_code_gti_f,u,v,w)
-    jit_code_gtr_f,            jit_code_gti_f,
-#define jit_ner_f(u,v,w)       jit_new_node_www(jit_code_ner_f,u,v,w)
-#define jit_nei_f(u,v,w)       jit_new_node_wwf(jit_code_nei_f,u,v,w)
-    jit_code_ner_f,            jit_code_nei_f,
-#define jit_unltr_f(u,v,w)     jit_new_node_www(jit_code_unltr_f,u,v,w)
-#define jit_unlti_f(u,v,w)     jit_new_node_wwf(jit_code_unlti_f,u,v,w)
-    jit_code_unltr_f,          jit_code_unlti_f,
-#define jit_unler_f(u,v,w)     jit_new_node_www(jit_code_unler_f,u,v,w)
-#define jit_unlei_f(u,v,w)     jit_new_node_wwf(jit_code_unlei_f,u,v,w)
-    jit_code_unler_f,          jit_code_unlei_f,
-#define jit_uneqr_f(u,v,w)     jit_new_node_www(jit_code_uneqr_f,u,v,w)
-#define jit_uneqi_f(u,v,w)     jit_new_node_wwf(jit_code_uneqi_f,u,v,w)
-    jit_code_uneqr_f,          jit_code_uneqi_f,
-#define jit_unger_f(u,v,w)     jit_new_node_www(jit_code_unger_f,u,v,w)
-#define jit_ungei_f(u,v,w)     jit_new_node_wwf(jit_code_ungei_f,u,v,w)
-    jit_code_unger_f,          jit_code_ungei_f,
-#define jit_ungtr_f(u,v,w)     jit_new_node_www(jit_code_ungtr_f,u,v,w)
-#define jit_ungti_f(u,v,w)     jit_new_node_wwf(jit_code_ungti_f,u,v,w)
-    jit_code_ungtr_f,          jit_code_ungti_f,
-#define jit_ltgtr_f(u,v,w)     jit_new_node_www(jit_code_ltgtr_f,u,v,w)
-#define jit_ltgti_f(u,v,w)     jit_new_node_wwf(jit_code_ltgti_f,u,v,w)
-    jit_code_ltgtr_f,          jit_code_ltgti_f,
-#define jit_ordr_f(u,v,w)      jit_new_node_www(jit_code_ordr_f,u,v,w)
-#define jit_ordi_f(u,v,w)      jit_new_node_wwf(jit_code_ordi_f,u,v,w)
-    jit_code_ordr_f,           jit_code_ordi_f,
-#define jit_unordr_f(u,v,w)    jit_new_node_www(jit_code_unordr_f,u,v,w)
-#define jit_unordi_f(u,v,w)    jit_new_node_wwf(jit_code_unordi_f,u,v,w)
-    jit_code_unordr_f,         jit_code_unordi_f,
-
-#define jit_truncr_f_i(u,v)    jit_new_node_ww(jit_code_truncr_f_i,u,v)
-    jit_code_truncr_f_i,
-#if __WORDSIZE == 32
-#  define jit_truncr_f(u,v)    jit_truncr_f_i(u,v)
-#else
-#  define jit_truncr_f(u,v)    jit_truncr_f_l(u,v)
-#  define jit_truncr_f_l(u,v)  jit_new_node_ww(jit_code_truncr_f_l,u,v)
-#endif
-    jit_code_truncr_f_l,
-#define jit_extr_f(u,v)                jit_new_node_ww(jit_code_extr_f,u,v)
-#define jit_extr_d_f(u,v)      jit_new_node_ww(jit_code_extr_d_f,u,v)
-    jit_code_extr_f,           jit_code_extr_d_f,
-#define jit_movr_f(u,v)                jit_new_node_ww(jit_code_movr_f,u,v)
-#define jit_movi_f(u,v)                jit_new_node_wf(jit_code_movi_f,u,v)
-    jit_code_movr_f,           jit_code_movi_f,
-
-#define jit_ldr_f(u,v)         jit_new_node_ww(jit_code_ldr_f,u,v)
-#define jit_ldi_f(u,v)         jit_new_node_wp(jit_code_ldi_f,u,v)
-    jit_code_ldr_f,            jit_code_ldi_f,
-#define jit_ldxr_f(u,v,w)      jit_new_node_www(jit_code_ldxr_f,u,v,w)
-#define jit_ldxi_f(u,v,w)      jit_new_node_www(jit_code_ldxi_f,u,v,w)
-    jit_code_ldxr_f,           jit_code_ldxi_f,
-#define jit_str_f(u,v)         jit_new_node_ww(jit_code_str_f,u,v)
-#define jit_sti_f(u,v)         jit_new_node_pw(jit_code_sti_f,u,v)
-    jit_code_str_f,            jit_code_sti_f,
-#define jit_stxr_f(u,v,w)      jit_new_node_www(jit_code_stxr_f,u,v,w)
-#define jit_stxi_f(u,v,w)      jit_new_node_www(jit_code_stxi_f,u,v,w)
-    jit_code_stxr_f,           jit_code_stxi_f,
-
-#define jit_bltr_f(v,w)                jit_new_node_pww(jit_code_bltr_f,NULL,v,w)
-#define jit_blti_f(v,w)                jit_new_node_pwf(jit_code_blti_f,NULL,v,w)
-    jit_code_bltr_f,           jit_code_blti_f,
-#define jit_bler_f(v,w)                jit_new_node_pww(jit_code_bler_f,NULL,v,w)
-#define jit_blei_f(v,w)                jit_new_node_pwf(jit_code_blei_f,NULL,v,w)
-    jit_code_bler_f,           jit_code_blei_f,
-#define jit_beqr_f(v,w)                jit_new_node_pww(jit_code_beqr_f,NULL,v,w)
-#define jit_beqi_f(v,w)                jit_new_node_pwf(jit_code_beqi_f,NULL,v,w)
-    jit_code_beqr_f,           jit_code_beqi_f,
-#define jit_bger_f(v,w)                jit_new_node_pww(jit_code_bger_f,NULL,v,w)
-#define jit_bgei_f(v,w)                jit_new_node_pwf(jit_code_bgei_f,NULL,v,w)
-    jit_code_bger_f,           jit_code_bgei_f,
-#define jit_bgtr_f(v,w)                jit_new_node_pww(jit_code_bgtr_f,NULL,v,w)
-#define jit_bgti_f(v,w)                jit_new_node_pwf(jit_code_bgti_f,NULL,v,w)
-    jit_code_bgtr_f,           jit_code_bgti_f,
-#define jit_bner_f(v,w)                jit_new_node_pww(jit_code_bner_f,NULL,v,w)
-#define jit_bnei_f(v,w)                jit_new_node_pwf(jit_code_bnei_f,NULL,v,w)
-    jit_code_bner_f,           jit_code_bnei_f,
-#define jit_bunltr_f(v,w)      jit_new_node_pww(jit_code_bunltr_f,NULL,v,w)
-#define jit_bunlti_f(v,w)      jit_new_node_pwf(jit_code_bunlti_f,NULL,v,w)
-    jit_code_bunltr_f,         jit_code_bunlti_f,
-#define jit_bunler_f(v,w)      jit_new_node_pww(jit_code_bunler_f,NULL,v,w)
-#define jit_bunlei_f(v,w)      jit_new_node_pwf(jit_code_bunlei_f,NULL,v,w)
-    jit_code_bunler_f,         jit_code_bunlei_f,
-#define jit_buneqr_f(v,w)      jit_new_node_pww(jit_code_buneqr_f,NULL,v,w)
-#define jit_buneqi_f(v,w)      jit_new_node_pwf(jit_code_buneqi_f,NULL,v,w)
-    jit_code_buneqr_f,         jit_code_buneqi_f,
-#define jit_bunger_f(v,w)      jit_new_node_pww(jit_code_bunger_f,NULL,v,w)
-#define jit_bungei_f(v,w)      jit_new_node_pwf(jit_code_bungei_f,NULL,v,w)
-    jit_code_bunger_f,         jit_code_bungei_f,
-#define jit_bungtr_f(v,w)      jit_new_node_pww(jit_code_bungtr_f,NULL,v,w)
-#define jit_bungti_f(v,w)      jit_new_node_pwf(jit_code_bungti_f,NULL,v,w)
-    jit_code_bungtr_f,         jit_code_bungti_f,
-#define jit_bltgtr_f(v,w)      jit_new_node_pww(jit_code_bltgtr_f,NULL,v,w)
-#define jit_bltgti_f(v,w)      jit_new_node_pwf(jit_code_bltgti_f,NULL,v,w)
-    jit_code_bltgtr_f,         jit_code_bltgti_f,
-#define jit_bordr_f(v,w)       jit_new_node_pww(jit_code_bordr_f,NULL,v,w)
-#define jit_bordi_f(v,w)       jit_new_node_pwf(jit_code_bordi_f,NULL,v,w)
-    jit_code_bordr_f,          jit_code_bordi_f,
-#define jit_bunordr_f(v,w)     jit_new_node_pww(jit_code_bunordr_f,NULL,v,w)
-#define jit_bunordi_f(v,w)     jit_new_node_pwf(jit_code_bunordi_f,NULL,v,w)
-    jit_code_bunordr_f,                jit_code_bunordi_f,
-
-#define jit_pushargr_f(u)      _jit_pushargr_f(_jit,u)
-#define jit_pushargi_f(u)      _jit_pushargi_f(_jit,u)
-    jit_code_pushargr_f,       jit_code_pushargi_f,
-#define jit_retr_f(u)          _jit_retr_f(_jit,u)
-#define jit_reti_f(u)          _jit_reti_f(_jit,u)
-    jit_code_retr_f,           jit_code_reti_f,
-#define jit_retval_f(u)                _jit_retval_f(_jit,u)
-    jit_code_retval_f,
-
-#define jit_arg_d()            _jit_arg_d(_jit)
-    jit_code_arg_d,
-#define jit_getarg_d(u,v)      _jit_getarg_d(_jit,u,v)
-    jit_code_getarg_d,
-#define jit_putargr_d(u,v)     _jit_putargr_d(_jit,u,v)
-#define jit_putargi_d(u,v)     _jit_putargi_d(_jit,u,v)
-    jit_code_putargr_d,                jit_code_putargi_d,
-
-#define jit_addr_d(u,v,w)      jit_new_node_www(jit_code_addr_d,u,v,w)
-#define jit_addi_d(u,v,w)      jit_new_node_wwd(jit_code_addi_d,u,v,w)
-    jit_code_addr_d,           jit_code_addi_d,
-#define jit_subr_d(u,v,w)      jit_new_node_www(jit_code_subr_d,u,v,w)
-#define jit_subi_d(u,v,w)      jit_new_node_wwd(jit_code_subi_d,u,v,w)
-    jit_code_subr_d,           jit_code_subi_d,
-#define jit_rsbr_d(u,v,w)      jit_subr_d(u,w,v)
-#define jit_rsbi_d(u,v,w)      jit_new_node_wwd(jit_code_rsbi_d,u,v,w)
-    jit_code_rsbi_d,
-#define jit_mulr_d(u,v,w)      jit_new_node_www(jit_code_mulr_d,u,v,w)
-#define jit_muli_d(u,v,w)      jit_new_node_wwd(jit_code_muli_d,u,v,w)
-    jit_code_mulr_d,           jit_code_muli_d,
-#define jit_divr_d(u,v,w)      jit_new_node_www(jit_code_divr_d,u,v,w)
-#define jit_divi_d(u,v,w)      jit_new_node_wwd(jit_code_divi_d,u,v,w)
-    jit_code_divr_d,           jit_code_divi_d,
-
-#define jit_negr_d(u,v)                jit_new_node_ww(jit_code_negr_d,u,v)
-#define jit_absr_d(u,v)                jit_new_node_ww(jit_code_absr_d,u,v)
-#define jit_sqrtr_d(u,v)       jit_new_node_ww(jit_code_sqrtr_d,u,v)
-    jit_code_negr_d,           jit_code_absr_d,        jit_code_sqrtr_d,
-
-#define jit_ltr_d(u,v,w)       jit_new_node_www(jit_code_ltr_d,u,v,w)
-#define jit_lti_d(u,v,w)       jit_new_node_wwd(jit_code_lti_d,u,v,w)
-    jit_code_ltr_d,            jit_code_lti_d,
-#define jit_ler_d(u,v,w)       jit_new_node_www(jit_code_ler_d,u,v,w)
-#define jit_lei_d(u,v,w)       jit_new_node_wwd(jit_code_lei_d,u,v,w)
-    jit_code_ler_d,            jit_code_lei_d,
-#define jit_eqr_d(u,v,w)       jit_new_node_www(jit_code_eqr_d,u,v,w)
-#define jit_eqi_d(u,v,w)       jit_new_node_wwd(jit_code_eqi_d,u,v,w)
-    jit_code_eqr_d,            jit_code_eqi_d,
-#define jit_ger_d(u,v,w)       jit_new_node_www(jit_code_ger_d,u,v,w)
-#define jit_gei_d(u,v,w)       jit_new_node_wwd(jit_code_gei_d,u,v,w)
-    jit_code_ger_d,            jit_code_gei_d,
-#define jit_gtr_d(u,v,w)       jit_new_node_www(jit_code_gtr_d,u,v,w)
-#define jit_gti_d(u,v,w)       jit_new_node_wwd(jit_code_gti_d,u,v,w)
-    jit_code_gtr_d,            jit_code_gti_d,
-#define jit_ner_d(u,v,w)       jit_new_node_www(jit_code_ner_d,u,v,w)
-#define jit_nei_d(u,v,w)       jit_new_node_wwd(jit_code_nei_d,u,v,w)
-    jit_code_ner_d,            jit_code_nei_d,
-#define jit_unltr_d(u,v,w)     jit_new_node_www(jit_code_unltr_d,u,v,w)
-#define jit_unlti_d(u,v,w)     jit_new_node_wwd(jit_code_unlti_d,u,v,w)
-    jit_code_unltr_d,          jit_code_unlti_d,
-#define jit_unler_d(u,v,w)     jit_new_node_www(jit_code_unler_d,u,v,w)
-#define jit_unlei_d(u,v,w)     jit_new_node_wwd(jit_code_unlei_d,u,v,w)
-    jit_code_unler_d,          jit_code_unlei_d,
-#define jit_uneqr_d(u,v,w)     jit_new_node_www(jit_code_uneqr_d,u,v,w)
-#define jit_uneqi_d(u,v,w)     jit_new_node_wwd(jit_code_uneqi_d,u,v,w)
-    jit_code_uneqr_d,          jit_code_uneqi_d,
-#define jit_unger_d(u,v,w)     jit_new_node_www(jit_code_unger_d,u,v,w)
-#define jit_ungei_d(u,v,w)     jit_new_node_wwd(jit_code_ungei_d,u,v,w)
-    jit_code_unger_d,          jit_code_ungei_d,
-#define jit_ungtr_d(u,v,w)     jit_new_node_www(jit_code_ungtr_d,u,v,w)
-#define jit_ungti_d(u,v,w)     jit_new_node_wwd(jit_code_ungti_d,u,v,w)
-    jit_code_ungtr_d,          jit_code_ungti_d,
-#define jit_ltgtr_d(u,v,w)     jit_new_node_www(jit_code_ltgtr_d,u,v,w)
-#define jit_ltgti_d(u,v,w)     jit_new_node_wwd(jit_code_ltgti_d,u,v,w)
-    jit_code_ltgtr_d,          jit_code_ltgti_d,
-#define jit_ordr_d(u,v,w)      jit_new_node_www(jit_code_ordr_d,u,v,w)
-#define jit_ordi_d(u,v,w)      jit_new_node_wwd(jit_code_ordi_d,u,v,w)
-    jit_code_ordr_d,           jit_code_ordi_d,
-#define jit_unordr_d(u,v,w)    jit_new_node_www(jit_code_unordr_d,u,v,w)
-#define jit_unordi_d(u,v,w)    jit_new_node_wwd(jit_code_unordi_d,u,v,w)
-    jit_code_unordr_d,         jit_code_unordi_d,
-
-#define jit_truncr_d_i(u,v)    jit_new_node_ww(jit_code_truncr_d_i,u,v)
-    jit_code_truncr_d_i,
-#if __WORDSIZE == 32
-#  define jit_truncr_d(u,v)    jit_truncr_d_i(u,v)
-#else
-#  define jit_truncr_d(u,v)    jit_truncr_d_l(u,v)
-#  define jit_truncr_d_l(u,v)  jit_new_node_ww(jit_code_truncr_d_l,u,v)
-#endif
-    jit_code_truncr_d_l,
-#define jit_extr_d(u,v)                jit_new_node_ww(jit_code_extr_d,u,v)
-#define jit_extr_f_d(u,v)      jit_new_node_ww(jit_code_extr_f_d,u,v)
-    jit_code_extr_d,           jit_code_extr_f_d,
-#define jit_movr_d(u,v)                jit_new_node_ww(jit_code_movr_d,u,v)
-#define jit_movi_d(u,v)                jit_new_node_wd(jit_code_movi_d,u,v)
-    jit_code_movr_d,           jit_code_movi_d,
-
-#define jit_ldr_d(u,v)         jit_new_node_ww(jit_code_ldr_d,u,v)
-#define jit_ldi_d(u,v)         jit_new_node_wp(jit_code_ldi_d,u,v)
-    jit_code_ldr_d,            jit_code_ldi_d,
-#define jit_ldxr_d(u,v,w)      jit_new_node_www(jit_code_ldxr_d,u,v,w)
-#define jit_ldxi_d(u,v,w)      jit_new_node_www(jit_code_ldxi_d,u,v,w)
-    jit_code_ldxr_d,           jit_code_ldxi_d,
-#define jit_str_d(u,v)         jit_new_node_ww(jit_code_str_d,u,v)
-#define jit_sti_d(u,v)         jit_new_node_pw(jit_code_sti_d,u,v)
-    jit_code_str_d,            jit_code_sti_d,
-#define jit_stxr_d(u,v,w)      jit_new_node_www(jit_code_stxr_d,u,v,w)
-#define jit_stxi_d(u,v,w)      jit_new_node_www(jit_code_stxi_d,u,v,w)
-    jit_code_stxr_d,           jit_code_stxi_d,
-
-#define jit_bltr_d(v,w)                jit_new_node_pww(jit_code_bltr_d,NULL,v,w)
-#define jit_blti_d(v,w)                jit_new_node_pwd(jit_code_blti_d,NULL,v,w)
-    jit_code_bltr_d,           jit_code_blti_d,
-#define jit_bler_d(v,w)                jit_new_node_pww(jit_code_bler_d,NULL,v,w)
-#define jit_blei_d(v,w)                jit_new_node_pwd(jit_code_blei_d,NULL,v,w)
-    jit_code_bler_d,           jit_code_blei_d,
-#define jit_beqr_d(v,w)                jit_new_node_pww(jit_code_beqr_d,NULL,v,w)
-#define jit_beqi_d(v,w)                jit_new_node_pwd(jit_code_beqi_d,NULL,v,w)
-    jit_code_beqr_d,           jit_code_beqi_d,
-#define jit_bger_d(v,w)                jit_new_node_pww(jit_code_bger_d,NULL,v,w)
-#define jit_bgei_d(v,w)                jit_new_node_pwd(jit_code_bgei_d,NULL,v,w)
-    jit_code_bger_d,           jit_code_bgei_d,
-#define jit_bgtr_d(v,w)                jit_new_node_pww(jit_code_bgtr_d,NULL,v,w)
-#define jit_bgti_d(v,w)                jit_new_node_pwd(jit_code_bgti_d,NULL,v,w)
-    jit_code_bgtr_d,           jit_code_bgti_d,
-#define jit_bner_d(v,w)                jit_new_node_pww(jit_code_bner_d,NULL,v,w)
-#define jit_bnei_d(v,w)                jit_new_node_pwd(jit_code_bnei_d,NULL,v,w)
-    jit_code_bner_d,           jit_code_bnei_d,
-#define jit_bunltr_d(v,w)      jit_new_node_pww(jit_code_bunltr_d,NULL,v,w)
-#define jit_bunlti_d(v,w)      jit_new_node_pwd(jit_code_bunlti_d,NULL,v,w)
-    jit_code_bunltr_d,         jit_code_bunlti_d,
-#define jit_bunler_d(v,w)      jit_new_node_pww(jit_code_bunler_d,NULL,v,w)
-#define jit_bunlei_d(v,w)      jit_new_node_pwd(jit_code_bunlei_d,NULL,v,w)
-    jit_code_bunler_d,         jit_code_bunlei_d,
-#define jit_buneqr_d(v,w)      jit_new_node_pww(jit_code_buneqr_d,NULL,v,w)
-#define jit_buneqi_d(v,w)      jit_new_node_pwd(jit_code_buneqi_d,NULL,v,w)
-    jit_code_buneqr_d,         jit_code_buneqi_d,
-#define jit_bunger_d(v,w)      jit_new_node_pww(jit_code_bunger_d,NULL,v,w)
-#define jit_bungei_d(v,w)      jit_new_node_pwd(jit_code_bungei_d,NULL,v,w)
-    jit_code_bunger_d,         jit_code_bungei_d,
-#define jit_bungtr_d(v,w)      jit_new_node_pww(jit_code_bungtr_d,NULL,v,w)
-#define jit_bungti_d(v,w)      jit_new_node_pwd(jit_code_bungti_d,NULL,v,w)
-    jit_code_bungtr_d,         jit_code_bungti_d,
-#define jit_bltgtr_d(v,w)      jit_new_node_pww(jit_code_bltgtr_d,NULL,v,w)
-#define jit_bltgti_d(v,w)      jit_new_node_pwd(jit_code_bltgti_d,NULL,v,w)
-    jit_code_bltgtr_d,         jit_code_bltgti_d,
-#define jit_bordr_d(v,w)       jit_new_node_pww(jit_code_bordr_d,NULL,v,w)
-#define jit_bordi_d(v,w)       jit_new_node_pwd(jit_code_bordi_d,NULL,v,w)
-    jit_code_bordr_d,          jit_code_bordi_d,
-#define jit_bunordr_d(v,w)     jit_new_node_pww(jit_code_bunordr_d,NULL,v,w)
-#define jit_bunordi_d(v,w)     jit_new_node_pwd(jit_code_bunordi_d,NULL,v,w)
-    jit_code_bunordr_d,                jit_code_bunordi_d,
-
-#define jit_pushargr_d(u)      _jit_pushargr_d(_jit,u)
-#define jit_pushargi_d(u)      _jit_pushargi_d(_jit,u)
-    jit_code_pushargr_d,       jit_code_pushargi_d,
-#define jit_retr_d(u)          _jit_retr_d(_jit,u)
-#define jit_reti_d(u)          _jit_reti_d(_jit,u)
-    jit_code_retr_d,           jit_code_reti_d,
-#define jit_retval_d(u)                _jit_retval_d(_jit,u)
-    jit_code_retval_d,
-
-#define jit_bswapr_us(u,v)     jit_new_node_ww(jit_code_bswapr_us,u,v)
-    jit_code_bswapr_us,
-#define jit_bswapr_ui(u,v)     jit_new_node_ww(jit_code_bswapr_ui,u,v)
-    jit_code_bswapr_ui,
-#define jit_bswapr_ul(u,v)     jit_new_node_ww(jit_code_bswapr_ul,u,v)
-    jit_code_bswapr_ul,
-#if __WORDSIZE == 32
-#define jit_bswapr(u,v)                jit_new_node_ww(jit_code_bswapr_ui,u,v)
-#else
-#define jit_bswapr(u,v)                jit_new_node_ww(jit_code_bswapr_ul,u,v)
-#endif
-
-    /* Special internal backend specific codes */
-    jit_code_movr_w_f,         jit_code_movr_ww_d,     /* w* -> f|d */
-#define jit_movr_w_f(u, v)     jit_new_node_ww(jit_code_movr_w_f, u, v)
-#define jit_movr_ww_d(u, v, w) jit_new_node_www(jit_code_movr_ww_d, u, v, w)
-    jit_code_movr_w_d,                                 /* w -> d */
-#define jit_movr_w_d(u, v)     jit_new_node_ww(jit_code_movr_w_d, u, v)
-
-    jit_code_movr_f_w,         jit_code_movi_f_w,      /* f|d -> w* */
-#define jit_movr_f_w(u, v)     jit_new_node_ww(jit_code_movr_f_w, u, v)
-#define jit_movi_f_w(u, v)     jit_new_node_wf(jit_code_movi_f_w, u, v)
-    jit_code_movr_d_ww,                jit_code_movi_d_ww,
-#define jit_movr_d_ww(u, v, w) jit_new_node_www(jit_code_movr_d_ww, u, v, w)
-#define jit_movi_d_ww(u, v, w) jit_new_node_wwd(jit_code_movi_d_ww, u, v, w)
-
-    jit_code_movr_d_w,         jit_code_movi_d_w,      /* d -> w */
-#define jit_movr_d_w(u, v)     jit_new_node_ww(jit_code_movr_d_w, u, v)
-#define jit_movi_d_w(u, v)     jit_new_node_wd(jit_code_movi_d_w, u, v)
-
-    jit_code_last_code
-} jit_code_t;
-
-typedef void* (*jit_alloc_func_ptr)    (size_t);
-typedef void* (*jit_realloc_func_ptr)  (void*, size_t);
-typedef void  (*jit_free_func_ptr)     (void*);
-
-/*
- * Prototypes
- */
-extern void init_jit(const char*);
-extern void finish_jit(void);
-
-extern jit_state_t *jit_new_state(void);
-#define jit_clear_state()      _jit_clear_state(_jit)
-extern void _jit_clear_state(jit_state_t*);
-#define jit_destroy_state()    _jit_destroy_state(_jit)
-extern void _jit_destroy_state(jit_state_t*);
-
-#define jit_address(node)      _jit_address(_jit, node)
-extern jit_pointer_t _jit_address(jit_state_t*, jit_node_t*);
-extern jit_node_t *_jit_name(jit_state_t*, const char*);
-extern jit_node_t *_jit_note(jit_state_t*, const char*, int);
-extern jit_node_t *_jit_label(jit_state_t*);
-extern jit_node_t *_jit_forward(jit_state_t*);
-extern jit_node_t *_jit_indirect(jit_state_t*);
-extern void _jit_link(jit_state_t*, jit_node_t*);
-#define jit_forward_p(u)       _jit_forward_p(_jit,u)
-extern jit_bool_t _jit_forward_p(jit_state_t*,jit_node_t*);
-#define jit_indirect_p(u)      _jit_indirect_p(_jit,u)
-extern jit_bool_t _jit_indirect_p(jit_state_t*,jit_node_t*);
-#define jit_target_p(u)                _jit_target_p(_jit,u)
-extern jit_bool_t _jit_target_p(jit_state_t*,jit_node_t*);
-
-extern void _jit_prolog(jit_state_t*);
-
-extern jit_int32_t _jit_allocai(jit_state_t*, jit_int32_t);
-extern void _jit_allocar(jit_state_t*, jit_int32_t, jit_int32_t);
-extern void _jit_ellipsis(jit_state_t*);
-
-extern jit_node_t *_jit_arg(jit_state_t*);
-extern void _jit_getarg_c(jit_state_t*, jit_gpr_t, jit_node_t*);
-extern void _jit_getarg_uc(jit_state_t*, jit_gpr_t, jit_node_t*);
-extern void _jit_getarg_s(jit_state_t*, jit_gpr_t, jit_node_t*);
-extern void _jit_getarg_us(jit_state_t*, jit_gpr_t, jit_node_t*);
-extern void _jit_getarg_i(jit_state_t*, jit_gpr_t, jit_node_t*);
-#if __WORDSIZE == 64
-extern void _jit_getarg_ui(jit_state_t*, jit_gpr_t, jit_node_t*);
-extern void _jit_getarg_l(jit_state_t*, jit_gpr_t, jit_node_t*);
-#endif
-extern void _jit_putargr(jit_state_t*, jit_gpr_t, jit_node_t*);
-extern void _jit_putargi(jit_state_t*, jit_word_t, jit_node_t*);
-
-extern void _jit_prepare(jit_state_t*);
-extern void _jit_ellipsis(jit_state_t*);
-extern void _jit_va_push(jit_state_t*, jit_gpr_t);
-extern void _jit_pushargr(jit_state_t*, jit_gpr_t);
-extern void _jit_pushargi(jit_state_t*, jit_word_t);
-extern void _jit_finishr(jit_state_t*, jit_gpr_t);
-extern jit_node_t *_jit_finishi(jit_state_t*, jit_pointer_t);
-extern void _jit_ret(jit_state_t*);
-extern void _jit_retr(jit_state_t*, jit_gpr_t);
-extern void _jit_reti(jit_state_t*, jit_word_t);
-extern void _jit_retval_c(jit_state_t*, jit_gpr_t);
-extern void _jit_retval_uc(jit_state_t*, jit_gpr_t);
-extern void _jit_retval_s(jit_state_t*, jit_gpr_t);
-extern void _jit_retval_us(jit_state_t*, jit_gpr_t);
-extern void _jit_retval_i(jit_state_t*, jit_gpr_t);
-#if __WORDSIZE == 64
-extern void _jit_retval_ui(jit_state_t*, jit_gpr_t);
-extern void _jit_retval_l(jit_state_t*, jit_gpr_t);
-#endif
-extern void _jit_epilog(jit_state_t*);
-
-#define jit_patch(u)           _jit_patch(_jit,u)
-extern void _jit_patch(jit_state_t*, jit_node_t*);
-#define jit_patch_at(u,v)      _jit_patch_at(_jit,u,v)
-extern void _jit_patch_at(jit_state_t*, jit_node_t*, jit_node_t*);
-#define jit_patch_abs(u,v)     _jit_patch_abs(_jit,u,v)
-extern void _jit_patch_abs(jit_state_t*, jit_node_t*, jit_pointer_t);
-#define jit_realize()          _jit_realize(_jit)
-extern void _jit_realize(jit_state_t*);
-#define jit_get_code(u)                _jit_get_code(_jit,u)
-extern jit_pointer_t _jit_get_code(jit_state_t*, jit_word_t*);
-#define jit_set_code(u,v)      _jit_set_code(_jit,u,v)
-extern void _jit_set_code(jit_state_t*, jit_pointer_t, jit_word_t);
-#define jit_get_data(u,v)      _jit_get_data(_jit,u,v)
-extern jit_pointer_t _jit_get_data(jit_state_t*, jit_word_t*, jit_word_t*);
-#define jit_set_data(u,v,w)    _jit_set_data(_jit,u,v,w)
-extern void _jit_set_data(jit_state_t*, jit_pointer_t, jit_word_t, jit_word_t);
-#define jit_frame(u)           _jit_frame(_jit,u)
-extern void _jit_frame(jit_state_t*, jit_int32_t);
-#define jit_tramp(u)           _jit_tramp(_jit,u)
-extern void _jit_tramp(jit_state_t*, jit_int32_t);
-#define jit_emit()             _jit_emit(_jit)
-extern jit_pointer_t _jit_emit(jit_state_t*);
-
-#define jit_print()            _jit_print(_jit)
-extern void _jit_print(jit_state_t*);
-
-extern jit_node_t *_jit_arg_f(jit_state_t*);
-extern void _jit_getarg_f(jit_state_t*, jit_fpr_t, jit_node_t*);
-extern void _jit_putargr_f(jit_state_t*, jit_fpr_t, jit_node_t*);
-extern void _jit_putargi_f(jit_state_t*, jit_float32_t, jit_node_t*);
-extern void _jit_pushargr_f(jit_state_t*, jit_fpr_t);
-extern void _jit_pushargi_f(jit_state_t*, jit_float32_t);
-extern void _jit_retr_f(jit_state_t*, jit_fpr_t);
-extern void _jit_reti_f(jit_state_t*, jit_float32_t);
-extern void _jit_retval_f(jit_state_t*, jit_fpr_t);
-
-extern jit_node_t *_jit_arg_d(jit_state_t*);
-extern void _jit_getarg_d(jit_state_t*, jit_fpr_t, jit_node_t*);
-extern void _jit_putargr_d(jit_state_t*, jit_fpr_t, jit_node_t*);
-extern void _jit_putargi_d(jit_state_t*, jit_float64_t, jit_node_t*);
-extern void _jit_pushargr_d(jit_state_t*, jit_fpr_t);
-extern void _jit_pushargi_d(jit_state_t*, jit_float64_t);
-extern void _jit_retr_d(jit_state_t*, jit_fpr_t);
-extern void _jit_reti_d(jit_state_t*, jit_float64_t);
-extern void _jit_retval_d(jit_state_t*, jit_fpr_t);
-
-#define jit_new_node(c)                _jit_new_node(_jit,c)
-extern jit_node_t *_jit_new_node(jit_state_t*, jit_code_t);
-#define jit_new_node_w(c,u)    _jit_new_node_w(_jit,c,u)
-extern jit_node_t *_jit_new_node_w(jit_state_t*, jit_code_t,
-                                  jit_word_t);
-#define jit_new_node_f(c,u)    _jit_new_node_f(_jit,c,u)
-extern jit_node_t *_jit_new_node_f(jit_state_t*, jit_code_t,
-                                  jit_float32_t);
-#define jit_new_node_d(c,u)    _jit_new_node_d(_jit,c,u)
-extern jit_node_t *_jit_new_node_d(jit_state_t*, jit_code_t,
-                                  jit_float64_t);
-#define jit_new_node_p(c,u)    _jit_new_node_p(_jit,c,u)
-extern jit_node_t *_jit_new_node_p(jit_state_t*, jit_code_t,
-                                  jit_pointer_t);
-#define jit_new_node_ww(c,u,v) _jit_new_node_ww(_jit,c,u,v)
-extern jit_node_t *_jit_new_node_ww(jit_state_t*,jit_code_t,
-                                   jit_word_t, jit_word_t);
-#define jit_new_node_wp(c,u,v) _jit_new_node_wp(_jit,c,u,v)
-extern jit_node_t *_jit_new_node_wp(jit_state_t*,jit_code_t,
-                                   jit_word_t, jit_pointer_t);
-#define jit_new_node_fp(c,u,v) _jit_new_node_fp(_jit,c,u,v)
-extern jit_node_t *_jit_new_node_fp(jit_state_t*,jit_code_t,
-                                   jit_float32_t, jit_pointer_t);
-#define jit_new_node_dp(c,u,v) _jit_new_node_dp(_jit,c,u,v)
-extern jit_node_t *_jit_new_node_dp(jit_state_t*,jit_code_t,
-                                   jit_float64_t, jit_pointer_t);
-#define jit_new_node_pw(c,u,v) _jit_new_node_pw(_jit,c,u,v)
-extern jit_node_t *_jit_new_node_pw(jit_state_t*,jit_code_t,
-                                   jit_pointer_t, jit_word_t);
-#define jit_new_node_wf(c,u,v) _jit_new_node_wf(_jit,c,u,v)
-extern jit_node_t *_jit_new_node_wf(jit_state_t*, jit_code_t,
-                                   jit_word_t, jit_float32_t);
-#define jit_new_node_wd(c,u,v) _jit_new_node_wd(_jit,c,u,v)
-extern jit_node_t *_jit_new_node_wd(jit_state_t*, jit_code_t,
-                                   jit_word_t, jit_float64_t);
-#define jit_new_node_www(c,u,v,w) _jit_new_node_www(_jit,c,u,v,w)
-extern jit_node_t *_jit_new_node_www(jit_state_t*, jit_code_t,
-                                    jit_word_t, jit_word_t, jit_word_t);
-#define jit_new_node_qww(c,l,h,v,w) _jit_new_node_qww(_jit,c,l,h,v,w)
-extern jit_node_t *_jit_new_node_qww(jit_state_t*, jit_code_t,
-                                    jit_int32_t, jit_int32_t,
-                                    jit_word_t, jit_word_t);
-#define jit_new_node_wwf(c,u,v,w) _jit_new_node_wwf(_jit,c,u,v,w)
-extern jit_node_t *_jit_new_node_wwf(jit_state_t*, jit_code_t,
-                                    jit_word_t, jit_word_t, jit_float32_t);
-#define jit_new_node_wwd(c,u,v,w) _jit_new_node_wwd(_jit,c,u,v,w)
-extern jit_node_t *_jit_new_node_wwd(jit_state_t*, jit_code_t,
-                                    jit_word_t, jit_word_t, jit_float64_t);
-#define jit_new_node_pww(c,u,v,w) _jit_new_node_pww(_jit,c,u,v,w)
-extern jit_node_t *_jit_new_node_pww(jit_state_t*, jit_code_t,
-                                    jit_pointer_t, jit_word_t, jit_word_t);
-#define jit_new_node_pwf(c,u,v,w) _jit_new_node_pwf(_jit,c,u,v,w)
-extern jit_node_t *_jit_new_node_pwf(jit_state_t*, jit_code_t,
-                                    jit_pointer_t, jit_word_t, jit_float32_t);
-#define jit_new_node_pwd(c,u,v,w) _jit_new_node_pwd(_jit,c,u,v,w)
-extern jit_node_t *_jit_new_node_pwd(jit_state_t*, jit_code_t,
-                                    jit_pointer_t, jit_word_t, jit_float64_t);
-
-#define jit_arg_register_p(u)          _jit_arg_register_p(_jit,u)
-extern jit_bool_t _jit_arg_register_p(jit_state_t*, jit_node_t*);
-#define jit_callee_save_p(u)           _jit_callee_save_p(_jit,u)
-extern jit_bool_t _jit_callee_save_p(jit_state_t*, jit_int32_t);
-#define jit_pointer_p(u)               _jit_pointer_p(_jit,u)
-extern jit_bool_t _jit_pointer_p(jit_state_t*,jit_pointer_t);
-
-#define jit_get_note(n,u,v,w)  _jit_get_note(_jit,n,u,v,w)
-extern jit_bool_t _jit_get_note(jit_state_t*,jit_pointer_t,char**,char**,int*);
-
-#define jit_disassemble()              _jit_disassemble(_jit)
-extern void _jit_disassemble(jit_state_t*);
-
-extern void jit_set_memory_functions(jit_alloc_func_ptr,
-                                    jit_realloc_func_ptr,
-                                    jit_free_func_ptr);
-extern void jit_get_memory_functions(jit_alloc_func_ptr*,
-                                    jit_realloc_func_ptr*,
-                                    jit_free_func_ptr*);
-
-#endif /* _lightning_h */
index 70560c9..e1d8a0a 100644 (file)
@@ -1011,6 +1011,12 @@ extern void _jit_retr_d(jit_state_t*, jit_fpr_t);
 extern void _jit_reti_d(jit_state_t*, jit_float64_t);
 extern void _jit_retval_d(jit_state_t*, jit_fpr_t);
 
+#define jit_get_reg(s)         _jit_get_reg(_jit,s)
+extern jit_int32_t _jit_get_reg(jit_state_t*, jit_int32_t);
+
+#define jit_unget_reg(r)       _jit_unget_reg(_jit,r)
+extern void _jit_unget_reg(jit_state_t*, jit_int32_t);
+
 #define jit_new_node(c)                _jit_new_node(_jit,c)
 extern jit_node_t *_jit_new_node(jit_state_t*, jit_code_t);
 #define jit_new_node_w(c,u)    _jit_new_node_w(_jit,c,u)
index eb7d783..45f3851 100644 (file)
@@ -34,9 +34,9 @@
 typedef enum {
 #define jit_r(i)               (_V0 + (i))
 #if NEW_ABI
-#  define jit_r_num()          7
+#  define jit_r_num()          8
 #else
-#  define jit_r_num()          11
+#  define jit_r_num()          12
 #endif
 #define jit_v(i)               (_S0 + (i))
 #define jit_v_num()            8
@@ -55,6 +55,7 @@ typedef enum {
 #  define JIT_R4               _T6
 #  define JIT_R5               _T7
 #  define JIT_R6               _T8
+#  define JIT_R7               _T9
 #else
 #  define JIT_R2               _T0
 #  define JIT_R3               _T1
@@ -65,6 +66,7 @@ typedef enum {
 #  define JIT_R8               _T6
 #  define JIT_R9               _T7
 #  define JIT_R10              _T8
+#  define JIT_R11              _T9
 #endif
     _V0, _V1,
 #if !NEW_ABI
index 8c05853..e00e74d 100644 (file)
@@ -672,14 +672,6 @@ _jit_regarg_set(jit_state_t*, jit_node_t*, jit_int32_t);
 extern void
 _jit_regarg_clr(jit_state_t*, jit_node_t*, jit_int32_t);
 
-#define jit_get_reg(s)         _jit_get_reg(_jit,s)
-extern jit_int32_t
-_jit_get_reg(jit_state_t*, jit_int32_t);
-
-#define jit_unget_reg(r)       _jit_unget_reg(_jit,r)
-extern void
-_jit_unget_reg(jit_state_t*, jit_int32_t);
-
 #define jit_save(reg)          _jit_save(_jit, reg)
 extern void
 _jit_save(jit_state_t*, jit_int32_t);
index f2ac2ba..7e9bd89 100644 (file)
@@ -14,7 +14,8 @@
 # License for more details.
 #
 
-AM_CFLAGS = -I$(top_srcdir)/include -D_GNU_SOURCE $(LIGHTNING_CFLAGS)
+AM_CFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include  \
+       -D_GNU_SOURCE $(LIGHTNING_CFLAGS)
 liblightning_LTLIBRARIES = liblightning.la
 liblightning_la_LDFLAGS = -version-info 1:0:0
 
index 8e8a9a0..5829464 100644 (file)
@@ -1610,8 +1610,7 @@ static void
 _ldxi_s(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
 {
     jit_int32_t                reg;
-    assert(!(i0 & 1));
-    if (i0 >= 0 && i0 <= 8191)
+    if (i0 >= 0 && i0 <= 8191 && !(i0 & 1))
        LDRSHI(r0, r1, i0 >> 1);
     else if (i0 > -256 && i0 < 0)
        LDURSH(r0, r1, i0 & 0x1ff);
@@ -1636,8 +1635,7 @@ static void
 _ldxi_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
 {
     jit_int32_t                reg;
-    assert(!(i0 & 1));
-    if (i0 >= 0 && i0 <= 8191)
+    if (i0 >= 0 && i0 <= 8191 && !(i0 & 1))
        LDRHI(r0, r1, i0 >> 1);
     else if (i0 > -256 && i0 < 0)
        LDURH(r0, r1, i0 & 0x1ff);
@@ -1656,8 +1654,7 @@ static void
 _ldxi_i(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
 {
     jit_int32_t                reg;
-    assert(!(i0 & 3));
-    if (i0 >= 0 && i0 <= 16383)
+    if (i0 >= 0 && i0 <= 16383 && !(i0 & 3))
        LDRSWI(r0, r1, i0 >> 2);
     else if (i0 > -256 && i0 < 0)
        LDURSW(r0, r1, i0 & 0x1ff);
@@ -1682,8 +1679,7 @@ static void
 _ldxi_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
 {
     jit_int32_t                reg;
-    assert(!(i0 & 3));
-    if (i0 >= 0 && i0 <= 16383)
+    if (i0 >= 0 && i0 <= 16383 && !(i0 & 3))
        LDRWI(r0, r1, i0 >> 2);
     else if (i0 > -256 && i0 < 0)
        LDURW(r0, r1, i0 & 0x1ff);
@@ -1702,8 +1698,7 @@ static void
 _ldxi_l(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
 {
     jit_int32_t                reg;
-    assert(!(i0 & 7));
-    if (i0 >= 0 && i0 <= 32767)
+    if (i0 >= 0 && i0 <= 32767 && !(i0 & 7))
        LDRI(r0, r1, i0 >> 3);
     else if (i0 > -256 && i0 < 0)
        LDUR(r0, r1, i0 & 0x1ff);
@@ -1775,8 +1770,7 @@ static void
 _stxi_s(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                reg;
-    assert(!(i0 & 1));
-    if (i0 >= 0 && i0 <= 8191)
+    if (i0 >= 0 && i0 <= 8191 && !(i0 & 1))
        STRHI(r1, r0, i0 >> 1);
     else if (i0 > -256 && i0 < 0)
        STURH(r1, r0, i0 & 0x1ff);
@@ -1792,8 +1786,7 @@ static void
 _stxi_i(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                reg;
-    assert(!(i0 & 3));
-    if (i0 >= 0 && i0 <= 16383)
+    if (i0 >= 0 && i0 <= 16383 && !(i0 & 3))
        STRWI(r1, r0, i0 >> 2);
     else if (i0 > -256 && i0 < 0)
        STURW(r1, r0, i0 & 0x1ff);
@@ -1809,8 +1802,7 @@ static void
 _stxi_l(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
 {
     jit_int32_t                reg;
-    assert(!(i0 & 7));
-    if (i0 >= 0 && i0 <= 32767)
+    if (i0 >= 0 && i0 <= 32767 && !(i0 & 7))
        STRI(r1, r0, i0 >> 3);
     else if (i0 > -256 && i0 < 0)
        STUR(r1, r0, i0 & 0x1ff);
index 15b91b9..27a3ed1 100644 (file)
@@ -50,7 +50,7 @@ static asymbol                         *disasm_synthetic;
 static long                      disasm_num_symbols;
 static long                      disasm_num_synthetic;
 static jit_state_t              *disasm_jit;
-#define disasm_stream            stdout
+static FILE                     *disasm_stream;
 #endif
 
 /*
@@ -73,6 +73,8 @@ jit_init_debug(const char *progname)
     }
     bfd_check_format(disasm_bfd, bfd_object);
     bfd_check_format(disasm_bfd, bfd_archive);
+    if (!disasm_stream)
+       disasm_stream = stderr;
     INIT_DISASSEMBLE_INFO(disasm_info, disasm_stream, fprintf);
 #  if defined(__i386__) || defined(__x86_64__)
     disasm_info.arch = bfd_arch_i386;
index 33b1c35..4d7f92d 100644 (file)
 
 #include <lightning.h>
 #include <lightning/jit_private.h>
-#ifdef _WIN32
-#  include <mman.h>
-#else
-#  include <sys/mman.h>
-#endif
+#include <sys/mman.h>
 
 /*
  * Prototypes
index 8fb7fa1..b73f4b1 100644 (file)
@@ -107,6 +107,10 @@ typedef union {
 #  endif
 #  define can_sign_extend_short_p(im)  ((im) >= -32678 && (im) <= 32767)
 #  define can_zero_extend_short_p(im)  ((im) >= 0 && (im) <= 65535)
+#  define is_low_mask(im)              (((im) & 1) ? (__builtin_popcountl((im) + 1) == 1) : 0)
+#  define is_high_mask(im)             ((im) ? (__builtin_popcountl((im) + (1 << __builtin_ctzl(im))) == 0) : 0)
+#  define masked_bits_count(im)                __builtin_popcountl(im)
+#  define unmasked_bits_count(im)      (__WORDSIZE - masked_bits_count(im))
 #  if __WORDSIZE == 32
 #    define can_sign_extend_int_p(im)  1
 #    define can_zero_extend_int_p(im)  1
@@ -340,8 +344,10 @@ static void _nop(jit_state_t*,jit_int32_t);
 #  define DSRLV(rd,rt,rs)              rrr_t(rs,rt,rd,MIPS_DSRLV)
 #  define DSRL(rd,rt,sa)               rrit(rt,rd,sa,MIPS_DSRL)
 #  define DSRL32(rd,rt,sa)             rrit(rt,rd,sa,MIPS_DSRL32)
-#  define INS(rt,rs,pos,size)          hrrrit(MIPS_SPECIAL3,rs,rt,pos,pos+size-1,MIPS_INS)
-#  define DINS(rt,rs,pos,size)         hrrrit(MIPS_SPECIAL3,rs,rt,pos,pos+size-1,MIPS_DINS)
+#  define INS(rt,rs,pos,size)          hrrrit(MIPS_SPECIAL3,rs,rt,pos+size-1,pos,MIPS_INS)
+#  define DINS(rt,rs,pos,size)         hrrrit(MIPS_SPECIAL3,rs,rt,pos+size-1,pos,MIPS_DINS)
+#  define EXT(rt,rs,pos,size)          hrrrit(MIPS_SPECIAL3,rs,rt,size-1,pos,MIPS_EXT)
+#  define DEXT(rt,rs,pos,size)         hrrrit(MIPS_SPECIAL3,rs,rt,size-1,pos,MIPS_DEXT)
 #  define ROTR(rd,rt,sa)               hrrrit(MIPS_SPECIAL,1,rt,rd,sa,MIPS_SRL)
 #  define DROTR(rd,rt,sa)              hrrrit(MIPS_SPECIAL,1,rt,rd,sa,MIPS_DSRL)
 #  define MFHI(rd)                     rrr_t(_ZERO_REGNO,_ZERO_REGNO,rd,MIPS_MFHI)
@@ -494,7 +500,8 @@ static void _ori(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
 #  define xorr(r0,r1,r2)               XOR(r0,r1,r2)
 #  define xori(r0,r1,i0)               _xori(_jit,r0,r1,i0)
 static void _xori(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
-#  define movr(r0,r1)                  orr(r0,r1,_ZERO_REGNO)
+#  define movr(r0,r1)                  _movr(_jit,r0,r1)
+static void _movr(jit_state_t*,jit_int32_t,jit_int32_t);
 #  define movi(r0,i0)                  _movi(_jit,r0,i0)
 static void _movi(jit_state_t*,jit_int32_t,jit_word_t);
 #  define movi_p(r0,i0)                        _movi_p(_jit,r0,i0)
@@ -1160,7 +1167,20 @@ _andi(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
     jit_int32_t                reg;
     if (can_zero_extend_short_p(i0))
        ANDI(r0, r1, i0);
-    else {
+    else if (is_low_mask(i0)) {
+#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
+       if (masked_bits_count(i0) <= 32)
+           EXT(r0, r1, 0, masked_bits_count(i0));
+       else
+#endif
+       {
+               lshi(r0, r1, unmasked_bits_count(i0));
+               rshi_u(r0, r0, unmasked_bits_count(i0));
+       }
+    } else if (is_high_mask(i0)) {
+       rshi(r0, r1, unmasked_bits_count(i0));
+       lshi(r0, r0, unmasked_bits_count(i0));
+    } else {
        reg = jit_get_reg(jit_class_gpr);
        movi(rn(reg), i0);
        AND(r0, r1, rn(reg));
@@ -1196,6 +1216,13 @@ _xori(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
     }
 }
 
+static void
+_movr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
+{
+    if (r0 != r1)
+       orr(r0, r1, _ZERO_REGNO);
+}
+
 static void
 _movi(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
 {
@@ -2869,10 +2896,11 @@ _bmci(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
 static void
 _callr(jit_state_t *_jit, jit_int32_t r0)
 {
+    JALR(r0);
     if (r0 != _T9_REGNO)
        movr(_T9_REGNO, r0);
-    JALR(r0);
-    NOP(1);
+    else
+       NOP(1);
 }
 
 static void
index c4397ad..9e99771 100644 (file)
@@ -1160,7 +1160,11 @@ _htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
     ROTLWI(rn(reg), r1, 8);
     RLWIMI(rn(reg), r1, 24, 0, 7);
     RLWIMI(rn(reg), r1, 24, 16, 23);
+#  if __WORDSIZE == 64
     CLRLDI(r0, rn(reg), 32);
+#  else
+    MR(r0,rn(reg));
+#  endif
     jit_unget_reg(reg);
 }
 
index fc4ab87..c44623a 100644 (file)
 #include <lightning.h>
 #include <lightning/jit_private.h>
 
-#define print_chr(value)               fputc(value, stdout)
-#define print_hex(value)               fprintf(stdout, "0x%lx", value)
-#define print_dec(value)               fprintf(stdout, "%ld", value)
-#define print_flt(value)               fprintf(stdout, "%g", value)
-#define print_str(value)               fprintf(stdout, "%s", value)
-#define print_ptr(value)               fprintf(stdout, "%p", value)
+#define print_chr(value)               fputc(value, print_stream)
+#define print_hex(value)               fprintf(print_stream, "0x%lx", value)
+#define print_dec(value)               fprintf(print_stream, "%ld", value)
+#define print_flt(value)               fprintf(print_stream, "%g", value)
+#define print_str(value)               fprintf(print_stream, "%s", value)
+#define print_ptr(value)               fprintf(print_stream, "%p", value)
 #define print_reg(value)                                               \
     do {                                                               \
        if ((value) & jit_regno_patch)                                  \
  * Initialization
  */
 #include "jit_names.c"
+/*
+ * Initialization
+ */
+static FILE    *print_stream;
+
 
 /*
  * Implementation
@@ -54,6 +59,9 @@ _jit_print(jit_state_t *_jit)
 {
     jit_node_t         *node;
 
+    if (!print_stream)
+       print_stream = stderr;
+
     if ((node = _jitc->head)) {
        jit_print_node(node);
        for (node = node->next; node; node = node->next) {
@@ -280,12 +288,12 @@ _jit_print_node(jit_state_t *_jit, jit_node_t *node)
        case jit_code_name:
            print_chr(' ');
            if (node->v.p && _jitc->emit)
-               print_ptr(node->v.n->u.p);
+               print_str(node->v.n->u.p);
            break;
        case jit_code_note:
            print_chr(' ');
            if (node->v.p && _jitc->emit)
-               print_ptr(node->v.n->u.p);
+               print_str(node->v.n->u.p);
            if (node->v.p && _jitc->emit && node->w.w)
                print_chr(':');
            if (node->w.w)
index 4627783..547f36c 100644 (file)
@@ -661,10 +661,22 @@ static jit_word_t _bxsubi_u(jit_state_t*,jit_word_t,jit_int32_t,jit_word_t);
 static void _callr(jit_state_t*, jit_int32_t);
 #  define calli(i0)                    _calli(_jit, i0)
 static jit_word_t _calli(jit_state_t*, jit_word_t);
+#  if __X64
+#    define calli_p(i0)                        _calli_p(_jit, i0)
+static jit_word_t _calli_p(jit_state_t*, jit_word_t);
+#  else
+#    define calli_p(i0)                        calli(i0)
+#  endif
 #  define jmpr(r0)                     _jmpr(_jit, r0)
 static void _jmpr(jit_state_t*, jit_int32_t);
 #  define jmpi(i0)                     _jmpi(_jit, i0)
 static jit_word_t _jmpi(jit_state_t*, jit_word_t);
+#  if __X64
+#    define jmpi_p(i0)                 _jmpi_p(_jit, i0)
+static jit_word_t _jmpi_p(jit_state_t*, jit_word_t);
+#  else
+#    define jmpi_p(i0)                 jmpi(i0)
+#  endif
 #  define jmpsi(i0)                    _jmpsi(_jit, i0)
 static void _jmpsi(jit_state_t*, jit_uint8_t);
 #  define prolog(node)                 _prolog(_jit, node)
@@ -3411,27 +3423,41 @@ static jit_word_t
 _calli(jit_state_t *_jit, jit_word_t i0)
 {
     jit_word_t         word;
+    jit_word_t         w;
 #if __X64
-    jit_int32_t                reg;
+    w = i0 - (_jit->pc.w + 5);
+    if ((jit_int32_t)w == w) {
+#endif
+       ic(0xe8);
+       w = i0 - (_jit->pc.w + 4);
+       ii(w);
+       word = _jit->pc.w;
+#if __X64
+    }
+    else
+       word = calli_p(i0);
+#endif
+    return (word);
+}
 
+#if __X64
+static jit_word_t
+_calli_p(jit_state_t *_jit, jit_word_t i0)
+{
+    jit_word_t         word;
+    jit_int32_t                reg;
     reg = jit_get_reg(jit_class_gpr);
     word = movi_p(rn(reg), i0);
     callr(rn(reg));
     jit_unget_reg(reg);
-#else
-    jit_word_t         w;
-    ic(0xe8);
-    w = i0 - (_jit->pc.w + 4);
-    ii(w);
-    word = _jit->pc.w;
-#endif
     return (word);
 }
+#endif
 
 static void
 _jmpr(jit_state_t *_jit, jit_int32_t r0)
 {
-    rex(0, WIDE, _NOREG, _NOREG, r0);
+    rex(0, 0, _NOREG, _NOREG, r0);
     ic(0xff);
     mrm(0x03, 0x04, r7(r0));
 }
@@ -3439,13 +3465,38 @@ _jmpr(jit_state_t *_jit, jit_int32_t r0)
 static jit_word_t
 _jmpi(jit_state_t *_jit, jit_word_t i0)
 {
+    jit_word_t         word;
     jit_word_t         w;
-    ic(0xe9);
-    w = i0 - (_jit->pc.w + 4);
-    ii(w);
-    return (_jit->pc.w);
+#if __X64
+    w = i0 - (_jit->pc.w + 5);
+    if ((jit_int32_t)w == w) {
+#endif
+       ic(0xe9);
+       w = i0 - (_jit->pc.w + 4);
+       ii(w);
+       word = _jit->pc.w;
+#if __X64
+    }
+    else
+       word = jmpi_p(i0);
+#endif
+    return (word);
 }
 
+#if __X64
+static jit_word_t
+_jmpi_p(jit_state_t *_jit, jit_word_t i0)
+{
+    jit_word_t         word;
+    jit_int32_t                reg;
+    reg = jit_get_reg(jit_class_gpr|jit_class_nospill);
+    word = movi_p(rn(reg), i0);
+    jmpr(rn(reg));
+    jit_unget_reg(reg);
+    return (word);
+}
+#endif
+
 static void
 _jmpsi(jit_state_t *_jit, jit_uint8_t i0)
 {
@@ -3830,6 +3881,7 @@ _patch_at(jit_state_t *_jit, jit_node_t *node,
     switch (node->code) {
 #  if __X64
        case jit_code_calli:
+       case jit_code_jmpi:
 #  endif
        case jit_code_movi:
            patch_abs(instr, label);
index c34a117..7dd900e 100644 (file)
@@ -2012,7 +2012,7 @@ _emit_code(jit_state_t *_jit)
                    if (temp->flag & jit_flag_patch)
                        jmpi(temp->u.w);
                    else {
-                       word = jmpi(_jit->pc.w);
+                       word = jmpi_p(_jit->pc.w);
                        patch(word, node);
                    }
                }
@@ -2027,9 +2027,12 @@ _emit_code(jit_state_t *_jit)
                    temp = node->u.n;
                    assert(temp->code == jit_code_label ||
                           temp->code == jit_code_epilog);
-                   word = calli(temp->u.w);
-                   if (!(temp->flag & jit_flag_patch))
+                   if (temp->flag & jit_flag_patch)
+                       calli(temp->u.w);
+                   else {
+                       word = calli_p(_jit->pc.w);
                        patch(word, node);
+                   }
                }
                else
                    calli(node->u.w);
index 507abb6..22eca0c 100644 (file)
 
 #include <lightning.h>
 #include <lightning/jit_private.h>
-#ifdef _WIN32
-#  include <mman.h>
-#else
-#  include <sys/mman.h>
-#endif
+#include <sys/mman.h>
 #if defined(__sgi)
 #  include <fcntl.h>
 #endif
diff --git a/deps/lightning/m4/.gitignore b/deps/lightning/m4/.gitignore
new file mode 100644 (file)
index 0000000..24e2f3f
--- /dev/null
@@ -0,0 +1,10 @@
+/lt~obsolete.m4
+/ltversion.m4
+/ltsugar.m4
+/ltoptions.m4
+/libtool.m4
+/00gnulib.m4
+/gnulib-common.m4
+/gnulib-comp.m4
+/gnulib-tool.m4
+/zzgnulib.m4
diff --git a/deps/lightning/m4/gnulib-cache.m4 b/deps/lightning/m4/gnulib-cache.m4
new file mode 100644 (file)
index 0000000..45be7ba
--- /dev/null
@@ -0,0 +1,57 @@
+# Copyright (C) 2002-2021 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This file 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this file.  If not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License,
+# this file may be distributed as part of a program that
+# contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# Generated by gnulib-tool.
+#
+# This file represents the specification of how gnulib-tool is used.
+# It acts as a cache: It is written and read by gnulib-tool.
+# In projects that use version control, this file is meant to be put under
+# version control, like the configure.ac and various Makefile.am files.
+
+
+# Specification in the form of a command-line invocation:
+# gnulib-tool --import --local-dir=gl \
+#  --lib=libgnu \
+#  --source-base=gnulib-lib \
+#  --m4-base=m4 \
+#  --doc-base=gnulib-doc \
+#  --tests-base=tests \
+#  --aux-dir=build-aux \
+#  --no-conditional-dependencies \
+#  --libtool \
+#  --macro-prefix=gl
+
+# Specification in the form of a few gnulib-tool.m4 macro invocations:
+gl_LOCAL_DIR([gl])
+gl_MODULES([
+  
+])
+gl_AVOID([])
+gl_SOURCE_BASE([gnulib-lib])
+gl_M4_BASE([m4])
+gl_PO_BASE([])
+gl_DOC_BASE([gnulib-doc])
+gl_TESTS_BASE([tests])
+gl_LIB([libgnu])
+gl_MAKEFILE_NAME([])
+gl_LIBTOOL
+gl_MACRO_PREFIX([gl])
+gl_PO_DOMAIN([])
+gl_WITNESS_C_MACRO([])