diff --git a/ChangeLog b/ChangeLog index c7312df28..b12f03fc2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2006-07-06 Paolo Bonzini + Ludovic Courtes + + * lightning/ppc/core.h (_jit_mod): Replace with... + (_jit_mod_big, _jit_mod_small): ... these. + (jit_modi_i, jit_modi_ui): Rewrite. + * tests/modi.c, tests/modi.ok: New tests. + 2006-05-18 Matthew Flatt * lightning/i386/asm.h: Fix test for extending the mprotect area diff --git a/Makefile.in b/Makefile.in index 810f77236..c190be2a4 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.9.5 from Makefile.am. +# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, diff --git a/aclocal.m4 b/aclocal.m4 index 965df9086..aef181a6d 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,4 +1,4 @@ -# generated automatically by aclocal 1.9.5 -*- Autoconf -*- +# generated automatically by aclocal 1.9.6 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005 Free Software Foundation, Inc. @@ -28,7 +28,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) # Call AM_AUTOMAKE_VERSION so it can be traced. # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], - [AM_AUTOMAKE_VERSION([1.9.5])]) + [AM_AUTOMAKE_VERSION([1.9.6])]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- diff --git a/doc/Makefile.in b/doc/Makefile.in index 2208eaefe..6dc7ee68b 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.9.5 from Makefile.am. +# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -207,9 +207,11 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps) restore=: && backupdir="$(am__leading_dot)am$$$$" && \ am__cwd=`pwd` && cd $(srcdir) && \ rm -rf $$backupdir && mkdir $$backupdir && \ - for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ - if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ - done; \ + if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ + for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ + if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ + done; \ + else :; fi && \ cd "$$am__cwd"; \ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $@ $<; \ @@ -270,6 +272,7 @@ mostlyclean-vti: maintainer-clean-vti: -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi .dvi.ps: + TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ $(DVIPS) -o $@ $< uninstall-info-am: diff --git a/doc/lightningize.1 b/doc/lightningize.1 index bfa8a7d13..4a41c091a 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" "November 2004" "lightningize 1.2a" "User Commands" +.TH LIGHTNINGIZE "1" "July 2006" "lightningize 1.2a" "User Commands" .SH NAME lightningize \- manual page for lightningize 1.2a .SH SYNOPSIS diff --git a/doc/version.texi b/doc/version.texi index d71db0b8a..3e367655a 100644 --- a/doc/version.texi +++ b/doc/version.texi @@ -1,4 +1,4 @@ -@set UPDATED 6 November 2004 -@set UPDATED-MONTH November 2004 +@set UPDATED 21 June 2005 +@set UPDATED-MONTH June 2005 @set EDITION 1.2a @set VERSION 1.2a diff --git a/lightning/Makefile.in b/lightning/Makefile.in index 026cae5ac..5b01e64f0 100644 --- a/lightning/Makefile.in +++ b/lightning/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.9.5 from Makefile.am. +# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, diff --git a/lightning/ppc/core.h b/lightning/ppc/core.h index c62567b71..1f687e947 100644 --- a/lightning/ppc/core.h +++ b/lightning/ppc/core.h @@ -81,19 +81,24 @@ struct jit_local_state { #define jit_ubooli2(d, rs, is, jmp) (jit_chk_imu (is, CMPLWIri(rs, is), CMPLWrr(rs, JIT_AUX)), MFCRr((d)), EXTRWIrrii((d), (d), 1, (jmp)), XORIrri((d), (d), 1)) #define jit_uboolr2(d, s1, s2, jmp) ( CMPLWrr (s1, s2), MFCRr((d)), EXTRWIrrii((d), (d), 1, (jmp)), XORIrri((d), (d), 1)) -/* modulus with immediate - * movei r26, imm +/* modulus with big immediate with small immediate + * movei r24, imm movei r24, imm * mtlr r31 - * divw r31, rs, r26 (or divwu) - * mullw r31, r31, r26 - * sub rs, rs, r26 + * divw r31, rs, r24 (or divwu) divw r24, rs, r24 + * mullw r31, r31, r24 mulli r24, r24, imm + * sub d, rs, r31 sub d, rs, r24 * mflr r31 - */ + * + * + * jit_mod_big expects immediate in JIT_AUX. */ -#define _jit_mod(div, rs, imm) (MOVEIri(JIT_AUX, (imm)), MTLRr(31), (div), \ - MULLWrrr(31, 31, JIT_AUX), SUBrrr((rs), (rs), JIT_AUX), \ +#define _jit_mod_big(div, d, rs) (MTLRr(31), div(31, (rs), JIT_AUX), \ + MULLWrrr(31, 31, JIT_AUX), SUBrrr((d), (rs), 31), \ MFLRr(31)) +#define _jit_mod_small(div, d, rs, imm) (MOVEIri(JIT_AUX, (imm)), div(JIT_AUX, (rs), JIT_AUX), \ + MULLIrri(JIT_AUX, JIT_AUX, (imm)), SUBrrr((d), (rs), JIT_AUX)) + /* Patch a movei instruction made of a LIS at lis_pc and an ORI at ori_pc. */ #define jit_patch_movei(lis_pc, ori_pc, dest) \ (*(lis_pc) &= ~_MASK(16), *(lis_pc) |= _HI(dest), \ @@ -220,8 +225,8 @@ struct jit_local_state { #define jit_lti_ui(d, rs, is) jit_ubooli ((d), (rs), (is), _lt ) #define jit_ltr_i(d, s1, s2) jit_sboolr ((d), (s1), (s2), _lt ) #define jit_ltr_ui(d, s1, s2) jit_uboolr ((d), (s1), (s2), _lt ) -#define jit_modi_i(d, rs, is) _jit_mod(jit_divi_i (31, (rs), JIT_AUX), (rs), (is)) -#define jit_modi_ui(d, rs, is) _jit_mod(jit_divi_ui(31, (rs), JIT_AUX), (rs), (is)) +#define jit_modi_i(d, rs, is) jit_chk_ims ((is), _jit_mod_small(jit_divr_i , (d), (rs), (is)), _jit_mod_big(jit_divr_i , (d), (rs))) +#define jit_modi_ui(d, rs, is) jit_chk_imu15((is), _jit_mod_small(jit_divr_ui, (d), (rs), (is)), _jit_mod_big(jit_divr_ui, (d), (rs))) #define jit_modr_i(d, s1, s2) (DIVWrrr(JIT_AUX, (s1), (s2)), MULLWrrr(JIT_AUX, JIT_AUX, (s2)), SUBrrr((d), (s1), JIT_AUX)) #define jit_modr_ui(d, s1, s2) (DIVWUrrr(JIT_AUX, (s1), (s2)), MULLWrrr(JIT_AUX, JIT_AUX, (s2)), SUBrrr((d), (s1), JIT_AUX)) #define jit_movi_i(d, is) MOVEIri((d), (is)) diff --git a/opcode/Makefile.in b/opcode/Makefile.in index 2e435e890..f7d2ef1f8 100644 --- a/opcode/Makefile.in +++ b/opcode/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.9.5 from Makefile.am. +# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -15,8 +15,6 @@ @SET_MAKE@ -SOURCES = $(libdisass_a_SOURCES) - srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ diff --git a/tests/Makefile.am b/tests/Makefile.am index ba52a1a46..bfee98e9b 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,7 +1,7 @@ AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir) -noinst_PROGRAMS = fibit incr printf printf2 rpn fib fibdelay add bp testfp funcfp rpnfp -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 +noinst_PROGRAMS = fibit incr printf printf2 rpn fib fibdelay add bp testfp funcfp rpnfp modi +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 EXTRA_DIST = $(noinst_DATA) run-test if DISASS @@ -9,6 +9,6 @@ LDADD = $(top_builddir)/opcode/libdisass.a endif if REGRESSION_TESTING -TESTS = fib fibit fibdelay incr printf printf2 rpn add bp testfp funcfp rpnfp +TESTS = fib fibit fibdelay incr printf printf2 rpn add bp testfp funcfp rpnfp modi TESTS_ENVIRONMENT=$(srcdir)/run-test endif diff --git a/tests/Makefile.in b/tests/Makefile.in index 245f98e82..4c3427f1b 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.9.5 from Makefile.am. +# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -15,8 +15,6 @@ @SET_MAKE@ -SOURCES = add.c bp.c fib.c fibdelay.c fibit.c funcfp.c incr.c printf.c printf2.c rpn.c rpnfp.c testfp.c - srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ @@ -43,7 +41,7 @@ target_triplet = @target@ noinst_PROGRAMS = fibit$(EXEEXT) incr$(EXEEXT) printf$(EXEEXT) \ printf2$(EXEEXT) rpn$(EXEEXT) fib$(EXEEXT) fibdelay$(EXEEXT) \ add$(EXEEXT) bp$(EXEEXT) testfp$(EXEEXT) funcfp$(EXEEXT) \ - rpnfp$(EXEEXT) + rpnfp$(EXEEXT) modi$(EXEEXT) subdir = tests DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -83,6 +81,10 @@ incr_SOURCES = incr.c incr_OBJECTS = incr.$(OBJEXT) incr_LDADD = $(LDADD) @DISASS_TRUE@incr_DEPENDENCIES = $(top_builddir)/opcode/libdisass.a +modi_SOURCES = modi.c +modi_OBJECTS = modi.$(OBJEXT) +modi_LDADD = $(LDADD) +@DISASS_TRUE@modi_DEPENDENCIES = $(top_builddir)/opcode/libdisass.a printf_SOURCES = printf.c printf_OBJECTS = printf.$(OBJEXT) printf_LDADD = $(LDADD) @@ -111,10 +113,10 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = add.c bp.c fib.c fibdelay.c fibit.c funcfp.c incr.c printf.c \ - printf2.c rpn.c rpnfp.c testfp.c -DIST_SOURCES = add.c bp.c fib.c fibdelay.c fibit.c funcfp.c incr.c \ +SOURCES = add.c bp.c fib.c fibdelay.c fibit.c funcfp.c incr.c modi.c \ printf.c printf2.c rpn.c rpnfp.c testfp.c +DIST_SOURCES = add.c bp.c fib.c fibdelay.c fibit.c funcfp.c incr.c \ + modi.c printf.c printf2.c rpn.c rpnfp.c testfp.c DATA = $(noinst_DATA) ETAGS = etags CTAGS = ctags @@ -214,10 +216,10 @@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir) -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 +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 EXTRA_DIST = $(noinst_DATA) run-test @DISASS_TRUE@LDADD = $(top_builddir)/opcode/libdisass.a -@REGRESSION_TESTING_TRUE@TESTS = fib fibit fibdelay incr printf printf2 rpn add bp testfp funcfp rpnfp +@REGRESSION_TESTING_TRUE@TESTS = fib fibit fibdelay incr printf printf2 rpn add bp testfp funcfp rpnfp modi @REGRESSION_TESTING_TRUE@TESTS_ENVIRONMENT = $(srcdir)/run-test all: all-am @@ -276,6 +278,9 @@ funcfp$(EXEEXT): $(funcfp_OBJECTS) $(funcfp_DEPENDENCIES) incr$(EXEEXT): $(incr_OBJECTS) $(incr_DEPENDENCIES) @rm -f incr$(EXEEXT) $(LINK) $(incr_LDFLAGS) $(incr_OBJECTS) $(incr_LDADD) $(LIBS) +modi$(EXEEXT): $(modi_OBJECTS) $(modi_DEPENDENCIES) + @rm -f modi$(EXEEXT) + $(LINK) $(modi_LDFLAGS) $(modi_OBJECTS) $(modi_LDADD) $(LIBS) printf$(EXEEXT): $(printf_OBJECTS) $(printf_DEPENDENCIES) @rm -f printf$(EXEEXT) $(LINK) $(printf_LDFLAGS) $(printf_OBJECTS) $(printf_LDADD) $(LIBS) @@ -305,6 +310,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fibit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/funcfp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/incr.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/modi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printf2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rpn.Po@am__quote@ diff --git a/tests/modi.c b/tests/modi.c new file mode 100644 index 000000000..a5167bccb --- /dev/null +++ b/tests/modi.c @@ -0,0 +1,52 @@ +/******************************** -*- C -*- **************************** + * + * Test jit_modi_i + * + ***********************************************************************/ + + +/* Contributed by Ludovic Courtes. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "lightning.h" + +typedef int (* mod_t) (int); + +mod_t +generate_modi (int operand) +{ + static char buffer[1024]; + mod_t result; + int arg; + + result = (mod_t)(jit_set_ip (buffer).iptr); + jit_leaf (1); + arg = jit_arg_i (); + jit_getarg_i (JIT_R1, arg); + + jit_modi_i (JIT_R2, JIT_R1, operand); + jit_movr_i (JIT_RET, JIT_R2); + + jit_ret (); + jit_flush_code (buffer, jit_get_ip ().ptr); + + return result; +} + +int +main (int argc, char *argv[]) +{ + mod_t mod_eight = generate_modi (8); + + printf ("mod_eight (%i) = %i (vs. %i)\n", + 20420, mod_eight (20420), (20420 % 8)); + printf ("mod_eight (%i) = %i (vs. %i)\n", + 216096, mod_eight (216096), (216096 % 8)); + + return 0; +} diff --git a/tests/modi.ok b/tests/modi.ok new file mode 100644 index 000000000..059dc63dc --- /dev/null +++ b/tests/modi.ok @@ -0,0 +1,2 @@ +mod_eight (20420) = 4 (vs. 4) +mod_eight (216096) = 0 (vs. 0)