[PATCH v2] Add support for SoftFloat library on ARM

Erik Joelsson erik.joelsson at oracle.com
Fri Nov 30 17:20:01 UTC 2018


Hello Jakub,

I have looked at the build changes. It looks pretty good. One thing 
though, we usually define three arguments for an external library 
--with-foo, --with-foo-lib and --with-foo-include. The first points to a 
directory with lib and include sub directories, but allows either to be 
overridden with the more specific parameter. It would be good if this 
new dependency could follow the same parameter standard.

You could also consider adding configure checks that the correct lib and 
header files are actually found. This greatly improves the user 
experience when trying to setup this up. It's not required though.

It would also be nice if you could get author status so you can publish 
webrevs instead. Reviewing raw patch files is cumbersome.

/Erik

On 2018-11-30 05:38, Jakub Vaněk wrote:
> Hi David,
>
> I'm sending an alternative patch for handling the problem with
> __aeabi_*_glibc on arm softfloat builds. This patch adds integration
> code for SoftFloat-3e library. It adds appropriate configure options
> and a switchable implementation of __aeabi_*_glibc/__aeabi_*_extlib
> functions.
>
> There are now two implementations of the _glibc functions (now renamed
> to _extlib). The simpler one simply wraps __aeabi_* functions. The
> other one wraps SoftFloat-3 API. By using this mechanism, the building
> user can choose what happens. The external library is not required - if
> the path to its static library/include directory is not specified on
> configure commandline, standard system functions are used
> automatically.
>
> Thanks,
>
> Jakub
>
> # HG changeset patch
> # User Jakub Vaněk <linuxtardis at gmail.com>
> # Date 1543498682 -3600
> #      Thu Nov 29 14:38:02 2018 +0100
> # Node ID bc14ee6f50c73703229f979e78b93bcef12ae106
> # Parent  a96844b3a929cc2eb92fe7963be8aec603f24a83
> Add support for SoftFloat library on ARM
>
> diff --git a/doc/building.html b/doc/building.html
> --- a/doc/building.html
> +++ b/doc/building.html
> @@ -53,6 +53,7 @@
>   <li><a href="#x11">X11</a></li>
>   <li><a href="#alsa">ALSA</a></li>
>   <li><a href="#libffi">libffi</a></li>
> +<li><a href="#softfloat">SoftFloat</a></li>
>   </ul></li>
>   <li><a href="#build-tools-requirements">Build Tools Requirements</a><ul>
>   <li><a href="#autoconf">Autoconf</a></li>
> @@ -415,6 +416,12 @@
>   <li>To install on an rpm-based Linux, try running <code>sudo yum install libffi-devel</code>.</li>
>   </ul>
>   <p>Use <code>--with-libffi=<path></code> if <code>configure</code> does not properly locate your libffi files.</p>
> +<h3 id="softfloat">SoftFloat</h3>
> +<p><a href="http://www.jhauser.us/arithmetic/SoftFloat.html">Berkeley SoftFloat-3</a> can be used on ARM processors without FPU to slightly enhance the arithmetic precision of some floating point operations. It is not required, system softfp routines can be used without any problems. The precision loss is extremely small, but <a href="http://mail.openjdk.java.net/pipermail/aarch32-port-dev/2016-November/000611.html">the JCK detects it</a>.</p>
> +<ul>
> +<li>To install the library, you will have to download its source and build it for the target platform. To do so, take a look in the <code>build/Linux-ARM-VFPv2-GCC</code> subdirectory.</li>
> +</ul>
> +<p>Use <code>--with-softfloat-lib=<path></code> and <code>--with-softfloat-include=<path></code> to specify the path to the <code>softfloat.a</code> archive and the <code>source/include</code> directory. If you omit them or use <code>--without-softfloat-*</code>, standard system libraries will be used instead.</p>
>   <h2 id="build-tools-requirements">Build Tools Requirements</h2>
>   <h3 id="autoconf">Autoconf</h3>
>   <p>The JDK requires <a href="http://www.gnu.org/software/autoconf">Autoconf</a>; on all platforms. At least version 2.69 is required.</p>
> @@ -486,6 +493,7 @@
>   <li><code>--with-x=<path></code> - Set the path to <a href="#x11">X11</a></li>
>   <li><code>--with-alsa=<path></code> - Set the path to <a href="#alsa">ALSA</a></li>
>   <li><code>--with-libffi=<path></code> - Set the path to <a href="#libffi">libffi</a></li>
> +<li><code>--with-softfloat-lib=<path></code>, <code>--with-softfloat-include=<path></code> - Set the path to <a href="#softfloat">SoftFloat</a> library and include directory.</li>
>   <li><code>--with-jtreg=<path></code> - Set the path to JTReg. See <a href="#running-tests">Running Tests</a></li>
>   </ul>
>   <p>Certain third-party libraries used by the JDK (libjpeg, giflib, libpng, lcms and zlib) are included in the JDK repository. The default behavior of the JDK build is to use this version of these libraries, but they might be replaced by an external version. To do so, specify <code>system</code> as the <code><source></code> option in these arguments. (The default is <code>bundled</code>).</p>
> diff --git a/doc/building.md b/doc/building.md
> --- a/doc/building.md
> +++ b/doc/building.md
> @@ -527,6 +527,24 @@
>   Use `--with-libffi=<path>` if `configure` does not properly locate your libffi
>   files.
>   
> +### SoftFloat
> +
> +[Berkeley SoftFloat-3](http://www.jhauser.us/arithmetic/SoftFloat.html)
> +can be used on ARM processors without FPU to slightly enhance
> +the arithmetic precision of some floating point operations. It is not
> +required, system softfp routines can be used without any problems.
> +The precision loss is extremely small, but [the JCK detects it](
> +http://mail.openjdk.java.net/pipermail/aarch32-port-dev/2016-November/000611.html).
> +
> +  * To install the library, you will have to download its source and build it
> +    for the target platform. To do so, take a look in the
> +    `build/Linux-ARM-VFPv2-GCC` subdirectory.
> +
> +Use `--with-softfloat-lib=<path>` and `--with-softfloat-include=<path>`
> +to specify the path to the `softfloat.a` archive and the `source/include`
> +directory. If you omit them or use `--without-softfloat-*`, standard
> +system libraries will be used instead.
> +
>   ## Build Tools Requirements
>   
>   ### Autoconf
> @@ -694,6 +712,8 @@
>     * `--with-x=<path>` - Set the path to [X11](#x11)
>     * `--with-alsa=<path>` - Set the path to [ALSA](#alsa)
>     * `--with-libffi=<path>` - Set the path to [libffi](#libffi)
> +  * `--with-softfloat-lib=<path>`, `--with-softfloat-include=<path>` -
> +    Set the path to [SoftFloat](#softfloat) library and include directory.
>     * `--with-jtreg=<path>` - Set the path to JTReg. See [Running Tests](
>       #running-tests)
>   
> diff --git a/make/autoconf/lib-softfloat.m4 b/make/autoconf/lib-softfloat.m4
> new file mode 100644
> --- /dev/null
> +++ b/make/autoconf/lib-softfloat.m4
> @@ -0,0 +1,93 @@
> +#
> +# Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
> +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
> +#
> +# This code is free software; you can redistribute it and/or modify it
> +# under the terms of the GNU General Public License version 2 only, as
> +# published by the Free Software Foundation.  Oracle designates this
> +# particular file as subject to the "Classpath" exception as provided
> +# by Oracle in the LICENSE file that accompanied this code.
> +#
> +# This code 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
> +# version 2 for more details (a copy is included in the LICENSE file that
> +# accompanied this code).
> +#
> +# You should have received a copy of the GNU General Public License version
> +# 2 along with this work; if not, write to the Free Software Foundation,
> +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
> +#
> +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
> +# or visit www.oracle.com if you need additional information or have any
> +# questions.
> +#
> +
> +################################################################################
> +# Setup softfloat library
> +################################################################################
> +AC_DEFUN_ONCE([LIB_SETUP_SOFTFLOAT],
> +[
> +  AC_ARG_WITH(softfloat-lib, [AS_HELP_STRING([--with-softfloat-lib],
> +      [specify the path to SoftFloat-3 static library])])
> +  AC_ARG_WITH(softfloat-include, [AS_HELP_STRING([--with-softfloat-include],
> +      [specify the path to SoftFloat-3 include directory])])
> +
> +  AC_MSG_CHECKING([if softfloat helper library is to be used])
> +
> +  SOFTFLOAT_LIB=${with_softfloat_lib}
> +  SOFTFLOAT_INC=${with_softfloat_include}
> +
> +  if test "x$NEEDS_LIB_SOFTFLOAT" = xtrue; then
> +
> +    if test "x${SOFTFLOAT_LIB}" = x || test "x${SOFTFLOAT_LIB}" = xno; then
> +      SOFTFLOAT_FOUND=false
> +
> +      if test "x${SOFTFLOAT_INC}" != x && test "x${SOFTFLOAT_INC}" != xno; then
> +        AC_MSG_ERROR([--with-softfloat-include was specified, but not --with-softfloat-lib])
> +      fi
> +
> +    elif test "x${SOFTFLOAT_INC}" = x || test "x${SOFTFLOAT_INC}" = xno; then
> +      SOFTFLOAT_FOUND=false
> +
> +      if test "x${SOFTFLOAT_LIB}" != x && test "x${SOFTFLOAT_LIB}" != xno; then
> +        AC_MSG_ERROR([--with-softfloat-lib was specified, but not --with-softfloat-include])
> +      fi
> +
> +    else
> +      SOFTFLOAT_FOUND=true
> +    fi
> +
> +    if test "x$SOFTFLOAT_FOUND" = "xtrue"; then
> +      AC_MSG_RESULT([yes, external library used])
> +
> +      SOFTFLOAT_LIBS="${SOFTFLOAT_LIB}"
> +      SOFTFLOAT_CFLAGS="-I${SOFTFLOAT_INC} -DSOFTFLOAT_EXTERNAL"
> +
> +      AC_MSG_CHECKING([for softfloat library])
> +      AC_MSG_RESULT([$SOFTFLOAT_LIBS])
> +
> +      AC_MSG_CHECKING([for softfloat compiler flags])
> +      AC_MSG_RESULT([$SOFTFLOAT_CFLAGS])
> +
> +    else
> +      AC_MSG_RESULT([no, system softfp used])
> +      AC_MSG_NOTICE([Floating point operations may be less precise by a very small amount])
> +      SOFTFLOAT_LIBS=
> +      SOFTFLOAT_CFLAGS=
> +    fi
> +  else
> +    AC_MSG_RESULT([no, not needed])
> +    if test "x${SOFTFLOAT_LIB}" != x && test "x${SOFTFLOAT_LIB}" != xno; then
> +      AC_MSG_WARN([[sflt build not used, so --with-softfloat-lib is ignored]])
> +    fi
> +    if test "x${SOFTFLOAT_INC}" != x && test "x${SOFTFLOAT_INC}" != xno; then
> +      AC_MSG_WARN([[sflt build not used, so --with-softfloat-include is ignored]])
> +    fi
> +    SOFTFLOAT_LIBS=
> +    SOFTFLOAT_CFLAGS=
> +  fi
> +
> +  AC_SUBST(SOFTFLOAT_LIBS)
> +  AC_SUBST(SOFTFLOAT_CFLAGS)
> +])
> diff --git a/make/autoconf/libraries.m4 b/make/autoconf/libraries.m4
> --- a/make/autoconf/libraries.m4
> +++ b/make/autoconf/libraries.m4
> @@ -33,6 +33,7 @@
>   m4_include([lib-x11.m4])
>   m4_include([lib-fontconfig.m4])
>   m4_include([lib-tests.m4])
> +m4_include([lib-softfloat.m4])
>   
>   ################################################################################
>   # Determine which libraries are needed for this configuration
> @@ -79,6 +80,13 @@
>       NEEDS_LIB_ALSA=false
>     fi
>   
> +  if (test "x$OPENJDK_TARGET_CPU" == xarm &&
> +      (test "x$ARM_FLOAT_TYPE" = "xsflt" || test "x$ARM_FLOAT_TYPE" = "xvfp-sflt" )); then
> +    NEEDS_LIB_SOFTFLOAT=true
> +  else
> +    NEEDS_LIB_SOFTFLOAT=false
> +  fi
> +
>     # Check if ffi is needed
>     if HOTSPOT_CHECK_JVM_VARIANT(zero); then
>       NEEDS_LIB_FFI=true
> @@ -98,6 +106,7 @@
>     LIB_SETUP_FONTCONFIG
>     LIB_SETUP_FREETYPE
>     LIB_SETUP_ALSA
> +  LIB_SETUP_SOFTFLOAT
>     LIB_SETUP_LIBFFI
>     LIB_SETUP_BUNDLED_LIBS
>     LIB_SETUP_MISC_LIBS
> diff --git a/make/autoconf/spec.gmk.in b/make/autoconf/spec.gmk.in
> --- a/make/autoconf/spec.gmk.in
> +++ b/make/autoconf/spec.gmk.in
> @@ -353,6 +353,8 @@
>   CUPS_CFLAGS:=@CUPS_CFLAGS@
>   ALSA_LIBS:=@ALSA_LIBS@
>   ALSA_CFLAGS:=@ALSA_CFLAGS@
> +SOFTFLOAT_LIBS:=@SOFTFLOAT_LIBS@
> +SOFTFLOAT_CFLAGS:=@SOFTFLOAT_CFLAGS@
>   LIBFFI_LIBS:=@LIBFFI_LIBS@
>   LIBFFI_CFLAGS:=@LIBFFI_CFLAGS@
>   ENABLE_LIBFFI_BUNDLING:=@ENABLE_LIBFFI_BUNDLING@
> diff --git a/make/hotspot/lib/CompileJvm.gmk b/make/hotspot/lib/CompileJvm.gmk
> --- a/make/hotspot/lib/CompileJvm.gmk
> +++ b/make/hotspot/lib/CompileJvm.gmk
> @@ -49,6 +49,7 @@
>   
>   JVM_LIBS += \
>       $(JVM_LIBS_FEATURES) \
> +    $(SOFTFLOAT_LIBS) \
>       #
>   
>   # These files and directories are always excluded
> diff --git a/make/hotspot/lib/JvmFlags.gmk b/make/hotspot/lib/JvmFlags.gmk
> --- a/make/hotspot/lib/JvmFlags.gmk
> +++ b/make/hotspot/lib/JvmFlags.gmk
> @@ -88,6 +88,7 @@
>       $(JVM_CFLAGS_TARGET_DEFINES) \
>       $(JVM_CFLAGS_FEATURES) \
>       $(JVM_CFLAGS_INCLUDES) \
> +    $(SOFTFLOAT_CFLAGS) \
>       $(EXTRA_CFLAGS) \
>       #
>   
> diff --git a/src/hotspot/cpu/arm/assembler_arm_32.hpp b/src/hotspot/cpu/arm/assembler_arm_32.hpp
> --- a/src/hotspot/cpu/arm/assembler_arm_32.hpp
> +++ b/src/hotspot/cpu/arm/assembler_arm_32.hpp
> @@ -1242,10 +1242,10 @@
>   
>   // Imported code from glibc soft-fp bundle for
>   // calculation accuracy improvement. See CR 6757269.
> -extern double __aeabi_fadd_glibc(float, float);
> -extern double __aeabi_fsub_glibc(float, float);
> -extern double __aeabi_dadd_glibc(double, double);
> -extern double __aeabi_dsub_glibc(double, double);
> +extern float __aeabi_fadd_extlib(float, float);
> +extern float __aeabi_fsub_extlib(float, float);
> +extern double __aeabi_dadd_extlib(double, double);
> +extern double __aeabi_dsub_extlib(double, double);
>   };
>   #endif // __SOFTFP__
>   
> diff --git a/src/hotspot/cpu/arm/c1_LIRGenerator_arm.cpp b/src/hotspot/cpu/arm/c1_LIRGenerator_arm.cpp
> --- a/src/hotspot/cpu/arm/c1_LIRGenerator_arm.cpp
> +++ b/src/hotspot/cpu/arm/c1_LIRGenerator_arm.cpp
> @@ -490,27 +490,28 @@
>       // Call function compiled with -msoft-float.
>   
>         // __aeabi_XXXX_glibc: Imported code from glibc soft-fp bundle for calculation accuracy improvement. See CR 6757269.
> +      // http://mail.openjdk.java.net/pipermail/aarch32-port-dev/2016-November/000611.html
>   
>       case Bytecodes::_fadd:
> -      runtime_func = CAST_FROM_FN_PTR(address, __aeabi_fadd_glibc);
> +      runtime_func = CAST_FROM_FN_PTR(address, __aeabi_fadd_extlib);
>         break;
>       case Bytecodes::_fmul:
>         runtime_func = CAST_FROM_FN_PTR(address, __aeabi_fmul);
>         break;
>       case Bytecodes::_fsub:
> -      runtime_func = CAST_FROM_FN_PTR(address, __aeabi_fsub_glibc);
> +      runtime_func = CAST_FROM_FN_PTR(address, __aeabi_fsub_extlib);
>         break;
>       case Bytecodes::_fdiv:
>         runtime_func = CAST_FROM_FN_PTR(address, __aeabi_fdiv);
>         break;
>       case Bytecodes::_dadd:
> -      runtime_func = CAST_FROM_FN_PTR(address, __aeabi_dadd_glibc);
> +      runtime_func = CAST_FROM_FN_PTR(address, __aeabi_dadd_extlib);
>         break;
>       case Bytecodes::_dmul:
>         runtime_func = CAST_FROM_FN_PTR(address, __aeabi_dmul);
>         break;
>       case Bytecodes::_dsub:
> -      runtime_func = CAST_FROM_FN_PTR(address, __aeabi_dsub_glibc);
> +      runtime_func = CAST_FROM_FN_PTR(address, __aeabi_dsub_extlib);
>         break;
>       case Bytecodes::_ddiv:
>         runtime_func = CAST_FROM_FN_PTR(address, __aeabi_ddiv);
> diff --git a/src/hotspot/cpu/arm/c1_Runtime1_arm.cpp b/src/hotspot/cpu/arm/c1_Runtime1_arm.cpp
> --- a/src/hotspot/cpu/arm/c1_Runtime1_arm.cpp
> +++ b/src/hotspot/cpu/arm/c1_Runtime1_arm.cpp
> @@ -804,15 +804,16 @@
>   #define FUNCTION_CASE(a, f) \
>     if ((intptr_t)a == CAST_FROM_FN_PTR(intptr_t, f))  return #f
>   
> -  FUNCTION_CASE(entry, __aeabi_fadd_glibc);
> +  // __aeabi_XXXX_glibc: Imported code from glibc soft-fp bundle for calculation accuracy improvement. See CR 6757269.
> +  // http://mail.openjdk.java.net/pipermail/aarch32-port-dev/2016-November/000611.html
> +  FUNCTION_CASE(entry, __aeabi_fadd_extlib);
>     FUNCTION_CASE(entry, __aeabi_fmul);
> -  FUNCTION_CASE(entry, __aeabi_fsub_glibc);
> +  FUNCTION_CASE(entry, __aeabi_fsub_extlib);
>     FUNCTION_CASE(entry, __aeabi_fdiv);
>   
> -  // __aeabi_XXXX_glibc: Imported code from glibc soft-fp bundle for calculation accuracy improvement. See CR 6757269.
> -  FUNCTION_CASE(entry, __aeabi_dadd_glibc);
> +  FUNCTION_CASE(entry, __aeabi_dadd_extlib);
>     FUNCTION_CASE(entry, __aeabi_dmul);
> -  FUNCTION_CASE(entry, __aeabi_dsub_glibc);
> +  FUNCTION_CASE(entry, __aeabi_dsub_extlib);
>     FUNCTION_CASE(entry, __aeabi_ddiv);
>   
>     FUNCTION_CASE(entry, __aeabi_f2d);
> diff --git a/src/hotspot/cpu/arm/softfloat_arm.cpp b/src/hotspot/cpu/arm/softfloat_arm.cpp
> new file mode 100644
> --- /dev/null
> +++ b/src/hotspot/cpu/arm/softfloat_arm.cpp
> @@ -0,0 +1,112 @@
> +/*
> + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
> + *
> + * This code is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License version 2 only, as
> + * published by the Free Software Foundation.
> + *
> + * This code 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
> + * version 2 for more details (a copy is included in the LICENSE file that
> + * accompanied this code).
> + *
> + * You should have received a copy of the GNU General Public License version
> + * 2 along with this work; if not, write to the Free Software Foundation,
> + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
> + *
> + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
> + * or visit www.oracle.com if you need additional information or have any
> + * questions.
> + *
> + */
> +
> +#ifdef __SOFTFP__
> +
> +// Soft float function declarations
> +extern "C" {
> +    extern float  __aeabi_fadd(float, float);
> +    extern float  __aeabi_fsub(float, float);
> +    extern double __aeabi_dadd(double, double);
> +    extern double __aeabi_dsub(double, double);
> +
> +    extern float __aeabi_fadd_extlib(float, float);
> +    extern float __aeabi_fsub_extlib(float, float);
> +    extern double __aeabi_dadd_extlib(double, double);
> +    extern double __aeabi_dsub_extlib(double, double);
> +};
> +
> +#ifdef SOFTFLOAT_EXTERNAL
> +
> +extern "C" {
> +#include "softfloat.h"
> +}
> +
> +#include <cstring>
> +
> +static float __aeabi_float_handling(float natA, float natB, bool add) {
> +    float32_t libA;
> +    float32_t libB;
> +    float32_t libC;
> +    float natC;
> +
> +    memcpy(&libA, &natA, sizeof(libA));
> +    memcpy(&libB, &natB, sizeof(libB));
> +    libC = add ? f32_add(libA, libB) : f32_sub(libA, libB);
> +    memcpy(&natC, &libC, sizeof(libC));
> +
> +    return natC;
> +}
> +
> +static double __aeabi_double_handling(double natA, double natB, bool add) {
> +    float64_t libA;
> +    float64_t libB;
> +    float64_t libC;
> +    double natC;
> +
> +    memcpy(&libA, &natA, sizeof(libA));
> +    memcpy(&libB, &natB, sizeof(libB));
> +    libC = add ? f64_add(libA, libB) : f64_sub(libA, libB);
> +    memcpy(&natC, &libC, sizeof(libC));
> +
> +    return natC;
> +}
> +
> +float __aeabi_fadd_extlib(float a, float b) {
> +    return __aeabi_float_handling(a, b, true);
> +}
> +
> +float __aeabi_fsub_extlib(float a, float b) {
> +    return __aeabi_float_handling(a, b, false);
> +}
> +
> +double __aeabi_dadd_extlib(double a, double b) {
> +    return __aeabi_double_handling(a, b, true);
> +}
> +
> +double __aeabi_dsub_extlib(double a, double b) {
> +    return __aeabi_double_handling(a, b, false);
> +}
> +
> +#else
> +
> +float __aeabi_fadd_extlib(float a, float b) {
> +    return __aeabi_fadd(a, b);
> +}
> +
> +float __aeabi_fsub_extlib(float a, float b) {
> +    return __aeabi_fsub(a, b);
> +}
> +
> +double __aeabi_dadd_extlib(double a, double b) {
> +    return __aeabi_dadd(a, b);
> +}
> +
> +double __aeabi_dsub_extlib(double a, double b) {
> +    return __aeabi_dsub(a, b);
> +}
> +
> +#endif
> +
> +#endif // __SOFTFP__
> diff --git a/src/hotspot/cpu/arm/templateTable_arm.cpp b/src/hotspot/cpu/arm/templateTable_arm.cpp
> --- a/src/hotspot/cpu/arm/templateTable_arm.cpp
> +++ b/src/hotspot/cpu/arm/templateTable_arm.cpp
> @@ -1610,8 +1610,10 @@
>     __ mov(R1, R0_tos);
>     __ pop_i(R0);
>     switch (op) {
> -    case add: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_fadd_glibc), R0, R1); break;
> -    case sub: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_fsub_glibc), R0, R1); break;
> +    // __aeabi_XXXX_glibc: Imported code from glibc soft-fp bundle for calculation accuracy improvement. See CR 6757269.
> +    // http://mail.openjdk.java.net/pipermail/aarch32-port-dev/2016-November/000611.html
> +    case add: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_fadd_extlib), R0, R1); break;
> +    case sub: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_fsub_extlib), R0, R1); break;
>       case mul: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_fmul), R0, R1); break;
>       case div: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_fdiv), R0, R1); break;
>       case rem: __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::frem), R0, R1); break;
> @@ -1653,8 +1655,9 @@
>     __ pop_l(R0, R1);
>     switch (op) {
>       // __aeabi_XXXX_glibc: Imported code from glibc soft-fp bundle for calculation accuracy improvement. See CR 6757269.
> -    case add: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_dadd_glibc), R0, R1, R2, R3); break;
> -    case sub: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_dsub_glibc), R0, R1, R2, R3); break;
> +    // http://mail.openjdk.java.net/pipermail/aarch32-port-dev/2016-November/000611.html
> +    case add: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_dadd_extlib), R0, R1, R2, R3); break;
> +    case sub: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_dsub_extlib), R0, R1, R2, R3); break;
>       case mul: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_dmul), R0, R1, R2, R3); break;
>       case div: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_ddiv), R0, R1, R2, R3); break;
>       case rem: __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::drem), R0, R1, R2, R3); break;
>


More information about the build-dev mailing list