Skip to content

Commit

Permalink
8303799: [BACKOUT] JDK-8302801 Remove fdlibm C sources
Browse files Browse the repository at this point in the history
Reviewed-by: darcy, bpb
  • Loading branch information
David Holmes committed Mar 8, 2023
1 parent 5fa9bd4 commit 21a6ab1
Show file tree
Hide file tree
Showing 65 changed files with 6,623 additions and 30 deletions.
3 changes: 2 additions & 1 deletion make/common/modules/LauncherCommon.gmk
@@ -1,5 +1,5 @@
#
# Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2011, 2022, 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
Expand Down Expand Up @@ -130,6 +130,7 @@ define SetupBuildLauncherBody
$$(shell $(FIND) $(SUPPORT_OUTPUTDIR)/modules_libs/java.base -name "*.a") \
$(SUPPORT_OUTPUTDIR)/modules_libs/jdk.jdwp.agent/libdt_socket.a \
$(SUPPORT_OUTPUTDIR)/modules_libs/jdk.jdwp.agent/libjdwp.a \
$(SUPPORT_OUTPUTDIR)/native/java.base/$(LIBRARY_PREFIX)fdlibm$(STATIC_LIBRARY_SUFFIX) \
-framework CoreFoundation \
-framework Foundation \
-framework SystemConfiguration \
Expand Down
40 changes: 40 additions & 0 deletions make/modules/java.base/lib/CoreLibraries.gmk
Expand Up @@ -23,6 +23,43 @@
# questions.
#

##########################################################################################
# libfdlibm is statically linked with libjava below and not delivered into the
# product on its own.

BUILD_LIBFDLIBM_OPTIMIZATION := NONE

# If FDLIBM_CFLAGS is non-empty we know that we can optimize
# fdlibm when adding those extra C flags. Currently GCC,
# and clang only.
ifneq ($(FDLIBM_CFLAGS), )
BUILD_LIBFDLIBM_OPTIMIZATION := LOW
endif

LIBFDLIBM_SRC := $(TOPDIR)/src/java.base/share/native/libfdlibm
LIBFDLIBM_CFLAGS := -I$(LIBFDLIBM_SRC) $(FDLIBM_CFLAGS)

$(eval $(call SetupNativeCompilation, BUILD_LIBFDLIBM, \
NAME := fdlibm, \
TYPE := STATIC_LIBRARY, \
OUTPUT_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE), \
SRC := $(LIBFDLIBM_SRC), \
OPTIMIZATION := $(BUILD_LIBFDLIBM_OPTIMIZATION), \
CFLAGS := $(CFLAGS_JDKLIB) $(LIBFDLIBM_CFLAGS), \
CFLAGS_windows_debug := -DLOGGING, \
CFLAGS_aix := -qfloat=nomaf, \
DISABLED_WARNINGS_gcc := sign-compare, \
DISABLED_WARNINGS_gcc_k_rem_pio2.c := maybe-uninitialized, \
DISABLED_WARNINGS_clang := sign-compare, \
DISABLED_WARNINGS_microsoft := 4146, \
DISABLED_WARNINGS_microsoft_e_exp.c := 4244, \
DISABLED_WARNINGS_microsoft_s_ceil.c := 4018, \
DISABLED_WARNINGS_microsoft_s_expm1.c := 4244, \
DISABLED_WARNINGS_microsoft_s_floor.c := 4018, \
ARFLAGS := $(ARFLAGS), \
OBJECT_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/libfdlibm, \
))

##########################################################################################

LIBVERIFY_OPTIMIZATION := HIGH
Expand Down Expand Up @@ -59,12 +96,14 @@ $(eval $(call SetupJdkLibrary, BUILD_LIBJAVA, \
CFLAGS := $(CFLAGS_JDKLIB) \
$(LIBJAVA_CFLAGS), \
jdk_util.c_CFLAGS := $(VERSION_CFLAGS), \
EXTRA_HEADER_DIRS := libfdlibm, \
WARNINGS_AS_ERRORS_xlc := false, \
DISABLED_WARNINGS_gcc_ProcessImpl_md.c := unused-result, \
LDFLAGS := $(LDFLAGS_JDKLIB) \
$(call SET_SHARED_LIBRARY_ORIGIN), \
LDFLAGS_macosx := -L$(SUPPORT_OUTPUTDIR)/native/$(MODULE)/, \
LDFLAGS_windows := -delayload:shell32.dll, \
LIBS := $(BUILD_LIBFDLIBM_TARGET), \
LIBS_unix := -ljvm, \
LIBS_linux := $(LIBDL), \
LIBS_aix := $(LIBDL) $(LIBM),\
Expand All @@ -80,6 +119,7 @@ TARGETS += $(BUILD_LIBJAVA)

$(BUILD_LIBJAVA): $(BUILD_LIBVERIFY)

$(BUILD_LIBJAVA): $(BUILD_LIBFDLIBM)

##########################################################################################

Expand Down
7 changes: 4 additions & 3 deletions src/hotspot/os/windows/sharedRuntimeRem.cpp
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015, 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
Expand All @@ -26,12 +26,13 @@
#include "runtime/sharedRuntime.hpp"

#ifdef _WIN64
// These are copied defines originally from fdlibm.h.
// These are copied defines from fdlibm.h, this allows us to keep the code
// the same as in the JDK, for easier maintenance.

#define __HI(x) *(1+(int*)&x)
#define __LO(x) *(int*)&x

// This code is a copy of __ieee754_fmod() formerly from the JDK's libfdlibm and is
// This code is a copy of __ieee754_fmod() from the JDK's libfdlibm and is
// used as a workaround for issues with the Windows x64 CRT implementation
// of fmod. Microsoft has acknowledged that this is an issue in Visual Studio
// 2012 and forward, but has not provided a time frame for a fix other than that
Expand Down
13 changes: 9 additions & 4 deletions src/hotspot/share/runtime/sharedRuntimeTrig.cpp
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2001, 2022, 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
Expand Down Expand Up @@ -28,9 +28,14 @@
#include "runtime/sharedRuntime.hpp"
#include "runtime/sharedRuntimeMath.hpp"

// This file contains copies of the C fdlibm routines originally used
// by StrictMath. The StrictMath sin, cos, and tan methods now use a
// Java port of the algorithm in java.lang.Fdlibm.java.
// This file contains copies of the fdlibm routines used by
// StrictMath. It turns out that it is almost always required to use
// these runtime routines; the Intel CPU doesn't meet the Java
// specification for sin/cos outside a certain limited argument range,
// and the SPARC CPU doesn't appear to have sin/cos instructions. It
// also turns out that avoiding the indirect call through function
// pointer out to libjava.so in SharedRuntime speeds these routines up
// by roughly 15% on both Win32/x86 and Solaris/SPARC.

/*
* __kernel_rem_pio2(x,y,e0,nx,prec,ipio2)
Expand Down
24 changes: 2 additions & 22 deletions src/java.base/share/classes/java/lang/StrictMath.java
Expand Up @@ -42,28 +42,8 @@
* Library," <a
* href="https://www.netlib.org/fdlibm/">{@code fdlibm}</a>. These
* algorithms, which are written in the C programming language, are
* then to be understood to be transliterated into Java and executed
* with all floating-point and integer operations following the rules
* of Java arithmetic. The following transformations are used in the
* transliteration:
*
* <ul>
* <li>Extraction and setting of the high and low halves of a 64-bit
* {@code double} in C is expressed using Java platform methods that
* perform bit-wise conversions {@linkplain
* Double#doubleToRawLongBits(double) from {@code double} to {@code
* long}} and {@linkplain Double#longBitsToDouble(long) {@code long}
* to {@code double}}.
*
* <li>Unsigned {@code int} values in C are mapped to signed {@code
* int} values in Java with updates to operations to replicate
* unsigned semantics where the results on the same textual operation
* would differ. For example, {@code >>} shifts on unsigned C values
* are replaced with {@code >>>} shifts on signed Java values. Sized
* comparisons on unsigned C values ({@code <}, {@code <=}, {@code >},
* {@code >=}) are replaced with semantically equivalent calls to
* {@link Integer#compareUnsigned(int, int) compareUnsigned}.
* </ul>
* then to be understood as executed with all floating-point
* operations following the rules of Java floating-point arithmetic.
*
* <p>The Java math library is defined with respect to
* {@code fdlibm} version 5.3. Where {@code fdlibm} provides
Expand Down
117 changes: 117 additions & 0 deletions src/java.base/share/native/libfdlibm/e_acos.c
@@ -0,0 +1,117 @@
/*
* Copyright (c) 1998, 2001, 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.
*/

/* __ieee754_acos(x)
* Method :
* acos(x) = pi/2 - asin(x)
* acos(-x) = pi/2 + asin(x)
* For |x|<=0.5
* acos(x) = pi/2 - (x + x*x^2*R(x^2)) (see asin.c)
* For x>0.5
* acos(x) = pi/2 - (pi/2 - 2asin(sqrt((1-x)/2)))
* = 2asin(sqrt((1-x)/2))
* = 2s + 2s*z*R(z) ...z=(1-x)/2, s=sqrt(z)
* = 2f + (2c + 2s*z*R(z))
* where f=hi part of s, and c = (z-f*f)/(s+f) is the correction term
* for f so that f+c ~ sqrt(z).
* For x<-0.5
* acos(x) = pi - 2asin(sqrt((1-|x|)/2))
* = pi - 0.5*(s+s*z*R(z)), where z=(1-|x|)/2,s=sqrt(z)
*
* Special cases:
* if x is NaN, return x itself;
* if |x|>1, return NaN with invalid signal.
*
* Function needed: sqrt
*/

#include "fdlibm.h"

#ifdef __STDC__
static const double
#else
static double
#endif
one= 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
pi = 3.14159265358979311600e+00, /* 0x400921FB, 0x54442D18 */
pio2_hi = 1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */
pio2_lo = 6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */
pS0 = 1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */
pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */
pS2 = 2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */
pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */
pS4 = 7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */
pS5 = 3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */
qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */
qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */
qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */
qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */

#ifdef __STDC__
double __ieee754_acos(double x)
#else
double __ieee754_acos(x)
double x;
#endif
{
double z,p,q,r,w,s,c,df;
int hx,ix;
hx = __HI(x);
ix = hx&0x7fffffff;
if(ix>=0x3ff00000) { /* |x| >= 1 */
if(((ix-0x3ff00000)|__LO(x))==0) { /* |x|==1 */
if(hx>0) return 0.0; /* acos(1) = 0 */
else return pi+2.0*pio2_lo; /* acos(-1)= pi */
}
return (x-x)/(x-x); /* acos(|x|>1) is NaN */
}
if(ix<0x3fe00000) { /* |x| < 0.5 */
if(ix<=0x3c600000) return pio2_hi+pio2_lo;/*if|x|<2**-57*/
z = x*x;
p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
r = p/q;
return pio2_hi - (x - (pio2_lo-x*r));
} else if (hx<0) { /* x < -0.5 */
z = (one+x)*0.5;
p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
s = sqrt(z);
r = p/q;
w = r*s-pio2_lo;
return pi - 2.0*(s+w);
} else { /* x > 0.5 */
z = (one-x)*0.5;
s = sqrt(z);
df = s;
__LO(df) = 0;
c = (z-df*df)/(s+df);
p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
r = p/q;
w = r*s+c;
return 2.0*(df+w);
}
}

1 comment on commit 21a6ab1

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.