diff --git a/ChangeLog b/ChangeLog index 32255d8c0..760acf4b4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,10 +1,59 @@ +2006-10-30 Paolo Bonzini + + * lightning/Makefile.am: Use "ln -sf". + * lightning/core-common.h: Define jit_negr_l if necessary. + 2006-10-30 Paolo Bonzini * lightning/i386/asm.h (MOVS*, MOVZ*): Use correct _r[124] macros. +2006-10-29 Paolo Bonzini + + * configure.ac: Use lightning.m4 macros. + * lightning.m4: Refactor to use common code in configure.ac. Move... + * build-aux/lightning.m4: ... here. + * lightningize.in: Support suffixes. + * opcode/disass.in: Adapt to changes in configure.ac. + + * lightning/ppc/funcs.h: Use __APPLE__ instead of _CALL_DARWIN. + * lightning/i386/core-32.h: Likewise. + +2006-10-26 Paolo Bonzini + + * configure.ac: Fix compilation test. + * lightning/Makefile.am: Symlink LIGHTNING_TARGET_FILES in + non-distribution mode. + * lightning/i386/Makefile.frag: Use LIGHTNING_TARGET_FILES. + +2006-10-26 Paolo Bonzini + + * configure.ac: Subst cpu. + * lightning/core-common.h: Make tests pass on i386. + * lightning/i386/asm-32.h: Make tests pass on i386. + * lightning/i386/asm-64.h: Make tests pass on i386. + * lightning/i386/asm-i386.h: Make tests pass on i386. + * lightning/i386/core-32.h: Make tests pass on i386. + * lightning/i386/core-64.h: Make tests pass on i386. + * lightning/i386/core-i386.h: Make tests pass on i386. + * tests/Makefile.am: Include files from cpu directory. + +2006-10-26 Paolo Bonzini + + * lightning/i386/asm.h: Move to asm-i386.h + * lightning/i386/asm-32.h: New, from Matthew Flatt. + * lightning/i386/asm-64.h: New, from Matthew Flatt. + * lightning/i386/core.h: Move to core-i386.h + * lightning/i386/core-32.h: New, from Matthew Flatt. + * lightning/i386/core-64.h: New, from Matthew Flatt. + * lightning/i386/fp.h: Move to fp-32.h + * lightning/i386/fp-64.h: New, dummy. + * lightning/i386/Makefile.frag: New. + * lightning/Makefile.am: Support per-target Makefile fragments. + * configure.ac: Support per-target Makefile fragments and CPU suffixes. + 2006-10-16 Paolo Bonzini - * lightning/i386/funcs.h (jit_flush_code): Fix syntax error. :-( + * lightning/i386/i386.h (jit_flush_code): Fix syntax error. :-( 2006-07-06 Paolo Bonzini Ludovic Courtes diff --git a/Makefile.am b/Makefile.am index 92654b098..8a87da95d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,6 @@ # Automake requirements: -AUTOMAKE_OPTIONS = 1.7 gnu +AUTOMAKE_OPTIONS = 1.8 gnu +ACLOCAL_AMFLAGS = -I build-aux SUBDIRS = . doc lightning opcode tests EXTRA_DIST = build-aux/texi2dvi build-aux/help2man @@ -7,5 +8,5 @@ EXTRA_DIST = build-aux/texi2dvi build-aux/help2man include_HEADERS = lightning.h aclocaldir = $(datadir)/aclocal -dist_aclocal_DATA = lightning.m4 +dist_aclocal_DATA = build-aux/lightning.m4 bin_SCRIPTS = lightningize diff --git a/Makefile.in b/Makefile.in index bfd05e0ae..18d2d75b2 100644 --- a/Makefile.in +++ b/Makefile.in @@ -43,13 +43,14 @@ DIST_COMMON = README $(am__configure_deps) $(dist_aclocal_DATA) \ $(include_HEADERS) $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/config.h.in $(srcdir)/lightningize.in \ $(top_srcdir)/configure AUTHORS COPYING COPYING.DOC \ - COPYING.LESSER ChangeLog INSTALL NEWS THANKS \ + COPYING.LESSER ChangeLog INSTALL NEWS THANKS TODO \ build-aux/config.guess build-aux/config.sub build-aux/depcomp \ build-aux/install-sh build-aux/mdate-sh build-aux/missing \ build-aux/texinfo.tex subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__aclocal_m4_deps = $(top_srcdir)/build-aux/lightning.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ @@ -159,6 +160,7 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +cpu = @cpu@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ @@ -194,12 +196,13 @@ target_os = @target_os@ target_vendor = @target_vendor@ # Automake requirements: -AUTOMAKE_OPTIONS = 1.7 gnu +AUTOMAKE_OPTIONS = 1.8 gnu +ACLOCAL_AMFLAGS = -I build-aux SUBDIRS = . doc lightning opcode tests EXTRA_DIST = build-aux/texi2dvi build-aux/help2man include_HEADERS = lightning.h aclocaldir = $(datadir)/aclocal -dist_aclocal_DATA = lightning.m4 +dist_aclocal_DATA = build-aux/lightning.m4 bin_SCRIPTS = lightningize all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive diff --git a/aclocal.m4 b/aclocal.m4 index aef181a6d..f8b576084 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -848,3 +848,4 @@ AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR +m4_include([build-aux/lightning.m4]) diff --git a/build-aux/lightning.m4 b/build-aux/lightning.m4 new file mode 100644 index 000000000..105aaf2d4 --- /dev/null +++ b/build-aux/lightning.m4 @@ -0,0 +1,64 @@ +dnl I'd like this to be edited in -*- Autoconf -*- mode... +dnl +# serial 2 LIGHTNING_CONFIGURE_IF_NOT_FOUND +m4_define([LIGHTNING_BACKENDS], [i386:-32 i386:-64 sparc ppc]) + +AC_DEFUN([LIGHTNING_CONFIGURE_LINKS], [ + +suffix= +case "$host_cpu" in + i?86) cpu=i386; suffix=-32 ;; + x86_64) cpu=i386; suffix=-64 ;; + sparc*) cpu=sparc ;; + powerpc) cpu=ppc ;; + *) ;; +esac +if test -n "$cpu" && test -d "$srcdir/lightning/$cpu"; then + $1 + lightning_frag=`cd $srcdir && pwd`/lightning/$cpu/Makefile.frag + test -f $lightning_frag || lightning_frag=/dev/null + + asm_src=lightning/$cpu/asm.h + test -f $srcdir/lightning/$cpu/asm$suffix.h && asm_src=lightning/$cpu/asm$suffix.h + AC_CONFIG_LINKS(lightning/asm.h:$asm_src, [], [asm_src=$asm_src]) + + fp_src=lightning/$cpu/fp.h + test -f $srcdir/lightning/$cpu/fp$suffix.h && fp_src=lightning/$cpu/fp$suffix.h + AC_CONFIG_LINKS(lightning/fp.h:$fp_src, [], [fp_src=$fp_src]) + + core_src=lightning/$cpu/core.h + test -f $srcdir/lightning/$cpu/core$suffix.h && core_src=lightning/$cpu/core$suffix.h + AC_CONFIG_LINKS(lightning/core.h:$core_src, [], [core_src=$core_src]) + + funcs_src=lightning/$cpu/funcs.h + test -f $srcdir/lightning/$cpu/funcs$suffix.h && funcs_src=lightning/$cpu/funcs$suffix.h + AC_CONFIG_LINKS(lightning/funcs.h:$funcs_src, [], [funcs_src=$funcs_src]) +else + $2 + lightning_frag=/dev/null +fi +AC_SUBST_FILE(lightning_frag) + +]) + +AC_DEFUN([LIGHTNING_CONFIGURE_IF_NOT_FOUND], [ +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_CHECK_HEADER(lightning.h) +AM_CONDITIONAL(LIGHTNING_MAIN, (exit 1)) +AM_CONDITIONAL(HAVE_INSTALLED_LIGHTNING, test "$ac_cv_header_lightning_h" = yes) + +lightning= +if test "$ac_cv_header_lightning_h" = yes; then + lightning=yes +else + LIGHTNING_CONFIGURE_LINKS(lightning=yes, lightning=no) +fi + +AS_IF([test "$lightning" = yes], [ + AC_DEFINE(HAVE_LIGHTNING, 1, [Define if GNU lightning can be used]) + $1 +], [$2]) +unset lightning + +])dnl diff --git a/config.h.in b/config.h.in index d38eddc03..69cbd81f6 100644 --- a/config.h.in +++ b/config.h.in @@ -6,14 +6,8 @@ /* Define if the test programs should disassemble the code they produce */ #undef LIGHTNING_DISASSEMBLE -/* Define if lightning is targeting the x86 architecture */ -#undef LIGHTNING_I386 - -/* Define if lightning is targeting the PowerPC architecture */ -#undef LIGHTNING_PPC - -/* Define if lightning is targeting the SPARC architecture */ -#undef LIGHTNING_SPARC +/* Used to pick the appropriate disassembler, for debugging */ +#undef LIGHTNING_TARGET /* Name of package */ #undef PACKAGE diff --git a/configure b/configure index 50e30ef7d..1cbb424e4 100755 --- a/configure +++ b/configure @@ -655,16 +655,17 @@ LN_S RANLIB INSTALL_INFO BACKENDS +cpu +LIGHTNING_MAIN_TRUE +LIGHTNING_MAIN_FALSE REGRESSION_TESTING_TRUE REGRESSION_TESTING_FALSE DISASS_TRUE DISASS_FALSE -LIGHTNING_MAIN_TRUE -LIGHTNING_MAIN_FALSE LIBDISASS LIBOBJS LTLIBOBJS' -ac_subst_files='' +ac_subst_files='lightning_frag' ac_precious_vars='build_alias host_alias target_alias @@ -3995,29 +3996,68 @@ fi -BACKENDS="i386 sparc ppc" +BACKENDS="i386:-32 i386:-64 sparc ppc" -case "$target_cpu" in - i?86) cpu=i386; -cat >>confdefs.h <<\_ACEOF -#define LIGHTNING_I386 1 -_ACEOF - ;; - sparc*) cpu=sparc; -cat >>confdefs.h <<\_ACEOF -#define LIGHTNING_SPARC 1 -_ACEOF - ;; - powerpc) cpu=ppc; -cat >>confdefs.h <<\_ACEOF -#define LIGHTNING_PPC 1 -_ACEOF - ;; - *) { { echo "$as_me:$LINENO: error: cpu $target_cpu not supported" >&5 -echo "$as_me: error: cpu $target_cpu not supported" >&2;} - { (exit 1); exit 1; }; } ;; + + +suffix= +case "$host_cpu" in + i?86) cpu=i386; suffix=-32 ;; + x86_64) cpu=i386; suffix=-64 ;; + sparc*) cpu=sparc ;; + powerpc) cpu=ppc ;; + *) ;; esac +if test -n "$cpu" && test -d "$srcdir/lightning/$cpu"; then + +cat >>confdefs.h <<_ACEOF +#define LIGHTNING_TARGET `echo "LIGHTNING_$cpu$suffix" | $as_tr_cpp` +_ACEOF + + lightning_frag=`cd $srcdir && pwd`/lightning/$cpu/Makefile.frag + test -f $lightning_frag || lightning_frag=/dev/null + + asm_src=lightning/$cpu/asm.h + test -f $srcdir/lightning/$cpu/asm$suffix.h && asm_src=lightning/$cpu/asm$suffix.h + ac_config_links="$ac_config_links lightning/asm.h:$asm_src" + + + fp_src=lightning/$cpu/fp.h + test -f $srcdir/lightning/$cpu/fp$suffix.h && fp_src=lightning/$cpu/fp$suffix.h + ac_config_links="$ac_config_links lightning/fp.h:$fp_src" + + + core_src=lightning/$cpu/core.h + test -f $srcdir/lightning/$cpu/core$suffix.h && core_src=lightning/$cpu/core$suffix.h + ac_config_links="$ac_config_links lightning/core.h:$core_src" + + + funcs_src=lightning/$cpu/funcs.h + test -f $srcdir/lightning/$cpu/funcs$suffix.h && funcs_src=lightning/$cpu/funcs$suffix.h + ac_config_links="$ac_config_links lightning/funcs.h:$funcs_src" + +else + { { echo "$as_me:$LINENO: error: cpu $target_cpu not supported" >&5 +echo "$as_me: error: cpu $target_cpu not supported" >&2;} + { (exit 1); exit 1; }; } + lightning_frag=/dev/null +fi + + + + + + + +if :; then + LIGHTNING_MAIN_TRUE= + LIGHTNING_MAIN_FALSE='#' +else + LIGHTNING_MAIN_TRUE='#' + LIGHTNING_MAIN_FALSE= +fi + # Check whether --enable-disassembling was given. @@ -4053,8 +4093,10 @@ cat >>confdefs.h <<\_ACEOF #define LIGHTNING_DISASSEMBLE 1 _ACEOF + LIBDISASS="libdisass.a" +else + LIBDISASS= fi -LIBDISASS="" if test "$enable_disassembling" != no; then @@ -4065,7 +4107,8 @@ else DISASS_FALSE= fi -test "$enable_disassembling" != no && LIBDISASS="libdisass.a" +test "$enable_disassembling" != no && + # Check whether --enable-assertions was given. if test "${enable_assertions+set}" = set; then @@ -4084,23 +4127,6 @@ _ACEOF fi - -if :; then - LIGHTNING_MAIN_TRUE= - LIGHTNING_MAIN_FALSE='#' -else - LIGHTNING_MAIN_TRUE='#' - LIGHTNING_MAIN_FALSE= -fi - - - -cpu_dir=lightning/$cpu -ac_config_links="$ac_config_links lightning/asm.h:$cpu_dir/asm.h lightning/fp.h:$cpu_dir/fp.h lightning/core.h:$cpu_dir/core.h lightning/funcs.h:$cpu_dir/funcs.h" - - - - ac_config_files="$ac_config_files Makefile doc/Makefile tests/Makefile opcode/Makefile lightning/Makefile" ac_config_files="$ac_config_files lightningize" @@ -4216,6 +4242,13 @@ echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi +if test -z "${LIGHTNING_MAIN_TRUE}" && test -z "${LIGHTNING_MAIN_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"LIGHTNING_MAIN\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"LIGHTNING_MAIN\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi if test -z "${REGRESSION_TESTING_TRUE}" && test -z "${REGRESSION_TESTING_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"REGRESSION_TESTING\" was never defined. Usually this means the macro was only invoked conditionally." >&5 @@ -4230,13 +4263,6 @@ echo "$as_me: error: conditional \"DISASS\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi -if test -z "${LIGHTNING_MAIN_TRUE}" && test -z "${LIGHTNING_MAIN_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"LIGHTNING_MAIN\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"LIGHTNING_MAIN\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files @@ -4685,7 +4711,10 @@ cat >>$CONFIG_STATUS <<_ACEOF # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" -cpu_dir=$cpu_dir +asm_src=$asm_src +fp_src=$fp_src +core_src=$core_src +funcs_src=$funcs_src _ACEOF @@ -4697,10 +4726,10 @@ do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "lightning/asm.h") CONFIG_LINKS="$CONFIG_LINKS lightning/asm.h:$cpu_dir/asm.h" ;; - "lightning/fp.h") CONFIG_LINKS="$CONFIG_LINKS lightning/fp.h:$cpu_dir/fp.h" ;; - "lightning/core.h") CONFIG_LINKS="$CONFIG_LINKS lightning/core.h:$cpu_dir/core.h" ;; - "lightning/funcs.h") CONFIG_LINKS="$CONFIG_LINKS lightning/funcs.h:$cpu_dir/funcs.h" ;; + "lightning/asm.h") CONFIG_LINKS="$CONFIG_LINKS lightning/asm.h:$asm_src" ;; + "lightning/fp.h") CONFIG_LINKS="$CONFIG_LINKS lightning/fp.h:$fp_src" ;; + "lightning/core.h") CONFIG_LINKS="$CONFIG_LINKS lightning/core.h:$core_src" ;; + "lightning/funcs.h") CONFIG_LINKS="$CONFIG_LINKS lightning/funcs.h:$funcs_src" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; @@ -4765,6 +4794,11 @@ if test -n "$CONFIG_FILES"; then _ACEOF +# Create sed commands to just substitute file output variables. + +# Remaining file output variables are in a fragment that also has non-file +# output varibles. + ac_delim='%!_!# ' @@ -4861,15 +4895,12 @@ LN_S!$LN_S$ac_delim RANLIB!$RANLIB$ac_delim INSTALL_INFO!$INSTALL_INFO$ac_delim BACKENDS!$BACKENDS$ac_delim -REGRESSION_TESTING_TRUE!$REGRESSION_TESTING_TRUE$ac_delim -REGRESSION_TESTING_FALSE!$REGRESSION_TESTING_FALSE$ac_delim -DISASS_TRUE!$DISASS_TRUE$ac_delim -DISASS_FALSE!$DISASS_FALSE$ac_delim +cpu!$cpu$ac_delim LIGHTNING_MAIN_TRUE!$LIGHTNING_MAIN_TRUE$ac_delim LIGHTNING_MAIN_FALSE!$LIGHTNING_MAIN_FALSE$ac_delim _ACEOF - if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 94; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 @@ -4889,6 +4920,10 @@ fi cat >>$CONFIG_STATUS <<_ACEOF cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof /@[a-zA-Z_][a-zA-Z_0-9]*@/!b +/^[ ]*@lightning_frag@[ ]*$/{ +r $lightning_frag +d +} _ACEOF sed ' s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g @@ -4908,12 +4943,16 @@ _ACEOF ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF +REGRESSION_TESTING_TRUE!$REGRESSION_TESTING_TRUE$ac_delim +REGRESSION_TESTING_FALSE!$REGRESSION_TESTING_FALSE$ac_delim +DISASS_TRUE!$DISASS_TRUE$ac_delim +DISASS_FALSE!$DISASS_FALSE$ac_delim LIBDISASS!$LIBDISASS$ac_delim LIBOBJS!$LIBOBJS$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF - if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 3; then + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 7; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 @@ -5534,7 +5573,7 @@ fi # A small sanity check echo "#include " > confdefs.h # dummy input file -CPPFLAGS="$CPPFLAGS -I. -I$srcdir" +CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/lightning/$cpu" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ diff --git a/configure.ac b/configure.ac index 43f31b3cc..59f6bbf27 100644 --- a/configure.ac +++ b/configure.ac @@ -26,18 +26,16 @@ AC_PROG_MAKE_SET AC_PATH_PROG(INSTALL_INFO, install-info, :, $PATH:/sbin) AC_EXEEXT -BACKENDS="i386 sparc ppc" +BACKENDS="LIGHTNING_BACKENDS" AC_SUBST(BACKENDS) -case "$target_cpu" in - i?86) cpu=i386; AC_DEFINE(LIGHTNING_I386, 1, - [Define if lightning is targeting the x86 architecture]) ;; - sparc*) cpu=sparc; AC_DEFINE(LIGHTNING_SPARC, 1, - [Define if lightning is targeting the SPARC architecture]) ;; - powerpc) cpu=ppc; AC_DEFINE(LIGHTNING_PPC, 1, - [Define if lightning is targeting the PowerPC architecture]) ;; - *) AC_MSG_ERROR([cpu $target_cpu not supported]) ;; -esac +LIGHTNING_CONFIGURE_LINKS( + [AC_DEFINE_UNQUOTED(LIGHTNING_TARGET, [AS_TR_CPP([LIGHTNING_$cpu$suffix])], + [Used to pick the appropriate disassembler, for debugging])], + [AC_MSG_ERROR([cpu $target_cpu not supported])]) + +AC_SUBST(cpu) +AM_CONDITIONAL(LIGHTNING_MAIN, :) dnl ---------------------------- COMMAND LINE --------------------------------- @@ -56,10 +54,13 @@ fi if test "$enable_disassembling" != no; then AC_DEFINE(LIGHTNING_DISASSEMBLE, 1, [Define if the test programs should disassemble the code they produce]) + LIBDISASS="libdisass.a" +else + LIBDISASS= fi -LIBDISASS="" AM_CONDITIONAL(DISASS, test "$enable_disassembling" != no) -test "$enable_disassembling" != no && LIBDISASS="libdisass.a" +test "$enable_disassembling" != no && +AC_SUBST(LIBDISASS) AC_ARG_ENABLE( assertions, [ --enable-assertions perform internal consistency checks], @@ -69,19 +70,8 @@ if test "$enable_assertions" != no; then AC_DEFINE(_ASM_SAFETY, 1, [Define to enable assertions]) fi -AM_CONDITIONAL(LIGHTNING_MAIN, :) - dnl --------------------------- PRODUCE OUTPUT -------------------------------- -cpu_dir=lightning/$cpu -AC_CONFIG_LINKS(lightning/asm.h:$cpu_dir/asm.h dnl - lightning/fp.h:$cpu_dir/fp.h dnl - lightning/core.h:$cpu_dir/core.h dnl - lightning/funcs.h:$cpu_dir/funcs.h, [], - [cpu_dir=$cpu_dir]) - -AC_SUBST(LIBDISASS) - AC_CONFIG_FILES(Makefile doc/Makefile tests/Makefile opcode/Makefile lightning/Makefile) AC_CONFIG_FILES(lightningize, chmod +x lightningize) @@ -90,6 +80,6 @@ AC_OUTPUT # A small sanity check echo "#include " > confdefs.h # dummy input file -CPPFLAGS="$CPPFLAGS -I. -I$srcdir" +CPPFLAGS="$CPPFLAGS -I. -I$srcdir -I$srcdir/lightning/$cpu" AC_TRY_COMPILE([#include "lightning.h"], , , AC_MSG_WARN(the compiler that was found could not compile GNU lightning)) diff --git a/doc/Makefile.in b/doc/Makefile.in index 5d1814aad..3223a92f8 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -41,7 +41,8 @@ DIST_COMMON = $(dist_man1_MANS) $(lightning_TEXINFOS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/stamp-vti $(srcdir)/version.texi ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__aclocal_m4_deps = $(top_srcdir)/build-aux/lightning.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -132,6 +133,7 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +cpu = @cpu@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ diff --git a/doc/lightningize.1 b/doc/lightningize.1 index cc6fbb2e5..bb3c53bf5 100644 --- a/doc/lightningize.1 +++ b/doc/lightningize.1 @@ -1,5 +1,5 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.28. -.TH LIGHTNINGIZE "1" "September 2006" "lightningize 1.2b" "User Commands" +.TH LIGHTNINGIZE "1" "October 2006" "lightningize 1.2b" "User Commands" .SH NAME lightningize \- manual page for lightningize 1.2b .SH SYNOPSIS diff --git a/lightning.m4 b/lightning.m4 deleted file mode 100644 index 1c9d01f58..000000000 --- a/lightning.m4 +++ /dev/null @@ -1,58 +0,0 @@ -dnl I'd like this to be edited in -*- Autoconf -*- mode... -dnl -# serial 1 LIGHTNING_CONFIGURE_IF_NOT_FOUND -AC_DEFUN([LIGHTNING_CONFIGURE_IF_NOT_FOUND], [ -AC_REQUIRE([AC_PROG_LN_S])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_CHECK_HEADER(lightning.h) -AM_CONDITIONAL(LIGHTNING_MAIN, (exit 1)) -AM_CONDITIONAL(HAVE_INSTALLED_LIGHTNING, test "$ac_cv_header_lightning_h" = yes) - -lightning= -if test "$ac_cv_header_lightning_h" = yes; then - lightning=yes -else - case "$host_cpu" in - i?86) cpu_subdir=i386 ;; - sparc*) cpu_subdir=sparc ;; - powerpc) cpu_subdir=ppc ;; - *) ;; - esac - test -n "$cpu_subdir" && test -d "$srcdir/lightning/$cpu_subdir" && \ - lightning=yes -fi - -ifdef([AC_HELP_STRING], [ - dnl autoconf 2.50 style - if test -n "$cpu_subdir" && test -d "$srcdir/lightning/$cpu_subdir"; then - AC_CONFIG_LINKS(lightning/asm.h:lightning/$cpu_subdir/asm.h - lightning/core.h:lightning/$cpu_subdir/core.h - lightning/fp.h:lightning/$cpu_subdir/fp.h - lightning/funcs.h:lightning/$cpu_subdir/funcs.h, , [ - cpu_subdir=$cpu_subdir - ]) - fi -], [ - dnl autoconf 2.13 style - AC_OUTPUT_COMMANDS([ - if test -n "$cpu_subdir" && test -d "$srcdir/lightning/$cpu_subdir"; then - for i in asm fp core funcs; do - echo linking $srcdir/lightning/$cpu_subdir/$i.h to lightning/$i.h - (cd lightning && $LN_S -f $srcdir/$cpu_subdir/$i.h $i.h) - done - fi - ], [ - LN_S='$LN_S' - cpu_subdir=$cpu_subdir - ]) -]) - -if test -n "$lightning"; then - AC_DEFINE(HAVE_LIGHTNING, 1, [Define if GNU lightning can be used]) - lightning= - ifelse([$1], , :, [$1]) -else - ifelse([$2], , :, [$2]) -fi - -])dnl diff --git a/lightning/Makefile.am b/lightning/Makefile.am index 0c39bf957..cce56d701 100644 --- a/lightning/Makefile.am +++ b/lightning/Makefile.am @@ -1,18 +1,32 @@ DISTCLEANFILES = asm.h core.h funcs.h fp.h -LIGHTNING_FILES = funcs-common.h core-common.h fp-common.h \ - asm-common.h \ - i386/asm.h i386/core.h i386/funcs.h i386/fp.h \ - sparc/asm.h sparc/core.h sparc/funcs.h sparc/fp.h \ - ppc/asm.h ppc/core.h ppc/funcs.h ppc/fp.h +EXTRA_DIST = i386/Makefile.frag \ + i386/asm-32.h i386/asm-64.h i386/asm-i386.h \ + i386/core-32.h i386/core-64.h i386/core-i386.h \ + i386/fp-32.h i386/fp-64.h \ + i386/funcs.h \ + sparc/asm.h sparc/core.h sparc/funcs.h sparc/fp.h \ + ppc/asm.h ppc/core.h ppc/funcs.h ppc/fp.h + +@lightning_frag@ + +LIGHTNING_FILES = funcs-common.h core-common.h fp-common.h asm-common.h \ + asm.h core.h funcs.h fp.h $(LIGHTNING_TARGET_FILES) if LIGHTNING_MAIN + lightningdir = $(includedir)/lightning dist_pkgdata_DATA = Makefile.am -nobase_dist_lightning_HEADERS = $(LIGHTNING_FILES) -nodist_lightning_HEADERS = asm.h core.h funcs.h fp.h +dist_lightning_HEADERS = $(LIGHTNING_FILES) + else -dist_noinst_HEADERS = $(LIGHTNING_FILES) +all-am: + @set frob $(LIGHTNING_TARGET_FILES); shift; \ + for i; \ + do \ + echo $(LN_S) -f $(srcdir)/$$i `basename $$i`; \ + $(LN_S) -f $(srcdir)/$$i `basename $$i`; \ + done dist-hook: cp -p $(srcdir)/lightning.h $(distdir) diff --git a/lightning/Makefile.in b/lightning/Makefile.in index 426723e89..1338b51b9 100644 --- a/lightning/Makefile.in +++ b/lightning/Makefile.in @@ -39,12 +39,12 @@ build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = lightning -DIST_COMMON = $(am__dist_noinst_HEADERS_DIST) \ - $(am__dist_pkgdata_DATA_DIST) \ - $(am__nobase_dist_lightning_HEADERS_DIST) \ - $(srcdir)/Makefile.am $(srcdir)/Makefile.in +DIST_COMMON = $(am__dist_lightning_HEADERS_DIST) \ + $(am__dist_pkgdata_DATA_DIST) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__aclocal_m4_deps = $(top_srcdir)/build-aux/lightning.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -60,21 +60,13 @@ am__vpath_adj = case $$p in \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(pkgdatadir)" \ - "$(DESTDIR)$(lightningdir)" "$(DESTDIR)$(lightningdir)" + "$(DESTDIR)$(lightningdir)" dist_pkgdataDATA_INSTALL = $(INSTALL_DATA) DATA = $(dist_pkgdata_DATA) -am__dist_noinst_HEADERS_DIST = funcs-common.h core-common.h \ - fp-common.h asm-common.h i386/asm.h i386/core.h i386/funcs.h \ - i386/fp.h sparc/asm.h sparc/core.h sparc/funcs.h sparc/fp.h \ - ppc/asm.h ppc/core.h ppc/funcs.h ppc/fp.h -am__nobase_dist_lightning_HEADERS_DIST = funcs-common.h core-common.h \ - fp-common.h asm-common.h i386/asm.h i386/core.h i386/funcs.h \ - i386/fp.h sparc/asm.h sparc/core.h sparc/funcs.h sparc/fp.h \ - ppc/asm.h ppc/core.h ppc/funcs.h ppc/fp.h -nobase_dist_lightningHEADERS_INSTALL = $(install_sh_DATA) -nodist_lightningHEADERS_INSTALL = $(INSTALL_HEADER) -HEADERS = $(dist_noinst_HEADERS) $(nobase_dist_lightning_HEADERS) \ - $(nodist_lightning_HEADERS) +am__dist_lightning_HEADERS_DIST = funcs-common.h core-common.h \ + fp-common.h asm-common.h asm.h core.h funcs.h fp.h +dist_lightningHEADERS_INSTALL = $(INSTALL_HEADER) +HEADERS = $(dist_lightning_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -144,6 +136,7 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +cpu = @cpu@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ @@ -178,17 +171,20 @@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ DISTCLEANFILES = asm.h core.h funcs.h fp.h -LIGHTNING_FILES = funcs-common.h core-common.h fp-common.h \ - asm-common.h \ - i386/asm.h i386/core.h i386/funcs.h i386/fp.h \ - sparc/asm.h sparc/core.h sparc/funcs.h sparc/fp.h \ - ppc/asm.h ppc/core.h ppc/funcs.h ppc/fp.h +EXTRA_DIST = i386/Makefile.frag \ + i386/asm-32.h i386/asm-64.h i386/asm-i386.h \ + i386/core-32.h i386/core-64.h i386/core-i386.h \ + i386/fp-32.h i386/fp-64.h \ + i386/funcs.h \ + sparc/asm.h sparc/core.h sparc/funcs.h sparc/fp.h \ + ppc/asm.h ppc/core.h ppc/funcs.h ppc/fp.h + +LIGHTNING_FILES = funcs-common.h core-common.h fp-common.h asm-common.h \ + asm.h core.h funcs.h fp.h $(LIGHTNING_TARGET_FILES) @LIGHTNING_MAIN_TRUE@lightningdir = $(includedir)/lightning @LIGHTNING_MAIN_TRUE@dist_pkgdata_DATA = Makefile.am -@LIGHTNING_MAIN_TRUE@nobase_dist_lightning_HEADERS = $(LIGHTNING_FILES) -@LIGHTNING_MAIN_TRUE@nodist_lightning_HEADERS = asm.h core.h funcs.h fp.h -@LIGHTNING_MAIN_FALSE@dist_noinst_HEADERS = $(LIGHTNING_FILES) +@LIGHTNING_MAIN_TRUE@dist_lightning_HEADERS = $(LIGHTNING_FILES) all: all-am .SUFFIXES: @@ -239,38 +235,19 @@ uninstall-dist_pkgdataDATA: echo " rm -f '$(DESTDIR)$(pkgdatadir)/$$f'"; \ rm -f "$(DESTDIR)$(pkgdatadir)/$$f"; \ done -install-nobase_dist_lightningHEADERS: $(nobase_dist_lightning_HEADERS) +install-dist_lightningHEADERS: $(dist_lightning_HEADERS) @$(NORMAL_INSTALL) test -z "$(lightningdir)" || $(mkdir_p) "$(DESTDIR)$(lightningdir)" - @$(am__vpath_adj_setup) \ - list='$(nobase_dist_lightning_HEADERS)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - $(am__vpath_adj) \ - echo " $(nobase_dist_lightningHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(lightningdir)/$$f'"; \ - $(nobase_dist_lightningHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(lightningdir)/$$f"; \ - done - -uninstall-nobase_dist_lightningHEADERS: - @$(NORMAL_UNINSTALL) - @$(am__vpath_adj_setup) \ - list='$(nobase_dist_lightning_HEADERS)'; for p in $$list; do \ - $(am__vpath_adj) \ - echo " rm -f '$(DESTDIR)$(lightningdir)/$$f'"; \ - rm -f "$(DESTDIR)$(lightningdir)/$$f"; \ - done -install-nodist_lightningHEADERS: $(nodist_lightning_HEADERS) - @$(NORMAL_INSTALL) - test -z "$(lightningdir)" || $(mkdir_p) "$(DESTDIR)$(lightningdir)" - @list='$(nodist_lightning_HEADERS)'; for p in $$list; do \ + @list='$(dist_lightning_HEADERS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ - echo " $(nodist_lightningHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(lightningdir)/$$f'"; \ - $(nodist_lightningHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(lightningdir)/$$f"; \ + echo " $(dist_lightningHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(lightningdir)/$$f'"; \ + $(dist_lightningHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(lightningdir)/$$f"; \ done -uninstall-nodist_lightningHEADERS: +uninstall-dist_lightningHEADERS: @$(NORMAL_UNINSTALL) - @list='$(nodist_lightning_HEADERS)'; for p in $$list; do \ + @list='$(dist_lightning_HEADERS)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(lightningdir)/$$f'"; \ rm -f "$(DESTDIR)$(lightningdir)/$$f"; \ @@ -360,7 +337,7 @@ check-am: all-am check: check-am all-am: Makefile $(DATA) $(HEADERS) installdirs: - for dir in "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(lightningdir)" "$(DESTDIR)$(lightningdir)"; do \ + for dir in "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(lightningdir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am @@ -406,9 +383,8 @@ info: info-am info-am: -install-data-am: install-dist_pkgdataDATA \ - install-nobase_dist_lightningHEADERS \ - install-nodist_lightningHEADERS +install-data-am: install-dist_lightningHEADERS \ + install-dist_pkgdataDATA install-exec-am: @@ -434,26 +410,32 @@ ps: ps-am ps-am: -uninstall-am: uninstall-dist_pkgdataDATA uninstall-info-am \ - uninstall-nobase_dist_lightningHEADERS \ - uninstall-nodist_lightningHEADERS +uninstall-am: uninstall-dist_lightningHEADERS \ + uninstall-dist_pkgdataDATA uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ ctags dist-hook distclean distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am \ - install-dist_pkgdataDATA install-exec install-exec-am \ - install-info install-info-am install-man \ - install-nobase_dist_lightningHEADERS \ - install-nodist_lightningHEADERS install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ - pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-dist_pkgdataDATA uninstall-info-am \ - uninstall-nobase_dist_lightningHEADERS \ - uninstall-nodist_lightningHEADERS + install-dist_lightningHEADERS install-dist_pkgdataDATA \ + install-exec install-exec-am install-info install-info-am \ + install-man install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ + uninstall uninstall-am uninstall-dist_lightningHEADERS \ + uninstall-dist_pkgdataDATA uninstall-info-am +@lightning_frag@ + +@LIGHTNING_MAIN_FALSE@all-am: +@LIGHTNING_MAIN_FALSE@ @set frob $(LIGHTNING_TARGET_FILES); shift; \ +@LIGHTNING_MAIN_FALSE@ for i; \ +@LIGHTNING_MAIN_FALSE@ do \ +@LIGHTNING_MAIN_FALSE@ echo $(LN_S) $(srcdir)/$$i `basename $$i`; \ +@LIGHTNING_MAIN_FALSE@ $(LN_S) $(srcdir)/$$i `basename $$i`; \ +@LIGHTNING_MAIN_FALSE@ done + @LIGHTNING_MAIN_FALSE@dist-hook: @LIGHTNING_MAIN_FALSE@ cp -p $(srcdir)/lightning.h $(distdir) # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/lightning/core-common.h b/lightning/core-common.h index d2f1e152b..5ff4d7631 100644 --- a/lightning/core-common.h +++ b/lightning/core-common.h @@ -480,8 +480,12 @@ typedef union jit_code { /* ALU */ #define jit_addi_l(d, rs, is) jit_addi_i((d), (rs), (is)) #define jit_addr_l(d, s1, s2) jit_addr_i((d), (s1), (s2)) +#ifndef jit_addci_l #define jit_addci_l(d, rs, is) jit_addci_i((d), (rs), (is)) +#endif +#ifndef jit_addcr_l #define jit_addcr_l(d, s1, s2) jit_addcr_i((d), (s1), (s2)) +#endif #define jit_addxi_l(d, rs, is) jit_addxi_i((d), (rs), (is)) #define jit_addxr_l(d, s1, s2) jit_addxr_i((d), (s1), (s2)) #define jit_andi_l(d, rs, is) jit_andi_i((d), (rs), (is)) @@ -496,6 +500,9 @@ typedef union jit_code { #define jit_modr_l(d, s1, s2) jit_modr_i((d), (s1), (s2)) #define jit_muli_l(d, rs, is) jit_muli_i((d), (rs), (is)) #define jit_mulr_l(d, s1, s2) jit_mulr_i((d), (s1), (s2)) +#ifndef jit_negr_l +#define jit_negr_l(d, s1) jit_negr_i((d), (s1)) +#endif #define jit_ori_l(d, rs, is) jit_ori_i((d), (rs), (is)) #define jit_orr_l(d, s1, s2) jit_orr_i((d), (s1), (s2)) #define jit_rshi_l(d, rs, is) jit_rshi_i((d), (rs), (is)) diff --git a/lightning/i386/Makefile.frag b/lightning/i386/Makefile.frag new file mode 100644 index 000000000..78a56f817 --- /dev/null +++ b/lightning/i386/Makefile.frag @@ -0,0 +1 @@ +LIGHTNING_TARGET_FILES += i386/asm-i386.h i386/core-i386.h diff --git a/lightning/i386/asm-32.h b/lightning/i386/asm-32.h new file mode 100644 index 000000000..2854a48f3 --- /dev/null +++ b/lightning/i386/asm-32.h @@ -0,0 +1,61 @@ +/******************************** -*- C -*- **************************** + * + * Run-time assembler for the i386 + * + ***********************************************************************/ + + +/*********************************************************************** + * + * Copyright 2006 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 2.1, 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 GNU lightning; see the file COPYING.LESSER; if not, write to the + * Free Software Foundation, 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + ***********************************************************************/ + + + + +#ifndef __lightning_asm_h +#define __lightning_asm_h + +/* OPCODE + i = immediate operand + * + r = register operand + * + m = memory operand (disp,base,index,scale) + * + sr/sm = a star preceding a register or memory + */ + +#include "asm-i386.h" + +#ifndef LIGHTNING_DEBUG + +#define _r_D( R, D ) (_Mrm(_b00,_rN(R),_b101 ) ,_jit_I((long)(D))) + +#define CALLm(D,B,I,S) ((_r0P(B) && _r0P(I)) ? _O_D32 (0xe8 ,(long)(D) ) : \ + JITFAIL("illegal mode in direct jump")) + +#define JCCim(CC,D,B,I,S) ((_r0P(B) && _r0P(I)) ? _OO_D32 (0x0f80|(CC) ,(long)(D) ) : \ + JITFAIL("illegal mode in conditional jump")) + +#define JMPm(D,B,I,S) ((_r0P(B) && _r0P(I)) ? _O_D32 (0xe9 ,(long)(D) ) : \ + JITFAIL("illegal mode in direct jump")) + +#endif +#endif /* __lightning_asm_h */ + + diff --git a/lightning/i386/asm-64.h b/lightning/i386/asm-64.h new file mode 100644 index 000000000..f44f20367 --- /dev/null +++ b/lightning/i386/asm-64.h @@ -0,0 +1,134 @@ +/******************************** -*- C -*- **************************** + * + * Run-time assembler for the x86-64 + * + ***********************************************************************/ + + +/*********************************************************************** + * + * Copyright 2006 Matthew Flatt + * + * 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 2.1, 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 GNU lightning; see the file COPYING.LESSER; if not, write to the + * Free Software Foundation, 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + ***********************************************************************/ + + + + +#ifndef __lightning_asm_h +#define __lightning_asm_h + +#include "asm-i386.h" + +/* OPCODE + i = immediate operand + * + r = register operand + * + m = memory operand (disp,base,index,scale) + * + sr/sm = a star preceding a register or memory + */ + + +#ifndef LIGHTNING_DEBUG +#define _R12 0x4C +#define _R13 0x4D +#define JIT_CALLTMPSTART 0x48 +#define JIT_REXTMP 0x4B + +#define _qMrm(Md,R,M) _jit_B((_M(Md)<<6)|(_r((R & 0x7))<<3)|_m((M & 0x7))) +#define _r_D( R, D ) (_Mrm(_b00,_rN(R),_b100 ),_SIB(0,_b100,_b101) ,_jit_I((long)(D))) +#define _r_Q( R, D ) (_qMrm(_b00,_rN(R),_b100 ),_SIB(0,_b100,_b101) ,_jit_I((long)(D))) + +#define _REX(R,X,B) ( _jit_B(0x48|((R&0x8)>>1)|((X&0x8)>>2)|((B&0x8)>>3)) ) +#define _qO( OP, R,X,B ) ( _REX(R,X,B), _jit_B( OP ) ) +#define _qOr( OP,R ) ( _REX(0,0,R), _jit_B( (OP)|_r(R&0x7)) ) +#define _qOs( OP, B, R, M ) ( _REX(0, M, R), _Os(OP, B) ) + +#define ADDQrr(RS, RD) _qO_Mrm (0x01 ,_b11,_r8(RS),_r8(RD) ) +#define ADDQir(IM, RD) _qOs_Mrm_sL (0x81 ,_b11,_b000 ,_r8(RD) ,IM ) + +#define ANDQrr(RS, RD) _qO_Mrm (0x21 ,_b11,_r8(RS),_r8(RD) ) +#define ANDQir(IM, RD) _qOs_Mrm_sL (0x81 ,_b11,_b100 ,_r8(RD) ,IM ) + +#define CALLm(D,B,I,S) (MOVQir((D), JIT_REXTMP), CALLQsr(JIT_REXTMP)) + +#define CALLsr(R) _O_Mrm (0xff ,_b11,_b010,_r4(R) ) +#define CALLQsr(R) _qO_Mrm (0xff ,_b11,_b010,_r8(R)) + +#define CMPQrr(RS, RD) _qO_Mrm (0x39 ,_b11,_r8(RS),_r8(RD) ) +#define CMPQir(IM, RD) _qO_Mrm_L (0x81 ,_b11,_b111 ,_r8(RD) ,IM ) + +#define JCCim(CC,D,B,I,S) (!_jitl.long_jumps \ + ? _OO_D32(0x0f80|(CC), (long)(D) ) \ + : (_O_D8(0x71^(CC), _jit_UL(_jit.x.pc) + 13), JMPm((long)D, 0, 0, 0))) + +#define JMPm(D,B,I,S) (!_jitl.long_jumps \ + ? _O_D32(0xe9, (long)(D)) \ + : (MOVQir((D), JIT_REXTMP), _qO_Mrm(0xff,_b11,_b100,_r8(JIT_REXTMP)))) + +#define LEAQmr(MD, MB, MI, MS, RD) _qO_r_X (0x8d ,_r8(RD) ,MD,MB,MI,MS ) +#define MOVQmr(MD, MB, MI, MS, RD) _qO_r_X (0x8b ,_r8(RD) ,MD,MB,MI,MS ) +#define MOVQrm(RS, MD, MB, MI, MS) _qO_r_X (0x89 ,_r8(RS) ,MD,MB,MI,MS ) +#define MOVQrQm(RS, MD, MB, MI, MS) _qO_r_XB (0x89 ,_r8(RS) ,MD,MB,MI,MS ) +#define MOVQir(IM, R) _qOr_Q (0xb8,_r8(R) ,IM ) + +#define MOVQrr(RS, RD) _qO_Mrm (0x89 ,_b11,_r8(RS),_r8(RD) ) + +#define NEGQr(RD) _qO_Mrm (0xf7 ,_b11,_b011 ,_r8(RD) ) + +#define ORQrr(RS, RD) _qO_Mrm (0x09 ,_b11,_r8(RS),_r8(RD) ) +#define ORQir(IM, RD) _qOs_Mrm_sL (0x81 ,_b11,_b001 ,_r8(RD) ,IM ) + +#define POPQr(RD) _qOr (0x58,_r8(RD) ) + +#define PUSHQr(R) _qOr (0x50,_r8(R) ) +#define SALQir SHLQir +#define SALQim SHLQim +#define SALQrr SHLQrr +#define SALQrm SHLQrm + +#define SARQir(IM,RD) (((IM)==1) ? _qO_Mrm (0xd1 ,_b11,_b111,_r8(RD) ) : \ + _qO_Mrm_B (0xc1 ,_b11,_b111,_r4(RD) ,_u8(IM) ) ) +#define SARQrr(RS,RD) (((RS)==_CL) ? _qO_Mrm (0xd3 ,_b11,_b111,_r8(RD) ) : \ + JITFAIL ("source register must be CL" ) ) + + +#define SHLQir(IM,RD) (((IM)==1) ? _qO_Mrm (0xd1 ,_b11,_b100,_r8(RD) ) : \ + _qO_Mrm_B (0xc1 ,_b11,_b100,_r8(RD) ,_u8(IM) ) ) +#define SHLQrr(RS,RD) (((RS)==_CL) ? _qO_Mrm (0xd3 ,_b11,_b100,_r8(RD) ) : \ + JITFAIL ("source register must be CL" ) ) + + +#define SHRQir(IM,RD) (((IM)==1) ? _qO_Mrm (0xd1 ,_b11,_b101,_r8(RD) ) : \ + _qO_Mrm_B (0xc1 ,_b11,_b101,_r8(RD) ,_u8(IM) ) ) +#define SHRQrr(RS,RD) (((RS)==_CL) ? _qO_Mrm (0xd3 ,_b11,_b101,_r8(RD) ) : \ + JITFAIL ("source register must be CL" ) ) + + +#define SUBQrr(RS, RD) _qO_Mrm (0x29 ,_b11,_r8(RS),_r8(RD) ) +#define SUBQir(IM, RD) _qOs_Mrm_sL (0x81 ,_b11,_b101 ,_r8(RD) ,IM ) + +#define TESTQrr(RS, RD) _qO_Mrm (0x85 ,_b11,_r8(RS),_r8(RD) ) +#define TESTQir(IM, RD) _qO_Mrm_L (0xf7 ,_b11,_b000 ,_r8(RD) ,IM ) + +#define XORQrr(RS, RD) _qO_Mrm (0x31 ,_b11,_r8(RS),_r8(RD) ) +#define XORQir(IM, RD) _qOs_Mrm_sL (0x81 ,_b11,_b110 ,_r8(RD) ,IM ) + +#endif +#endif /* __lightning_asm_h */ + + diff --git a/lightning/i386/asm.h b/lightning/i386/asm-i386.h similarity index 98% rename from lightning/i386/asm.h rename to lightning/i386/asm-i386.h index 8a9c58180..9bcf4ce1f 100644 --- a/lightning/i386/asm.h +++ b/lightning/i386/asm-i386.h @@ -31,8 +31,8 @@ -#ifndef __lightning_asm_h -#define __lightning_asm_h +#ifndef __lightning_asm_i386_h +#define __lightning_asm_i386_h /* OPCODE + i = immediate operand * + r = register operand @@ -147,7 +147,6 @@ typedef _uc jit_insn; /* memory subformats - urgh! */ -#define _r_D( R, D ) (_Mrm(_b00,_rN(R),_b101 ) ,_jit_L((long)(D))) #define _r_0B( R, B ) (_Mrm(_b00,_rN(R),_r4(B)) ) #define _r_0BIS(R, B,I,S) (_Mrm(_b00,_rN(R),_b100 ),_SIB(_SCL(S),_r4(I),_r4(B)) ) #define _r_1B( R, D,B ) (_Mrm(_b01,_rN(R),_r4(B)) ,_jit_B((long)(D))) @@ -334,9 +333,6 @@ typedef _uc jit_insn; #define BTSLrm(RS,MD,MB,MI,MS) _OO_r_X (0x0fab ,_r4(RS) ,MD,MB,MI,MS ) -#define CALLm(D,B,I,S) ((_r0P(B) && _r0P(I)) ? _O_D32 (0xe8 ,(int)(D) ) : \ - JITFAIL("illegal mode in direct jump")) - #define CALLsr(R) _O_Mrm (0xff ,_b11,_b010,_r4(R) ) #define CALLsm(D,B,I,S) _O_r_X (0xff ,_b010 ,(int)(D),B,I,S ) @@ -482,9 +478,6 @@ typedef _uc jit_insn; #define JNLESm(D,B,I,S) JCCSim(0xf,D,B,I,S) #define JGSm(D,B,I,S) JCCSim(0xf,D,B,I,S) -#define JCCim(CC,D,B,I,S) ((_r0P(B) && _r0P(I)) ? _OO_D32 (0x0f80|(CC) ,(int)(D) ) : \ - JITFAIL("illegal mode in conditional jump")) - #define JOm(D,B,I,S) JCCim(0x0,D,B,I,S) #define JNOm(D,B,I,S) JCCim(0x1,D,B,I,S) #define JCm(D,B,I,S) JCCim(0x2,D,B,I,S) @@ -520,9 +513,6 @@ typedef _uc jit_insn; #define JMPSm(D,B,I,S) ((_r0P(B) && _r0P(I)) ? _O_D8 (0xeb ,(int)(D) ) : \ JITFAIL("illegal mode in short jump")) -#define JMPm(D,B,I,S) ((_r0P(B) && _r0P(I)) ? _O_D32 (0xe9 ,(int)(D) ) : \ - JITFAIL("illegal mode in direct jump")) - #define JMPsr(R) _O_Mrm (0xff ,_b11,_b100,_r4(R) ) #define JMPsm(D,B,I,S) _O_r_X (0xff ,_b100 ,(int)(D),B,I,S ) @@ -1062,5 +1052,5 @@ typedef _uc jit_insn; /* Intel Corporation 1997. */ #endif -#endif /* __lightning_asm_h */ +#endif /* __lightning_asm_i386_h */ diff --git a/lightning/i386/core-32.h b/lightning/i386/core-32.h new file mode 100644 index 000000000..d68f8f618 --- /dev/null +++ b/lightning/i386/core-32.h @@ -0,0 +1,80 @@ +/******************************** -*- C -*- **************************** + * + * Platform-independent layer (i386 version) + * + ***********************************************************************/ + + +/*********************************************************************** + * + * Copyright 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + * Written by Paolo Bonzini. + * + * 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 2.1, 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 GNU lightning; see the file COPYING.LESSER; if not, write to the + * Free Software Foundation, 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + ***********************************************************************/ + + + +#ifndef __lightning_core_h +#define __lightning_core_h + +#include "core-i386.h" + +#define JIT_CAN_16 1 + +struct jit_local_state { + int framesize; + int argssize; +}; + +#define jit_base_prolog() (PUSHLr(_EBP), MOVLrr(_ESP, _EBP), PUSHLr(_EBX), PUSHLr(_ESI), PUSHLr(_EDI)) +#define jit_prolog(n) (_jitl.framesize = 8, jit_base_prolog()) + +/* The += allows for stack pollution */ + +#ifdef __APPLE__ + /* Stack must stay 16-byte aligned: */ +# define jit_prepare_i(ni) (((ni & 0x3) \ + ? SUBLir(4 * ((((ni) + 3) & ~(0x3)) - (ni)), JIT_SP) \ + : (void)0), \ + _jitl.argssize += (((ni) + 3) & ~(0x3))) +#else +# define jit_prepare_i(ni) (_jitl.argssize += (ni)) +#endif + +#define jit_pusharg_i(rs) PUSHLr(rs) +#define jit_finish(sub) ((void)jit_calli((sub)), ADDLir(sizeof(long) * _jitl.argssize, JIT_SP), _jitl.argssize = 0) +#define jit_finishr(reg) (jit_callr((reg)), ADDLir(sizeof(long) * _jitl.argssize, JIT_SP), _jitl.argssize = 0) + +#define jit_arg_c() ((_jitl.framesize += sizeof(int)) - sizeof(int)) +#define jit_arg_uc() ((_jitl.framesize += sizeof(int)) - sizeof(int)) +#define jit_arg_s() ((_jitl.framesize += sizeof(int)) - sizeof(int)) +#define jit_arg_us() ((_jitl.framesize += sizeof(int)) - sizeof(int)) +#define jit_arg_i() ((_jitl.framesize += sizeof(int)) - sizeof(int)) +#define jit_arg_ui() ((_jitl.framesize += sizeof(int)) - sizeof(int)) +#define jit_arg_l() ((_jitl.framesize += sizeof(long)) - sizeof(long)) +#define jit_arg_ul() ((_jitl.framesize += sizeof(long)) - sizeof(long)) +#define jit_arg_p() ((_jitl.framesize += sizeof(long)) - sizeof(long)) + +#define jit_patch_long_at(jump_pc,v) (*_PSL((jump_pc) - sizeof(long)) = _jit_SL((jit_insn *)(v) - (jump_pc))) +#define jit_patch_at(jump_pc,v) jit_patch_long_at(jump_pc, v) +#define jit_ret() (POPLr(_EDI), POPLr(_ESI), POPLr(_EBX), POPLr(_EBP), RET_()) + +#endif /* __lightning_core_h */ + diff --git a/lightning/i386/core-64.h b/lightning/i386/core-64.h new file mode 100644 index 000000000..7680d1825 --- /dev/null +++ b/lightning/i386/core-64.h @@ -0,0 +1,202 @@ +/******************************** -*- C -*- **************************** + * + * Platform-independent layer (i386 version) + * + ***********************************************************************/ + + +/*********************************************************************** + * + * Copyright 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + * Written by Paolo Bonzini. + * + * 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 2.1, 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 GNU lightning; see the file COPYING.LESSER; if not, write to the + * Free Software Foundation, 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + ***********************************************************************/ + + + +#ifndef __lightning_core_h +#define __lightning_core_h + +#include "core-i386.h" + +struct jit_local_state { + int long_jumps; + int nextarg_geti; + int argssize; +}; + +/* 3-parameter operation */ +#define jit_qopr_(d, s1, s2, op1d, op2d) \ + ( (s2 == d) ? op1d : \ + ( ((s1 == d) ? (void)0 : (void)MOVQrr(s1, d)), op2d ) \ + ) + +/* 3-parameter operation, with immediate */ +#define jit_qop_(d, s1, op2d) \ + +#define jit_bra_qr(s1, s2, op) (CMPQrr(s2, s1), op, _jit.x.pc) +#define _jit_bra_l(rs, is, op) (CMPQir(is, rs), op, _jit.x.pc) + +#define jit_bra_l(rs, is, op) (_s32P((long)(is)) \ + ? _jit_bra_l(rs, is, op) \ + : (jit_movi_l(JIT_REXTMP, is), jit_bra_qr(JIT_REXTMP, rs, op))) + +/* When CMP with 0 can be replaced with TEST */ +#define jit_bra_l0(rs, is, op, op0) \ + ( (is) == 0 ? (TESTQrr(rs, rs), op0, _jit.x.pc) : jit_bra_l(rs, is, op)) + +/* Used to implement ldc, stc, ... */ +#define JIT_CAN_16 0 + +#define jit_reduceQ(op, is, rs) \ + (_u8P(is) && jit_check8(rs) ? jit_reduce_(op##Bir(is, jit_reg8(rs))) : \ + jit_reduce_(op##Qir(is, rs)) ) + +#define jit_addi_l(d, rs, is) jit_opi_((d), (rs), ADDQir((is), (d)), LEAQmr((is), (rs), 0, 0, (d)) ) +#define jit_addr_l(d, s1, s2) jit_opo_((d), (s1), (s2), ADDQrr((s2), (d)), ADDQrr((s1), (d)), LEAQmr(0, (s1), (s2), 1, (d)) ) +#define jit_andi_l(d, rs, is) jit_qop_ ((d), (rs), ANDQir((is), (d)) ) +#define jit_andr_l(d, s1, s2) jit_qopr_((d), (s1), (s2), ANDQrr((s1), (d)), ANDQrr((s2), (d)) ) +#define jit_orr_l(d, s1, s2) jit_qopr_((d), (s1), (s2), ORQrr((s1), (d)), ORQrr((s2), (d)) ) +#define jit_subr_l(d, s1, s2) jit_qopr_((d), (s1), (s2), (SUBQrr((s1), (d)), NEGQr(d)), SUBQrr((s2), (d)) ) +#define jit_xorr_l(d, s1, s2) jit_qopr_((d), (s1), (s2), XORQrr((s1), (d)), XORQrr((s2), (d)) ) + +/* These can sometimes use byte or word versions! */ +#define jit_ori_i(d, rs, is) jit_op_ ((d), (rs), jit_reduce(OR, (is), (d)) ) +#define jit_xori_i(d, rs, is) jit_op_ ((d), (rs), jit_reduce(XOR, (is), (d)) ) +#define jit_ori_l(d, rs, is) jit_qop_ ((d), (rs), jit_reduceQ(OR, (is), (d)) ) +#define jit_xori_l(d, rs, is) jit_qop_ ((d), (rs), jit_reduceQ(XOR, (is), (d)) ) + +#define jit_lshi_l(d, rs, is) ((is) <= 3 ? LEAQmr(0, 0, (rs), 1 << (is), (d)) : jit_qop_ ((d), (rs), SHLQir((is), (d)) )) +#define jit_rshi_l(d, rs, is) jit_qop_ ((d), (rs), SARQir((is), (d)) ) +#define jit_rshi_ul(d, rs, is) jit_qop_ ((d), (rs), SHRQir((is), (d)) ) +#define jit_lshr_l(d, r1, r2) jit_replace((r1), (r2), _ECX, jit_qop_ ((d), (r1), SHLQrr(_CL, (d)) )) +#define jit_rshr_l(d, r1, r2) jit_replace((r1), (r2), _ECX, jit_qop_ ((d), (r1), SARQrr(_CL, (d)) )) +#define jit_rshr_ul(d, r1, r2) jit_replace((r1), (r2), _ECX, jit_qop_ ((d), (r1), SHRQrr(_CL, (d)) )) + +/* Stack */ +#define jit_pushr_l(rs) PUSHQr(rs) +#define jit_popr_l(rs) POPQr(rs) + +#define jit_base_prolog() (PUSHQr(_EBP), MOVQrr(_ESP, _EBP), PUSHQr(_EBX), PUSHQr(_R12), PUSHQr(_R13)) +#define jit_prolog(n) (_jitl.nextarg_geti = 0, jit_base_prolog()) + +/* Stack isn't used for arguments: */ +#define jit_prepare_i(ni) (_jitl.argssize = 0) + +#define jit_pusharg_i(rs) (_jitl.argssize++, MOVQrr(rs, JIT_CALLTMPSTART + _jitl.argssize - 1)) +#define jit_finish(sub) (jit_shift_args(), (void)jit_calli((sub)), jit_restore_locals()) +#define jit_reg_is_arg(reg) ((reg == _EDI) || (reg ==_ESI) || (reg == _EDX)) +#define jit_finishr(reg) ((jit_reg_is_arg((reg)) ? MOVQrr(reg, JIT_REXTMP) : (void)0), \ + jit_shift_args(), \ + jit_reg_is_arg((reg)) ? CALQsr((JIT_REXTMP)) : jit_callr((reg)), \ + jit_restore_locals()) + +/* R12 and R13 are callee-save, instead of EDI and ESI. Can be improved. */ +#define jit_shift_args() \ + (MOVQrr(_ESI, _R12), MOVQrr(_EDI, _R13), \ + (_jitl.argssize-- \ + ? (MOVQrr(JIT_CALLTMPSTART + _jitl.argssize, jit_arg_reg_order[0]), \ + (_jitl.argssize-- \ + ? (MOVQrr(JIT_CALLTMPSTART + _jitl.argssize, jit_arg_reg_order[1]), \ + (_jitl.argssize-- \ + ? MOVQrr(JIT_CALLTMPSTART, jit_arg_reg_order[2]) \ + : (void)0)) \ + : (void)0)) \ + : (void)0)) + +#define jit_restore_locals() \ + (MOVQrr(_R12, _ESI), MOVQrr(_R13, _EDI)) + +#define jit_retval_l(rd) ((void)jit_movr_l ((rd), _EAX)) +#define jit_arg_i() (_jitl.nextarg_geti++) +#define jit_arg_l() (_jitl.nextarg_geti++) +#define jit_arg_p() (_jitl.nextarg_geti++) +#define jit_arg_reg(p) (jit_arg_reg_order[p]) +static int jit_arg_reg_order[] = { _EDI, _ESI, _EDX, _ECX }; + +#define jit_negr_l(d, rs) jit_opi_((d), (rs), NEGQr(d), (XORQrr((d), (d)), SUBQrr((rs), (d))) ) +#define jit_movr_l(d, rs) ((void)((rs) == (d) ? 0 : MOVQrr((rs), (d)))) +#define jit_movi_l(d, is) ((is) \ + ? (_u32P((long)(is)) \ + ? MOVLir((is), (d)) \ + : MOVQir((is), (d))) \ + : XORLrr ((d), (d)) ) + +#define jit_bmsr_l(label, s1, s2) (TESTQrr((s1), (s2)), JNZm(label,0,0,0), _jit.x.pc) +#define jit_bmcr_l(label, s1, s2) (TESTQrr((s1), (s2)), JZm(label,0,0,0), _jit.x.pc) +#define jit_boaddr_l(label, s1, s2) (ADDQrr((s2), (s1)), JOm(label,0,0,0), _jit.x.pc) +#define jit_bosubr_l(label, s1, s2) (SUBQrr((s2), (s1)), JOm(label,0,0,0), _jit.x.pc) +#define jit_boaddr_ul(label, s1, s2) (ADDQrr((s2), (s1)), JCm(label,0,0,0), _jit.x.pc) +#define jit_bosubr_ul(label, s1, s2) (SUBQrr((s2), (s1)), JCm(label,0,0,0), _jit.x.pc) + +#define jit_boaddi_l(label, rs, is) (ADDQir((is), (rs)), JOm(label,0,0,0), _jit.x.pc) +#define jit_bosubi_l(label, rs, is) (SUBQir((is), (rs)), JOm(label,0,0,0), _jit.x.pc) +#define jit_boaddi_ul(label, rs, is) (ADDQir((is), (rs)), JCm(label,0,0,0), _jit.x.pc) +#define jit_bosubi_ul(label, rs, is) (SUBQir((is), (rs)), JCm(label,0,0,0), _jit.x.pc) + +#define jit_patch_long_at(jump_pc,v) (*_PSL((jump_pc) - sizeof(long)) = _jit_SL((jit_insn *)(v))) +#define jit_patch_short_at(jump_pc,v) (*_PSI((jump_pc) - sizeof(int)) = _jit_SI((jit_insn *)(v) - (jump_pc))) +#define jit_patch_at(jump_pc,v) (_jitl.long_jumps ? jit_patch_long_at((jump_pc)-3, v) : jit_patch_short_at(jump_pc, v)) +#define jit_ret() (POPQr(_R13), POPQr(_R12), POPQr(_EBX), POPQr(_EBP), RET_()) + +#define _jit_ldi_l(d, is) MOVQmr((is), 0, 0, 0, (d)) +#define jit_ldr_l(d, rs) MOVQmr(0, (rs), 0, 0, (d)) +#define jit_ldxr_l(d, s1, s2) MOVQmr(0, (s1), (s2), 1, (d)) +#define jit_ldxi_l(d, rs, is) MOVQmr((is), (rs), 0, 0, (d)) + +#define _jit_sti_l(id, rs) MOVQrm((rs), (id), 0, 0, 0) +#define jit_str_l(rd, rs) MOVQrm((rs), 0, (rd), 0, 0) +#define jit_stxr_l(d1, d2, rs) MOVQrm((rs), 0, (d1), (d2), 1) +#define jit_stxi_l(id, rd, rs) MOVQrm((rs), (id), (rd), 0, 0) + +#define jit_ldi_l(d, is) (_u32P((long)(is)) ? _jit_ldi_l(d, is) : (jit_movi_l(d, is), jit_ldr_l(d, d))) +#define jit_sti_l(id, rs) (_u32P((long)(id)) ? _jit_sti_l(id, rs) : (jit_movi_l(JIT_REXTMP, id), MOVQrQm(rs, 0, JIT_REXTMP, 0, 0))) + +#define jit_blti_l(label, rs, is) jit_bra_l0((rs), (is), JLm(label, 0,0,0), JSm(label, 0,0,0) ) +#define jit_blei_l(label, rs, is) jit_bra_l ((rs), (is), JLEm(label,0,0,0) ) +#define jit_bgti_l(label, rs, is) jit_bra_l ((rs), (is), JGm(label, 0,0,0) ) +#define jit_bgei_l(label, rs, is) jit_bra_l0((rs), (is), JGEm(label,0,0,0), JNSm(label,0,0,0) ) +#define jit_beqi_l(label, rs, is) jit_bra_l0((rs), (is), JEm(label, 0,0,0), JEm(label, 0,0,0) ) +#define jit_bnei_l(label, rs, is) jit_bra_l0((rs), (is), JNEm(label,0,0,0), JNEm(label,0,0,0) ) +#define jit_blti_ul(label, rs, is) jit_bra_l ((rs), (is), JBm(label, 0,0,0) ) +#define jit_blei_ul(label, rs, is) jit_bra_l0((rs), (is), JBEm(label,0,0,0), JEm(label, 0,0,0) ) +#define jit_bgti_ul(label, rs, is) jit_bra_l0((rs), (is), JAm(label, 0,0,0), JNEm(label,0,0,0) ) +#define jit_bgei_ul(label, rs, is) jit_bra_l ((rs), (is), JAEm(label,0,0,0) ) +#define jit_bmsi_l(label, rs, is) jit_bmsi_i(label, rs, is) +#define jit_bmci_l(label, rs, is) jit_bmci_i(label, rs, is) + +#define jit_pushr_l(rs) jit_pushr_i(rs) +#define jit_popr_l(rs) jit_popr_i(rs) + +#define jit_pusharg_l(rs) jit_pusharg_i(rs) +#define jit_retval_l(rd) ((void)jit_movr_l ((rd), _EAX)) +#define jit_bltr_l(label, s1, s2) jit_bra_qr((s1), (s2), JLm(label, 0,0,0) ) +#define jit_bler_l(label, s1, s2) jit_bra_qr((s1), (s2), JLEm(label,0,0,0) ) +#define jit_bgtr_l(label, s1, s2) jit_bra_qr((s1), (s2), JGm(label, 0,0,0) ) +#define jit_bger_l(label, s1, s2) jit_bra_qr((s1), (s2), JGEm(label,0,0,0) ) +#define jit_beqr_l(label, s1, s2) jit_bra_qr((s1), (s2), JEm(label, 0,0,0) ) +#define jit_bner_l(label, s1, s2) jit_bra_qr((s1), (s2), JNEm(label,0,0,0) ) +#define jit_bltr_ul(label, s1, s2) jit_bra_qr((s1), (s2), JBm(label, 0,0,0) ) +#define jit_bler_ul(label, s1, s2) jit_bra_qr((s1), (s2), JBEm(label,0,0,0) ) +#define jit_bgtr_ul(label, s1, s2) jit_bra_qr((s1), (s2), JAm(label, 0,0,0) ) +#define jit_bger_ul(label, s1, s2) jit_bra_qr((s1), (s2), JAEm(label,0,0,0) ) + +#endif /* __lightning_core_h */ + diff --git a/lightning/i386/core.h b/lightning/i386/core-i386.h similarity index 90% rename from lightning/i386/core.h rename to lightning/i386/core-i386.h index 0517db19d..2540b8431 100644 --- a/lightning/i386/core.h +++ b/lightning/i386/core-i386.h @@ -16,23 +16,23 @@ * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2.1, or (at your option) * any later version. - * - * GNU lightning is distributed in the hope that it will be useful, but + * + * 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 GNU lightning; see the file COPYING.LESSER; if not, write to the - * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301, USA. + * Free Software Foundation, 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. * ***********************************************************************/ -#ifndef __lightning_core_h -#define __lightning_core_h +#ifndef __lightning_core_i386_h +#define __lightning_core_i386_h #define JIT_FP _EBP #define JIT_SP _ESP @@ -43,10 +43,6 @@ #define JIT_R(i) (_EAX + (i)) #define JIT_V(i) ((i) == 0 ? _EBX : _ESI + (i) - 1) -struct jit_local_state { - int framesize; - int argssize; -}; /* 3-parameter operation */ #define jit_opr_(d, s1, s2, op1d, op2d) \ @@ -56,7 +52,7 @@ struct jit_local_state { /* 3-parameter operation, with immediate */ #define jit_op_(d, s1, op2d) \ - ((s1 == d) ? op2d : (MOVLrr(s1, d), op2d)) \ + ((s1 == d) ? op2d : (MOVLrr(s1, d), op2d)) /* 3-parameter operation, optimizable */ #define jit_opo_(d, s1, s2, op1d, op2d, op12d) \ @@ -110,10 +106,15 @@ struct jit_local_state { : jit_replace(_EBX, rs, _EAX, MOVBrm(_AL, dd, db, di, ds))) /* Reduce arguments of XOR/OR/TEST */ +#ifdef JIT_X86_64 +# define JIT_CAN_16 0 +#else +# define JIT_CAN_16 1 +#endif #define jit_reduce_(op) op #define jit_reduce(op, is, rs) \ (_u8P(is) && jit_check8(rs) ? jit_reduce_(op##Bir(is, jit_reg8(rs))) : \ - (_u16P(is) ? jit_reduce_(op##Wir(is, jit_reg16(rs))) : \ + (_u16P(is) && JIT_CAN_16 ? jit_reduce_(op##Wir(is, jit_reg16(rs))) : \ jit_reduce_(op##Lir(is, rs)) )) /* Helper macros for MUL/DIV/IDIV */ @@ -207,6 +208,7 @@ struct jit_local_state { #define jit_subxi_i(d, rs, is) jit_op_ ((d), (rs), SBBLir((is), (d)) ) #define jit_xorr_i(d, s1, s2) jit_opr_((d), (s1), (s2), XORLrr((s1), (d)), XORLrr((s2), (d)) ) + /* These can sometimes use byte or word versions! */ #define jit_ori_i(d, rs, is) jit_op_ ((d), (rs), jit_reduce(OR, (is), (d)) ) #define jit_xori_i(d, rs, is) jit_op_ ((d), (rs), jit_reduce(XOR, (is), (d)) ) @@ -260,39 +262,21 @@ struct jit_local_state { /* Stack */ #define jit_pushr_i(rs) PUSHLr(rs) #define jit_popr_i(rs) POPLr(rs) -#define jit_prolog(n) (_jitl.framesize = 8, PUSHLr(_EBP), MOVLrr(_ESP, _EBP), PUSHLr(_EBX), PUSHLr(_ESI), PUSHLr(_EDI)) -/* The += allows for stack pollution */ - -#define jit_prepare_i(ni) (_jitl.argssize += (ni)) #define jit_prepare_f(nf) (_jitl.argssize += (nf)) #define jit_prepare_d(nd) (_jitl.argssize += 2 * (nd)) -#define jit_pusharg_i(rs) PUSHLr(rs) -#define jit_finish(sub) (jit_calli((sub)), ADDLir(4 * _jitl.argssize, JIT_SP), _jitl.argssize = 0) -#define jit_finishr(reg) (jit_callr((reg)), ADDLir(4 * _jitl.argssize, JIT_SP), _jitl.argssize = 0) -#define jit_retval_i(rd) jit_movr_i ((rd), _EAX) - -#define jit_arg_c() ((_jitl.framesize += sizeof(int)) - sizeof(int)) -#define jit_arg_uc() ((_jitl.framesize += sizeof(int)) - sizeof(int)) -#define jit_arg_s() ((_jitl.framesize += sizeof(int)) - sizeof(int)) -#define jit_arg_us() ((_jitl.framesize += sizeof(int)) - sizeof(int)) -#define jit_arg_i() ((_jitl.framesize += sizeof(int)) - sizeof(int)) -#define jit_arg_ui() ((_jitl.framesize += sizeof(int)) - sizeof(int)) -#define jit_arg_l() ((_jitl.framesize += sizeof(long)) - sizeof(long)) -#define jit_arg_ul() ((_jitl.framesize += sizeof(long)) - sizeof(long)) -#define jit_arg_p() ((_jitl.framesize += sizeof(long)) - sizeof(long)) +#define jit_retval_i(rd) ((void)jit_movr_i ((rd), _EAX)) #define jit_arg_f() ((_jitl.framesize += sizeof(float)) - sizeof(float)) #define jit_arg_d() ((_jitl.framesize += sizeof(double)) - sizeof(double)) /* Unary */ #define jit_negr_i(d, rs) jit_opi_((d), (rs), NEGLr(d), (XORLrr((d), (d)), SUBLrr((rs), (d))) ) -#define jit_negr_l(d, rs) jit_opi_((d), (rs), NEGLr(d), (XORLrr((d), (d)), SUBLrr((rs), (d))) ) -#define jit_movr_i(d, rs) ((rs) == (d) ? 0 : MOVLrr((rs), (d))) +#define jit_movr_i(d, rs) ((void)((rs) == (d) ? 0 : MOVLrr((rs), (d)))) #define jit_movi_i(d, is) ((is) ? MOVLir((is), (d)) : XORLrr ((d), (d)) ) -#define jit_movi_p(d, is) (MOVLir((is), (d)), _jit.x.pc) -#define jit_patch_movi(pa,pv) (*_PSL((pa) - 4) = _jit_SL((pv))) +#define jit_movi_p(d, is) (jit_movi_l(d, ((long)(is))), _jit.x.pc) +#define jit_patch_movi(pa,pv) (*_PSL((pa) - sizeof(long)) = _jit_SL((pv))) #define jit_ntoh_ui(d, rs) jit_op_((d), (rs), BSWAPLr(d)) #define jit_ntoh_us(d, rs) jit_op_((d), (rs), RORWir(8, d)) @@ -360,8 +344,6 @@ struct jit_local_state { #define jit_calli(label) (CALLm( ((unsigned long) (label)), 0, 0, 0), _jit.x.pc) #define jit_callr(reg) (CALLsr(reg)) #define jit_jmpr(reg) JMPsr(reg) -#define jit_patch_at(jump_pc,v) (*_PSL((jump_pc) - 4) = _jit_SL((v) - (jump_pc))) -#define jit_ret() (POPLr(_EDI), POPLr(_ESI), POPLr(_EBX), POPLr(_EBP), RET_()) /* Memory */ #define jit_ldi_c(d, is) MOVSBLmr((is), 0, 0, 0, (d)) @@ -404,10 +386,12 @@ struct jit_local_state { #define jit_stxr_i(d1, d2, rs) MOVLrm((rs), 0, (d1), (d2), 1) #define jit_stxi_i(id, rd, rs) MOVLrm((rs), (id), (rd), 0, 0) + /* Extra */ #define jit_nop() NOP_() #define _jit_alignment(pc, n) (((pc ^ _MASK(4)) + 1) & _MASK(n)) #define jit_align(n) NOPi(_jit_alignment(_jit_UL(_jit.x.pc), (n))) -#endif /* __lightning_core_h */ +#endif /* __lightning_core_i386_h */ + diff --git a/lightning/i386/fp.h b/lightning/i386/fp-32.h similarity index 99% rename from lightning/i386/fp.h rename to lightning/i386/fp-32.h index c8e47fe0f..8e65a871e 100644 --- a/lightning/i386/fp.h +++ b/lightning/i386/fp-32.h @@ -84,8 +84,8 @@ FST ST3 move FPR3 to FPR1 - FLD ST1 - FST ST4 Stack is rotated, so FPRn becomes STn+1 */ + FLD ST3 + FST ST2 Stack is rotated, so FPRn becomes STn+1 */ #define jit_movr_d(rd,s1) \ ((s1) == (rd) ? 0 \ diff --git a/lightning/i386/fp-64.h b/lightning/i386/fp-64.h new file mode 100644 index 000000000..b5b2cd305 --- /dev/null +++ b/lightning/i386/fp-64.h @@ -0,0 +1,38 @@ +/******************************** -*- C -*- **************************** + * + * Run-time assembler & support macros for the i386 math coprocessor + * + ***********************************************************************/ + + +/*********************************************************************** + * + * Copyright 2000, 2001, 2002, 2004 Free Software Foundation, Inc. + * Written by Paolo Bonzini. + * + * 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 2.1, 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 GNU lightning; see the file COPYING.LESSER; if not, write to the + * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + * + ***********************************************************************/ + + +#ifndef __lightning_fp_h +#define __lightning_fp_h + +#warning SSE math not yet supported + +#endif /* __lightning_fp_h */ diff --git a/lightning/ppc/funcs.h b/lightning/ppc/funcs.h index 6f04606f1..90d84d23f 100644 --- a/lightning/ppc/funcs.h +++ b/lightning/ppc/funcs.h @@ -34,6 +34,8 @@ #ifndef __lightning_funcs_h #define __lightning_funcs_h +#include + #if !defined(__GNUC__) && !defined(__GNUG__) #error Go get GNU C, I do not know how to flush the cache #error with this compiler. @@ -97,7 +99,7 @@ _jit_epilog(jit_state *jit) frame_size += 15; /* the stack must be quad-word */ frame_size &= ~15; /* aligned */ -#ifdef _CALL_DARWIN +#ifdef __APPLE__ LWZrm(0, frame_size + 8, 1); /* lwz r0, x+8(r1) (ret.addr.) */ #else LWZrm(0, frame_size + 4, 1); /* lwz r0, x+4(r1) (ret.addr.) */ @@ -150,7 +152,7 @@ _jit_prolog(jit_state *jit, int n) ofs = frame_size - num_saved_regs * 4; STMWrm(first_saved_reg, ofs, 1); /* stmw rI, ofs(r1) */ -#ifdef _CALL_DARWIN +#ifdef __APPLE__ STWrm(0, frame_size + 8, 1); /* stw r0, x+8(r1) */ #else STWrm(0, frame_size + 4, 1); /* stw r0, x+4(r1) */ diff --git a/lightningize.in b/lightningize.in index ef9b07ccb..ed8491bfe 100644 --- a/lightningize.in +++ b/lightningize.in @@ -33,10 +33,9 @@ VERSION=@VERSION@ # Directory names. prefix=@prefix@ +datarootdir=@datarootdir@ datadir=@datadir@ includedir=@includedir@ -pkgdatadir=${datadir}/lightning -pkgincludedir=${includedir}/lightning aclocaldir=${datadir}/aclocal BACKENDS="@BACKENDS@" @@ -136,8 +135,13 @@ else exit 1 fi +if test "$automake" = yes; then + if egrep "^$macro_name" $configure_ac >/dev/null 2>&1; then : + else + echo "Remember to add \`$macro_name' to \`$configure_ac' and reconfigure your package." + fi -if test -z "$automake"; then +else if egrep "^$macro_name" $configure_ac >/dev/null 2>&1; then : else echo "Remember to add \`$macro_name' to \`$configure_ac'." @@ -186,9 +190,11 @@ for i in $file_base_names; do files="$files lightning:$pkgincludedir/$i-common.h" done for j in $BACKENDS; do - dirs="$dirs lightning/$j" + dir=`expr $j : '\([^:]*\)' ` + suffix=`expr $j : '.*:\(.*\)' ` + dirs="$dirs lightning/$dir" for i in $file_base_names; do - files="$files lightning/$j:$pkgincludedir/$j/$i.h" + files="$files lightning/$j:$pkgincludedir/$j/$i$suffix.h" done done diff --git a/opcode/Makefile.in b/opcode/Makefile.in index 7d2de360f..722a6e30a 100644 --- a/opcode/Makefile.in +++ b/opcode/Makefile.in @@ -42,7 +42,8 @@ subdir = opcode DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__aclocal_m4_deps = $(top_srcdir)/build-aux/lightning.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -136,6 +137,7 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +cpu = @cpu@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ diff --git a/opcode/disass.c b/opcode/disass.c index 8ae9533c8..1983a7a0f 100644 --- a/opcode/disass.c +++ b/opcode/disass.c @@ -34,6 +34,11 @@ #include "config.h" #include "dis-asm.h" +#define LIGHTNING_I386_32 0 +#define LIGHTNING_I386_64 1 +#define LIGHTNING_PPC 2 +#define LIGHTNING_SPARC 3 + void disassemble(stream, from, to) FILE *stream; char *from, *to; @@ -50,14 +55,14 @@ void disassemble(stream, from, to) while (pc < end) { fprintf_vma(stream, pc); putc('\t', stream); -#ifdef LIGHTNING_I386 +#if LIGHTNING_TARGET == LIGHTNING_I386_32 pc += print_insn_i386(pc, &info); -#endif -#ifdef LIGHTNING_PPC +#elif LIGHTNING_TARGET == LIGHTNING_PPC pc += print_insn_big_powerpc(pc, &info); -#endif -#ifdef LIGHTNING_SPARC +#elif LIGHTNING_TARGET == LIGHTNING_SPARC pc += print_insn_sparc(pc, &info); +#else +# error disassembling not yet supported for your architecture #endif putc('\n', stream); } diff --git a/tests/Makefile.am b/tests/Makefile.am index a61e8969b..de3990261 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,4 +1,4 @@ -AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir) +AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir) -I$(top_srcdir)/lightning/$(cpu) check_PROGRAMS = fibit incr printf printf2 rpn fib fibdelay add bp testfp funcfp rpnfp modi ldxi noinst_DATA = fibit.ok incr.ok printf.ok printf2.ok rpn.ok fib.ok fibdelay.ok testfp.ok funcfp.ok rpnfp.ok add.ok bp.ok modi.ok ldxi.ok diff --git a/tests/Makefile.in b/tests/Makefile.in index 6b3cb3f77..dda527dfe 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -44,7 +44,8 @@ check_PROGRAMS = fibit$(EXEEXT) incr$(EXEEXT) printf$(EXEEXT) \ subdir = tests DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__aclocal_m4_deps = $(top_srcdir)/build-aux/lightning.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -189,6 +190,7 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +cpu = @cpu@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ @@ -222,7 +224,7 @@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ -AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir) +AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir) -I$(top_srcdir)/lightning/$(cpu) noinst_DATA = fibit.ok incr.ok printf.ok printf2.ok rpn.ok fib.ok fibdelay.ok testfp.ok funcfp.ok rpnfp.ok add.ok bp.ok modi.ok ldxi.ok EXTRA_DIST = $(noinst_DATA) run-test @DISASS_TRUE@LDADD = $(top_builddir)/opcode/libdisass.a