diff options
author | Simon South <simon@simonsouth.net> | 2020-06-01 13:15:31 -0400 |
---|---|---|
committer | Efraim Flashner <efraim@flashner.co.il> | 2020-06-28 10:45:53 +0300 |
commit | 6c9dca5a9bc3aeab260bc125e8ddc08a5107ec4e (patch) | |
tree | caa64fe416108b9fa5f9f75bff54c5196794643a /gnu/packages/patches/jamvm-arm.patch | |
parent | 25ceae92ea6cddd2306fab9847ba091c17a0ae69 (diff) | |
download | guix-patches-6c9dca5a9bc3aeab260bc125e8ddc08a5107ec4e.tar guix-patches-6c9dca5a9bc3aeab260bc125e8ddc08a5107ec4e.tar.gz |
gnu: jamvm-1-bootstrap: Add aarch64-linux support.
* gnu/packages/java.scm (jamvm-1-bootstrap)[source]: Add patch; update
name of existing patch.
[arguments]<#:phases>: Invoke autoreconf during bootstrap phase when
building for aarch64.
[native-inputs]: Include packages required for autoreconf when
building for aarch64.
* gnu/packages/patches/jamvm-1.5.1-aarch64-support.patch: New file.
* gnu/packages/patches/jamvm-arm.patch: Rename to
"jamvm-1.5.1-armv7-support.patch".
* gnu/local.mk (dist_patch_DATA): Add file; update filename.
Signed-off-by: Efraim Flashner <efraim@flashner.co.il>
Diffstat (limited to 'gnu/packages/patches/jamvm-arm.patch')
-rw-r--r-- | gnu/packages/patches/jamvm-arm.patch | 1313 |
1 files changed, 0 insertions, 1313 deletions
diff --git a/gnu/packages/patches/jamvm-arm.patch b/gnu/packages/patches/jamvm-arm.patch deleted file mode 100644 index 9e998e18db..0000000000 --- a/gnu/packages/patches/jamvm-arm.patch +++ /dev/null @@ -1,1313 +0,0 @@ -From 67faeb7d58e0d25a50d36788ed49ed383b92e090 Mon Sep 17 00:00:00 2001 -From: Efraim Flashner <efraim@flashner.co.il> -Date: Mon, 26 Mar 2018 11:08:17 +0300 -Subject: [PATCH] add ARMv7 support - ---- - src/arch/arm.h | 75 +++++- - src/os/linux/arm/Makefile.am | 9 +- - src/os/linux/arm/Makefile.in | 166 ++++++++---- - src/os/linux/arm/callNative.S | 12 +- - src/os/linux/arm/callNativeEABI.S | 8 +- - src/os/linux/arm/callNativeEABIHard.S | 315 +++++++++++++++++++++++ - src/os/linux/arm/callNativeEABIHardARM.S | 266 +++++++++++++++++++ - src/os/linux/arm/dll_md.c | 61 ++++- - 8 files changed, 843 insertions(+), 69 deletions(-) - create mode 100644 src/os/linux/arm/callNativeEABIHard.S - create mode 100644 src/os/linux/arm/callNativeEABIHardARM.S - -diff --git a/src/arch/arm.h b/src/arch/arm.h -index ccf68c4..d2c0318 100644 ---- a/src/arch/arm.h -+++ b/src/arch/arm.h -@@ -1,6 +1,6 @@ - /* -- * Copyright (C) 2003, 2004, 2005, 2006, 2007 -- * Robert Lougher <rob@lougher.org.uk>. -+ * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, -+ * 2014 Robert Lougher <rob@jamvm.org.uk>. - * - * This file is part of JamVM. - * -@@ -21,10 +21,16 @@ - - #define OS_ARCH "arm" - --/* Override default min and max heap sizes. ARM machines are -- usually embedded, and the standard defaults are too large. */ --#define DEFAULT_MAX_HEAP 16*MB -+/* Override minimum min heap size. The initial heap size is a ratio -+ of the physical memory, but it must be at least the minimum min -+ size. The normal setting is too large for ARM machines as they -+ are usually embedded. */ -+#define MIN_MIN_HEAP 1*MB -+ -+/* Likewise, override the default min/max heap sizes used when the -+ size of physical memory is not available */ - #define DEFAULT_MIN_HEAP 1*MB -+#define DEFAULT_MAX_HEAP 64*MB - - #ifdef DIRECT - #define HANDLER_TABLE_T static const void -@@ -51,6 +57,36 @@ - /* Needed for i386 -- empty here */ - #define FPU_HACK - -+#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__) -+#define COMPARE_AND_SWAP_32(addr, old_val, new_val) \ -+({ \ -+ int result, read_val; \ -+ __asm__ __volatile__ (" \ -+ 1: mov %0, #0; \ -+ ldrex %1, [%2]; \ -+ cmp %3, %1; \ -+ bne 2f; \ -+ strex %0, %4, [%2]; \ -+ cmp %0, #1; \ -+ beq 1b; \ -+ mov %0, #1; \ -+ 2:" \ -+ : "=&r" (result), "=&r" (read_val) \ -+ : "r" (addr), "r" (old_val), "r" (new_val) \ -+ : "cc", "memory"); \ -+ result; \ -+}) -+ -+#define COMPARE_AND_SWAP(addr, old_val, new_val) \ -+ COMPARE_AND_SWAP_32(addr, old_val, new_val) -+ -+#define LOCKWORD_READ(addr) *addr -+#define LOCKWORD_WRITE(addr, value) *addr = value -+#define LOCKWORD_COMPARE_AND_SWAP(addr, old_val, new_val) \ -+ COMPARE_AND_SWAP(addr, old_val, new_val) -+ -+#else -+ - #define LOCKWORD_COMPARE_AND_SWAP(addr, old_val, new_val) \ - ({ \ - int result, read_val; \ -@@ -94,7 +130,7 @@ do { \ - : "r" (addr), "r" (new_val) \ - : "cc", "memory"); \ - } while(0) -- -+#endif - - #ifdef __ARM_EABI__ - #define FLUSH_CACHE(addr, length) \ -@@ -124,8 +160,33 @@ do { \ - } - #endif - -+#define GEN_REL_JMP(target_addr, patch_addr, patch_size) \ -+({ \ -+ int patched = FALSE; \ -+ \ -+ if(patch_size >= 4) { \ -+ /* Guard against the pointer difference being \ -+ larger than the signed range */ \ -+ long long offset = (uintptr_t)(target_addr) - \ -+ (uintptr_t)(patch_addr) - 8; \ -+ \ -+ if(offset >= -1<<25 && offset < 1<<25) { \ -+ *(int*)(patch_addr) = offset>>2 & 0x00ffffff \ -+ | 0xea000000; \ -+ patched = TRUE; \ -+ } \ -+ } \ -+ patched; \ -+}) -+ -+#ifdef __ARM_ARCH_7A__ -+#define MBARRIER() __asm__ __volatile__ ("dmb" ::: "memory") -+#define UNLOCK_MBARRIER() __asm__ __volatile__ ("dmb" ::: "memory") -+#define JMM_LOCK_MBARRIER() __asm__ __volatile__ ("dmb" ::: "memory") -+#define JMM_UNLOCK_MBARRIER() __asm__ __volatile__ ("dmb" ::: "memory") -+#else - #define MBARRIER() __asm__ __volatile__ ("" ::: "memory") - #define UNLOCK_MBARRIER() __asm__ __volatile__ ("" ::: "memory") - #define JMM_LOCK_MBARRIER() __asm__ __volatile__ ("" ::: "memory") - #define JMM_UNLOCK_MBARRIER() __asm__ __volatile__ ("" ::: "memory") -- -+#endif -diff --git a/src/os/linux/arm/Makefile.am b/src/os/linux/arm/Makefile.am -index d18ea5a..74e7786 100644 ---- a/src/os/linux/arm/Makefile.am -+++ b/src/os/linux/arm/Makefile.am -@@ -1,6 +1,6 @@ - ## --## Copyright (C) 2003, 2004, 2005, 2006, 2007 --## Robert Lougher <rob@lougher.org.uk>. -+## Copyright (C) 2003, 2004, 2005, 2006, 2007, 2010, 2011, 2012 -+## Robert Lougher <rob@jamvm.org.uk>. - ## - ## This file is part of JamVM. - ## -@@ -19,10 +19,11 @@ - ## Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - ## - --EXTRA_DIST = callNativeOABI.S callNativeEABI.S -+EXTRA_DIST = callNativeOABI.S callNativeEABI.S callNativeEABIHard.S \ -+ callNativeEABIHardARM.S - - noinst_LTLIBRARIES = libnative.la - libnative_la_SOURCES = init.c dll_md.c callNative.S - --AM_CPPFLAGS = -I$(top_builddir)/src -+AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src - AM_CCASFLAGS = -I$(top_builddir)/src -diff --git a/src/os/linux/arm/Makefile.in b/src/os/linux/arm/Makefile.in -index 63b21ad..6d44ea9 100644 ---- a/src/os/linux/arm/Makefile.in -+++ b/src/os/linux/arm/Makefile.in -@@ -1,8 +1,9 @@ --# Makefile.in generated by automake 1.10 from Makefile.am. -+# Makefile.in generated by automake 1.11.6 from Makefile.am. - # @configure_input@ - - # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, --# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software -+# Foundation, Inc. - # This Makefile.in is free software; the Free Software Foundation - # gives unlimited permission to copy and/or distribute it, - # with or without modifications, as long as this notice is preserved. -@@ -15,9 +16,27 @@ - @SET_MAKE@ - - VPATH = @srcdir@ -+am__make_dryrun = \ -+ { \ -+ am__dry=no; \ -+ case $$MAKEFLAGS in \ -+ *\\[\ \ ]*) \ -+ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ -+ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ -+ *) \ -+ for am__flg in $$MAKEFLAGS; do \ -+ case $$am__flg in \ -+ *=*|--*) ;; \ -+ *n*) am__dry=yes; break;; \ -+ esac; \ -+ done;; \ -+ esac; \ -+ test $$am__dry = yes; \ -+ } - pkgdatadir = $(datadir)/@PACKAGE@ --pkglibdir = $(libdir)/@PACKAGE@ - pkgincludedir = $(includedir)/@PACKAGE@ -+pkglibdir = $(libdir)/@PACKAGE@ -+pkglibexecdir = $(libexecdir)/@PACKAGE@ - am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd - install_sh_DATA = $(install_sh) -c -m 644 - install_sh_PROGRAM = $(install_sh) -c -@@ -42,13 +61,15 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs - CONFIG_HEADER = $(top_builddir)/src/config.h - CONFIG_CLEAN_FILES = -+CONFIG_CLEAN_VPATH_FILES = - LTLIBRARIES = $(noinst_LTLIBRARIES) - libnative_la_LIBADD = - am_libnative_la_OBJECTS = init.lo dll_md.lo callNative.lo - libnative_la_OBJECTS = $(am_libnative_la_OBJECTS) --DEFAULT_INCLUDES = -I. -I$(top_builddir)/src@am__isrc@ -+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src - depcomp = $(SHELL) $(top_srcdir)/depcomp - am__depfiles_maybe = depfiles -+am__mv = mv -f - CPPASCOMPILE = $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) - LTCPPASCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ -@@ -65,6 +86,11 @@ LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - $(LDFLAGS) -o $@ - SOURCES = $(libnative_la_SOURCES) - DIST_SOURCES = $(libnative_la_SOURCES) -+am__can_run_installinfo = \ -+ case $$AM_UPDATE_INFO_DIR in \ -+ n|no|NO) false;; \ -+ *) (install-info --version) >/dev/null 2>&1;; \ -+ esac - ETAGS = etags - CTAGS = ctags - DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -@@ -84,21 +110,18 @@ CCDEPMODE = @CCDEPMODE@ - CFLAGS = @CFLAGS@ - CPP = @CPP@ - CPPFLAGS = @CPPFLAGS@ --CXX = @CXX@ --CXXCPP = @CXXCPP@ --CXXDEPMODE = @CXXDEPMODE@ --CXXFLAGS = @CXXFLAGS@ - CYGPATH_W = @CYGPATH_W@ - DEFS = @DEFS@ - DEPDIR = @DEPDIR@ --ECHO = @ECHO@ -+DLLTOOL = @DLLTOOL@ -+DSYMUTIL = @DSYMUTIL@ -+DUMPBIN = @DUMPBIN@ - ECHO_C = @ECHO_C@ - ECHO_N = @ECHO_N@ - ECHO_T = @ECHO_T@ - EGREP = @EGREP@ - EXEEXT = @EXEEXT@ --F77 = @F77@ --FFLAGS = @FFLAGS@ -+FGREP = @FGREP@ - GREP = @GREP@ - INSTALL = @INSTALL@ - INSTALL_DATA = @INSTALL_DATA@ -@@ -106,21 +129,30 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ - INSTALL_SCRIPT = @INSTALL_SCRIPT@ - INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ - JAVAC = @JAVAC@ -+LD = @LD@ - LDFLAGS = @LDFLAGS@ - LIBOBJS = @LIBOBJS@ - LIBS = @LIBS@ - LIBTOOL = @LIBTOOL@ -+LIPO = @LIPO@ - LN_S = @LN_S@ - LTLIBOBJS = @LTLIBOBJS@ - MAINT = @MAINT@ - MAKEINFO = @MAKEINFO@ -+MANIFEST_TOOL = @MANIFEST_TOOL@ - MKDIR_P = @MKDIR_P@ -+NM = @NM@ -+NMEDIT = @NMEDIT@ -+OBJDUMP = @OBJDUMP@ - OBJEXT = @OBJEXT@ -+OTOOL = @OTOOL@ -+OTOOL64 = @OTOOL64@ - PACKAGE = @PACKAGE@ - PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ - PACKAGE_NAME = @PACKAGE_NAME@ - PACKAGE_STRING = @PACKAGE_STRING@ - PACKAGE_TARNAME = @PACKAGE_TARNAME@ -+PACKAGE_URL = @PACKAGE_URL@ - PACKAGE_VERSION = @PACKAGE_VERSION@ - PATH_SEPARATOR = @PATH_SEPARATOR@ - RANLIB = @RANLIB@ -@@ -133,9 +165,9 @@ abs_builddir = @abs_builddir@ - abs_srcdir = @abs_srcdir@ - abs_top_builddir = @abs_top_builddir@ - abs_top_srcdir = @abs_top_srcdir@ -+ac_ct_AR = @ac_ct_AR@ - ac_ct_CC = @ac_ct_CC@ --ac_ct_CXX = @ac_ct_CXX@ --ac_ct_F77 = @ac_ct_F77@ -+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ - am__include = @am__include@ - am__leading_dot = @am__leading_dot@ - am__quote = @am__quote@ -@@ -149,6 +181,7 @@ build_cpu = @build_cpu@ - build_os = @build_os@ - build_vendor = @build_vendor@ - builddir = @builddir@ -+classlib = @classlib@ - datadir = @datadir@ - datarootdir = @datarootdir@ - docdir = @docdir@ -@@ -181,15 +214,18 @@ sharedstatedir = @sharedstatedir@ - srcdir = @srcdir@ - sysconfdir = @sysconfdir@ - target_alias = @target_alias@ -+top_build_prefix = @top_build_prefix@ - top_builddir = @top_builddir@ - top_srcdir = @top_srcdir@ - use_zip_no = @use_zip_no@ - use_zip_yes = @use_zip_yes@ - with_classpath_install_dir = @with_classpath_install_dir@ --EXTRA_DIST = callNativeOABI.S callNativeEABI.S -+EXTRA_DIST = callNativeOABI.S callNativeEABI.S callNativeEABIHard.S \ -+ callNativeEABIHardARM.S -+ - noinst_LTLIBRARIES = libnative.la - libnative_la_SOURCES = init.c dll_md.c callNative.S --AM_CPPFLAGS = -I$(top_builddir)/src -+AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src - AM_CCASFLAGS = -I$(top_builddir)/src - all: all-am - -@@ -199,14 +235,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ -- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ -- && exit 0; \ -+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ -+ && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ -- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/os/linux/arm/Makefile'; \ -- cd $(top_srcdir) && \ -- $(AUTOMAKE) --gnu src/os/linux/arm/Makefile -+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/os/linux/arm/Makefile'; \ -+ $(am__cd) $(top_srcdir) && \ -+ $(AUTOMAKE) --gnu src/os/linux/arm/Makefile - .PRECIOUS: Makefile - Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ -@@ -224,6 +260,7 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -+$(am__aclocal_m4_deps): - - clean-noinstLTLIBRARIES: - -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) -@@ -233,7 +270,7 @@ clean-noinstLTLIBRARIES: - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done --libnative.la: $(libnative_la_OBJECTS) $(libnative_la_DEPENDENCIES) -+libnative.la: $(libnative_la_OBJECTS) $(libnative_la_DEPENDENCIES) $(EXTRA_libnative_la_DEPENDENCIES) - $(LINK) $(libnative_la_OBJECTS) $(libnative_la_LIBADD) $(LIBS) - - mostlyclean-compile: -@@ -248,42 +285,42 @@ distclean-compile: - - .S.o: - @am__fastdepCCAS_TRUE@ $(CPPASCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< --@am__fastdepCCAS_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -+@am__fastdepCCAS_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po - @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ - @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - @am__fastdepCCAS_FALSE@ $(CPPASCOMPILE) -c -o $@ $< - - .S.obj: - @am__fastdepCCAS_TRUE@ $(CPPASCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` --@am__fastdepCCAS_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -+@am__fastdepCCAS_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po - @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ - @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - @am__fastdepCCAS_FALSE@ $(CPPASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - - .S.lo: - @am__fastdepCCAS_TRUE@ $(LTCPPASCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< --@am__fastdepCCAS_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -+@am__fastdepCCAS_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo - @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ - @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - @am__fastdepCCAS_FALSE@ $(LTCPPASCOMPILE) -c -o $@ $< - - .c.o: - @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< --@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po - @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ - @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - @am__fastdepCC_FALSE@ $(COMPILE) -c $< - - .c.obj: - @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` --@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po - @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ - @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - - .c.lo: - @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< --@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo - @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ - @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< -@@ -299,45 +336,49 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ -- $(AWK) ' { files[$$0] = 1; } \ -- END { for (i in files) print i; }'`; \ -+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ -+ END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique - tags: TAGS - - TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) -- tags=; \ -+ set x; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ -- $(AWK) ' { files[$$0] = 1; } \ -- END { for (i in files) print i; }'`; \ -- if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ -+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ -+ END { if (nonempty) { for (i in files) print i; }; }'`; \ -+ shift; \ -+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ -- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ -- $$tags $$unique; \ -+ if test $$# -gt 0; then \ -+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ -+ "$$@" $$unique; \ -+ else \ -+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ -+ $$unique; \ -+ fi; \ - fi - ctags: CTAGS - CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) -- tags=; \ -- here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ -- $(AWK) ' { files[$$0] = 1; } \ -- END { for (i in files) print i; }'`; \ -- test -z "$(CTAGS_ARGS)$$tags$$unique" \ -+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ -+ END { if (nonempty) { for (i in files) print i; }; }'`; \ -+ test -z "$(CTAGS_ARGS)$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ -- $$tags $$unique -+ $$unique - - GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ -- && cd $(top_srcdir) \ -- && gtags -i $(GTAGS_ARGS) $$here -+ && $(am__cd) $(top_srcdir) \ -+ && gtags -i $(GTAGS_ARGS) "$$here" - - distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -@@ -358,13 +399,17 @@ distdir: $(DISTFILES) - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ -+ if test -d "$(distdir)/$$file"; then \ -+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ -+ fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ -- cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ -+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ -+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ -- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ -+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ -- test -f $(distdir)/$$file \ -- || cp -p $$d/$$file $(distdir)/$$file \ -+ test -f "$(distdir)/$$file" \ -+ || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -@@ -382,16 +427,22 @@ install-am: all-am - - installcheck: installcheck-am - install-strip: -- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ -- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ -- `test -z '$(STRIP)' || \ -- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -+ if test -z '$(STRIP)'; then \ -+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ -+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ -+ install; \ -+ else \ -+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ -+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ -+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ -+ fi - mostlyclean-generic: - - clean-generic: - - distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - - maintainer-clean-generic: - @echo "This command is intended for maintainers to use" -@@ -413,6 +464,8 @@ dvi-am: - - html: html-am - -+html-am: -+ - info: info-am - - info-am: -@@ -421,18 +474,28 @@ install-data-am: - - install-dvi: install-dvi-am - -+install-dvi-am: -+ - install-exec-am: - - install-html: install-html-am - -+install-html-am: -+ - install-info: install-info-am - -+install-info-am: -+ - install-man: - - install-pdf: install-pdf-am - -+install-pdf-am: -+ - install-ps: install-ps-am - -+install-ps-am: -+ - installcheck-am: - - maintainer-clean: maintainer-clean-am -@@ -470,6 +533,7 @@ uninstall-am: - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am - -+ - # Tell versions [3.59,3.63) of GNU make to not export all variables. - # Otherwise a system limit (for SysV at least) may be exceeded. - .NOEXPORT: -diff --git a/src/os/linux/arm/callNative.S b/src/os/linux/arm/callNative.S -index 39ab6d3..245afd1 100644 ---- a/src/os/linux/arm/callNative.S -+++ b/src/os/linux/arm/callNative.S -@@ -1,6 +1,6 @@ - /* -- * Copyright (C) 2003, 2004, 2005, 2006, 2007 -- * Robert Lougher <rob@lougher.org.uk>. -+ * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2011, 2012 -+ * Robert Lougher <rob@jamvm.org.uk>. - * - * This file is part of JamVM. - * -@@ -23,7 +23,15 @@ - - #ifndef USE_FFI - #ifdef __ARM_EABI__ -+#ifdef __ARM_PCS_VFP -+#ifdef __ARM_ARCH_7A__ -+#include "callNativeEABIHard.S" -+#else -+#include "callNativeEABIHardARM.S" -+#endif -+#else - #include "callNativeEABI.S" -+#endif - #else - #include "callNativeOABI.S" - #endif -diff --git a/src/os/linux/arm/callNativeEABI.S b/src/os/linux/arm/callNativeEABI.S -index 5effa57..3a7539e 100644 ---- a/src/os/linux/arm/callNativeEABI.S -+++ b/src/os/linux/arm/callNativeEABI.S -@@ -1,6 +1,6 @@ - /* -- * Copyright (C) 2003, 2004, 2005, 2006, 2007 -- * Robert Lougher <rob@lougher.org.uk>. -+ * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2011 -+ * Robert Lougher <rob@jamvm.org.uk>. - * - * This file is part of JamVM. - * -@@ -95,8 +95,12 @@ done: - ldmfd sp!, {r2, r3} - - /* Call the function */ -+#if defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) - mov lr, pc - bx ip -+#else -+ blx ip -+#endif - - subs r4, r4, #8 /* Pop argument area */ - /* (minus 8 for r2/r3) */ -diff --git a/src/os/linux/arm/callNativeEABIHard.S b/src/os/linux/arm/callNativeEABIHard.S -new file mode 100644 -index 0000000..5d5785b ---- /dev/null -+++ b/src/os/linux/arm/callNativeEABIHard.S -@@ -0,0 +1,315 @@ -+/* -+ * Copyright (C) 2011, 2012 Robert Lougher <rob@jamvm.org.uk>. -+ * -+ * This file is part of JamVM. -+ * -+ * 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 2, -+ * 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, write to the Free Software -+ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -+ */ -+ -+ .text -+ .syntax unified -+ .arch armv7-a -+ .thumb -+ .align 2 -+ .global callJNIMethod -+ .type callJNIMethod,function -+ -+/* -+ * Arguments passed in: -+ * -+ * r0 JNIEnv -+ * r1 class or NULL -+ * r2 sig -+ * r3 extra arg -+ * sp + 0 ostack -+ * sp + 4 function pntr -+ * sp + 8 args count -+ */ -+ -+/* Register usage : -+ * -+ * r11 function pntr -+ * lr ostack pntr -+ * ip args pntr -+ * r8 sig pntr -+ * r10 extra stack -+ * r6 fp backfill -+ * r4 fp reg -+ * r7 int reg -+ * r5 scratch -+ * r3, r2 outgoing int args -+ * r1 outgoing class or this pntr -+ * r0 outgoing JNIEnv (as passed in) -+ * -+ * s0 - s16 (d0 - d7) outgoing float args -+ */ -+ -+callJNIMethod: -+ stmfd sp!, {r4, r5, r6, r7, r8, r10, r11, lr} -+ ldr lr, [sp, #32] /* get ostack pntr */ -+ ldr r11, [sp, #36] /* get function pntr */ -+ -+ cmp r1, #0 /* is method non-static? */ -+ it eq -+ ldreq r1, [lr], #4 /* yes, load r1 with "this" */ -+ -+ mov r10, r3 -+ subs sp, sp, r3 /* allocate room for stacked */ -+ add r8, r2, #1 /* init sig pntr -- skipping '(' */ -+ -+ mov ip, sp /* init loop pntr */ -+ -+ mov r7, #2 -+ mov r4, #16 -+ mov r6, #0 -+ -+scan_sig: -+ ldrb r5, [r8], #1 -+ -+ cmp r5, #41 /* ')' */ -+ beq done -+ -+ cmp r5, #70 /* 'F' */ -+ beq float -+ -+ cmp r5, #68 /* 'D' */ -+ beq double -+ -+ cmp r5, #74 /* 'J' */ -+ beq long -+ -+skip_brackets: -+ cmp r5, #91 /* '[' */ -+ itt eq -+ ldrbeq r5, [r8], #1 -+ beq skip_brackets -+ -+ cmp r5, #76 /* 'L' */ -+ bne int -+ -+skip_ref: -+ ldrb r5, [r8], #1 -+ cmp r5, #59 /* ';' */ -+ bne skip_ref -+ -+int: -+ cbz r7, stack_int -+ -+ subs r7, r7, #1 -+ ite ne -+ ldrne r2, [lr], #4 -+ ldreq r3, [lr], #4 -+ -+ b scan_sig -+ -+float: -+ cbz r6, no_backfill -+ -+ sub r5, r6, #1 -+ mov r6, #0 -+ b load_float -+ -+no_backfill: -+ cbz r4, stack_int -+ -+ sub r4, r4, #1 -+ mov r5, r4 -+ -+load_float: -+ add lr, lr, #4 -+ tbb [pc, r5] -+ -+float_table: -+ .byte (s15-float_table)/2 -+ .byte (s14-float_table)/2 -+ .byte (s13-float_table)/2 -+ .byte (s12-float_table)/2 -+ .byte (s11-float_table)/2 -+ .byte (s10-float_table)/2 -+ .byte (s9-float_table)/2 -+ .byte (s8-float_table)/2 -+ .byte (s7-float_table)/2 -+ .byte (s6-float_table)/2 -+ .byte (s5-float_table)/2 -+ .byte (s4-float_table)/2 -+ .byte (s3-float_table)/2 -+ .byte (s2-float_table)/2 -+ .byte (s1-float_table)/2 -+ .byte (s0-float_table)/2 -+ -+stack_int: -+ ldr r5, [lr], #4 -+ str r5, [ip], #4 -+ b scan_sig -+ -+s0: -+ vldr s0, [lr, #-4] -+ b scan_sig -+s1: -+ vldr s1, [lr, #-4] -+ b scan_sig -+s2: -+ vldr s2, [lr, #-4] -+ b scan_sig -+s3: -+ vldr s3, [lr, #-4] -+ b scan_sig -+s4: -+ vldr s4, [lr, #-4] -+ b scan_sig -+s5: -+ vldr s5, [lr, #-4] -+ b scan_sig -+s6: -+ vldr s6, [lr, #-4] -+ b scan_sig -+s7: -+ vldr s7, [lr, #-4] -+ b scan_sig -+s8: -+ vldr s8, [lr, #-4] -+ b scan_sig -+s9: -+ vldr s9, [lr, #-4] -+ b scan_sig -+s10: -+ vldr s10, [lr, #-4] -+ b scan_sig -+s11: -+ vldr s11, [lr, #-4] -+ b scan_sig -+s12: -+ vldr s12, [lr, #-4] -+ b scan_sig -+s13: -+ vldr s13, [lr, #-4] -+ b scan_sig -+s14: -+ vldr s14, [lr, #-4] -+ b scan_sig -+s15: -+ vldr s15, [lr, #-4] -+ b scan_sig -+ -+long: -+ cmp r7, #2 -+ mov r7, #0 -+ bne stack_long -+ -+ ldmia lr!, {r2, r3} -+ b scan_sig -+ -+double: -+ lsrs r5, r4, #1 -+ it cs -+ movcs r6, r4 -+ -+ lsls r4, r5, #1 -+ beq stack_double -+ -+ sub r4, r4, #2 -+ add lr, lr, #8 -+ tbb [pc, r5] -+ -+double_table: -+ .byte 0 -+ .byte (d7-double_table)/2 -+ .byte (d6-double_table)/2 -+ .byte (d5-double_table)/2 -+ .byte (d4-double_table)/2 -+ .byte (d3-double_table)/2 -+ .byte (d2-double_table)/2 -+ .byte (d1-double_table)/2 -+ .byte (d0-double_table)/2 -+ .align 2 -+d0: -+ vldr d0, [lr, #-8] -+ b scan_sig -+d1: -+ vldr d1, [lr, #-8] -+ b scan_sig -+d2: -+ vldr d2, [lr, #-8] -+ b scan_sig -+d3: -+ vldr d3, [lr, #-8] -+ b scan_sig -+d4: -+ vldr d4, [lr, #-8] -+ b scan_sig -+d5: -+ vldr d5, [lr, #-8] -+ b scan_sig -+d6: -+ vldr d6, [lr, #-8] -+ b scan_sig -+d7: -+ vldr d7, [lr, #-8] -+ b scan_sig -+ -+stack_double: -+ mov r6, #0 -+ -+stack_long: -+ /* Ensure address is 8 byte aligned */ -+ add ip, ip, #7 -+ bic ip, ip, #7 -+ -+ ldr r5, [lr], #4 -+ str r5, [ip], #4 -+ ldr r5, [lr], #4 -+ str r5, [ip], #4 -+ b scan_sig -+ -+done: -+ /* Call the function */ -+ blx r11 -+ -+ add sp, sp, r10 /* Pop argument area */ -+ -+ ldr r4, [sp, #32] /* Reload ostack for */ -+ /* address of return value */ -+ -+ ldrb r5, [r8] /* Return type */ -+ -+ cmp r5, #86 /* 'V' */ -+ beq return -+ -+ cmp r5, #68 /* 'D' */ -+ beq return_double -+ -+ cmp r5, #70 /* 'F' */ -+ beq return_float -+ -+ str r0, [r4], #4 /* Low word */ -+ -+ cmp r5, #74 /* 'J' */ -+ it eq -+ streq r1, [r4], #4 /* High word */ -+ -+return: -+ mov r0, r4 /* return ostack */ -+ ldmfd sp!, {r4, r5, r6, r7, r8, r10, r11, lr} -+ bx lr -+ -+return_float: -+ vstr s0, [r4] -+ add r4, r4, #4 -+ b return -+ -+return_double: -+ vstr d0, [r4] -+ add r4, r4, #8 -+ b return -diff --git a/src/os/linux/arm/callNativeEABIHardARM.S b/src/os/linux/arm/callNativeEABIHardARM.S -new file mode 100644 -index 0000000..3a31acd ---- /dev/null -+++ b/src/os/linux/arm/callNativeEABIHardARM.S -@@ -0,0 +1,266 @@ -+/* -+ * Copyright (C) 2011, 2012 Robert Lougher <rob@jamvm.org.uk>. -+ * -+ * This file is part of JamVM. -+ * -+ * 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 2, -+ * 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, write to the Free Software -+ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -+ */ -+ -+ .text -+ .align 2 -+ .global callJNIMethod -+ .type callJNIMethod,function -+ -+/* -+ * Arguments passed in: -+ * -+ * r0 JNIEnv -+ * r1 class or NULL -+ * r2 sig -+ * r3 extra arg -+ * sp + 0 ostack -+ * sp + 4 function pntr -+ * sp + 8 args count -+ */ -+ -+/* Register usage : -+ * -+ * lr ostack pntr -+ * ip scratch -+ * r11 function pntr -+ * r10 fp backfill -+ * r8 fp reg -+ * r7 int reg -+ * r6 args pntr -+ * r5 sig pntr -+ * r4 extra stack -+ * r3, r2 outgoing int args -+ * r1 outgoing class or this pntr -+ * r0 outgoing JNIEnv (as passed in) -+ * -+ * s0 - s16 (d0 - d7) outgoing float args -+ */ -+ -+callJNIMethod: -+ stmfd sp!, {r4, r5, r6, r7, r8, r10, r11, lr} -+ ldr lr, [sp, #32] /* get ostack pntr */ -+ ldr r11, [sp, #36] /* get function pntr */ -+ -+ cmp r1, #0 /* is method non-static? */ -+ ldreq r1, [lr], #4 /* yes, load r1 with "this" */ -+ -+ mov r4, r3 -+ sub sp, sp, r4 /* allocate room for stacked */ -+ add r5, r2, #1 /* init sig pntr -- skipping '(' */ -+ -+ mov r6, sp /* init loop pntr */ -+ -+ mov r7, #2 -+ mov r8, #16 -+ mov r10, #0 -+ -+scan_sig: -+ ldrb ip, [r5], #1 -+ -+ cmp ip, #41 /* ')' */ -+ beq done -+ -+ cmp ip, #70 /* 'F' */ -+ beq float -+ -+ cmp ip, #68 /* 'D' */ -+ beq double -+ -+ cmp ip, #74 /* 'J' */ -+ beq long -+ -+skip_brackets: -+ cmp ip, #91 /* '[' */ -+ ldreqb ip, [r5], #1 -+ beq skip_brackets -+ -+ cmp ip, #76 /* 'L' */ -+ bne int -+ -+skip_ref: -+ ldrb ip, [r5], #1 -+ cmp ip, #59 /* ';' */ -+ bne skip_ref -+ -+int: -+ cmp r7, #0 -+ beq stack_int -+ -+ subs r7, r7, #1 -+ -+ ldrne r2, [lr], #4 -+ ldreq r3, [lr], #4 -+ -+ b scan_sig -+ -+stack_int: -+ ldr ip, [lr], #4 -+ str ip, [r6], #4 -+ b scan_sig -+ -+float: -+ cmp r10, #0 -+ beq no_backfill -+ -+ sub ip, r10, #1 -+ mov r10, #0 -+ b load_float -+ -+no_backfill: -+ cmp r8, #0 -+ beq stack_int -+ -+ sub r8, r8, #1 -+ mov ip, r8 -+ -+load_float: -+ add lr, lr, #4 -+ add pc, pc, ip, lsl #3 -+ nop -+ -+ flds s15, [lr, #-4] -+ b scan_sig -+ flds s14, [lr, #-4] -+ b scan_sig -+ flds s13, [lr, #-4] -+ b scan_sig -+ flds s12, [lr, #-4] -+ b scan_sig -+ flds s11, [lr, #-4] -+ b scan_sig -+ flds s10, [lr, #-4] -+ b scan_sig -+ flds s9, [lr, #-4] -+ b scan_sig -+ flds s8, [lr, #-4] -+ b scan_sig -+ flds s7, [lr, #-4] -+ b scan_sig -+ flds s6, [lr, #-4] -+ b scan_sig -+ flds s5, [lr, #-4] -+ b scan_sig -+ flds s4, [lr, #-4] -+ b scan_sig -+ flds s3, [lr, #-4] -+ b scan_sig -+ flds s2, [lr, #-4] -+ b scan_sig -+ flds s1, [lr, #-4] -+ b scan_sig -+ flds s0, [lr, #-4] -+ b scan_sig -+ -+long: -+ cmp r7, #2 -+ mov r7, #0 -+ bne stack_long -+ -+ ldr r2, [lr], #4 -+ ldr r3, [lr], #4 -+ b scan_sig -+ -+double: -+ lsrs ip, r8, #1 -+ movcs r10, r8 -+ -+ lsls r8, ip, #1 -+ beq stack_double -+ -+ sub r8, r8, #2 -+ add lr, lr, #8 -+ add pc, pc, ip, lsl #3 -+ nop -+ nop -+ nop -+ -+ fldd d7, [lr, #-8] -+ b scan_sig -+ fldd d6, [lr, #-8] -+ b scan_sig -+ fldd d5, [lr, #-8] -+ b scan_sig -+ fldd d4, [lr, #-8] -+ b scan_sig -+ fldd d3, [lr, #-8] -+ b scan_sig -+ fldd d2, [lr, #-8] -+ b scan_sig -+ fldd d1, [lr, #-8] -+ b scan_sig -+ fldd d0, [lr, #-8] -+ b scan_sig -+ -+stack_double: -+ mov r10, #0 -+ -+stack_long: -+ /* Ensure address is 8 byte aligned */ -+ add r6, r6, #7 -+ bic r6, r6, #7 -+ -+ ldr ip, [lr], #4 -+ str ip, [r6], #4 -+ ldr ip, [lr], #4 -+ str ip, [r6], #4 -+ b scan_sig -+ -+done: -+ /* Call the function */ -+#if defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) -+ mov lr, pc -+ bx r11 -+#else -+ blx r11 -+#endif -+ -+ add sp, sp, r4 /* Pop argument area */ -+ ldr r4, [sp, #32] /* Reload ostack for */ -+ /* address of return value */ -+ ldrb ip, [r5] /* Return type */ -+ -+ cmp ip, #86 /* 'V' */ -+ beq return -+ -+ cmp ip, #68 /* 'D' */ -+ beq return_double -+ -+ cmp ip, #70 /* 'F' */ -+ beq return_float -+ -+ str r0, [r4], #4 /* Low word */ -+ -+ cmp ip, #74 /* 'J' */ -+ streq r1, [r4], #4 /* High word */ -+ -+return: -+ mov r0, r4 /* return ostack */ -+ ldmfd sp!, {r4, r5, r6, r7, r8, r10, r11, lr} -+ bx lr -+ -+return_float: -+ add r4, r4, #4 -+ fsts s0, [r4, #-4] -+ b return -+ -+return_double: -+ add r4, r4, #8 -+ fstd d0, [r4, #-8] -+ b return -diff --git a/src/os/linux/arm/dll_md.c b/src/os/linux/arm/dll_md.c -index f5df90e..39bdf7c 100644 ---- a/src/os/linux/arm/dll_md.c -+++ b/src/os/linux/arm/dll_md.c -@@ -1,6 +1,6 @@ - /* -- * Copyright (C) 2003, 2004, 2005, 2006, 2007 -- * Robert Lougher <rob@lougher.org.uk>. -+ * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2011 -+ * Robert Lougher <rob@jamvm.org.uk>. - * - * This file is part of JamVM. - * -@@ -31,6 +31,61 @@ - * out stack requirements and then to push arguments. To - * save the first scan at call time, the signature is pre- - * scanned and stack requirement stored in the extra argument. */ -+ -+#ifdef __ARM_PCS_VFP -+int nativeExtraArg(MethodBlock *mb) { -+ char *sig = mb->type; -+ int fp_backfill = 0; -+ int stack_args = 0; -+ int int_args = 2; -+ int fp_args = 16; -+ -+ while(*++sig != ')') -+ switch(*sig) { -+ case 'J': -+ if(int_args < 2) -+ stack_args = (stack_args + 15) & ~7; -+ int_args = 0; -+ break; -+ -+ case 'D': -+ fp_backfill |= fp_args & 1; -+ fp_args &= ~1; -+ -+ if(fp_args == 0) { -+ stack_args = (stack_args + 15) & ~7; -+ fp_backfill = 0; -+ } else -+ fp_args -= 2; -+ break; -+ -+ case 'F': -+ if(fp_backfill) -+ fp_backfill = 0; -+ else { -+ if(fp_args == 0) -+ stack_args += 4; -+ else -+ fp_args--; -+ } -+ break; -+ -+ default: -+ if(int_args == 0) -+ stack_args += 4; -+ else -+ int_args--; -+ -+ if(*sig == '[') -+ while(*++sig == '['); -+ if(*sig == 'L') -+ while(*++sig != ';'); -+ break; -+ } -+ -+ return (stack_args + 7) & ~7; -+} -+#else - int nativeExtraArg(MethodBlock *mb) { - char *sig = mb->type; - int args = 0; -@@ -57,7 +112,7 @@ int nativeExtraArg(MethodBlock *mb) { - native method, so minimum stack requirement is 8 bytes. */ - return args < 8 ? 8 : args; - } -- -+#endif - #else - - /* Under OABI, arguments can be copied onto the stack "as is" --- -2.17.1 - |